ابزار دادن به مدل11 از 37
در درس «[اجرای یک فراخوانیِ ابزار](running-a-tool-call)» دیدید یک هارنس چطور به فراخوانیهای ابزارِ مدل جواب میدهد. اینجا همان بخش را خودتان مینویسید، به همان شکلی که mini مینویسد، و آزمونها همهی قاعدههای آن درس را بررسی میکنند.
اینجا نه مدلی هست و نه اینترنتی: به برنامه محتوای یک پیامِ assistant داده میشود، همانطور که مدل مینوشت، و برنامه پیامِ userی را چاپ میکند که هارنسِ شما پس میفرستاد. حقیقتِ کدِ هارنس همین است: کدِ معمولی است، و میشود بدونِ مدل آزمودش.
## ورودی
محتوای یک پیامِ assistant، به شکلِ JSON: فهرستی از بلوکها. بعضی بلوکِ tool_use هستند و بعضی ممکن است text یا thinking باشند:
``json
[
{"type": "text", "text": "Let me add those."},
{"type": "tool_use", "id": "toolu_01", "name": "add", "input": {"a": 2, "b": 3}}
]
`
در SDK واقعی بلوکها شیء هستند (block.name)؛ اینجا دیکشنریهای سادهاند (block["name"])، با همان خانهها.
## ابزارها
کدِ آغازین از قبل سه ابزار را در یک جدول دارد، هر کدام با اسمِ ورودیهایش:
- add(a, b) دو عدد را جمع میکند؛
- word_count(text) کلمههای یک متن را میشمارد؛
- read_note(name) یکی از دو یادداشت، shopping یا todo، را برمیگرداند و برای هر اسمِ دیگری خطا میدهد.
## چه بنویسید
**run_tool(block)** یک بلوکِ tool_use میگیرد و بلوکِ tool_result آن را برمیگرداند:
- در هر نتیجه "type": "tool_result" و "tool_use_id"، یعنی idِ همان بلوک؛
- اگر ابزاری با آن اسم نیست: "content": "Error: no tool called <name>" و "is_error": true؛
- اگر ورودیای جا افتاده: "content": "Error: missing input <input>"، با اسمِ اولین ورودیِ جاافتاده به همان ترتیبی که جدول فهرست کرده، و "is_error": true؛
- اگر ابزار خطا بدهد: "content": "Error: <the error's message>" (یعنی str(error)) و "is_error": true؛
- وگرنه "content" برابر با str()ِ چیزی است که ابزار برگردانده، و کلیدِ is_error ندارد.
**results_message(content)** پیامِ userی را برمیگرداند که به همهی بلوکهای tool_use در محتوا، به همان ترتیب، جواب میدهد: {"role": "user", "content": [...results...]}. بلوکهای متن و فکر کردن را کنار میگذارد، و اگر هیچ فراخوانیِ ابزاری نباشد None برمیگرداند.
برای نمونهی بالا، برنامه این را چاپ میکند:
`json
{
"content": [
{
"content": "5",
"tool_use_id": "toolu_01",
"type": "tool_result"
}
],
"role": "user"
}
`
(کلیدها به ترتیبِ الفبا میآیند چون کدِ چاپ آنها را مرتب میکند، پس لازم نیست شما این کار را بکنید.)
راهنمایی: function(**args) تابعی را با یک دیکشنری بهعنوانِ آرگومانهای نامدار صدا میزند، و try / except Exception as error` هر خطایی را که ابزار بدهد میگیرد.
ورود برای امتحان این تمرین.