1 / 17
🛠️
Module 05 — الموديول الخامس

الأدوات والقدرات

الملفات، الـ shell، الويب، المتصفح، الكود، MCP، الـ plugins، والصوت
17 Slides ثنائي اللغة اختبار 5 أسئلة
الشريحة 2 — كيف بيشتغل Function Calling
كيف بيشتغل Function Calling
الجسر بين النص اللي النموذج بيكتبه والفعل اللي البرنامج بينفّذه
💡
الشرح: الأداة مخطط (schema) بيحوّلها الـ runtime ل-function definitions
الأداة مولّد نص ما عندوش وصول للقرص ولا الشبكة. لو شفته بيكتب أوامر shell كنص، انت اللي هتنسخها وتلزقها. الـ function calling بيخلّي اللفّة آلية ومضبوطة: النموذج بيولّد JSON مطابق للـ schema، والـ runtime بيتحقق ويشغّل ويرجّع النتيجة.
الحلقة اللي بتحوّل كلام النموذج إلى تنفّذ فعلي على جهازك — دي مراحل الـ function calling بالترتيب
text — the 5-step loop
1. SYSTEM BUILD  — runtime يجمّع الأدوات ويحوّلها لـ function definitions
2. MODEL OUTPUT — { "name": "read_file",
                              "input": { "path": "README.md" } }
3. RUNTIME EXEC — تحقّق: الأداة موجودة؟ الصلاحيات؟ الـ schema؟
                       ← تشغيل فعلي على القرص + secret redaction
4. TOOL RESULT  — { "role": "tool",
                              "content": "1|# Velox Academy\n2|..." }
5. FINAL ANSWER — النموذج بيقرأ النتيجة ويرد شفهي
المفهومفي OpenClawفي Hermes
الوحدة الأساسيةTool groups + profilesToolsets + platform presets
عدد الأدواتgroups + plugins + MCP~83 أداة مدمجة
write وapply_patchأداتين منفصلتينpatch تغطي كل الحالات
Skillيشرح إزاي تشتغلskills toolset
Pluginيضيف قدرات runtime~/.hermes/plugins/
🧭
القاعدة البسيطة: أداة ولا skill ولا plugin؟
لو الوكيل عنده الأدوات بس محتاج يعرف يستخدمها إزاي → skill. لو الأداة نفسها مش موجودة → plugin. ولو محتاج فعل عادي (قراءة، تعديل، نداء API) → tool.
الشريحة 3 — فئات الأدوات المدمجة
فئات الأدوات المدمجة
إزاي كل إطار بينظّم أدواته — groups و profiles ضد toolsets
💡
الشرح: شوف الأدوات المتاحة عندك قبل ما تكتب أي حاجة
الأمر ده بيفتح واجهة تفاعلية فيها كل الأدوات المفعّلة، وتنفع تعمل enable/disable بالاسم. لاحظ إن تغييرات الأدوات بتاخد effect على /reset (جلسة جديدة) — أبداً في نص محادثة، عشان الـ prompt caching.
شوف الأدوات المتاحة عندك وفعّل أو عطّل أي أداة بالاسم
bash — Hermes tool management
# شوف الأدوات المتاحة (واجهة تفاعلية)
hermes tools
# عرض فقط
hermes tools list
# تفعيل / تعطيل بالاسم
hermes tools enable browser hermes tools disable x_search
# لأداة واحدة في هذه الجلسة فقط (override مؤقت)
hermes chat --toolsets "web,terminal"
الفئةOpenClawHermes
تشغيل الأوامرexec, process, terminalterminal, process
الملفاتread, write, edit, apply_patchread_file, write_file, patch
إدخال بشريask_user, secretsclarify, browser_vault_*
ويبweb_search, x_search, web_fetchweb_search, web_extract
المتصفحbrowser (profile مُدار + CDP)10 أدوات browser_* + 2 أدوات CDP
الذاكرةmemory_search, memory_getmemory + memory providers
الأتمتةcron, heartbeat_respondcronjob
تنفيذ الكودبعيد على xAIمحلي
أدوات MCPbundle-mcp pluginmcp_{server}_{tool}
الوكلاء الفرعيونsessions_spawn, subagentsdelegate_task, session_search
الصوتvia tools.mediatext_to_speech
Code Mode✔ tools.codeMode✘ غير متاح
⚠️
مهم: تغيير الأدوات بيحصل على جلسة جديدة
تغيير الـ toolsets أو الـ config.yaml في نص محادثة بيكسر الـ prompt caching. في الـ gateway استخدم /reset أو /restart، وفي الـ CLI اقفل وافتح من جديد. الاستثناء الوحيد هو ضغط السياق.
الشريحة 4 — عمليات الملفات
عمليات الملفات
متخصص أحسن من shell — والسبب في اختيار النموذج نفسه
💡
الشرح: قرا ملف بأرقام أسطر وترقيم صفحات
الأداة دي بترجع LINE_NUM|CONTENT، يعني كل سطر مسبوق برقمه — فالنموذج يقدر يشير لسطر محدد بدقة. فيها ترقيم صفحات بـ offset وlimit، سقف ~100KB، واستخراج تلقائي للمستندات (PDF، docx، ipynb، SQLite وغيرها).
قراءة بمصفوفة أرقام الأسطر، تعديل مُوجّه، وبحث بالاسم أو بالمحتوى
python — file tool calls
read_file(path="config.yaml", offset=1, limit=2000)

# تعديل جزئي — بيرجع unified diff وبيعمل syntax check
patch(path="src/config.py", old_string="timeout = 30", new_string="timeout = 180")
# بحث في المحتوى أو بالاسم (rg-backed) مع file_glob وحدود
search_files(pattern="database", path=".", file_glob="*.yaml", limit=20)
الوظيفةHermesOpenClaw
قراءة ملف نصي بأرقام أسطرread_fileread
كتابة/استبدال محتوى بالكاملwrite_filewrite
تعديل مستهدف (find-and-replace)patchedit / apply_patch
بحث في المحتوى أو بالاسمsearch_filesvia read/exec
⚠️
قاعدة ذهبية: التعديل الجزئي = patch مش write_file
write_file بيكتب الملف بالكامل (overwrite). على ملف كبير = فقدان كل اللي مش موجود في الـ payload. ولو التعديل جزئي، استخدم patch.
الشريحة 5 — تنفيذ الأوامر والـ sandboxing
تنفيذ الأوامر والـ Sandboxing
الـ sandbox هو حدود الصلاحيات — مش رفاهية
💡
الشرح: خلّي التنفيذ ييجري على جهاز بعيد
الأمر اللي الوكيل بيشغّله بيشتغل بصلاحياتك أنت. الـ backend بتاع ssh هو الأكثر أماناً: الوكيل بيشتغل على جهاز تانية، فمش يقدر يعدّل الكود اللي شغّال، ولو السيرفر اتخرب الكود عندك في local سالم.
ضبط الـ backend اللي الأوامر هتنفّذ عليه من ملف الإعدادات
yaml — ~/.hermes/config.yaml
terminal:
  backend: ssh      # local | docker | ssh | singularity | modal | daytona | vercel_sandbox
  cwd: "."
  timeout: 180      # مهلة الأمر بالثواني
بيانات اتصال الـ SSH بتتقفل في ملف بيئة بدل ما تتحط في الكود
bash — ~/.hermes/.env
TERMINAL_SSH_HOST=my-server.example.com
TERMINAL_SSH_USER=myuser
TERMINAL_SSH_KEY=~/.ssh/id_rsa
تشغيل أمر في الـ sandbox بمهلة محددة، أو في الخلفية لخدمة مستمرة
bash — OpenClaw exec
# نفّذ npm test على الـ sandbox بمهلة 300 ثانية
openclaw exec --host auto --timeout 300 "npm test"
# نفّذ في الخلفية (مثل npm run dev) — timeoutSeconds: 0 يلغي المهلة
openclaw exec --background "npm run dev"
المحورHermesOpenClaw
الافتراضيlocal على جهازكالـ sandbox مقفول
الخياراتlocal, docker, ssh, singularity, modal, daytona, vercel_sandboxDocker, Podman, SSH, OpenShell, Crabbox
الاستمراريةحاوية Docker واحدة دائمةsandbox لكل مهمة
الخروج من العزلبتغيير الـ backendelevated + tools.elevated.allowFrom
نطاقات التحكمapprovals.mode, command_allowlisttools.exec.* + approvals + tools.elevated
Gateway process—يفضل على المضيف دايماً
⚠️
فخ الـ shell startup files
نداءات terminal بتشتغل non-interactively: مفيش TTY ومفيش حد عند الـ prompt. أي shell init تقيل أو تفاعلي بيموّت أو بيبطّئ كل أمر الوكيل بيشغّله. الحل guard في ~/.bashrc — الـ guard في الأول والـ init التقيل تحته.
الشريحة 6 — البحث والاستخراج من الويب
البحث والاستخراج من الويب
الاختيار الأدق = الأرخص والأسرع
💡
الشرح: ابحث الأول، وبعدين استخرج
القاعدة: لو عارف الـ URL → web_extract. لو مش عارف → web_search الأول. ولو محتاج login أو JS تقيل أو تفاعل → المتصفح. الـ batch في web_extract بياخد 5 URLs في نداء واحد — أسرع بكتير من 5 نداءات منفصلة.
لما تعرف الرابط استخرج على طول، ولما ما تعرفش ابحث الأول — البحث أرخص من الجلب
python — web tools
results = web_search("RAG best practices 2026", limit=5)   # رخيص جداً
pages  = web_extract(["https://a.com", "https://b.com"])       # أغلى: بيفتح الصفحة
ضبط محرك البحث وعدد النتائج من الـ CLI
bash — OpenClaw web config
# اضبط إعدادات البحث والجلب من الـ CLI
openclaw configure --section web
الأداةبتعمل إيهالتكلفة
web_searchبحث — قوائم نتائج (عناوين + URLs)رخيصة جداً
web_extractاستخراج — بتفتح الـ URL وترجع النصأغلى
browserأتمتة متصفح كاملأغلى بكتير
⚠️
الكاش — مصيدة كلاسيكية
web_search في Hermes بيخزّن 20 دقيقة وweb_search في OpenClaw 15 دقيقة. إعادة جلب نفس الـ URL بيبان كـ «موقعي مش بيتحدث» وهو في الحقيقة stale cache. بتطوّر موقع وتختبره على الإنترنت العلني؟ DNS العلني مش مستثنى تلقائياً.
استثناء نطاق معيّن من الكاش عشان المحتوى يتحدّث كل مرة
yaml — استثناء الكاش
web:
  cache_exempt_hosts:      # دايماً fetched live؛ يسري فوراً
    - mysite.vercel.app
    - "*.ngrok-free.app"
    - mysite.dev           # suffix match
الشريحة 7 — أتمتة المتصفح عبر CDP
أتمتة المتصفح عبر CDP
أدوات high-level وأدوات CDP خام لنفس الجلسة
💡
الشرح: افتح جلسة متصفح وثبّتها
browser_navigate لازم تتنادى الأول قبل أي أداة تانية. بعد كده الـ browser_snapshot بيرجّع شجرة إمكانية الوصول كنص، والعناصر التفاعلية بتاخد ref IDs زي @e1 — النموذج بيستخدمها للـ click والـ type.
تسلسل نداءات المتصفح الصحيح: افتح، اتفاعل، عيّن لقطة، اقرأ العنصر
text — متصفح Hermes بالأدوات
browser_navigate(url)          # أول نداء دائماً — يثبّت الجلسة
browser_snapshot(full=false)    # العناصر التفاعلية بس (compact)
browser_click(@e5)              # نقرة على عنصر بمعرّف من الـ snapshot
browser_type(@e3, "text")       # كتابة في input (بيمسح الحقل الأول)
browser_press("Enter")          # Enter للإرسال، Escape للإغلاق
browser_console()               # console + أخطاء JS ← لكشف الأخطاء الصامتة

# أداتين إضافيتين — بيتسجلوا بس لو في endpoint CDP متاح
browser_cdp("Page.captureScreenshot")
browser_dialog(action="accept") # بعد ما الـ snapshot يعرض pending_dialogs
تشغيل متصفح متبوع بـ CDP عشان ربوتات ما بتفحصش الكود
bash — OpenClaw browser
# افتح الـ CLI بتاع المتصفح
openclaw browser --help
# اضبط الـ profile من الإعدادات
openclaw configure --section browser
Profileبيعمل إيه
openclawالمتصفح المُدار المعزول (الافتراضي، والأمني)
userيرتبط بجلسة Chrome الحقيقية الموقّعة عبر CDP
🔒
«Real profile browsing» — التنبيه الأهم في هذه الوحدة
لو فعّلت التصفح في profile حقيقي بتاعك، الوكيل بيسألك الأول، وبعد موافقتك بيشغّل بلوجيناتك الحقيقية. ده convenience موافَق عليه، مش حد عزل — مقفول افتراضياً. وللـ runs المجدولة وغير المراقَبة: افترض إن مفيش حد هيرد على أي prompt، فجهّز الاعتماديات قبل التشغيل.
الشريحة 8 — تنفيذ الكود
تنفيذ الكود
نفّذ اللوجيك جوه السكربت — مش في الـ context
💡
الشرح: 5 عمليات بحث واستخراج — وبس النتيجة النهائية ترجع
تخيّل مهمة: «ابحث عن 10 مقالات، نزّل كل واحدة، لخّصها». لو عملتها بأدوات منفصلة، كل نتيجة بحث وفتح هتعدي على الـ context window. execute_code بيكتب سكربت Python بينادي الأدوات برمجياً، واللي بيرجع للـ context هو الـ print النهائي بس.
أدوات داخل أدوات: شغّل كود Python ينادي أدوات Hermes مباشرة
python — execute_code
from hermes_tools import web_search, web_extract
import json

queries = [
    "vector database 2026",
    "RAG best practices 2026",
    "LLM agent frameworks 2026",
    "MCP servers directory",
    "prompt caching explained",
]

all_results = []
for q in queries:
    results = web_search(q, limit=3)
    urls = [r["url"] for r in results["data"]["web"]]
    for i in range(0, len(urls), 5):
        batch = urls[i:i+5]                    # 5 URLs في نداء واحد
        page = web_extract(batch)
        for p in page.get("results", []):
            if p.get("content"):
                all_results.append({"q": q, "url": p["url"],
                                    "text": p["content"][:800]})

print(json.dumps(all_results, indent=2))   # بس ده اللي بيرجع
وضع تنفيذ الكود: عندك خيارات بدل ما تختار بنفسك في كل مرة
yaml — code_execution mode
code_execution:
  mode: project   # أو "strict"
الخاصيةprojectstrict
مجلد العملمجلد الجلسة (نفس terminal())مجلد staging معزول
المفسرالـ venv النشطsys.executable always
مناسب لإيهimport pandas ومسارات نسبيةأقصى قابلية للتكرار
fallbackلو الـ venv مكسور → sys.executable—
🧱
الثوابت الأمنية والحدود
النتيجة النهائية (حتى لو JSON ضخم) بتدخل الـ context فلتر وقلّل قبل الـ print. الحدود: مهلة 5 دقائق، stdout سقف 50KB، stderr 10KB، و50 نداء أداة كحد أقصى لكل تنفيذ. وكمان environment scrubbing — مفاتيح API والـ tokens متشالة، والسكربتات مش تقدر تنادي execute_code بشكل recursive ولا delegate_task ولا أدوات MCP.
الشريحة 9 — إعداد تكامل MCP
تكامل MCP — الإعداد
أهّل خوادم MCP مرة واحدة، وأدواتها تتاح في كل محادثة
💡
الشرح: عرّف السيرفر في config.yaml وهو بيتصل عند البدء
لما تشغّل Hermes، عند البدء بيحصل 4 حاجات: 1 يتصل بالسيرفر، 2 يكتشف الأدوات المتاحة، 3 يسجّلها ببادئة mcp_{server}_{tool}، 4 يحقنها في كل الـ platform toolsets. من بعد كده استخدمها طبيعياً.
ضبط الـ backend اللي الأوامر هتنفّذ عليه من ملف الإعدادات
yaml — ~/.hermes/config.yaml
mcp_servers:
  time:                          # stdio — command-based
    command: "uvx"
    args: ["mcp-server-time"]
    timeout: 120                  # مهلة كل نداء بالثواني
    connect_timeout: 60

  docs:                          # HTTP — url-based
    url: "https://mcp.example.com/mcp"
    headers:
      Authorization: "Bearer sk-..."
    timeout: 180
أوامر MCP للاستماع والربط والفحص — بدون ما تفتح ملف يدوي
bash — Hermes MCP CLI
hermes mcp                # picker تفاعلي (افتراضي)
hermes mcp catalog        # قائمة نصية قابلة للـ scripting
hermes mcp install n8n    # تثبيت entry من الكتالوج بالاسم
hermes mcp configure NAME # تبديل اختيار الأدوات (الفلترة)
hermes mcp serve           # تشغيل Hermes كـ MCP server
تسجيل سيرفر MCP محلي عبر stdio
bash — OpenClaw MCP registry
# سيرفر stdio محلي
openclaw mcp add local-tools --command node --arg ./dist/mcp-server.js openclaw mcp doctor local-tools --probe
# سيرفر HTTP بعيد، يعرض جزء من أدواته بس
openclaw mcp add docs --url https://mcp.example.com/mcp \ --transport streamable-http --include 'search,read_*'
# اتأكد إن السيرفرات المفعّلة بتتصل فعلاً
openclaw mcp probe context7 --json
الإعدادالنوعالافتراضي
commandstring— (required for stdio)
argslist[]
envdict{}
urlstring— (required for HTTP)
headersdict{}
timeoutint120
connect_timeoutint60
🧭
إعادة التشغيل مطلوبة
إضافة أو إزالة سيرفرات MCP بتتطلب إعادة تشغيل Hermes — مفيش hot-reload حالياً. لاحظ العكس في OpenClaw: تعريف السيرفرات تحت mcp.servers، وأدواتها بتعدّي نفس ضوابط tool-profile و tool-policy زي أي حاجة تانية — ربط سيرفر مش بيلفّ على سياستك.
الشريحة 10 — فلترة الأدوات و OAuth
فلترة الأدوات و OAuth
أهم ميزة أمنية في MCP — قلّل الـ surface area
⚠️
ليه الفلترة مهمة أمنياً؟
سيرفر MCP واحد ممكن يعرض 40 أداة فيها delete_workspace وwipe_database وtransfer_funds. لو كلهم اتعرضوا للنموذج، احتمال misuse بيتفعّل. الفلترة بتقلّل الـ surface area والـ tokens في نفس الوقت.
فلترة أي أدوات يقدر الوكيل يشوفها من السيرفر ده تحديداً، وربط التفعيل بـ OAuth
yaml — فلترة الأدوات وحماية البيئة
mcp_servers:
  company_api:
    command: "npx"
    args: ["-y", "company-mcp"]
    env:
      DATABASE_URL: "postgresql://..."   # لازم صريح — مش بينتقل تلقائياً
    tools:
      include: ["db_read", "db_query", "db_schema"]
تحديث فلاتر الأدوات لكل سيرفر بأسماء و globs بسيطة
bash — OpenClaw tool filters
# حدّث فلاتر الأدوات لكل سيرفر (أسماء و globs بسيطة بـ *)
openclaw mcp tools context7 --include 'resolve-library-id,get-library-docs' openclaw mcp configure docs --include 'search,read_*'
# موافقات Codex: auto | prompt | approve (approve بس للسيرفرات الموثوقة)
openclaw mcp add memory --command npx --arg -y \ --arg @modelcontextprotocol/server-memory --approval approve
تسجيل دخول بـ OAuth مرة واحدة، وبعدها كل الأدوات البعيدة تشتغل بjosك
bash — OAuth: تسجيل دخول واحد ثم logout
openclaw mcp set docs '{"url":"https://mcp.example.com/mcp","transport":"streamable-http","auth":"oauth","oauth":{"scope":"docs.read"}}'

# شغّل login — callback loopback + تخزين في SQLite مشترك
openclaw mcp login docs openclaw mcp status --verbose openclaw mcp doctor docs --probe openclaw mcp logout docs
الطبقةHermesOpenClaw
فلترة الأدواتtools.include in the config--include / toolFilter
عزل الـ environmentمتغيرات صريحة بس + baseline آمنallowlist للمتغيرات المعروفة
OAuthمتصفح يفتح عند أول اتصالدورة كاملة + per-requester
موافقة على الأداة✘ غير متاحة✔ --approval
تنقية الـ credentialsمن رسائل الخطأallowlist للـ env vars
🔑
القاعدة الذهبية
ـ Authorization headers الثابتة بتتجاهل لأي سيرفر طول ما auth: "oauth" مفعّل. وفي Hermes، لو approvals.mode — ده بيمسك أوامر shell بس، مش نداءات MCP.
الشريحة 11 — كتابة plugin مخصص
كتابة plugin مخصص
أداة خاصة بفريقك — إما plugin أو MCP
💡
الشرح: إمتى plugin وإمتى MCP؟
لو الأداة اللي محتاجها بتتكلم مع خدمة خارجية → MCP. لو عايز كود مخصص في نفس العملية → plugin. الـ plugin أسرع في الحالة البسيطة (مش محتاج process تاني ولا protocol)، وبيديك وصول لـ hooks ولـ LLM بتاع المستخدم نفسه.
شكل المجلد: ملف تعريف YAML و __init__.py بيسجّل الأدوات
text — ~/.hermes/plugins/my-plugin/
~/.hermes/plugins/my-plugin/
├── plugin.yaml      # manifest
├── __init__.py      # register() — بيربط الـ schemas بالـ handlers
├── schemas.py       # tool schemas (اللي النموذج بيشوفه)
└── tools.py         # tool handlers (اللي بيشتغل لما الأداة تنادى)
دالة register بتسلّم الأدوات للـ runtime — دي نقطة الدخول الوحيدة
python — __init__.py
def register(ctx):
    schema = {
        "name": "hello_world",
        "description": "Returns a friendly greeting for the given name.",
        "parameters": {
            "type": "object",
            "properties": {"name": {"type": "string"}},
            "required": ["name"],
        },
    }

    def handle_hello(params, **kwargs):
        del kwargs
        name = params.get("name", "World")
        return json.dumps({"success": True, "greeting": f"Hello, {name}!"})

    ctx.register_tool(name="hello_world", toolset="hello_world",
                      schema=schema, handler=handle_hello)
    ctx.register_hook("post_tool_call", on_tool_call)
دورة حياة إضافة: تهيئة، فحص، ثم تفعيل
bash — OpenClaw plugin lifecycle
openclaw plugins init my-plugin --name "My Plugin"   # scaffolding
npm run plugin:build                                  # بناء
npm run plugin:validate                                # تحقق
openclaw plugins install ./my-plugin
openclaw plugins enable my-plugin
openclaw plugins inspect my-plugin --runtime --json
القدرةHermes
إضافة أدواتctx.register_tool(...)
إضافة hooksctx.register_hook("post_tool_call", cb)
Slash commandsctx.register_command(name, handler, description)
نداء LLM من المضيفctx.llm.complete(...)
نداء أداة MCPctx.call_mcp(server, tool, args)
تسجيل مزوّد صورctx.register_image_gen_provider(...)
اشتراط متغيراتrequires_env in plugin.yaml
التوزيعa pip entry-point or a ~/.hermes/plugins/ directory
⚠️
plugins على مستوى المشروع مقفولة افتراضياً
أي plugin في مجلد المشروع بيشتغل بكود عشوائي في عملية الوكيل. فعّلها بـ HERMES_ENABLE_PROJECT_PLUGINS=true بس للمستودعات الموثوقة. وفي OpenClaw: كل plugin APIs تجريبية — ثبّت إصدار المضيف.
الشريحة 12 — صلاحيات الأدوات وأنماط الموافقة
صلاحيات الأدوات وأنماط الموافقة
السماح بأداة مش بديل عن review بشري
⚠️
المبدأ الأساسي
الأداة اللي تقدر تشغّل exec هي أخطر أداة في القائمة، لأنها بتلغي كل الفلاتر التانية. فلاتر الأدوات مش بديل عن review بشري.
وضع smart: يسأل عند الحاجة ويمشي لوحده في الأوامر الآمنة
bash — Hermes approval modes
# الوسط الموصى به
hermes config set approvals.mode smart
# يتخطى كل موافقات الأوامر (مش موصى به)
hermes config set approvals.mode off
طبقات السياسة: allowlist وقواعد على مستوى السيرفر نفسه
json5 — OpenClaw policy layers
{
  tools: {
    profile: "coding",
    deny: ["group:fs"],              // group denies بتتجاوز allow صريح
    byProvider: { anthropic: { profile: "minimal" } },
    toolsBySender: {
      "channel:discord:1234567890123": { alsoAllow: ["group:fs"] },
      "*": { deny: ["exec", "process", "write", "edit", "apply_patch"] },
    },
  },
}
الوضعالسلوك
smartموافقة تلقائية لأمر منخفض المخاطر، رفض للعالي، وسؤال عند عدم اليقين (افتراضي)
manualدايماً يسأل
offيتخطى كل موافقات الأوامر (يعادل --yolo)
ℹ️
قاعدة allow/deny في OpenClaw
write وapply_patch أداتين منفصلتين: deny: ["write"] ما بتمنعش apply_patch. الحل: deny الـ group بالكامل أو سمّي كل أداة تعديل بالاسم.
الشريحة 13 — التنفيذ المتوازي
التنفيذ المتوازي
5 نداءات مستقلة = 1 round-trip بدل 5
💡
الشرح: نفّذ عمليات في الخلفية واستلم إشعار عند الانتهاء
الأمر ده بيشغّل العملية في الخلفية على طول، وبيدّيك session_id — استخدم process (poll/wait/kill) لإدارتها. لاحظ: delegate_task(background=True) مش durable — لو العملية الأبا خرجت، الطفل ضاع.
تشغيل عدة وكلاء بالتوازي وجمع نتائجهم
python — التوازي على مستوى الوكلاء
from hermes_tools import terminal
import json

# شغّل عملية طويلة في الخلفية وكمّل اللفّة
sid = terminal(command="hermes chat -q 'Set up CI/CD for ~/myapp'",
                background=True, notify_on_complete=True)
print(json.dumps({"session_id": sid}))
السقف: BrowserNavigateTool واحد بالتوازي و Playwright مفتوح
yaml — سقف التوازي
image_gen:
  max_parallel_requests: 4   # صور متوازية في batch نداء واحد (افتراضي 4)
تلميحات التوازي: نسبة التوازي أعلى في راي و Gemini
json5 — OpenClaw parallel hints
{
  mcp: { servers: { "fast-server": {
        url: "https://mcp.example.com",
        supportsParallelToolCalls: true } } },
  tools: { media: { concurrency: 2 } },
}
طبقة التوازيHermesOpenClaw
نداءات متوازية في نفس اللفّة✔ model + runtime✔
Batch في نداء واحدweb_extract (5 URLs)web_fetch
توازي على مستوى الوكلاءdelegate_task(tasks=[...]) — افتراضي 3sessions_spawn
توازي منطقي بالبرمجةexecute_codetools.codeMode
تلميح على مستوى السيرفر✘✔ supportsParallelToolCalls
سقف التوازيimage_gen.max_parallel_requeststools.media.concurrency
خلفية + إشعارterminal(background=True)exec(background: true) + process
⚠️
القيد: التوازي بيزوّد استهلاك الـ rate limit
التوازي بيقلّل زمن الاستجابة وبيقلّل عدد الـ turns — بس بيزوّد استهلاك الـ rate limit، وممكن يزوّد الـ context footprint لو كل النداءات بترجّع نتايج كبيرة. اعمل truncation على النتايج الكبيرة.
الشريحة 14 — أدوات الوسائط
أدوات الوسائط — صور وصوت
ولّد الصور وأصوات من داخل الوكيل
💡
الشرح: اختار مزوّد الصور/CBZ عن طريق أمر الأدوات
الأمر ده بيفتح المعالج التفاعلي: اختار 🎨 Image Generation، بعدين الـ backend (اشتراك Nous أو FAL.ai)، بعدين الموديل. الاختيار بيتحفظ في config.yaml.
اختيار موديل الصور ومزوّد الصوت من الإعدادات
bash — اختار موديل الصور ومزوّد الصوت
# المعالج التفاعلي: صور + صوت + كل الأدوات
hermes tools
# Hermes: 11 موديل FAL من غير مفتاح، و Edge TTS مجاني من غير مفتاح
إعداد مولّد الصور ومحرك تحويل النص لكلام في ملف واحد
yaml — image_gen + tts
image_gen:
  model: fal-ai/flux-2/klein/9b   # افتراضي: سريع، نص واضح، $0.006/MP
  use_gateway: false             # true لو مشترك Nous Portal
  max_parallel_requests: 4

tts:
  provider: "edge"               # edge | elevenlabs | openai | minimax | mistral | xai | piper
  speed: 1.0
  edge:
    voice: "en-US-AriaNeural"    # 322 صوت، 74 لغة

stt:
  enabled: true
  provider: local                # faster-whisper مجاني
واجهة media الموحّدة اللي بتغطّي الصور والصوت
json5 — OpenClaw tools.media
{
  tools: { media: {
    concurrency: 2,
    models: [
      { provider: "openai", model: "gpt-4o-mini-transcribe", capabilities: ["audio"] },
      { provider: "xai", model: "grok-imagine-image", capabilities: ["image"] },
    ],
  } },
}
الميزةHermesOpenClaw
أداة توليد الصورimage_generateimage_generate
عدد الموديلات11 (FAL)9+ مزوّدات
تحرير الصور✔ image_url + مراجع✔ image / images
اختيار الموديلhermes toolsagents.defaults.mediaModels.image
توليد غير متزامن✘ متزامن✔ background task
TTStext_to_speech — 11 مزوّدtools.media models
STT6 مزوّد (faster-whisper، Groq، Openai…)capabilities: [audio]
صوت محلي✔ NeuTTS, KittenTTS, Piper✘
بدون مفتاح✔ Nous Tool Gateway✘
🎨
تحرير الصور مدخلين بس
مدخلان بيقودوا التحرير: image_url — الصورة المصدر الأساسية، وreference_image_urls — مراجع تنسيق/ستايل إضافية (لكل موديل سقف مختلف: FAL 9، OpenAI 16، Krea 10، xAI 1).
الشريحة 15 — المقارنة
OpenClaw vs Hermes — الأدوات والقدرات
مصفوفة على كل محور من محاور الأدوات
المحورOpenClawHermes
اللغةNode.js (TypeScript ESM)Python
ملف الإعدادات~/.openclaw/openclaw.json (JSON5)~/.hermes/config.yaml + .env
وحدة التنظيمtools.* policy keystoolsets + hermes tools
عدد الأدواتgroups + plugins + MCP~83 أداة مدمجة
Node requiredNode 24.16+ / 26.1+✘ Python بس
تنفيذ الكودبعيد على xAIمحلي
Code Mode✔ tools.codeMode✘
المتصفحbrowser (profile مُدار)10 أدوات browser_* + 2 CDP
أدوات MCPbundle-mcp pluginmcp_{server}_{tool}
تشغيل كـ MCP serveropenclaw mcp servehermes mcp serve
إعادة تحميل الـ confighybrid hot reload✘ إعادة تشغيل مطلوبة
الافتراضي الآمنsandbox مقفول + coding profileapprovals.mode: smart + redaction
موافقات exec6 أوضاع3 أوضاع
موافقات MCP✔ --approval✘
التصفية حسب المزوّد/المرسل✔ byProvider + toolsBySender✘
بدون مفتاح✘✔ Nous Tool Gateway
تشغيل حيّ للاثنين عشان تقارن الأدوات بنفسك
bash — تشخيص ومقارنة حيّة
# OpenClaw
openclaw doctor openclaw mcp status --verbose openclaw plugins inspect my-plugin --runtime --json
# Hermes
hermes doctor hermes tools list hermes mcp catalog
الشريحة 16 — المشروع العملي
مشروع: Serena MCP Server + Plugin
ابني خادم MCP خاص بيك من الصفر، وفلتر أدواته بأمان
💡
الشرح: ابدأ بـ MCP server صغير ومقروء
أنشئ سيرفر MCP بسيط بيعرض أداتين: note_read وnote_write، وأضفهم لـ Hermes بـ stdio، مع فلترة صريحة على أدوات القراءة، ومراجعة كل حقل في الـ manifest قبل التثبيت.
خطوة ١: ابنِ سيرفر MCP محلي من الصفر
bash — 1) ابنِ السيرفر
mkdir serena-mcp && cd serena-mcp
npm init -y
npm install @modelcontextprotocol/sdk

# سجّل الأداتين في السيرفر
node index.js
خطوة ٢: اربطه بـ Hermes مع فلترة أدوات محددة
yaml — 2) اربطه بـ Hermes مع فلترة
mcp_servers:
  serena:
    command: "node"
    args: ["/home/you/serena-mcp/index.js"]
    timeout: 60
    tools:
      include: ["note_read"]      # أدوات القراءة بس
خطوة ٣: اختبر السيرفر قبل ما تعتمد عليه في الإنتاج
bash — 3) اختبر ووثّق
# اختبر السيرفر قبل ما تعتمد عليه
hermes mcp test serena hermes mcp configure serena
# OpenClaw: نفس السيرفر بنفس الفلاتر
openclaw mcp add serena --command node --arg /home/you/serena-mcp/index.js openclaw mcp tools serena --include 'note_read' openclaw mcp probe serena --json
الشريحة 17 — اختبار المعرفة
اختبار
اختبر نفسك — 5 أسئلة سريعة

اختبار الموديول 5

Score: 0/5
س1: بعتّ للوكيل «اقرا ملف README.md» وطلع {"name": "read_file", "input": {"path": "README.md"}}. ليه الـ framework بينفّذ الأداة مش النموذج نفسه؟
النموذج نفسه بينفّذ الأداة من عنده
لأن النموذج مولّد نص مفيش له وصول للقرص — الـ runtime هو اللي بيتحقق ويشغّل ويرجّع النتيجة
عشان الـ framework مش بيسمح للوكيل يقرا الملفات
عشان الـ API ما بيقبلش نداء أداة من غير tool result
س2: في OpenClaw عملت { tools: { deny: ["write"] } } بس الوكيل لسه بيعدّل الملفات بـ apply_patch. ليه؟ وإيه الحل؟
لأن الـ API بتاخد وقت تسري
لأن في bug في الإصدار الحالي
لأنهم alias لنفس الأداة
لأنهم أداتين منفصلتين — الحل deny الـ group بالكامل أو سمّي كل أداة تعديل بالاسم
س3: في Hermes، شغّلت delegate_task(background=True) على مهمة طويلة، وبعدين عملية الوكيل الأبا اتقفلت فجأة. إيه اللي هيحصل؟
الطفل بيكمّل ويبعت النتيجة في محادثة جديدة
الطفل ضاع — delegate_task مش durable؛ استخدم cronjob أو terminal(background=True)
العملية بتعمل restart تلقائي
النتيجة بتتخزّن في الذاكرة الدائمة
س4: MCP server فيه 40 أداة منها db_wipe وtransfer_funds، والـ env فيه DATABASE_URL. عايز الوكيل يشوف أدوات القراءة بس. إيه أفضل إعداد؟
اعتمد على approvals.mode بس
tools.include لأدوات القراءة + env صريح لـ DATABASE_URL
اقفل كل نداءات MCP وخلي الـ agent يعتمد على shell
اعتمد على prompt النظام يقوله ما يناديش أدوات الكتابة
س5: بتبني مساعد يحلّل صفحات ويبحث. هتستخدم (أ) web_search + web_extract، (ب) web_search + متصفح كامل، ولا (ج) execute_code فوق الاتنين؟
(أ) دايماً — المتصفح وexecute_code مبالغة
(أ) كبداية، و(ب) بس عند login أو JS تقيل، و(ج) عند 5+ مصادر أو فلترة
(ب) دايماً عشان أضمن أدق نتيجة
(ج) بس — دي الأداة الوحيدة اللي بتشتغل صح