هارنس عامل (Agent Harness) چیست و چه تفاوتی با مدل دارد؟
هارنس عامل برنامهای است که مدل را به یک عامل هوشمند تبدیل میکند. در این مقاله بررسی میکنیم که چگونه حلقه اجرا، مدیریت ابزارها و وضعیت نشست، مدل را به یک عامل فعال تبدیل میکند.
هارنس عامل (agent harness) چیست
هارنس عامل برنامهای است که پیرامون یک مدل زبانی اجرا میشود و آن را به یک عامل (agent) تبدیل میکند. این برنامه شامل حلقهای است که بهطور مداوم مدل را فراخوانی میکند، تعاریف ابزارهایی که مدل مجاز به استفاده از آنهاست، قوانین دسترسی که تعیین میکنند کدامیک از آن فراخوانیها واقعاً اجرا شوند، وضعیت نشست (session state) که بین نوبتها حفظ میشود، و دایرکتوری کاری که عملیات در آن انجام میگیرد. مدل در داخل این ساختار قابلجایگزینی است.
جمله آخر نکتهای است که باید به خاطر سپرد. یک مدل بهتنهایی به یک پرسش پاسخ میدهد و سپس شما را فراموش میکند. اما یک هارنس از مدل میپرسد که گام بعدی چیست، دستوری را که مدل درخواست کرده اجرا میکند، نتیجه را به مدل بازمیگرداند و دوباره پرسش را تکرار میکند. این تکرار همان چیزی است که افراد هنگام استفاده از واژه "عامل" (agent) مد نظر دارند. اگر همچنان در درک اصطلاحات پیرامونی ابهام دارید، تفاوت بین یک عامل هوش مصنوعی، یک LLM و یک دستیار پیش از انتخاب ابزار، این مفاهیم را برای شما شفاف میکند.
هارنس (Harness) همان مدل نیست
این دو مورد اغلب با هم اشتباه گرفته میشوند، زیرا فروشندگان آنها را تحت یک نام تجاری واحد عرضه میکنند.
dsh و DeepSeek دو محصول متفاوت هستند. DeepSeek Harness که در تاریخ 13 اوت 2026 در github.com/deepseek-ai/deepseek-harness تحت مجوز MIT منتشر شد، یک برنامه Node است که روی دستگاه خود نصب میکنید. مدلهای DeepSeek وزنهایی هستند که از طریق یک API (رابط برنامهنویسی اپلیکیشن) ارائه میشوند. اگر dsh را به سمت مدل یک فروشنده دیگر هدایت کنید، همچنان کار میکند؛ زیرا هارنس تنها به چیزی نیاز دارد که پیامها را بپذیرد و فراخوانی ابزارها (tool calls) را بازگرداند.
Claude Code و Claude نیز همین جفت را تشکیل میدهند. Claude Code یک هارنس است: یک برنامه ترمینال دارای حلقه پردازش، سیستم مجوزدهی، و ابزارهای فایل و شل. Claude خانواده مدلی است که بهصورت پیشفرض توسط آن فراخوانی میشود. Codex و Gemini CLI نیز به همین شکل تفکیک میشوند.
این آزمونی است که همیشه تکلیف را مشخص میکند. شما یک هارنس را نصب میکنید. سپس یک مدل را فراخوانی میکنید. اگر آن ابزار نسخهای روی دیسک شما دارد و فایل پیکربندی آن در دایرکتوری home شما قرار گرفته است، آن یک هارنس است. اگر آن مورد یک رشته متنی در داخل همان فایل پیکربندی باشد، چیزی شبیه به deepseek-chat، آن همان مدل است.
عملکرد واقعی حلقه
یک دور از حلقه harness به این شکل است. آن را بهدقت بخوانید، زیرا تقریباً هر تفاوتی بین harnessها، در دل همین 5 مرحله نهفته است.
- harness کل مکالمه تا آن لحظه را به همراه فهرستی از تعریف ابزارها برای مدل ارسال میکند.
- مدل با متن یا درخواستی برای فراخوانی یکی از آن ابزارها پاسخ میدهد.
- harness آن درخواست را با قوانین دسترسی خود مطابقت میدهد و یا آن را اجرا میکند و یا برای پرسش از شما متوقف میشود.
- harness ابزار را اجرا کرده، خروجی و کد خروج را ضبط میکند و اگر خروجی بسیار طولانی باشد، آن را کوتاه میکند.
- harness آن نتیجه را به مکالمه اضافه کرده و به مرحله 1 بازمیگردد.
مرحله 3 جایی است که harnessها در استفاده روزمره بیشترین تفاوت را با هم دارند. harnessای که پیش از هر دستور میپرسد، امن اما خستهکننده است. harnessای که هرگز نمیپرسد، سرانجام یک دستور مخرب را روی مسیری که مدل اشتباه تشخیص داده، اجرا خواهد کرد. اکنون هر harness جدی یک تنظیم میانی دارد: یک لیست مجاز (allowlist) از دستوراتی که بدون پرسش اجرا میشوند و درخواست تأیید برای سایر موارد.
مرحله 1 جایی است که سایر تفاوتها در آن قرار دارند. مکالمه در هر دور رشد میکند و مدل دارای یک پنجره متنی (context window) ثابت است؛ بنابراین harness باید تصمیم بگیرد چه چیزی را حذف کند، چه چیزی را خلاصه کند و چه چیزی را در یک فایل بنویسد تا بعداً دوباره بخواند. همین تصمیم، دلیل اصلی تفاوت کیفیت خروجی دو harness است که از یک مدل واحد استفاده میکنند.
اکثر harnessها اکنون ابزارهای خارجی را از طریق MCP (پروتکل زمینه مدل) متصل میکنند؛ روشی استاندارد برای ارائه یک ابزار به هر harnessای که از آن پشتیبانی میکند، بهطوری که یکپارچهسازی واحد برای چندین harness کارساز باشد. اجرای سرورهای MCP روی یک VPS این بخش را پوشش میدهد.
تفاوت Agent harness و Agent framework
این پرسش با هر بار معرفی یک harness جدید مطرح میشود و پاسخها به دلیل اختلافنظر تولیدکنندگان، متفاوت است. در اینجا تعریفی ارائه میشود که دقیق است.
یک framework کتابخانهای است که آن را import میکنید. شما حلقه (loop) را مینویسید، تصمیم میگیرید چه زمانی مدل را فراخوانی کنید و نتایج ابزارها را خودتان مدیریت میکنید. LangChain نمونه شناختهشدهای است: شما بلوکهای سازنده را دریافت کرده و عامل (agent) را در کد خود اسمبل میکنید.
یک harness برنامهای است که آن را اجرا میکنید. حلقه از قبل نوشته شده، ابزارها از قبل موجود هستند و مدل مجوزها دارای تنظیمات پیشفرض است. شما با اولین دستور یک عامل فعال دریافت میکنید و از آنجا به بعد آن را پیکربندی میکنید.
تست نصب معمولاً تعیینکننده است. اگر آن را نصب کردید و سپس کد نوشتید، این یک framework است. اگر آن را نصب کردید و سپس با آن تعامل کردید، این یک harness است.
مرز بین این دو واقعاً مورد بحث است و واضحترین گواه آن، مستندات خود LangChain است. تا اوت 2026، این مستندات Deep Agents را به عنوان یک framework «مبتنی بر نظر و کامل» (opinionated, batteries-included) که بر پایه LangGraph ساخته شده توصیف میکند، در حالی که مخزن langchain-ai/deepagents خود را «یک agent harness کامل» مینامد. هر دو توصیف منصفانه هستند. Deep Agents یک Python SDK است که آن را import میکنید، بنابراین تست نصب آن را یک کتابخانه میداند، اما رفتارهای پیشفرض کافی را ارائه میدهد که افراد از آن مانند یک harness استفاده میکنند. مایکروسافت در اوت 2026 یک harness و عاملهای میزبانیشده را به مرحله عرضه عمومی رساند که نشان میدهد این واژه اکنون بیش از آنکه یک اصطلاح فنی باشد، یک دستهبندی محصول است.
بنابراین، پرسشی را مطرح کنید که حجم کاری شما را پیشبینی کند. اگر حلقه را مینویسید، مسئولیت آن با شماست: تلاشهای مجدد (retries)، کوتاهسازی context، درخواستهای مجوز و ثبت وقایع. اگر حلقه از پیش آماده باشد، شما پاسخهای شخص دیگری را برای تمام این موارد به ارث میبرید که شروع کار را بسیار سریعتر میکند اما تغییر دادن آن در آینده دشوارتر است.
تفاوت harness با پنجره چت
پنجره چت و harness هر دو خروجی مدل را به شما نمایش میدهند. تفاوت در این است که پردازش روی کدام رایانه انجام میشود. در پنجره چت، هر کدی که مدل اجرا میکند در محیط sandbox فروشنده و روی فایلهایی که آپلود کردهاید اجرا میشود و با پایان نشست، از بین میرود. اما یک harness ابزارها را روی همان ماشینی که آن را اجرا کردهاید، با دسترسی کاربری که آن را استارت زده، روی فایلهای واقعی شما و با استفاده از اعتبارنامههای واقعی موجود در محیط اجرا میکند.
این تمام مزیت و تمام ریسک موجود در دو جمله است. عامل (agent) بالاخره میتواند کار را انجام دهد. همچنین عامل میتواند کار را حذف کند.
هارنسهایی که کاربران واقعاً از آنها استفاده میکنند
این فهرست عمداً در تاریخ 19 August 2026 بهروزرسانی شده است. این حوزه بهصورت هفتگی در حال تغییر است و هر جمعبندی بهسرعت قدیمی میشود.
- Claude Code و Codex هارنسهای شرکتی هستند. این ابزارها ترمینالمحور بوده و بهصورت پیشفرض به مدلهای اختصاصی همان شرکت متصل میشوند و از صیقلیافتهترین سیستم مدیریت دسترسی برخوردارند. مقایسه Claude Code، Cursor، Codex و Copilot این موارد را بهدرستی بررسی میکند.
- DeepSeek Harness (
dsh) دارای مجوز MIT است و بر یک ایده بنا شده: همهچیز یک پلاگین است؛ بنابراین مدلها، ابزارها، نشستها، محیطهای sandbox و رابط کاربری، همگی قطعاتی قابلجایگزینی هستند. این پروژه در تاریخ 19 August 2026، یعنی شش روز پس از انتشار، حدود 166,800 ستاره در GitHub داشت. - Hermes، محصول Nous Research، بیشتر یک عامل خودمختار عمومی است تا یک ابزار کدنویسی. این ابزار در فوریه 2026 تحت مجوز MIT منتشر شد و حافظه و مهارتهای خود را در یک دیتابیس محلی SQLite روی دستگاه شما نگه میدارد. میزبانی شخصی Hermes روی یک VPS مراحل آن را توضیح میدهد.
- Omnigent یک متا-هارنس است: این ابزار سایر هارنسها از جمله Claude Code و Codex را از طریق یک API واحد با نشستهای مشترک، سقف هزینه و یک sandbox در سطح سیستمعامل مدیریت میکند. Omnigent به عنوان یک هارنس چندعاملی مزایای این رویکرد را بررسی میکند.
- OneCLI یک هارنس ایزولهشده (sandboxed) برای تیمها است که حول یک دروازه (gateway) ساخته شده؛ این دروازه اعتبارنامههای واقعی را به درخواستهای خروجی تزریق میکند تا خودِ عامل همیشه فقط کلیدهای جایگزین (placeholder) را ببیند.
شروع سریع dsh تنها با یک دستور انجام میشود و اجرای یکبارهٔ آن سریعترین راه برای درک ماهیت یک هارنس است. این ابزار به Node.js روی دستگاه نیاز دارد.
npx @deepseek-ai/dsh webاین دستور رابط کاربری وب (web UI) را روی http://127.0.0.1:3080 راهاندازی میکند. پیش از تکیه بر آن، فایل README را مطالعه کنید، زیرا dsh خود را به عنوان یک پیشنمایش توسعهدهنده معرفی کرده و بهصراحت اعلام میکند که تغییرات ناسازگار در نسخههای بعدی وجود خواهد داشت. اجرای DeepSeek Harness روی یک VPS نصب سرور را پوشش میدهد و چرا آن آدرس با 127.0.0.1 شروع میشود دلیل پیشفرض بودن loopback را توضیح میدهد.
روترها در سطحی بالاتر از harness قرار میگیرند
یک روتر مدل، پروکسی محلی میان harness و API ارائهدهنده است. Claude Code Router نمونهای رایج است: این ابزار بهطور پیشفرض روی 127.0.0.1:3456 گوش میدهد، درخواستهایی را که Claude Code قرار بود به ارائهدهنده اصلی خود بفرستد دریافت میکند و آنها را به ارائهدهندهای که شما پیکربندی کردهاید، هدایت میکند. harness از این تغییر هیچ اطلاعی ندارد.
روترها به این دلیل وجود دارند که مدلها قابلجایگزینی هستند؛ بنابراین آنها گواهی بر نکته اصلی این مطلب محسوب میشوند. روترها همچنین ریسک را متمرکز میکنند، زیرا پروکسی تمام پرامپتها را میبیند و تمام کلیدهای ارائهدهنده را در اختیار دارد. با آن بهعنوان زیرساخت برخورد کنید، نه یک ابزار رفاهی. محل نگهداری کلیدهای API و تنظیمات مدل در harness همان مشکلی است که یک لایه پایینتر نیز وجود دارد.
تغییرات هنگام اجرای harness روی یک VPS
وقتی harness از لپتاپ شما به سروری که اجاره کردهاید منتقل میشود، چهار مورد تغییر میکند.
هنگام بستن در لپتاپ همچنان اجرا میماند. یک وظیفه طولانیمدت از رفتوآمد شما و وضعیت باتری جان سالم به در میبرد. آن را داخل tmux شروع کرده و از آن جدا شوید:
tmux new -s agent
# start the harness, then press Ctrl-b and then d to detach
tmux attach -t agentبرای هر چیزی که باید پس از reboot دوباره بالا بیاید، یک user service بهتر از یک session ترمینال عمل میکند:
loginctl enable-linger $USER
systemctl --user status my-agent.serviceloginctl enable-linger بخشی است که افراد از آن غافل میشوند. بدون آن، systemd به محض بسته شدن آخرین session SSH (secure shell) شما، سرویسهای کاربر را متوقف میکند؛ بنابراین agent هنگام خروج شما از سیستم میمیرد و هیچ خطایی هم چاپ نمیشود. اجرای dsh به صورت headless تحت systemd شامل فایل unit است. هنگامی که یک session روی آن سرور فعال باشد، session دوم هزینه اضافی برای شما ندارد و دو session Claude Code روی یک ماشین میتوانند به یکدیگر پیام دهند، بنابراین sessionای که صبح شروع کردهاید میتواند بدون نیاز به دخالت دستی شما، وظیفهای را به دیگری محول کند.
کلیدهای شما را نگه میدارد. کلید ارائهدهنده اکنون در یک فایل پیکربندی روی آن سرور قرار دارد. بررسی کنید چه کسی میتواند آن را بخواند:
ls -l ~/.configهر فرآیندی که با کاربر شما اجرا شود میتواند آن فایل را بخواند، که شامل agent و هر چیزی است که agent تصمیم به اجرای آن میگیرد.
میتواند به سایر ماشینهای شما دسترسی داشته باشد. یک VPS در همان شبکه خصوصی که سایر ماشینهای شما در آن هستند، به agent مسیری به سمت آنها میدهد. این دقیقاً هدف اصلی است و در عین حال محدوده آسیب (blast radius) نیز محسوب میشود.
از هر جایی که هستید قابل دسترسی است. اکثر harnessها یک رابط کاربری وب ارائه میدهند و اکثر آنها به دلیلی آن را روی loopback محدود میکنند. تنظیمات خود را بررسی کنید:
ss -tlnp | grep 3080127.0.0.1:3080 به این معنی است که فقط خود سرور میتواند متصل شود. 0.0.0.0:3080 به این معنی است که هر کسی که آدرس را پیدا کند میتواند متصل شود. به جای تغییر آدرس bind، از طریق یک تونل SSH به رابط کاربری loopback دسترسی پیدا کنید:
ssh -N -L 3080:127.0.0.1:3080 you@your-serverسپس http://127.0.0.1:3080 را در مرورگر لپتاپ خود باز کنید. ترافیک درون session SSH منتقل میشود، بنابراین هیچ چیز جدیدی در معرض اینترنت قرار نمیگیرد.
هر یک از این موارد، استدلالی برای امنیت نیز محسوب میشود
چهار ویژگی ذکر شده را دوباره از دید یک مهاجم بررسی کنید.
این ابزار بدون نظارت اجرا میشود، بنابراین کسی متوجه لحظهای که مدل مسیر فایل را اشتباه میخواند، نخواهد بود. این ابزار کلیدهای شما را در اختیار دارد، بنابراین یک فایل پیکربندی قابلخواندن، به معنای دسترسی کامل به حساب ارائهدهنده شماست. این ابزار میتواند به سایر ماشینهای شما دسترسی پیدا کند، بنابراین یک prompt injection—یعنی دستوراتی که در یک صفحه وب یا فایلی که عامل (agent) میخواند پنهان شدهاند—اکنون مسیری به سمت میزبان پایگاه داده شما ایجاد کرده است. این ابزار از هر جایی در دسترس است، بنابراین یک رابط کاربری وب که روی 0.0.0.0 متصل شده و رمز عبور ندارد، در واقع یک shell روی اینترنت عمومی است.
راهکار هر یک از این موارد خستهکننده است و هر بار نیز یکسان است. به جای حساب کاربری خودتان، یک حساب کاربری بدون دسترسیهای ویژه (unprivileged) به عامل اختصاص دهید:
sudo adduser --disabled-password --gecos "" agentرابط کاربری وب را روی loopback نگه دارید و از طریق SSH به آن دسترسی پیدا کنید. محدودترین اعتبارنامههایی را به عامل بدهید که همچنان اجازه انجام کار را به او میدهد؛ موضوعی که در دور نگه داشتن اسرار از عوامل هوش مصنوعی بهدرستی به آن پرداخته شده است. برای هر چیزی که در زمان عدم حضور شما اجرا میشود، استفاده از یک ماشین یکبارمصرف بهتر از یک ماشینِ بهدقت تنظیمشده است: اجرای عوامل کدنویسی در یک ماشین مجازی یکبارمصرف و اجرای ایمن Claude Code روی یک VPS هر دو این مسیر را دنبال میکنند.
Do you need an agent harness?
If your work is one question at a time, a chat window is enough, and a harness only adds a loop you have to supervise. A harness starts paying for itself when a task takes many steps against real files, or when it has to keep working while you are asleep.
Most of this category is young. dsh says developer preview in its own README as of August 2026, and the rest are moving fast enough that a config file you write today may need editing next month. That is a reason to keep your setup small and reproducible, and a reason to write down what you changed. The same restraint helps inside the loop, where a skill that pushes the agent toward the smallest change that works leaves you a diff you can actually read at the end of an unattended run. Start with one harness on one server, give it one job and one narrow key, and widen its access only after that first job has been boring for a week. The self-hosted agents worth running today is a reasonable place to choose the first one.
FAQ
منظور از agent harness به زبان ساده چیست؟
این برنامه، لایهای است که مدل را در بر میگیرد. مدل متن تولید میکند و درخواست استفاده از ابزارها را میدهد. harness حلقهای را اجرا میکند که پرسشها را تکرار کرده، ابزارهای درخواستی مدل را اجرا میکند، قوانین مربوط به ابزارهای مجاز بدون نیاز به تأیید را اعمال کرده و وضعیت نشست (session) و فایلها را بین هر مرحله حفظ میکند. اگر مدل را عوض کنید و harness همچنان کار کند، این واضحترین نشانه است که این دو موجودیتهای مجزایی هستند.
آیا Claude Code یک مدل است یا یک harness؟
Claude Code یک harness است. این یک برنامه ترمینالی است که شامل یک حلقه، سیستم مجوزدهی و ابزارهای داخلی فایل و shell است. Claude خانواده مدلی است که بهصورت پیشفرض توسط آن فراخوانی میشود. همین تفکیک در مورد DeepSeek Harness (dsh) نیز صدق میکند که یک برنامه Node است که آن را نصب میکنید، در حالی که مدلهای DeepSeek از طریق API سرویسدهی میشوند. شما یک harness را روی دستگاه خود نصب میکنید، اما یک مدل را از طریق شبکه فراخوانی میکنید.
تفاوت بین agent harness و agent framework چیست؟
یک framework کتابخانهای است که آن را import میکنید و بر اساس آن کد مینویسید؛ بنابراین مدیریت حلقه، تلاشهای مجدد (retries) و مدیریت context بر عهده شماست. یک harness برنامهای است که آن را اجرا میکنید، بنابراین تمام این موارد با تنظیمات پیشفرض همراه است که بهجای نوشتن، فقط آنها را پیکربندی میکنید. در عمل، مرز بین این دو مبهم است: Deep Agents در LangChain یک SDK قابل import است که مخزن آن، تا اوت 2026، آن را یک agent harness کامل (batteries-included) مینامد. از خود بپرسید که آیا قرار است حلقه را خودتان بنویسید یا خیر. پاسخ به این پرسش تعیین میکند کدام واژه برای موقعیت شما مناسبتر است.
آیا برای اجرای یک agent harness به VPS نیاز دارم؟
خیر. تمام harnessهایی که در اینجا نام برده شدهاند، روی لپتاپ اجرا میشوند. استفاده از سرور چهار مورد را تغییر میدهد: عامل (agent) هنگام بستن درب لپتاپ به کار خود ادامه میدهد، کلیدهای شما روی دستگاهی که همیشه روشن است نگهداری میشود، میتواند به سایر سرورهای شما دسترسی داشته باشد و میتوانید از هر دستگاهی به همان نشست بازگردید. هر یک از این موارد ملاحظات امنیتی خاص خود را دارند، بنابراین برای عامل یک حساب کاربری مجزا ایجاد کنید و هرگونه رابط کاربری وب (web UI) را به 127.0.0.1 محدود کنید.
آیا میتوانم از مدل متفاوتی در همان harness استفاده کنم؟
معمولاً بله، و این ویژگی تعیینکننده یک harness است. اکثر آنها نام مدل و یک base URL را در پیکربندی خود میپذیرند، بنابراین تغییر ارائهدهنده سرویس، یک ویرایش ساده است و نه بازنویسی. در مواردی که یک harness مقاومت میکند، یک router محلی مانند Claude Code Router بین harness و ارائهدهنده قرار میگیرد و درخواستها را ترجمه میکند که بهصورت پیشفرض به 127.0.0.1:3456 متصل میشود. در استفاده از این پروکسی دقت کنید، زیرا تمام promptها را میبیند و تمام کلیدها را در اختیار دارد.