Knaph

ابزار دادن به مدل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` هر خطایی را که ابزار بدهد می‌گیرد.

ورود برای امتحان این تمرین.