یک سرور مشترک هرگز نباید دسترسیهای مدیریتی محیط عملیاتی (Production) یک عامل هوش مصنوعی را در اختیار داشته باشد. اگر امروز از محیطهای رایانشی رایگان برای اجرای عاملهای خود استفاده میکنید، احتمالاً ریسک بزرگی را پذیرفتهاید که میتواند منجر به حذف تصادفی دادههای شما شود.
به نقل از راهنمای فنی منتشر شده در dev.to در ۲۳ سپتامبر ۲۰۲۶، ادغام مراحل برنامهریزی، بازیابی و تغییر وضعیت در یک رشته گفتگو (Chat Transcript)، عامل اصلی وقوع خطاهای جبرانناپذیر در محیط عملیاتی است. این ساختار باعث میشود این پرسش حیاتی نادیده گرفته شود: وقتی مدل در حال «بلند فکر کردن» است، چه کسانی به پنجره زمینه (Context Window) — شبیه به میز کاری که مدل تمام اطلاعات فعلی را روی آن پخش کرده تا ببیند چه میکند — دسترسی دارند؟
بسیاری از دموهای عاملهای هوش مصنوعی، رابطهای کاربری خوشرنگی دارند که ریسکهای محیط محاسباتی (Compute) را پنهان میکنند. وقتی توسعهدهندگان از میزبانیهای رایگان و مشترک استفاده میکنند، با خطر «همسایگان پرسرصدا» روبرو میشوند؛ یعنی احتمال اینکه کاربر دیگری محتوای پنجره زمینه آنها را ببیند یا بدتر از آن، عامل دستوری را در یک میزبان ناامن اجرا کند که امکان بازگشت (Undo) ندارد. یک مسیر برنامهریزی میتواند همسایگان پرسرصدا را تحمل کند، اما یک مسیر اجرا نمیتواند؛ زیرا اثرات جانبی (Side Effects) منتظر تلاش مجدد (Retry) نمیمانند. این نقص معماری، یک حلقه سادهی عامل را به یک بدهی امنیتی تبدیل میکند، مگر اینکه سیستم بتواند از طریق یک git revert به حالت قبل بازگردد.
برای حل این مشکل، چارچوب پیشنهادی، انتخاب میزبان را به جای یک «خرید ساده»، به یک «مسئله مسیریابی» تبدیل میکند. در این مدل، هر حلقه کاری به دو مسیر متمایز تقسیم میشود: مسیر برنامهریزی (Plan Lane) برای پیشنویسها و مسیر اجرا (Act Lane) برای تغییرات وضعیت (Mutations). این ساختار تضمین میکند که عملیاتهای پرخطر هرگز روی یک سرور رایگان و مشترک فرود نیاییند. این رویکرد شباهت زیادی به مکانیسم مسیریاب وظایف دارد که برای جلوگیری از نشت دادههای حساس در عاملهای محلی طراحی شده است. دسترسی رایگان به مدل و سرور میتواند مسیر مناسبی برای پیشنویسها، خلاصههای بازیابی و برنامههای رد شده باشد. اما زمانی که یک ابزار قرار است سیستمی را تغییر دهد که قابلیت بازگشت ندارد، استفاده از محاسبات ایزوله یا میزبانهای شخصی (Self-hosted) و پولی الزامی است.
گام اول: طبقهبندی ابزارها
اولین قدم، برچسبگذاری هر ابزار به عنوان «برنامهریزی»، «اجرا» یا «ممنوعه» است. شما باید با لیست ابزارها شروع کنید، نه با جدول مقایسهای فروشندگان. معیار تشخیص صریح و بیپرده است: آیا پس از اجرای این فراخوانی، یک انسان میتواند با یک دستور git revert دنیا را به حالت قبل برگرداند؟ اگر پاسخ منفی است، آن ابزار نمیتواند در مسیر برنامهریزی وجود داشته باشد.
- ابزارهای برنامهریزی (Plan Tools): اینها شامل توابعی مانند
read_tickets(خواندن تیکتها)،search_docs(جستجو در مستندات)،draft_patches(پیشنویس اصلاحات) وexplain_diffs(توضیح تفاوتها) هستند. این ابزارها فقط میخوانند و توضیح میدهند، بدون اینکه به اعتبارنامههایی که وضعیت سیستم را تغییر میدهند دست بزنند. این ابزارها معمولاً با پیشوندهایی مثلread_،search_،draft_،explain_وlint_شناسایی میشوند. - ابزارهای اجرا (Act Tools): اینها شامل توابعی مانند
apply_(اعمال)،deploy_(استقرار)،pay_(پرداخت)،email_(ارسال ایمیل) وdelete_(حذف) هستند. این ابزارها به دلیل تغییر وضعیت جهان واقعی، نیاز به محاسبات ایزوله دارند. در این راستا، برای مدیریت پرداختهای امن در عاملها، پلتفرم Elisym لایهی پرداخت و شناسایی غیرمتمرکز را فعال کرده است تا ریسکهای متمرکز کاهش یابد. - ابزارهای ممنوعه (Forbidden Tools): عملیاتهای بسیار پرخطر که حاوی زیررشتههایی مانند
prod_admin(مدیریت محیط عملیاتی)،rotate_secret(تغییر کلیدهای امنیتی) یاwire_transfer(انتقال بانکی) هستند، در محیطهای خاص بهطور کامل مسدود میشوند.
هر ابزار ناشناخته باید بهصورت پیشفرض در مسیر «اجرا» قرار بگیرد. این پیشفرض محافظهکارانه مانع از آن میشود که یک «نام مستعار جذاب» بهطور تصادفی ارثیه یک مسیر رایگان و ناامن را ببرد، حتی اگر این کار باعث ایجاد اصطکاک جزئی در فرآیند بررسی شود. یک مسیریاب کمی آزاردهنده، بسیار ارزانتر از یک تغییر جبرانناپذیر است که روی میزبان اشتباه اجرا شده باشد.
گام دوم: قراردادهای میزبان
پس از برچسبگذاری، مسیریاب پیش از ارسال هر پرامپت، یک «قرارداد میزبان» (Host Contract) را ارزیابی میکند. قرارداد میزبان فایلی کوچک است که مسیریاب میتواند آن را ارزیابی کند تا صفتهای تبلیغاتی صفحات قیمتگذاری را نادیده بگیرد؛ زیرا صفتها جلوی یک عملیات نوشتن (Write) را نمیگیرند.
- قرارداد مسیر برنامهریزی: این پیکربندی معمولاً
allow_tool_execution: falseوallow_secret_injection: falseرا تنظیم میکند. در این حالت پذیرفته میشود کهmax_untrusted_neighbors(حداکثر همسایگان غیرقابلاعتماد) روی حالتunknown-okباشد و خروجی فقط به صورتdraft_only(فقط پیشنویس) باشد. در انتخاب بین مدلهای محلی و ابری برای این مسیر، قاعده ۱.۴ برابر میتواند تردید توسعهدهندگان را در مورد تأخیر و هزینه برطرف کند. - قرارداد مسیر اجرا: این قرارداد نیازمند
allow_tool_execution: trueوallow_secret_injection: trueاست، اما الزام میکند کهmax_untrusted_neighbors: 0باشد. خروجی باید به صورتmutates_with_receipt(تغییر وضعیت همراه با رسید) باشد.
اگر یک میزبان نتواند این وعدههای سختگیرانه ایزولهسازی را برآورده کند، صرفنظر از قیمتش، از مسیر اجرا حذف میشود. نویسنده اشاره میکند که وقتی به مسیر برنامهریزی نیاز دارد، پیشنویسها را برای دسترسی رایگان به مدل و سرور از طریق MonkeyCode ارسال میکند، در حالی که کارهای برچسبگذاری شده در مسیر اجرا را به یک میزبان ایزوله منتقل میکند.
گام سوم: ایزولهسازی جعبه اجرا
یک میزبان اجرا به سیاست شبکهای نیاز دارد که بتوان آن را در یک پاراگراف، بدون ابهام و کلیگویی، توصیف کرد. طبق راهنمای dev.to، یک میزبان اجرای معتبر باید به سه پرسش مشخص پاسخ دهد: لیست سفید خروجیها (Outbound Allowlist) چیست، ابزارها با چه هویتی اجرا میشوند و دیسکی که رسیدها را ذخیره میکند کجاست؟ محاسبات رایگان و مشترک تقریباً هرگز به این سه پرسش با دقتی که یک ابزار جبرانناپذیر میطلبد، پاسخ نمیدهند.
برای تایید این موارد، نویسنده یک اسکریپت تست دود (Smoke Test) به نام act-host-smoke.sh پیشنهاد میکند که سه مورد زیر را بررسی میکند:
۱. امنیت اعتبارنامهها: اطمینان از اینکه اعتبارنامههای محیط عملیاتی (مثلاً در مسیر /etc/prod-creds) توسط همه قابل نوشتن (World-writable) نیستند.
۲. سیاست فایروال: تایید فعال بودن سیاست «حذف پیشفرض» (Default-drop) در فایروال از طریق دستور iptables -S | grep -q "policy DROP".
۳. ذخیره رسیدها: تایید وجود یک دایرکتوری اختصاصی برای رسیدهای عامل (مثلاً /var/agent-receipts).
اگر پلتفرمی اجازه دسترسی SSH برای بازرسی این تنظیمات را نمیدهد، برای مسیر اجرا نامناسب است و باید فقط در مسیر برنامهریزی باقی بماند. نویسنده ترجیح میدهد راحتی را از دست بدهد تا تظاهر کند یک پلتفرم بسته، یک میزبان اجرای ایزوله است.
گام چهارم: تحویل امضاشده
خطرناکترین لحظه در چرخه عمر یک عامل، لحظه انتقال (Handoff) بین مسیر برنامهریزی و اجرا است، نه اولین توکن از پیشنویس. برای کاهش این ریسک، این چارچوب یک «رسید برنامهریزی امضاشده» (Signed Plan Receipt) معرفی میکند. این رسید عمداً خستهکننده و ساده طراحی شده است، زیرا گیتهای خستهکننده زمانی که رابط کاربری چت میخواهد جادویی به نظر برسد، دوام میآورند.
این رسید شامل موارد زیر است:
- یک هش SHA-256 از متن برنامه (
plan_sha256). - یک لیست مرتبشده از ابزارهای مجاز برای اجرا (
allowed_act_tools). - هویت کسی که تصمیم گرفته است (
decided_by) و یک برچسب زمانی (decided_at). - مسیر هدف که روی
actتنظیم شده است.
این گیتِ حسابرسیپذیر تضمین میکند که یک همتیمی بتواند تصمیم را بدون پیمایش در تاریخچه طولانی چت یا تکیه بر اسکرینشات از توکنهای در حال استریم، بازپخش کند. اگر ابزار درخواستی در برنامه امضاشده نباشد، سیستم خطای PermissionError صادر کرده و اجرا را مسدود میکند.
کاربرد عملی: مثال تغییرات نسخه (Changelog)
تیکتی را در نظر بگیرید که از عامل میخواهد یک changelog را پیشنویس کرده و یک نسخه (Release) را تگ کند. خواندن تیکت و پیشنویس کردن متن، کارهای «برنامهریزی» هستند زیرا انسان میتواند به سادگی پیشنویس را دور بریزد. اما اجرای دستور git tag -a و سپس push کردن، یک کار «اجرا» است، زیرا این یک پیشنهاد مودبانه نیست، بلکه یک تغییر واقعی است.
اجرای دستور تگ روی یک میزبان رایگان و مشترک، صرفاً به این دلیل که پیشنویس در همان رشته گفتگو خوب به نظر میرسید، یک شکست بحرانی است. منطق مسیریابی تضمین میکند پیشنویس در «اتاق پیشنویس» بماند، در حالی که دستور تگ به یک میزبان ایزوله و پولی مسیریابی شود. نویسنده این برچسبها را بهصورت محلی تست میکند؛ اگر draft_changelog در مسیر اجرا قرار بگیرد، نام ابزار را تغییر میدهد. اگر tag_release در مسیر برنامهریزی قرار بگیرد، طبقهبندیکننده را خراب تلقی کرده و از میزبان رایگان استفاده نمیکند.
ماتریس تصمیمگیری برای انتخاب محاسبات
برای تعیین مسیر درست، توسعهدهندگان باید برای هر عامل یک جدول پر کنند، زیرا یک باتِ مستندات و یک باتِ استقرار، مسیرهای مشترکی ندارند. مقایسهای که نتواند تفاوت این دو بات را تشخیص دهد، دوباره ابزارهای تغییردهنده را به اتاق پیشنویس میفرستد.
| پرسش | مسیر رایگان/مشترک (برنامهریزی) | مسیر ایزوله/پولی (اجرا) |
|---|---|---|
| آیا مرحله فقط پیشنویس یا توضیح است؟ | بله، اینجا بماند | اتلاف منابع است مگر اینکه ایزولاسیون اضافی داشته باشید |
| آیا خواندن پرامپت توسط همسایه پذیرفتنی است؟ | برای مستندات عمومی بله | برای دادههای مشتری یا اسرار غیرقابلقبول است |
| آیا ابزار با git قابل بازگشت است؟ | فقط پیشنویسها | برای apply یا deploy الزامی است |
| آیا به لیست سفید خروجی نیاز دارید؟ | معمولاً نمیتوان یکی را اثبات کرد | پیش از اولین فراخوانی تغییردهنده الزامی است |
| آیا تأخیر در صف باعث شکست در جابجایی پول میشود؟ | برای برنامهریزی مشکلی نیست | برای کارهای اجرا با ضربالاجل پذیرفتنی نیست |
این رویکرد، تشریفات بیشتر را در ازای امنیت میپذیرد. نگهداری دو پیکربندی خستهکننده، ترجیح داده میشود تا یک میزبان «باهوش» که هر دو نقش را بهطور ضعیفی مدیریت میکند.
محدودیتها و حفاظها
این گردشکار، یک متدولوژی است، نه یک گواهینامه امنیتی. این روش نمیتواند توکنی را که قبلاً در یک پرامپت نشت کرده است، نجات دهد. اگر زمینه برنامهریزی حاوی دادههای حساس مشتری باشد، کاربر باید کاملاً گزینه رایگان را نادیده بگیرد و مسیر برنامهریزی را نیز ایزوله تلقی کند. پیشنویسهای مشترک یک ویژگی برای راحتی هستند، نه یک الحاقیه پردازش داده برای مشتریان.
علاوه بر این، این تفکیک برای موارد زیر نامناسب است:
- محیطهایی که رگولاتورها انتظار یک زمان اجرای واحد و حسابرسیشده برای هر توکن را دارند.
- عاملهایی که باید در یک تراکنش با زمانبندی دقیق و بدون رسید انسانی عمل کنند.
- موقعیتهایی که در آن نمیتوان یک میزبان اجرای ایزوله نامگذاری کرد.
تیمهایی که تغییرات تولید خودکار را بدون مسیر رد (Reject Path) ارسال میکنند، نباید هیچ چیزی را روی محاسبات رایگان مشترک قرار دهند. برای نگهداری سیستم، نویسنده از تستهایی (مانند test_plan_act_label.py) استفاده میکند تا مطمئن شود draft_release_notes در مسیر برنامهریزی میماند، deploy_canary هرگز وارد مسیر رایگان نمیشود و ابزارهای ناشناخته مانند do_the_needful همیشه بهطور پیشفرض به مسیر اجرا میروند. یک تست شکستخورده برای ابزار ناشناخته، یک هدیه است، زیرا مانع از آن میشود که یک نام مستعار جذاب، ارثیه مسیر رایگان را ببرد.
در نهایت، هدف این است که انتخاب میزبان بر اساس این نباشد که «ظرفیت باقیمانده در داشبورد دوستانه به نظر میرسید». ظرفیت، یک «مسیر» نیست. تنها پرسشی که اهمیت دارد این است که آیا ابزار بعدی هنوز یک پیشنویس است یا به یک رسید نیاز دارد.
گام بعدی شما
- ابزارهای فعلی عاملهای خود را بر اساس قابلیت بازگشت (Undo) به دو دسته Read-only و Mutating تقسیم کنید.
- برای ابزارهای Mutating، یک محیط ایزوله با سیاست فایروال Default-drop ایجاد کنید.
- یک لایه تایید (Approval Gate) بین مرحله تولید پیشنویس و اجرای دستورات حساس پیادهسازی کنید.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما درباره تراشههای Blackwell مراجعه کنید.




گفتگو