पाठ 13 / 27

OpenAI SDK से पूरा Tool Loop

Function tool परिभाषित करें, tool_calls पढ़ें, role=tool messages लौटाएँ।

tool_calls और role "tool" messages

OpenAI Chat Completions में tools {"type": "function", "function": {name, description, parameters}} हैं। मॉडल को tool चाहिए तो message.tool_calls भरा होता है और finish_reason == "tool_calls"; हर call की id और function.name होती है, और function.arguments एक JSON string है जिसे आपको json.loads करना और validate करना है (वह ग़लत बनी या अनपेक्षित मान वाली हो सकती है)। आप assistant message जोड़ते हैं, फिर हर call के लिए role: "tool", मेल खाते tool_call_id और परिणाम string के साथ message जोड़ते हैं। मॉडल एक उत्तर में कई tool calls लौटा सकते हैं; सब चलाएँ (स्वतंत्र हों तो समवर्ती) और सारे परिणाम लौटाएँ। OpenAI की नई Responses API उसी विचार के लिए अलग item प्रकार उपयोग करती है; loop तर्क वही है।

OpenAI tool loop, चलाकर

मैंने यह Python virtual environment में anthropic 1.11.0 और openai 3.22.1 SDKs के साथ छोटे स्थानीय stand-in server (testing विषय में दिखाया, mock.py नाम से सहेजा) के विरुद्ध चलाया। Server तैयार उत्तर लौटाता है, इसलिए कोई key, network या असली मॉडल शामिल नहीं: यह साबित करता है कि SDK requests कैसे बनाता और उत्तर कैसे सँभालता है, यह नहीं कि असली मॉडल क्या कहता। Arguments JSON string के रूप में आते हैं और स्थानीय function चलने से पहले json.loads से parse होते हैं। Tool परिणाम role: "tool" message के रूप में लौटता है और दूसरी call अंतिम पाठ लौटाती है।

import json
import mock, anthropic, openai
srv = mock.start(); base = f"http://127.0.0.1:{srv.server_address[1]}"      # local stand-in server, not a real API

client = openai.OpenAI(api_key="k", base_url=base + "/v1")
tools = [{"type": "function", "function": {"name": "get_order_status", "description": "Look up an order by 6-digit id.",
          "parameters": {"type": "object", "properties": {"order_id": {"type": "string"}}, "required": ["order_id"]}}}]
def get_order_status(order_id): return {"order_id": order_id, "status": "shipped"}

messages = [{"role": "user", "content": "Where is order 481516?"}]
for step in range(5):
    resp = client.chat.completions.create(model="demo-model", tools=tools, messages=messages)
    msg = resp.choices[0].message
    if not msg.tool_calls:
        print("final:", msg.content); break
    messages.append(msg.model_dump(exclude_none=True))
    for call in msg.tool_calls:
        args = json.loads(call.function.arguments)                # arguments arrive as a JSON string
        print("model asked for:", call.function.name, args)
        messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps(get_order_status(**args))})
print("calls to the API:", len(mock.STATE["log"]))

Output:

model asked for: get_order_status {'order_id': '481516'}
final: Your order 481516 has shipped.
calls to the API: 2

Arguments सावधानी से parse करें

json.loads को try/except में लपेटें और fields validate करें; ग़लत arguments string को crash नहीं, tool error बनना चाहिए।

त्वरित जाँच: OpenAI tool calls में function.arguments किस प्रकार का है?

  • पहले से validated Python dict
  • JSON string जिसे आपको parse और validate करना है
  • संख्या
  • File
Answer

JSON string जिसे आपको parse और validate करना है — Arguments मॉडल द्वारा बना पाठ हैं; बिना जाँचे उन पर भरोसा न करें।