DeepSeek Harness (dsh): ثبتّ وكيل البرمجة مفتوح المصدر من DeepSeek، وربطته بتطبيق المحادثة الخاص بي، واختبرت أداءه
- تاريخ النشر
- 18 أغسطس 2026
- بقلم
- جاكوب لويد — كُتب بمساعدة الذكاء الاصطناعي بعد إنجاز المشروع
- مدة القراءة
- قراءة 3 دقيقة
بعبارة مبسطة: أصدرت DeepSeek «وكيل برمجة» مجانيًا ومفتوح المصدر — برنامج يقرأ مشروعك، ويعدّل الملفات، وينفّذ الأوامر نيابةً عنك، مثل Claude Code. تعرض هذه المقالة كيف ثبّته على جهاز Linux الخاص بي، وجعلته يبدأ تلقائيًا، وربطته بتطبيق المحادثة المنزلي، واختبرته على مهام برمجية صغيرة حقيقية باستخدام نماذج DeepSeek السحابية ونموذج يعمل على أجهزتي الخاصة. لقد عمل بنجاح، وكان رخيصًا، وهناك بعض الحواف الحادة.
في 13 أغسطس 2026 أصدرت DeepSeek منصة DeepSeek Harness — dsh — وهي وكيل برمجة مرخّص بموجب MIT مبني على فكرة أن كل شيء عبارة عن إضافة: مُهايئ النموذج، الأدوات، بيئة العزل، وحتى حلقة الوكيل. وصل إلى 95,000 نجمة على GitHub خلال يومين. ثبّتته على جهازي المنزلي في الأسبوع نفسه، وأعطيته مكانًا بجوار Reasonix، وكيل البرمجة الحالي لدي، داخل DisPatch، ووجّهته إلى نماذج DeepSeek السحابية ونموذج يعمل على جهاز GPU الخاص بي، وشغّلته على مجموعة مهام صغيرة. هذا ما تطلبه الأمر، وما كلفه، وأين واجهتني فيه بعض المشكلات.
الخلاصة
- ما هو: وكيل من فئة Claude Code (يقرأ الملفات ويعدّلها، يشغّل الأوامر الطرفية، يحتفظ بخطة، وينشئ وكلاء فرعيين) يُوزَّع كـ حزمة npm. له وضعان: واجهة ويب على
127.0.0.1:3080ووضع بلا واجهة لمرة واحدة يطبع إجابة واحدة وينتهي — صُمّم للسكربتات والوكلاء الآخرين. - ما التكلفة: البرنامج مجاني. تكلفة مجموعة المهام الخمس كاملة لدي حوالي 3 سنتات على V4-Flash وحوالي 7 سنتات على V4-Pro بأسعار الذروة؛ وصفر على النموذج المحلي.
- ما الذي تحتاجه: Node.js 22.19+/24، ومفتاح DeepSeek API أو أي خادم متوافق مع OpenAI (استخدمت الاثنين).
- ماذا تحصل عليه في النهاية:
dsh --profile headless "fix the failing test"من أي مجلد مشروع، وواجهة متصفح كخدمة خلفية، وتبديل النموذج بتعديل ملف YAML واحد، و— في حالتي — بوت «DeepSeek Harness» في تطبيق الدردشة الخاص بي مع زر تشغيل. - النتيجة: 15/15 نجاحًا عبر V4-Flash وV4-Pro وGemma-4-26B المحلي، بمدة 2–18 ثانية لكل مهمة. معاينة المطوّرين — يحذّر README بأحرف كبيرة من أن الأمور ستتغير بين الإصدارات، وقد واجهت بعض الحواف الحادة المذكورة أدناه.
الطريق من الأساسي إلى المتقدم
الخطوات ١–٣ تمنحك وكيلًا يعمل خلال عشر دقائق. أما الخطوتان ٤–٥ فهما ما أضفته فوق ذلك لتتمكن برمجيات أخرى — ووكلاء آخرون — من استدعائه.
ما الذي ستحصل عليه في النهاية
الشيء الذي أستخدمه فعلًا هو الوضع headless. من داخل مجلد مشروع:
$ cd ~/Projects/dsh-playground
$ dsh --profile headless "Create fizz.py that prints FizzBuzz for 1..15 and run it; reply with the program output only."
1
2
Fizz
4
Buzz
…
FizzBuzz
$ echo $?
0
ست ثوانٍ: يُنشأ الملف، ويُشغَّل البرنامج، وتُطبع الإجابة، ورمز الخروج 0. لا يكتب أي شيء خارج المجلد الذي شغّلته فيه (وضع الأذونات الافتراضي workspace-write)، ولا يطبع على stdout سوى الرسالة النهائية، ويحفظ كل تشغيل بحيث يمكنك فتحه لاحقًا في واجهة الويب وقراءة ما فعله بالضبط — كل استدعاء أداة، وكل عدد توكن.
واجهة المتصفح هي التخطيط المألوف لعام 2026 — الجلسات على اليسار، والمحادثة في المنتصف، وصفحة إعدادات للنماذج — مع عادة جيدة واحدة: مفتاح API يُلصق في صفحة الإعدادات، وليس في ملف إعدادات أبدًا. نسختي تعمل كخدمة مستخدم systemd وهي مدمجة في تطبيق المحادثة لديّ بجوار Reasonix:
الخطوة 1: التثبيت (دقيقتان)
حزمة npm واحدة. أُبقي بادئة Node خاصة لأدوات الوكلاء حتى لا يصل شيء إلى شجرة النظام — على توزيعة غير قابلة للتغيير مثل Bluefin، هذا هو المكان الوحيد المعقول لها على أي حال — لكن التثبيت العام البسيط هو نفس الأمر:
npm install -g @deepseek-ai/dsh
dsh --version # 0.1.0-rc.7 at the time of writing
dsh web # starts the UI, prints http://127.0.0.1:3080
افتح الرابط، وانتقل إلى الإعدادات ← النماذج، والصق مفتاح DeepSeek الخاص بك، ثم احفظ. يؤدي ذلك إلى كتابة ملف ~/.dsh/.credentials.yaml (بصلاحية 0600) ويعمل مسار النموذج فورًا دون إعادة تشغيل. لتشغيل ذلك برمجيًا، الملف هو مجرد تعيين YAML عادي — DEEPSEEK_API_KEY: sk-… — وقد كتبت ملفي من ملف البيئة الذي تقرؤه خدماتي الأخرى بالفعل، فبذلك يبقى السر في مكان إضافي واحد لكنه لا يظهر أبدًا في سجل الأوامر أو في ملف وحدة.
أمران جديران بالمعرفة قبل المضي قدمًا:
- القياس عن بُعد معطَّل افتراضيًا (
DSH_TELEMETRY_MODEغير مضبوط = معطَّل). راجعت الإعدادات المُرفقة، لا النصوص التسويقية؛ مُصدِّر OTLP موجود لكنه غير مفعّل. - الصندوق الرملي حقيقي لكنه محدود.
workspace-writeيقيّد عمليات الكتابة في الدليل الذي شغّلت الأداة منه. القراءات غير مقيّدة — فالتوثيق يذكر ذلك بوضوح — لذا لا تشغّلها من دليل منزلك لمهمة حقيقية، ولا توجّهها إلى مجلدات تحتوي أسرارًا.
الخطوة 2: تشغيله كخدمة
واجهة الويب هي عملية Node طويلة الأمد؛ أردت تشغيلها عند تسجيل الدخول، دون طرفية، وعلى الحلقة المحلية فقط. وحدة systemd --user تفعل ذلك:
# ~/.config/systemd/user/dsh-web.service
[Unit]
Description=DeepSeek Harness web UI (dsh web) on 127.0.0.1:3080
After=network.target
[Service]
WorkingDirectory=%h
Environment=DSH_HOME=%h/.dsh
Environment=DSH_PERMISSION_MODE=workspace-write
ExecStart=/usr/local/bin/dsh web --host 127.0.0.1 --port 3080 # `which dsh`
Restart=on-failure
RestartSec=3
[Install]
WantedBy=default.target
systemctl --user daemon-reload
systemctl --user enable --now dsh-web.service
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:3080/ # 200
WorkingDirectory هو جذر مساحة العمل الافتراضي لواجهة الويب، لكن الواجهة ما تزال تفرض عليك اختيار مساحة عمل صراحةً قبل أن تتيح لك الكتابة. إعداد افتراضي جيد. كما ترفض واجهة سطر الأوامر --host 0.0.0.0 — إذ يصف المطوّرون ربط جميع الواجهات بأنه «غير مدعوم عمدًا بعد»، وبما أن الواجهة بلا أي مصادقة إطلاقًا، أوافقهم الرأي. تريد الوصول إليها من جهاز آخر؟ ضع وكيلًا عكسيًا بمصادقة أمامها، أو تواصل مع متصفح الجهاز المضيف نفسه عبر مسار سطح المكتب البعيد (وهذا ما أفعله).
الخطوة 3: النماذج — ملف YAML واحد، يُعاد تحميله تلقائيًا
يحتفظ ~/.dsh/settings.yaml بالنموذج الافتراضي وبأي موفّرين إضافيين، ويعيد dsh قراءته للطلب التالي — دون إعادة تشغيل أو إعادة تسجيل دخول. وهذا ملفّي:
agent-default-model:
provider: deepseek-official
model: deepseek-v4-flash # or deepseek-v4-pro
llm-deepseek:
reasoningEffort: high # off | low | high | max
# A local OpenAI-compatible server (mine is llama.cpp-based on a GPU rig).
llm-pi-ai:
providers:
buildpc:
displayName: StudioForge (GPU rig)
apiKeyEnv: STUDIOFORGE_PLACEHOLDER_KEY # a reference, not a value
api: openai-completions
baseURL: http://my-gpu-rig:1234/v1 # your server; mine sits on the tailnet
defaultContextWindow: 65536
models:
- id: unsloth/gemma-4-26B-A4B-it-qat-GGUF/gemma-4-26B-A4B-it-qat-UD-Q4_K_XL
name: Gemma 4 26B-A4B (rig)
تفصيلان كلفاني عشر دقائق لكلٍّ منهما: apiKeyEnv هو مرجع يُحَلّ من .credentials.yaml أو من البيئة، وليس قيمةً حرفية أبدًا — كما أن الخادم المحلي بدون مفتاح لا يزال يحتاج إلى بعض بيانات الاعتماد المُشار إليها، لأن العميل المتوافق مع OpenAI يصرّ على وجود رمز حامل (bearer token). تُرضيه قيمةٌ مؤقتة في .credentials.yaml. أما معرّف الموفّر (buildpc) فيصبح دائمًا بمجرد أن تشير إليه الجلسات؛ ولإعادة تسميته أضِف معرّفًا جديدًا.
ولأن هذا الملف هو الواجهة كلها، فإن «تحويل dsh إلى النموذج المحلي» هو تعديل من سطرين يمكن لأي سكربت — أو أي وكيل آخر — إجراؤه. يعيد وكيلي الرئيسي توجيه بيئة التشغيل إلى نموذج محلي مجاني للمهام الروتينية ثم يعيدها إلى V4-Pro للمشكلات الصعبة دون لمس أي شيء آخر.
الخطوة 4: بجانب Reasonix في DisPatch
كان لديّ بالفعل Reasonix يعيش داخل DisPatch كبوت شبه آلي: عند النقر عليه تتحول لوحة الدردشة إلى طرفية تشغّل واجهة TUI الخاصة به عبر PTY. أردت dsh إلى جانبه. المشكلة: الحزمة الرسمية لا تتضمن واجهة TUI. توجد إضافات «TUI بأسلوب Claude Code» من جهات خارجية على npm، لكن عمرها كان أربعة أيام مع تبعيات workspace:* معطّلة، وحزمة غير مراجعة مع وصول إلى الصدفة shell لا توضع على خادم عائلي. لذلك بُنيَت لوحة dsh مما توفره الحزمة الرسمية فعلاً:
- واجهة الويب المدمجة داخل iframe (لا تُرسل ترويسات تمنع التضمين في الإطارات)، وتظهر فقط عندما يتمكن المتصفح من الوصول إلى حلقة المضيف المحلية loopback — بينما يحصل هاتف على شبكة tailnet على شرح نصي بسيط بدلاً من ذلك؛
- أزرار بدء / إعادة تشغيل / إيقاف لوحدة systemd، إضافة إلى مؤشر الصحة؛
- قائمة منسدلة Model تعيد كتابة
agent-default-modelفي ملف YAML هذا؛ - تبويب Headless jobs: اكتب مهمة، اختر مجلدًا داخل home، ثم اضغط Run. يقوم الخادم بتشغيل
dsh --profile headless "…"كقائمة وسائط ثابتة (بدون shell — المهمة عنصر argv واحد، لذا فإن مهمة تحتوي على; rm -rf /هي مجرد نص)، وظيفة واحدة في كل مرة، ويحتفظ بسجل قصير مع كل إجابة نهائية.
dsh --profile headless؛ الإجابة هي آخر ما طبعه dsh. ثلاثة تشغيلات حقيقية: 5 ثوانٍ، 5 ثوانٍ، 19 ثانية.كل شيء في تلك اللوحة خلف قفل إدارة التطبيق — فالمهمة headless هي تنفيذ كود تعسفي، والأجهزة العائلية المقفلة لا تدرك أبدًا وجود اللوحة. إذا وصلت dsh بأي شيء خاص بك، فحاكِ ذلك: تعامل مع «تشغيل مهمة» تمامًا كما تتعامل مع shell.
dsh مقابل Reasonix، جنبًا إلى جنب
كلاهما وكيلان على هيئة Claude Code ويُحتسب سعرهما لكل رمز token على DeepSeek. لكنهما يختلفان في الجهة التي صنعتهما وسطح الاستخدام الذي يقدمانه:
| DeepSeek Harness (dsh) | Reasonix | |
|---|---|---|
| الجهة | DeepSeek، رسمية، MIT | جهة خارجية، بأسلوب Claude Code |
| سطح الاستخدام | واجهة ويب + مهمة واحدة headless؛ بدون TUI | واجهة TUI طرفية (جلسة تفاعلية عبر PTY) |
| الاستدعاء من سكربت | dsh --profile headless "…" — إجابة واحدة، رمز خروج | مصمَّم لإنسان في الحلقة؛ الاستدعاء البرمجي متعثر |
| تبديل النموذج | عدّل settings.yaml، يُعاد تحميله تلقائيًا؛ لا يوجد خيار --model | config.toml طبقات (flash/pro) + توجيه لكل مهارة |
| النماذج المحلية | أي خادم متوافق مع OpenAI عبر كتلة مزوّد | الثلاثية نفسها: base URL ومتغير مفتاح env ومعرّفات النماذج |
| قابلية التوسعة | كل شيء عبارة عن إضافة (نموذج، أدوات، بيئة معزولة، حلقة) | وكلاء فرعيون، مهارات، ذاكرة لكل مشروع |
| داخل DisPatch خاصتي | iframe + عناصر تحكم الوحدة + تبويب المهام headless | طرفية xterm.js عبر PTY |
| النضج | معاينة مطورين (rc.7)، تكسر بين الإصدارات | v1.18، محدّث ذاتي، إعداد مستقر |
عمليًا: Reasonix هو ما أفتحه عندما أستعد للجلوس مع الوكيل؛ أما dsh فهو ما تستدعيه برمجياتي الأخرى. هذا الانقسام هو سبب بقاء كلاهما.
المعيار: 5 مهام، 3 نماذج، 15/15
لا شيء علمي — خمس مهام صغيرة كنت سأوكلها بالفعل إلى وكيل برمجة، كل واحدة في مجلد فارغ منفصل، مع فحص تلقائي لكل منها (هل الملف موجود ويعمل؟ هل تنجح الاختبارات دون تعديل ملف الاختبار؟ هل أعادت التسمية ترك صفر مراجع قديمة؟). الوقت الفعلي هو العملية بأكملها بما فيها مطالبة النظام التي تبلغ نحو 7,500 رمز؛ والرموز مأخوذة من سجل الجلسة الخاص بـ dsh.
| المهمة | V4-Flash | V4-Pro | Gemma-4-26B (محلي، على الجهاز) |
|---|---|---|---|
| الرد بـ «PONG» (إقلاع + استدعاء واحد) | ✅ 2.1 ث | ✅ 2.8 ث | ✅ 13.2 ث* |
| كتابة وتشغيل FizzBuzz | ✅ 5.3 ث · أداتان | ✅ 8.4 ث · أداتان | ✅ 4.9 ث · أداتان |
| إصلاح خطأين بحيث تمر اختبارات الوحدة (دون تعديل الاختبارات) | ✅ 11.7 ث · 8 أدوات | ✅ 15.8 ث · 7 أدوات | ✅ 10.4 ث · 8 أدوات |
| تلخيص قاعدة أكواد من 6 وحدات (أقل من 150 كلمة) | ✅ 8.9 ث · 9 أدوات | ✅ 10.9 ث · 7 أدوات | ✅ 12.1 ث · 7 أدوات |
| إعادة تسمية دالة عبر 3 ملفات + اختبارات، وإثبات نجاحها | ✅ 15.1 ث · 14 أداة | ✅ 18.2 ث · 12 أداة | ✅ 12.2 ث · 11 أداة |
| إجمالي الوقت الفعلي | 43 ث | 56 ث | 53 ث |
| الرموز (إدخال غير مخزّن / قراءة من المخزن / مخرجات) | 42.6k / 136k / 4.5k | 41.4k / 107k / 3.2k | 40.5k / 237k / 5.6k |
| التكلفة بأسعار الذروة (خارج الذروة نصف السعر) | ≈ $0.027 | ≈ $0.072 | $0 (كهرباء) |
*أول استدعاء بعد تحميل النموذج على البارد على الجهاز؛ المهام التالية تُظهر السرعة بعد التسخين. الأسعار من صفحة تسعير DeepSeek بتاريخ 2026-08-18: Flash $0.014 / $0.44 / $1.32 لكل مليون (قراءة من المخزن / إدخال غير مخزّن / مخرجات)، Pro $0.044 / $1.32 / $3.96.
ما يقوله الجدول:
- التخزين المؤقت للمطالبات هو ما يُبقي الفاتورة منخفضة. كل مهمة تدفع نحو 7,500 رمز من مطالبة النظام، لكن بعد الخطوة الأولى تصبح القراءات كلها تقريبًا من المخزن المؤقت بسعر يعادل 3% من سعر الإدخال غير المخزّن. المهام متعددة الخطوات رخيصة لأن الأداة تُبقي البادئة ثابتة.
- استخدم Pro خطوات وأدوات أقل للحصول على نفس النتيجة (12 مقابل 14 استدعاء أداة في إعادة التسمية؛ 3 مقابل 4 خطوات في التلخيص). في هذه المجموعة كان Flash أسرع وبثلث السعر، لذلك يبقى خياري الافتراضي.
- النموذج المحلي أثبت جدارته. اجتاز Gemma-4-26B (نموذج MoE نشط بحجم 4B، بضغط Q4، يُقدَّم عبر llama.cpp على بطاقتي RTX 5090s) جميع الاختبارات، بخطوات ورموز أكثر لكن بزمن إجمالي منافس. إنها المرة الأولى التي يصبح فيها النموذج المحلي خيارًا حقيقيًا للمهام اليومية هنا بدلًا من كونه مجرد حداثة — رغم أن خمس مهام صغيرة لا تخبرنا شيئًا عن إعادة هيكلة 40 ملفًا.
ثم اختبار «الأشياء العادية»: وجّهته إلى مستودع هذا الموقع وطلبت منه قراءة دليل التشغيل الخاص بالمشروع، وتشغيل فحص البناء والروابط، وتقديم تقرير — دون نشر أو تعديل. قرأ دليل التشغيل، ونفّذ الأمر الصحيح، وأبلغ بأسطر الفحص بالضبط (290 صفحة، 1,752 صورة، لا روابط معطلة)، وزمن البناء، و— دون أن يُطلب منه — لاحظ أن دليل التشغيل ما زال يقول «288 صفحة» وأشار إلى الانحراف. ثلاث وخمسون ثانية. تلك هي المهمة منخفضة المخاطر التي أسندها طوال اليوم.
الاختبار الممتع: اصنع لي لعبة
المعايير القياسية شيء، وأردت أيضًا أن أرى ما سيفعله مع طلب إبداعي مفتوح. فقلت له: «اصنع نسخة بكسلات تفاعلية لشعار هذا الموقع — جافاسكربت خام، قابلة للتضمين في أي مكان، مرور المؤشر يفعل شيئًا فيزيائيًا، والنقرة تفعل شيئًا رائعًا، بلا أي تبعيات، واختبرها بنفسك». وإليك ما بناه — وهو يعمل الآن، فتفضّل:
prefers-reduced-motion.
كيف سارت الأمور، بصراحة:
- المحاولة الأولى (V4-Flash): حلقة من 10 دقائق بلا ملفات. كان الطلب يسمح بتمثيل نقطي مرسوم يدويًا أو تمثيل إجرائي. اختار أن يرسم تمثيلًا نقطيًا 40×40 يدويًا داخل تفكيره، فسقط في حلقة انحلالية — سجل الجلسة مئات الأسطر من
################/....— حتى قتله مؤقّت المهلة. ضاع نحو سنتَين. الدرس: لا تدع النموذج يرسم البكسلات يدويًا في رأسه أبدًا. - المحاولة الثانية (V4-Flash، مع تعديل الطلب إلى «نقطنة من الهندسة بلا تمثيلات نقطية»): 25 دقيقة، وأُنجز كل شيء. 100 خطوة للنموذج، و201 استدعاء أداة، و172 ألف رمز مخرَج (منها 123 ألفًا للاستدلال)، و16.3 مليون رمز لقراءة الكاش — ≈ 49 سنتًا بأسعار الذروة. كتب ملف
ll-pixel-logo.jsمن 399 سطرًا بواجهة عامة واحدة ومقابضdata-، وصفحة عرض، وملف README، واختبار وحدة Node للمنقِّط، وبمبادرة منه — سكربت Playwright يلتقط لقطات شاشة للعرض بثلاثة أحجام. وصل إلى سقف 25 دقيقة أثناء صقل ملف README، لذلك كانت شفرة الخروج انتهاءَ مهلة، لكن العمل أُنجز. شفرات الخروج تكذب في الاتجاهين. - الشكل الفني: الحلقة وحرفا L المائلان يوحيان بالعلامة من أول نظرة؛ إنهما أكثر امتلاءً وأقرب إلى حرف Z من الشعار الحقيقي، وكنت سأقضي عشر دقائق في ضبط ثوابت القص قبل استخدامه بجدية. لم أفعل — ما تراه غير معدّل.
- تضمينه هنا استغرق سطرًا واحدًا لأن سياسة أمان المحتوى (CSP) للموقع هي
script-src 'self'والأداة لا ترسل أي طلبات شبكة. كان ذلك في الطلب؛ وقد التزمت به.
المزالق
- إصدار مطوّر، وهو مذكور بوضوح بأحرف كبيرة.
0.1.0-rc.7عند التثبيت؛ كان rc.6 قبل ثلاثة أيام. قد تتغير الملفات الشخصية ومفاتيح الإعدادات وهيكل الإضافة. ثبّت الإصدار في أي شيء تؤتمته وأعد تشغيل اختبار سريع بعد كل ترقية. - الوضع بدون واجهة صامت حتى يكتمل. لا شيء يُدفق إلى stdout — المهمة الطويلة تبدو وكأنها معلّقة. اقرأ سجل الجلسة (
~/.dsh/sessions/…/session.jsonl.zstd، zstd-JSONL مضغوط) أو راقبها في واجهة الويب. ورمز الخروج 0 يعني "اكتمل الدور"، وليس "نجحت المهمة". تحقّق من العمل. - لا يوجد علم
--modelفي الوضع بدون واجهة. النموذج الافتراضي يأتي منsettings.yaml؛ غيّره هناك (إعادة تحميل ساخن) أو في الواجهة. - الخوادم المحلية التي لا تتطلب مفتاحًا تحتاج إلى بيانات اعتماد مؤقتة يُشار إليها عبر
apiKeyEnv، ومعرّفات المزوّد دائمة. ذُكر أعلاه؛ ستعضّك هذه النقطة. - أصول واجهة الويب بمسارات مطلقة (
/assets/…،/api)، لذا لا يمكنك تركيبها تحت مسار فرعي خلف وكيل عكسي خاص بك دون إعادة كتابة؛ إما تضمينها أو منحها اسم مضيف خاصًا بها. - لغة الواجهة تتبع متصفحك — ملف index.html المُرسل يقول
lang="zh-CN"، وأول ما تراه هو مربع حوار "إشعار اختبار داخلي". انقر متابعة؛ كل ما بعده كان بالإنجليزية بالنسبة لي. - التثبيت يشغّل سكربتات ما بعد التثبيت (node-pty وkoffi وprotobufjs). يحذّر npm من ذلك. لا شيء خبيث مما رأيت، لكنه كود أصلي يُترجم في بادئتك — سبب آخر لإبقائه في بادئة خاصة، وليس بادئة النظام.
- Node 22.19+ أو 24 فقط. الإصدارات القديمة ذات الدعم طويل الأمد ترفض تشغيله.
إلى أين وصلتُ
استحقّ مكانه في ظهيرة واحدة. الوضع headless هو الشكل المناسب لوكيل برمجة تستدعيه برامج أخرى — أمر واحد، إجابة واحدة، رمز خروج واحد، وسجل قابل للتدقيق — وتحديد النموذج عبر YAML يعني أن منظومة وكلائي يمكنها توجيهه إلى أي عقل يناسب المهمة. إذا كنت تدير بالفعل خادم نماذج محليًا، فجرّب المهام الخمس نفسها؛ عشرة سنتات من رصيد API ومجلد مؤقت هو كل ما تتطلبه التجربة.
ذات صلة: Reasonix (وكيل البرمجة الآخر في هذه المقالة)، DeepSeek Everywhere (توصيل DeepSeek بـ Claude Code وبمنظومة وكلائي)، DisPatch (تطبيق الدردشة الذي توجد فيه اللوحة)، وbench-llm (قياس أداء النماذج المحلية بجدية أكبر مما فعلت هنا).