Gateway
مرجع التكوين
مرجع التكوين الأساسي لـ ~/.openclaw/openclaw.json. للاطلاع على نظرة عامة موجهة للمهام، راجع التكوين.
يغطي أسطح تكوين OpenClaw الرئيسية ويربط بالمراجع الأخرى عندما يكون لنظام فرعي مرجعه الأعمق الخاص. تعيش كتالوجات الأوامر المملوكة للقنوات وPlugin ومقابض الذاكرة العميقة/QMD في صفحاتها الخاصة بدلا من هذه الصفحة.
مصدر الحقيقة في الكود:
- يطبع
openclaw config schemaمخطط JSON Schema الحي المستخدم للتحقق وControl UI، مع دمج بيانات Plugin/القنوات/المجمعة الوصفية عند توفرها - يعيد
config.schema.lookupعقدة مخطط واحدة محددة المسار لأدوات التعمق - يتحقق
pnpm config:docs:check/pnpm config:docs:genمن تجزئة خط أساس وثائق التكوين مقابل سطح المخطط الحالي
مسار بحث الوكيل: استخدم إجراء أداة gateway المسمى config.schema.lookup للحصول على
وثائق وقيود دقيقة على مستوى الحقل قبل التعديلات. استخدم
التكوين للإرشادات الموجهة للمهام وهذه الصفحة
لخريطة الحقول الأوسع، والقيم الافتراضية، وروابط مراجع الأنظمة الفرعية.
مراجع عميقة مخصصة:
- مرجع تكوين الذاكرة لـ
agents.defaults.memorySearch.*وmemory.qmd.*وmemory.citationsوتكوين Dreaming ضمنplugins.entries.memory-core.config.dreaming - أوامر الشرطة المائلة لكتالوج الأوامر المضمنة + المجمعة الحالي
- صفحات القنوات/Plugin المالكة لأسطح الأوامر الخاصة بالقنوات
تنسيق التكوين هو JSON5 (يُسمح بالتعليقات والفواصل اللاحقة). كل الحقول اختيارية - يستخدم OpenClaw قيما افتراضية آمنة عند حذفها.
القنوات
انتقلت مفاتيح التكوين لكل قناة إلى صفحة مخصصة - راجع
التكوين - القنوات لـ channels.*،
بما في ذلك Slack وDiscord وTelegram وWhatsApp وMatrix وiMessage والقنوات
المجمعة الأخرى (المصادقة، التحكم بالوصول، الحسابات المتعددة، بوابة الإشارة).
افتراضيات الوكيل، تعدد الوكلاء، الجلسات، والرسائل
انتقلت إلى صفحة مخصصة - راجع التكوين - الوكلاء لـ:
agents.defaults.*(مساحة العمل، النموذج، التفكير، Heartbeat، الذاكرة، الوسائط، Skills، صندوق العزل)multiAgent.*(توجيه الوكلاء المتعددين والارتباطات)session.*(دورة حياة الجلسة، Compaction، التقليم)messages.*(تسليم الرسائل، TTS، عرض Markdown)talk.*(وضع Talk)talk.speechLocale: معرف لغة BCP 47 اختياري للتعرف على كلام Talk على iOS/macOStalk.silenceTimeoutMs: عند عدم تعيينه، يحافظ Talk على نافذة التوقف الافتراضية للنظام الأساسي قبل إرسال النص (700 ms on macOS and Android, 900 ms on iOS)
الأدوات والمزودون المخصصون
انتقلت سياسة الأدوات، ومفاتيح التبديل التجريبية، وتكوين الأدوات المدعوم بالمزودين، وإعداد المزود المخصص / عنوان URL الأساسي إلى صفحة مخصصة - راجع التكوين - الأدوات والمزودون المخصصون.
النماذج
توجد تعريفات المزودين، وقوائم السماح للنماذج، وإعداد المزود المخصص في
التكوين - الأدوات والمزودون المخصصون.
يمتلك جذر models أيضا سلوك كتالوج النماذج العام.
{
models: {
// Optional. Default: true. Requires a Gateway restart when changed.
pricing: { enabled: false },
},
}
models.mode: سلوك كتالوج المزود (mergeأوreplace).models.providers: خريطة مزودين مخصصة مفهرسة بمعرف المزود.models.pricing.enabled: يتحكم في تمهيد التسعير في الخلفية الذي يبدأ بعد وصول العمليات الجانبية والقنوات إلى مسار جاهزية Gateway. عندما تكونfalse، يتخطى Gateway جلب كتالوجات تسعير OpenRouter وLiteLLM؛ وتظل قيمmodels.providers.*.models[].costالمكونة تعمل لتقديرات التكلفة المحلية.
MCP
توجد تعريفات خوادم MCP التي يديرها OpenClaw ضمن mcp.servers وتستهلكها
Pi المضمنة ومحولات وقت التشغيل الأخرى. تدير أوامر openclaw mcp list و
show وset وunset هذه الكتلة دون الاتصال بالخادم
المستهدف أثناء تعديلات التكوين.
{
mcp: {
// Optional. Default: 600000 ms (10 minutes). Set 0 to disable idle eviction.
sessionIdleTtlMs: 600000,
servers: {
docs: {
command: "npx",
args: ["-y", "@modelcontextprotocol/server-fetch"],
},
remote: {
url: "https://example.com/mcp",
transport: "streamable-http", // streamable-http | sse
headers: {
Authorization: "Bearer ${MCP_REMOTE_TOKEN}",
},
},
},
},
}
mcp.servers: تعريفات خوادم MCP المسماة من نوع stdio أو البعيدة لأوقات التشغيل التي تعرض أدوات MCP المكونة. تستخدم الإدخالات البعيدةtransport: "streamable-http"أوtransport: "sse"؛ أماtype: "http"فهو اسم مستعار أصلي لـ CLI تقوم أوامرopenclaw mcp setوopenclaw doctor --fixبتطبيعه إلى حقلtransportالقياسي.mcp.sessionIdleTtlMs: مدة TTL للخمول لأوقات تشغيل MCP المجمعة ذات نطاق الجلسة. تطلب التشغيلات المضمنة لمرة واحدة تنظيف نهاية التشغيل؛ وتمثل مدة TTL هذه شبكة الأمان للجلسات طويلة العمر والمستدعين المستقبليين.- تطبق التغييرات ضمن
mcp.*فوريا عبر التخلص من أوقات تشغيل MCP المخزنة مؤقتا للجلسة. يعيد اكتشاف/استخدام الأداة التالي إنشاءها من التكوين الجديد، لذلك تتم إزالة إدخالاتmcp.serversالمحذوفة فورا بدلا من انتظار مدة TTL للخمول.
راجع MCP و خلفيات CLI لسلوك وقت التشغيل.
Skills
{
skills: {
allowBundled: ["gemini", "peekaboo"],
load: {
extraDirs: ["~/Projects/agent-scripts/skills"],
},
install: {
preferBrew: true,
nodeManager: "npm", // npm | pnpm | yarn | bun
},
entries: {
"image-lab": {
apiKey: { source: "env", provider: "default", id: "GEMINI_API_KEY" }, // or plaintext string
env: { GEMINI_API_KEY: "GEMINI_KEY_HERE" },
},
peekaboo: { enabled: true },
sag: { enabled: false },
},
},
}
allowBundled: قائمة سماح اختيارية لـ Skills المجمعة فقط (لا تتأثر Skills المدارة/الخاصة بمساحة العمل).load.extraDirs: جذور Skills مشتركة إضافية (أدنى أسبقية).install.preferBrew: عند true، تفضل مثبتات Homebrew عندما يكونbrewمتاحا قبل الرجوع إلى أنواع المثبتات الأخرى.install.nodeManager: تفضيل مثبت Node لمواصفاتmetadata.openclaw.install(npm|pnpm|yarn|bun).- يعطل
entries.<skillKey>.enabled: falseSkill حتى لو كانت مجمعة/مثبتة. entries.<skillKey>.apiKey: وسيلة مريحة لـ Skills التي تعلن عن متغير بيئة أساسي (سلسلة نصية صريحة أو كائن SecretRef).
Plugins
{
plugins: {
enabled: true,
allow: ["voice-call"],
bundledDiscovery: "allowlist",
deny: [],
load: {
paths: ["~/Projects/oss/voice-call-plugin"],
},
entries: {
"voice-call": {
enabled: true,
hooks: {
allowPromptInjection: false,
},
config: { provider: "twilio" },
},
},
},
}
- يتم التحميل من
~/.openclaw/extensionsو<workspace>/.openclaw/extensions، بالإضافة إلىplugins.load.paths. - يقبل الاكتشاف Plugins OpenClaw الأصلية بالإضافة إلى حزم Codex المتوافقة وحزم Claude، بما في ذلك حزم Claude ذات التخطيط الافتراضي بلا manifest.
- تتطلب تغييرات التكوين إعادة تشغيل Gateway.
allow: قائمة سماح اختيارية (لا يتم تحميل إلا Plugins المدرجة). يتغلبdeny.bundledDiscovery: القيمة الافتراضية هي"allowlist"للتكوينات الجديدة، لذلك فإنplugins.allowغير الفارغة تقيد أيضا Plugins المزودين المجمعة، بما في ذلك مزودي وقت تشغيل بحث الويب. يكتب Doctor القيمة"compat"لتكوينات قوائم السماح القديمة المرحَّلة للحفاظ على سلوك مزود المجموعات الحالي حتى تختار الاشتراك.plugins.entries.<id>.apiKey: حقل مريح لمفتاح API على مستوى Plugin (عندما يدعمه Plugin).plugins.entries.<id>.env: خريطة متغيرات بيئة ضمن نطاق Plugin.plugins.entries.<id>.hooks.allowPromptInjection: عندما تكونfalse، يحظر القلبbefore_prompt_buildويتجاهل الحقول التي تعدل الموجه منbefore_agent_startالقديم، مع الحفاظ علىmodelOverrideوproviderOverrideالقديمين. ينطبق على خطاطيف Plugin الأصلية وأدلة الخطاطيف المدعومة التي توفرها الحزم.plugins.entries.<id>.hooks.allowConversationAccess: عندما تكونtrue، يمكن لـ Plugins غير المجمعة الموثوقة قراءة محتوى المحادثة الخام من الخطاطيف المطبوعة مثلllm_inputوllm_outputوbefore_model_resolveوbefore_agent_replyوbefore_agent_runوbefore_agent_finalizeوagent_end.plugins.entries.<id>.subagent.allowModelOverride: ثق صراحة بهذا Plugin لطلب تجاوزاتproviderوmodelلكل تشغيل لتشغيلات الوكيل الفرعي في الخلفية.plugins.entries.<id>.subagent.allowedModels: قائمة سماح اختيارية لأهدافprovider/modelالقياسية لتجاوزات الوكيل الفرعي الموثوقة. استخدم"*"فقط عندما تريد عمدا السماح بأي نموذج.plugins.entries.<id>.config: كائن تكوين معرف من Plugin (يتم التحقق منه بواسطة مخطط Plugin OpenClaw الأصلي عند توفره).- توجد إعدادات حساب/وقت تشغيل Plugin القناة ضمن
channels.<id>ويجب أن تصفها بياناتchannelConfigsالوصفية في manifest الخاص بـ Plugin المالك، لا سجل خيارات OpenClaw مركزي. plugins.entries.firecrawl.config.webFetch: إعدادات مزود جلب الويب Firecrawl.apiKey: مفتاح API لـ Firecrawl (يقبل SecretRef). يرجع إلىplugins.entries.firecrawl.config.webSearch.apiKeyأوtools.web.fetch.firecrawl.apiKeyالقديم أو متغير البيئةFIRECRAWL_API_KEY.baseUrl: عنوان URL الأساسي لـ API في Firecrawl (الافتراضي:https://api.firecrawl.dev؛ يجب أن تستهدف التجاوزات ذاتية الاستضافة نقاط نهاية خاصة/داخلية).onlyMainContent: استخرج المحتوى الرئيسي فقط من الصفحات (الافتراضي:true).maxAgeMs: الحد الأقصى لعمر التخزين المؤقت بالمللي ثانية (الافتراضي:172800000/ يومان).timeoutSeconds: مهلة طلب الكشط بالثواني (الافتراضي:60).
plugins.entries.xai.config.xSearch: إعدادات xAI X Search (بحث الويب Grok).enabled: تمكين مزود X Search.model: نموذج Grok المستخدم للبحث (مثل"grok-4-1-fast").
plugins.entries.memory-core.config.dreaming: إعدادات Dreaming الذاكرة. راجع Dreaming للمراحل والعتبات.enabled: مفتاح Dreaming الرئيسي (الافتراضيfalse).frequency: إيقاع Cron لكل مسح Dreaming كامل ("0 3 * * *"افتراضيا).model: تجاوز اختياري لنموذج الوكيل الفرعي Dream Diary. يتطلبplugins.entries.memory-core.subagent.allowModelOverride: true؛ اقترنه بـallowedModelsلتقييد الأهداف. تعيد أخطاء عدم توفر النموذج المحاولة مرة واحدة باستخدام نموذج الجلسة الافتراضي؛ ولا تتراجع أخطاء الثقة أو قائمة السماح بصمت.- سياسة المراحل والعتبات تفاصيل تنفيذية (ليست مفاتيح تكوين موجهة للمستخدم).
- يوجد تكوين الذاكرة الكامل في مرجع تكوين الذاكرة:
agents.defaults.memorySearch.*memory.backendmemory.citationsmemory.qmd.*plugins.entries.memory-core.config.dreaming
- يمكن لـ Plugins حزم Claude المفعلة أيضا المساهمة بافتراضات Pi المضمنة من
settings.json؛ يطبق OpenClaw هذه كإعدادات وكيل منظفة، لا كتصحيحات تكوين OpenClaw خام. plugins.slots.memory: اختر معرف Plugin الذاكرة النشط، أو"none"لتعطيل Plugins الذاكرة.plugins.slots.contextEngine: اختر معرف Plugin محرك السياق النشط؛ القيمة الافتراضية هي"legacy"ما لم تثبت محركا آخر وتختاره.
راجع Plugins.
الالتزامات
يتحكم commitments في ذاكرة المتابعة المستنتجة: يمكن لـ OpenClaw اكتشاف عمليات التحقق من أدوار المحادثة وتسليمها عبر تشغيلات Heartbeat.
commitments.enabled: تمكين استخراج LLM المخفي، والتخزين، وتسليم Heartbeat للالتزامات المستنتجة للمتابعة. الافتراضي:false.commitments.maxPerDay: الحد الأقصى لالتزامات المتابعة المستنتجة المسلمة لكل جلسة وكيل في يوم متحرك. الافتراضي:3.
راجع الالتزامات المستنتجة.
المتصفح
{
browser: {
enabled: true,
evaluateEnabled: true,
defaultProfile: "user",
ssrfPolicy: {
// dangerouslyAllowPrivateNetwork: true, // opt in only for trusted private-network access
// allowPrivateNetwork: true, // legacy alias
// hostnameAllowlist: ["*.example.com", "example.com"],
// allowedHostnames: ["localhost"],
},
tabCleanup: {
enabled: true,
idleMinutes: 120,
maxTabsPerSession: 8,
sweepMinutes: 5,
},
profiles: {
openclaw: { cdpPort: 18800, color: "#FF4500" },
work: {
cdpPort: 18801,
color: "#0066CC",
executablePath: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
},
user: { driver: "existing-session", attachOnly: true, color: "#00AA00" },
brave: {
driver: "existing-session",
attachOnly: true,
userDataDir: "~/Library/Application Support/BraveSoftware/Brave-Browser",
color: "#FB542B",
},
remote: { cdpUrl: "http://10.0.0.42:9222", color: "#00AA00" },
},
color: "#FF4500",
// headless: false,
// noSandbox: false,
// extraArgs: [],
// executablePath: "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser",
// attachOnly: false,
},
}
- يؤدي
evaluateEnabled: falseإلى تعطيلact:evaluateوwait --fn. - يستعيد
tabCleanupعلامات تبويب الوكيل الأساسي المتتبعة بعد مدة الخمول أو عندما تتجاوز الجلسة حدها الأقصى. عيّنidleMinutes: 0أوmaxTabsPerSession: 0لتعطيل أوضاع التنظيف الفردية هذه. - يكون
ssrfPolicy.dangerouslyAllowPrivateNetworkمعطلاً عندما لا يكون معيّناً، لذلك يبقى تنقل المتصفح صارماً افتراضياً. - عيّن
ssrfPolicy.dangerouslyAllowPrivateNetwork: trueفقط عندما تثق عمداً بتنقل المتصفح عبر الشبكة الخاصة. - في الوضع الصارم، تخضع نقاط نهاية ملفات تعريف CDP البعيدة (
profiles.*.cdpUrl) لحظر الشبكة الخاصة نفسه أثناء فحوصات إمكانية الوصول/الاكتشاف. - يبقى
ssrfPolicy.allowPrivateNetworkمدعوماً كاسم مستعار قديم. - في الوضع الصارم، استخدم
ssrfPolicy.hostnameAllowlistوssrfPolicy.allowedHostnamesللاستثناءات الصريحة. - ملفات التعريف البعيدة مخصصة للإرفاق فقط (بدء/إيقاف/إعادة تعيين معطلة).
- يقبل
profiles.*.cdpUrlالقيمhttp://وhttps://وws://وwss://. استخدم HTTP(S) عندما تريد من OpenClaw اكتشاف/json/version؛ واستخدم WS(S) عندما يزوّدك موفّرك بعنوان URL مباشر لـ DevTools WebSocket. - ينطبق
remoteCdpTimeoutMsوremoteCdpHandshakeTimeoutMsعلى إمكانية الوصول إلى CDP البعيد وattachOnlyإضافةً إلى طلبات فتح علامات التبويب. تحتفظ ملفات تعريف loopback المُدارة بالإعدادات الافتراضية المحلية لـ CDP. - إذا كانت خدمة CDP مُدارة خارجياً ويمكن الوصول إليها عبر loopback، فعيّن
attachOnly: trueلذلك الملف التعريفي؛ وإلا فسيعامل OpenClaw منفذ loopback كملف تعريف متصفح محلي مُدار وقد يبلّغ عن أخطاء ملكية المنفذ المحلي. - تستخدم ملفات تعريف
existing-sessionChrome MCP بدلاً من CDP ويمكنها الإرفاق على المضيف المحدد أو عبر عقدة متصفح متصلة. - يمكن لملفات تعريف
existing-sessionتعيينuserDataDirلاستهداف ملف تعريف متصفح محدد قائم على Chromium مثل Brave أو Edge. - تحتفظ ملفات تعريف
existing-sessionبحدود مسار Chrome MCP الحالية: إجراءات مدفوعة باللقطة/المرجع بدلاً من استهداف محددات CSS، وخطافات رفع ملف واحد، ودون تجاوزات لمهلة الحوارات، ودونwait --load networkidle، ودونresponsebodyأو تصدير PDF أو اعتراض التنزيلات أو الإجراءات الدفعية. - تعيّن ملفات تعريف
openclawالمحلية المُدارةcdpPortوcdpUrlتلقائياً؛ عيّنcdpUrlصراحةً فقط لـ CDP البعيد. - يمكن لملفات التعريف المحلية المُدارة تعيين
executablePathلتجاوزbrowser.executablePathالعام لذلك الملف التعريفي. استخدم هذا لتشغيل ملف تعريف في Chrome وآخر في Brave. - تستخدم ملفات التعريف المحلية المُدارة
browser.localLaunchTimeoutMsلاكتشاف Chrome CDP HTTP بعد بدء العملية، وbrowser.localCdpReadyTimeoutMsلجاهزية websocket الخاصة بـ CDP بعد الإطلاق. ارفع القيمتين على المضيفين الأبطأ حيث يبدأ Chrome بنجاح لكن فحوصات الجاهزية تسبق بدء التشغيل. يجب أن تكون كلتا القيمتين أعداداً صحيحة موجبة حتى120000مللي ثانية؛ وترفض قيم الإعدادات غير الصالحة. - ترتيب الاكتشاف التلقائي: المتصفح الافتراضي إذا كان قائماً على Chromium → Chrome → Brave → Edge → Chromium → Chrome Canary.
- يقبل كل من
browser.executablePathوbrowser.profiles.<name>.executablePath~و~/...لدليل المنزل في نظام التشغيل لديك قبل تشغيل Chromium. كما يتم توسيع التلدة فيuserDataDirلكل ملف تعريف على ملفات تعريفexisting-session. - خدمة التحكم: loopback فقط (المنفذ مشتق من
gateway.port، الافتراضي18791). - يضيف
extraArgsأعلام تشغيل إضافية إلى بدء تشغيل Chromium المحلي (مثل--disable-gpuأو ضبط حجم النافذة أو أعلام التصحيح).
UI
{
ui: {
seamColor: "#FF4500",
assistant: {
name: "OpenClaw",
avatar: "CB", // emoji, short text, image URL, or data URI
},
},
}
seamColor: لون تمييز لإطار UI التطبيق الأصلي (تلوين فقاعة وضع التحدث، وما إلى ذلك).assistant: تجاوز هوية Control UI. يعود إلى هوية الوكيل النشط عند عدم التعيين.
Gateway
{
gateway: {
mode: "local", // local | remote
port: 18789,
bind: "loopback",
auth: {
mode: "token", // none | token | password | trusted-proxy
token: "your-token",
// password: "your-password", // or OPENCLAW_GATEWAY_PASSWORD
// trustedProxy: { userHeader: "x-forwarded-user" }, // for mode=trusted-proxy; see /gateway/trusted-proxy-auth
allowTailscale: true,
rateLimit: {
maxAttempts: 10,
windowMs: 60000,
lockoutMs: 300000,
exemptLoopback: true,
},
},
tailscale: {
mode: "off", // off | serve | funnel
resetOnExit: false,
},
controlUi: {
enabled: true,
basePath: "/openclaw",
// root: "dist/control-ui",
// embedSandbox: "scripts", // strict | scripts | trusted
// allowExternalEmbedUrls: false, // dangerous: allow absolute external http(s) embed URLs
// chatMessageMaxWidth: "min(1280px, 82%)", // optional grouped chat message max-width
// allowedOrigins: ["https://control.example.com"], // required for non-loopback Control UI
// dangerouslyAllowHostHeaderOriginFallback: false, // dangerous Host-header origin fallback mode
// allowInsecureAuth: false,
// dangerouslyDisableDeviceAuth: false,
},
remote: {
url: "ws://gateway.tailnet:18789",
transport: "ssh", // ssh | direct
token: "your-token",
// password: "your-password",
},
trustedProxies: ["10.0.0.1"],
// Optional. Default false.
allowRealIpFallback: false,
nodes: {
pairing: {
// Optional. Default unset/disabled.
autoApproveCidrs: ["192.168.1.0/24", "fd00:1234:5678::/64"],
},
allowCommands: ["canvas.navigate"],
denyCommands: ["system.run"],
},
tools: {
// Additional /tools/invoke HTTP denies
deny: ["browser"],
// Remove tools from the default HTTP deny list
allow: ["gateway"],
},
push: {
apns: {
relay: {
baseUrl: "https://relay.example.com",
timeoutMs: 10000,
},
},
},
},
}
تفاصيل حقول Gateway
mode:local(تشغيل Gateway) أوremote(الاتصال بـ Gateway بعيد). يرفض Gateway البدء ما لم تكن القيمةlocal.port: منفذ مفرد متعدد الاستخدامات لـ WS + HTTP. ترتيب الأولوية:--port>OPENCLAW_GATEWAY_PORT>gateway.port>18789.bind:autoأوloopback(افتراضي) أوlan(0.0.0.0) أوtailnet(عنوان IP الخاص بـ Tailscale فقط) أوcustom.- أسماء الربط المستعارة القديمة: استخدم قيم وضع الربط في
gateway.bind(auto،loopback،lan،tailnet،custom)، وليس أسماء المضيف المستعارة (0.0.0.0،127.0.0.1،localhost،::،::1). - ملاحظة Docker: يستمع ربط
loopbackالافتراضي على127.0.0.1داخل الحاوية. مع شبكة جسر Docker (-p 18789:18789)، تصل الحركة علىeth0، لذلك يتعذر الوصول إلى Gateway. استخدم--network host، أو اضبطbind: "lan"(أوbind: "custom"معcustomBindHost: "0.0.0.0") للاستماع على كل الواجهات. - المصادقة: مطلوبة افتراضيًا. تتطلب الروابط غير loopback مصادقة Gateway. عمليًا يعني ذلك رمزًا/كلمة مرور مشتركة أو وكيلًا عكسيًا واعيًا بالهوية مع
gateway.auth.mode: "trusted-proxy". ينشئ معالج الإعداد رمزًا افتراضيًا. - إذا كان كل من
gateway.auth.tokenوgateway.auth.passwordمكوّنًا (بما في ذلك SecretRefs)، فاضبطgateway.auth.modeصراحةً علىtokenأوpassword. تفشل تدفقات بدء التشغيل وتثبيت/إصلاح الخدمة عندما يكون كلاهما مكوّنًا ويكون الوضع غير مضبوط. gateway.auth.mode: "none": وضع صريح بلا مصادقة. استخدمه فقط لإعدادات local loopback الموثوقة؛ هذا لا يُعرض عمدًا في مطالبات الإعداد.gateway.auth.mode: "trusted-proxy": فوّض مصادقة المتصفح/المستخدم إلى وكيل عكسي واعٍ بالهوية وثِق بترويسات الهوية منgateway.trustedProxies(راجع مصادقة الوكيل الموثوق). يتوقع هذا الوضع مصدر وكيل غير loopback افتراضيًا؛ تتطلب الوكلاء العكسيون من نفس المضيف عبر loopback ضبطًا صريحًا لـgateway.auth.trustedProxy.allowLoopback = true. يمكن للمتصلين الداخليين من نفس المضيف استخدامgateway.auth.passwordكبديل مباشر محلي؛ يظلgateway.auth.tokenمتنافيًا مع وضع trusted-proxy.gateway.auth.allowTailscale: عندما تكونtrue، يمكن لترويسات هوية Tailscale Serve استيفاء مصادقة Control UI/WebSocket (يتم التحقق عبرtailscale whois). لا تستخدم نقاط نهاية HTTP API مصادقة ترويسة Tailscale هذه؛ بل تتبع وضع مصادقة HTTP العادي الخاص بـ Gateway بدلًا من ذلك. يفترض هذا التدفق بلا رموز أن مضيف Gateway موثوق. القيمة الافتراضية هيtrueعندما تكونtailscale.mode = "serve".gateway.auth.rateLimit: محدد اختياري لمحاولات المصادقة الفاشلة. يطبّق لكل عنوان IP عميل ولكل نطاق مصادقة (يتم تتبع shared-secret وdevice-token بشكل مستقل). ترجع المحاولات المحظورة429+Retry-After.- في مسار Control UI غير المتزامن عبر Tailscale Serve، تُسلسل المحاولات الفاشلة لنفس
{scope, clientIp}قبل كتابة الفشل. لذلك يمكن للمحاولات السيئة المتزامنة من العميل نفسه أن تُفعّل المحدد في الطلب الثاني بدلًا من أن تمر كلتاهما كعدم تطابق عادي. - القيمة الافتراضية لـ
gateway.auth.rateLimit.exemptLoopbackهيtrue؛ اضبطها علىfalseعندما تريد عمدًا تحديد معدل حركة localhost أيضًا (لإعدادات الاختبار أو نشر الوكلاء الصارم). - تتم دائمًا خنق محاولات مصادقة WS ذات أصل المتصفح مع تعطيل إعفاء loopback (دفاع معمّق ضد التخمين القسري المحلي عبر المتصفح).
- على loopback، تُعزل حالات القفل ذات أصل المتصفح هذه لكل قيمة
Originمطبّعة، لذلك لا تؤدي الإخفاقات المتكررة من أصل localhost واحد تلقائيًا إلى قفل أصل مختلف. tailscale.mode:serve(tailnet فقط، ربط loopback) أوfunnel(عام، يتطلب مصادقة).controlUi.allowedOrigins: قائمة سماح صريحة لأصول المتصفح لاتصالات Gateway WebSocket. مطلوبة عندما يُتوقع وجود عملاء متصفح من أصول غير loopback.controlUi.chatMessageMaxWidth: عرض أقصى اختياري لرسائل دردشة Control UI المجمعة. يقبل قيم عرض CSS مقيّدة مثل960pxو82%وmin(1280px, 82%)وcalc(100% - 2rem).controlUi.dangerouslyAllowHostHeaderOriginFallback: وضع خطير يفعّل الرجوع إلى أصل ترويسة Host لعمليات النشر التي تعتمد عمدًا على سياسة أصل ترويسة Host.remote.transport:ssh(افتراضي) أوdirect(ws/wss). بالنسبة إلىdirect، يجب أن تكونremote.urlهيws://أوwss://.OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1: تجاوز طارئ في بيئة عملية العميل يسمح باستخدامws://بنص صريح إلى عناوين IP موثوقة في الشبكة الخاصة؛ يظل الافتراضي مقصورًا على loopback فقط للنص الصريح. لا يوجد مكافئ فيopenclaw.json، ولا تؤثر إعدادات الشبكة الخاصة في المتصفح مثلbrowser.ssrfPolicy.dangerouslyAllowPrivateNetworkعلى عملاء Gateway WebSocket.gateway.remote.token/.passwordهي حقول بيانات اعتماد للعميل البعيد. لا تقوم بتهيئة مصادقة Gateway بحد ذاتها.gateway.push.apns.relay.baseUrl: عنوان URL أساسي عبر HTTPS للمرحل الخارجي لـ APNs الذي تستخدمه إصدارات iOS الرسمية/TestFlight بعد أن تنشر تسجيلات مدعومة بالمرحل إلى Gateway. يجب أن يطابق عنوان URL هذا عنوان URL للمرحل المضمّن في بناء iOS.gateway.push.apns.relay.timeoutMs: مهلة إرسال Gateway إلى المرحل بالمللي ثانية. القيمة الافتراضية10000.- تُفوّض التسجيلات المدعومة بالمرحل إلى هوية Gateway محددة. يجلب تطبيق iOS المقترن
gateway.identity.get، ويدرِج تلك الهوية في تسجيل المرحل، ويمرر منحة إرسال محددة بنطاق التسجيل إلى Gateway. لا يمكن لـ Gateway آخر إعادة استخدام ذلك التسجيل المخزن. OPENCLAW_APNS_RELAY_BASE_URL/OPENCLAW_APNS_RELAY_TIMEOUT_MS: تجاوزات env مؤقتة لإعداد المرحل أعلاه.OPENCLAW_APNS_RELAY_ALLOW_HTTP=true: منفذ خروج للتطوير فقط لعناوين URL الخاصة بمرحل HTTP عبر loopback. يجب أن تبقى عناوين URL لمرحلات الإنتاج على HTTPS.gateway.handshakeTimeoutMs: مهلة مصافحة Gateway WebSocket قبل المصادقة بالمللي ثانية. الافتراضي:15000. تكون لـOPENCLAW_HANDSHAKE_TIMEOUT_MSالأولوية عند ضبطها. زد هذه القيمة على المضيفين المحمّلين أو منخفضي القدرة حيث يمكن للعملاء المحليين الاتصال بينما لا يزال تمهيد بدء التشغيل يستقر.gateway.channelHealthCheckMinutes: فاصل مراقبة صحة القناة بالدقائق. اضبط0لتعطيل عمليات إعادة تشغيل مراقب الصحة عالميًا. الافتراضي:5.gateway.channelStaleEventThresholdMinutes: حد تقادم المقبس بالدقائق. أبقه أكبر من أو مساويًا لـgateway.channelHealthCheckMinutes. الافتراضي:30.gateway.channelMaxRestartsPerHour: الحد الأقصى لإعادات تشغيل مراقب الصحة لكل قناة/حساب في ساعة متحركة. الافتراضي:10.channels.<provider>.healthMonitor.enabled: تعطيل اختياري لكل قناة لإعادات تشغيل مراقب الصحة مع إبقاء المراقب العالمي مفعّلًا.channels.<provider>.accounts.<accountId>.healthMonitor.enabled: تجاوز لكل حساب للقنوات متعددة الحسابات. عند ضبطه، تكون له الأولوية على تجاوز مستوى القناة.- يمكن لمسارات استدعاء Gateway المحلية استخدام
gateway.remote.*كبديل فقط عندما يكونgateway.auth.*غير مضبوط. - إذا تم تكوين
gateway.auth.token/gateway.auth.passwordصراحةً عبر SecretRef ولم يتم حله، يفشل الحل بإغلاق آمن (من دون إخفاء بفعل بديل بعيد). trustedProxies: عناوين IP للوكلاء العكسيين التي تنهي TLS أو تضخ ترويسات العميل الممررة. أدرج فقط الوكلاء الذين تتحكم بهم. تظل إدخالات loopback صالحة لإعدادات الوكيل/الاكتشاف المحلي على نفس المضيف (مثل Tailscale Serve أو وكيل عكسي محلي)، لكنها لا تجعل طلبات loopback مؤهلة لـgateway.auth.mode: "trusted-proxy".allowRealIpFallback: عندما تكونtrue، يقبل GatewayX-Real-IPإذا كانX-Forwarded-Forمفقودًا. الافتراضيfalseلسلوك الفشل المغلق.gateway.nodes.pairing.autoApproveCidrs: قائمة سماح اختيارية بصيغة CIDR/IP للموافقة التلقائية على اقتران جهاز node لأول مرة بلا نطاقات مطلوبة. تكون معطلة عند عدم ضبطها. لا يوافق هذا تلقائيًا على اقتران المشغل/المتصفح/Control UI/WebChat، ولا يوافق تلقائيًا على ترقيات الدور أو النطاق أو البيانات الوصفية أو المفتاح العام.gateway.nodes.allowCommands/gateway.nodes.denyCommands: تشكيل عام للسماح/الرفض لأوامر node المعلنة بعد الاقتران وتقييم قائمة السماح الخاصة بالمنصة. استخدمallowCommandsللاشتراك في أوامر node الخطيرة مثلcamera.snapوcamera.clipوscreen.record؛ يزيلdenyCommandsأمرًا حتى لو كان افتراض المنصة أو السماح الصريح سيشمله بخلاف ذلك. بعد أن يغيّر node قائمة أوامره المعلنة، ارفض اقتران ذلك الجهاز وأعد الموافقة عليه حتى يخزن Gateway لقطة الأوامر المحدثة.gateway.tools.deny: أسماء أدوات إضافية محظورة لـ HTTPPOST /tools/invoke(توسّع قائمة الرفض الافتراضية).gateway.tools.allow: إزالة أسماء أدوات من قائمة رفض HTTP الافتراضية.
نقاط نهاية متوافقة مع OpenAI
- Chat Completions: معطلة افتراضيًا. فعّلها باستخدام
gateway.http.endpoints.chatCompletions.enabled: true. - Responses API:
gateway.http.endpoints.responses.enabled. - تقوية إدخال URL في Responses:
gateway.http.endpoints.responses.maxUrlPartsgateway.http.endpoints.responses.files.urlAllowlistgateway.http.endpoints.responses.images.urlAllowlistتُعامل قوائم السماح الفارغة كأنها غير مضبوطة؛ استخدمgateway.http.endpoints.responses.files.allowUrl=falseو/أوgateway.http.endpoints.responses.images.allowUrl=falseلتعطيل جلب URL.
- ترويسة اختيارية لتقوية الاستجابة:
gateway.http.securityHeaders.strictTransportSecurity(اضبطها فقط لأصول HTTPS التي تتحكم بها؛ راجع مصادقة الوكيل الموثوق)
عزل النسخ المتعددة
شغّل عدة Gateway على مضيف واحد بمنافذ ومجلدات حالة فريدة:
OPENCLAW_CONFIG_PATH=~/.openclaw/a.json \
OPENCLAW_STATE_DIR=~/.openclaw-a \
openclaw gateway --port 19001
أعلام ملائمة: --dev (يستخدم ~/.openclaw-dev + المنفذ 19001)، --profile <name> (يستخدم ~/.openclaw-<name>).
راجع عدة Gateway.
gateway.tls
{
gateway: {
tls: {
enabled: false,
autoGenerate: false,
certPath: "/etc/openclaw/tls/server.crt",
keyPath: "/etc/openclaw/tls/server.key",
caPath: "/etc/openclaw/tls/ca-bundle.crt",
},
},
}
enabled: يفعّل إنهاء TLS عند مستمع Gateway (HTTPS/WSS) (افتراضي:false).autoGenerate: ينشئ تلقائيًا زوج شهادة/مفتاح محليًا ذاتي التوقيع عندما لا تكون الملفات الصريحة مكوّنة؛ للاستخدام المحلي/التطوير فقط.certPath: مسار نظام الملفات إلى ملف شهادة TLS.keyPath: مسار نظام الملفات إلى ملف مفتاح TLS الخاص؛ أبقِ الأذونات مقيّدة.caPath: مسار اختياري لحزمة CA للتحقق من العملاء أو سلاسل الثقة المخصصة.
gateway.reload
{
gateway: {
reload: {
mode: "hybrid", // off | restart | hot | hybrid
debounceMs: 500,
deferralTimeoutMs: 300000,
},
},
}
mode: يتحكم في كيفية تطبيق تعديلات الإعدادات وقت التشغيل."off": تجاهل التعديلات الحية؛ تتطلب التغييرات إعادة تشغيل صريحة."restart": أعد تشغيل عملية Gateway دائمًا عند تغيير الإعدادات."hot": طبّق التغييرات داخل العملية دون إعادة تشغيل."hybrid"(افتراضي): جرّب إعادة التحميل الساخنة أولًا؛ ثم ارجع إلى إعادة التشغيل إذا لزم الأمر.
debounceMs: نافذة إزالة الارتداد بالمللي ثانية قبل تطبيق تغييرات الإعدادات (عدد صحيح غير سالب).deferralTimeoutMs: أقصى وقت اختياري بالمللي ثانية للانتظار حتى تنتهي العمليات الجارية قبل فرض إعادة تشغيل أو إعادة تحميل ساخنة للقناة. احذفه لاستخدام الانتظار المحدود الافتراضي (300000)؛ اضبطه على0للانتظار إلى أجل غير مسمى وتسجيل تحذيرات دورية بأن العمليات لا تزال معلقة.
الخطافات
{
hooks: {
enabled: true,
token: "shared-secret",
path: "/hooks",
maxBodyBytes: 262144,
defaultSessionKey: "hook:ingress",
allowRequestSessionKey: true,
allowedSessionKeyPrefixes: ["hook:", "hook:gmail:"],
allowedAgentIds: ["hooks", "main"],
presets: ["gmail"],
transformsDir: "~/.openclaw/hooks/transforms",
mappings: [
{
match: { path: "gmail" },
action: "agent",
agentId: "hooks",
wakeMode: "now",
name: "Gmail",
sessionKey: "hook:gmail:{{messages[0].id}}",
messageTemplate: "From: {{messages[0].from}}\nSubject: {{messages[0].subject}}\n{{messages[0].snippet}}",
deliver: true,
channel: "last",
model: "openai/gpt-5.4-mini",
},
],
},
}
المصادقة: Authorization: Bearer <token> أو x-openclaw-token: <token>.
يتم رفض رموز hook في سلسلة الاستعلام.
ملاحظات التحقق والسلامة:
- يتطلب
hooks.enabled=trueقيمة غير فارغة فيhooks.token. - يجب أن يكون
hooks.tokenمختلفًا عنgateway.auth.token؛ تتمّ إعادة استخدام رمز Gateway مرفوضة. - لا يمكن أن يكون
hooks.pathهو/؛ استخدم مسارًا فرعيًا مخصصًا مثل/hooks. - إذا كان
hooks.allowRequestSessionKey=true، فقيّدhooks.allowedSessionKeyPrefixes(مثلًا["hook:"]). - إذا كان تعيين أو إعداد مسبق يستخدم
sessionKeyبقالب، فاضبطhooks.allowedSessionKeyPrefixesوhooks.allowRequestSessionKey=true. لا تتطلب مفاتيح التعيين الثابتة هذا الاشتراك الصريح.
نقاط النهاية:
POST /hooks/wake→{ text, mode?: "now"|"next-heartbeat" }POST /hooks/agent→{ message, name?, agentId?, sessionKey?, wakeMode?, deliver?, channel?, to?, model?, thinking?, timeoutSeconds? }- لا يُقبل
sessionKeyمن حمولة الطلب إلا عندما يكونhooks.allowRequestSessionKey=true(الافتراضي:false).
- لا يُقبل
POST /hooks/<name>→ يتم حلّه عبرhooks.mappings- تُعامل قيم
sessionKeyالخاصة بالتعيين التي تم عرضها عبر القالب كقيم مقدمة خارجيًا وتتطلب أيضًاhooks.allowRequestSessionKey=true.
- تُعامل قيم
تفاصيل التعيين
- يطابق
match.pathالمسار الفرعي بعد/hooks(مثلًا/hooks/gmail→gmail). - يطابق
match.sourceحقلًا في الحمولة للمسارات العامة. - تقرأ القوالب مثل
{{messages[0].subject}}من الحمولة. - يمكن أن يشير
transformإلى وحدة JS/TS تعيد إجراء hook. - يجب أن يكون
transform.moduleمسارًا نسبيًا ويبقى داخلhooks.transformsDir(تُرفض المسارات المطلقة والتنقل عبر المسارات). - أبقِ
hooks.transformsDirضمن~/.openclaw/hooks/transforms؛ تُرفض أدلة Skills في مساحة العمل. إذا أبلغopenclaw doctorأن هذا المسار غير صالح، فانقل وحدة التحويل إلى دليل تحويلات hooks أو أزِلhooks.transformsDir. - يوجّه
agentIdإلى وكيل محدد؛ تعود المعرفات غير المعروفة إلى الافتراضي. allowedAgentIds: يقيّد التوجيه الصريح (*أو الحذف = السماح للجميع،[]= رفض الجميع).defaultSessionKey: مفتاح جلسة ثابت اختياري لتشغيل وكيل hook بدونsessionKeyصريح.allowRequestSessionKey: السماح لمستدعي/hooks/agentومفاتيح جلسات التعيين المعتمدة على القوالب بتعيينsessionKey(الافتراضي:false).allowedSessionKeyPrefixes: قائمة سماح اختيارية للبادئات لقيمsessionKeyالصريحة (الطلب + التعيين)، مثل["hook:"]. تصبح مطلوبة عندما يستخدم أي تعيين أو إعداد مسبقsessionKeyبقالب.- يرسل
deliver: trueالرد النهائي إلى قناة؛ تكون قيمةchannelالافتراضية هيlast. - يتجاوز
modelنموذج LLM لهذا تشغيل hook (يجب أن يكون مسموحًا إذا كان كتالوج النماذج مضبوطًا).
تكامل Gmail
- يستخدم الإعداد المسبق المضمّن لـ Gmail القيمة
sessionKey: "hook:gmail:{{messages[0].id}}". - إذا احتفظت بهذا التوجيه لكل رسالة، فاضبط
hooks.allowRequestSessionKey: trueوقيّدhooks.allowedSessionKeyPrefixesلتطابق مساحة أسماء Gmail، مثل["hook:", "hook:gmail:"]. - إذا كنت تحتاج إلى
hooks.allowRequestSessionKey: false، فتجاوز الإعداد المسبق باستخدامsessionKeyثابت بدلًا من الافتراضي ذي القالب.
{
hooks: {
gmail: {
account: "[email protected]",
topic: "projects/<project-id>/topics/gog-gmail-watch",
subscription: "gog-gmail-watch-push",
pushToken: "shared-push-token",
hookUrl: "http://127.0.0.1:18789/hooks/gmail",
includeBody: true,
maxBytes: 20000,
renewEveryMinutes: 720,
serve: { bind: "127.0.0.1", port: 8788, path: "/" },
tailscale: { mode: "funnel", path: "/gmail-pubsub" },
model: "openrouter/meta-llama/llama-3.3-70b-instruct:free",
thinking: "off",
},
},
}
- يبدأ Gateway تلقائيًا تشغيل
gog gmail watch serveعند الإقلاع عندما يكون مكوّنًا. اضبطOPENCLAW_SKIP_GMAIL_WATCHER=1للتعطيل. - لا تشغّل
gog gmail watch serveمنفصلًا بالتوازي مع Gateway.
مضيف Plugin Canvas
{
plugins: {
entries: {
canvas: {
config: {
host: {
root: "~/.openclaw/workspace/canvas",
liveReload: true,
// enabled: false, // or OPENCLAW_SKIP_CANVAS_HOST=1
},
},
},
},
},
}
- يقدّم HTML/CSS/JS قابلة للتحرير بواسطة الوكيل وA2UI عبر HTTP ضمن منفذ Gateway:
http://<gateway-host>:<gateway.port>/__openclaw__/canvas/http://<gateway-host>:<gateway.port>/__openclaw__/a2ui/
- محلي فقط: أبقِ
gateway.bind: "loopback"(الافتراضي). - الارتباطات غير loopback: تتطلب مسارات Canvas مصادقة Gateway (رمز/كلمة مرور/وكيل موثوق)، مثل أسطح HTTP الأخرى في Gateway.
- لا ترسل Node WebViews عادةً ترويسات المصادقة؛ بعد إقران node واتصاله، يعلن Gateway عن عناوين URL ذات صلاحية بنطاق node للوصول إلى Canvas/A2UI.
- ترتبط عناوين URL ذات الصلاحية بجلسة WS النشطة لـ node وتنتهي سريعًا. لا يُستخدم الرجوع الاحتياطي المستند إلى IP.
- يحقن عميل إعادة التحميل الحية في HTML المقدّم.
- ينشئ تلقائيًا ملف
index.htmlابتدائيًا عندما يكون فارغًا. - يقدّم أيضًا A2UI عند
/__openclaw__/a2ui/. - تتطلب التغييرات إعادة تشغيل Gateway.
- عطّل إعادة التحميل الحية للأدلة الكبيرة أو أخطاء
EMFILE.
الاكتشاف
mDNS (Bonjour)
{
discovery: {
mdns: {
mode: "minimal", // minimal | full | off
},
},
}
minimal(الافتراضي عندما يكون Pluginbonjourالمضمّن مفعّلًا): احذفcliPath+sshPortمن سجلات TXT.full: ضمّنcliPath+sshPort؛ ما زال إعلان البث المتعدد على LAN يتطلب تفعيل Pluginbonjourالمضمّن.off: يمنع إعلان البث المتعدد على LAN دون تغيير تفعيل Plugin.- يبدأ Plugin
bonjourالمضمّن تلقائيًا على مضيفي macOS ويكون اختياريًا على Linux وWindows وعمليات نشر Gateway ضمن الحاويات. - يكون اسم المضيف افتراضيًا هو اسم مضيف النظام عندما يكون تسمية DNS صالحة، مع الرجوع إلى
openclaw. تجاوز ذلك باستخدامOPENCLAW_MDNS_HOSTNAME.
النطاق الواسع (DNS-SD)
{
discovery: {
wideArea: { enabled: true },
},
}
يكتب منطقة DNS-SD أحادية البث ضمن ~/.openclaw/dns/. للاكتشاف عبر الشبكات، اقرنه بخادم DNS (يوصى بـ CoreDNS) + DNS مقسّم عبر Tailscale.
الإعداد: openclaw dns setup --apply.
البيئة
env (متغيرات البيئة المضمنة)
{
env: {
OPENROUTER_API_KEY: "sk-or-...",
vars: {
GROQ_API_KEY: "gsk-...",
},
shellEnv: {
enabled: true,
timeoutMs: 15000,
},
},
}
- تُطبَّق متغيرات البيئة المضمنة فقط إذا كانت بيئة العملية تفتقد المفتاح.
- ملفات
.env: ملف.envفي دليل العمل الحالي +~/.openclaw/.env(لا يتجاوز أي منهما المتغيرات الموجودة). shellEnv: يستورد المفاتيح المتوقعة المفقودة من ملف تعريف صدفة تسجيل الدخول لديك.- راجع البيئة لمعرفة الأسبقية الكاملة.
استبدال متغيرات البيئة
أشِر إلى متغيرات البيئة في أي سلسلة إعداد باستخدام ${VAR_NAME}:
{
gateway: {
auth: { token: "${OPENCLAW_GATEWAY_TOKEN}" },
},
}
- تُطابَق الأسماء المكتوبة بالأحرف الكبيرة فقط:
[A-Z_][A-Z0-9_]*. - تؤدي المتغيرات المفقودة/الفارغة إلى طرح خطأ عند تحميل الإعداد.
- استخدم
$${VAR}للإفلات والحصول على${VAR}حرفيًا. - يعمل مع
$include.
الأسرار
مراجع الأسرار إضافية: لا تزال القيم النصية الصريحة تعمل.
SecretRef
استخدم شكل كائن واحدًا:
{ source: "env" | "file" | "exec", provider: "default", id: "..." }
التحقق:
- نمط
provider: ^[a-z][a-z0-9_-]{0,63}$ - نمط معرّف
source: "env": ^[A-Z][A-Z0-9_]{0,127}$ - معرّف
source: "file": مؤشر JSON مطلق (مثلًا"/providers/openai/apiKey") - نمط معرّف
source: "exec": ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$ - يجب ألا تحتوي معرّفات
source: "exec"على مقاطع مسار مفصولة بشرطة مائلة هي.أو..(مثلًا يُرفَضa/../b)
سطح بيانات الاعتماد المدعوم
- المصفوفة القياسية: سطح بيانات اعتماد SecretRef
- يستهدف
secrets applyمسارات بيانات الاعتماد المدعومة فيopenclaw.json. - تُضمَّن مراجع
auth-profiles.jsonفي حل وقت التشغيل وتغطية التدقيق.
إعداد موفّري الأسرار
{
secrets: {
providers: {
default: { source: "env" }, // optional explicit env provider
filemain: {
source: "file",
path: "~/.openclaw/secrets.json",
mode: "json",
timeoutMs: 5000,
},
vault: {
source: "exec",
command: "/usr/local/bin/openclaw-vault-resolver",
passEnv: ["PATH", "VAULT_ADDR"],
},
},
defaults: {
env: "default",
file: "filemain",
exec: "vault",
},
},
}
ملاحظات:
- يدعم موفّر
fileالوضعmode: "json"والوضعmode: "singleValue"(يجب أن يكونidهو"value"في وضع singleValue). - تفشل مسارات موفّرَي الملفات والتنفيذ بإغلاق آمن عندما لا يتوفر تحقق Windows ACL. عيّن
allowInsecurePath: trueفقط للمسارات الموثوقة التي لا يمكن التحقق منها. - يتطلب موفّر
execمسارcommandمطلقًا ويستخدم حمولات البروتوكول عبر stdin/stdout. - افتراضيًا، تُرفَض مسارات الأوامر التي تكون روابط رمزية. عيّن
allowSymlinkCommand: trueللسماح بمسارات الروابط الرمزية مع التحقق من مسار الهدف المحلول. - إذا تم إعداد
trustedDirs، ينطبق فحص الدليل الموثوق على مسار الهدف المحلول. - تكون بيئة العملية الفرعية لـ
execفي حدها الأدنى افتراضيًا؛ مرّر المتغيرات المطلوبة صراحةً باستخدامpassEnv. - تُحل مراجع الأسرار في وقت التفعيل إلى لقطة داخل الذاكرة، ثم تقرأ مسارات الطلب اللقطة فقط.
- ينطبق ترشيح السطح النشط أثناء التفعيل: تفشل المراجع غير المحلولة على الأسطح الممكّنة في بدء التشغيل/إعادة التحميل، بينما تُتخطّى الأسطح غير النشطة مع تشخيصات.
تخزين المصادقة
{
auth: {
profiles: {
"anthropic:default": { provider: "anthropic", mode: "api_key" },
"anthropic:work": { provider: "anthropic", mode: "api_key" },
"openai-codex:personal": { provider: "openai-codex", mode: "oauth" },
},
order: {
anthropic: ["anthropic:default", "anthropic:work"],
"openai-codex": ["openai-codex:personal"],
},
},
}
- تُخزَّن الملفات التعريفية لكل وكيل في
<agentDir>/auth-profiles.json. - يدعم
auth-profiles.jsonمراجع على مستوى القيمة (keyRefلـapi_key، وtokenRefلـtoken) لأوضاع بيانات الاعتماد الثابتة. - خرائط
auth-profiles.jsonالمسطحة القديمة مثل{ "provider": { "apiKey": "..." } }ليست صيغة وقت تشغيل؛ يعيدopenclaw doctor --fixكتابتها إلى ملفات تعريف مفاتيح API قياسية بصيغةprovider:defaultمع نسخة احتياطية.legacy-flat.*.bak. - لا تدعم الملفات التعريفية بوضع OAuth (
auth.profiles.<id>.mode = "oauth") بيانات اعتماد ملف تعريف مصادقة مدعومة بـ SecretRef. - تأتي بيانات اعتماد وقت التشغيل الثابتة من لقطات محلولة داخل الذاكرة؛ وتُزال إدخالات
auth.jsonالثابتة القديمة عند اكتشافها. - تُستورَد بيانات OAuth القديمة من
~/.openclaw/credentials/oauth.json. - راجع OAuth.
- سلوك وقت تشغيل الأسرار وأدوات
audit/configure/apply: إدارة الأسرار.
auth.cooldowns
{
auth: {
cooldowns: {
billingBackoffHours: 5,
billingBackoffHoursByProvider: { anthropic: 3, openai: 8 },
billingMaxHours: 24,
authPermanentBackoffMinutes: 10,
authPermanentMaxMinutes: 60,
failureWindowHours: 24,
overloadedProfileRotations: 1,
overloadedBackoffMs: 0,
rateLimitedProfileRotations: 1,
},
},
}
billingBackoffHours: مدة التراجع الأساسية بالساعات عندما يفشل ملف تعريف بسبب أخطاء فوترة/عدم كفاية رصيد حقيقية (الافتراضي:5). يمكن أن يندرج نص الفوترة الصريح هنا حتى في استجابات401/403، لكن مطابقات النص الخاصة بالمزود تبقى محصورة في المزود الذي يملكها (مثل OpenRouterKey limit exceeded). أما رسائل HTTP402القابلة لإعادة المحاولة المتعلقة بنافذة الاستخدام أو حد إنفاق المؤسسة/مساحة العمل، فتبقى في مسارrate_limitبدلا من ذلك.billingBackoffHoursByProvider: تجاوزات اختيارية لكل مزود لساعات تراجع الفوترة.billingMaxHours: الحد الأقصى بالساعات لنمو تراجع الفوترة الأسي (الافتراضي:24).authPermanentBackoffMinutes: مدة التراجع الأساسية بالدقائق لإخفاقاتauth_permanentعالية الثقة (الافتراضي:10).authPermanentMaxMinutes: الحد الأقصى بالدقائق لنمو تراجعauth_permanent(الافتراضي:60).failureWindowHours: نافذة متحركة بالساعات مستخدمة لعدادات التراجع (الافتراضي:24).overloadedProfileRotations: الحد الأقصى لتبديلات ملفات تعريف المصادقة ضمن المزود نفسه لأخطاء التحميل الزائد قبل الانتقال إلى احتياطي النموذج (الافتراضي:1). تندرج هنا الأشكال التي تشير إلى انشغال المزود مثلModelNotReadyException.overloadedBackoffMs: تأخير ثابت قبل إعادة محاولة تبديل مزود/ملف تعريف محمل بشكل زائد (الافتراضي:0).rateLimitedProfileRotations: الحد الأقصى لتبديلات ملفات تعريف المصادقة ضمن المزود نفسه لأخطاء حد المعدل قبل الانتقال إلى احتياطي النموذج (الافتراضي:1). تشمل حاوية حد المعدل هذه نصوصا بصياغة المزود مثلToo many concurrent requestsوThrottlingExceptionوconcurrency limit reachedوworkers_ai ... quota limit exceededوresource exhausted.
التسجيل
{
logging: {
level: "info",
file: "/tmp/openclaw/openclaw.log",
consoleLevel: "info",
consoleStyle: "pretty", // pretty | compact | json
redactSensitive: "tools", // off | tools
redactPatterns: ["\\bTOKEN\\b\\s*[=:]\\s*([\"']?)([^\\s\"']+)\\1"],
},
}
- ملف السجل الافتراضي:
/tmp/openclaw/openclaw-YYYY-MM-DD.log. - عيّن
logging.fileلمسار ثابت. - يرتفع
consoleLevelإلىdebugعند استخدام--verbose. maxFileBytes: الحد الأقصى لحجم ملف السجل النشط بالبايت قبل التدوير (عدد صحيح موجب؛ الافتراضي:104857600= 100 MB). يحتفظ OpenClaw بما يصل إلى خمسة أرشيفات مرقمة بجانب الملف النشط.redactSensitive/redactPatterns: إخفاء بأفضل جهد لمخرجات وحدة التحكم، وسجلات الملفات، وسجلات OTLP، ونصوص محاضر الجلسات المحفوظة. يعطلredactSensitive: "off"سياسة السجلات/المحاضر العامة هذه فقط؛ أما أسطح أمان الواجهة/الأدوات/التشخيصات فما زالت تحجب الأسرار قبل الإرسال.
التشخيصات
{
diagnostics: {
enabled: true,
flags: ["telegram.*"],
stuckSessionWarnMs: 30000,
stuckSessionAbortMs: 600000,
otel: {
enabled: false,
endpoint: "https://otel-collector.example.com:4318",
tracesEndpoint: "https://traces.example.com/v1/traces",
metricsEndpoint: "https://metrics.example.com/v1/metrics",
logsEndpoint: "https://logs.example.com/v1/logs",
protocol: "http/protobuf", // http/protobuf | grpc
headers: { "x-tenant-id": "my-org" },
serviceName: "openclaw-gateway",
traces: true,
metrics: true,
logs: false,
sampleRate: 1.0,
flushIntervalMs: 5000,
captureContent: {
enabled: false,
inputMessages: false,
outputMessages: false,
toolInputs: false,
toolOutputs: false,
systemPrompt: false,
},
},
cacheTrace: {
enabled: false,
filePath: "~/.openclaw/logs/cache-trace.jsonl",
includeMessages: true,
includePrompt: true,
includeSystem: true,
},
},
}
enabled: مفتاح التفعيل الرئيسي لمخرجات القياس (الافتراضي:true).flags: مصفوفة من سلاسل العلامات لتمكين مخرجات سجلات مستهدفة (تدعم أحرف البدل مثل"telegram.*"أو"*").stuckSessionWarnMs: عتبة عمر عدم التقدم بالميلي ثانية لتصنيف جلسات المعالجة طويلة التشغيل كـsession.long_runningأوsession.stalledأوsession.stuck. تعيد الردود والأدوات والحالة والكتل وتقدم ACP ضبط المؤقت؛ وتتراجع تشخيصاتsession.stuckالمتكررة ما دامت بلا تغيير.stuckSessionAbortMs: عتبة عمر عدم التقدم بالميلي ثانية قبل أن يصبح العمل النشط المتوقف المؤهل قابلا للإجهاض والتفريغ للاسترداد. عند عدم تعيينها، يستخدم OpenClaw نافذة تشغيل مضمنة ممتدة أكثر أمانا لا تقل عن 10 دقائق و5 أضعافstuckSessionWarnMs.otel.enabled: يفعّل مسار تصدير OpenTelemetry (الافتراضي:false). للاطلاع على الإعداد الكامل، وفهرس الإشارات، ونموذج الخصوصية، راجع تصدير OpenTelemetry.otel.endpoint: عنوان URL للمجمّع الخاص بتصدير OTel.otel.tracesEndpoint/otel.metricsEndpoint/otel.logsEndpoint: نقاط نهاية OTLP اختيارية خاصة بكل إشارة. عند تعيينها، تتجاوزotel.endpointلتلك الإشارة فقط.otel.protocol:"http/protobuf"(الافتراضي) أو"grpc".otel.headers: ترويسات بيانات وصفية إضافية لـ HTTP/gRPC ترسل مع طلبات تصدير OTel.otel.serviceName: اسم الخدمة لسمات المورد.otel.traces/otel.metrics/otel.logs: تمكين تصدير الآثار أو المقاييس أو السجلات.otel.sampleRate: معدل أخذ عينات الآثار من0إلى1.otel.flushIntervalMs: فاصل تفريغ القياسات الدورية بالميلي ثانية.otel.captureContent: التقاط محتوى خام اختياري لسمات امتداد OTEL. يكون معطلا افتراضيا. تلتقط القيمة المنطقيةtrueمحتوى الرسائل/الأدوات غير النظامي؛ ويتيح شكل الكائن تمكينinputMessagesوoutputMessagesوtoolInputsوtoolOutputsوsystemPromptصراحة.OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental: مفتاح بيئة لسمات مزود امتدادات GenAI التجريبية الأحدث. افتراضيا، تحتفظ الامتدادات بسمةgen_ai.systemالقديمة للتوافق؛ وتستخدم مقاييس GenAI سمات دلالية محدودة.OPENCLAW_OTEL_PRELOADED=1: مفتاح بيئة للمضيفين الذين سجلوا مسبقا OpenTelemetry SDK عاما. عندها يتخطى OpenClaw بدء/إيقاف SDK المملوك للـ Plugin مع إبقاء مستمعي التشخيص نشطين.OTEL_EXPORTER_OTLP_TRACES_ENDPOINTوOTEL_EXPORTER_OTLP_METRICS_ENDPOINTوOTEL_EXPORTER_OTLP_LOGS_ENDPOINT: متغيرات بيئة لنقاط نهاية خاصة بكل إشارة تستخدم عند عدم تعيين مفتاح الإعداد المطابق.cacheTrace.enabled: تسجيل لقطات تتبع الذاكرة المخبئية للتشغيلات المضمنة (الافتراضي:false).cacheTrace.filePath: مسار إخراج JSONL لتتبع الذاكرة المخبئية (الافتراضي:$OPENCLAW_STATE_DIR/logs/cache-trace.jsonl).cacheTrace.includeMessages/includePrompt/includeSystem: تتحكم فيما يدرج في مخرجات تتبع الذاكرة المخبئية (كلها افتراضيا:true).
التحديث
{
update: {
channel: "stable", // stable | beta | dev
checkOnStart: true,
auto: {
enabled: false,
stableDelayHours: 6,
stableJitterHours: 12,
betaCheckIntervalHours: 1,
},
},
}
channel: قناة الإصدار لتثبيتات npm/git -"stable"أو"beta"أو"dev".checkOnStart: التحقق من تحديثات npm عند بدء Gateway (الافتراضي:true).auto.enabled: تمكين التحديث التلقائي في الخلفية لتثبيتات الحزمة (الافتراضي:false).auto.stableDelayHours: الحد الأدنى للتأخير بالساعات قبل تطبيق التحديث التلقائي لقناة stable (الافتراضي:6؛ الحد الأقصى:168).auto.stableJitterHours: نافذة توزيع إضافية بالساعات لطرح قناة stable (الافتراضي:12؛ الحد الأقصى:168).auto.betaCheckIntervalHours: عدد مرات تشغيل فحوصات قناة beta بالساعات (الافتراضي:1؛ الحد الأقصى:24).
ACP
{
acp: {
enabled: true,
dispatch: { enabled: true },
backend: "acpx",
defaultAgent: "main",
allowedAgents: ["main", "ops"],
maxConcurrentSessions: 10,
stream: {
coalesceIdleMs: 50,
maxChunkChars: 1000,
repeatSuppression: true,
deliveryMode: "live", // live | final_only
hiddenBoundarySeparator: "paragraph", // none | space | newline | paragraph
maxOutputChars: 50000,
maxSessionUpdateChars: 500,
},
runtime: {
ttlMinutes: 30,
},
},
}
enabled: بوابة ميزة ACP العامة (الافتراضي:true؛ عيّنfalseلإخفاء إرسال ACP وإمكانات الإنشاء).dispatch.enabled: بوابة مستقلة لإرسال أدوار جلسات ACP (الافتراضي:true). عيّنfalseلإبقاء أوامر ACP متاحة مع حظر التنفيذ.backend: معرّف واجهة تشغيل ACP الافتراضية (يجب أن يطابق Plugin تشغيل ACP مسجلا). ثبّت Plugin الواجهة أولا، وإذا كانplugins.allowمعينا، فأدرج معرّف Plugin الواجهة (مثلacpx) وإلا فلن يتم تحميل واجهة ACP.defaultAgent: معرّف وكيل ACP الاحتياطي عندما لا تحدد عمليات الإنشاء هدفا صريحا.allowedAgents: قائمة سماح لمعرّفات الوكلاء المسموح بها لجلسات تشغيل ACP؛ الفارغة تعني عدم وجود قيد إضافي.maxConcurrentSessions: الحد الأقصى لجلسات ACP النشطة بالتزامن.stream.coalesceIdleMs: نافذة تفريغ الخمول بالميلي ثانية للنص المتدفق.stream.maxChunkChars: الحد الأقصى لحجم القطعة قبل تقسيم إسقاط الكتلة المتدفقة.stream.repeatSuppression: كتم أسطر الحالة/الأداة المتكررة لكل دور (الافتراضي:true).stream.deliveryMode: يبث"live"تدريجيا؛ وتخزن"final_only"مؤقتا حتى أحداث نهاية الدور.stream.hiddenBoundarySeparator: الفاصل قبل النص المرئي بعد أحداث الأدوات المخفية (الافتراضي:"paragraph").stream.maxOutputChars: الحد الأقصى لأحرف مخرجات المساعد المسقطة لكل دور ACP.stream.maxSessionUpdateChars: الحد الأقصى للأحرف لأسطر حالة/تحديث ACP المسقطة.stream.tagVisibility: سجل لأسماء الوسوم إلى تجاوزات رؤية منطقية للأحداث المتدفقة.runtime.ttlMinutes: مدة TTL للخمول بالدقائق لعمال جلسات ACP قبل أن تصبح مؤهلة للتنظيف.runtime.installCommand: أمر تثبيت اختياري لتشغيله عند تهيئة بيئة تشغيل ACP.
CLI
{
cli: {
banner: {
taglineMode: "off", // random | default | off
},
},
}
- يتحكم
cli.banner.taglineModeفي نمط عبارة اللافتة:"random"(الافتراضي): عبارات متناوبة طريفة/موسمية."default": عبارة حيادية ثابتة (All your chats, one OpenClaw.)."off": لا يوجد نص عبارة (يبقى عنوان/إصدار اللافتة معروضا).
- لإخفاء اللافتة بالكامل (وليس العبارات فقط)، عيّن متغير البيئة
OPENCLAW_HIDE_BANNER=1.
المعالج
بيانات وصفية يكتبها CLI لتدفقات الإعداد الموجهة (onboard وconfigure وdoctor):
{
wizard: {
lastRunAt: "2026-01-01T00:00:00.000Z",
lastRunVersion: "2026.1.4",
lastRunCommit: "abc1234",
lastRunCommand: "configure",
lastRunMode: "local",
},
}
الهوية
راجع حقول الهوية agents.list ضمن افتراضيات الوكيل.
الجسر (قديم، أزيل)
لم تعد الإصدارات الحالية تتضمن جسر TCP. تتصل Nodes عبر WebSocket الخاص بـ Gateway. لم تعد مفاتيح bridge.* جزءا من مخطط الإعداد (يفشل التحقق حتى تزال؛ يمكن لـ openclaw doctor --fix إزالة المفاتيح غير المعروفة).
إعداد الجسر القديم (مرجع تاريخي)
{
"bridge": {
"enabled": true,
"port": 18790,
"bind": "tailnet",
"tls": {
"enabled": true,
"autoGenerate": true
}
}
}
Cron
{
cron: {
enabled: true,
maxConcurrentRuns: 2, // cron dispatch + isolated cron agent-turn execution
webhook: "https://example.invalid/legacy", // deprecated fallback for stored notify:true jobs
webhookToken: "replace-with-dedicated-token", // optional bearer token for outbound webhook auth
sessionRetention: "24h", // duration string or false
runLog: {
maxBytes: "2mb", // default 2_000_000 bytes
keepLines: 2000, // default 2000
},
},
}
sessionRetention: مدة الاحتفاظ بجلسات تشغيل Cron المعزولة المكتملة قبل تقليمها منsessions.json. يتحكم أيضا في تنظيف نصوص Cron المؤرشفة المحذوفة. الافتراضي:24h؛ اضبطه علىfalseللتعطيل.runLog.maxBytes: الحجم الأقصى لكل ملف سجل تشغيل (cron/runs/<jobId>.jsonl) قبل التقليم. الافتراضي:2_000_000بايت.runLog.keepLines: أحدث الأسطر المحتفظ بها عند تشغيل تقليم سجل التشغيل. الافتراضي:2000.webhookToken: رمز الحامل المستخدم لتسليم طلبات POST عبر Webhook الخاصة بـ Cron (delivery.mode = "webhook")، وإذا حُذف فلن يُرسَل أي ترويسة مصادقة.webhook: عنوان URL احتياطي قديم ومهمل لـ Webhook (http/https) يُستخدم فقط للمهام المخزنة التي ما زالت تحتوي علىnotify: true.
cron.retry
{
cron: {
retry: {
maxAttempts: 3,
backoffMs: [30000, 60000, 300000],
retryOn: ["rate_limit", "overloaded", "network", "timeout", "server_error"],
},
},
}
maxAttempts: الحد الأقصى لإعادات المحاولة للمهام أحادية التشغيل عند حدوث أخطاء عابرة (الافتراضي:3؛ النطاق:0-10).backoffMs: مصفوفة تأخيرات التراجع بالمللي ثانية لكل محاولة إعادة (الافتراضي:[30000, 60000, 300000]؛ من 1 إلى 10 مدخلات).retryOn: أنواع الأخطاء التي تشغل إعادات المحاولة -"rate_limit"،"overloaded"،"network"،"timeout"،"server_error". احذفها لإعادة محاولة كل الأنواع العابرة.
ينطبق فقط على مهام Cron أحادية التشغيل. تستخدم المهام المتكررة معالجة فشل منفصلة.
cron.failureAlert
{
cron: {
failureAlert: {
enabled: false,
after: 3,
cooldownMs: 3600000,
includeSkipped: false,
mode: "announce",
accountId: "main",
},
},
}
enabled: تمكين تنبيهات الفشل لمهام Cron (الافتراضي:false).after: عدد حالات الفشل المتتالية قبل إطلاق تنبيه (عدد صحيح موجب، الحد الأدنى:1).cooldownMs: الحد الأدنى بالمللي ثانية بين التنبيهات المتكررة للوظيفة نفسها (عدد صحيح غير سالب).includeSkipped: احتساب عمليات التشغيل المتخطاة المتتالية ضمن عتبة التنبيه (الافتراضي:false). تُتبع عمليات التشغيل المتخطاة بشكل منفصل ولا تؤثر في تراجع أخطاء التنفيذ.mode: وضع التسليم -"announce"يرسل عبر رسالة قناة؛"webhook"ينشر إلى Webhook المكون.accountId: حساب اختياري أو معرف قناة اختياري لتقييد نطاق تسليم التنبيه.
cron.failureDestination
{
cron: {
failureDestination: {
mode: "announce",
channel: "last",
to: "channel:C1234567890",
accountId: "main",
},
},
}
- الوجهة الافتراضية لإشعارات فشل Cron عبر كل المهام.
mode:"announce"أو"webhook"؛ يكون الافتراضي"announce"عند توفر بيانات هدف كافية.channel: تجاوز القناة لتسليم الإعلان. يعيد"last"استخدام آخر قناة تسليم معروفة.to: هدف إعلان صريح أو عنوان URL لـ Webhook. مطلوب لوضع Webhook.accountId: تجاوز اختياري للحساب من أجل التسليم.- يتجاوز
delivery.failureDestinationالخاص بكل مهمة هذا الافتراضي العام. - عندما لا تُضبط وجهة فشل عامة ولا وجهة خاصة بالمهمة، تعود المهام التي تسلم بالفعل عبر
announceإلى هدف الإعلان الأساسي ذلك عند الفشل. - لا يُدعم
delivery.failureDestinationإلا للمهام ذاتsessionTarget="isolated"ما لم يكنdelivery.modeالأساسي للمهمة هو"webhook".
راجع مهام Cron. تُتتبع عمليات تنفيذ Cron المعزولة بوصفها مهام خلفية.
متغيرات قالب نموذج الوسائط
تُوسَّع عناصر نائبة القالب في tools.media.models[].args:
| المتغير | الوصف |
|---|---|
{{Body}} |
نص الرسالة الواردة الكامل |
{{RawBody}} |
النص الخام (بلا مغلفات السجل/المرسل) |
{{BodyStripped}} |
النص بعد إزالة إشارات المجموعة |
{{From}} |
معرف المرسل |
{{To}} |
معرف الوجهة |
{{MessageSid}} |
معرف رسالة القناة |
{{SessionId}} |
UUID للجلسة الحالية |
{{IsNewSession}} |
"true" عند إنشاء جلسة جديدة |
{{MediaUrl}} |
عنوان URL زائف للوسائط الواردة |
{{MediaPath}} |
مسار الوسائط المحلي |
{{MediaType}} |
نوع الوسائط (صورة/صوت/مستند/…) |
{{Transcript}} |
نص تفريغ الصوت |
{{Prompt}} |
موجّه الوسائط المحلول لمدخلات CLI |
{{MaxChars}} |
الحد الأقصى المحلول لأحرف الإخراج لمدخلات CLI |
{{ChatType}} |
"direct" أو "group" |
{{GroupSubject}} |
موضوع المجموعة (بأفضل جهد) |
{{GroupMembers}} |
معاينة أعضاء المجموعة (بأفضل جهد) |
{{SenderName}} |
اسم عرض المرسل (بأفضل جهد) |
{{SenderE164}} |
رقم هاتف المرسل (بأفضل جهد) |
{{Provider}} |
تلميح المزود (WhatsApp، Telegram، Discord، إلخ) |
تضمينات التكوين ($include)
قسّم التكوين إلى ملفات متعددة:
// ~/.openclaw/openclaw.json
{
gateway: { port: 18789 },
agents: { $include: "./agents.json5" },
broadcast: {
$include: ["./clients/mueller.json5", "./clients/schmidt.json5"],
},
}
سلوك الدمج:
- ملف واحد: يستبدل الكائن المحتوي.
- مصفوفة ملفات: تُدمج بعمق بالترتيب (اللاحق يتجاوز السابق).
- المفاتيح الشقيقة: تُدمج بعد التضمينات (تتجاوز القيم المضمنة).
- التضمينات المتداخلة: حتى 10 مستويات عمق.
- المسارات: تُحل نسبة إلى الملف الذي يتضمنها، لكن يجب أن تبقى داخل دليل التكوين الأعلى مستوى (
dirnameمنopenclaw.json). يُسمح بالصيغ المطلقة/../فقط عندما تظل تُحل داخل ذلك الحد. - الكتابات المملوكة لـ OpenClaw التي تغير قسما واحدا فقط من المستوى الأعلى ومدعوما بتضمين ملف واحد تكتب عبر ذلك الملف المضمن. على سبيل المثال، يحدّث
plugins installقيمةplugins: { $include: "./plugins.json5" }فيplugins.json5ويتركopenclaw.jsonسليما. - تضمينات الجذر، ومصفوفات التضمين، والتضمينات ذات التجاوزات الشقيقة للقراءة فقط للكتابات المملوكة لـ OpenClaw؛ تفشل تلك الكتابات بشكل مغلق بدلا من تسطيح التكوين.
- الأخطاء: رسائل واضحة للملفات المفقودة، وأخطاء التحليل، والتضمينات الدائرية.
ذو صلة: التكوين · أمثلة التكوين · Doctor