Tool Runner و tool_choice
بعد ما فهمت الـ loop من جوه، استخدم الاختصار.
الـ Tool Runner
الـ loop اللي كتبناه (ابعت، شوف stop_reason، نفّذ، رجّع النتايج، كرر) بيتكرر في كل مشروع. الـ Anthropic SDK فيه Tool Runner بيعمله لوحده: بتكتب الأدوات كدوال عادية بـ decorator اسمه @beta_tool، وهو يطلع الـ schema من الـ type hints والـ docstring (زي اللي بنيناه في الدرس ٣ بالظبط)، ويدير الـ loop والأخطاء.
import json import anthropic from anthropic import beta_tool from dotenv import load_dotenv load_dotenv() client = anthropic.Anthropic() ORDERS = {"1024": {"status": "out for delivery", "eta": "today before 9 PM"}} @beta_tool def get_order_status(order_id: str) -> str: """Get the status and delivery estimate of an order. Args: order_id: The 4-digit order number. """ if order_id not in ORDERS: raise ValueError(f"No order {order_id}. Ask the customer to check the number.") return json.dumps(ORDERS[order_id]) final = client.beta.messages.tool_runner( model="claude-sonnet-5", max_tokens=1024, tools=[get_order_status], messages=[{"role": "user", "content": "أوردر 1024 هيوصل إمتى؟"}], ).until_done() # runs the whole loop for you for block in final.content: if block.type == "text": print(block.text)
لو الأداة رمت exception، الـ runner بيمسكه ويرجعه للموديل كنتيجة فيها is_error، فالموديل يقدر يتصرف. نفس الـ dispatcher اللي كتبناه بإيدنا.
التحكم في استخدام الأدوات: tool_choice
| القيمة | معناها | إمتى |
|---|---|---|
{"type": "auto"} | الموديل يقرر يستخدم أداة ولا يرد على طول (الافتراضي) | أغلب الحالات |
{"type": "any"} | لازم يستخدم أداة، أي واحدة | لما لازم يتصرف مش يتكلم |
{"type": "tool", "name": "..."} | لازم يستخدم الأداة دي بالذات | استخراج بيانات بشكل ثابت |
{"type": "none"} | ممنوع يستخدم أدوات | خطوة تلخيص في الآخر مثلاً |
ولو عايزه يطلب أداة واحدة بس في كل رد (مش كذا واحدة بالتوازي)، ضيف "disable_parallel_tool_use": true جوه الـ tool_choice.
any و tool) وبترجع error. اتأكد من صفحة الموديل في التوثيق، ولو مش مدعوم، استخدم auto ووضّح في الـ prompt إنه لازم يستخدم الأداة.حيلة: الأداة كطريقة لإخراج بيانات منظمة
لو عايز الموديل يطلع JSON بشكل مضمون، اعمل أداة اسمها مثلاً record_review_analysis بـ schema للشكل اللي عايزه، وأجبره عليها بـ tool_choice. الـ input اللي هيبعته هو الـ JSON بتاعك، ومش محتاج تنفذ أي حاجة.