تصور کنید یک برنامهنویس بخواهد ۱۰۰ مورد از گزارشهای خطا را تحلیل کند، اما هر بار مجبور باشد تمام دادهها را به یک دستیار منتقل کند تا فقط یک دستور ساده اجرا شود. این دقیقاً همان گلوگاهی است که Pi با معرفی Codemode (کدمود) آن را از میان برداشت.
به نقل از پست وبلاگی منتشر شده در ۶ اکتبر ۲۰۲۶، Pi اکنون منطق ترکیب ابزارها را از پرامپت مدل زبانی بزرگ (LLM) — که شبیه کتابخانهداری است که میلیاردها صفحه را خوانده و حالا با همان لحن جواب میدهد — به یک محیط اجرای ایزوله (Sandboxed) مبتنی بر جاوااسکریپت منتقل کرده است. این سازوکار به عاملها اجازه میدهد عملیات پیچیده و همزمان را مستقیماً در لایهٔ بدنه (Harness) سیستم اجرا کنند. این تحول در واقع تکامل همان زیرساختی است که در نسخه Pi 1.0 برای استقرار امن عاملها در محیط تولید پیریزی شده بود.
همانطور که در تحلیلهای قبلی ما دربارهی امنیت مدلهای بازمتن اشاره کردیم، جداسازی محیط اجرا از لایهٔ تصمیمگیرنده برای پایداری سیستمها حیاتی است. سالهاست بحث بر سر این است که آیا عاملها باید به ابزارهای سفارشی تکیه کنند یا اسکریپتهای ساده. بیش از یک سال پیش، نویسنده توصیه کرد که ابزارهای سفارشی یا سرورهای MCP را در زمینه (Context) بارگذاری نکنید. استدلال او این بود که «کد تنها چیزی است که نیاز دارید» و MCP در واقع نیازمند کد است. مشکل اینجاست که وقتی یک عامل اسکریپتی را اجرا میکند، خروجی باید به پنجرهٔ زمینه (Context Window) — مثل میز کاری که جا برای چند ورق دارد، نه برای کل کتابخانه — بازگردد. این اتفاق باعث پر شدن سریع حافظه و افزایش هزینهها میشود. در بسیاری از سیستمها، یک «مغز» (بدنه) وجود دارد که «دستها» (محیط اجرا) را فراخوانی میکند، اما ارتباط بین این دو اغلب به یک گلوگاه تبدیل میشود. وقتی یک عامل یک اسکریپت bash را فراخوانی میکند، خروجی حاصل باید دوباره به پنجره زمینه تغذیه شود که این روند به سرعت حافظه را میبلعد.
مغز در برابر دستها
برای درک این معماری، باید بین دو سیستم تفاوت قائل شد. اول «مغز» یا بدنه (Harness) است که روی یک ماشین مورد اعتماد اجرا میشود. دوم «دستها» یا محیط اجرا (Execution Environment) است که هدف تمام عملیاتهاست.
Pi با ایجاد یک خط dividing سخت بین بدنه مورد اعتماد و محیط هدف ایزوله، این گلوگاه را حل کرده است. این تفکیک به این دلیل حیاتی است که دو سیستم روی فایلسیستمهای متفاوت و با سطوح اعتماد متفاوتی کار میکنند. برای مثال، اگر کاربر از راهکاری مثل Gondolin برای ایزولهسازی استفاده کند، عملیاتهای bash ایزوله میشوند اما خودِ بدنه خارج از آن محیط باقی میماند. این یعنی بدنه در محیطی امن است در حالی که دستورات خطرناک در محیط ایزوله اجرا میشوند. این رویکرد به مدیریت دسترسیهای حساس شباهت دارد، مشابه آنچه در سیستم Kong AI Gateway برای محدود کردن دسترسی عاملهای Muse Code پیاده شد.
چرا Bash کافی نیست؟
بر اساس مستندات Pi، اگرچه استفاده از CLI و bash به دلیل سازگاری با آموزشهای مدل درباره فایلسیستمها (مثلاً دانستن اینکه echo foo > /tmp/test.txt یک فایل میسازد) عالی است و اجازه ترکیب آسان ابزارها را میدهد، اما یک محدودیت بنیادی دارد: bash فقط میتواند برنامههایی را ترکیب کند که «اجرا» میشوند.
برخی ابزارهای بومی باید توسط بدنه ارائه شوند چون برنامه به معنای سنتی نیستند. به عنوان مثال:
- ورودیهای چندوجهی: یک مدل نمیتواند با دستور
catیک تصویر را بخواند؛ بدنه باید تصویر را از طریق ابزارهایی مثلreadیاview_imageبه پروتکل LLM تزریق کند تا مدل بتواند محتوای بصری را درک کند. - ارکستراسیون زیر-عاملها: ایجاد و مدیریت زیر-عاملها (Sub-agents) فرآیند پیچیدهای است. اگرچه یک عامل تئوریک میتواند از یک ابزار CLI برای صحبت با بدنه بیرونی از طریق سوکتهای یونیکس (Unix sockets) و متغیرهای محیطی استفاده کند، اما نویسنده این روش را یک «فرآیند ابتدایی و خام» توصیف میکند.
Codemode درون بدنه و با استفاده از QuickJS در یک محیط WASM اجرا میشود. برای امنیت، این محیط محدودیتهای عمدی دارد: دسترسی به شبکه ندارد، فایلسیستم ندارد، تایمرها در آن فعال نیستند و رم آن بهشدت محدود است. تنها راه تعامل کد با دنیای بیرون، فراخوانی ابزارهای بیشتر است.
سازوکار Codemode
در واقع Codemode راهی است تا LLM بتواند فراخوانیهای ابزار را از درون یک زبان برنامهنویسی (بهطور خاص جاوااسکریپت) صادر کند. این یعنی عامل میتواند عملیات را ترکیب کند بدون اینکه هر مرحله میانی را به پنجرهٔ زمینه مدل بفرستد. این الگو نخستین بار توسط تیم Cloudflare نامگذاری شد.
مزایای فنی کلیدی عبارتند از:
- مدیریت دادههای ساختاریافته: برخلاف یک فراخوانی معمولی bash که ممکن است فقط ۲۰۰۰ خط آخر خروجی را به زمینه برگرداند (و عامل را مجبور کند برای دیدن بقیه، یک فایل overflow را دستی چک کند)، Codemode خروجیهای بزرگ را بهصورت ساختاریافته دریافت میکند.
- همزمانی: با استفاده از
Promise.allدر جاوااسکریپت، عاملها میتوانند عملیات همزمان و گردشکارهای پایه را اجرا کنند. Pi تعداد کل اجراهای همزمان ابزارها را به ۴ مورد محدود کرده و برای بقیه یک صف (Queue) نگه میدارد. - پایداری وضعیت: تابع
store()اجازه میدهد دادهها در تاریخچه جلسه (Session Transcript) ذخیره شوند تا در فراخوانیهای بعدی در همان جلسه بازیابی شوند. نکته حیاتی این است که این ذخیرهسازی روی میزبان بدنه اتفاق میافتد، نه در محیط ایزوله (Sandbox). - دسترسی به APIهای داخلی: دسترسی به قابلیتهایی مثل تولید تصویر و طبقهبندی متن که اگر به عنوان ابزارهای استاندارد پیادهسازی میشدند، حجم زیادی از زمینه (Context) را اشغال میکردند.
- بهینهسازی گردشکار: عاملها اغلب از استراتژی «کاوش» (Probe) استفاده میکنند: ابتدا ۵ تا ۱۰ مورد از پاسخ ابزار را بررسی میکنند تا ساختار را بفهمند، سپس یک اسکریپت Codemode مینویسند تا بقیه n مورد را پردازش کنند.
کاربردهای عملی در Pi
عاملهای Pi بهصورت خودکار از Codemode استفاده میکنند. این اتفاق یا به این دلیل میافتد که مدل بهطور طبیعی این ابزار را برای تکلیف انتخاب میکند یا کاربر آن را درخواست کرده است. بهطور پیشفرض، Codemode هنگام فعال بودن MCP فعال است، اما کاربران میتوانند آن را دستی از طریق تنظیمات با عبارت "defaultTools": ["+codemode"] یا صرفاً با درخواست از Pi فعال کنند.
تولید تصویر
تولید تصویر در هسته AI SDK پشتیبانی میشود اما یک ابزار استاندارد نیست. پیش از این، عاملها مجبور بودند Node.js را اجرا کنند یا از افزونههای خاص استفاده کنند. اکنون عامل میتواند از models.getAvailableOfType("image") و models.generateImages استفاده کند. فراخوانی image() نتیجه را به صورت محتوای تصویری به LLM برمیگرداند، در حالی که بدنه آن را به عنوان یک آرتیفکت موقت روی دیسک ذخیره میکند تا عامل بتواند آن را به bash پاس دهد.
طبقهبندی دادهها با Jev
برای تحلیل داده، عامل میتواند از مدلهای طبقهبندیکننده مثل Jev استفاده کند. در یک مثال، عامل ۱۰۰ مورد از Issueهای گیتهاب را پردازش کرد. گردشکار به این صورت بود:
۱. استفاده از tools.bash برای اجرای دستور gh issue list --state open --limit 100 --json number,title,body,comments.
۲. تجزیه (Parsing) خروجی JSON.
۳. استفاده از models.classify با Jev برای تحلیل احساسات (مثبت، خنثی، منفی)، میزان عصبانیت (امتیازی از «اصلاً» تا «بسیار عصبانی») و نوع مورد (باگ، ویژگی، سوال، سایر).
۴. ذخیره نتایج با store("sentiment_results", results) در تاریخچه جلسه.
۵. مرتبسازی نتایج بر اساس امتیاز عصبانیت و بازگرداندن ۱۲ مورد اول.
عیبیابی بازی
یک عامل حلقهای ۳۰ مرحلهای برای کنترل یک موتور بازی از طریق دستور tankctl ساخت. عامل یک بدنه حداقلی برای کمک به کاربر در عیبیابی ایجاد کرد. در هر مرحله، عامل یک دامپ متنی از وضعیت بازی را از طریق tank("state") دریافت میکرد و از Jev استفاده میکرد تا بهترین اقدام را بر اساس معیارهای زیر انتخاب کند:
- حمله (Attack): دشمن در خط دید است و تانک میتواند شلیک کند.
- نزدیک شدن (Approach): هیچ دشمنی در خط دید نیست؛ به سمت نزدیکترین دشمن حرکت کن.
- جاخالی دادن (Dodge): شلیک دشمن به سمت تانک است و بهزودی برخورد میکند.
- آیتم (Powerup): یک آیتم تقویتکننده نزدیک است و هیچ دشمنی تانک را تهدید نمیکند.
سپس عامل دستور مربوطه (مثلاً fire_at tank یا goto x y) را اجرا کرده و نتایج را ثبت میکرد.
ادغام با MCP
Codemode رابطی قدرتمند برای سرورهای Model Context Protocol (MCP) است. بهجای نمایش تمام ابزارهای MCP به مدل، عامل از Codemode برای «کشف تدریجی» (Progressive Discovery) ابزار مناسب استفاده میکند. مثلاً، یک عامل ممکن است ابتدا tools.mcp__sentry__find_organizations را اجرا کند و سپس با استفاده از Promise.allSettled روی نتایج پیمایش کند تا پروژههای هر سازمان را بیابد. عامل حدس نمیزند؛ بلکه از پرامپت سیستم میفهمد که سرور Sentry در دسترس است. این نوع تعاملات با پروتکل MCP، بهینهسازیهای زیرساختی مشابهی را میطلبد، مانند آنچه در پیادهسازی اتصال بدون نشست در PHP برای بهینهسازی زیرساختهای AI مشاهده شد.
با این حال، طبق گزارش نویسنده، این ادغام هنوز بدون نقص نیست و نقاط اصطکاکی وجود دارد:
- محتوای ساختاریافته: Codemode به JSON تمیز و فرمتشده نیاز دارد. بسیاری از سرورها این را ارائه نمیدهند، هرچند سیستم
outputSchemaدر MCP یک راهکار بالقوه است. - ثبات: برخی سرورها توکنها را بر اساس اندازه مجموعه نتایج بهینه میکنند. ممکن است کاوش ۵ مورد اول موفق باشد، اما پردازش یک دسته کامل به دلیل بازگشت دادههای ناسازگار شکست بخورد.
- دادههای باینری: MCP فاقد پشتیبانی از دادههای باینری بزرگ است. این موضوع توسعهدهندگان را مجبور میکند از راهکارهایی مثل URLهای پیشامضا شده برای آپلود فایل از طریق کانالهای غیر MCP استفاده کنند.
- جستوجوی ابزار: هیچ مکانیزم کارآمدی برای پخش (Fan-out) جستوجوی ابزار در چندین سرور MCP وجود ندارد و در حال حاضر به رفتارهای نوظهوری تکیه دارد که مقیاسپذیر نیستند.
همچنین یک ناکارآمدی فعلی وجود دارد: برخی سرورهای MCP، مانند سرورهای Cloudflare، نسخهٔ Codemode خودشان را پیادهسازی کردهاند. این منجر به پدیده «Codemode درون Codemode» میشود که نیاز به Escape دوگانه JSON دارد. این موضوع مدلهای کوچکتر را گیج میکند و مانع از آن میشود که کد داخلی بتواند ابزارهای بیرونی را فراخوانی کند. برای مثال، یک عامل باید جاوااسکریپت بنویسد و آن را از طریق یک لایه دیگر از جاوااسکریپت عبور دهد تا یک درخواست Cloudflare را اجرا کند.
چرخش در معماری عاملها
این رویکرد یک تکامل راهبردی است. در حالی که نویسنده پیشتر طرفدار تعاملات اول-CLI بود، Codemode اذعان میکند که برخی عملیاتها — مانند خواندن تصویر (read یا view_image) یا ارکستراسیون زیر-عاملها — را نمیتوان تنها با bash مدیریت کرد. استفاده از CLI برای زیر-عاملها یک «فرآیند خام» است که شامل متغیرهای محیطی و سوکتهای یونیکس میشود.
با انتقال منطق «ترکیب» به یک محیط جاوااسکریپت ایزوله، Pi بار شناختی مدل را کاهش داده است. مدل دیگر نیازی به مدیریت جزئیات ریز انتقال دادهها (Data Piping) ندارد؛ او صرفاً اسکریپتی مینویسد که این انتقال را مدیریت کند.
این تغییر نشان میدهد آینده هوش مصنوعی عاملمحور در یک مدل ترکیبی است: استفاده از LLM برای برنامهریزی سطح بالا و کد قطعی (Deterministic) برای اجرا و ارکستراسیون دادهها. چالش بعدی برای این الگو، «دوام» (Durability) خواهد بود — یعنی یافتن راههایی برای ثبت وضعیت (Snapshot) فراخوانیها با استفاده از ایدههای موتورهای گردشکار بادوام — و احتمالاً حرکت به سمت زبانهای قطعیتری مثل Starlark. علاوه بر این، ناتوانی این الگو در کارکرد مؤثر با مدلهای کوچکتر، همچنان یک حوزه کلیدی برای بهبود است.
گام بعدی شما
- اگر از MCP استفاده میکنید، بررسی کنید آیا ابزارهای شما خروجی JSON ساختاریافته میدهند تا بتوانید از ارکستراسیونهای پیچیده استفاده کنید.
- برای کاهش هزینه استنتاج، سعی کنید منطقهای تکراری را از پرامپت خارج کرده و به اسکریپتهای محیط اجرا منتقل کنید.
- مدلهای کوچکتر را برای اجرای Codemode تست کنید تا نقاط شکست در JSON escaping را شناسایی کنید.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو