OpenClaw Model Manager: واجهة رسومية كي أتوقف عن تحرير JSON توجيه النماذج يدويًا

تاريخ النشر
11 يوليو 2026
بقلم
جاكوب لويد — كُتب بمساعدة الذكاء الاصطناعي بعد إنجاز المشروع
مدة القراءة
قراءة 1 دقيقة

بعبارة مبسطة: تطبيق سطح مكتب مجاني يمنح منظومة الذكاء الاصطناعي في منزلي لوحة تحكم حقيقية، بدلًا من التحرير اليدوي المحفوف بالمخاطر لملف الإعدادات. يعرض التطبيق أي "عقل" ذكاء اصطناعي يستخدمه كل مساعد، ويتيح لي التبديل بينها بنقرة واحدة، ويرفض حفظ أي شيء قد يُعطّل النظام. وُجد هذا التطبيق لأن خطأ إملائيًا واحدًا أسكت مساعدًا بصمت في يوم من الأيام.

أخطأت مرة في كتابة معرّف نموذج داخل ملف JSON، فصمت الوكيل الذي يستخدمه ببساطة. لا خطأ ظاهر، ولا انهيار. ظل يتحدث إلى نموذج غير موجود بينما كنت أطارد خللًا أكثر تشويقًا في مكان آخر. هذا التطبيق هو ضماني كي لا يتكرر ذلك أبدًا.

خلاصة سريعة

  • ما هو: تطبيق سطح مكتب بواجهة GTK4/libadwaita يحرّر openclaw.json، الإعداد الذي يحدد أي نموذج LLM يتحدث معه كل وكيل، ووكيل فرعي، ومهمة cron في منظومة OpenClaw الخاصة بي.
  • التكلفة: مجاني، برخصة MIT، والكود المصدري داخل ملف zip أدناه.
  • ما تحتاجه: لينكس مزوّد بـ GTK4 + libadwaita + PyGObject (سطر تثبيت واحد عبر مدير الحزم)، وبايثون 3.11 أو أحدث، وتثبيت OpenClaw — أو إعداد المثال المرفق للبدء من الصفر.
  • ما تحصل عليه: لوحة تحكم في شاشة واحدة تعرض نموذج كل وكيل، وعمليات حفظ لا يمكنها إفساد الملف أو تعيين نموذج غير موجود، ومفتاح تبديل بنقرة يوجّه واجهة Claude Code إلى نموذج محلي مجاني، أو DeepSeek الرخيص، أو فوترة Anthropic الحقيقية.

ما تحصل عليه

لقطات الشاشة أولًا. هذه اللقطات مأخوذة من نسخة معزولة (sandbox) تعمل على إعداد وهمي داخل مجلد HOME مؤقت. التطبيق حقيقي، والبيانات مزيّفة، ولا أثر لأي من مفاتيحي.

النافذة الرئيسية لتطبيق OpenClaw Model Manager تعرض جردًا لاستخدام النماذج، ولوحة حالة الاتصال والتوجيه، وملفات تعريف افتراضية API/محلية مرمّزة بالألوان
النافذة الرئيسية: نموذج كل وكيل في شاشة واحدة، إلى جانب حالة اتصال حية لكل مزوّد.

تجيب النافذة الرئيسية عن السؤال الذي كنت أجيب عنه سابقًا بالبحث داخل JSON: أي نموذج يعمل أين، وكم تكلفته؟ كل وكيل، والإعدادات الافتراضية على مستوى المنظومة، وتجاوز الوكلاء الفرعيين، ومهام cron، بل وحتى نماذج وكيل بريد إلكتروني شقيق. تحصل كل خانة على شارة ملوّنة: محلي (Local، هذا الجهاز)، أو بعيد (Remote، الجهاز الثاني)، أو سحابي (Cloud، الذي يظهر في فاتورة).

لوحة التطبيق الجماعي \
طبّق نموذجًا على كل الوكلاء دفعة واحدة، أو اختر خلفية Coding Helper. يحذّرك التطبيق حين لا يعمل الوضع الذي اخترته فعليًا.
عرض كتالوج النماذج يسرد تكلفة كل نموذج وطول السياق ودعم التفكير المنطقي، مع زرّي إضافة نموذج LM Studio وإضافة نموذج Anthropic
الكتالوج: التكلفة وطول السياق ودعم التفكير المنطقي لكل نموذج، إلى جانب زر اكتشاف يسأل LM Studio عمّا يُحمّله فعليًا.

لماذا وُجد هذا التطبيق

OpenClaw هي منظومة الوكلاء المتعددين التي أشغّلها في المنزل: عدة وكلاء ذكاء اصطناعي، كل منهم يشير إلى نموذج، بعضها محلي ومجاني، وبعضها سحابي ومدفوع. كل التوجيه يعيش في ملف واحد، ~/.openclaw/openclaw.json: كتالوج النماذج، وتعيينات النموذج الأساسي/الاحتياطي لكل وكيل، وإعدادات المزوّدين، ورمز مصادقة البوابة نفسه. وكان تحريره يدويًا يفشل بطريقتين متكررتين.

الأولى: معرّف نموذج خاطئ يفشل بصمت. مرة أشار إعداد افتراضي قديم أحد الوكلاء إلى vllm/google/gemma-4-31b-qat، وهو نموذج لم يقدّمه المزوّد قط. أما الحفظ الفاسد فهو أسوأ: تعديل خاطئ واحد يكفي لدخول البوابة كلها في حلقة تعطل متكررة.

الثانية: تبديل خلفية Claude Code CLI هو جراحة خفية في متغيرات البيئة. يُشغّل OpenClaw عملية Claude Code لمهام البرمجة، ووجهة تلك الطلبات — ومن يتحمّل الفاتورة — يحدّدهما متغيرات بيئة ANTHROPIC_* على وحدة systemd الخاصة بالبوابة. والتنقل بين المحلي المجاني، وDeepSeek الرخيص، وAnthropic الحقيقي كان يعني كتابة drop-in لـ systemd يدويًا في كل مرة. بالضبط نوع الأشياء التي أخطئ فيها الساعة الحادية عشرة مساءً.

مسار الحفظ

الجزء الذي أحتاج إلى الوثوق به هو ما يحدث عند النقر على Save. وهذا هو، بالترتيب:

هناك خطوتان تحملان الثقل الأكبر. التحقق يرفض أي معرّف نموذج لا يعلنه مزوّده، وهو ما يجعل خطأ التسمية الذي ذكرته في المقدمة مستحيلًا هيكليًا بدلًا من أن يكون شيئًا يجب أن أتذكّر فحصه. أما الكتابة الذرّية فموجودة لأن openclaw.json يحمل رمز مصادقة البوابة ويجب أن يبقى بصلاحية chmod 600: يحصل الملف المؤقت على صلاحيات الملف الأصلي قبل كتابة أي محتوى، ثم يخضع لـ fsync ويُعاد تسميته فوق الأصلي. وإذا حدث انهيار في منتصف الحفظ، يبقى الملف القديم سليمًا دون مساس.

حفظ فاشل لا يبعد عن التراجع سوى عملية إعادة تسمية واحدة، وتحتفظ بخمسة أجيال من التاريخ بدلًا من جيل واحد.

drop-in الخاص بـ Coding Helper

إعادة توجيه Claude Code CLI مسار منفصل تمامًا لأنه لا يلمس openclaw.json إطلاقًا. بل يكتب drop-in لـ systemd يتجاوز بيئة البوابة قبل أن تُشغّل البوابة عملية Claude Code.

أربعة أوضاع، وقائمة منسدلة واحدة: LM Studio (مجاني، محلي)، وDeepSeek عبر نقطة النهاية المتوافقة مع Anthropic (رخيص)، وAnthropic Cloud (الوضع الافتراضي: لا يوجد drop-in إطلاقًا، ولا شيء يُتجاوز)، أو Disabled الذي يوجّه الواجهة إلى http://127.0.0.1:9/blocked بحيث يفشل كل استدعاء بسرعة بدلًا من التعليق. وهناك أيضًا اختبار حي بنقرة واحدة يرسل طلب ping بصيغة Anthropic حقيقية إلى LM Studio أو DeepSeek ويبلّغ بأي نموذج أجاب فعليًا. أنت لا تثق بشاشة إعداد، بل تثق بطلب حدث للتو.

إبقاء مفتاح API خارج ملف الوحدة

وضع DeepSeek يحتاج إلى مفتاح API، وملف وحدة systemd مكان سيئ جدًا لوضعه فيه: أي شيء يُكتب هناك مباشرة يبقى نصًا صريحًا على القرص وفي مخرجات systemctl show. لذلك لا يحتوي الـ drop-in على المفتاح إطلاقًا، بل يكتب هذا بدلًا منه:

ExecStart=/usr/bin/bash -c 'export ANTHROPIC_API_KEY="$$DEEPSEEK_API_KEY"; exec <gateway cmd>'

الحيلة هي $$. في ملف الوحدة، يهرب $$ علامة $ الحرفية. بدونه، يوسّع systemd المتغير بنفسه أثناء بناء سطر الأوامر، وينتهي المطاف بالمفتاح الحقيقي داخل argv الخاص بالعملية حيث يستطيع ps قراءته. مع الدولار المضاعف، يستقبل bash النص الحرفي $DEEPSEEK_API_KEY ويوسّعه في وقت التشغيل من EnvironmentFile الخاص بالبوابة (~/.openclaw/gateway.systemd.env، بصلاحية chmod 600). لا يظهر السر أبدًا في ملف الوحدة، ولا في systemctl show، ولا في قائمة العمليات — بل يبقى فقط داخل بيئة bash الخاصة، لتلك العملية الواحدة. مجلد examples/ داخل zip يوثّق هذا النمط باستخدام عناصر نائبة CHANGE_ME.

الإعداد

من ملف README المرفق داخل zip:

# 1. Install GTK4 + libadwaita + PyGObject from your distro's packages
#    (one dnf/apt line — see README-SETUP.md for the exact package names)

# 2. Install the app and its launcher
install -Dm755 openclaw-model-manager ~/.local/bin/openclaw-model-manager
# .desktop file goes to ~/.local/share/applications/

# 3. If you don't already have an OpenClaw config:
cp examples/openclaw.json.example ~/.openclaw/openclaw.json
chmod 600 ~/.openclaw/openclaw.json
# then replace every CHANGE_ME placeholder inside it

# 4. Optional — API keys, both chmod 600, examples provided:
#    ~/.openclaw/.env
#    ~/.openclaw/gateway.systemd.env

لا حاجة إلى أي تثبيت عبر pip باستثناء PyGObject؛ وكل ما تبقى هو مكتبة بايثون 3.11+ القياسية، بما في ذلك tomllib. التطبيق بأكمله سكربت تنفيذي واحد (164 كيلوبايت، 3,570 سطرًا)، ومُشغّل .desktop، وملف README، ورخصة MIT، وأربعة إعدادات مثال. يصل حجمه مضغوطًا إلى 49 كيلوبايت.

نقاط يجب الانتباه إليها

  • وضع Cloud يعني "لا يوجد drop-in"، وليس "بالتأكيد حسابي في Anthropic". لا شيء يُتجاوز، لذا يستمر تشغيل ما كان مُعدًّا مسبقًا على الوحدة. يحذّر التطبيق حين لا يملك الوضع الذي اخترته مفتاحًا صالحًا، لكن تحقق بنفسك على أي حال.
  • الـ drop-in يحجب مفتاح Anthropic الحقيقي عن قصد. يضبط الوضع المحلي ANTHROPIC_API_KEY=lm-studio لكل ما تشغّله البوابة. على جهازي، أعاد ذلك توجيه اختصارات claude CLI التفاعلية إلى LM Studio بصمت — بقي Claude Code "يعمل" ظاهريًا، لكن الإجابات كانت تأتي من نموذج محلي. إذا بدأ Claude يبدو غريبًا، شغّل systemctl --user cat openclaw-gateway.service وابحث عن drop-in قبل أن تلوم النموذج.
  • بعد أن يغيّر openclaw update قيمة ExecStart الخاصة بالبوابة، أعِد اختيار وضع DeepSeek مرة واحدة كي يُعاد تغليف الأمر الجديد. يقرأ التطبيق ExecStart الأصلي من مقطع الوحدة ويكتشف غلافه الخاص (يعتمد على وجود index.js مع غياب $$DEEPSEEK_API_KEY)، لذا لا يغلّف مرتين أبدًا — لكنه لن يصلح تلقائيًا أمرًا لم يُطلب منه إعادة النظر فيه.
  • reasoning: true هو الخيار الافتراضي الآمن للنماذج المحلية. النموذج الذي يُصدر reasoning_content بينما هو مُعدّ على reasoning: false يظهر للبوابة وكأنه متوقف: نحو 390 ثانية من الصمت، ثم إنهاء قسري. تركه مفعّلًا غير ضار مع النماذج غير المفكِّرة، لذا يجعله مربّع حوار إضافة النموذج مفعّلًا افتراضيًا. هذه واحدة كلّفتني وقت تصحيح حقيقيًا.
  • أي plugins.allow غير فارغة هي قائمة سماح صارمة. إعداد enabled: true على مُدخل إضافة لا يفعل شيئًا ما لم يكن معرّفها موجودًا أيضًا في allow. يقرأ التطبيق هذا بشكل صحيح ويتعمّد ألا يكتب إلى plugins.* إطلاقًا، لذا إن أساءت إضافة ما التصرف، فهذه ليست الأداة التي ستخبرك بالسبب.
  • البوابة تُعيد كتابة openclaw.json من تلقاء نفسها (خطوة مطابقة الهوية، أو openclaw update). يتتبع التطبيق وقت تعديل الملف (mtime) ويحذّر قبل تجاوز تعديل خارجي، والنسخة الاحتياطية السابقة للحفظ تحافظ على ما كان موجودًا فعليًا على القرص.
  • معرّفات النماذج بصيغة provider/raw-id. المعرّف المجرّد دون شرطة مائلة يُحلّ عبر نقطة نهاية LM Studio المحلية. ليس خطأً، بل مجرد اصطلاح يستحق معرفته قبل أن تبحث عن حقل مزوّد غير موجود.

التنزيلات

مجاني للاستخدام الشخصي. إذا وفّر لك عصرًا كاملًا من الوقت، فزر القهوة قريب منك.


← المزيد من الأدوات والتنزيلات