حلقه14 از 37
در درس «[حلقه در بیست خط](the-loop-in-twenty-lines)» حلقهی عاملِ mini را خواندید. اینجا خودتان یکی مینویسید، و یک مدلِ ساختگی هر درخواستی را که حلقهی شما میفرستد بررسی میکند.
## مدلِ ساختگی
تمرینها بدونِ اینترنت اجرا میشوند، پس نقشِ مدل را FakeModel بازی میکند که از قبل در کدِ آغازین هست. به آن یک متنِ از پیش نوشته داده میشود: پاسخهایی که «مدل» به ترتیب خواهد نوشت. هر بار که حلقهی شما model.create(messages) را صدا بزند، پاسخِ بعدی را برمیگرداند، به شکلِ دیکشنریای شبیهِ پاسخِ واقعی:
``json
{"stop_reason": "tool_use",
"content": [
{"type": "thinking", "thinking": ""},
{"type": "tool_use", "id": "toolu_01", "name": "add", "input": {"a": 2, "b": 3}}
]}
`
پیش از جواب دادن هر درخواست را هم بررسی میکند، همانطور که API واقعی درخواستِ نادرست را رد میکند: پیامِ اول و آخر باید مالِ user باشند، نقشها باید یکیدرمیان بیایند، و به هر فراخوانیِ ابزار باید در پیامِ بعدی، با شناسهاش، جواب داده شود. اگر حلقهی شما چیزِ نادرستی بفرستد، اجرا با bad request: و دلیلش متوقف میشود.
run_tool(block) برایتان نوشته شده، با دو ابزار: add و word_count.
## چه بنویسید
run_agent(task, model, max_turns)، طبقِ docstring آن:
- گفتوگو را با کار شروع کنید؛
- در هر نوبت، گفتوگو را بفرستید و کلِ contentِ پاسخ را بهعنوانِ یک پیامِ assistant اضافه کنید؛
- با "end_turn"، متنِ پاسخ را برگردانید؛
- با "tool_use"، همهی فراخوانیهای ابزار را اجرا کنید و برای هر کدام یک خط چاپ کنید، بعد **یک** پیامِ user با همهی نتیجهها اضافه کنید؛
- با هر دلیلِ ایستادنِ دیگری، هیچ چیز را اجرا نکنید و stopped: <reason> را برگردانید؛
- بعد از max_turns نوبت، stopped: no answer after <max_turns> turns را برگردانید.
خطِ هر فراخوانی نوبت (با شمارشِ از ۱)، ابزار، ورودی و نتیجه را نشان میدهد:
`text
turn 1: add {"a": 2, "b": 3} -> 5
`
برای ورودی از json.dumps(block["input"], sort_keys=True) استفاده کنید. کدِ زیرِ تابعِ شما چیزی را که برمیگردانید چاپ میکند، و اینکه در هر نوبت چند پیام برای مدل فرستاده شد. برای متنی که در آن مدل ۲ و ۳ را جمع میکند و بعد جواب میدهد، خروجی این است:
`text
turn 1: add {"a": 2, "b": 3} -> 5
result: 2 + 3 is 5.
messages sent each turn: 1, 3
``
درخواستِ دوم سه پیام دارد: کار، فراخوانیِ ابزارِ مدل و نتیجههای شما. اگر خروجیِ شما چیزِ دیگری میگوید، ببینید چه چیزی را اضافه میکنید.
ورود برای امتحان این تمرین.