From a08831cae3eec377b6d070228da2b402c18abc2b Mon Sep 17 00:00:00 2001 From: "openclaw-docs-i18n[bot]" Date: Mon, 13 Apr 2026 07:32:49 +0000 Subject: [PATCH] chore(i18n): refresh ar translations --- docs/ar/concepts/model-providers.md | 614 ++++++++--------- docs/ar/concepts/qa-e2e-automation.md | 130 ++-- docs/ar/gateway/local-models.md | 89 ++- docs/ar/help/testing.md | 912 ++++++++++++++------------ docs/ar/providers/index.md | 49 +- docs/ar/providers/lmstudio.md | 163 +++++ docs/ar/reference/api-usage-costs.md | 197 +++--- 7 files changed, 1206 insertions(+), 948 deletions(-) create mode 100644 docs/ar/providers/lmstudio.md diff --git a/docs/ar/concepts/model-providers.md b/docs/ar/concepts/model-providers.md index e92ed7dee..7eb0e2242 100644 --- a/docs/ar/concepts/model-providers.md +++ b/docs/ar/concepts/model-providers.md @@ -1,14 +1,14 @@ --- read_when: - - أنت بحاجة إلى مرجع لإعداد النماذج لكل موفّر على حدة - - أنت تريد إعدادات تهيئة نموذجية أو أوامر تهيئة عبر CLI لموفّري النماذج -summary: نظرة عامة على موفّر النماذج مع إعدادات تهيئة نموذجية + تدفقات CLI + - تحتاج إلى مرجع لإعداد النماذج لكل موفّر على حدة + - تريد أمثلة على الإعدادات أو أوامر الإعداد عبر CLI لموفّري النماذج +summary: نظرة عامة على موفّر النموذج مع أمثلة على الإعدادات وتدفّقات CLI title: موفّرو النماذج x-i18n: - generated_at: "2026-04-11T02:44:25Z" + generated_at: "2026-04-13T07:28:50Z" model: gpt-5.4 provider: openai - source_hash: 910ea7895e74c03910757d9d3e02825754b779b204eca7275b28422647ed0151 + source_hash: 66ba688c4b4366eec07667571e835d4cfeee684896e2ffae11d601b5fa0a4b98 source_path: concepts/model-providers.md workflow: 15 --- @@ -16,270 +16,262 @@ x-i18n: # موفّرو النماذج تغطي هذه الصفحة **موفّري LLM/النماذج** (وليس قنوات الدردشة مثل WhatsApp/Telegram). -للاطلاع على قواعد اختيار النموذج، راجع [/concepts/models](/ar/concepts/models). +للاطلاع على قواعد اختيار النماذج، راجع [/concepts/models](/ar/concepts/models). ## القواعد السريعة - تستخدم مراجع النماذج الصيغة `provider/model` (مثال: `opencode/claude-opus-4-6`). -- إذا قمت بتعيين `agents.defaults.models`، فسيصبح قائمة السماح. -- أدوات CLI المساعدة: `openclaw onboard` و`openclaw models list` و`openclaw models set `. -- قواعد وقت التشغيل الاحتياطية، وفحوصات التهدئة، واستمرارية تجاوزات الجلسة +- إذا قمت بتعيين `agents.defaults.models`، فستصبح قائمة السماح. +- مساعدات CLI: `openclaw onboard` و `openclaw models list` و `openclaw models set `. +- قواعد التشغيل الاحتياطي في وقت التشغيل، وفحوصات فترة التهدئة، واستمرارية تجاوزات الجلسات موثقة في [/concepts/model-failover](/ar/concepts/model-failover). -- `models.providers.*.models[].contextWindow` هي بيانات تعريف النموذج الأصلية؛ - و`models.providers.*.models[].contextTokens` هو الحد الفعلي في وقت التشغيل. -- يمكن لإضافات الموفّرين حقن فهارس النماذج عبر `registerProvider({ catalog })`؛ +- يمثّل `models.providers.*.models[].contextWindow` بيانات تعريف النموذج الأصلية؛ + بينما يمثّل `models.providers.*.models[].contextTokens` الحد الفعّال في وقت التشغيل. +- يمكن لإضافات الموفّر حقن فهارس النماذج عبر `registerProvider({ catalog })`؛ ويقوم OpenClaw بدمج هذا الناتج في `models.providers` قبل كتابة `models.json`. -- يمكن لبيانات تعريف الموفّر التصريحية إعلان `providerAuthEnvVars` و - `providerAuthAliases` بحيث لا تحتاج فحوصات المصادقة العامة المعتمدة على - متغيرات البيئة ومتغيرات الموفّر إلى تحميل وقت تشغيل الإضافة. وأصبحت خريطة - متغيرات البيئة الأساسية المتبقية الآن مخصصة فقط للموفّرين غير القائمين على - الإضافات/الأساسيين وبعض حالات الأولوية العامة القليلة مثل إعداد Anthropic - الذي يفضّل مفتاح API أولًا. -- يمكن لإضافات الموفّرين أيضًا امتلاك سلوك وقت تشغيل الموفّر عبر - `normalizeModelId` و`normalizeTransport` و`normalizeConfig` و - `applyNativeStreamingUsageCompat` و`resolveConfigApiKey` و - `resolveSyntheticAuth` و`shouldDeferSyntheticProfileAuth` و - `resolveDynamicModel` و`prepareDynamicModel` و - `normalizeResolvedModel` و`contributeResolvedModelCompat` و - `capabilities` و`normalizeToolSchemas` و - `inspectToolSchemas` و`resolveReasoningOutputMode` و - `prepareExtraParams` و`createStreamFn` و`wrapStreamFn` و - `resolveTransportTurnState` و`resolveWebSocketSessionPolicy` و - `createEmbeddingProvider` و`formatApiKey` و`refreshOAuth` و - `buildAuthDoctorHint` و - `matchesContextOverflowError` و`classifyFailoverReason` و - `isCacheTtlEligible` و`buildMissingAuthMessage` و`suppressBuiltInModel` و - `augmentModelCatalog` و`isBinaryThinking` و`supportsXHighThinking` و - `resolveDefaultThinkingLevel` و`applyConfigDefaults` و`isModernModelRef` و - `prepareRuntimeAuth` و`resolveUsageAuth` و`fetchUsageSnapshot` و +- يمكن لبيانات تعريف الموفّر التصريحية الإعلان عن `providerAuthEnvVars` و + `providerAuthAliases` بحيث لا تحتاج فحوصات المصادقة العامة المعتمدة على المتغيرات البيئية ومتغيرات الموفّر + إلى تحميل وقت تشغيل الإضافة. أصبحت خريطة متغيرات البيئة الأساسية المتبقية الآن + مخصّصة فقط للموفّرين غير المعتمدين على الإضافات/الأساسيين وبعض حالات الأسبقية العامة + مثل إعداد Anthropic الذي يعطي أولوية لمفتاح API. +- يمكن لإضافات الموفّر أيضًا امتلاك سلوك وقت تشغيل الموفّر عبر + `normalizeModelId` و `normalizeTransport` و `normalizeConfig`، + و `applyNativeStreamingUsageCompat` و `resolveConfigApiKey`، + و `resolveSyntheticAuth` و `shouldDeferSyntheticProfileAuth`، + و `resolveDynamicModel` و `prepareDynamicModel`، + و `normalizeResolvedModel` و `contributeResolvedModelCompat`، + و `capabilities` و `normalizeToolSchemas`، + و `inspectToolSchemas` و `resolveReasoningOutputMode`، + و `prepareExtraParams` و `createStreamFn` و `wrapStreamFn`، + و `resolveTransportTurnState` و `resolveWebSocketSessionPolicy`، + و `createEmbeddingProvider` و `formatApiKey` و `refreshOAuth`، + و `buildAuthDoctorHint`، + و `matchesContextOverflowError` و `classifyFailoverReason`، + و `isCacheTtlEligible` و `buildMissingAuthMessage` و `suppressBuiltInModel`، + و `augmentModelCatalog` و `isBinaryThinking` و `supportsXHighThinking`، + و `resolveDefaultThinkingLevel` و `applyConfigDefaults` و `isModernModelRef`، + و `prepareRuntimeAuth` و `resolveUsageAuth` و `fetchUsageSnapshot`، و `onModelSelected`. -- ملاحظة: إن `capabilities` الخاصة بوقت تشغيل الموفّر هي بيانات تعريف مشتركة - للمشغّل (عائلة الموفّر، وخصائص النصوص وأدواتها، وتلميحات النقل/التخزين - المؤقت). وهي ليست نفسها [نموذج الإمكانات العام](/ar/plugins/architecture#public-capability-model) - الذي يصف ما الذي تسجّله الإضافة (استدلال نصي، كلام، إلخ). -- يتم إقران الموفّر المضمّن `codex` مع حزمة عامل Codex المضمّنة. - استخدم `codex/gpt-*` عندما تريد تسجيل دخول مملوكًا لـ Codex، واكتشاف - النماذج، واستئناف السلاسل أصلًا، والتنفيذ عبر خادم التطبيق. أما مراجع - `openai/gpt-*` العادية فتستمر في استخدام موفّر OpenAI ونقل الموفّر العادي في OpenClaw. - ويمكن لعمليات النشر التي تستخدم Codex فقط تعطيل الرجوع الاحتياطي التلقائي - إلى PI باستخدام +- ملاحظة: إن `capabilities` الخاصة بوقت تشغيل الموفّر هي بيانات تعريف مشتركة للمشغّل (عائلة الموفّر، وخصائص النصوص وسلوك الأدوات، وتلميحات النقل/التخزين المؤقت). وهي ليست + نفسها [نموذج الإمكانات العام](/ar/plugins/architecture#public-capability-model) + الذي يصف ما تسجّله الإضافة (الاستدلال النصي، والكلام، وما إلى ذلك). +- يتم إقران موفّر `codex` المضمّن مع حزمة وكيل Codex المضمّنة. + استخدم `codex/gpt-*` عندما تريد تسجيل دخول مملوكًا لـ Codex، واكتشافًا للنماذج، واستئنافًا أصليًا + للسلاسل، وتنفيذًا على خادم التطبيق. تستمر مراجع `openai/gpt-*` العادية + في استخدام موفّر OpenAI ووسيط نقل الموفّر العادي في OpenClaw. + يمكن لعمليات النشر الخاصة بـ Codex فقط تعطيل الرجوع التلقائي إلى PI عبر `agents.defaults.embeddedHarness.fallback: "none"`؛ راجع [Codex Harness](/ar/plugins/codex-harness). -## السلوك المملوك لإضافة الموفّر +## سلوك الموفّر المملوك للإضافة -يمكن لإضافات الموفّرين الآن امتلاك معظم المنطق الخاص بكل موفّر بينما يحتفظ OpenClaw -بحلقة الاستدلال العامة. +يمكن لإضافات الموفّر الآن امتلاك معظم المنطق الخاص بكل موفّر بينما يحافظ OpenClaw +على حلقة الاستدلال العامة. التقسيم المعتاد: -- `auth[].run` / `auth[].runNonInteractive`: يمتلك الموفّر تدفقات - الإعداد/تسجيل الدخول الخاصة بـ `openclaw onboard` و`openclaw models auth` و - الإعداد غير التفاعلي -- `wizard.setup` / `wizard.modelPicker`: يمتلك الموفّر تسميات خيارات - المصادقة، والأسماء المستعارة القديمة، وتلميحات قائمة السماح الخاصة بالإعداد، وإدخالات - الإعداد في منتقيات الإعداد/النموذج +- `auth[].run` / `auth[].runNonInteractive`: يملك الموفّر تدفقات + الإعداد/تسجيل الدخول لـ `openclaw onboard` و `openclaw models auth` والإعداد + غير التفاعلي +- `wizard.setup` / `wizard.modelPicker`: يملك الموفّر تسميات خيارات المصادقة، + والأسماء المستعارة القديمة، وتلميحات قائمة السماح الخاصة بالإعداد، وإدخالات الإعداد في منتقيات الإعداد/النموذج - `catalog`: يظهر الموفّر في `models.providers` -- `normalizeModelId`: يطبع الموفّر معرّفات النماذج القديمة/التجريبية - قبل البحث أو التحويل إلى الصيغة القياسية -- `normalizeTransport`: يطبع الموفّر `api` / `baseUrl` لعائلة النقل - قبل التجميع العام للنموذج؛ ويتحقق OpenClaw من الموفّر المطابق أولًا، - ثم من إضافات الموفّرين الأخرى القادرة على تنفيذ الخطاف حتى تقوم إحداها - فعليًا بتغيير النقل -- `normalizeConfig`: يطبع الموفّر إعدادات `models.providers.` قبل أن - يستخدمها وقت التشغيل؛ ويتحقق OpenClaw من الموفّر المطابق أولًا، ثم من إضافات - الموفّرين الأخرى القادرة على تنفيذ الخطاف حتى تقوم إحداها فعليًا بتغيير الإعدادات. وإذا لم - يُعِد أي خطاف موفّر كتابة الإعدادات، فستستمر أدوات Google-family - المضمّنة في تطبيع إدخالات موفّري Google المدعومة. -- `applyNativeStreamingUsageCompat`: يطبّق الموفّر إعادة كتابة توافق استخدام البث الأصلية المعتمدة على نقطة النهاية لموفّري الإعدادات -- `resolveConfigApiKey`: يحل الموفّر مصادقة علامة البيئة لموفّري الإعدادات - من دون فرض تحميل مصادقة وقت التشغيل الكاملة. ويحتوي `amazon-bedrock` أيضًا على - محلّل مضمّن لعلامات بيئة AWS هنا، رغم أن مصادقة وقت تشغيل Bedrock تستخدم +- `normalizeModelId`: يطبّع الموفّر معرّفات النماذج القديمة/التجريبية قبل + البحث أو التحويل إلى صيغة معيارية +- `normalizeTransport`: يطبّع الموفّر `api` / `baseUrl` لعائلة النقل + قبل التجميع العام للنموذج؛ يتحقق OpenClaw من الموفّر المطابق أولًا، + ثم من إضافات الموفّر الأخرى القادرة على الخطافات إلى أن يقوم أحدها فعلًا + بتغيير النقل +- `normalizeConfig`: يطبّع الموفّر إعداد `models.providers.` قبل + أن يستخدمه وقت التشغيل؛ يتحقق OpenClaw من الموفّر المطابق أولًا، ثم من إضافات الموفّر + الأخرى القادرة على الخطافات إلى أن يقوم أحدها فعلًا بتغيير الإعداد. إذا لم + تعِد أي خطافة موفّر كتابة الإعداد، فستستمر مساعدات عائلة Google المضمّنة + في تطبيع إدخالات موفّر Google المدعومة. +- `applyNativeStreamingUsageCompat`: يطبّق الموفّر عمليات إعادة كتابة توافق استخدام البث الأصلي المعتمدة على نقطة النهاية لموفّري الإعدادات +- `resolveConfigApiKey`: يحلّ الموفّر مصادقة علامات متغيرات البيئة لموفّري الإعدادات + دون فرض تحميل كامل لمصادقة وقت التشغيل. ويحتوي `amazon-bedrock` أيضًا على + محلّل علامات بيئة AWS مضمّن هنا، رغم أن مصادقة وقت تشغيل Bedrock تستخدم سلسلة AWS SDK الافتراضية. -- `resolveSyntheticAuth`: يمكن للموفّر إتاحة توفر المصادقة المحلية/المستضافة ذاتيًا أو - المصادقة الأخرى المعتمدة على الإعدادات من دون تخزين أسرار نصية صريحة -- `shouldDeferSyntheticProfileAuth`: يمكن للموفّر وسم العناصر النائبة - لملفات المصادقة الاصطناعية المخزنة على أنها أقل أولوية من المصادقة المعتمدة - على البيئة/الإعدادات -- `resolveDynamicModel`: يقبل الموفّر معرّفات نماذج غير موجودة بعد في +- `resolveSyntheticAuth`: يمكن للموفّر إتاحة توفر المصادقة المحلية/المستضافة ذاتيًا أو غيرها من المصادقات + المعتمدة على الإعدادات دون حفظ أسرار نصية صريحة +- `shouldDeferSyntheticProfileAuth`: يمكن للموفّر تمييز عناصر النائب الاصطناعية المخزنة في الملف الشخصي + على أنها أقل أولوية من المصادقة المعتمدة على البيئة/الإعدادات +- `resolveDynamicModel`: يقبل الموفّر معرّفات النماذج غير الموجودة بعد في الفهرس المحلي الثابت -- `prepareDynamicModel`: يحتاج الموفّر إلى تحديث للبيانات التعريفية قبل إعادة - محاولة الحل الديناميكي -- `normalizeResolvedModel`: يحتاج الموفّر إلى إعادة كتابة النقل أو عنوان URL الأساسي -- `contributeResolvedModelCompat`: يساهم الموفّر بعلامات توافق لنماذج - المورّد الخاصة به حتى عندما تصل عبر نقل متوافق آخر +- `prepareDynamicModel`: يحتاج الموفّر إلى تحديث بيانات التعريف قبل إعادة محاولة + التحليل الديناميكي +- `normalizeResolvedModel`: يحتاج الموفّر إلى عمليات إعادة كتابة للنقل أو عنوان URL الأساسي +- `contributeResolvedModelCompat`: يساهم الموفّر بعلامات التوافق الخاصة + بنماذج المورّد التابعة له حتى عندما تصل عبر نقل متوافق آخر - `capabilities`: ينشر الموفّر خصائص النصوص/الأدوات/عائلة الموفّر - `normalizeToolSchemas`: ينظّف الموفّر مخططات الأدوات قبل أن يراها المشغّل المضمّن -- `inspectToolSchemas`: يعرض الموفّر تحذيرات المخطط الخاصة بالنقل +- `inspectToolSchemas`: يعرض الموفّر تحذيرات المخططات الخاصة بالنقل بعد التطبيع -- `resolveReasoningOutputMode`: يختار الموفّر بين عقود مخرجات الاستدلال - الأصلية أو الموسومة -- `prepareExtraParams`: يضبط الموفّر افتراضيًا أو يطبّع معاملات الطلب - لكل نموذج +- `resolveReasoningOutputMode`: يختار الموفّر بين + عقود مخرجات الاستدلال الأصلية أو الموسومة +- `prepareExtraParams`: يضبط الموفّر افتراضيات أو يطبّع معلمات الطلب لكل نموذج - `createStreamFn`: يستبدل الموفّر مسار البث العادي بنقل - مخصص بالكامل -- `wrapStreamFn`: يطبّق الموفّر أغلفة توافق - رؤوس/نص الطلب/النموذج -- `resolveTransportTurnState`: يوفّر الموفّر - رؤوس النقل الأصلية أو البيانات التعريفية لكل دورة -- `resolveWebSocketSessionPolicy`: يوفّر الموفّر - رؤوس جلسة WebSocket الأصلية أو سياسة تهدئة الجلسة -- `createEmbeddingProvider`: يمتلك الموفّر سلوك تضمين الذاكرة عندما - يكون من الأنسب أن يكون ضمن إضافة الموفّر بدلًا من لوحة التحويل الأساسية للتضمين -- `formatApiKey`: ينسّق الموفّر ملفات المصادقة المخزنة إلى - السلسلة `apiKey` المتوقعة من النقل في وقت التشغيل -- `refreshOAuth`: يمتلك الموفّر تحديث OAuth عندما لا تكون + مخصّص بالكامل +- `wrapStreamFn`: يطبّق الموفّر أغلفة توافق للرؤوس/نص الطلب/النموذج +- `resolveTransportTurnState`: يوفّر الموفّر رؤوسًا أو بيانات تعريف + أصلية للنقل لكل دور +- `resolveWebSocketSessionPolicy`: يوفّر الموفّر رؤوس جلسة WebSocket أصلية + أو سياسة تهدئة الجلسة +- `createEmbeddingProvider`: يملك الموفّر سلوك التضمين للذاكرة عندما + يكون من الأنسب أن ينتمي إلى إضافة الموفّر بدلًا من لوحة تحويل التضمين الأساسية +- `formatApiKey`: ينسّق الموفّر ملفات تعريف المصادقة المخزنة إلى + سلسلة `apiKey` الخاصة بوقت التشغيل والمتوقعة من النقل +- `refreshOAuth`: يملك الموفّر تحديث OAuth عندما لا تكون أدوات التحديث المشتركة `pi-ai` كافية - `buildAuthDoctorHint`: يضيف الموفّر إرشادات إصلاح عندما يفشل تحديث OAuth - `matchesContextOverflowError`: يتعرف الموفّر على - أخطاء تجاوز نافذة السياق الخاصة بالموفّر التي قد لا ترصدها الاستدلالات العامة -- `classifyFailoverReason`: يربط الموفّر أخطاء النقل/API الخام - الخاصة به بأسباب التحويل الاحتياطي مثل حد المعدل أو الحمل الزائد -- `isCacheTtlEligible`: يقرر الموفّر أي معرّفات النماذج الصادرة تدعم مدة بقاء التخزين المؤقت للموجّه + أخطاء تجاوز نافذة السياق الخاصة بالموفّر والتي قد تفوتها الاستدلالات العامة +- `classifyFailoverReason`: يربط الموفّر أخطاء النقل/API الخام الخاصة بالموفّر + بأسباب الفشل الاحتياطي مثل تجاوز الحد أو الحمل الزائد +- `isCacheTtlEligible`: يحدد الموفّر أي معرّفات النماذج الصادرة من الجهة العليا تدعم مدة صلاحية التخزين المؤقت للموجّه - `buildMissingAuthMessage`: يستبدل الموفّر خطأ مخزن المصادقة العام بتلميح استرداد خاص بالموفّر -- `suppressBuiltInModel`: يخفي الموفّر الصفوف الصادرة القديمة ويمكنه - إرجاع خطأ مملوك للمورّد عند فشل الحل المباشر -- `augmentModelCatalog`: يضيف الموفّر صفوف فهرس اصطناعية/نهائية بعد +- `suppressBuiltInModel`: يُخفي الموفّر الصفوف العليا القديمة ويمكنه إرجاع + خطأ مملوك للمورّد عند فشل التحليل المباشر +- `augmentModelCatalog`: يُلحق الموفّر صفوف فهرس اصطناعية/نهائية بعد الاكتشاف ودمج الإعدادات -- `isBinaryThinking`: يمتلك الموفّر تجربة الاستخدام الخاصة بالتفكير الثنائي تشغيل/إيقاف -- `supportsXHighThinking`: يفعّل الموفّر `xhigh` - لنماذج محددة -- `resolveDefaultThinkingLevel`: يمتلك الموفّر سياسة `/think` - الافتراضية لعائلة نماذج -- `applyConfigDefaults`: يطبّق الموفّر القيم الافتراضية العامة الخاصة به - أثناء إنشاء الإعدادات بناءً على وضع المصادقة أو البيئة أو عائلة النموذج -- `isModernModelRef`: يمتلك الموفّر مطابقة النماذج المفضلة - للاختبارات الحية/اختبارات الدخان -- `prepareRuntimeAuth`: يحوّل الموفّر بيانات الاعتماد المهيأة إلى +- `isBinaryThinking`: يملك الموفّر تجربة استخدام التفكير الثنائي تشغيل/إيقاف +- `supportsXHighThinking`: يضمّن الموفّر نماذج محددة ضمن `xhigh` +- `resolveDefaultThinkingLevel`: يملك الموفّر سياسة `/think` الافتراضية لعائلة + نماذج معيّنة +- `applyConfigDefaults`: يطبّق الموفّر افتراضيات عامة خاصة به + أثناء تجسيد الإعدادات استنادًا إلى وضع المصادقة أو البيئة أو عائلة النموذج +- `isModernModelRef`: يملك الموفّر مطابقة النموذج المفضّل للاختبارات الحية/اختبارات الدخان +- `prepareRuntimeAuth`: يحوّل الموفّر بيانات اعتماد مُعدّة مسبقًا إلى رمز وقت تشغيل قصير العمر -- `resolveUsageAuth`: يحل الموفّر بيانات اعتماد الاستخدام/الحصة لـ `/usage` - والأسطح ذات الصلة بالحالة/التقارير -- `fetchUsageSnapshot`: يمتلك الموفّر جلب/تحليل نقطة نهاية الاستخدام بينما - لا تزال النواة تمتلك غلاف الملخص والتنسيق -- `onModelSelected`: يشغّل الموفّر تأثيرات لاحقة للاختيار مثل - القياس عن بُعد أو حفظ الجلسة المملوك للموفّر +- `resolveUsageAuth`: يحلّ الموفّر بيانات اعتماد الاستخدام/الحصة لـ `/usage` + والأسطح الأخرى ذات الصلة بالحالة/التقارير +- `fetchUsageSnapshot`: يملك الموفّر جلب/تحليل نقطة نهاية الاستخدام بينما + يظل اللبّ مسؤولًا عن هيكل الملخص والتنسيق +- `onModelSelected`: يشغّل الموفّر تأثيرات جانبية بعد الاختيار مثل + القياس عن بُعد أو مسك الدفاتر الخاص بالجلسة والمملوك للموفّر الأمثلة المضمّنة الحالية: -- `anthropic`: الرجوع الاحتياطي للتوافق المستقبلي مع Claude 4.6، وتلميحات إصلاح المصادقة، وجلب - نقطة نهاية الاستخدام، وبيانات تعريف مدة بقاء التخزين المؤقت/عائلة الموفّر، - والقيم الافتراضية العامة للإعدادات المرتبطة بالمصادقة +- `anthropic`: توافق احتياطي مستقبلي لـ Claude 4.6، وتلميحات إصلاح المصادقة، وجلب + نقطة نهاية الاستخدام، وبيانات تعريف TTL لذاكرة التخزين المؤقت/عائلة الموفّر، وافتراضيات الإعدادات + العامة الواعية بالمصادقة - `amazon-bedrock`: مطابقة تجاوز نافذة السياق المملوكة للموفّر وتصنيف - أسباب التحويل الاحتياطي لأخطاء Bedrock الخاصة بالاختناق/عدم الجاهزية، بالإضافة إلى - عائلة إعادة التشغيل المشتركة `anthropic-by-model` لضوابط سياسة إعادة التشغيل - الخاصة بـ Claude فقط على حركة Anthropic -- `anthropic-vertex`: ضوابط سياسة إعادة التشغيل الخاصة بـ Claude فقط على - حركة رسائل Anthropic -- `openrouter`: معرّفات نماذج تمريرية، وأغلفة الطلبات، وتلميحات إمكانات - الموفّر، وتنقية توقيع أفكار Gemini على حركة Gemini الوكيلة، وحقن - الاستدلال الوكيل عبر عائلة البث `openrouter-thinking`، وتمرير - بيانات تعريف التوجيه، وسياسة مدة بقاء التخزين المؤقت -- `github-copilot`: التهيئة/تسجيل الدخول عبر الجهاز، والرجوع الاحتياطي للنماذج - للتوافق المستقبلي، وتلميحات نصوص Claude الخاصة بالتفكير، وتبادل الرموز في وقت التشغيل، - وجلب نقطة نهاية الاستخدام -- `openai`: الرجوع الاحتياطي للتوافق المستقبلي مع GPT-5.4، وتطبيع - النقل المباشر لـ OpenAI، وتلميحات غياب المصادقة الواعية بـ Codex، وكبت Spark، - وصفوف فهرس OpenAI/Codex الاصطناعية، وسياسة التفكير/النموذج الحي، وتطبيع - الأسماء المستعارة لرموز الاستخدام (`input` / `output` و`prompt` / `completion`)، وعائلة - البث المشتركة `openai-responses-defaults` لأغلفة OpenAI/Codex الأصلية، + أسباب الفشل الاحتياطي لأخطاء Bedrock الخاصة بتقييد المعدّل/عدم الجاهزية، بالإضافة إلى + عائلة إعادة التشغيل المشتركة `anthropic-by-model` لحواجز سياسة إعادة التشغيل الخاصة بـ Claude فقط + على حركة مرور Anthropic +- `anthropic-vertex`: حواجز سياسة إعادة التشغيل الخاصة بـ Claude فقط على + حركة مرور رسائل Anthropic +- `openrouter`: معرّفات نماذج تمرير مباشر، وأغلفة الطلبات، وتلميحات قدرات الموفّر، + وتنقية توقيع أفكار Gemini على حركة مرور Gemini عبر الوكيل، وحقن + الاستدلال عبر الوكيل من خلال عائلة البث `openrouter-thinking`، + وتمرير بيانات تعريف التوجيه، وسياسة TTL لذاكرة التخزين المؤقت +- `github-copilot`: الإعداد/تسجيل الدخول عبر الجهاز، والتوافق الاحتياطي المستقبلي للنموذج، + وتلميحات نصوص Claude الخاصة بالتفكير، وتبادل رموز وقت التشغيل، وجلب نقطة + نهاية الاستخدام +- `openai`: توافق احتياطي مستقبلي لـ GPT-5.4، وتطبيع مباشر لنقل OpenAI، + وتلميحات فقدان المصادقة الواعية بـ Codex، وإخفاء Spark، وصفوف فهرس + اصطناعية لـ OpenAI/Codex، وسياسة التفكير/النموذج الحي، وتطبيع الأسماء المستعارة + لرموز الاستخدام (`input` / `output` وعائلتا `prompt` / `completion`)، وعائلة + البث المشتركة `openai-responses-defaults` للأغلفة الأصلية لـ OpenAI/Codex، وبيانات تعريف عائلة الموفّر، وتسجيل موفّر توليد الصور المضمّن لـ `gpt-image-1`، وتسجيل موفّر توليد الفيديو المضمّن لـ `sora-2` -- `google` و`google-gemini-cli`: الرجوع الاحتياطي للتوافق المستقبلي مع Gemini 3.1، - والتحقق الأصلي من إعادة تشغيل Gemini، وتنقية إعادة التشغيل عند الإقلاع، ووضع - مخرجات الاستدلال الموسوم، ومطابقة النماذج الحديثة، وتسجيل موفّر توليد الصور المضمّن - لنماذج Gemini image-preview، وتسجيل - موفّر توليد الفيديو المضمّن لنماذج Veo؛ كما أن OAuth الخاص بـ Gemini CLI - يمتلك أيضًا تنسيق رموز ملف المصادقة، وتحليل رموز الاستخدام، وجلب - نقطة نهاية الحصة لأسطح الاستخدام +- `google` و `google-gemini-cli`: توافق احتياطي مستقبلي لـ Gemini 3.1، + والتحقق الأصلي من إعادة تشغيل Gemini، وتنقية إعادة تشغيل التمهيد، ووضع + مخرجات الاستدلال الموسومة، ومطابقة النماذج الحديثة، وتسجيل موفّر + توليد الصور المضمّن لنماذج Gemini image-preview، وتسجيل موفّر + توليد الفيديو المضمّن لنماذج Veo؛ كما أن OAuth الخاص بـ Gemini CLI + يملك أيضًا تنسيق رموز ملفات تعريف المصادقة، وتحليل رموز الاستخدام، + وجلب نقطة نهاية الحصة لأسطح الاستخدام - `moonshot`: نقل مشترك، وتطبيع حمولة التفكير مملوك للإضافة -- `kilocode`: نقل مشترك، ورؤوس طلبات مملوكة للإضافة، وتطبيع حمولة الاستدلال، - وتنقية توقيع أفكار Gemini الوكيل، وسياسة مدة بقاء التخزين المؤقت -- `zai`: الرجوع الاحتياطي للتوافق المستقبلي مع GLM-5، والقيم الافتراضية لـ `tool_stream`، وسياسة مدة بقاء التخزين المؤقت، +- `kilocode`: نقل مشترك، ورؤوس طلبات مملوكة للإضافة، وتطبيع + حمولة الاستدلال، وتنقية توقيع أفكار Gemini عبر الوكيل، + وسياسة TTL لذاكرة التخزين المؤقت +- `zai`: توافق احتياطي مستقبلي لـ GLM-5، وافتراضيات `tool_stream`، وسياسة TTL لذاكرة التخزين المؤقت، وسياسة التفكير الثنائي/النموذج الحي، ومصادقة الاستخدام + جلب الحصة؛ - وتُولَّد معرّفات `glm-5*` غير المعروفة اصطناعيًا من القالب المضمّن `glm-4.7` -- `xai`: تطبيع النقل الأصلي لـ Responses، وإعادة كتابة الاسم المستعار `/fast` من أجل - متغيرات Grok السريعة، و`tool_stream` الافتراضي، وتنظيف مخطط الأدوات / - حمولة الاستدلال الخاص بـ xAI، وتسجيل موفّر توليد الفيديو المضمّن - لـ `grok-imagine-video` -- `mistral`: بيانات تعريف إمكانات مملوكة للإضافة -- `opencode` و`opencode-go`: بيانات تعريف إمكانات مملوكة للإضافة بالإضافة إلى - تنقية توقيع أفكار Gemini الوكيل -- `alibaba`: فهرس توليد الفيديو مملوك للإضافة لمراجع نماذج Wan المباشرة + وتُنشأ معرّفات `glm-5*` غير المعروفة اصطناعيًا من القالب المضمّن `glm-4.7` +- `xai`: تطبيع نقل Responses الأصلي، وإعادات كتابة الأسماء المستعارة `/fast` لـ + متغيرات Grok السريعة، و`tool_stream` الافتراضي، وتنظيف + مخطط الأدوات / حمولة الاستدلال الخاص بـ xAI، وتسجيل موفّر توليد الفيديو + المضمّن لـ `grok-imagine-video` +- `mistral`: بيانات تعريف القدرات المملوكة للإضافة +- `opencode` و `opencode-go`: بيانات تعريف القدرات المملوكة للإضافة بالإضافة إلى + تنقية توقيع أفكار Gemini عبر الوكيل +- `alibaba`: فهرس توليد الفيديو المملوك للإضافة لمراجع نماذج Wan المباشرة مثل `alibaba/wan2.6-t2v` - `byteplus`: فهارس مملوكة للإضافة بالإضافة إلى تسجيل موفّر توليد الفيديو المضمّن لنماذج Seedance لتحويل النص إلى فيديو/الصورة إلى فيديو -- `fal`: تسجيل موفّر توليد الفيديو المضمّن لنماذج الطرف الثالث المستضافة +- `fal`: تسجيل موفّر توليد الفيديو المضمّن لنماذج الأطراف الثالثة المستضافة وتسجيل موفّر توليد الصور المضمّن لنماذج صور FLUX بالإضافة إلى تسجيل - موفّر توليد الفيديو المضمّن لنماذج الفيديو المستضافة من طرف ثالث -- `cloudflare-ai-gateway` و`huggingface` و`kimi` و`nvidia` و`qianfan` و - `stepfun` و`synthetic` و`venice` و`vercel-ai-gateway` و`volcengine`: + موفّر توليد الفيديو المضمّن لنماذج الفيديو المستضافة من أطراف ثالثة +- `cloudflare-ai-gateway` و `huggingface` و `kimi` و `nvidia` و `qianfan`، + و `stepfun` و `synthetic` و `venice` و `vercel-ai-gateway` و `volcengine`: فهارس مملوكة للإضافة فقط - `qwen`: فهارس مملوكة للإضافة للنماذج النصية بالإضافة إلى تسجيلات - موفّر فهم الوسائط وتوليد الفيديو المشتركة لأسطحه متعددة الوسائط؛ ويستخدم - توليد الفيديو في Qwen نقاط نهاية الفيديو القياسية في DashScope مع - نماذج Wan المضمّنة مثل `wan2.6-t2v` و`wan2.7-r2v` -- `runway`: تسجيل موفّر توليد الفيديو مملوك للإضافة لنماذج Runway - الأصلية المعتمدة على المهام مثل `gen4.5` + مشتركة لموفّر فهم الوسائط وتوليد الفيديو لأسطحه متعددة الوسائط؛ يستخدم توليد الفيديو في Qwen + نقاط نهاية الفيديو القياسية DashScope مع نماذج Wan المضمّنة + مثل `wan2.6-t2v` و `wan2.7-r2v` +- `runway`: تسجيل موفّر توليد الفيديو المملوك للإضافة لنماذج + Runway الأصلية المعتمدة على المهام مثل `gen4.5` - `minimax`: فهارس مملوكة للإضافة، وتسجيل موفّر توليد الفيديو المضمّن لنماذج فيديو Hailuo، وتسجيل موفّر توليد الصور المضمّن - لـ `image-01`، واختيار سياسة إعادة تشغيل هجينة بين Anthropic/OpenAI، + لـ `image-01`، واختيار هجين لسياسة إعادة التشغيل بين Anthropic/OpenAI، ومنطق مصادقة/لقطة الاستخدام - `together`: فهارس مملوكة للإضافة بالإضافة إلى تسجيل موفّر توليد الفيديو المضمّن لنماذج فيديو Wan - `xiaomi`: فهارس مملوكة للإضافة بالإضافة إلى منطق مصادقة/لقطة الاستخدام -تمتلك الإضافة المضمّنة `openai` الآن معرّفي الموفّر كليهما: `openai` و -`openai-codex`. +أصبحت الإضافة المضمّنة `openai` الآن تملك كلا معرّفي الموفّر: +`openai` و `openai-codex`. -وهذا يغطي الموفّرين الذين ما زالوا ينسجمون مع وسائل النقل العادية في OpenClaw. أما الموفّر -الذي يحتاج إلى منفّذ طلبات مخصص بالكامل فهو سطح توسيع منفصل وأعمق. +وهذا يغطي الموفّرين الذين ما زالوا يناسبون وسائل النقل العادية في OpenClaw. أما الموفّر +الذي يحتاج إلى منفّذ طلبات مخصّص بالكامل فهو سطح توسعة منفصل وأعمق. ## تدوير مفاتيح API -- يدعم التدوير العام للمفاتيح لموفّرين محددين. +- يدعم تدويرًا عامًا لمفاتيح الموفّر لموفّرين محددين. - قم بتهيئة عدة مفاتيح عبر: - `OPENCLAW_LIVE__KEY` (تجاوز حي واحد، أعلى أولوية) - - `_API_KEYS` (قائمة مفصولة بفواصل أو فواصل منقوطة) + - `_API_KEYS` (قائمة مفصولة بفواصل أو فاصلة منقوطة) - `_API_KEY` (المفتاح الأساسي) - `_API_KEY_*` (قائمة مرقمة، مثل `_API_KEY_1`) -- بالنسبة إلى موفّري Google، يتم أيضًا تضمين `GOOGLE_API_KEY` كخيار احتياطي. +- بالنسبة إلى موفّري Google، يتم تضمين `GOOGLE_API_KEY` أيضًا كبديل احتياطي. - يحافظ ترتيب اختيار المفاتيح على الأولوية ويزيل القيم المكررة. -- تتم إعادة محاولة الطلبات بالمفتاح التالي فقط عند استجابات حد المعدل (على +- تُعاد محاولة الطلبات باستخدام المفتاح التالي فقط عند استجابات تجاوز المعدّل (على سبيل المثال `429` أو `rate_limit` أو `quota` أو `resource exhausted` أو `Too many -concurrent requests` أو `ThrottlingException` أو `concurrency limit reached` أو - `workers_ai ... quota limit exceeded` أو رسائل حد الاستخدام الدورية). -- تفشل الإخفاقات غير المرتبطة بحد المعدل فورًا؛ ولا تتم محاولة تدوير المفاتيح. -- عند فشل جميع المفاتيح المرشحة، يُعاد الخطأ النهائي من آخر محاولة. +concurrent requests` أو `ThrottlingException` أو `concurrency limit reached`، + أو `workers_ai ... quota limit exceeded`، أو رسائل حد الاستخدام الدورية). +- تفشل الأخطاء غير المرتبطة بتجاوز المعدّل فورًا؛ ولا تتم محاولة تدوير المفاتيح. +- عندما تفشل جميع المفاتيح المرشحة، يُعاد الخطأ النهائي من آخر محاولة. ## الموفّرون المضمّنون (فهرس pi-ai) -يشحن OpenClaw مع فهرس pi‑ai. لا تتطلب هذه الموفّرات أي إعداد -`models.providers`؛ فقط اضبط المصادقة + اختر نموذجًا. +يشحن OpenClaw مع فهرس pi-ai. لا تتطلب هذه الموفّرات أي +إعداد `models.providers`؛ فقط عيّن المصادقة + اختر نموذجًا. ### OpenAI - الموفّر: `openai` - المصادقة: `OPENAI_API_KEY` -- تدوير اختياري: `OPENAI_API_KEYS` و`OPENAI_API_KEY_1` و`OPENAI_API_KEY_2`، بالإضافة إلى `OPENCLAW_LIVE_OPENAI_KEY` (تجاوز واحد) -- أمثلة على النماذج: `openai/gpt-5.4` و`openai/gpt-5.4-pro` +- التدوير الاختياري: `OPENAI_API_KEYS` و `OPENAI_API_KEY_1` و `OPENAI_API_KEY_2`، بالإضافة إلى `OPENCLAW_LIVE_OPENAI_KEY` (تجاوز واحد) +- أمثلة على النماذج: `openai/gpt-5.4` و `openai/gpt-5.4-pro` - CLI: `openclaw onboard --auth-choice openai-api-key` - النقل الافتراضي هو `auto` (WebSocket أولًا، ثم SSE احتياطيًا) - يمكنك التجاوز لكل نموذج عبر `agents.defaults.models["openai/"].params.transport` (`"sse"` أو `"websocket"` أو `"auto"`) -- يتم تمكين الإحماء المسبق لـ OpenAI Responses WebSocket افتراضيًا عبر `params.openaiWsWarmup` (`true`/`false`) +- يتم تفعيل الإحماء المسبق لـ OpenAI Responses WebSocket افتراضيًا عبر `params.openaiWsWarmup` (`true`/`false`) - يمكن تمكين المعالجة ذات الأولوية في OpenAI عبر `agents.defaults.models["openai/"].params.serviceTier` -- يربط `/fast` و`params.fastMode` طلبات Responses المباشرة `openai/*` بـ `service_tier=priority` على `api.openai.com` -- استخدم `params.serviceTier` عندما تريد مستوى صريحًا بدلًا من مفتاح التبديل المشترك `/fast` -- تُطبَّق رؤوس الإسناد المخفية الخاصة بـ OpenClaw (`originator` و`version` و - `User-Agent`) فقط على حركة OpenAI الأصلية إلى `api.openai.com`، وليس على - الوكلاء العامة المتوافقة مع OpenAI -- تحتفظ المسارات الأصلية لـ OpenAI أيضًا بـ `store` الخاصة بـ Responses، وتلميحات التخزين المؤقت للموجّه، - وتشكيل حمولة توافق الاستدلال في OpenAI؛ أما مسارات الوكيل فلا تحتفظ بذلك -- يتم كبت `openai/gpt-5.3-codex-spark` عمدًا في OpenClaw لأن واجهة OpenAI API الحية ترفضه؛ ويتم التعامل مع Spark على أنه خاص بـ Codex فقط +- تقوم `/fast` و `params.fastMode` بربط طلبات Responses المباشرة `openai/*` بـ `service_tier=priority` على `api.openai.com` +- استخدم `params.serviceTier` عندما تريد مستوى خدمة صريحًا بدلًا من مفتاح التبديل المشترك `/fast` +- تنطبق رؤوس الإسناد المخفية الخاصة بـ OpenClaw (`originator` و `version` و + `User-Agent`) فقط على حركة مرور OpenAI الأصلية إلى `api.openai.com`، وليس على + وكلاء OpenAI-compatible العامّين +- تحتفظ مسارات OpenAI الأصلية أيضًا بخاصية Responses `store`، وتلميحات ذاكرة التخزين المؤقت للموجّه، و + تشكيل حمولة توافق الاستدلال الخاصة بـ OpenAI؛ أما مسارات الوكيل فلا تحتفظ بذلك +- يتم إخفاء `openai/gpt-5.3-codex-spark` عمدًا في OpenClaw لأن واجهة OpenAI API الحية ترفضه؛ ويُعامل Spark على أنه خاص بـ Codex فقط ```json5 { @@ -291,12 +283,12 @@ concurrent requests` أو `ThrottlingException` أو `concurrency limit reached` - الموفّر: `anthropic` - المصادقة: `ANTHROPIC_API_KEY` -- تدوير اختياري: `ANTHROPIC_API_KEYS` و`ANTHROPIC_API_KEY_1` و`ANTHROPIC_API_KEY_2`، بالإضافة إلى `OPENCLAW_LIVE_ANTHROPIC_KEY` (تجاوز واحد) +- التدوير الاختياري: `ANTHROPIC_API_KEYS` و `ANTHROPIC_API_KEY_1` و `ANTHROPIC_API_KEY_2`، بالإضافة إلى `OPENCLAW_LIVE_ANTHROPIC_KEY` (تجاوز واحد) - مثال على النموذج: `anthropic/claude-opus-4-6` - CLI: `openclaw onboard --auth-choice apiKey` -- تدعم طلبات Anthropic العامة المباشرة أيضًا مفتاح التبديل المشترك `/fast` و`params.fastMode`، بما في ذلك الحركة المرسلة إلى `api.anthropic.com` والمصادق عليها عبر مفتاح API أو OAuth؛ ويحوّل OpenClaw ذلك إلى `service_tier` في Anthropic (`auto` مقابل `standard_only`) -- ملاحظة Anthropic: أخبرنا موظفو Anthropic أن استخدام Claude CLI بأسلوب OpenClaw مسموح به مجددًا، لذلك يتعامل OpenClaw مع إعادة استخدام Claude CLI واستخدام `claude -p` على أنهما مسموحان لهذا التكامل ما لم تنشر Anthropic سياسة جديدة. -- لا يزال رمز إعداد Anthropic متاحًا كمسار رمز مدعوم في OpenClaw، لكن OpenClaw يفضّل الآن إعادة استخدام Claude CLI و`claude -p` عندما يكونان متاحين. +- تدعم طلبات Anthropic العامة المباشرة أيضًا مفتاح التبديل المشترك `/fast` و `params.fastMode`، بما في ذلك حركة المرور المرسلة إلى `api.anthropic.com` والمصادق عليها بمفتاح API وOAuth؛ ويقوم OpenClaw بربط ذلك بـ `service_tier` الخاص بـ Anthropic (`auto` مقابل `standard_only`) +- ملاحظة Anthropic: أخبرنا موظفو Anthropic أن استخدام Claude CLI بأسلوب OpenClaw مسموح مرة أخرى، لذا يتعامل OpenClaw مع إعادة استخدام Claude CLI واستخدام `claude -p` على أنهما معتمدان لهذا التكامل ما لم تنشر Anthropic سياسة جديدة. +- لا يزال رمز إعداد Anthropic متاحًا كمسار رمز مدعوم في OpenClaw، لكن OpenClaw يفضّل الآن إعادة استخدام Claude CLI و `claude -p` عند توفرهما. ```json5 { @@ -313,13 +305,13 @@ concurrent requests` أو `ThrottlingException` أو `concurrency limit reached` - النقل الافتراضي هو `auto` (WebSocket أولًا، ثم SSE احتياطيًا) - يمكنك التجاوز لكل نموذج عبر `agents.defaults.models["openai-codex/"].params.transport` (`"sse"` أو `"websocket"` أو `"auto"`) - يتم أيضًا تمرير `params.serviceTier` في طلبات Codex Responses الأصلية (`chatgpt.com/backend-api`) -- تُرفق رؤوس الإسناد المخفية الخاصة بـ OpenClaw (`originator` و`version` و - `User-Agent`) فقط على حركة Codex الأصلية إلى - `chatgpt.com/backend-api`، وليس على الوكلاء العامة المتوافقة مع OpenAI -- يشترك في نفس مفتاح التبديل `/fast` وإعداد `params.fastMode` مثل `openai/*` المباشر؛ ويحوّل OpenClaw ذلك إلى `service_tier=priority` -- يظل `openai-codex/gpt-5.3-codex-spark` متاحًا عندما يكشف فهرس OAuth الخاص بـ Codex عنه؛ وذلك يعتمد على الاستحقاق -- يحتفظ `openai-codex/gpt-5.4` بقيمة أصلية `contextWindow = 1050000` وقيمة افتراضية في وقت التشغيل `contextTokens = 272000`؛ ويمكنك تجاوز الحد في وقت التشغيل عبر `models.providers.openai-codex.models[].contextTokens` -- ملاحظة السياسة: دعم OAuth الخاص بـ OpenAI Codex مدعوم صراحةً للأدوات/سير العمل الخارجية مثل OpenClaw. +- لا تُرفق رؤوس الإسناد المخفية الخاصة بـ OpenClaw (`originator` و `version` و + `User-Agent`) إلا على حركة مرور Codex الأصلية إلى + `chatgpt.com/backend-api`، وليس على وكلاء OpenAI-compatible العامّين +- يشارك نفس مفتاح التبديل `/fast` وإعداد `params.fastMode` مثل `openai/*` المباشر؛ ويقوم OpenClaw بربط ذلك بـ `service_tier=priority` +- يبقى `openai-codex/gpt-5.3-codex-spark` متاحًا عندما يكشف فهرس Codex OAuth عنه؛ وذلك يعتمد على الاستحقاق +- يحتفظ `openai-codex/gpt-5.4` بقيمته الأصلية `contextWindow = 1050000` وقيمة وقت تشغيل افتراضية `contextTokens = 272000`؛ ويمكنك تجاوز حد وقت التشغيل عبر `models.providers.openai-codex.models[].contextTokens` +- ملاحظة حول السياسة: مصادقة OpenAI Codex عبر OAuth مدعومة صراحةً للأدوات/سير العمل الخارجية مثل OpenClaw. ```json5 { @@ -339,18 +331,18 @@ concurrent requests` أو `ThrottlingException` أو `concurrency limit reached` } ``` -### خيارات أخرى مستضافة بأسلوب الاشتراك +### خيارات أخرى مستضافة بنمط الاشتراك -- [Qwen Cloud](/ar/providers/qwen): سطح موفّر Qwen Cloud بالإضافة إلى تعيين نقاط نهاية Alibaba DashScope وCoding Plan +- [Qwen Cloud](/ar/providers/qwen): سطح موفّر Qwen Cloud بالإضافة إلى ربط نقاط نهاية Alibaba DashScope وCoding Plan - [MiniMax](/ar/providers/minimax): وصول MiniMax Coding Plan عبر OAuth أو مفتاح API -- [GLM Models](/ar/providers/glm): نقاط نهاية Z.AI Coding Plan أو API العامة +- [GLM Models](/ar/providers/glm): Z.AI Coding Plan أو نقاط نهاية API العامة ### OpenCode - المصادقة: `OPENCODE_API_KEY` (أو `OPENCODE_ZEN_API_KEY`) - موفّر وقت تشغيل Zen: `opencode` - موفّر وقت تشغيل Go: `opencode-go` -- أمثلة على النماذج: `opencode/claude-opus-4-6` و`opencode-go/kimi-k2.5` +- أمثلة على النماذج: `opencode/claude-opus-4-6` و `opencode-go/kimi-k2.5` - CLI: `openclaw onboard --auth-choice opencode-zen` أو `openclaw onboard --auth-choice opencode-go` ```json5 @@ -363,31 +355,31 @@ concurrent requests` أو `ThrottlingException` أو `concurrency limit reached` - الموفّر: `google` - المصادقة: `GEMINI_API_KEY` -- تدوير اختياري: `GEMINI_API_KEYS` و`GEMINI_API_KEY_1` و`GEMINI_API_KEY_2` وخيار `GOOGLE_API_KEY` الاحتياطي و`OPENCLAW_LIVE_GEMINI_KEY` (تجاوز واحد) -- أمثلة على النماذج: `google/gemini-3.1-pro-preview` و`google/gemini-3-flash-preview` +- التدوير الاختياري: `GEMINI_API_KEYS` و `GEMINI_API_KEY_1` و `GEMINI_API_KEY_2`، والبديل الاحتياطي `GOOGLE_API_KEY`، و `OPENCLAW_LIVE_GEMINI_KEY` (تجاوز واحد) +- أمثلة على النماذج: `google/gemini-3.1-pro-preview` و `google/gemini-3-flash-preview` - التوافق: يتم تطبيع إعداد OpenClaw القديم الذي يستخدم `google/gemini-3.1-flash-preview` إلى `google/gemini-3-flash-preview` - CLI: `openclaw onboard --auth-choice gemini-api-key` - تقبل عمليات Gemini المباشرة أيضًا `agents.defaults.models["google/"].params.cachedContent` - (أو `cached_content` القديم) لتمرير - مقبض `cachedContents/...` أصلي خاص بالموفّر؛ وتظهر إصابات ذاكرة Gemini المؤقتة كقيمة OpenClaw `cacheRead` + (أو `cached_content` القديم) لتمرير معرّف + `cachedContents/...` أصلي خاص بالموفّر؛ وتظهر إصابات ذاكرة Gemini المؤقتة في OpenClaw على شكل `cacheRead` ### Google Vertex وGemini CLI -- الموفّرات: `google-vertex` و`google-gemini-cli` -- المصادقة: يستخدم Vertex بيانات اعتماد gcloud ADC؛ ويستخدم Gemini CLI تدفق OAuth الخاص به -- تحذير: إن Gemini CLI OAuth في OpenClaw تكامل غير رسمي. وقد أبلغ بعض المستخدمين عن قيود على حسابات Google بعد استخدام عملاء من جهات خارجية. راجع شروط Google واستخدم حسابًا غير حرج إذا اخترت المتابعة. -- يتم شحن Gemini CLI OAuth كجزء من الإضافة المضمّنة `google`. +- الموفّرون: `google-vertex`، `google-gemini-cli` +- المصادقة: يستخدم Vertex بيانات اعتماد ADC من gcloud؛ ويستخدم Gemini CLI تدفق OAuth الخاص به +- تحذير: إن OAuth الخاص بـ Gemini CLI في OpenClaw تكامل غير رسمي. أبلغ بعض المستخدمين عن قيود على حسابات Google بعد استخدام عملاء من جهات خارجية. راجع شروط Google واستخدم حسابًا غير حرج إذا اخترت المتابعة. +- يتم شحن OAuth الخاص بـ Gemini CLI كجزء من الإضافة المضمّنة `google`. - ثبّت Gemini CLI أولًا: - `brew install gemini-cli` - أو `npm install -g @google/gemini-cli` - التمكين: `openclaw plugins enable google` - تسجيل الدخول: `openclaw models auth login --provider google-gemini-cli --set-default` - النموذج الافتراضي: `google-gemini-cli/gemini-3-flash-preview` - - ملاحظة: **لا** تقم بلصق معرّف عميل أو سر في `openclaw.json`. يخزّن تدفق تسجيل الدخول عبر CLI - الرموز في ملفات المصادقة على مضيف البوابة. - - إذا فشلت الطلبات بعد تسجيل الدخول، فاضبط `GOOGLE_CLOUD_PROJECT` أو `GOOGLE_CLOUD_PROJECT_ID` على مضيف البوابة. - - يتم تحليل ردود Gemini CLI بصيغة JSON من `response`؛ ويعود الاستخدام إلى - `stats`، مع تطبيع `stats.cached` إلى OpenClaw `cacheRead`. + - ملاحظة: لا تقوم **بلصق** معرّف العميل أو السر في `openclaw.json`. يخزن تدفق تسجيل الدخول في CLI + الرموز في ملفات تعريف المصادقة على مضيف Gateway. + - إذا فشلت الطلبات بعد تسجيل الدخول، فعيّن `GOOGLE_CLOUD_PROJECT` أو `GOOGLE_CLOUD_PROJECT_ID` على مضيف Gateway. + - يتم تحليل ردود JSON الخاصة بـ Gemini CLI من `response`؛ بينما يعود الاستخدام احتياطيًا إلى + `stats`، مع تطبيع `stats.cached` إلى `cacheRead` في OpenClaw. ### Z.AI (GLM) @@ -395,8 +387,8 @@ concurrent requests` أو `ThrottlingException` أو `concurrency limit reached` - المصادقة: `ZAI_API_KEY` - مثال على النموذج: `zai/glm-5.1` - CLI: `openclaw onboard --auth-choice zai-api-key` - - الأسماء المستعارة: يتم تطبيع `z.ai/*` و`z-ai/*` إلى `zai/*` - - يكتشف `zai-api-key` تلقائيًا نقطة نهاية Z.AI المطابقة؛ بينما يفرض `zai-coding-global` و`zai-coding-cn` و`zai-global` و`zai-cn` سطحًا محددًا + - الأسماء المستعارة: يتم تطبيع `z.ai/*` و `z-ai/*` إلى `zai/*` + - يكتشف `zai-api-key` نقطة نهاية Z.AI المطابقة تلقائيًا؛ بينما يفرض `zai-coding-global` و `zai-coding-cn` و `zai-global` و `zai-cn` سطحًا محددًا ### Vercel AI Gateway @@ -412,38 +404,38 @@ concurrent requests` أو `ThrottlingException` أو `concurrency limit reached` - مثال على النموذج: `kilocode/kilo/auto` - CLI: `openclaw onboard --auth-choice kilocode-api-key` - عنوان URL الأساسي: `https://api.kilo.ai/api/gateway/` -- يشحن فهرس احتياطي ثابت `kilocode/kilo/auto`؛ ويمكن لاكتشاف +- يشحن فهرس احتياطي ثابت مع `kilocode/kilo/auto`؛ ويمكن لاكتشاف `https://api.kilo.ai/api/gateway/models` الحي توسيع فهرس وقت التشغيل بشكل أكبر. -- إن التوجيه الصادر الدقيق وراء `kilocode/kilo/auto` مملوك لـ Kilo Gateway، +- إن التوجيه الفعلي من المصدر وراء `kilocode/kilo/auto` مملوك لـ Kilo Gateway، وليس مضمّنًا بشكل ثابت في OpenClaw. راجع [/providers/kilocode](/ar/providers/kilocode) للحصول على تفاصيل الإعداد. -### إضافات موفّرين مضمّنة أخرى +### إضافات الموفّرين المضمّنة الأخرى - OpenRouter: `openrouter` (`OPENROUTER_API_KEY`) - مثال على النموذج: `openrouter/auto` -- يطبّق OpenClaw رؤوس إسناد التطبيق الموثقة من OpenRouter فقط عندما +- يطبّق OpenClaw رؤوس إسناد التطبيق الموثقة في OpenRouter فقط عندما يستهدف الطلب فعليًا `openrouter.ai` -- وبالمثل، لا تُفعّل علامات `cache_control` الخاصة بـ Anthropic والمميزة لـ OpenRouter إلا على - مسارات OpenRouter المتحقق منها، وليس على عناوين URL الوكيلة الاعتباطية -- يظل OpenRouter على مسار الوكيل ذي النمط المتوافق مع OpenAI، لذا فإن - تشكيل الطلب الأصلي الخاص بـ OpenAI فقط (`serviceTier` و`store` في Responses، - وتلميحات التخزين المؤقت للموجّه، وحمولات توافق الاستدلال في OpenAI) لا يتم تمريره -- تحتفظ مراجع OpenRouter المعتمدة على Gemini فقط بمسار تنقية توقيع أفكار Gemini الوكيل؛ - أما التحقق الأصلي من إعادة تشغيل Gemini وإعادة الكتابة عند الإقلاع فيبقيان معطلين +- كما تُقيَّد علامات `cache_control` الخاصة بـ Anthropic والمخصصة لـ OpenRouter + على مسارات OpenRouter المتحقق منها، وليس على عناوين URL الوكيلة العشوائية +- يظل OpenRouter على مسار OpenAI-compatible بنمط الوكيل، لذلك لا يتم + تمرير تشكيل الطلبات الأصلي الخاص بـ OpenAI فقط (`serviceTier`، و `store` الخاص بـ Responses، + وتلميحات ذاكرة التخزين المؤقت للموجّه، وحمولات توافق الاستدلال الخاصة بـ OpenAI) +- تحتفظ مراجع OpenRouter المدعومة بـ Gemini فقط بمسار تنقية توقيع أفكار Gemini عبر الوكيل؛ + بينما يظل التحقق الأصلي من إعادة تشغيل Gemini وإعادات كتابة التمهيد معطّلين - Kilo Gateway: `kilocode` (`KILOCODE_API_KEY`) - مثال على النموذج: `kilocode/kilo/auto` -- تحتفظ مراجع Kilo المعتمدة على Gemini بنفس مسار - تنقية توقيع أفكار Gemini الوكيل؛ بينما تتخطى `kilocode/kilo/auto` وغيرها من - التلميحات الوكيلة غير الداعمة للاستدلال حقن الاستدلال الوكيل -- MiniMax: `minimax` (مفتاح API) و`minimax-portal` (OAuth) -- المصادقة: `MINIMAX_API_KEY` لـ `minimax`؛ و`MINIMAX_OAUTH_TOKEN` أو `MINIMAX_API_KEY` لـ `minimax-portal` +- تحتفظ مراجع Kilo المدعومة بـ Gemini بنفس + مسار تنقية توقيع أفكار Gemini عبر الوكيل؛ بينما يتجاوز `kilocode/kilo/auto` والتلميحات الأخرى التي لا تدعم استدلال الوكيل + حقن الاستدلال عبر الوكيل +- MiniMax: `minimax` (مفتاح API) و `minimax-portal` (OAuth) +- المصادقة: `MINIMAX_API_KEY` لـ `minimax`؛ و `MINIMAX_OAUTH_TOKEN` أو `MINIMAX_API_KEY` لـ `minimax-portal` - مثال على النموذج: `minimax/MiniMax-M2.7` أو `minimax-portal/MiniMax-M2.7` -- تكتب عملية تهيئة MiniMax/إعداد مفتاح API تعريفات صريحة لنموذج M2.7 مع +- يكتب إعداد MiniMax/إعداد مفتاح API تعريفات صريحة لنموذج M2.7 مع `input: ["text", "image"]`؛ بينما يبقي فهرس الموفّر المضمّن مراجع الدردشة - نصية فقط إلى أن تتحقق إعدادات ذلك الموفّر + نصية فقط إلى أن يتم تجسيد إعداد ذلك الموفّر - Moonshot: `moonshot` (`MOONSHOT_API_KEY`) - مثال على النموذج: `moonshot/kimi-k2.5` - Kimi Coding: `kimi` (`KIMI_API_KEY` أو `KIMICODE_API_KEY`) @@ -455,7 +447,7 @@ concurrent requests` أو `ThrottlingException` أو `concurrency limit reached` - NVIDIA: `nvidia` (`NVIDIA_API_KEY`) - مثال على النموذج: `nvidia/nvidia/llama-3.1-nemotron-70b-instruct` - StepFun: `stepfun` / `stepfun-plan` (`STEPFUN_API_KEY`) -- أمثلة على النماذج: `stepfun/step-3.5-flash` و`stepfun-plan/step-3.5-flash-2603` +- أمثلة على النماذج: `stepfun/step-3.5-flash`، `stepfun-plan/step-3.5-flash-2603` - Together: `together` (`TOGETHER_API_KEY`) - مثال على النموذج: `together/moonshotai/Kimi-K2.5` - Venice: `venice` (`VENICE_API_KEY`) @@ -470,9 +462,9 @@ concurrent requests` أو `ThrottlingException` أو `concurrency limit reached` - مثال على النموذج: `byteplus-plan/ark-code-latest` - xAI: `xai` (`XAI_API_KEY`) - تستخدم طلبات xAI الأصلية المضمّنة مسار xAI Responses - - يعيد `/fast` أو `params.fastMode: true` كتابة `grok-3` و`grok-3-mini` و - `grok-4` و`grok-4-0709` إلى المتغيرات الخاصة بها `*-fast` - - يتم تفعيل `tool_stream` افتراضيًا؛ اضبط + - تعيد `/fast` أو `params.fastMode: true` كتابة `grok-3` و `grok-3-mini`، + و `grok-4` و `grok-4-0709` إلى متغيراتها `*-fast` + - يكون `tool_stream` مفعّلًا افتراضيًا؛ عيّن `agents.defaults.models["xai/"].params.tool_stream` إلى `false` من أجل تعطيله - Mistral: `mistral` (`MISTRAL_API_KEY`) @@ -480,23 +472,23 @@ concurrent requests` أو `ThrottlingException` أو `concurrency limit reached` - CLI: `openclaw onboard --auth-choice mistral-api-key` - Groq: `groq` (`GROQ_API_KEY`) - Cerebras: `cerebras` (`CEREBRAS_API_KEY`) - - تستخدم نماذج GLM على Cerebras المعرّفات `zai-glm-4.7` و`zai-glm-4.6`. + - تستخدم نماذج GLM على Cerebras المعرّفات `zai-glm-4.7` و `zai-glm-4.6`. - عنوان URL الأساسي المتوافق مع OpenAI: `https://api.cerebras.ai/v1`. - GitHub Copilot: `github-copilot` (`COPILOT_GITHUB_TOKEN` / `GH_TOKEN` / `GITHUB_TOKEN`) - مثال على نموذج Hugging Face Inference: `huggingface/deepseek-ai/DeepSeek-R1`؛ CLI: `openclaw onboard --auth-choice huggingface-api-key`. راجع [Hugging Face (Inference)](/ar/providers/huggingface). -## الموفّرون عبر `models.providers` (مخصص/عنوان URL أساسي) +## الموفّرون عبر `models.providers` (عنوان URL مخصّص/أساسي) -استخدم `models.providers` (أو `models.json`) لإضافة موفّرين **مخصصين** أو +استخدم `models.providers` (أو `models.json`) لإضافة موفّرين **مخصّصين** أو وكلاء متوافقين مع OpenAI/Anthropic. -تقوم العديد من إضافات الموفّرين المضمّنة أدناه بالفعل بنشر فهرس افتراضي. +تنشر العديد من إضافات الموفّرين المضمّنة أدناه بالفعل فهرسًا افتراضيًا. استخدم إدخالات `models.providers.` الصريحة فقط عندما تريد تجاوز عنوان URL الأساسي أو الرؤوس أو قائمة النماذج الافتراضية. ### Moonshot AI (Kimi) -يأتي Moonshot كإضافة موفّر مضمّنة. استخدم الموفّر المضمّن +يُشحن Moonshot كإضافة موفّر مضمّنة. استخدم الموفّر المضمّن افتراضيًا، وأضف إدخال `models.providers.moonshot` صريحًا فقط عندما تحتاج إلى تجاوز عنوان URL الأساسي أو بيانات تعريف النموذج: @@ -505,7 +497,7 @@ concurrent requests` أو `ThrottlingException` أو `concurrency limit reached` - مثال على النموذج: `moonshot/kimi-k2.5` - CLI: `openclaw onboard --auth-choice moonshot-api-key` أو `openclaw onboard --auth-choice moonshot-api-key-cn` -معرّفات نموذج Kimi K2: +معرّفات نماذج Kimi K2: [//]: # "moonshot-kimi-k2-model-refs:start" @@ -537,7 +529,7 @@ concurrent requests` أو `ThrottlingException` أو `concurrency limit reached` ### Kimi Coding -يستخدم Kimi Coding نقطة نهاية Moonshot AI المتوافقة مع Anthropic: +يستخدم Kimi Coding نقطة النهاية المتوافقة مع Anthropic الخاصة بـ Moonshot AI: - الموفّر: `kimi` - المصادقة: `KIMI_API_KEY` @@ -552,11 +544,11 @@ concurrent requests` أو `ThrottlingException` أو `concurrency limit reached` } ``` -لا يزال `kimi/k2p5` القديم مقبولًا كمعرّف نموذج للتوافق. +يبقى `kimi/k2p5` القديم مقبولًا بوصفه معرّف نموذج للتوافق. ### Volcano Engine (Doubao) -يتيح Volcano Engine (火山引擎) الوصول إلى Doubao ونماذج أخرى في الصين. +يوفّر Volcano Engine (火山引擎) إمكانية الوصول إلى Doubao ونماذج أخرى في الصين. - الموفّر: `volcengine` (الترميز: `volcengine-plan`) - المصادقة: `VOLCANO_ENGINE_API_KEY` @@ -571,12 +563,12 @@ concurrent requests` أو `ThrottlingException` أو `concurrency limit reached` } ``` -يُفَعَّل الإعداد الأولي افتراضيًا على سطح البرمجة، ولكن يتم في الوقت نفسه -تسجيل فهرس `volcengine/*` العام. +يكون الإعداد الافتراضي موجّهًا إلى سطح البرمجة، لكن فهرس +`volcengine/*` العام يُسجَّل في الوقت نفسه. -في منتقيات الإعداد الأولي/تهيئة النموذج، يفضّل خيار مصادقة Volcengine كلاً من -الصفوف `volcengine/*` و`volcengine-plan/*`. وإذا لم تكن هذه النماذج محمّلة بعد، -فإن OpenClaw يعود إلى الفهرس غير المصفّى بدلًا من إظهار منتقٍ فارغ +في منتقيات الإعداد/تكوين النموذج، يفضّل خيار مصادقة Volcengine صفوف +`volcengine/*` و `volcengine-plan/*` معًا. إذا لم تكن هذه النماذج محمّلة بعد، +فإن OpenClaw يعود إلى الفهرس غير المفلتر بدلًا من عرض منتقٍ فارغ مقيّد بنطاق الموفّر. النماذج المتاحة: @@ -597,7 +589,7 @@ concurrent requests` أو `ThrottlingException` أو `concurrency limit reached` ### BytePlus (الدولي) -يوفّر BytePlus ARK الوصول إلى نفس النماذج التي يوفّرها Volcano Engine للمستخدمين الدوليين. +يوفّر BytePlus ARK الوصول إلى النماذج نفسها التي يوفّرها Volcano Engine للمستخدمين الدوليين. - الموفّر: `byteplus` (البرمجة: `byteplus-plan`) - المصادقة: `BYTEPLUS_API_KEY` @@ -612,12 +604,12 @@ concurrent requests` أو `ThrottlingException` أو `concurrency limit reached` } ``` -يُفَعَّل الإعداد الأولي افتراضيًا على سطح البرمجة، ولكن يتم في الوقت نفسه -تسجيل فهرس `byteplus/*` العام. +يكون الإعداد الافتراضي موجّهًا إلى سطح البرمجة، لكن فهرس +`byteplus/*` العام يُسجَّل في الوقت نفسه. -في منتقيات الإعداد الأولي/تهيئة النموذج، يفضّل خيار مصادقة BytePlus كلاً من -الصفوف `byteplus/*` و`byteplus-plan/*`. وإذا لم تكن هذه النماذج محمّلة بعد، -فإن OpenClaw يعود إلى الفهرس غير المصفّى بدلًا من إظهار منتقٍ فارغ +في منتقيات الإعداد/تكوين النموذج، يفضّل خيار مصادقة BytePlus صفوف +`byteplus/*` و `byteplus-plan/*` معًا. إذا لم تكن هذه النماذج محمّلة بعد، +فإن OpenClaw يعود إلى الفهرس غير المفلتر بدلًا من عرض منتقٍ فارغ مقيّد بنطاق الموفّر. النماذج المتاحة: @@ -636,7 +628,7 @@ concurrent requests` أو `ThrottlingException` أو `concurrency limit reached` ### Synthetic -يقدّم Synthetic نماذج متوافقة مع Anthropic خلف الموفّر `synthetic`: +يوفّر Synthetic نماذج متوافقة مع Anthropic خلف الموفّر `synthetic`: - الموفّر: `synthetic` - المصادقة: `SYNTHETIC_API_KEY` @@ -664,31 +656,53 @@ concurrent requests` أو `ThrottlingException` أو `concurrency limit reached` ### MiniMax -يتم تهيئة MiniMax عبر `models.providers` لأنه يستخدم نقاط نهاية مخصصة: +يتم تكوين MiniMax عبر `models.providers` لأنه يستخدم نقاط نهاية مخصّصة: - MiniMax OAuth (عالمي): `--auth-choice minimax-global-oauth` - MiniMax OAuth (الصين): `--auth-choice minimax-cn-oauth` - مفتاح API لـ MiniMax (عالمي): `--auth-choice minimax-global-api` - مفتاح API لـ MiniMax (الصين): `--auth-choice minimax-cn-api` -- المصادقة: `MINIMAX_API_KEY` لـ `minimax`؛ و`MINIMAX_OAUTH_TOKEN` أو +- المصادقة: `MINIMAX_API_KEY` لـ `minimax`؛ و `MINIMAX_OAUTH_TOKEN` أو `MINIMAX_API_KEY` لـ `minimax-portal` -راجع [/providers/minimax](/ar/providers/minimax) للحصول على تفاصيل الإعداد وخيارات النماذج ومقتطفات الإعدادات. +راجع [/providers/minimax](/ar/providers/minimax) للحصول على تفاصيل الإعداد وخيارات النماذج ومقتطفات الإعداد. -على مسار البث المتوافق مع Anthropic في MiniMax، يعطّل OpenClaw التفكير +في مسار البث المتوافق مع Anthropic الخاص بـ MiniMax، يعطّل OpenClaw التفكير افتراضيًا ما لم تقم بتعيينه صراحةً، كما أن `/fast on` يعيد كتابة `MiniMax-M2.7` إلى `MiniMax-M2.7-highspeed`. -تقسيم الإمكانات المملوك للإضافة: +تقسيم القدرات المملوك للإضافة: -- تظل القيم الافتراضية للنص/الدردشة على `minimax/MiniMax-M2.7` -- توليد الصور هو `minimax/image-01` أو `minimax-portal/image-01` -- فهم الصور هو `MiniMax-VL-01` مملوك للإضافة على مساري مصادقة MiniMax كليهما +- تظل افتراضيات النص/الدردشة على `minimax/MiniMax-M2.7` +- يكون توليد الصور على `minimax/image-01` أو `minimax-portal/image-01` +- يكون فهم الصور على `MiniMax-VL-01` المملوك للإضافة على مساري مصادقة MiniMax كليهما - يظل البحث على الويب على معرّف الموفّر `minimax` +### LM Studio + +يُشحن LM Studio كإضافة موفّر مضمّنة تستخدم API الأصلية: + +- الموفّر: `lmstudio` +- المصادقة: `LM_API_TOKEN` +- عنوان URL الأساسي الافتراضي للاستدلال: `http://localhost:1234/v1` + +ثم عيّن نموذجًا (استبدله بأحد المعرّفات التي يعيدها `http://localhost:1234/api/v1/models`): + +```json5 +{ + agents: { + defaults: { model: { primary: "lmstudio/openai/gpt-oss-20b" } }, + }, +} +``` + +يستخدم OpenClaw نقطتي النهاية الأصليتين في LM Studio وهما `/api/v1/models` و `/api/v1/models/load` +للاكتشاف + التحميل التلقائي، ويستخدم `/v1/chat/completions` للاستدلال افتراضيًا. +راجع [/providers/lmstudio](/ar/providers/lmstudio) للحصول على الإعداد واستكشاف الأخطاء وإصلاحها. + ### Ollama -يأتي Ollama كإضافة موفّر مضمّنة ويستخدم API الأصلية الخاصة بـ Ollama: +يُشحن Ollama كإضافة موفّر مضمّنة ويستخدم API الأصلية الخاصة بـ Ollama: - الموفّر: `ollama` - المصادقة: لا شيء مطلوب (خادم محلي) @@ -708,27 +722,27 @@ ollama pull llama3.3 } ``` -يتم اكتشاف Ollama محليًا عند `http://127.0.0.1:11434` عندما تختار الاشتراك عبر -`OLLAMA_API_KEY`، وتضيف إضافة الموفّر المضمّنة Ollama مباشرةً إلى +يتم اكتشاف Ollama محليًا على `http://127.0.0.1:11434` عندما تشترك +باستخدام `OLLAMA_API_KEY`، وتضيف إضافة الموفّر المضمّنة Ollama مباشرةً إلى `openclaw onboard` ومنتقي النماذج. راجع [/providers/ollama](/ar/providers/ollama) -للاطلاع على الإعداد الأولي، ووضع السحابة/الوضع المحلي، والإعدادات المخصصة. +للاطلاع على الإعداد، ووضع السحابة/الوضع المحلي، والإعدادات المخصّصة. ### vLLM -يأتي vLLM كإضافة موفّر مضمّنة للخوادم المحلية/المستضافة ذاتيًا المتوافقة مع OpenAI -: +يُشحن vLLM كإضافة موفّر مضمّنة للخوادم المحلية/المستضافة ذاتيًا +المتوافقة مع OpenAI: - الموفّر: `vllm` - المصادقة: اختيارية (بحسب خادمك) - عنوان URL الأساسي الافتراضي: `http://127.0.0.1:8000/v1` -للاشتراك في الاكتشاف التلقائي محليًا (أي قيمة تعمل إذا كان خادمك لا يفرض المصادقة): +للاشتراك في الاكتشاف التلقائي محليًا (أي قيمة تعمل إذا لم يفرض خادمك المصادقة): ```bash export VLLM_API_KEY="vllm-local" ``` -ثم اضبط نموذجًا (استبدله بأحد المعرّفات التي يعيدها `/v1/models`): +ثم عيّن نموذجًا (استبدله بأحد المعرّفات التي يعيدها `/v1/models`): ```json5 { @@ -738,11 +752,11 @@ export VLLM_API_KEY="vllm-local" } ``` -راجع [/providers/vllm](/ar/providers/vllm) للحصول على التفاصيل. +راجع [/providers/vllm](/ar/providers/vllm) للتفاصيل. ### SGLang -يأتي SGLang كإضافة موفّر مضمّنة للخوادم الذاتية الاستضافة السريعة +يُشحن SGLang كإضافة موفّر مضمّنة للخوادم السريعة المستضافة ذاتيًا المتوافقة مع OpenAI: - الموفّر: `sglang` @@ -756,7 +770,7 @@ export VLLM_API_KEY="vllm-local" export SGLANG_API_KEY="sglang-local" ``` -ثم اضبط نموذجًا (استبدله بأحد المعرّفات التي يعيدها `/v1/models`): +ثم عيّن نموذجًا (استبدله بأحد المعرّفات التي يعيدها `/v1/models`): ```json5 { @@ -766,7 +780,7 @@ export SGLANG_API_KEY="sglang-local" } ``` -راجع [/providers/sglang](/ar/providers/sglang) للحصول على التفاصيل. +راجع [/providers/sglang](/ar/providers/sglang) للتفاصيل. ### الوكلاء المحليون (LM Studio وvLLM وLiteLLM وما إلى ذلك) @@ -777,19 +791,19 @@ export SGLANG_API_KEY="sglang-local" agents: { defaults: { model: { primary: "lmstudio/my-local-model" }, - models: { "lmstudio/my-local-model": { alias: "محلي" } }, + models: { "lmstudio/my-local-model": { alias: "Local" } }, }, }, models: { providers: { lmstudio: { baseUrl: "http://localhost:1234/v1", - apiKey: "LMSTUDIO_KEY", + apiKey: "${LM_API_TOKEN}", api: "openai-completions", models: [ { id: "my-local-model", - name: "النموذج المحلي", + name: "Local Model", reasoning: false, input: ["text"], cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, @@ -805,20 +819,20 @@ export SGLANG_API_KEY="sglang-local" ملاحظات: -- بالنسبة إلى الموفّرين المخصصين، تكون `reasoning` و`input` و`cost` و`contextWindow` و`maxTokens` اختيارية. +- بالنسبة إلى الموفّرين المخصّصين، فإن `reasoning` و `input` و `cost` و `contextWindow` و `maxTokens` اختيارية. وعند حذفها، يستخدم OpenClaw القيم الافتراضية التالية: - `reasoning: false` - `input: ["text"]` - `cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }` - `contextWindow: 200000` - `maxTokens: 8192` -- الموصى به: تعيين قيم صريحة تطابق حدود الوكيل/النموذج لديك. -- بالنسبة إلى `api: "openai-completions"` على نقاط النهاية غير الأصلية (أي `baseUrl` غير فارغ يكون مضيفه غير `api.openai.com`)، يفرض OpenClaw القيمة `compat.supportsDeveloperRole: false` لتجنب أخطاء 400 من الموفّر عند عدم دعم أدوار `developer`. -- كما تتخطى المسارات الوكيلة المتوافقة مع OpenAI تشكيل الطلب الأصلي الخاص بـ OpenAI فقط: - لا `service_tier`، ولا `store` في Responses، ولا تلميحات للتخزين المؤقت للموجّه، ولا - تشكيل لحمولة توافق الاستدلال في OpenAI، ولا رؤوس إسناد مخفية خاصة بـ OpenClaw. +- يُنصح بذلك: عيّن قيمًا صريحة تطابق حدود الوكيل/النموذج لديك. +- بالنسبة إلى `api: "openai-completions"` على نقاط النهاية غير الأصلية (أي `baseUrl` غير فارغ لا يكون مضيفه `api.openai.com`)، يفرض OpenClaw القيمة `compat.supportsDeveloperRole: false` لتجنب أخطاء 400 من الموفّر بسبب أدوار `developer` غير المدعومة. +- كما تتجاوز مسارات OpenAI-compatible بنمط الوكيل أيضًا + تشكيل الطلبات الأصلي الخاص بـ OpenAI فقط: لا `service_tier`، ولا `store` الخاص بـ Responses، ولا تلميحات لذاكرة التخزين المؤقت للموجّه، ولا + تشكيل لحمولة توافق الاستدلال الخاصة بـ OpenAI، ولا رؤوس إسناد مخفية خاصة بـ OpenClaw. - إذا كان `baseUrl` فارغًا/محذوفًا، يحتفظ OpenClaw بسلوك OpenAI الافتراضي (الذي يُحل إلى `api.openai.com`). -- من أجل الأمان، تتم أيضًا إعادة تجاوز القيمة الصريحة `compat.supportsDeveloperRole: true` على نقاط النهاية غير الأصلية `openai-completions`. +- من أجل السلامة، يتم مع ذلك تجاوز `compat.supportsDeveloperRole: true` الصريح على نقاط نهاية `openai-completions` غير الأصلية. ## أمثلة CLI @@ -828,11 +842,11 @@ openclaw models set opencode/claude-opus-4-6 openclaw models list ``` -راجع أيضًا: [/gateway/configuration](/ar/gateway/configuration) للاطلاع على أمثلة إعدادات كاملة. +راجع أيضًا: [/gateway/configuration](/ar/gateway/configuration) للحصول على أمثلة إعدادات كاملة. ## ذو صلة - [النماذج](/ar/concepts/models) — إعدادات النماذج والأسماء المستعارة -- [التحويل الاحتياطي للنموذج](/ar/concepts/model-failover) — سلاسل التراجع وسلوك إعادة المحاولة +- [الفشل الاحتياطي للنماذج](/ar/concepts/model-failover) — سلاسل الفشل الاحتياطي وسلوك إعادة المحاولة - [مرجع الإعدادات](/ar/gateway/configuration-reference#agent-defaults) — مفاتيح إعدادات النموذج -- [الموفّرون](/ar/providers) — أدلة الإعداد الخاصة بكل موفّر +- [الموفّرون](/ar/providers) — أدلة الإعداد لكل موفّر diff --git a/docs/ar/concepts/qa-e2e-automation.md b/docs/ar/concepts/qa-e2e-automation.md index 568034d40..31b58a5b6 100644 --- a/docs/ar/concepts/qa-e2e-automation.md +++ b/docs/ar/concepts/qa-e2e-automation.md @@ -1,33 +1,33 @@ --- read_when: - توسيع qa-lab أو qa-channel - - إضافة سيناريوهات QA مدعومة بالمستودع - - بناء أتمتة QA بدرجة واقعية أعلى حول لوحة معلومات Gateway -summary: البنية الخاصة لأتمتة QA لـ qa-lab وqa-channel والسيناريوهات المُهيأة مسبقًا وتقارير البروتوكول -title: أتمتة QA الشاملة من البداية إلى النهاية + - إضافة سيناريوهات QA مدعومة من المستودع + - بناء أتمتة QA أكثر واقعية حول لوحة تحكم Gateway +summary: شكل أتمتة QA الخاصة لـ qa-lab وqa-channel والسيناريوهات المُهيأة مسبقًا وتقارير البروتوكول +title: أتمتة QA من طرف إلى طرف x-i18n: - generated_at: "2026-04-12T23:28:11Z" + generated_at: "2026-04-13T07:28:53Z" model: gpt-5.4 provider: openai - source_hash: b9fe27dc049823d5e3eb7ae1eac6aad21ed9e917425611fb1dbcb28ab9210d5e + source_hash: a4a4f5c765163565c95c2a071f201775fd9d8d60cad4ff25d71e4710559c1570 source_path: concepts/qa-e2e-automation.md workflow: 15 --- -# أتمتة QA الشاملة من البداية إلى النهاية +# أتمتة QA من طرف إلى طرف -تهدف حزمة QA الخاصة إلى اختبار OpenClaw بطريقة أكثر واقعية وبهيئة أقرب إلى القنوات، مقارنة بما يمكن لاختبار وحدة واحد أن يقدمه. +تهدف حزمة QA الخاصة إلى اختبار OpenClaw بطريقة أكثر واقعية وبنيةً شبيهة بالقنوات مقارنةً بما يمكن أن يقدمه اختبار وحدات واحد. -الأجزاء الحالية: +المكوّنات الحالية: -- `extensions/qa-channel`: قناة رسائل اصطناعية تتضمن أسطح الرسائل الخاصة DM، والقنوات، والخيوط، والتفاعلات، والتحرير، والحذف. -- `extensions/qa-lab`: واجهة مستخدم لتصحيح الأخطاء وناقل QA لمراقبة النص الحواري، وحقن الرسائل الواردة، وتصدير تقرير Markdown. -- `qa/`: أصول تمهيدية مدعومة بالمستودع لمهمة البداية وسيناريوهات QA الأساسية. +- `extensions/qa-channel`: قناة رسائل اصطناعية بواجهات للرسائل الخاصة DM، والقنوات، والخيوط، والتفاعلات، والتحرير، والحذف. +- `extensions/qa-lab`: واجهة مستخدم لتصحيح الأخطاء وناقل QA لمراقبة النصّ الحواري، وحقن الرسائل الواردة، وتصدير تقرير Markdown. +- `qa/`: أصول تهيئة مدعومة من المستودع لمهمة البدء وسيناريوهات QA الأساسية. تدفق عمل مشغّل QA الحالي هو موقع QA بلوحتين: -- اليسار: لوحة معلومات Gateway (Control UI) مع الوكيل. -- اليمين: QA Lab، ويعرض النص الحواري بأسلوب يشبه Slack وخطة السيناريو. +- اليسار: لوحة تحكم Gateway ‏(Control UI) مع الوكيل. +- اليمين: QA Lab، ويعرض النص الحواري الشبيه بـ Slack وخطة السيناريو. شغّله باستخدام: @@ -35,9 +35,9 @@ x-i18n: pnpm qa:lab:up ``` -يبني هذا موقع QA، ويبدأ مسار Gateway المدعوم بـ Docker، ويعرض صفحة QA Lab حيث يمكن لمشغّل أو حلقة أتمتة أن يكلّف الوكيل بمهمة QA، ويراقب سلوك القناة الفعلي، ويسجل ما نجح وما فشل وما بقي معطّلًا. +يؤدي ذلك إلى بناء موقع QA، وبدء مسار Gateway المعتمد على Docker، وإتاحة صفحة QA Lab حيث يمكن لمشغّل أو لحلقة أتمتة تكليف الوكيل بمهمة QA، ومراقبة سلوك القناة الحقيقي، وتسجيل ما نجح وما فشل وما بقي معطّلًا. -للحصول على تكرار أسرع في واجهة QA Lab من دون إعادة بناء صورة Docker في كل مرة، ابدأ الحزمة مع حزمة QA Lab مركّبة عبر bind mount: +للتكرار الأسرع على واجهة مستخدم QA Lab بدون إعادة بناء صورة Docker في كل مرة، ابدأ الحزمة باستخدام حزمة QA Lab مربوطة بالتحميل: ```bash pnpm openclaw qa docker-build-image @@ -46,34 +46,34 @@ pnpm qa:lab:up:fast pnpm qa:lab:watch ``` -يبقي `qa:lab:up:fast` خدمات Docker على صورة مبنية مسبقًا ويربط `extensions/qa-lab/web/dist` داخل حاوية `qa-lab` عبر bind mount. ويعيد `qa:lab:watch` بناء تلك الحزمة عند التغيير، ويعيد المتصفح التحميل تلقائيًا عندما يتغير تجزئة أصول QA Lab. +يحافظ `qa:lab:up:fast` على خدمات Docker على صورة مبنية مسبقًا ويربط تحميل `extensions/qa-lab/web/dist` داخل حاوية `qa-lab`. ويعيد `qa:lab:watch` بناء تلك الحزمة عند التغيير، ويُعاد تحميل المتصفح تلقائيًا عندما يتغير تجزئة أصول QA Lab. -لتشغيل مسار smoke حقيقي النقل لـ Matrix، شغّل: +لتشغيل مسار Matrix اختباري يعتمد نقلًا حقيقيًا، شغّل: ```bash pnpm openclaw qa matrix ``` -يوفّر هذا المسار خادم Tuwunel منزليًا مؤقتًا داخل Docker، ويسجل مستخدمين مؤقتين للسائق، وSUT، والمراقب، وينشئ غرفة خاصة واحدة، ثم يشغّل Plugin Matrix الحقيقي داخل عملية فرعية QA gateway. ويحافظ مسار النقل الحي على ضبط العملية الفرعية محصورًا في النقل قيد الاختبار، بحيث يعمل Matrix من دون `qa-channel` في ضبط العملية الفرعية. +يوفّر هذا المسار خادم Tuwunel منزليًا مؤقتًا في Docker، ويسجل مستخدمين مؤقتين للسائق وSUT والمراقب، وينشئ غرفة خاصة واحدة، ثم يشغّل Plugin Matrix الحقيقي داخل child خاص بـ QA gateway. ويحافظ مسار النقل الحي على إعدادات child محصورة ضمن النقل قيد الاختبار، لذلك يعمل Matrix من دون `qa-channel` في إعدادات child. -لتشغيل مسار smoke حقيقي النقل لـ Telegram، شغّل: +لتشغيل مسار Telegram اختباري يعتمد نقلًا حقيقيًا، شغّل: ```bash pnpm openclaw qa telegram ``` -يستهدف هذا المسار مجموعة Telegram خاصة حقيقية واحدة بدلًا من توفير خادم مؤقت. ويتطلب `OPENCLAW_QA_TELEGRAM_GROUP_ID` و`OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN` و`OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`، بالإضافة إلى روبوتين مختلفين داخل المجموعة الخاصة نفسها. ويجب أن يمتلك روبوت SUT اسم مستخدم على Telegram، وتعمل المراقبة بين الروبوتات على أفضل نحو عندما يكون لدى كلا الروبوتين وضع Bot-to-Bot Communication Mode مفعّلًا في `@BotFather`. +يستهدف هذا المسار مجموعة Telegram خاصة حقيقية واحدة بدلًا من توفير خادم مؤقت. ويتطلب `OPENCLAW_QA_TELEGRAM_GROUP_ID` و`OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN` و`OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`، بالإضافة إلى روبوتين مختلفين داخل المجموعة الخاصة نفسها. يجب أن يمتلك روبوت SUT اسم مستخدم على Telegram، وتعمل المراقبة بين الروبوتات على أفضل نحو عندما يكون Bot-to-Bot Communication Mode مفعّلًا لكلا الروبوتين في `@BotFather`. -تتشارك مسارات النقل الحية الآن عقدًا أصغر واحدًا بدلًا من أن يخترع كل منها شكل قائمة السيناريوهات الخاصة به. +تتشارك مسارات النقل الحية الآن عقدًا أصغر واحدًا بدلًا من أن يخترع كل منها شكل قائمة السيناريوهات الخاصة به: -يبقى `qa-channel` حزمة سلوك المنتج الاصطناعية الواسعة، وليس جزءًا من مصفوفة تغطية النقل الحي. +يبقى `qa-channel` مجموعة اختبار واسعة لسلوك المنتج الاصطناعي وليس جزءًا من مصفوفة تغطية النقل الحي. -| المسار | Canary | تقييد الإشارة | حظر قائمة السماح | رد من المستوى الأعلى | استئناف بعد إعادة التشغيل | متابعة الخيط | عزل الخيط | مراقبة التفاعل | أمر المساعدة | -| ------ | ------ | -------------- | ----------------- | --------------------- | -------------------------- | ------------ | ---------- | --------------- | ------------ | -| Matrix | x | x | x | x | x | x | x | x | | -| Telegram | x | | | | | | | | x | +| المسار | Canary | بوابة الإشارات Mention | حظر قائمة السماح | رد على المستوى الأعلى | استئناف بعد إعادة التشغيل | متابعة الخيط | عزل الخيط | مراقبة التفاعلات | أمر Help | +| ------- | ------ | ---------------------- | ----------------- | ---------------------- | -------------------------- | ------------ | ---------- | ---------------- | -------- | +| Matrix | x | x | x | x | x | x | x | x | | +| Telegram | x | | | | | | | | x | -يبقي هذا `qa-channel` كحزمة سلوك المنتج الواسعة، بينما تتشارك Matrix وTelegram ووسائط النقل الحية المستقبلية قائمة فحص صريحة واحدة لعقد النقل. +يحافظ ذلك على `qa-channel` باعتباره مجموعة واسعة لسلوك المنتج، بينما تتشارك Matrix وTelegram ووسائل النقل الحية المستقبلية قائمة تحقق صريحة واحدة لعقد النقل. لتشغيل مسار Linux VM مؤقت من دون إدخال Docker في مسار QA، شغّل: @@ -81,67 +81,67 @@ pnpm openclaw qa telegram pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline ``` -يقوم هذا بتشغيل ضيف Multipass جديد، وتثبيت التبعيات، وبناء OpenClaw داخل الضيف، وتشغيل `qa suite`، ثم نسخ تقرير QA العادي والملخص مرة أخرى إلى `.artifacts/qa-e2e/...` على المضيف. -ويعيد استخدام السلوك نفسه لاختيار السيناريو كما في `qa suite` على المضيف. -تنفّذ عمليات suite على المضيف وMultipass عدة سيناريوهات محددة بالتوازي مع عمّال Gateway معزولين افتراضيًا، حتى 64 عاملًا أو عدد السيناريوهات المحددة. استخدم `--concurrency ` لضبط عدد العمّال، أو `--concurrency 1` للتنفيذ التسلسلي. -تُمرِّر التشغيلات الحية مدخلات مصادقة QA المدعومة والعملية للضيف: مفاتيح المزوّد المعتمدة على env، ومسار ضبط مزوّد QA الحي، و`CODEX_HOME` عند وجوده. أبقِ `--output-dir` تحت جذر المستودع حتى يتمكن الضيف من الكتابة مرة أخرى عبر مساحة العمل المركّبة. +يقوم هذا بتشغيل ضيف Multipass جديد، وتثبيت الاعتماديات، وبناء OpenClaw داخل الضيف، وتشغيل `qa suite`، ثم نسخ تقرير QA والملخص المعتادين مرة أخرى إلى `.artifacts/qa-e2e/...` على المضيف. +ويعيد استخدام سلوك اختيار السيناريو نفسه الذي يستخدمه `qa suite` على المضيف. +تُنفَّذ عمليات suite على المضيف وMultipass لعدة سيناريوهات محددة بالتوازي مع عمال Gateway معزولين افتراضيًا، حتى 64 عاملًا أو عدد السيناريوهات المحددة. استخدم `--concurrency ` لضبط عدد العمال، أو `--concurrency 1` للتنفيذ التسلسلي. +تعيد عمليات التشغيل الحية تمرير مدخلات مصادقة QA المدعومة والعملية للضيف: مفاتيح المزوّد المعتمدة على env، ومسار إعدادات موفّر QA الحي، و`CODEX_HOME` عند وجوده. أبقِ `--output-dir` تحت جذر المستودع حتى يتمكن الضيف من الكتابة مرة أخرى عبر مساحة العمل المركّبة. -## البذور المدعومة بالمستودع +## البذور المدعومة من المستودع -توجد الأصول التمهيدية في `qa/`: +توجد أصول التهيئة في `qa/`: - `qa/scenarios/index.md` - `qa/scenarios/*.md` -هذه موجودة عمدًا في git بحيث تكون خطة QA مرئية لكل من البشر والوكيل. +هذه الملفات موجودة عمدًا في git حتى تكون خطة QA مرئية لكل من البشر والوكيل. -يجب أن يبقى `qa-lab` مشغّل Markdown عامًا. كل ملف Markdown خاص بسيناريو هو المصدر المرجعي لتشغيل اختبار واحد، ويجب أن يعرّف: +يجب أن يبقى `qa-lab` مشغّل Markdown عامًا. يجب أن يكون كل ملف Markdown للسيناريو هو مصدر الحقيقة لتشغيل اختبار واحد، وأن يعرّف ما يلي: - بيانات السيناريو الوصفية -- مراجع المستندات والشفرة +- مراجع الوثائق والكود - متطلبات Plugin الاختيارية -- تصحيح ضبط Gateway اختياري +- تصحيح إعدادات Gateway اختياري - `qa-flow` القابل للتنفيذ +يُسمح لسطح وقت التشغيل القابل لإعادة الاستخدام الذي يدعم `qa-flow` بأن يبقى عامًا وعابرًا لعدة أجزاء. على سبيل المثال، يمكن لسيناريوهات Markdown أن تجمع بين مساعدات جهة النقل ومساعدات جهة المتصفح التي تقود Control UI المضمّن عبر واجهة Gateway ‏`browser.request` من دون إضافة مشغّل خاص بحالة معينة. + يجب أن تبقى القائمة الأساسية واسعة بما يكفي لتغطية: - محادثات DM والقنوات - سلوك الخيوط - دورة حياة إجراءات الرسائل - استدعاءات Cron -- استرجاع الذاكرة +- استدعاء الذاكرة - تبديل النماذج -- تمرير المهمة إلى وكيل فرعي -- قراءة المستودع وقراءة المستندات -- مهمة بناء صغيرة واحدة مثل Lobster Invaders +- تسليم الوكيل الفرعي +- قراءة المستودع وقراءة الوثائق +- مهمة بناء صغيرة مثل Lobster Invaders ## محولات النقل -يمتلك `qa-lab` طبقة نقل عامة لسيناريوهات QA المكتوبة بـ Markdown. -`qa-channel` هو أول محول على هذه الطبقة، لكن الهدف التصميمي أوسع: -يجب أن تُوصَل القنوات المستقبلية، سواء كانت حقيقية أو اصطناعية، إلى مشغّل suite نفسه بدلًا من إضافة مشغّل QA خاص بالنقل. +يمتلك `qa-lab` واجهة نقل عامة لسيناريوهات QA المبنية على Markdown. +ويُعد `qa-channel` أول محول على هذه الواجهة، لكن هدف التصميم أوسع: يجب أن تتصل القنوات الحقيقية أو الاصطناعية المستقبلية بالمشغّل نفسه للمجموعة بدلًا من إضافة مشغّل QA خاص بالنقل. -على مستوى البنية، يكون التقسيم كالتالي: +على مستوى البنية، يكون التقسيم كما يلي: -- يمتلك `qa-lab` تنفيذ السيناريو العام، وتزامن العمّال، وكتابة الأصول الناتجة، وإعداد التقارير. -- يمتلك محول النقل ضبط Gateway، والجاهزية، ومراقبة الوارد والصادر، وإجراءات النقل، وحالة النقل المطبّعة. -- تحدد ملفات السيناريو Markdown تحت `qa/scenarios/` تشغيل الاختبار؛ ويوفر `qa-lab` سطح وقت التشغيل القابل لإعادة الاستخدام الذي ينفذها. +- يمتلك `qa-lab` التنفيذ العام للسيناريوهات، وتوازي العمال، وكتابة المخرجات، وإعداد التقارير. +- يمتلك محول النقل إعدادات Gateway، والجاهزية، ومراقبة الوارد والصادر، وإجراءات النقل، وحالة النقل الموحّدة. +- تحدد ملفات سيناريوهات Markdown تحت `qa/scenarios/` تشغيل الاختبار؛ ويوفّر `qa-lab` سطح وقت التشغيل القابل لإعادة الاستخدام الذي ينفذها. -يوجد دليل الاعتماد الموجه للمشرفين لمحولات القنوات الجديدة في +توجد إرشادات الاعتماد الخاصة بالمشرفين لمحولات القنوات الجديدة في [Testing](/ar/help/testing#adding-a-channel-to-qa). ## إعداد التقارير -يصدّر `qa-lab` تقرير بروتوكول بصيغة Markdown من المخطط الزمني للناقل المرصود. +يُصدّر `qa-lab` تقرير بروتوكول بصيغة Markdown من الخط الزمني لناقل الأحداث المرصود. ويجب أن يجيب التقرير عن: - ما الذي نجح - ما الذي فشل - ما الذي بقي معطّلًا -- ما سيناريوهات المتابعة التي تستحق الإضافة +- ما سيناريوهات المتابعة الجديرة بالإضافة -لفحوصات الطابع والأسلوب، شغّل السيناريو نفسه عبر عدة مراجع نماذج حية -واكتب تقرير Markdown مُقيَّمًا: +لإجراء فحوصات الطابع والأسلوب، شغّل السيناريو نفسه عبر عدة مراجع نماذج حية واكتب تقرير Markdown مُقيّمًا: ```bash pnpm openclaw qa character-eval \ @@ -160,20 +160,20 @@ pnpm openclaw qa character-eval \ --judge-concurrency 16 ``` -يشغّل هذا الأمر عمليات فرعية محلية لـ QA gateway، وليس Docker. ويجب أن تضبط سيناريوهات تقييم الطابع الشخصية عبر `SOUL.md`، ثم تُجري أدوار مستخدم عادية مثل الدردشة، والمساعدة في مساحة العمل، والمهام الصغيرة على الملفات. ويجب ألا يتم إخبار النموذج المرشح بأنه قيد التقييم. ويحافظ الأمر على كل نص حواري كامل، ويسجّل إحصاءات التشغيل الأساسية، ثم يطلب من نماذج التحكيم في الوضع السريع مع استدلال `xhigh` ترتيب التشغيلات حسب الطبيعية والطابع والفكاهة. -استخدم `--blind-judge-models` عند مقارنة المزوّدين: إذ يظل موجّه التحكيم يتلقى كل نص حواري وحالة تشغيل، لكن تُستبدل مراجع المرشحين بتسميات محايدة مثل `candidate-01`؛ ثم يربط التقرير التصنيفات مرة أخرى بالمراجع الفعلية بعد التحليل. -تستخدم تشغيلات المرشحين افتراضيًا مستوى تفكير `high`، مع `xhigh` لنماذج OpenAI التي تدعمه. ويمكنك تجاوز مرشح محدد ضمنيًا باستخدام -`--model provider/model,thinking=`. ولا يزال `--thinking ` يضبط قيمة احتياطية عامة، كما يُحتفظ بالصيغة الأقدم `--model-thinking ` للتوافق. -تستخدم مراجع المرشحين الخاصة بـ OpenAI الوضع السريع افتراضيًا بحيث تُستخدم المعالجة ذات الأولوية عندما يدعم المزوّد ذلك. أضف `,fast` أو `,no-fast` أو `,fast=false` ضمن المرجع عندما يحتاج مرشح واحد أو حكم واحد إلى تجاوز هذا السلوك. مرّر `--fast` فقط عندما تريد فرض الوضع السريع لكل نماذج المرشحين. وتُسجَّل مدد تشغيل المرشحين والحكّام في التقرير لتحليل القياس، لكن موجّهات الحكّام تنص صراحة على عدم الترتيب حسب السرعة. -تستخدم كل من تشغيلات نماذج المرشحين والحكّام تزامنًا افتراضيًا مقداره 16. خفّض -`--concurrency` أو `--judge-concurrency` عندما تجعل حدود المزوّد أو ضغط Gateway المحلي التشغيل مشوشًا أكثر من اللازم. -عند عدم تمرير أي `--model` للمرشحين، يستخدم تقييم الطابع افتراضيًا -`openai/gpt-5.4` و`openai/gpt-5.2` و`openai/gpt-5` و`anthropic/claude-opus-4-6` و`anthropic/claude-sonnet-4-6` و`zai/glm-5.1` و`moonshot/kimi-k2.5` و`google/gemini-3.1-pro-preview`. -وعند عدم تمرير أي `--judge-model`، تكون نماذج التحكيم الافتراضية هي +يشغّل هذا الأمر عمليات child محلية لـ QA gateway، وليس Docker. يجب أن تضبط سيناريوهات تقييم الطابع الشخصية عبر `SOUL.md`، ثم تشغّل أدوار مستخدم عادية مثل الدردشة، والمساعدة في مساحة العمل، ومهام الملفات الصغيرة. يجب ألا يُخبَر النموذج المرشح بأنه قيد التقييم. يحتفظ الأمر بكل نص حواري كامل، ويسجّل إحصاءات تشغيل أساسية، ثم يطلب من نماذج التحكيم في وضع fast مع استدلال `xhigh` ترتيب التشغيلات بحسب الطبيعية والأجواء والفكاهة. +استخدم `--blind-judge-models` عند المقارنة بين المزوّدين: ستظل مطالبة التحكيم تتلقى كل نص حواري وحالة تشغيل، لكن تُستبدل مراجع المرشحين بتسميات محايدة مثل `candidate-01`؛ ويعيد التقرير ربط التصنيفات بالمراجع الحقيقية بعد التحليل. +تستخدم تشغيلات المرشحين افتراضيًا مستوى تفكير `high`، مع `xhigh` لنماذج OpenAI التي تدعمه. يمكنك تجاوز مرشح محدد مباشرةً باستخدام +`--model provider/model,thinking=`. وما يزال `--thinking ` يضبط قيمة احتياطية عامة، كما جرى الإبقاء على الصيغة الأقدم `--model-thinking ` للتوافق. +تستخدم مراجع المرشحين من OpenAI وضع fast افتراضيًا حتى تُستخدم المعالجة ذات الأولوية حيث يدعمها المزوّد. أضف `,fast` أو `,no-fast` أو `,fast=false` مباشرةً عندما يحتاج مرشح واحد أو حكم واحد إلى تجاوز. مرّر `--fast` فقط عندما تريد فرض وضع fast على كل نموذج مرشح. تُسجَّل مدد المرشحين والحكام في التقرير لتحليل المقاييس، لكن مطالبات التحكيم تنص صراحةً على عدم الترتيب بحسب السرعة. +تستخدم كل من تشغيلات نماذج المرشحين والحكام توازيًا افتراضيًا مقداره 16. خفّض +`--concurrency` أو `--judge-concurrency` عندما تجعل حدود المزوّد أو ضغط Gateway المحلي التشغيل شديد الضوضاء. +عند عدم تمرير أي مرشح `--model`، يستخدم تقييم الطابع افتراضيًا +`openai/gpt-5.4` و`openai/gpt-5.2` و`openai/gpt-5` و`anthropic/claude-opus-4-6` و`anthropic/claude-sonnet-4-6` و`zai/glm-5.1` و`moonshot/kimi-k2.5` و`google/gemini-3.1-pro-preview` عندما لا يتم تمرير `--model`. +وعند عدم تمرير أي `--judge-model`، تكون النماذج الحَكَم الافتراضية هي `openai/gpt-5.4,thinking=xhigh,fast` و `anthropic/claude-opus-4-6,thinking=high`. -## مستندات ذات صلة +## وثائق ذات صلة - [Testing](/ar/help/testing) - [QA Channel](/ar/channels/qa-channel) diff --git a/docs/ar/gateway/local-models.md b/docs/ar/gateway/local-models.md index dd71b2ff4..8dd7a87e0 100644 --- a/docs/ar/gateway/local-models.md +++ b/docs/ar/gateway/local-models.md @@ -1,28 +1,28 @@ --- read_when: - تريد تقديم النماذج من جهاز GPU الخاص بك - - أنت تقوم بربط LM Studio أو وكيل متوافق مع OpenAI - - تحتاج إلى أكثر إرشادات النماذج المحلية أمانًا -summary: شغّل OpenClaw على نماذج LLM محلية (LM Studio وvLLM وLiteLLM ونقاط نهاية OpenAI مخصصة) + - أنت تقوم بإعداد LM Studio أو وكيل متوافق مع OpenAI + - تحتاج إلى أكثر الإرشادات أمانًا للنماذج المحلية +summary: شغّل OpenClaw على نماذج LLM المحلية (LM Studio، vLLM، LiteLLM، ونقاط نهاية OpenAI المخصصة) title: النماذج المحلية x-i18n: - generated_at: "2026-04-08T02:14:58Z" + generated_at: "2026-04-13T07:28:52Z" model: gpt-5.4 provider: openai - source_hash: d619d72b0e06914ebacb7e9f38b746caf1b9ce8908c9c6638c3acdddbaa025e8 + source_hash: 3ecb61b3e6e34d3666f9b688cd694d92c5fb211cf8c420fa876f7ccf5789154a source_path: gateway/local-models.md workflow: 15 --- # النماذج المحلية -التشغيل المحلي ممكن، لكن OpenClaw يتوقع سياقًا كبيرًا + وسائل دفاع قوية ضد حقن المطالبات. البطاقات الصغيرة تقتطع السياق وتسرّب الأمان. استهدف مستوى مرتفعًا: **استوديوهين Mac Studio ممتلئين بالمواصفات على الأقل أو جهاز GPU مكافئ (~$30k+)**. تعمل وحدة **24 GB** GPU واحدة فقط مع المطالبات الأخف وزمن استجابة أعلى. استخدم **أكبر / النسخة الكاملة من النموذج التي يمكنك تشغيلها**؛ إذ إن نقاط التحقق المكمّمة بشدة أو “الصغيرة” تزيد من خطر حقن المطالبات (راجع [الأمان](/ar/gateway/security)). +الاستخدام المحلي ممكن، لكن OpenClaw يتوقع سياقًا كبيرًا + وسائل دفاع قوية ضد حقن الأوامر. البطاقات الصغيرة تقطع السياق وتُضعف الأمان. استهدف مواصفات عالية: **≥2 من أجهزة Mac Studio بأقصى تجهيز أو ما يعادلها من منصات GPU (~$30k+)**. تعمل بطاقة GPU واحدة بسعة **24 GB** فقط مع الطلبات الأخف وبزمن استجابة أعلى. استخدم **أكبر / النسخة كاملة الحجم من النموذج التي يمكنك تشغيلها**؛ فالإصدارات المضغوطة بشدة أو نقاط التحقق “الصغيرة” تزيد من خطر حقن الأوامر (راجع [الأمان](/ar/gateway/security)). -إذا كنت تريد أقل إعداد محلي احتكاكًا، فابدأ بـ [Ollama](/ar/providers/ollama) و`openclaw onboard`. هذه الصفحة هي الدليل العملي الموجّه للإعدادات المحلية الأعلى مستوى وخوادم OpenAI المحلية المخصصة المتوافقة. +إذا كنت تريد أقل إعداد محلي تعقيدًا، فابدأ بـ [LM Studio](/ar/providers/lmstudio) أو [Ollama](/ar/providers/ollama) واستخدم `openclaw onboard`. هذه الصفحة هي الدليل التوجيهي الموصى به للبُنى المحلية الأعلى مستوى وخوادم OpenAI-compatible المحلية المخصصة. ## الموصى به: LM Studio + نموذج محلي كبير (Responses API) -أفضل بنية محلية حالية. حمّل نموذجًا كبيرًا في LM Studio (على سبيل المثال، إصدارًا كامل الحجم من Qwen أو DeepSeek أو Llama)، ثم فعّل الخادم المحلي (الافتراضي `http://127.0.0.1:1234`)، واستخدم Responses API لإبقاء الاستدلال منفصلًا عن النص النهائي. +أفضل بنية محلية حاليًا. حمّل نموذجًا كبيرًا في LM Studio (على سبيل المثال، إصدارًا كامل الحجم من Qwen أو DeepSeek أو Llama)، ثم فعّل الخادم المحلي (الافتراضي `http://127.0.0.1:1234`)، واستخدم Responses API لإبقاء الاستدلال منفصلًا عن النص النهائي. ```json5 { @@ -59,16 +59,16 @@ x-i18n: } ``` -**قائمة الإعداد** +**قائمة التحقق للإعداد** - ثبّت LM Studio: [https://lmstudio.ai](https://lmstudio.ai) -- في LM Studio، نزّل **أكبر إصدار نموذج متاح** (تجنب المتغيرات “الصغيرة”/المكمّمة بشدة)، ثم شغّل الخادم، وتأكد من أن `http://127.0.0.1:1234/v1/models` يعرضه. +- في LM Studio، نزّل **أكبر إصدار نموذج متاح** (تجنب الإصدارات “الصغيرة”/المضغوطة بشدة)، ثم شغّل الخادم وتأكد من أن `http://127.0.0.1:1234/v1/models` يعرضه. - استبدل `my-local-model` بمعرّف النموذج الفعلي الظاهر في LM Studio. -- أبقِ النموذج محمّلًا؛ فالتحميل البارد يضيف زمن تأخير عند البدء. -- عدّل `contextWindow`/`maxTokens` إذا كان إصدار LM Studio لديك مختلفًا. -- بالنسبة إلى WhatsApp، التزم بـ Responses API حتى يُرسَل النص النهائي فقط. +- أبقِ النموذج محمّلًا؛ فالتحميل البارد يضيف زمن بدء. +- عدّل `contextWindow`/`maxTokens` إذا كان إصدار LM Studio لديك يختلف. +- بالنسبة إلى WhatsApp، التزم باستخدام Responses API بحيث يتم إرسال النص النهائي فقط. -أبقِ النماذج المستضافة مضبوطة حتى عند التشغيل المحلي؛ استخدم `models.mode: "merge"` حتى تبقى خيارات الرجوع الاحتياطي متاحة. +أبقِ النماذج المستضافة مُعدّة حتى عند التشغيل المحلي؛ استخدم `models.mode: "merge"` حتى تظل البدائل الاحتياطية متاحة. ### إعداد هجين: أساسي مستضاف، واحتياطي محلي @@ -113,16 +113,16 @@ x-i18n: ### محلي أولًا مع شبكة أمان مستضافة -بدّل ترتيب الأساسي والاحتياطي؛ وأبقِ كتلة providers نفسها و`models.mode: "merge"` حتى تتمكن من الرجوع إلى Sonnet أو Opus عندما يتعطل الجهاز المحلي. +بدّل ترتيب الأساسي والاحتياطي؛ وأبقِ كتلة providers نفسها و`models.mode: "merge"` حتى تتمكن من الرجوع إلى Sonnet أو Opus عندما يتوقف الجهاز المحلي. ### الاستضافة الإقليمية / توجيه البيانات -- تتوفر أيضًا متغيرات MiniMax/Kimi/GLM المستضافة على OpenRouter مع نقاط نهاية مثبّتة على مناطق محددة (مثل الاستضافة داخل الولايات المتحدة). اختر المتغير الإقليمي هناك للحفاظ على حركة المرور ضمن الولاية القضائية التي تختارها مع الاستمرار في استخدام `models.mode: "merge"` لخيارات الرجوع الاحتياطي من Anthropic/OpenAI. -- يظل التشغيل المحلي فقط هو المسار الأقوى للخصوصية؛ أما التوجيه الإقليمي المستضاف فهو الحل الوسط عندما تحتاج إلى ميزات المزوّد لكنك تريد التحكم في تدفق البيانات. +- تتوفر أيضًا إصدارات MiniMax/Kimi/GLM المستضافة على OpenRouter مع نقاط نهاية مقيّدة حسب المنطقة (مثل الاستضافة داخل الولايات المتحدة). اختر الإصدار الإقليمي هناك للحفاظ على حركة البيانات ضمن النطاق القضائي الذي تختاره، مع الاستمرار في استخدام `models.mode: "merge"` لبدائل Anthropic/OpenAI الاحتياطية. +- يظل التشغيل المحلي فقط هو أقوى خيار للخصوصية؛ أما التوجيه الإقليمي المستضاف فهو حل وسط عندما تحتاج إلى ميزات المزوّد لكنك تريد التحكم في تدفق البيانات. ## وكلاء محليون آخرون متوافقون مع OpenAI -تعمل vLLM وLiteLLM وOAI-proxy أو البوابات المخصصة إذا كانت تعرض نقطة نهاية `/v1` بأسلوب OpenAI. استبدل كتلة provider أعلاه بنقطة النهاية ومعرّف النموذج الخاصين بك: +يعمل vLLM وLiteLLM وOAI-proxy أو البوابات المخصصة إذا كانت توفّر نقطة نهاية `/v1` بأسلوب OpenAI. استبدل كتلة provider أعلاه بنقطة النهاية ومعرّف النموذج لديك: ```json5 { @@ -150,42 +150,41 @@ x-i18n: } ``` -أبقِ `models.mode: "merge"` حتى تظل النماذج المستضافة متاحة كخيارات رجوع احتياطي. +أبقِ `models.mode: "merge"` حتى تظل النماذج المستضافة متاحة كبدائل احتياطية. ملاحظة سلوكية لواجهات `/v1` المحلية/الوسيطة: -- يتعامل OpenClaw مع هذه الواجهات على أنها مسارات وكيل متوافقة مع OpenAI، وليست +- يتعامل OpenClaw مع هذه المسارات على أنها مسارات وكيل متوافقة مع OpenAI، وليست نقاط نهاية OpenAI أصلية -- لا ينطبق هنا تشكيل الطلبات الخاص بـ OpenAI الأصلية فقط: لا - يوجد `service_tier`، ولا `store` الخاص بـ Responses، ولا تشكيل حمولة - التوافق مع الاستدلال الخاص بـ OpenAI، ولا تلميحات لذاكرة التخزين المؤقت للمطالبات -- لا يتم حقن ترويسات الإسناد المخفية الخاصة بـ OpenClaw (`originator` و`version` و`User-Agent`) +- لا تنطبق هنا صياغة الطلب الخاصة بـ OpenAI الأصلية فقط: لا يوجد + `service_tier`، ولا `store` الخاص بـ Responses، ولا صياغة حمولة + التوافق مع reasoning في OpenAI، ولا تلميحات cache الخاصة بالطلبات +- لا يتم حقن ترويسات الإسناد المخفية الخاصة بـ OpenClaw (`originator`، `version`، `User-Agent`) على عناوين URL الخاصة بهذه الوكلاء المخصصة -ملاحظات التوافق لواجهات OpenAI المتوافقة الأكثر صرامة: +ملاحظات التوافق للواجهات الأكثر تشددًا والمتوافقة مع OpenAI: -- تقبل بعض الخوادم فقط `messages[].content` كسلسلة نصية في Chat Completions، وليس - مصفوفات أجزاء المحتوى المهيكلة. اضبط - `models.providers..models[].compat.requiresStringContent: true` لهذه - النقاط. -- بعض الواجهات المحلية الأصغر أو الأكثر صرامة تكون غير مستقرة مع الشكل الكامل - لمطالبة بيئة تشغيل الوكيل في OpenClaw، خاصة عند تضمين مخططات الأدوات. إذا كانت - الواجهة تعمل مع استدعاءات `/v1/chat/completions` المباشرة الصغيرة ولكنها تفشل في - الأدوار العادية لوكيل OpenClaw، فجرّب - `models.providers..models[].compat.supportsTools: false` أولًا. -- إذا كانت الواجهة لا تزال تفشل فقط في تشغيلات OpenClaw الأكبر، فعادةً ما تكون - المشكلة المتبقية في سعة النموذج/الخادم upstream أو في خطأ في الواجهة الخلفية، - وليس في طبقة النقل الخاصة بـ OpenClaw. +- تقبل بعض الخوادم فقط القيمة النصية `messages[].content` في Chat Completions، وليس + مصفوفات أجزاء المحتوى المنظمة. اضبط + `models.providers..models[].compat.requiresStringContent: true` لتلك + النقاط النهائية. +- بعض الواجهات المحلية الأصغر أو الأكثر تشددًا تكون غير مستقرة مع الشكل الكامل + لطلب agent-runtime في OpenClaw، خاصة عند تضمين مخططات الأدوات. إذا كانت + الواجهة تعمل مع استدعاءات `/v1/chat/completions` المباشرة الصغيرة لكنها تفشل مع + الأدوار العادية للوكلاء في OpenClaw، فجرّب أولًا + `models.providers..models[].compat.supportsTools: false`. +- إذا استمرت الواجهة بالفشل فقط مع عمليات OpenClaw الأكبر، فغالبًا ما تكون المشكلة + سعة النموذج/الخادم من الجهة العليا أو خطأ في الواجهة الخلفية، وليست طبقة النقل في OpenClaw. ## استكشاف الأخطاء وإصلاحها -- هل تستطيع البوابة الوصول إلى الوكيل؟ `curl http://127.0.0.1:1234/v1/models`. +- هل يستطيع Gateway الوصول إلى الوكيل؟ `curl http://127.0.0.1:1234/v1/models`. - هل تم إلغاء تحميل نموذج LM Studio؟ أعد تحميله؛ فالبدء البارد سبب شائع لـ “التعليق”. -- أخطاء في السياق؟ خفّض `contextWindow` أو ارفع حد الخادم. -- هل يعيد الخادم المتوافق مع OpenAI الخطأ `messages[].content ... expected a string`؟ +- أخطاء السياق؟ خفّض `contextWindow` أو ارفع حد الخادم لديك. +- هل يعيد خادم OpenAI-compatible الخطأ `messages[].content ... expected a string`؟ أضف `compat.requiresStringContent: true` إلى إدخال ذلك النموذج. -- تعمل استدعاءات `/v1/chat/completions` المباشرة الصغيرة، لكن `openclaw infer model run` - يفشل على Gemma أو نموذج محلي آخر؟ عطّل مخططات الأدوات أولًا عبر - `compat.supportsTools: false`، ثم أعد الاختبار. إذا استمر الخادم في التعطل فقط - مع مطالبات OpenClaw الأكبر، فاعتبر ذلك قيدًا في الخادم/النموذج upstream. -- الأمان: تتجاوز النماذج المحلية عوامل التصفية الموجودة لدى المزوّد؛ أبقِ الوكلاء محدودي النطاق وفعّل الضغط لتقليل نطاق تأثير حقن المطالبات. +- هل تعمل استدعاءات `/v1/chat/completions` المباشرة الصغيرة، لكن `openclaw infer model run` + يفشل مع Gemma أو نموذج محلي آخر؟ عطّل مخططات الأدوات أولًا عبر + `compat.supportsTools: false`، ثم اختبر مجددًا. إذا استمر الخادم في الانهيار فقط + مع طلبات OpenClaw الأكبر، فاعتبر ذلك قيدًا من الخادم/النموذج في الجهة العليا. +- الأمان: تتجاوز النماذج المحلية عوامل التصفية من جهة المزوّد؛ أبقِ الوكلاء محدودي النطاق وفعّل Compaction لتقليل نطاق تأثير حقن الأوامر. diff --git a/docs/ar/help/testing.md b/docs/ar/help/testing.md index 6dfcf12e6..9d8092624 100644 --- a/docs/ar/help/testing.md +++ b/docs/ar/help/testing.md @@ -1,118 +1,195 @@ --- read_when: - تشغيل الاختبارات محليًا أو في CI - - إضافة اختبارات تراجعية لأخطاء النماذج/المزوّدين + - إضافة اختبارات انحدار لأخطاء النموذج/المزوّد - تصحيح سلوك Gateway + الوكيل -summary: 'حزمة الاختبار: أجنحة unit/e2e/live، ومشغلات Docker، وما الذي يغطيه كل اختبار' +summary: 'مجموعة الاختبار: مجموعات unit/e2e/live، ومشغّلات Docker، وما الذي يغطيه كل اختبار' title: الاختبار x-i18n: - generated_at: "2026-04-12T23:28:26Z" + generated_at: "2026-04-13T07:28:54Z" model: gpt-5.4 provider: openai - source_hash: a66ea672c386094ab4a8035a082c8a85d508a14301ad44b628d2a10d9cec3a52 + source_hash: 3db91b4bc36f626cd014958ec66b08b9cecd9faaa20a5746cd3a49ad4b0b1c38 source_path: help/testing.md workflow: 15 --- # الاختبار -يحتوي OpenClaw على ثلاث مجموعات Vitest (unit/integration وe2e وlive) بالإضافة إلى مجموعة صغيرة من مشغلات Docker. +يحتوي OpenClaw على ثلاث مجموعات Vitest (unit/integration و e2e و live) ومجموعة صغيرة من مشغّلات Docker. -هذا المستند هو دليل «كيف نختبر»: +هذا المستند هو دليل "كيف نختبر": - ما الذي تغطيه كل مجموعة (وما الذي لا تغطيه عمدًا) -- الأوامر التي يجب تشغيلها لسيناريوهات العمل الشائعة (محليًا، قبل الدفع، التصحيح) -- كيف تكتشف اختبارات live بيانات الاعتماد وتختار النماذج/المزوّدين -- كيفية إضافة اختبارات تراجعية لمشكلات النماذج/المزوّدين في العالم الحقيقي +- الأوامر التي يجب تشغيلها لعمليات العمل الشائعة (محليًا، قبل الدفع، تصحيح الأخطاء) +- كيف تكتشف الاختبارات الحية بيانات الاعتماد وتختار النماذج/المزوّدين +- كيفية إضافة اختبارات انحدار لمشكلات النماذج/المزوّدين الواقعية -## البدء السريع +## البداية السريعة في معظم الأيام: - البوابة الكاملة (متوقعة قبل الدفع): `pnpm build && pnpm check && pnpm test` -- تشغيل أسرع للمجموعة الكاملة محليًا على جهاز بموارد جيدة: `pnpm test:max` +- تشغيل أسرع للمجموعة الكاملة محليًا على جهاز ذي موارد كبيرة: `pnpm test:max` - حلقة مراقبة Vitest مباشرة: `pnpm test:watch` -- الاستهداف المباشر للملفات يوجّه الآن أيضًا مسارات الامتدادات/القنوات: `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` -- فضّل التشغيلات الموجّهة أولًا عندما تعمل على تكرار إصلاح فشل واحد. +- الاستهداف المباشر للملفات يمر الآن أيضًا عبر مسارات الامتدادات/القنوات: `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` +- فضّل التشغيلات المستهدفة أولًا عندما تعمل على تكرار إصلاح فشل واحد. - موقع QA مدعوم بـ Docker: `pnpm qa:lab:up` - مسار QA مدعوم بآلة Linux افتراضية: `pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline` -عندما تلمس الاختبارات أو تريد ثقة إضافية: +عندما تلمس الاختبارات أو تريد مزيدًا من الثقة: - بوابة التغطية: `pnpm test:coverage` - مجموعة E2E: `pnpm test:e2e` عند تصحيح مزوّدين/نماذج حقيقية (يتطلب بيانات اعتماد حقيقية): -- مجموعة Live (النماذج + فحوصات أدوات/صور Gateway): `pnpm test:live` -- استهدف ملف live واحدًا بهدوء: `pnpm test:live -- src/agents/models.profiles.live.test.ts` +- المجموعة الحية (فحوصات النماذج + أدوات/صور Gateway): `pnpm test:live` +- استهدف ملفًا حيًا واحدًا بهدوء: `pnpm test:live -- src/agents/models.profiles.live.test.ts` -نصيحة: عندما تحتاج فقط إلى حالة فشل واحدة، فالأفضل تضييق اختبارات live باستخدام متغيرات بيئة allowlist الموضحة أدناه. +نصيحة: عندما تحتاج فقط إلى حالة فشل واحدة، ففضّل تضييق الاختبارات الحية عبر متغيرات البيئة الخاصة بقائمة السماح الموصوفة أدناه. -## المشغلات الخاصة بـ QA +## المشغّلات الخاصة بـ QA -توجد هذه الأوامر إلى جانب مجموعات الاختبار الرئيسية عندما تحتاج إلى واقعية qa-lab: +توجد هذه الأوامر بجانب مجموعات الاختبار الرئيسية عندما تحتاج إلى واقعية QA-lab: - `pnpm openclaw qa suite` - يشغّل سيناريوهات QA المدعومة من المستودع مباشرة على المضيف. - - يشغّل عدة سيناريوهات محددة بالتوازي افتراضيًا مع عمّال Gateway معزولين، حتى 64 عاملًا أو بعدد السيناريوهات المحدد. استخدم `--concurrency ` لضبط عدد العمّال، أو `--concurrency 1` لمسار التسلسل الأقدم. + - يشغّل عدة سيناريوهات محددة بالتوازي افتراضيًا مع عمّال Gateway معزولين، حتى 64 عاملًا أو بعدد السيناريوهات المحددة. استخدم `--concurrency ` لضبط عدد العمال، أو `--concurrency 1` للمسار التسلسلي الأقدم. - `pnpm openclaw qa suite --runner multipass` - - يشغّل مجموعة QA نفسها داخل آلة Linux افتراضية مؤقتة من Multipass. - - يحافظ على سلوك اختيار السيناريو نفسه الخاص بـ `qa suite` على المضيف. - - يعيد استخدام علامات اختيار المزوّد/النموذج نفسها الخاصة بـ `qa suite`. - - تمرّر تشغيلات live مدخلات مصادقة QA المدعومة التي تكون عملية للضيف: - مفاتيح المزوّد المعتمدة على env، ومسار إعداد مزوّد QA live، و`CODEX_HOME` عند وجوده. - - يجب أن تبقى أدلة الإخراج تحت جذر المستودع حتى يتمكن الضيف من الكتابة مجددًا عبر مساحة العمل المركّبة. - - يكتب تقرير QA المعتاد + الملخص بالإضافة إلى سجلات Multipass تحت + - يشغّل مجموعة QA نفسها داخل آلة Multipass Linux افتراضية مؤقتة. + - يحتفظ بسلوك اختيار السيناريو نفسه كما في `qa suite` على المضيف. + - يعيد استخدام أعلام اختيار المزوّد/النموذج نفسها الخاصة بـ `qa suite`. + - تعيد التشغيلات الحية تمرير مدخلات مصادقة QA المدعومة والعملية للضيف: + مفاتيح المزوّد المعتمدة على env، ومسار إعداد مزوّد QA الحي، و `CODEX_HOME` عند وجوده. + - يجب أن تبقى مجلدات الإخراج تحت جذر المستودع حتى يتمكن الضيف من الكتابة مرة أخرى عبر مساحة العمل المركّبة. + - يكتب تقرير + ملخص QA العاديين بالإضافة إلى سجلات Multipass تحت `.artifacts/qa-e2e/...`. - `pnpm qa:lab:up` - يبدأ موقع QA المدعوم بـ Docker لأعمال QA بأسلوب المشغّل. - `pnpm openclaw qa matrix` - - يشغّل مسار Matrix live QA على خادم Tuwunel مؤقت مدعوم بـ Docker. - - يجهّز ثلاثة مستخدمين مؤقتين لـ Matrix (`driver` و`sut` و`observer`) بالإضافة إلى غرفة خاصة واحدة، ثم يبدأ عملية Gateway فرعية لـ QA باستخدام Plugin Matrix الحقيقي كنقل SUT. - - يستخدم صورة Tuwunel المستقرة المثبتة `ghcr.io/matrix-construct/tuwunel:v1.5.1` افتراضيًا. استبدلها عبر `OPENCLAW_QA_MATRIX_TUWUNEL_IMAGE` عندما تحتاج إلى اختبار صورة مختلفة. - - يكتب تقرير Matrix QA وملخصًا وartifact للأحداث المُلاحظة تحت `.artifacts/qa-e2e/...`. + - يشغّل مسار Matrix QA الحي مقابل خادم Tuwunel منزلي مؤقت ومدعوم بـ Docker. + - يوفّر ثلاثة مستخدمين مؤقتين لـ Matrix (`driver` و `sut` و `observer`) بالإضافة إلى غرفة خاصة واحدة، ثم يبدأ عنصر Gateway فرعي لـ QA باستخدام Matrix Plugin الحقيقي كوسيلة نقل SUT. + - يستخدم صورة Tuwunel المستقرة المثبتة `ghcr.io/matrix-construct/tuwunel:v1.5.1` افتراضيًا. تجاوزها باستخدام `OPENCLAW_QA_MATRIX_TUWUNEL_IMAGE` عندما تحتاج إلى اختبار صورة مختلفة. + - يدعم Matrix حاليًا فقط `--credential-source env` لأن المسار يوفّر مستخدمين مؤقتين محليًا. + - يكتب تقرير Matrix QA وملخصًا وقطعة observed-events تحت `.artifacts/qa-e2e/...`. - `pnpm openclaw qa telegram` - - يشغّل مسار Telegram live QA على مجموعة خاصة حقيقية باستخدام رمزي bot الخاصين بـ driver وSUT من env. - - يتطلب `OPENCLAW_QA_TELEGRAM_GROUP_ID` و`OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN` و`OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`. يجب أن يكون معرّف المجموعة هو معرّف دردشة Telegram الرقمي. - - يتطلب روبوتين مختلفين داخل المجموعة الخاصة نفسها، مع كون روبوت SUT يوفّر اسم مستخدم Telegram. - - من أجل ملاحظة مستقرة بين bots، فعّل Bot-to-Bot Communication Mode في `@BotFather` لكلا الروبوتين وتأكد من أن روبوت driver يمكنه ملاحظة حركة bots داخل المجموعة. - - يكتب تقرير Telegram QA وملخصًا وartifact للرسائل المُلاحظة تحت `.artifacts/qa-e2e/...`. + - يشغّل مسار Telegram QA الحي مقابل مجموعة خاصة حقيقية باستخدام رمزي bot الخاصين بـ driver و SUT من env. + - يتطلب `OPENCLAW_QA_TELEGRAM_GROUP_ID` و `OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN` و `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`. يجب أن يكون معرّف المجموعة هو معرّف دردشة Telegram رقميًا. + - يدعم `--credential-source convex` لبيانات الاعتماد المشتركة المجمّعة. استخدم وضع env افتراضيًا، أو اضبط `OPENCLAW_QA_CREDENTIAL_SOURCE=convex` لاختيار عقود الإعارة المجمّعة. + - يتطلب botين مختلفين في المجموعة الخاصة نفسها، على أن يعرّض bot الخاص بـ SUT اسم مستخدم Telegram. + - من أجل ملاحظة مستقرة بين bot وآخر، فعّل وضع Bot-to-Bot Communication Mode في `@BotFather` لكلا botين وتأكد من أن bot الخاص بـ driver يمكنه ملاحظة حركة bot داخل المجموعة. + - يكتب تقرير Telegram QA وملخصًا وقطعة observed-messages تحت `.artifacts/qa-e2e/...`. -تتشارك مسارات النقل الحية عقدًا قياسيًا واحدًا حتى لا تنجرف وسائل النقل الجديدة: +تشارك مسارات النقل الحية عقدًا معياريًا واحدًا حتى لا تنحرف وسائل النقل الجديدة: -يبقى `qa-channel` مجموعة QA الاصطناعية الواسعة وليس جزءًا من مصفوفة تغطية النقل الحي. +يبقى `qa-channel` مجموعة QA تركيبية واسعة وليس جزءًا من مصفوفة تغطية النقل الحي. -| المسار | Canary | بوابة الإشارة | حظر allowlist | رد على المستوى الأعلى | استئناف بعد إعادة التشغيل | متابعة الخيط | عزل الخيط | ملاحظة التفاعلات | أمر المساعدة | -| ------ | ------ | -------------- | ------------- | ---------------------- | -------------------------- | ------------ | ---------- | ---------------- | ------------ | -| Matrix | x | x | x | x | x | x | x | x | | -| Telegram | x | | | | | | | | x | +| المسار | Canary | بوابة الإشارة | حظر قائمة السماح | رد على المستوى الأعلى | استئناف بعد إعادة التشغيل | متابعة الخيط | عزل الخيط | ملاحظة التفاعلات | أمر المساعدة | +| ------ | ------ | ------------- | ---------------- | ---------------------- | ------------------------- | ------------ | ---------- | ---------------- | ------------ | +| Matrix | x | x | x | x | x | x | x | x | | +| Telegram | x | | | | | | | | x | + +### بيانات اعتماد Telegram المشتركة عبر Convex (v1) + +عندما يكون `--credential-source convex` (أو `OPENCLAW_QA_CREDENTIAL_SOURCE=convex`) مفعّلًا لـ +`openclaw qa telegram`، يحصل QA lab على إعارة حصرية من مجموعة مدعومة بـ Convex، ويرسل Heartbeat +لتلك الإعارة أثناء تشغيل المسار، ويحرّر الإعارة عند الإيقاف. + +هيكل مشروع Convex المرجعي: + +- `qa/convex-credential-broker/` + +متغيرات env المطلوبة: + +- `OPENCLAW_QA_CONVEX_SITE_URL` (على سبيل المثال `https://your-deployment.convex.site`) +- سر واحد للدور المحدد: + - `OPENCLAW_QA_CONVEX_SECRET_MAINTAINER` للدور `maintainer` + - `OPENCLAW_QA_CONVEX_SECRET_CI` للدور `ci` +- اختيار دور بيانات الاعتماد: + - CLI: `--credential-role maintainer|ci` + - القيمة الافتراضية في env: `OPENCLAW_QA_CREDENTIAL_ROLE` (القيمة الافتراضية `maintainer`) + +متغيرات env الاختيارية: + +- `OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS` (القيمة الافتراضية `1200000`) +- `OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS` (القيمة الافتراضية `30000`) +- `OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS` (القيمة الافتراضية `90000`) +- `OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS` (القيمة الافتراضية `15000`) +- `OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX` (القيمة الافتراضية `/qa-credentials/v1`) +- `OPENCLAW_QA_CREDENTIAL_OWNER_ID` (معرّف تتبع اختياري) +- يسمح `OPENCLAW_QA_ALLOW_INSECURE_HTTP=1` بعناوين URL الخاصة بـ Convex من نوع `http://` على loopback لأغراض التطوير المحلي فقط. + +يجب أن يستخدم `OPENCLAW_QA_CONVEX_SITE_URL` البروتوكول `https://` في التشغيل العادي. + +تتطلب أوامر الإدارة الخاصة بالمشرفين (إضافة/إزالة/سرد المجموعة) +`OPENCLAW_QA_CONVEX_SECRET_MAINTAINER` تحديدًا. + +مساعدات CLI للمشرفين: + +```bash +pnpm openclaw qa credentials add --kind telegram --payload-file qa/telegram-credential.json +pnpm openclaw qa credentials list --kind telegram +pnpm openclaw qa credentials remove --credential-id +``` + +استخدم `--json` للحصول على خرج قابل للقراءة آليًا في السكربتات وأدوات CI. + +عقد نقاط النهاية الافتراضي (`OPENCLAW_QA_CONVEX_SITE_URL` + `/qa-credentials/v1`): + +- `POST /acquire` + - الطلب: `{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs }` + - النجاح: `{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? }` + - الاستنفاد/قابل لإعادة المحاولة: `{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }` +- `POST /heartbeat` + - الطلب: `{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs }` + - النجاح: `{ status: "ok" }` (أو `2xx` فارغ) +- `POST /release` + - الطلب: `{ kind, ownerId, actorRole, credentialId, leaseToken }` + - النجاح: `{ status: "ok" }` (أو `2xx` فارغ) +- `POST /admin/add` (سر maintainer فقط) + - الطلب: `{ kind, actorId, payload, note?, status? }` + - النجاح: `{ status: "ok", credential }` +- `POST /admin/remove` (سر maintainer فقط) + - الطلب: `{ credentialId, actorId }` + - النجاح: `{ status: "ok", changed, credential }` + - حماية الإعارة النشطة: `{ status: "error", code: "LEASE_ACTIVE", ... }` +- `POST /admin/list` (سر maintainer فقط) + - الطلب: `{ kind?, status?, includePayload?, limit? }` + - النجاح: `{ status: "ok", credentials, count }` + +شكل الحمولة لنوع Telegram: + +- `{ groupId: string, driverToken: string, sutToken: string }` +- يجب أن يكون `groupId` سلسلة تمثل معرّف دردشة Telegram رقميًا. +- يتحقق `admin/add` من هذا الشكل لـ `kind: "telegram"` ويرفض الحمولة غير الصحيحة. ### إضافة قناة إلى QA -تتطلب إضافة قناة إلى نظام QA المعتمد على Markdown أمرين فقط بالضبط: +تتطلب إضافة قناة إلى نظام QA المكتوب بـ markdown شيئين فقط بالضبط: 1. محول نقل للقناة. -2. حزمة سيناريوهات تختبر عقد القناة. +2. حزمة سيناريوهات تمارس عقد القناة. -لا تضف مشغّل QA خاصًا بقناة عندما يكون بإمكان المشغّل المشترك `qa-lab` تولي التدفق. +لا تضف مشغّل QA خاصًا بالقناة عندما يمكن لمشغّل `qa-lab` المشترك +أن يمتلك التدفق. -يتولى `qa-lab` الآليات المشتركة: +يمتلك `qa-lab` الآليات المشتركة: - بدء المجموعة وإنهاؤها -- توازي العمّال -- كتابة artifacts +- تزامن العمال +- كتابة القطع - توليد التقارير - تنفيذ السيناريوهات - الأسماء المستعارة التوافقية لسيناريوهات `qa-channel` الأقدم -ويتولى محول القناة عقد النقل: +يمتلك محول القناة عقد النقل: -- كيفية إعداد Gateway لذلك النقل +- كيفية ضبط Gateway لذلك النقل - كيفية التحقق من الجاهزية - كيفية حقن الأحداث الواردة - كيفية ملاحظة الرسائل الصادرة -- كيفية كشف النصوص وحالة النقل المعيارية +- كيفية كشف النصوص المنسوخة وحالة النقل المطبّعة - كيفية تنفيذ الإجراءات المدعومة بالنقل - كيفية التعامل مع إعادة الضبط أو التنظيف الخاص بالنقل @@ -120,19 +197,19 @@ x-i18n: 1. تنفيذ محول النقل على واجهة `qa-lab` المشتركة. 2. تسجيل المحول في سجل النقل. -3. إبقاء الآليات الخاصة بالنقل داخل المحول أو إطار القناة. -4. تأليف أو تكييف سيناريوهات Markdown تحت `qa/scenarios/`. +3. إبقاء الآليات الخاصة بالنقل داخل المحول أو حزام القناة. +4. تأليف أو تكييف سيناريوهات markdown تحت `qa/scenarios/`. 5. استخدام مساعدات السيناريو العامة للسيناريوهات الجديدة. -6. الحفاظ على عمل الأسماء المستعارة التوافقية الحالية ما لم يكن المستودع ينفذ ترحيلًا مقصودًا. +6. الإبقاء على الأسماء المستعارة التوافقية الحالية عاملة ما لم يكن المستودع يقوم بترحيل مقصود. قاعدة القرار صارمة: - إذا أمكن التعبير عن السلوك مرة واحدة في `qa-lab`، فضعه في `qa-lab`. -- إذا كان السلوك يعتمد على نقل قناة واحدة، فأبقِه في ذلك المحول أو إطار Plugin. -- إذا احتاج سيناريو إلى قدرة جديدة يمكن لأكثر من قناة استخدامها، فأضف مساعدًا عامًا بدلًا من فرع خاص بقناة في `suite.ts`. -- إذا كان السلوك ذا معنى لنقل واحد فقط، فأبقِ السيناريو خاصًا بذلك النقل وصرّح بذلك بوضوح في عقد السيناريو. +- إذا كان السلوك يعتمد على نقل قناة واحدة، فأبقِه في ذلك المحول أو حزام Plugin. +- إذا احتاج السيناريو إلى قدرة جديدة يمكن لأكثر من قناة استخدامها، فأضف مساعدًا عامًا بدلًا من فرع خاص بقناة في `suite.ts`. +- إذا كان السلوك ذا معنى فقط لنقل واحد، فأبقِ السيناريو خاصًا بذلك النقل واجعل ذلك واضحًا في عقد السيناريو. -أسماء المساعدات العامة المفضلة للسيناريوهات الجديدة هي: +الأسماء العامة المفضلة للمساعدات في السيناريوهات الجديدة هي: - `waitForTransportReady` - `waitForChannelReady` @@ -147,7 +224,7 @@ x-i18n: - `formatTransportTranscript` - `resetTransport` -ولا تزال الأسماء المستعارة التوافقية متاحة للسيناريوهات الحالية، بما في ذلك: +تبقى الأسماء المستعارة التوافقية متاحة للسيناريوهات الحالية، بما في ذلك: - `waitForQaChannelReady` - `waitForOutboundMessage` @@ -156,99 +233,101 @@ x-i18n: - `resetBus` يجب أن تستخدم الأعمال الجديدة الخاصة بالقنوات أسماء المساعدات العامة. -توجد الأسماء المستعارة التوافقية لتجنب ترحيل شامل دفعة واحدة، وليس كنموذج -لتأليف سيناريوهات جديدة. +توجد الأسماء المستعارة التوافقية لتجنب ترحيل شامل دفعة واحدة، وليست نموذجًا +لتأليف السيناريوهات الجديدة. ## مجموعات الاختبار (ما الذي يعمل وأين) -فكّر في المجموعات على أنها «تزداد واقعية» (وتزداد هشاشة/كلفة): +فكّر في المجموعات على أنها "زيادة في الواقعية" (وزيادة في عدم الاستقرار/التكلفة): ### Unit / integration (الافتراضي) - الأمر: `pnpm test` -- الإعداد: عشر تشغيلات shards متسلسلة (`vitest.full-*.config.ts`) عبر مشاريع Vitest المحددة الحالية -- الملفات: جرد core/unit تحت `src/**/*.test.ts` و`packages/**/*.test.ts` و`test/**/*.test.ts` واختبارات `ui` الخاصة بـ node والمسموح بها والتي يغطيها `vitest.unit.config.ts` +- الإعداد: عشر تشغيلات shards متسلسلة (`vitest.full-*.config.ts`) عبر مشاريع Vitest المحددة الموجودة +- الملفات: مخزونات core/unit تحت `src/**/*.test.ts` و `packages/**/*.test.ts` و `test/**/*.test.ts` واختبارات `ui` الخاصة بـ node والمسموح بها والمغطاة بواسطة `vitest.unit.config.ts` - النطاق: - اختبارات unit خالصة - - اختبارات تكامل داخل العملية (مصادقة gateway، والتوجيه، والأدوات، والتحليل، والإعداد) - - اختبارات تراجعية حتمية للأخطاء المعروفة + - اختبارات integration داخل العملية (مصادقة gateway، والتوجيه، والأدوات، والتحليل، والإعداد) + - اختبارات انحدار حتمية للأخطاء المعروفة - التوقعات: - - تُشغَّل في CI + - تعمل في CI - لا تتطلب مفاتيح حقيقية - يجب أن تكون سريعة ومستقرة - ملاحظة المشاريع: - - أصبح `pnpm test` غير الموجَّه يشغّل الآن أحد عشر إعداد shard أصغر (`core-unit-src` و`core-unit-security` و`core-unit-ui` و`core-unit-support` و`core-support-boundary` و`core-contracts` و`core-bundled` و`core-runtime` و`agentic` و`auto-reply` و`extensions`) بدلًا من عملية root-project أصلية عملاقة واحدة. وهذا يقلّل ذروة RSS على الأجهزة المحمّلة ويمنع أعمال auto-reply/extension من تجويع المجموعات غير المرتبطة. - - لا يزال `pnpm test --watch` يستخدم مخطط المشاريع الأصلي في الجذر من `vitest.config.ts`، لأن حلقة watch متعددة الـ shards غير عملية. - - يوجّه `pnpm test` و`pnpm test:watch` و`pnpm test:perf:imports` أهداف الملفات/الأدلة الصريحة عبر المسارات المحددة أولًا، لذا فإن `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` يتجنب كلفة بدء root project الكامل. - - يوسّع `pnpm test:changed` مسارات git المتغيرة إلى المسارات المحددة نفسها عندما يقتصر الفرق على ملفات source/test القابلة للتوجيه؛ بينما تعود تعديلات config/setup إلى إعادة تشغيل root-project الواسعة. - - تُوجَّه اختبارات unit الخفيفة من حيث الاستيراد الخاصة بـ agents وcommands وplugins ومساعدات auto-reply و`plugin-sdk` ومناطق الأدوات الخالصة المشابهة عبر مسار `unit-fast` الذي يتجاوز `test/setup-openclaw-runtime.ts`؛ بينما تبقى الملفات ذات الحالة أو الثقيلة وقت التشغيل على المسارات الحالية. - - تُعيَّن أيضًا بعض ملفات source المساعدة المحددة في `plugin-sdk` و`commands` في التشغيلات ذات النمط changed إلى اختبارات شقيقة صريحة في تلك المسارات الخفيفة، بحيث تتجنب تعديلات المساعدات إعادة تشغيل المجموعة الثقيلة الكاملة لذلك الدليل. - - أصبح لدى `auto-reply` الآن ثلاث مجموعات مخصصة: مساعدات core العليا، واختبارات التكامل العليا `reply.*`، والشجرة الفرعية `src/auto-reply/reply/**`. وهذا يُبقي أعمال reply harness الأثقل بعيدًا عن اختبارات الحالة/المقاطع/الرموز الرخيصة. + - التشغيل غير المستهدف لـ `pnpm test` يشغّل الآن أحد عشر إعداد shard أصغر (`core-unit-src` و `core-unit-security` و `core-unit-ui` و `core-unit-support` و `core-support-boundary` و `core-contracts` و `core-bundled` و `core-runtime` و `agentic` و `auto-reply` و `extensions`) بدلًا من عملية root-project أصلية واحدة ضخمة. هذا يقلل ذروة RSS على الأجهزة المحمّلة ويتجنب أن تؤدي أعمال auto-reply/extension إلى تجويع المجموعات غير المرتبطة. + - لا يزال `pnpm test --watch` يستخدم رسم المشاريع الأصلي لـ root `vitest.config.ts`، لأن حلقة watch متعددة الـ shards غير عملية. + - `pnpm test` و `pnpm test:watch` و `pnpm test:perf:imports` تمرّر أهداف الملفات/المجلدات الصريحة عبر المسارات المحددة أولًا، لذلك فإن `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` يتجنب تكلفة بدء التشغيل الكاملة لـ root project. + - يقوم `pnpm test:changed` بتوسيع مسارات git المتغيرة إلى المسارات المحددة نفسها عندما يقتصر الفرق على ملفات source/test القابلة للتوجيه؛ أما تعديلات config/setup فتعود إلى إعادة تشغيل root-project الواسعة. + - اختبارات unit الخفيفة من حيث الاستيراد من agents و commands و plugins ومساعدات auto-reply و `plugin-sdk` والمناطق المشابهة من الأدوات الخالصة تمر عبر مسار `unit-fast`، الذي يتجاوز `test/setup-openclaw-runtime.ts`؛ بينما تبقى الملفات ذات الحالة/الكثيفة وقت التشغيل على المسارات الحالية. + - تُربط أيضًا ملفات source المساعدة المحددة في `plugin-sdk` و `commands` في تشغيل changed-mode باختبارات sibling صريحة في تلك المسارات الخفيفة، بحيث تتجنب تعديلات المساعدات إعادة تشغيل المجموعة الثقيلة الكاملة لذلك الدليل. + - يملك `auto-reply` الآن ثلاث مجموعات مخصصة: مساعدات core العلوية، واختبارات integration العلوية `reply.*`، والشجرة الفرعية `src/auto-reply/reply/**`. هذا يُبقي أثقل أعمال harness الخاصة بالردود بعيدًا عن اختبارات status/chunk/token الرخيصة. - ملاحظة المشغّل المضمّن: - - عندما تغيّر مدخلات اكتشاف أدوات الرسائل أو سياق وقت تشغيل Compaction، - حافظ على مستويي التغطية معًا. - - أضف اختبارات تراجعية مركزة للمساعدات عند حدود التوجيه/التطبيع الخالصة. - - وحافظ أيضًا على سلامة مجموعات تكامل المشغّل المضمّن: + - عندما تغيّر مدخلات اكتشاف أدوات الرسائل أو سياق وقت التشغيل الخاص بـ Compaction، + حافظ على مستويي التغطية كليهما. + - أضف اختبارات انحدار مركزة للمساعدات الخاصة بحدود التوجيه/التطبيع الخالصة. + - وحافظ أيضًا على سلامة مجموعات integration الخاصة بالمشغّل المضمّن: `src/agents/pi-embedded-runner/compact.hooks.test.ts`، `src/agents/pi-embedded-runner/run.overflow-compaction.test.ts`، و `src/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts`. - - تتحقق هذه المجموعات من أن المعرّفات المحددة وسلوك Compaction لا يزالان يمران عبر المسارات الفعلية `run.ts` / `compact.ts`؛ واختبارات المساعدات وحدها ليست بديلًا كافيًا لهذه المسارات التكاملية. + - تتحقق هذه المجموعات من أن المعرّفات المحددة وسلوك Compaction لا يزالان يتدفقان + عبر المسارات الحقيقية `run.ts` / `compact.ts`؛ ولا تُعد اختبارات المساعدات وحدها + بديلًا كافيًا عن مسارات integration هذه. - ملاحظة الـ pool: - أصبح إعداد Vitest الأساسي يستخدم `threads` افتراضيًا. - - كما يثبّت إعداد Vitest المشترك `isolate: false` ويستخدم المشغّل غير المعزول عبر مشاريع الجذر وتهيئات e2e وlive. - - يحتفظ مسار UI في الجذر بإعداد `jsdom` والمُحسِّن الخاص به، لكنه يعمل الآن أيضًا على المشغّل المشترك غير المعزول. - - يرث كل shard في `pnpm test` إعدادات `threads` + `isolate: false` نفسها من إعداد Vitest المشترك. - - يضيف مشغّل `scripts/run-vitest.mjs` المشترك الآن أيضًا `--no-maglev` افتراضيًا لعمليات Node الفرعية الخاصة بـ Vitest لتقليل تذبذب ترجمة V8 أثناء التشغيلات المحلية الكبيرة. اضبط `OPENCLAW_VITEST_ENABLE_MAGLEV=1` إذا كنت بحاجة إلى المقارنة مع سلوك V8 القياسي. + - كما يثبّت إعداد Vitest المشترك `isolate: false` ويستخدم المشغّل غير المعزول عبر إعدادات root projects و e2e و live. + - يحتفظ مسار root UI بإعداد `jsdom` والمُحسِّن الخاص به، لكنه يعمل الآن أيضًا على المشغّل المشترك غير المعزول. + - يرث كل shard في `pnpm test` القيم الافتراضية نفسها `threads` + `isolate: false` من إعداد Vitest المشترك. + - يضيف مشغّل `scripts/run-vitest.mjs` المشترك الآن أيضًا `--no-maglev` افتراضيًا لعمليات Node الفرعية الخاصة بـ Vitest لتقليل تذبذب الترجمة في V8 أثناء التشغيلات المحلية الكبيرة. اضبط `OPENCLAW_VITEST_ENABLE_MAGLEV=1` إذا كنت بحاجة إلى المقارنة مع سلوك V8 القياسي. - ملاحظة التكرار المحلي السريع: - - يوجّه `pnpm test:changed` عبر المسارات المحددة عندما تطابق المسارات المتغيرة مجموعة أصغر بشكل واضح. - - يحافظ `pnpm test:max` و`pnpm test:changed:max` على سلوك التوجيه نفسه، ولكن مع حد أعلى أكبر للعمّال. - - أصبح التوسّع التلقائي المحلي للعمّال محافظًا عمدًا الآن، ويتراجع أيضًا عندما يكون متوسط حمل المضيف مرتفعًا أصلًا، بحيث تتسبب تشغيلات Vitest المتزامنة المتعددة في ضرر أقل افتراضيًا. - - يعلّم إعداد Vitest الأساسي المشاريع/ملفات الإعداد كـ `forceRerunTriggers` حتى تبقى إعادة التشغيل في وضع changed صحيحة عند تغيّر توصيل الاختبارات. - - يحافظ الإعداد على تفعيل `OPENCLAW_VITEST_FS_MODULE_CACHE` على المضيفين المدعومين؛ اضبط `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path` إذا أردت موقع cache صريحًا واحدًا لأغراض التحليل المباشر. + - يمر `pnpm test:changed` عبر المسارات المحددة عندما تتطابق المسارات المتغيرة بوضوح مع مجموعة أصغر. + - يحتفظ `pnpm test:max` و `pnpm test:changed:max` بسلوك التوجيه نفسه، فقط مع حد أعلى أكبر للعمال. + - أصبح التحجيم التلقائي المحلي للعمال محافظًا عمدًا الآن، كما أنه يتراجع عندما يكون متوسط حمل المضيف مرتفعًا أصلًا، بحيث تتسبب تشغيلات Vitest المتزامنة المتعددة بضرر أقل افتراضيًا. + - يضع إعداد Vitest الأساسي ملفات المشاريع/الإعداد كـ `forceRerunTriggers` حتى تبقى إعادة التشغيل في changed-mode صحيحة عند تغيّر توصيلات الاختبار. + - يحتفظ الإعداد بتمكين `OPENCLAW_VITEST_FS_MODULE_CACHE` على المضيفين المدعومين؛ اضبط `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path` إذا كنت تريد موقع cache صريحًا واحدًا لأغراض profiling المباشر. - ملاحظة تصحيح الأداء: - - يفعّل `pnpm test:perf:imports` تقارير مدة الاستيراد في Vitest بالإضافة إلى مخرجات تفصيل الاستيراد. - - يقيّد `pnpm test:perf:imports:changed` العرض التحليلي نفسه إلى الملفات التي تغيّرت منذ `origin/main`. -- يقارن `pnpm test:perf:changed:bench -- --ref ` بين `test:changed` الموجَّه والمسار الأصلي لـ root-project لذلك الفرق الملتزم ويطبع زمن التنفيذ بالإضافة إلى أقصى RSS على macOS. -- يختبر `pnpm test:perf:changed:bench -- --worktree` الشجرة الحالية غير النظيفة عبر توجيه قائمة الملفات المتغيرة خلال `scripts/test-projects.mjs` وإعداد Vitest في الجذر. + - يفعّل `pnpm test:perf:imports` تقارير مدة الاستيراد في Vitest بالإضافة إلى خرج تفصيلي للاستيراد. + - يقيّد `pnpm test:perf:imports:changed` عرض profiling نفسه على الملفات المتغيرة منذ `origin/main`. +- يقارن `pnpm test:perf:changed:bench -- --ref ` بين `test:changed` الموجّه ومسار root-project الأصلي لذلك الفرق الملتزم، ويطبع زمن التنفيذ بالإضافة إلى macOS max RSS. +- يقيّم `pnpm test:perf:changed:bench -- --worktree` الشجرة المتسخة الحالية بتمرير قائمة الملفات المتغيرة عبر `scripts/test-projects.mjs` وإعداد root Vitest. - يكتب `pnpm test:perf:profile:main` ملف تعريف CPU للخيط الرئيسي لزمن بدء Vitest/Vite وكلفة التحويل. - - ويكتب `pnpm test:perf:profile:runner` ملفات تعريف CPU+heap الخاصة بالمشغّل لمجموعة unit مع تعطيل التوازي على مستوى الملفات. + - يكتب `pnpm test:perf:profile:runner` ملفات تعريف CPU+heap الخاصة بالمشغّل لمجموعة unit مع تعطيل التوازي على مستوى الملفات. ### E2E (اختبار smoke لـ gateway) - الأمر: `pnpm test:e2e` - الإعداد: `vitest.e2e.config.ts` -- الملفات: `src/**/*.e2e.test.ts` و`test/**/*.e2e.test.ts` -- الإعدادات الافتراضية لوقت التشغيل: - - يستخدم `threads` في Vitest مع `isolate: false`، بما يتطابق مع بقية المستودع. - - يستخدم عمّالًا تكيفيين (في CI: حتى 2، ومحليًا: 1 افتراضيًا). - - يعمل في الوضع الصامت افتراضيًا لتقليل كلفة إدخال/إخراج وحدة التحكم. +- الملفات: `src/**/*.e2e.test.ts` و `test/**/*.e2e.test.ts` +- القيم الافتراضية لوقت التشغيل: + - يستخدم `threads` في Vitest مع `isolate: false`، بما يتوافق مع بقية المستودع. + - يستخدم عمالًا متكيفين (CI: حتى 2، محليًا: 1 افتراضيًا). + - يعمل في الوضع الصامت افتراضيًا لتقليل كلفة I/O في الطرفية. - تجاوزات مفيدة: - - `OPENCLAW_E2E_WORKERS=` لفرض عدد العمّال (بحد أقصى 16). - - `OPENCLAW_E2E_VERBOSE=1` لإعادة تفعيل إخراج وحدة التحكم المفصل. + - `OPENCLAW_E2E_WORKERS=` لفرض عدد العمال (بحد أقصى 16). + - `OPENCLAW_E2E_VERBOSE=1` لإعادة تفعيل خرج الطرفية التفصيلي. - النطاق: - - سلوك end-to-end متعدد نُسخ gateway - - أسطح WebSocket/HTTP، وإقران node، والشبكات الأثقل + - سلوك gateway من طرف إلى طرف متعدد النسخ + - أسطح WebSocket/HTTP، واقتران Node، والشبكات الأثقل - التوقعات: - - يُشغَّل في CI (عند تفعيله في المسار) - - لا يتطلب مفاتيح حقيقية - - يحتوي على أجزاء متحركة أكثر من اختبارات unit (وقد يكون أبطأ) + - تعمل في CI (عندما تكون مفعّلة في خط التنفيذ) + - لا تتطلب مفاتيح حقيقية + - تحتوي على أجزاء متحركة أكثر من اختبارات unit (وقد تكون أبطأ) ### E2E: اختبار smoke للواجهة الخلفية OpenShell - الأمر: `pnpm test:e2e:openshell` - الملف: `test/openshell-sandbox.e2e.test.ts` - النطاق: - - يبدأ Gateway معزولًا لـ OpenShell على المضيف عبر Docker + - يبدأ OpenShell gateway معزولًا على المضيف عبر Docker - ينشئ sandbox من Dockerfile محلي مؤقت - - يختبر الواجهة الخلفية OpenShell في OpenClaw عبر `sandbox ssh-config` الحقيقي وتنفيذ SSH - - يتحقق من سلوك نظام الملفات canonical عن بُعد عبر جسر sandbox fs + - يختبر الواجهة الخلفية OpenClaw الخاصة بـ OpenShell عبر `sandbox ssh-config` + تنفيذ SSH الحقيقي + - يتحقق من سلوك نظام الملفات canonical البعيد عبر جسر sandbox fs - التوقعات: - - اختياري فقط؛ وليس جزءًا من تشغيل `pnpm test:e2e` الافتراضي - - يتطلب CLI محليًا لـ `openshell` بالإضافة إلى Docker daemon عامل - - يستخدم `HOME` / `XDG_CONFIG_HOME` معزولين، ثم يدمّر Gateway الاختباري وsandbox + - اختيارية فقط؛ وليست جزءًا من التشغيل الافتراضي `pnpm test:e2e` + - تتطلب CLI محليًا لـ `openshell` بالإضافة إلى Docker daemon عامل + - تستخدم `HOME` / `XDG_CONFIG_HOME` معزولين، ثم تدمّر gateway و sandbox الخاصين بالاختبار - تجاوزات مفيدة: - - `OPENCLAW_E2E_OPENSHELL=1` لتفعيل الاختبار عند تشغيل مجموعة e2e الأوسع يدويًا - - `OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell` للإشارة إلى ملف CLI ثنائي غير افتراضي أو script wrapper + - `OPENCLAW_E2E_OPENSHELL=1` لتمكين الاختبار عند تشغيل مجموعة e2e الأوسع يدويًا + - `OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell` للإشارة إلى ملف CLI ثنائي أو wrapper script غير افتراضي ### Live (مزوّدون حقيقيون + نماذج حقيقية) @@ -257,113 +336,113 @@ x-i18n: - الملفات: `src/**/*.live.test.ts` - الافتراضي: **مفعّل** بواسطة `pnpm test:live` (يضبط `OPENCLAW_LIVE_TEST=1`) - النطاق: - - «هل يعمل هذا المزوّد/النموذج فعلًا _اليوم_ باستخدام بيانات اعتماد حقيقية؟» - - التقاط تغيّرات تنسيق المزوّد، وخصائص استدعاء الأدوات، ومشكلات المصادقة، وسلوك حدود المعدل + - "هل يعمل هذا المزوّد/النموذج فعلًا _اليوم_ باستخدام بيانات اعتماد حقيقية؟" + - اكتشاف تغييرات تنسيق المزوّد، ومراوغات استدعاء الأدوات، ومشكلات المصادقة، وسلوك تحديد المعدل - التوقعات: - - غير مستقر في CI بطبيعته (شبكات حقيقية، وسياسات مزوّدين حقيقية، وحصص، وانقطاعات) - - يكلّف مالًا / يستهلك حدود المعدل - - يُفضّل تشغيل مجموعات فرعية مضيقة بدلًا من تشغيل «كل شيء» -- تستورد تشغيلات live الملف `~/.profile` لالتقاط مفاتيح API الناقصة. -- افتراضيًا، تعزل تشغيلات live أيضًا `HOME` وتنسخ مواد config/auth إلى home اختباري مؤقت حتى لا تتمكن تجهيزات unit من تعديل `~/.openclaw` الحقيقي. -- اضبط `OPENCLAW_LIVE_USE_REAL_HOME=1` فقط عندما تحتاج عمدًا إلى أن تستخدم اختبارات live دليل home الحقيقي. -- أصبح `pnpm test:live` يستخدم الآن وضعًا أهدأ افتراضيًا: فهو يحتفظ بمخرجات التقدم `[live] ...`، لكنه يخفي إشعار `~/.profile` الإضافي ويكتم سجلات تمهيد gateway وضجيج Bonjour. اضبط `OPENCLAW_LIVE_TEST_QUIET=0` إذا أردت سجلات البدء الكاملة مجددًا. -- تدوير مفاتيح API (خاص بكل مزوّد): اضبط `*_API_KEYS` بتنسيق الفاصلة/الفاصلة المنقوطة أو `*_API_KEY_1` و`*_API_KEY_2` (مثل `OPENAI_API_KEYS` و`ANTHROPIC_API_KEYS` و`GEMINI_API_KEYS`) أو تجاوزًا لكل live عبر `OPENCLAW_LIVE_*_KEY`؛ وتعيد الاختبارات المحاولة عند استجابات حدود المعدل. -- مخرجات التقدم/Heartbeat: - - تصدر مجموعات live الآن أسطر التقدم إلى stderr بحيث تكون استدعاءات المزوّد الطويلة مرئية على أنها نشطة حتى عندما يكون التقاط وحدة التحكم في Vitest هادئًا. - - يعطّل `vitest.live.config.ts` اعتراض وحدة التحكم في Vitest بحيث تتدفق أسطر تقدم المزوّد/gateway فورًا أثناء تشغيلات live. - - اضبط Heartbeat للنموذج المباشر عبر `OPENCLAW_LIVE_HEARTBEAT_MS`. - - واضبط Heartbeat الخاص بـ gateway/probe عبر `OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS`. + - غير مستقرة بالنسبة إلى CI بطبيعتها (شبكات حقيقية، وسياسات مزوّد حقيقية، وحصص، وانقطاعات) + - تكلف مالًا / تستخدم حدود المعدل + - يُفضّل تشغيل مجموعات فرعية مضيقة بدلًا من "كل شيء" +- تعتمد التشغيلات الحية على `~/.profile` لالتقاط مفاتيح API الناقصة. +- افتراضيًا، لا تزال التشغيلات الحية تعزل `HOME` وتنسخ مواد config/auth إلى دليل home مؤقت خاص بالاختبار حتى لا تتمكن fixtures الخاصة بـ unit من تعديل `~/.openclaw` الحقيقي لديك. +- اضبط `OPENCLAW_LIVE_USE_REAL_HOME=1` فقط عندما تحتاج عمدًا إلى أن تستخدم الاختبارات الحية دليل home الحقيقي لديك. +- يستخدم `pnpm test:live` الآن وضعًا أكثر هدوءًا افتراضيًا: فهو يحتفظ بخرج التقدّم `[live] ...`، لكنه يخفي إشعار `~/.profile` الإضافي ويكتم سجلات bootstrap الخاصة بـ gateway وضجيج Bonjour. اضبط `OPENCLAW_LIVE_TEST_QUIET=0` إذا كنت تريد استعادة سجلات بدء التشغيل الكاملة. +- تدوير مفاتيح API (خاص بالمزوّد): اضبط `*_API_KEYS` بتنسيق comma/semicolon أو `*_API_KEY_1` و `*_API_KEY_2` (على سبيل المثال `OPENAI_API_KEYS` و `ANTHROPIC_API_KEYS` و `GEMINI_API_KEYS`) أو تجاوزًا لكل اختبار حي عبر `OPENCLAW_LIVE_*_KEY`؛ تعيد الاختبارات المحاولة عند استجابات تحديد المعدل. +- خرج التقدّم/Heartbeat: + - تصدر المجموعات الحية الآن أسطر التقدّم إلى stderr حتى تظهر مكالمات المزوّد الطويلة على أنها نشطة بوضوح حتى عندما يكون التقاط الطرفية في Vitest هادئًا. + - يعطّل `vitest.live.config.ts` اعتراض الطرفية في Vitest بحيث تُبث أسطر التقدّم الخاصة بالمزوّد/ gateway مباشرة أثناء التشغيلات الحية. + - اضبط Heartbeat الخاص بالنموذج المباشر باستخدام `OPENCLAW_LIVE_HEARTBEAT_MS`. + - اضبط Heartbeat الخاص بـ gateway/probe باستخدام `OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS`. ## أي مجموعة يجب أن أشغّل؟ استخدم جدول القرار هذا: -- عند تعديل المنطق/الاختبارات: شغّل `pnpm test` (و`pnpm test:coverage` إذا غيّرت الكثير) -- عند لمس شبكات gateway / بروتوكول WS / الإقران: أضف `pnpm test:e2e` -- عند تصحيح «البوت الخاص بي متوقف» / حالات الفشل الخاصة بالمزوّد / استدعاء الأدوات: شغّل `pnpm test:live` على مجموعة فرعية مضيقة +- تعديل المنطق/الاختبارات: شغّل `pnpm test` (و `pnpm test:coverage` إذا غيّرت الكثير) +- لمس شبكات gateway / بروتوكول WS / الاقتران: أضف `pnpm test:e2e` +- تصحيح "البوت الخاص بي متوقف" / الأعطال الخاصة بالمزوّد / استدعاء الأدوات: شغّل `pnpm test:live` مضيقًا -## Live: مسح قدرات Android node +## Live: مسح قدرات Android Node - الاختبار: `src/gateway/android-node.capabilities.live.test.ts` - السكربت: `pnpm android:test:integration` -- الهدف: استدعاء **كل أمر مُعلَن عنه حاليًا** بواسطة Android node متصل والتحقق من سلوك عقد الأمر. +- الهدف: استدعاء **كل أمر يتم الإعلان عنه حاليًا** بواسطة Android Node متصل والتحقق من سلوك عقد الأمر. - النطاق: - - إعداد مسبق/يدوي (لا تقوم المجموعة بتثبيت التطبيق أو تشغيله أو إقرانه). - - تحقق `node.invoke` في gateway أمرًا بأمر لـ Android node المحدد. + - إعداد يدوي/مسبق الشروط (المجموعة لا تثبّت التطبيق ولا تشغّله ولا تقترنه). + - تحقق `node.invoke` على مستوى gateway أمرًا بأمر من أجل Android Node المحدد. - الإعداد المسبق المطلوب: - - أن يكون تطبيق Android متصلًا ومقترنًا بـ gateway مسبقًا. + - أن يكون تطبيق Android متصلًا ومقترنًا بالفعل بـ gateway. - إبقاء التطبيق في الواجهة الأمامية. - - منح الأذونات/موافقة الالتقاط للقدرات التي تتوقع نجاحها. + - منح الأذونات/الموافقة على الالتقاط للقدرات التي تتوقع نجاحها. - تجاوزات الهدف الاختيارية: - `OPENCLAW_ANDROID_NODE_ID` أو `OPENCLAW_ANDROID_NODE_NAME`. - `OPENCLAW_ANDROID_GATEWAY_URL` / `OPENCLAW_ANDROID_GATEWAY_TOKEN` / `OPENCLAW_ANDROID_GATEWAY_PASSWORD`. - تفاصيل إعداد Android الكاملة: [تطبيق Android](/ar/platforms/android) -## Live: اختبار smoke للنماذج (مفاتيح profile) +## Live: اختبار smoke للنموذج (مفاتيح profile) -تنقسم اختبارات live إلى طبقتين حتى نتمكن من عزل حالات الفشل: +تنقسم الاختبارات الحية إلى طبقتين حتى نتمكن من عزل الإخفاقات: -- يخبرنا «النموذج المباشر» ما إذا كان المزوّد/النموذج قادرًا على الرد أصلًا باستخدام المفتاح المحدد. -- يخبرنا «اختبار smoke لـ gateway» ما إذا كان خط أنابيب gateway+agent الكامل يعمل لهذا النموذج (الجلسات، والسجل، والأدوات، وسياسة sandbox، وما إلى ذلك). +- يخبرنا "النموذج المباشر" ما إذا كان المزوّد/النموذج قادرًا على الرد أساسًا بالمفتاح المعطى. +- يخبرنا "اختبار smoke لـ Gateway" ما إذا كان خط gateway+agent الكامل يعمل لهذا النموذج (sessions، والسجل، والأدوات، وسياسة sandbox، إلخ). ### الطبقة 1: إكمال مباشر للنموذج (من دون gateway) - الاختبار: `src/agents/models.profiles.live.test.ts` - الهدف: - تعداد النماذج المكتشفة - - استخدام `getApiKeyForModel` لتحديد النماذج التي لديك بيانات اعتماد لها - - تشغيل إكمال صغير لكل نموذج (واختبارات تراجعية موجّهة عند الحاجة) -- كيفية التفعيل: - - `pnpm test:live` (أو `OPENCLAW_LIVE_TEST=1` عند استدعاء Vitest مباشرة) -- اضبط `OPENCLAW_LIVE_MODELS=modern` (أو `all`، وهو اسم مستعار لـ modern) لتشغيل هذه المجموعة فعليًا؛ وإلا فسيتم تخطيها للحفاظ على تركيز `pnpm test:live` على اختبار smoke الخاص بـ gateway + - استخدام `getApiKeyForModel` لاختيار النماذج التي لديك بيانات اعتماد لها + - تشغيل إكمال صغير لكل نموذج (واختبارات انحدار مستهدفة عند الحاجة) +- كيفية التمكين: + - `pnpm test:live` (أو `OPENCLAW_LIVE_TEST=1` إذا كنت تستدعي Vitest مباشرة) +- اضبط `OPENCLAW_LIVE_MODELS=modern` (أو `all`، وهو اسم مستعار لـ modern) لتشغيل هذه المجموعة فعلًا؛ وإلا فسيتم تخطيها للحفاظ على تركيز `pnpm test:live` على اختبار smoke لـ gateway - كيفية اختيار النماذج: - - `OPENCLAW_LIVE_MODELS=modern` لتشغيل allowlist الحديثة (`Opus/Sonnet 4.6+` و`GPT-5.x + Codex` و`Gemini 3` و`GLM 4.7` و`MiniMax M2.7` و`Grok 4`) - - `OPENCLAW_LIVE_MODELS=all` هو اسم مستعار لـ allowlist الحديثة - - أو `OPENCLAW_LIVE_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,..."` (allowlist مفصولة بفواصل) - - تستخدم عمليات المسح الحديثة/الكلية حدًا منسقًا عالي الإشارة افتراضيًا؛ اضبط `OPENCLAW_LIVE_MAX_MODELS=0` لإجراء مسح حديث شامل أو رقمًا موجبًا لحد أصغر. + - `OPENCLAW_LIVE_MODELS=modern` لتشغيل قائمة السماح الحديثة (Opus/Sonnet 4.6+ و GPT-5.x + Codex و Gemini 3 و GLM 4.7 و MiniMax M2.7 و Grok 4) + - `OPENCLAW_LIVE_MODELS=all` هو اسم مستعار لقائمة السماح الحديثة + - أو `OPENCLAW_LIVE_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,..."` (قائمة سماح مفصولة بفواصل) + - تستخدم عمليات المسح modern/all حدًا منسقًا عالي الإشارة افتراضيًا؛ اضبط `OPENCLAW_LIVE_MAX_MODELS=0` لمسح حديث شامل أو رقمًا موجبًا لحد أصغر. - كيفية اختيار المزوّدين: - - `OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"` (allowlist مفصولة بفواصل) + - `OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"` (قائمة سماح مفصولة بفواصل) - من أين تأتي المفاتيح: - - افتراضيًا: من مخزن profile وبدائل env + - افتراضيًا: من مخزن profile والبدائل الاحتياطية في env - اضبط `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` لفرض **مخزن profile** فقط -- سبب وجود هذا: - - يفصل بين «واجهة API الخاصة بالمزوّد معطلة / المفتاح غير صالح» و«خط أنابيب gateway agent معطل» - - يحتوي على اختبارات تراجعية صغيرة ومعزولة (مثال: إعادة تشغيل reasoning flows واستدعاء الأدوات في OpenAI Responses/Codex Responses) +- لماذا يوجد هذا: + - يفصل بين "واجهة API الخاصة بالمزوّد معطلة / المفتاح غير صالح" و "خط gateway agent معطل" + - يحتوي على اختبارات انحدار صغيرة ومعزولة (مثال: OpenAI Responses/Codex Responses reasoning replay + تدفقات tool-call) -### الطبقة 2: اختبار smoke لـ Gateway + وكيل التطوير (ما الذي يفعله "@openclaw" فعليًا) +### الطبقة 2: اختبار smoke لـ Gateway + dev agent (ما الذي يفعله "@openclaw" فعليًا) - الاختبار: `src/gateway/gateway-models.profiles.live.test.ts` - الهدف: - - تشغيل Gateway داخل العملية - - إنشاء/تعديل جلسة `agent:dev:*` (مع تجاوز النموذج لكل تشغيل) - - التكرار عبر النماذج التي لها مفاتيح والتحقق من: - - استجابة «ذات معنى» (من دون أدوات) - - نجاح استدعاء أداة حقيقي (فحص `read`) - - فحوصات أدوات إضافية اختيارية (فحص `exec+read`) - - استمرار عمل مسارات OpenAI التراجعية (استدعاء أداة فقط ← متابعة) -- تفاصيل الفحوصات (حتى تتمكن من شرح الإخفاقات بسرعة): - - فحص `read`: يكتب الاختبار ملف nonce في مساحة العمل ويطلب من الوكيل `read` قراءته ثم إعادة nonce. - - فحص `exec+read`: يطلب الاختبار من الوكيل استخدام `exec` لكتابة nonce في ملف مؤقت، ثم `read` لقراءته مجددًا. - - فحص الصورة: يرفق الاختبار صورة PNG مُولَّدة (قطة + رمز عشوائي) ويتوقع من النموذج أن يعيد `cat `. - - مرجع التنفيذ: `src/gateway/gateway-models.profiles.live.test.ts` و`src/gateway/live-image-probe.ts`. -- كيفية التفعيل: - - `pnpm test:live` (أو `OPENCLAW_LIVE_TEST=1` عند استدعاء Vitest مباشرة) + - تشغيل gateway داخل العملية + - إنشاء/ترقيع جلسة `agent:dev:*` (مع تجاوز النموذج في كل تشغيل) + - التكرار عبر النماذج التي تملك مفاتيح والتحقق من: + - استجابة "ذات معنى" (من دون أدوات) + - أن استدعاء أداة حقيقي يعمل (`read` probe) + - probes إضافية اختيارية للأدوات (`exec+read` probe) + - استمرار عمل مسارات انحدار OpenAI (`tool-call-only → follow-up`) +- تفاصيل probes (حتى تتمكن من شرح الإخفاقات بسرعة): + - probe `read`: يكتب الاختبار ملف nonce في مساحة العمل ويطلب من الوكيل `read` قراءته ثم إعادة nonce. + - probe `exec+read`: يطلب الاختبار من الوكيل كتابة nonce في ملف مؤقت عبر `exec`، ثم قراءته مجددًا عبر `read`. + - probe الصورة: يرفق الاختبار ملف PNG مُولّدًا (قطة + رمز عشوائي) ويتوقع من النموذج إرجاع `cat `. + - مرجع التنفيذ: `src/gateway/gateway-models.profiles.live.test.ts` و `src/gateway/live-image-probe.ts`. +- كيفية التمكين: + - `pnpm test:live` (أو `OPENCLAW_LIVE_TEST=1` إذا كنت تستدعي Vitest مباشرة) - كيفية اختيار النماذج: - - الافتراضي: allowlist حديثة (`Opus/Sonnet 4.6+` و`GPT-5.x + Codex` و`Gemini 3` و`GLM 4.7` و`MiniMax M2.7` و`Grok 4`) - - `OPENCLAW_LIVE_GATEWAY_MODELS=all` هو اسم مستعار للـ allowlist الحديثة + - الافتراضي: قائمة السماح الحديثة (Opus/Sonnet 4.6+ و GPT-5.x + Codex و Gemini 3 و GLM 4.7 و MiniMax M2.7 و Grok 4) + - `OPENCLAW_LIVE_GATEWAY_MODELS=all` هو اسم مستعار لقائمة السماح الحديثة - أو اضبط `OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"` (أو قائمة مفصولة بفواصل) للتضييق - - تستخدم عمليات المسح الحديثة/الكلية الخاصة بـ gateway حدًا منسقًا عالي الإشارة افتراضيًا؛ اضبط `OPENCLAW_LIVE_GATEWAY_MAX_MODELS=0` لإجراء مسح حديث شامل أو رقمًا موجبًا لحد أصغر. -- كيفية اختيار المزوّدين (لتجنب «كل شيء في OpenRouter»): - - `OPENCLAW_LIVE_GATEWAY_PROVIDERS="google,google-antigravity,google-gemini-cli,openai,anthropic,zai,minimax"` (allowlist مفصولة بفواصل) -- تكون فحوصات الأدوات + الصور مفعّلة دائمًا في هذا الاختبار live: - - فحص `read` + فحص `exec+read` (ضغط على الأدوات) - - يعمل فحص الصورة عندما يعلن النموذج دعمه لإدخال الصور + - تستخدم عمليات المسح gateway الحديثة/`all` حدًا منسقًا عالي الإشارة افتراضيًا؛ اضبط `OPENCLAW_LIVE_GATEWAY_MAX_MODELS=0` لمسح حديث شامل أو رقمًا موجبًا لحد أصغر. +- كيفية اختيار المزوّدين (تجنّب "كل شيء عبر OpenRouter"): + - `OPENCLAW_LIVE_GATEWAY_PROVIDERS="google,google-antigravity,google-gemini-cli,openai,anthropic,zai,minimax"` (قائمة سماح مفصولة بفواصل) +- تكون probes الأدوات + الصور مفعّلة دائمًا في هذا الاختبار الحي: + - probe `read` + probe `exec+read` (ضغط على الأدوات) + - يعمل probe الصورة عندما يعلن النموذج دعم إدخال الصور - التدفق (على مستوى عالٍ): - - يولّد الاختبار صورة PNG صغيرة تحتوي على `CAT` + رمز عشوائي (`src/gateway/live-image-probe.ts`) - - يرسلها عبر `agent` باستخدام `attachments: [{ mimeType: "image/png", content: "" }]` + - يولّد الاختبار ملف PNG صغيرًا يحتوي على “CAT” + رمز عشوائي (`src/gateway/live-image-probe.ts`) + - يرسله عبر `agent` مع `attachments: [{ mimeType: "image/png", content: "" }]` - يحلل Gateway المرفقات إلى `images[]` (`src/gateway/server-methods/agent.ts` + `src/gateway/chat-attachments.ts`) - - يمرر الوكيل المضمّن رسالة مستخدم متعددة الوسائط إلى النموذج - - التحقق: تحتوي الاستجابة على `cat` + الرمز (مع سماح OCR بأخطاء طفيفة) + - يمرّر الوكيل المضمّن رسالة مستخدم متعددة الوسائط إلى النموذج + - التحقق: يحتوي الرد على `cat` + الرمز (مع سماحية OCR: الأخطاء الطفيفة مسموح بها) نصيحة: لمعرفة ما يمكنك اختباره على جهازك (ومعرّفات `provider/model` الدقيقة)، شغّل: @@ -372,26 +451,26 @@ openclaw models list openclaw models list --json ``` -## Live: اختبار smoke للواجهة الخلفية CLI (Claude أو Codex أو Gemini أو CLI محلي آخر) +## Live: اختبار smoke للواجهة الخلفية CLI (Claude أو Codex أو Gemini أو CLI محلية أخرى) - الاختبار: `src/gateway/gateway-cli-backend.live.test.ts` -- الهدف: التحقق من خط أنابيب Gateway + الوكيل باستخدام واجهة خلفية CLI محلية، من دون لمس الإعداد الافتراضي الخاص بك. -- توجد إعدادات smoke الافتراضية الخاصة بكل واجهة خلفية في تعريف `cli-backend.ts` التابع للامتداد المالك. -- التفعيل: - - `pnpm test:live` (أو `OPENCLAW_LIVE_TEST=1` عند استدعاء Vitest مباشرة) +- الهدف: التحقق من خط Gateway + الوكيل باستخدام واجهة خلفية CLI محلية، من دون لمس إعدادك الافتراضي. +- توجد القيم الافتراضية لاختبار smoke الخاصة بكل واجهة خلفية مع تعريف `cli-backend.ts` المملوك للامتداد المعني. +- التمكين: + - `pnpm test:live` (أو `OPENCLAW_LIVE_TEST=1` إذا كنت تستدعي Vitest مباشرة) - `OPENCLAW_LIVE_CLI_BACKEND=1` -- الإعدادات الافتراضية: +- القيم الافتراضية: - المزوّد/النموذج الافتراضي: `claude-cli/claude-sonnet-4-6` - - يأتي سلوك الأمر/المعاملات/الصورة من بيانات Plugin الوصفية الخاصة بواجهة CLI الخلفية المالكة. + - يأتي سلوك الأمر/الوسائط/الصورة من بيانات metadata الخاصة بـ CLI backend Plugin المالكة. - التجاوزات (اختيارية): - `OPENCLAW_LIVE_CLI_BACKEND_MODEL="codex-cli/gpt-5.4"` - `OPENCLAW_LIVE_CLI_BACKEND_COMMAND="/full/path/to/codex"` - `OPENCLAW_LIVE_CLI_BACKEND_ARGS='["exec","--json","--color","never","--sandbox","read-only","--skip-git-repo-check"]'` - - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1` لإرسال مرفق صورة حقيقي (تُحقن المسارات داخل الموجه). - - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image"` لتمرير مسارات ملفات الصور كمعاملات CLI بدلًا من حقنها في الموجه. - - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"` (أو `"list"`) للتحكم في كيفية تمرير معاملات الصور عند ضبط `IMAGE_ARG`. + - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1` لإرسال مرفق صورة حقيقي (تُحقن المسارات في prompt). + - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image"` لتمرير مسارات ملفات الصور كوسائط CLI بدلًا من حقنها في prompt. + - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"` (أو `"list"`) للتحكم في كيفية تمرير وسائط الصور عند ضبط `IMAGE_ARG`. - `OPENCLAW_LIVE_CLI_BACKEND_RESUME_PROBE=1` لإرسال دور ثانٍ والتحقق من تدفق الاستئناف. - - `OPENCLAW_LIVE_CLI_BACKEND_MODEL_SWITCH_PROBE=0` لتعطيل فحص الاستمرارية الافتراضي داخل الجلسة نفسها من Claude Sonnet إلى Opus (اضبطه إلى `1` لفرض تفعيله عندما يدعم النموذج المحدد هدف تبديل). + - `OPENCLAW_LIVE_CLI_BACKEND_MODEL_SWITCH_PROBE=0` لتعطيل probe الاستمرارية الافتراضي داخل الجلسة نفسها Claude Sonnet -> Opus (اضبطه على `1` لفرض تشغيله عندما يدعم النموذج المحدد هدف تبديل). مثال: @@ -419,27 +498,27 @@ pnpm test:docker:live-cli-backend:gemini ملاحظات: - يوجد مشغّل Docker في `scripts/test-live-cli-backend-docker.sh`. -- يشغّل اختبار smoke لواجهة CLI الخلفية الحية داخل صورة Docker الخاصة بالمستودع كمستخدم `node` غير الجذر. -- يحلّل بيانات smoke الوصفية الخاصة بـ CLI من الامتداد المالك، ثم يثبّت حزمة CLI الموافقة لنظام Linux (`@anthropic-ai/claude-code` أو `@openai/codex` أو `@google/gemini-cli`) في prefix قابل للكتابة ومخزن مؤقتًا عند `OPENCLAW_DOCKER_CLI_TOOLS_DIR` (الافتراضي: `~/.cache/openclaw/docker-cli-tools`). -- يتطلب `pnpm test:docker:live-cli-backend:claude-subscription` مصادقة OAuth المحمولة لاشتراك Claude Code عبر `~/.claude/.credentials.json` مع `claudeAiOauth.subscriptionType` أو `CLAUDE_CODE_OAUTH_TOKEN` من `claude setup-token`. وهو يثبت أولًا نجاح `claude -p` المباشر داخل Docker، ثم يشغّل دورين من واجهة Gateway CLI الخلفية من دون الاحتفاظ بمتغيرات env الخاصة بمفاتيح Anthropic API. ويعطّل مسار الاشتراك هذا فحوصات Claude MCP/tool والصورة افتراضيًا لأن Claude يوجّه حاليًا استخدام التطبيقات الخارجية عبر فوترة استخدام إضافي بدلًا من حدود خطة الاشتراك العادية. -- يختبر smoke الحي لواجهة CLI الخلفية الآن التدفق الكامل نفسه من طرف إلى طرف لـ Claude وCodex وGemini: دور نصي، ثم دور تصنيف صورة، ثم استدعاء أداة MCP `cron` يتم التحقق منه عبر Gateway CLI. -- يقوم اختبار smoke الافتراضي الخاص بـ Claude أيضًا بتعديل الجلسة من Sonnet إلى Opus ويتحقق من أن الجلسة المستأنفة لا تزال تتذكر ملاحظة سابقة. +- يشغّل اختبار smoke الحي لواجهة CLI الخلفية داخل صورة Docker الخاصة بالمستودع كمستخدم `node` غير الجذر. +- يحل metadata الخاصة باختبار smoke للواجهة CLI من الامتداد المالك، ثم يثبت حزمة CLI المطابقة الخاصة بـ Linux (`@anthropic-ai/claude-code` أو `@openai/codex` أو `@google/gemini-cli`) في بادئة قابلة للكتابة ومخزنة مؤقتًا عند `OPENCLAW_DOCKER_CLI_TOOLS_DIR` (الافتراضي: `~/.cache/openclaw/docker-cli-tools`). +- يتطلب `pnpm test:docker:live-cli-backend:claude-subscription` مصادقة OAuth محمولة لاشتراك Claude Code عبر أحد الخيارين: `~/.claude/.credentials.json` مع `claudeAiOauth.subscriptionType` أو `CLAUDE_CODE_OAUTH_TOKEN` من `claude setup-token`. يثبت أولًا نجاح `claude -p` مباشرة داخل Docker، ثم يشغّل دورين لواجهة Gateway CLI الخلفية من دون الاحتفاظ بمتغيرات env الخاصة بمفتاح Anthropic API. يعطّل هذا المسار الخاص بالاشتراك probe أداة/صورة Claude MCP افتراضيًا لأن Claude يوجّه حاليًا استخدام التطبيقات الخارجية عبر فوترة استخدام إضافي بدلًا من حدود خطة الاشتراك العادية. +- يمارس اختبار smoke الحي لواجهة CLI الخلفية الآن التدفق الكامل نفسه من طرف إلى طرف لكل من Claude و Codex و Gemini: دور نصي، ثم دور تصنيف صورة، ثم استدعاء أداة MCP `cron` يتم التحقق منه عبر Gateway CLI. +- كما يقوم اختبار smoke الافتراضي لـ Claude بترقيع الجلسة من Sonnet إلى Opus ويتحقق من أن الجلسة المستأنفة لا تزال تتذكر ملاحظة سابقة. ## Live: اختبار smoke لربط ACP (`/acp spawn ... --bind here`) - الاختبار: `src/gateway/gateway-acp-bind.live.test.ts` -- الهدف: التحقق من تدفق ربط المحادثة الحقيقي في ACP باستخدام وكيل ACP حي: +- الهدف: التحقق من تدفق Conversation-bind الحقيقي لـ ACP باستخدام وكيل ACP حي: - إرسال `/acp spawn --bind here` - - ربط محادثة قناة رسائل اصطناعية في مكانها - - إرسال متابعة عادية على هذه المحادثة نفسها - - التحقق من أن المتابعة تصل إلى نص جلسة ACP المرتبطة -- التفعيل: + - ربط محادثة channel للرسائل تركيبية في مكانها + - إرسال متابعة عادية على نفس المحادثة + - التحقق من أن المتابعة تصل إلى transcript الجلسة المرتبطة بـ ACP +- التمكين: - `pnpm test:live src/gateway/gateway-acp-bind.live.test.ts` - `OPENCLAW_LIVE_ACP_BIND=1` -- الإعدادات الافتراضية: +- القيم الافتراضية: - وكلاء ACP في Docker: `claude,codex,gemini` - - وكيل ACP للاستدعاء المباشر عبر `pnpm test:live ...`: `claude` - - القناة الاصطناعية: سياق محادثة على نمط Slack DM + - وكيل ACP للتشغيل المباشر `pnpm test:live ...`: `claude` + - القناة التركيبية: سياق محادثة على نمط Slack DM - الواجهة الخلفية لـ ACP: `acpx` - التجاوزات: - `OPENCLAW_LIVE_ACP_BIND_AGENT=claude` @@ -448,8 +527,8 @@ pnpm test:docker:live-cli-backend:gemini - `OPENCLAW_LIVE_ACP_BIND_AGENTS=claude,codex,gemini` - `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND='npx -y @agentclientprotocol/claude-agent-acp@'` - ملاحظات: - - يستخدم هذا المسار سطح `chat.send` في gateway مع حقول originating-route اصطناعية مخصصة للمشرف فقط حتى تتمكن الاختبارات من إرفاق سياق قناة الرسائل من دون التظاهر بالتسليم الخارجي. - - عندما لا يكون `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND` مضبوطًا، يستخدم الاختبار سجل الوكلاء المضمّن داخل Plugin `acpx` لاختيار وكيل ACP الخاص بإطار الاختبار. + - يستخدم هذا المسار سطح gateway `chat.send` مع حقول originating-route تركيبية مخصصة للمشرف فقط حتى تتمكن الاختبارات من إرفاق سياق قناة الرسائل من دون الادعاء بالتسليم الخارجي. + - عندما لا يكون `OPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND` مضبوطًا، يستخدم الاختبار سجل الوكلاء المضمّن الخاص بـ Plugin `acpx` للوكيل المحدد في harness الخاص بـ ACP. مثال: @@ -476,31 +555,30 @@ pnpm test:docker:live-acp-bind:gemini ملاحظات Docker: - يوجد مشغّل Docker في `scripts/test-live-acp-bind-docker.sh`. -- افتراضيًا، يشغّل اختبار smoke لربط ACP على جميع وكلاء CLI الحية المدعومة بالتسلسل: `claude` ثم `codex` ثم `gemini`. +- افتراضيًا، يشغّل اختبار smoke لربط ACP مقابل جميع وكلاء CLI الحيين المدعومين بالتسلسل: `claude` ثم `codex` ثم `gemini`. - استخدم `OPENCLAW_LIVE_ACP_BIND_AGENTS=claude` أو `OPENCLAW_LIVE_ACP_BIND_AGENTS=codex` أو `OPENCLAW_LIVE_ACP_BIND_AGENTS=gemini` لتضييق المصفوفة. -- يستورد `~/.profile`، ويجهّز مواد المصادقة الخاصة بـ CLI المطابق داخل الحاوية، ويثبّت `acpx` في npm prefix قابل للكتابة، ثم يثبّت CLI الحي المطلوب (`@anthropic-ai/claude-code` أو `@openai/codex` أو `@google/gemini-cli`) إذا لم يكن موجودًا. -- داخل Docker، يضبط المشغّل `OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpx` حتى يحافظ acpx على متغيرات env الخاصة بالمزوّد من profile المستورد متاحة لـ CLI الفرعي الخاص بإطار الاختبار. +- يعتمد على `~/.profile`، ويجهّز مادة مصادقة CLI المطابقة داخل الحاوية، ويثبت `acpx` في بادئة npm قابلة للكتابة، ثم يثبت CLI الحي المطلوب (`@anthropic-ai/claude-code` أو `@openai/codex` أو `@google/gemini-cli`) إذا لم يكن موجودًا. +- داخل Docker، يضبط المشغّل `OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpx` حتى يحافظ acpx على متغيرات env الخاصة بالمزوّد من profile الذي جرى تحميله لتكون متاحة لـ harness CLI الفرعي. -## Live: اختبار smoke لإطار Codex app-server +## Live: اختبار smoke لـ Codex app-server harness -- الهدف: التحقق من إطار Codex المملوك للـ Plugin عبر - طريقة `agent` العادية في gateway: +- الهدف: التحقق من Codex harness المملوك لـ Plugin عبر طريقة gateway + العادية `agent`: - تحميل Plugin `codex` المضمّن - اختيار `OPENCLAW_AGENT_RUNTIME=codex` - - إرسال أول دور لوكيل gateway إلى `codex/gpt-5.4` - - إرسال دور ثانٍ إلى جلسة OpenClaw نفسها والتحقق من أن - خيط app-server يمكنه الاستئناف - - تشغيل `/codex status` و`/codex models` عبر مسار - أوامر gateway نفسه + - إرسال أول دور للوكيل عبر gateway إلى `codex/gpt-5.4` + - إرسال دور ثانٍ إلى جلسة OpenClaw نفسها والتحقق من أن خيط app-server + يمكنه الاستئناف + - تشغيل `/codex status` و `/codex models` عبر مسار أوامر gateway نفسه - الاختبار: `src/gateway/gateway-codex-harness.live.test.ts` -- التفعيل: `OPENCLAW_LIVE_CODEX_HARNESS=1` +- التمكين: `OPENCLAW_LIVE_CODEX_HARNESS=1` - النموذج الافتراضي: `codex/gpt-5.4` -- فحص الصورة الاختياري: `OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=1` -- فحص MCP/tool الاختياري: `OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=1` -- يضبط اختبار smoke القيمة `OPENCLAW_AGENT_HARNESS_FALLBACK=none` حتى لا يمر - إطار Codex المعطّل بصمت عبر الرجوع الاحتياطي إلى PI. +- probe الصورة الاختياري: `OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=1` +- probe MCP/tool الاختياري: `OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=1` +- يضبط اختبار smoke القيمة `OPENCLAW_AGENT_HARNESS_FALLBACK=none` حتى لا يتمكن + Codex harness المعطّل من النجاح عبر الرجوع الاحتياطي الصامت إلى PI. - المصادقة: `OPENAI_API_KEY` من shell/profile، بالإضافة إلى نسخ اختيارية من - `~/.codex/auth.json` و`~/.codex/config.toml` + `~/.codex/auth.json` و `~/.codex/config.toml` وصفة محلية: @@ -523,19 +601,19 @@ pnpm test:docker:live-codex-harness ملاحظات Docker: - يوجد مشغّل Docker في `scripts/test-live-codex-harness-docker.sh`. -- يستورد `~/.profile` المركّب، ويمرر `OPENAI_API_KEY`، وينسخ ملفات - مصادقة Codex CLI عند وجودها، ويثبّت `@openai/codex` في npm prefix - قابل للكتابة ومركّب، ويجهّز شجرة المصدر، ثم يشغّل فقط اختبار Codex-harness الحي. -- يفعّل Docker فحوصات الصورة وMCP/tool افتراضيًا. اضبط +- يعتمد على `~/.profile` المركّب، ويمرّر `OPENAI_API_KEY`، وينسخ ملفات + مصادقة Codex CLI عند وجودها، ويثبت `@openai/codex` في بادئة npm + قابلة للكتابة ومركّبة، ويجهّز شجرة المصدر، ثم يشغّل فقط اختبار Codex-harness الحي. +- يفعّل Docker probes الصورة و MCP/tool افتراضيًا. اضبط `OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0` أو - `OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0` عندما تحتاج إلى تشغيل تصحيح أضيق. -- يصدّر Docker أيضًا `OPENCLAW_AGENT_HARNESS_FALLBACK=none`، بما يطابق إعداد - الاختبار الحي حتى لا يتمكن الرجوع الاحتياطي إلى `openai-codex/*` أو PI من إخفاء - تراجع في إطار Codex. + `OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0` عندما تحتاج إلى تشغيل تضييقي أكثر لأغراض التصحيح. +- يصدّر Docker أيضًا `OPENCLAW_AGENT_HARNESS_FALLBACK=none`، بما يتطابق مع + إعداد الاختبار الحي حتى لا يتمكن `openai-codex/*` أو الرجوع الاحتياطي إلى PI من إخفاء + انحدار في Codex harness. -### وصفات live الموصى بها +### وصفات حية موصى بها -تُعد allowlists الضيقة والصريحة الأسرع والأقل عرضة للهشاشة: +قوائم السماح الضيقة والصريحة هي الأسرع والأقل عرضة للتذبذب: - نموذج واحد، مباشر (من دون gateway): - `OPENCLAW_LIVE_MODELS="openai/gpt-5.4" pnpm test:live src/agents/models.profiles.live.test.ts` @@ -546,7 +624,7 @@ pnpm test:docker:live-codex-harness - استدعاء الأدوات عبر عدة مزوّدين: - `OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,google/gemini-3-flash-preview,zai/glm-4.7,minimax/MiniMax-M2.7" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts` -- تركيز Google (مفتاح Gemini API + Antigravity): +- التركيز على Google (مفتاح Gemini API + Antigravity): - Gemini (مفتاح API): `OPENCLAW_LIVE_GATEWAY_MODELS="google/gemini-3-flash-preview" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts` - Antigravity (OAuth): `OPENCLAW_LIVE_GATEWAY_MODELS="google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-pro-high" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts` @@ -554,33 +632,33 @@ pnpm test:docker:live-codex-harness - يستخدم `google/...` واجهة Gemini API (مفتاح API). - يستخدم `google-antigravity/...` جسر Antigravity OAuth (نقطة نهاية وكيل على نمط Cloud Code Assist). -- يستخدم `google-gemini-cli/...` واجهة Gemini CLI المحلية على جهازك (مع مصادقة منفصلة وخصائص أدوات مختلفة). +- يستخدم `google-gemini-cli/...` Gemini CLI المحلي على جهازك (مصادقة منفصلة ومراوغات أدوات منفصلة). - Gemini API مقابل Gemini CLI: - - API: يستدعي OpenClaw واجهة Gemini API المستضافة من Google عبر HTTP (بمصادقة مفتاح API / profile)؛ وهذا ما يقصده معظم المستخدمين بكلمة «Gemini». - - CLI: ينفّذ OpenClaw ملف `gemini` الثنائي المحلي؛ وله مصادقته الخاصة وقد يتصرف بشكل مختلف (الدفق/دعم الأدوات/اختلاف الإصدارات). + - API: يستدعي OpenClaw واجهة Gemini API المستضافة من Google عبر HTTP (مفتاح API / مصادقة profile)؛ وهذا هو ما يقصده معظم المستخدمين عندما يقولون "Gemini". + - CLI: يستدعي OpenClaw ملف `gemini` الثنائي المحلي؛ وله مصادقته الخاصة ويمكن أن يتصرف بشكل مختلف (البث، ودعم الأدوات، واختلاف الإصدارات). ## Live: مصفوفة النماذج (ما الذي نغطيه) -لا توجد «قائمة نماذج CI» ثابتة (لأن live اختيارية)، لكن هذه هي النماذج **الموصى بها** للتغطية بانتظام على جهاز تطوير مزود بالمفاتيح. +لا توجد "قائمة نماذج CI" ثابتة (لأن live اختيارية)، لكن هذه هي النماذج **الموصى بها** للتغطية المنتظمة على جهاز تطوير يملك مفاتيح. ### مجموعة smoke الحديثة (استدعاء الأدوات + الصور) -هذا هو تشغيل «النماذج الشائعة» الذي نتوقع أن يبقى عاملًا: +هذا هو تشغيل "النماذج الشائعة" الذي نتوقع الحفاظ على عمله: - OpenAI (غير Codex): `openai/gpt-5.4` (اختياري: `openai/gpt-5.4-mini`) - OpenAI Codex: `openai-codex/gpt-5.4` - Anthropic: `anthropic/claude-opus-4-6` (أو `anthropic/claude-sonnet-4-6`) -- Google (Gemini API): `google/gemini-3.1-pro-preview` و`google/gemini-3-flash-preview` (تجنب نماذج Gemini 2.x الأقدم) -- Google (Antigravity): `google-antigravity/claude-opus-4-6-thinking` و`google-antigravity/gemini-3-flash` +- Google (Gemini API): `google/gemini-3.1-pro-preview` و `google/gemini-3-flash-preview` (تجنب نماذج Gemini 2.x الأقدم) +- Google (Antigravity): `google-antigravity/claude-opus-4-6-thinking` و `google-antigravity/gemini-3-flash` - Z.AI (GLM): `zai/glm-4.7` - MiniMax: `minimax/MiniMax-M2.7` شغّل اختبار smoke لـ gateway مع الأدوات + الصور: `OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4,openai-codex/gpt-5.4,anthropic/claude-opus-4-6,google/gemini-3.1-pro-preview,google/gemini-3-flash-preview,google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-flash,zai/glm-4.7,minimax/MiniMax-M2.7" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts` -### الأساس: استدعاء الأدوات (Read + Exec اختياري) +### خط الأساس: استدعاء الأدوات (Read + Exec اختياري) -اختر واحدًا على الأقل لكل عائلة مزوّد: +اختر واحدًا على الأقل من كل عائلة مزوّدين: - OpenAI: `openai/gpt-5.4` (أو `openai/gpt-5.4-mini`) - Anthropic: `anthropic/claude-opus-4-6` (أو `anthropic/claude-sonnet-4-6`) @@ -591,78 +669,78 @@ pnpm test:docker:live-codex-harness تغطية إضافية اختيارية (من الجيد توفرها): - xAI: `xai/grok-4` (أو أحدث إصدار متاح) -- Mistral: `mistral/`… (اختر نموذجًا واحدًا قادرًا على `tools` لديك) -- Cerebras: `cerebras/`… (إذا كان لديك وصول) -- LM Studio: `lmstudio/`… (محلي؛ استدعاء الأدوات يعتمد على وضع API) +- Mistral: `mistral/`… (اختر نموذجًا واحدًا مفعّلًا وقادرًا على `tools`) +- Cerebras: `cerebras/`… (إذا كانت لديك صلاحية وصول) +- LM Studio: `lmstudio/`… (محلي؛ يعتمد استدعاء الأدوات على وضع API) -### الرؤية: إرسال صورة (مرفق ← رسالة متعددة الوسائط) +### Vision: إرسال الصور (مرفق ← رسالة متعددة الوسائط) -أدرج نموذجًا واحدًا على الأقل قادرًا على التعامل مع الصور في `OPENCLAW_LIVE_GATEWAY_MODELS` (مثل متغيرات Claude/Gemini/OpenAI القادرة على الرؤية، إلخ) لاختبار فحص الصورة. +ضمّن نموذجًا واحدًا على الأقل قادرًا على التعامل مع الصور في `OPENCLAW_LIVE_GATEWAY_MODELS` (مثل Claude/Gemini/OpenAI بالإصدارات الداعمة للرؤية، إلخ) لممارسة probe الصور. -### المجمّعات / البوابات البديلة +### المجمعات / البوابات البديلة -إذا كانت لديك مفاتيح مفعلة، فنحن ندعم أيضًا الاختبار عبر: +إذا كانت لديك مفاتيح مفعّلة، فإننا ندعم أيضًا الاختبار عبر: -- OpenRouter: `openrouter/...` (مئات النماذج؛ استخدم `openclaw models scan` للعثور على مرشحين قادرين على tools+image) -- OpenCode: `opencode/...` لـ Zen و`opencode-go/...` لـ Go (المصادقة عبر `OPENCODE_API_KEY` / `OPENCODE_ZEN_API_KEY`) +- OpenRouter: `openrouter/...` (مئات النماذج؛ استخدم `openclaw models scan` للعثور على المرشحين القادرين على الأدوات+الصور) +- OpenCode: `opencode/...` لـ Zen و `opencode-go/...` لـ Go (المصادقة عبر `OPENCODE_API_KEY` / `OPENCODE_ZEN_API_KEY`) -مزيد من المزوّدين الذين يمكنك تضمينهم في مصفوفة live (إذا كانت لديك بيانات الاعتماد/الإعداد): +مزيد من المزوّدين الذين يمكنك تضمينهم في المصفوفة الحية (إذا كانت لديك بيانات الاعتماد/الإعداد): -- مدمجة: `openai` و`openai-codex` و`anthropic` و`google` و`google-vertex` و`google-antigravity` و`google-gemini-cli` و`zai` و`openrouter` و`opencode` و`opencode-go` و`xai` و`groq` و`cerebras` و`mistral` و`github-copilot` -- عبر `models.providers` (نقاط نهاية مخصصة): `minimax` (سحابي/API)، بالإضافة إلى أي proxy متوافق مع OpenAI/Anthropic (مثل LM Studio وvLLM وLiteLLM وغيرها) +- المضمّنون: `openai` و `openai-codex` و `anthropic` و `google` و `google-vertex` و `google-antigravity` و `google-gemini-cli` و `zai` و `openrouter` و `opencode` و `opencode-go` و `xai` و `groq` و `cerebras` و `mistral` و `github-copilot` +- عبر `models.providers` (نقاط نهاية مخصصة): `minimax` (سحابي/API)، بالإضافة إلى أي proxy متوافق مع OpenAI/Anthropic (مثل LM Studio و vLLM و LiteLLM وغيرها) -نصيحة: لا تحاول ترميز «كل النماذج» بشكل ثابت في المستندات. القائمة المرجعية هي ما يعيده `discoverModels(...)` على جهازك + أي مفاتيح متاحة. +نصيحة: لا تحاول تثبيت "كل النماذج" بشكل صلب في المستندات. القائمة المرجعية هي ما يعيده `discoverModels(...)` على جهازك + المفاتيح المتاحة. -## بيانات الاعتماد (لا تلتزم بها أبدًا) +## بيانات الاعتماد (لا تُلتزم أبدًا) -تكتشف اختبارات live بيانات الاعتماد بالطريقة نفسها التي يستخدمها CLI. والنتائج العملية لذلك: +تكتشف الاختبارات الحية بيانات الاعتماد بالطريقة نفسها التي يعمل بها CLI. الآثار العملية: -- إذا كان CLI يعمل، فيجب أن تعثر اختبارات live على المفاتيح نفسها. -- إذا أخبرك اختبار live بأنه «لا توجد بيانات اعتماد»، فقم بالتصحيح بالطريقة نفسها التي ستصحح بها `openclaw models list` / اختيار النموذج. +- إذا كان CLI يعمل، فيجب أن تعثر الاختبارات الحية على المفاتيح نفسها. +- إذا قال اختبار حي "لا توجد بيانات اعتماد"، فقم بالتصحيح بالطريقة نفسها التي ستصحح بها `openclaw models list` / اختيار النموذج. -- ملفات المصادقة لكل وكيل: `~/.openclaw/agents//agent/auth-profiles.json` (وهذا هو المقصود بعبارة «مفاتيح profile» في اختبارات live) +- ملفات profile للمصادقة لكل وكيل: `~/.openclaw/agents//agent/auth-profiles.json` (وهذا ما تعنيه "profile keys" في الاختبارات الحية) - الإعداد: `~/.openclaw/openclaw.json` (أو `OPENCLAW_CONFIG_PATH`) -- دليل الحالة القديم: `~/.openclaw/credentials/` (يتم نسخه إلى home live المرحلي عند وجوده، لكنه ليس مخزن مفاتيح profile الرئيسي) -- تنسخ تشغيلات live المحلية الإعداد النشط وملفات `auth-profiles.json` لكل وكيل و`credentials/` القديمة وأدلة مصادقة CLI الخارجية المدعومة إلى home اختباري مؤقت افتراضيًا؛ وتتخطى homes الحية المرحلية `workspace/` و`sandboxes/`، كما تُزال تجاوزات المسار `agents.*.workspace` و`agentDir` حتى تبقى الفحوصات بعيدة عن مساحة العمل الحقيقية على المضيف. +- دليل الحالة القديم: `~/.openclaw/credentials/` (يُنسخ إلى home الحي المجهّز عند وجوده، لكنه ليس مخزن المفاتيح الرئيسي لـ profile) +- تقوم التشغيلات الحية المحلية بنسخ الإعداد النشط وملفات `auth-profiles.json` لكل وكيل و `credentials/` القديم وأدلة مصادقة CLI الخارجية المدعومة إلى home اختبار مؤقت افتراضيًا؛ وتتجاوز البيئات الحية المجهّزة `workspace/` و `sandboxes/`، كما تُزال تجاوزات المسار `agents.*.workspace` / `agentDir` حتى تبقى probes بعيدة عن مساحة العمل الحقيقية على المضيف. -إذا كنت تريد الاعتماد على مفاتيح env (مثل تلك التي تم تصديرها في `~/.profile`)، فشغّل الاختبارات المحلية بعد `source ~/.profile`، أو استخدم مشغلات Docker أدناه (يمكنها تركيب `~/.profile` داخل الحاوية). +إذا كنت تريد الاعتماد على مفاتيح env (مثل تلك المصدّرة في `~/.profile`)، فشغّل الاختبارات المحلية بعد `source ~/.profile`، أو استخدم مشغّلات Docker أدناه (يمكنها تركيب `~/.profile` داخل الحاوية). -## Live: Deepgram (نسخ صوتي) +## Deepgram live (نسخ الصوت) - الاختبار: `src/media-understanding/providers/deepgram/audio.live.test.ts` -- التفعيل: `DEEPGRAM_API_KEY=... DEEPGRAM_LIVE_TEST=1 pnpm test:live src/media-understanding/providers/deepgram/audio.live.test.ts` +- التمكين: `DEEPGRAM_API_KEY=... DEEPGRAM_LIVE_TEST=1 pnpm test:live src/media-understanding/providers/deepgram/audio.live.test.ts` -## Live: خطة ترميز BytePlus +## BytePlus coding plan live - الاختبار: `src/agents/byteplus.live.test.ts` -- التفعيل: `BYTEPLUS_API_KEY=... BYTEPLUS_LIVE_TEST=1 pnpm test:live src/agents/byteplus.live.test.ts` +- التمكين: `BYTEPLUS_API_KEY=... BYTEPLUS_LIVE_TEST=1 pnpm test:live src/agents/byteplus.live.test.ts` - تجاوز النموذج الاختياري: `BYTEPLUS_CODING_MODEL=ark-code-latest` -## Live: وسائط workflow الخاصة بـ ComfyUI +## ComfyUI workflow media live - الاختبار: `extensions/comfy/comfy.live.test.ts` -- التفعيل: `OPENCLAW_LIVE_TEST=1 COMFY_LIVE_TEST=1 pnpm test:live -- extensions/comfy/comfy.live.test.ts` +- التمكين: `OPENCLAW_LIVE_TEST=1 COMFY_LIVE_TEST=1 pnpm test:live -- extensions/comfy/comfy.live.test.ts` - النطاق: - - يختبر مسارات الصورة والفيديو و`music_generate` الخاصة بـ comfy المضمّن - - يتجاوز كل قدرة ما لم يتم إعداد `models.providers.comfy.` - - مفيد بعد تغيير إرسال workflow الخاص بـ comfy، أو polling، أو التنزيلات، أو تسجيل Plugin + - يمارس المسارات المضمّنة الخاصة بـ comfy للصور والفيديو و `music_generate` + - يتجاوز كل قدرة ما لم يكن `models.providers.comfy.` مضبوطًا + - مفيد بعد تغيير تقديم تدفق عمل comfy أو polling أو التنزيلات أو تسجيل Plugin -## Live: إنشاء الصور +## Image generation live - الاختبار: `src/image-generation/runtime.live.test.ts` - الأمر: `pnpm test:live src/image-generation/runtime.live.test.ts` -- إطار الاختبار: `pnpm test:live:media image` +- الحزام: `pnpm test:live:media image` - النطاق: - - يعدّد كل Plugin مزوّد لإنشاء الصور مسجل - - يحمّل متغيرات env الخاصة بالمزوّد الناقصة من shell تسجيل الدخول الخاص بك (`~/.profile`) قبل الفحص - - يستخدم مفاتيح API الحية/من env قبل ملفات المصادقة المخزنة افتراضيًا، حتى لا تخفي مفاتيح الاختبار القديمة في `auth-profiles.json` بيانات الاعتماد الحقيقية في shell - - يتجاوز المزوّدين الذين لا يملكون مصادقة/ profile / نموذجًا صالحًا - - يشغّل متغيرات إنشاء الصور القياسية عبر قدرة وقت التشغيل المشتركة: + - يعدّد كل Plugin مزوّد مسجل لتوليد الصور + - يحمّل متغيرات env المفقودة الخاصة بالمزوّد من shell تسجيل الدخول (`~/.profile`) قبل الفحص + - يستخدم مفاتيح API الحية/من env قبل ملفات profile المخزنة افتراضيًا، حتى لا تخفي مفاتيح الاختبار القديمة في `auth-profiles.json` بيانات اعتماد shell الحقيقية + - يتجاوز المزوّدين الذين لا يملكون مصادقة/profile/نموذجًا صالحًا + - يشغّل المتغيرات القياسية لتوليد الصور عبر القدرة المشتركة لوقت التشغيل: - `google:flash-generate` - `google:pro-generate` - `google:pro-edit` - `openai:default-generate` -- المزوّدون المضمّنون المغطَّون حاليًا: +- المزوّدون المضمّنون الحاليون الذين تتم تغطيتهم: - `openai` - `google` - التضييق الاختياري: @@ -672,68 +750,68 @@ pnpm test:docker:live-codex-harness - سلوك المصادقة الاختياري: - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` لفرض مصادقة مخزن profile وتجاهل التجاوزات المعتمدة على env فقط -## Live: إنشاء الموسيقى +## Music generation live - الاختبار: `extensions/music-generation-providers.live.test.ts` -- التفعيل: `OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/music-generation-providers.live.test.ts` -- إطار الاختبار: `pnpm test:live:media music` +- التمكين: `OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/music-generation-providers.live.test.ts` +- الحزام: `pnpm test:live:media music` - النطاق: - - يختبر مسار مزوّد إنشاء الموسيقى المضمّن المشترك - - يغطي حاليًا Google وMiniMax - - يحمّل متغيرات env الخاصة بالمزوّد من shell تسجيل الدخول الخاص بك (`~/.profile`) قبل الفحص - - يستخدم مفاتيح API الحية/من env قبل ملفات المصادقة المخزنة افتراضيًا، حتى لا تخفي مفاتيح الاختبار القديمة في `auth-profiles.json` بيانات الاعتماد الحقيقية في shell - - يتجاوز المزوّدين الذين لا يملكون مصادقة/ profile / نموذجًا صالحًا + - يمارس المسار المضمّن المشترك لمزوّدات توليد الموسيقى + - يغطي حاليًا Google و MiniMax + - يحمّل متغيرات env الخاصة بالمزوّد من shell تسجيل الدخول (`~/.profile`) قبل الفحص + - يستخدم مفاتيح API الحية/من env قبل ملفات profile المخزنة افتراضيًا، حتى لا تخفي مفاتيح الاختبار القديمة في `auth-profiles.json` بيانات اعتماد shell الحقيقية + - يتجاوز المزوّدين الذين لا يملكون مصادقة/profile/نموذجًا صالحًا - يشغّل وضعي وقت التشغيل المعلنين كليهما عند توفرهما: - - `generate` مع إدخال يعتمد على الموجه فقط + - `generate` مع إدخال يعتمد على prompt فقط - `edit` عندما يعلن المزوّد `capabilities.edit.enabled` - التغطية الحالية في المسار المشترك: - - `google`: `generate` و`edit` + - `google`: `generate` و `edit` - `minimax`: `generate` - - `comfy`: له ملف live منفصل لـ Comfy، وليس ضمن هذا المسح المشترك + - `comfy`: ملف Comfy حي منفصل، وليس هذا المسح المشترك - التضييق الاختياري: - `OPENCLAW_LIVE_MUSIC_GENERATION_PROVIDERS="google,minimax"` - `OPENCLAW_LIVE_MUSIC_GENERATION_MODELS="google/lyria-3-clip-preview,minimax/music-2.5+"` - سلوك المصادقة الاختياري: - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` لفرض مصادقة مخزن profile وتجاهل التجاوزات المعتمدة على env فقط -## Live: إنشاء الفيديو +## Video generation live - الاختبار: `extensions/video-generation-providers.live.test.ts` -- التفعيل: `OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/video-generation-providers.live.test.ts` -- إطار الاختبار: `pnpm test:live:media video` +- التمكين: `OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/video-generation-providers.live.test.ts` +- الحزام: `pnpm test:live:media video` - النطاق: - - يختبر مسار مزوّد إنشاء الفيديو المضمّن المشترك - - يحمّل متغيرات env الخاصة بالمزوّد من shell تسجيل الدخول الخاص بك (`~/.profile`) قبل الفحص - - يستخدم مفاتيح API الحية/من env قبل ملفات المصادقة المخزنة افتراضيًا، حتى لا تخفي مفاتيح الاختبار القديمة في `auth-profiles.json` بيانات الاعتماد الحقيقية في shell - - يتجاوز المزوّدين الذين لا يملكون مصادقة/ profile / نموذجًا صالحًا - - يشغّل وضعي وقت التشغيل المعلنين كليهما عند توفرهما: - - `generate` مع إدخال يعتمد على الموجه فقط - - `imageToVideo` عندما يعلن المزوّد `capabilities.imageToVideo.enabled` ويقبل المزوّد/النموذج المحدد إدخال صور محلية مدعومًا بالذاكرة المؤقتة في المسح المشترك - - `videoToVideo` عندما يعلن المزوّد `capabilities.videoToVideo.enabled` ويقبل المزوّد/النموذج المحدد إدخال فيديو محليًا مدعومًا بالذاكرة المؤقتة في المسح المشترك - - المزوّدون الحاليون المعلَن عنهم لكن يتم تجاوزهم في مسح `imageToVideo` المشترك: - - `vydra` لأن `veo3` المضمّن نصي فقط و`kling` المضمّن يتطلب URL صورة بعيدًا + - يمارس المسار المضمّن المشترك لمزوّدات توليد الفيديو + - يحمّل متغيرات env الخاصة بالمزوّد من shell تسجيل الدخول (`~/.profile`) قبل الفحص + - يستخدم مفاتيح API الحية/من env قبل ملفات profile المخزنة افتراضيًا، حتى لا تخفي مفاتيح الاختبار القديمة في `auth-profiles.json` بيانات اعتماد shell الحقيقية + - يتجاوز المزوّدين الذين لا يملكون مصادقة/profile/نموذجًا صالحًا + - يشغّل أوضاع وقت التشغيل المعلنة كليهما عند توفرهما: + - `generate` مع إدخال يعتمد على prompt فقط + - `imageToVideo` عندما يعلن المزوّد `capabilities.imageToVideo.enabled` ويقبل المزوّد/النموذج المحدد إدخال الصور المحلية المعتمد على buffer في المسح المشترك + - `videoToVideo` عندما يعلن المزوّد `capabilities.videoToVideo.enabled` ويقبل المزوّد/النموذج المحدد إدخال الفيديو المحلي المعتمد على buffer في المسح المشترك + - المزوّدون المعلن عنهم حاليًا لكن المتجاوزون في المسح المشترك لـ `imageToVideo`: + - `vydra` لأن `veo3` المضمّن نصي فقط و `kling` المضمّن يتطلب عنوان URL بعيدًا للصورة - تغطية Vydra الخاصة بالمزوّد: - `OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_VYDRA_VIDEO=1 pnpm test:live -- extensions/vydra/vydra.live.test.ts` - - يشغّل هذا الملف مسار `veo3` لتحويل النص إلى فيديو بالإضافة إلى مسار `kling` يستخدم fixture لعنوان URL صورة بعيد افتراضيًا - - التغطية الحالية لـ `videoToVideo` في live: + - يشغّل هذا الملف `veo3` لتحويل النص إلى فيديو بالإضافة إلى مسار `kling` يستخدم fixture لعنوان URL بعيد للصورة افتراضيًا + - التغطية الحية الحالية لـ `videoToVideo`: - `runway` فقط عندما يكون النموذج المحدد هو `runway/gen4_aleph` - - المزوّدون الحاليون المعلَن عنهم لكن يتم تجاوزهم في مسح `videoToVideo` المشترك: - - `alibaba` و`qwen` و`xai` لأن هذه المسارات تتطلب حاليًا عناوين URL مرجعية بعيدة من نوع `http(s)` / MP4 - - `google` لأن مسار Gemini/Veo المشترك الحالي يستخدم إدخالًا محليًا مدعومًا بالذاكرة المؤقتة ولا يُقبل هذا المسار في المسح المشترك - - `openai` لأن المسار المشترك الحالي يفتقر إلى ضمانات وصول الفيديو الخاصة بالمؤسسة لعمليات inpaint/remix + - المزوّدون المعلن عنهم حاليًا لكن المتجاوزون في المسح المشترك لـ `videoToVideo`: + - `alibaba` و `qwen` و `xai` لأن هذه المسارات تتطلب حاليًا عناوين URL مرجعية بعيدة من نوع `http(s)` / MP4 + - `google` لأن مسار Gemini/Veo المشترك الحالي يستخدم إدخالًا محليًا معتمدًا على buffer وهذا المسار غير مقبول في المسح المشترك + - `openai` لأن المسار المشترك الحالي يفتقر إلى ضمانات وصول خاصة بالمؤسسة لفيديو inpaint/remix - التضييق الاختياري: - `OPENCLAW_LIVE_VIDEO_GENERATION_PROVIDERS="google,openai,runway"` - `OPENCLAW_LIVE_VIDEO_GENERATION_MODELS="google/veo-3.1-fast-generate-preview,openai/sora-2,runway/gen4_aleph"` - سلوك المصادقة الاختياري: - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` لفرض مصادقة مخزن profile وتجاهل التجاوزات المعتمدة على env فقط -## إطار اختبارات الوسائط الحي +## حزام media live - الأمر: `pnpm test:live:media` - الغرض: - - يشغّل مجموعات live المشتركة للصورة والموسيقى والفيديو عبر نقطة دخول أصلية واحدة للمستودع - - يحمّل تلقائيًا متغيرات env الناقصة الخاصة بالمزوّد من `~/.profile` - - يضيّق تلقائيًا كل مجموعة إلى المزوّدين الذين يملكون حاليًا مصادقة قابلة للاستخدام افتراضيًا + - يشغّل مجموعات image و music و video الحية المشتركة عبر نقطة دخول أصلية واحدة للمستودع + - يحمّل تلقائيًا متغيرات env المفقودة الخاصة بالمزوّد من `~/.profile` + - يضيّق تلقائيًا كل مجموعة إلى المزوّدين الذين يملكون حاليًا مصادقة صالحة افتراضيًا - يعيد استخدام `scripts/test-live.mjs`، بحيث يبقى سلوك Heartbeat والوضع الهادئ متسقًا - أمثلة: - `pnpm test:live:media` @@ -741,128 +819,128 @@ pnpm test:docker:live-codex-harness - `pnpm test:live:media video --video-providers openai,runway --all-providers` - `pnpm test:live:media music --quiet` -## مشغلات Docker (فحوصات اختيارية من نوع "يعمل على Linux") +## مشغّلات Docker (فحوصات اختيارية من نوع "تعمل على Linux") -تنقسم مشغلات Docker هذه إلى فئتين: +تنقسم مشغّلات Docker هذه إلى فئتين: -- مشغلات النماذج الحية: يشغّل `test:docker:live-models` و`test:docker:live-gateway` فقط ملف الاختبار الحي المطابق لمفاتيح profile داخل صورة Docker الخاصة بالمستودع (`src/agents/models.profiles.live.test.ts` و`src/gateway/gateway-models.profiles.live.test.ts`)، مع تركيب دليل الإعداد المحلي ومساحة العمل الخاصة بك (واستيراد `~/.profile` إذا تم تركيبه). ونقاط الدخول المحلية المطابقة هي `test:live:models-profiles` و`test:live:gateway-profiles`. -- تستخدم مشغلات Docker الحية افتراضيًا حد smoke أصغر حتى يظل المسح الكامل داخل Docker عمليًا: - يستخدم `test:docker:live-models` القيمة الافتراضية `OPENCLAW_LIVE_MAX_MODELS=12`، ويستخدم +- مشغّلات النماذج الحية: `test:docker:live-models` و `test:docker:live-gateway` يشغّلان فقط ملف الاختبار الحي المطابق لكل منهما والمخصص لمفاتيح profile داخل صورة Docker الخاصة بالمستودع (`src/agents/models.profiles.live.test.ts` و `src/gateway/gateway-models.profiles.live.test.ts`)، مع تركيب دليل الإعداد المحلي ومساحة العمل لديك (ومع تحميل `~/.profile` إذا جرى تركيبه). نقاط الدخول المحلية المطابقة هي `test:live:models-profiles` و `test:live:gateway-profiles`. +- تستخدم مشغّلات Docker الحية افتراضيًا حدًا أصغر لاختبار smoke حتى يبقى المسح الكامل داخل Docker عمليًا: + يستخدم `test:docker:live-models` افتراضيًا `OPENCLAW_LIVE_MAX_MODELS=12`، ويستخدم `test:docker:live-gateway` افتراضيًا `OPENCLAW_LIVE_GATEWAY_SMOKE=1`، - و`OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8`، - و`OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000`، و - `OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000`. تجاوز هذه المتغيرات البيئية عندما - تريد صراحةً إجراء المسح الشامل الأكبر. -- يقوم `test:docker:all` ببناء صورة Docker الحية مرة واحدة عبر `test:docker:live-build`، ثم يعيد استخدامها لمساري Docker الحيين. -- مشغلات smoke الخاصة بالحاويات: `test:docker:openwebui` و`test:docker:onboard` و`test:docker:gateway-network` و`test:docker:mcp-channels` و`test:docker:plugins` تشغّل حاوية واحدة أو أكثر حقيقية وتتحقق من مسارات تكامل أعلى مستوى. + و `OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8`، + و `OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000`، و + `OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000`. تجاوز متغيرات env هذه عندما + تريد صراحةً المسح الأكبر والأشمل. +- يبني `test:docker:all` صورة Docker الحية مرة واحدة عبر `test:docker:live-build`، ثم يعيد استخدامها لمساري Docker الحيين. +- مشغّلات smoke الخاصة بالحاويات: `test:docker:openwebui` و `test:docker:onboard` و `test:docker:gateway-network` و `test:docker:mcp-channels` و `test:docker:plugins` تشغّل حاوية واحدة أو أكثر حقيقية وتتحقق من مسارات تكامل ذات مستوى أعلى. -تقوم مشغلات Docker الخاصة بالنماذج الحية أيضًا بتركيب أدلة مصادقة CLI المطلوبة فقط (أو جميع الأدلة المدعومة عندما لا يكون التشغيل مضيقًا)، ثم تنسخها إلى home الخاص بالحاوية قبل التشغيل حتى تتمكن مصادقة OAuth الخاصة بواجهات CLI الخارجية من تحديث الرموز من دون تعديل مخزن المصادقة على المضيف: +تقوم مشغّلات Docker الخاصة بالنماذج الحية أيضًا بتركيب أدلة home الخاصة بمصادقة CLI المطلوبة فقط (أو جميع الأدلة المدعومة عندما لا يكون التشغيل مضيّقًا)، ثم تنسخها إلى home الحاوية قبل التشغيل حتى تتمكن مصادقة OAuth الخاصة بـ CLI الخارجية من تحديث الرموز من دون تعديل مخزن المصادقة على المضيف: -- النماذج المباشرة: `pnpm test:docker:live-models` (السكربت: `scripts/test-live-models-docker.sh`) -- اختبار smoke لربط ACP: `pnpm test:docker:live-acp-bind` (السكربت: `scripts/test-live-acp-bind-docker.sh`) -- اختبار smoke للواجهة الخلفية CLI: `pnpm test:docker:live-cli-backend` (السكربت: `scripts/test-live-cli-backend-docker.sh`) -- اختبار smoke لإطار Codex app-server: `pnpm test:docker:live-codex-harness` (السكربت: `scripts/test-live-codex-harness-docker.sh`) -- Gateway + وكيل التطوير: `pnpm test:docker:live-gateway` (السكربت: `scripts/test-live-gateway-models-docker.sh`) -- اختبار smoke حي لـ Open WebUI: `pnpm test:docker:openwebui` (السكربت: `scripts/e2e/openwebui-docker.sh`) -- معالج onboarding (TTY، scaffold كامل): `pnpm test:docker:onboard` (السكربت: `scripts/e2e/onboard-docker.sh`) -- شبكات Gateway (حاويتان، مصادقة WS + health): `pnpm test:docker:gateway-network` (السكربت: `scripts/e2e/gateway-network-docker.sh`) -- جسر قناة MCP (Gateway مُهيّأ مسبقًا + جسر stdio + اختبار smoke خام لإطار إشعارات Claude): `pnpm test:docker:mcp-channels` (السكربت: `scripts/e2e/mcp-channels-docker.sh`) -- Plugins (اختبار smoke للتثبيت + الاسم المستعار `/plugin` + دلالات إعادة تشغيل حزمة Claude): `pnpm test:docker:plugins` (السكربت: `scripts/e2e/plugins-docker.sh`) +- النماذج المباشرة: `pnpm test:docker:live-models` (السكريبت: `scripts/test-live-models-docker.sh`) +- اختبار smoke لربط ACP: `pnpm test:docker:live-acp-bind` (السكريبت: `scripts/test-live-acp-bind-docker.sh`) +- اختبار smoke لواجهة CLI الخلفية: `pnpm test:docker:live-cli-backend` (السكريبت: `scripts/test-live-cli-backend-docker.sh`) +- اختبار smoke لـ Codex app-server harness: `pnpm test:docker:live-codex-harness` (السكريبت: `scripts/test-live-codex-harness-docker.sh`) +- Gateway + dev agent: `pnpm test:docker:live-gateway` (السكريبت: `scripts/test-live-gateway-models-docker.sh`) +- اختبار smoke حي لـ Open WebUI: `pnpm test:docker:openwebui` (السكريبت: `scripts/e2e/openwebui-docker.sh`) +- معالج onboarding (TTY، تهيئة كاملة): `pnpm test:docker:onboard` (السكريبت: `scripts/e2e/onboard-docker.sh`) +- شبكات Gateway (حاويتان، مصادقة WS + الصحة): `pnpm test:docker:gateway-network` (السكريبت: `scripts/e2e/gateway-network-docker.sh`) +- جسر قناة MCP (Gateway مُهيأ مسبقًا + جسر stdio + اختبار smoke خام لإطارات الإشعارات على نمط Claude): `pnpm test:docker:mcp-channels` (السكريبت: `scripts/e2e/mcp-channels-docker.sh`) +- Plugins (اختبار smoke للتثبيت + الاسم المستعار `/plugin` + دلالات إعادة تشغيل Claude-bundle): `pnpm test:docker:plugins` (السكريبت: `scripts/e2e/plugins-docker.sh`) -تقوم مشغلات Docker الخاصة بالنماذج الحية أيضًا بتركيب النسخة الحالية من المستودع -للقراءة فقط ثم تجهّزها في workdir مؤقت داخل الحاوية. وهذا يُبقي صورة وقت التشغيل -خفيفة مع الاستمرار في تشغيل Vitest على المصدر/الإعداد المحلي الدقيق لديك. -وتتجاوز خطوة التجهيز المخازن المؤقتة المحلية الكبيرة ومخرجات بناء التطبيقات مثل -`.pnpm-store` و`.worktrees` و`__openclaw_vitest__` وأدلة `.build` المحلية للتطبيق أو -مخرجات Gradle، حتى لا تقضي تشغيلات Docker الحية دقائق في نسخ artifacts -خاصة بالجهاز. -كما تضبط أيضًا `OPENCLAW_SKIP_CHANNELS=1` حتى لا تبدأ فحوصات gateway الحية -عمّال قنوات حقيقية مثل Telegram/Discord وغيرها داخل الحاوية. -لا يزال `test:docker:live-models` يشغّل `pnpm test:live`، لذا مرّر أيضًا -`OPENCLAW_LIVE_GATEWAY_*` عندما تحتاج إلى تضييق أو استبعاد تغطية gateway +تقوم مشغّلات Docker الخاصة بالنماذج الحية أيضًا بتركيب النسخة الحالية من المستودع +بوضع القراءة فقط وتجهيزها في workdir مؤقت داخل الحاوية. وهذا يُبقي صورة وقت التشغيل +نحيفة، مع الاستمرار في تشغيل Vitest مقابل source/config المحليين الدقيقين لديك. +تتجاوز خطوة التجهيز التخزينات المؤقتة المحلية الكبيرة فقط ومخرجات بناء التطبيقات مثل +`.pnpm-store` و `.worktrees` و `__openclaw_vitest__` وأدلة `.build` المحلية للتطبيق أو +مخرجات Gradle حتى لا تقضي التشغيلات الحية داخل Docker دقائق في نسخ +القطع الأثرية الخاصة بكل جهاز. +كما تضبط أيضًا `OPENCLAW_SKIP_CHANNELS=1` حتى لا تبدأ probes الحية الخاصة بـ gateway +عمّال القنوات الحقيقية مثل Telegram/Discord وغيرها داخل الحاوية. +لا يزال `test:docker:live-models` يشغّل `pnpm test:live`، لذا مرّر +`OPENCLAW_LIVE_GATEWAY_*` أيضًا عندما تحتاج إلى تضييق أو استبعاد تغطية gateway الحية من مسار Docker هذا. -ويُعد `test:docker:openwebui` اختبار smoke توافقًا أعلى مستوى: فهو يبدأ -حاوية Gateway خاصة بـ OpenClaw مع تفعيل نقاط نهاية HTTP المتوافقة مع OpenAI، -ويبدأ حاوية Open WebUI مثبتة على ذلك الـ gateway، ويسجل الدخول عبر -Open WebUI، ويتحقق من أن `/api/models` يعرض `openclaw/default`، ثم يرسل -طلب دردشة حقيقيًا عبر وكيل `/api/chat/completions` في Open WebUI. -قد يكون التشغيل الأول أبطأ بشكل ملحوظ لأن Docker قد يحتاج إلى سحب صورة -Open WebUI وقد يحتاج Open WebUI نفسه إلى إنهاء إعداد البدء البارد الخاص به. -ويتوقع هذا المسار مفتاح نموذج حي صالحًا، ويُعد `OPENCLAW_PROFILE_FILE` -(`~/.profile` افتراضيًا) الطريقة الأساسية لتوفيره في التشغيلات داخل Docker. -وتطبع التشغيلات الناجحة حمولة JSON صغيرة مثل `{ "ok": true, "model": +يُعد `test:docker:openwebui` اختبار smoke توافقًا أعلى مستوى: فهو يبدأ +حاوية OpenClaw gateway مع تمكين نقاط نهاية HTTP المتوافقة مع OpenAI، +ثم يبدأ حاوية Open WebUI مثبتة الإصدار مقابل ذلك gateway، ويسجل الدخول عبر +Open WebUI، ويتحقق من أن `/api/models` يعرّض `openclaw/default`، ثم يرسل +طلب دردشة حقيقيًا عبر proxy الخاص بـ `/api/chat/completions` في Open WebUI. +قد يكون التشغيل الأول أبطأ بشكل ملحوظ لأن Docker قد يحتاج إلى سحب +صورة Open WebUI وقد تحتاج Open WebUI إلى إكمال إعداد البدء البارد الخاص بها. +يتوقع هذا المسار مفتاح نموذج حي صالحًا، ويُعد `OPENCLAW_PROFILE_FILE` +(الافتراضي `~/.profile`) الطريقة الأساسية لتوفيره في التشغيلات داخل Docker. +تطبع التشغيلات الناجحة حمولة JSON صغيرة مثل `{ "ok": true, "model": "openclaw/default", ... }`. -أما `test:docker:mcp-channels` فهو حتمي عمدًا ولا يحتاج إلى حساب -Telegram أو Discord أو iMessage حقيقي. فهو يشغّل حاوية Gateway -مُهيّأة مسبقًا، ويبدأ حاوية ثانية تشغّل `openclaw mcp serve`، ثم -يتحقق من اكتشاف المحادثات الموجّهة، وقراءة النصوص، وبيانات تعريف المرفقات، -وسلوك طابور الأحداث الحية، وتوجيه الإرسال الصادر، وإشعارات القنوات + -الأذونات على نمط Claude عبر جسر MCP الحقيقي القائم على stdio. كما يفحص تحقق -الإشعارات إطارات MCP الخام الخاصة بـ stdio مباشرة حتى يثبت الاختبار ما الذي -يبثه الجسر فعليًا، لا مجرد ما قد تعرضه مجموعة SDK عميل معيّنة. +يُعد `test:docker:mcp-channels` حتميًا عمدًا ولا يحتاج إلى +حساب حقيقي على Telegram أو Discord أو iMessage. فهو يشغّل حاوية Gateway +مُهيأة مسبقًا، ثم يبدأ حاوية ثانية تشغّل `openclaw mcp serve`، ثم +يتحقق من اكتشاف المحادثات الموجّهة، وقراءة transcript، وmetadata الخاصة بالمرفقات، +وسلوك طابور الأحداث الحية، وتوجيه الإرسال الصادر، وإشعارات القناة + +الأذونات على نمط Claude عبر جسر stdio MCP الحقيقي. يفحص اختبار الإشعارات +إطارات stdio MCP الخام مباشرة حتى يتحقق اختبار smoke مما يصدره الجسر +فعليًا، وليس فقط مما تعرضه مجموعة SDK معينة للعميل. -اختبار smoke يدوي لخيط ACP بلغة طبيعية (ليس في CI): +اختبار smoke يدوي لخيط ACP بلغة طبيعية عادية (ليس في CI): - `bun scripts/dev/discord-acp-plain-language-smoke.ts --channel ...` -- احتفظ بهذا السكربت لتدفقات العمل الخاصة بالاختبارات التراجعية/التصحيح. فقد تكون هناك حاجة إليه مرة أخرى للتحقق من توجيه خيوط ACP، لذا لا تحذفه. +- احتفظ بهذا السكريبت من أجل تدفقات عمل الانحدار/تصحيح الأخطاء. فقد تكون هناك حاجة إليه مرة أخرى للتحقق من توجيه خيوط ACP، لذلك لا تحذفه. -متغيرات env مفيدة: +متغيرات env المفيدة: -- `OPENCLAW_CONFIG_DIR=...` (الافتراضي: `~/.openclaw`) يُركّب إلى `/home/node/.openclaw` -- `OPENCLAW_WORKSPACE_DIR=...` (الافتراضي: `~/.openclaw/workspace`) يُركّب إلى `/home/node/.openclaw/workspace` -- `OPENCLAW_PROFILE_FILE=...` (الافتراضي: `~/.profile`) يُركّب إلى `/home/node/.profile` ويُستورد قبل تشغيل الاختبارات -- `OPENCLAW_DOCKER_CLI_TOOLS_DIR=...` (الافتراضي: `~/.cache/openclaw/docker-cli-tools`) يُركّب إلى `/home/node/.npm-global` لتخزين تثبيتات CLI مؤقتًا داخل Docker -- تُركّب أدلة/ملفات مصادقة CLI الخارجية تحت `$HOME` للقراءة فقط ضمن `/host-auth...`، ثم تُنسخ إلى `/home/node/...` قبل بدء الاختبارات +- `OPENCLAW_CONFIG_DIR=...` (الافتراضي: `~/.openclaw`) ويُركّب إلى `/home/node/.openclaw` +- `OPENCLAW_WORKSPACE_DIR=...` (الافتراضي: `~/.openclaw/workspace`) ويُركّب إلى `/home/node/.openclaw/workspace` +- `OPENCLAW_PROFILE_FILE=...` (الافتراضي: `~/.profile`) ويُركّب إلى `/home/node/.profile` ويُحمّل قبل تشغيل الاختبارات +- `OPENCLAW_DOCKER_CLI_TOOLS_DIR=...` (الافتراضي: `~/.cache/openclaw/docker-cli-tools`) ويُركّب إلى `/home/node/.npm-global` من أجل تثبيتات CLI المخزنة مؤقتًا داخل Docker +- تُركّب أدلة/ملفات مصادقة CLI الخارجية تحت `$HOME` بوضع القراءة فقط تحت `/host-auth...`، ثم تُنسخ إلى `/home/node/...` قبل بدء الاختبارات - الأدلة الافتراضية: `.minimax` - - الملفات الافتراضية: `~/.codex/auth.json` و`~/.codex/config.toml` و`.claude.json` و`~/.claude/.credentials.json` و`~/.claude/settings.json` و`~/.claude/settings.local.json` - - تركّب التشغيلات المضيقة للمزوّد فقط الأدلة/الملفات المطلوبة التي يتم استنتاجها من `OPENCLAW_LIVE_PROVIDERS` / `OPENCLAW_LIVE_GATEWAY_PROVIDERS` - - يمكن التجاوز يدويًا عبر `OPENCLAW_DOCKER_AUTH_DIRS=all` أو `OPENCLAW_DOCKER_AUTH_DIRS=none` أو قائمة مفصولة بفواصل مثل `OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex` + - الملفات الافتراضية: `~/.codex/auth.json` و `~/.codex/config.toml` و `.claude.json` و `~/.claude/.credentials.json` و `~/.claude/settings.json` و `~/.claude/settings.local.json` + - تشغيلات المزوّد المضيّقة تركّب فقط الأدلة/الملفات المطلوبة المستنتجة من `OPENCLAW_LIVE_PROVIDERS` / `OPENCLAW_LIVE_GATEWAY_PROVIDERS` + - تجاوز ذلك يدويًا باستخدام `OPENCLAW_DOCKER_AUTH_DIRS=all` أو `OPENCLAW_DOCKER_AUTH_DIRS=none` أو قائمة مفصولة بفواصل مثل `OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex` - `OPENCLAW_LIVE_GATEWAY_MODELS=...` / `OPENCLAW_LIVE_MODELS=...` لتضييق التشغيل - `OPENCLAW_LIVE_GATEWAY_PROVIDERS=...` / `OPENCLAW_LIVE_PROVIDERS=...` لتصفية المزوّدين داخل الحاوية -- `OPENCLAW_SKIP_DOCKER_BUILD=1` لإعادة استخدام صورة `openclaw:local-live` موجودة لتكرارات التشغيل التي لا تحتاج إلى إعادة بناء +- `OPENCLAW_SKIP_DOCKER_BUILD=1` لإعادة استخدام صورة `openclaw:local-live` الحالية في إعادة التشغيلات التي لا تحتاج إلى إعادة بناء - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` لضمان أن تأتي بيانات الاعتماد من مخزن profile (وليس من env) -- `OPENCLAW_OPENWEBUI_MODEL=...` لاختيار النموذج الذي يعرضه gateway لاختبار smoke الخاص بـ Open WebUI -- `OPENCLAW_OPENWEBUI_PROMPT=...` لتجاوز موجه التحقق من nonce المستخدم في اختبار smoke لـ Open WebUI +- `OPENCLAW_OPENWEBUI_MODEL=...` لاختيار النموذج الذي يعرّضه gateway لاختبار smoke الخاص بـ Open WebUI +- `OPENCLAW_OPENWEBUI_PROMPT=...` لتجاوز prompt فحص nonce المستخدم في اختبار smoke الخاص بـ Open WebUI - `OPENWEBUI_IMAGE=...` لتجاوز وسم صورة Open WebUI المثبتة ## سلامة المستندات -شغّل فحوصات المستندات بعد تعديلات المستندات: `pnpm check:docs`. -وشغّل التحقق الكامل من روابط Mintlify anchors عندما تحتاج أيضًا إلى فحوصات العناوين داخل الصفحة: `pnpm docs:check-links:anchors`. +شغّل فحوصات المستندات بعد تعديلها: `pnpm check:docs`. +وشغّل التحقق الكامل من روابط/anchors الخاصة بـ Mintlify عندما تحتاج إلى فحوصات عناوين داخل الصفحة أيضًا: `pnpm docs:check-links:anchors`. -## اختبار تراجعي دون اتصال (آمن لـ CI) +## اختبار انحدار دون اتصال (آمن لـ CI) -هذه اختبارات تراجعية لـ «خط أنابيب حقيقي» من دون مزوّدين حقيقيين: +هذه اختبارات انحدار "لخط حقيقي" من دون مزوّدين حقيقيين: -- استدعاء أدوات Gateway (OpenAI وهمي، Gateway حقيقي + حلقة وكيل حقيقية): `src/gateway/gateway.test.ts` (الحالة: "runs a mock OpenAI tool call end-to-end via gateway agent loop") -- معالج Gateway (‏WS `wizard.start`/`wizard.next`، يكتب الإعداد + يفرض المصادقة): `src/gateway/gateway.test.ts` (الحالة: "runs wizard over ws and writes auth token config") +- استدعاء أدوات Gateway (OpenAI وهمي، مع gateway + حلقة agent حقيقية): `src/gateway/gateway.test.ts` (الحالة: "runs a mock OpenAI tool call end-to-end via gateway agent loop") +- معالج Gateway (‏WS `wizard.start`/`wizard.next`، مع فرض كتابة config + auth): `src/gateway/gateway.test.ts` (الحالة: "runs wizard over ws and writes auth token config") ## تقييمات موثوقية الوكيل (Skills) -لدينا بالفعل بعض الاختبارات الآمنة لـ CI التي تتصرف مثل «تقييمات موثوقية الوكيل»: +لدينا بالفعل بعض الاختبارات الآمنة لـ CI التي تتصرف مثل "تقييمات موثوقية الوكيل": -- استدعاء الأدوات الوهمي عبر حلقة Gateway + الوكيل الحقيقية (`src/gateway/gateway.test.ts`). -- تدفقات المعالج الكاملة من طرف إلى طرف التي تتحقق من توصيل الجلسة وتأثيرات الإعداد (`src/gateway/gateway.test.ts`). +- استدعاء أدوات وهمية عبر حلقة gateway + agent الحقيقية (`src/gateway/gateway.test.ts`). +- تدفقات wizard من طرف إلى طرف تتحقق من توصيل الجلسة وتأثيرات config (`src/gateway/gateway.test.ts`). -ما الذي لا يزال مفقودًا بالنسبة إلى Skills (راجع [Skills](/ar/tools/skills)): +ما لا يزال مفقودًا بالنسبة إلى Skills (راجع [Skills](/ar/tools/skills)): -- **اتخاذ القرار:** عندما تُدرج Skills في الموجه، هل يختار الوكيل Skill الصحيحة (أو يتجنب غير الملائمة)؟ -- **الامتثال:** هل يقرأ الوكيل `SKILL.md` قبل الاستخدام ويتبع الخطوات/المعاملات المطلوبة؟ -- **عقود سير العمل:** سيناريوهات متعددة الأدوار تتحقق من ترتيب الأدوات، واستمرار سجل الجلسة، وحدود sandbox. +- **اتخاذ القرار:** عند إدراج Skills في prompt، هل يختار الوكيل Skill الصحيحة (أو يتجنب غير ذات الصلة)؟ +- **الامتثال:** هل يقرأ الوكيل `SKILL.md` قبل الاستخدام ويلتزم بالخطوات/الوسائط المطلوبة؟ +- **عقود سير العمل:** سيناريوهات متعددة الأدوار تؤكد ترتيب الأدوات، واستمرار سجل الجلسة، وحدود sandbox. يجب أن تبقى التقييمات المستقبلية حتمية أولًا: -- مشغّل سيناريوهات يستخدم مزوّدين وهميين للتحقق من استدعاءات الأدوات + ترتيبها، وقراءة ملفات skill، وتوصيل الجلسة. -- مجموعة صغيرة من السيناريوهات المركزة على Skills (استخدم مقابل تجنب، والبوابات، وحقن الموجه). -- تقييمات live اختيارية (مفعّلة عند الطلب وبوابات env) فقط بعد وجود المجموعة الآمنة لـ CI. +- مشغّل سيناريوهات يستخدم مزوّدين وهميين لتأكيد استدعاءات الأدوات + ترتيبها، وقراءات ملفات Skill، وتوصيل الجلسات. +- مجموعة صغيرة من السيناريوهات المركزة على Skills (استخدام مقابل تجنب، والبوابات، وحقن prompt). +- تقييمات حية اختيارية (مقيّدة بالبيئة ومفعّلة اختياريًا) فقط بعد وضع المجموعة الآمنة لـ CI. ## اختبارات العقود (شكل Plugin والقناة) تتحقق اختبارات العقود من أن كل Plugin وقناة مسجلين يلتزمان -بعقد الواجهة الخاص بهما. فهي تكرّر على جميع Plugins المكتشفة وتشغّل مجموعة من -التحققات الخاصة بالشكل والسلوك. ويتجاوز مسار unit الافتراضي في `pnpm test` -عمدًا هذه الملفات المشتركة الخاصة بالواجهات واختبارات smoke؛ شغّل أوامر العقود -صراحةً عندما تلمس الأسطح المشتركة الخاصة بالقنوات أو المزوّدين. +بعقد الواجهة الخاصة بهما. فهي تتكرر على جميع Plugins المكتشفة وتشغّل مجموعة من +التحققات الخاصة بالشكل والسلوك. يتجاوز مسار unit الافتراضي `pnpm test` +عمدًا هذه الملفات المشتركة الخاصة بالوصلات واختبار smoke؛ شغّل أوامر العقود صراحةً +عندما تلمس الأسطح المشتركة للقنوات أو المزوّدين. ### الأوامر @@ -880,15 +958,15 @@ Telegram أو Discord أو iMessage حقيقي. فهو يشغّل حاوية Gat - **outbound-payload** - بنية حمولة الرسالة - **inbound** - معالجة الرسائل الواردة - **actions** - معالجات إجراءات القناة -- **threading** - التعامل مع معرّف الخيط -- **directory** - واجهة API الخاصة بالدليل/القائمة -- **group-policy** - فرض سياسة المجموعات +- **threading** - معالجة معرّف الخيط +- **directory** - واجهة API للدليل/القائمة +- **group-policy** - فرض سياسة المجموعة ### عقود حالة المزوّد تقع في `src/plugins/contracts/*.contract.test.ts`. -- **status** - فحوصات حالة القناة +- **status** - probes حالة القناة - **registry** - شكل سجل Plugin ### عقود المزوّدين @@ -904,23 +982,23 @@ Telegram أو Discord أو iMessage حقيقي. فهو يشغّل حاوية Gat - **shape** - شكل/واجهة Plugin - **wizard** - معالج الإعداد -### متى تُشغَّل +### متى يجب التشغيل -- بعد تغيير صادرات `plugin-sdk` أو المسارات الفرعية +- بعد تغيير صادرات أو مسارات `plugin-sdk` - بعد إضافة Plugin قناة أو مزوّد أو تعديله - بعد إعادة هيكلة تسجيل Plugin أو اكتشافه تعمل اختبارات العقود في CI ولا تتطلب مفاتيح API حقيقية. -## إضافة اختبارات تراجعية (إرشادات) +## إضافة اختبارات انحدار (إرشادات) -عندما تصلح مشكلة مزوّد/نموذج تم اكتشافها في live: +عند إصلاح مشكلة مزوّد/نموذج اكتُشفت في live: -- أضف اختبارًا تراجعيًا آمنًا لـ CI إن أمكن (مزوّدًا وهميًا/Stub، أو التقط تحويل شكل الطلب الدقيق) -- إذا كانت المشكلة بطبيعتها live فقط (حدود المعدل، وسياسات المصادقة)، فأبقِ اختبار live ضيقًا ومفعّلًا عند الطلب عبر متغيرات env +- أضف اختبار انحدار آمنًا لـ CI إن أمكن (مزوّد وهمي/بديل، أو التقط شكل تحويل الطلب الدقيق) +- إذا كانت المشكلة حية بطبيعتها فقط (حدود المعدل، وسياسات المصادقة)، فأبقِ الاختبار الحي ضيقًا ومفعّلًا اختياريًا عبر متغيرات env - فضّل استهداف أصغر طبقة تلتقط الخطأ: - - خطأ في تحويل/إعادة تشغيل طلب المزوّد → اختبار النماذج المباشرة - - خطأ في خط أنابيب جلسة/سجل/أدوات gateway → اختبار smoke حي لـ gateway أو اختبار Gateway وهمي وآمن لـ CI -- حاجز الحماية لاجتياز SecretRef: - - يستمد `src/secrets/exec-secret-ref-id-parity.test.ts` هدفًا نموذجيًا واحدًا لكل فئة SecretRef من بيانات سجل metadata (`listSecretTargetRegistryEntries()`)، ثم يتحقق من رفض معرّفات exec الخاصة بمقاطع الاجتياز. - - إذا أضفت عائلة أهداف SecretRef جديدة من نوع `includeInPlan` في `src/secrets/target-registry-data.ts`، فحدّث `classifyTargetClass` في ذلك الاختبار. ويفشل الاختبار عمدًا عند وجود معرّفات أهداف غير مصنفة حتى لا يمكن تخطي الفئات الجديدة بصمت. + - خطأ تحويل/إعادة تشغيل طلب المزوّد → اختبار النماذج المباشرة + - خطأ في خط الجلسة/السجل/الأدوات في gateway → اختبار smoke حي لـ gateway أو اختبار gateway وهمي وآمن لـ CI +- حاجز حماية عبور SecretRef: + - `src/secrets/exec-secret-ref-id-parity.test.ts` يشتق هدفًا نموذجيًا واحدًا لكل فئة SecretRef من metadata الخاصة بالسجل (`listSecretTargetRegistryEntries()`)، ثم يؤكد رفض معرّفات exec الخاصة بمقاطع العبور. + - إذا أضفت عائلة هدف SecretRef جديدة مع `includeInPlan` في `src/secrets/target-registry-data.ts`، فحدّث `classifyTargetClass` في ذلك الاختبار. يفشل الاختبار عمدًا عند وجود معرّفات هدف غير مصنفة حتى لا يمكن تجاوز الفئات الجديدة بصمت. diff --git a/docs/ar/providers/index.md b/docs/ar/providers/index.md index 34cc34979..0bcde4765 100644 --- a/docs/ar/providers/index.md +++ b/docs/ar/providers/index.md @@ -1,29 +1,29 @@ --- read_when: - - تريد اختيار موفر نموذج + - تريد اختيار موفّر نماذج - تحتاج إلى نظرة عامة سريعة على الواجهات الخلفية المدعومة لـ LLM -summary: موفرو النماذج (LLMs) الذين يدعمهم OpenClaw -title: دليل الموفرين +summary: موفرو النماذج (LLMs) المدعومون بواسطة OpenClaw +title: دليل المزوّدين x-i18n: - generated_at: "2026-04-08T02:17:25Z" + generated_at: "2026-04-13T07:28:50Z" model: gpt-5.4 provider: openai - source_hash: e7bee5528b7fc9a982b3d0eaa4930cb77f7bded19a47aec00572b6fcbd823a70 + source_hash: 3bc682d008119719826f71f74959ab32bedf14214459f5e6ac9cb70371d3c540 source_path: providers/index.md workflow: 15 --- # موفرو النماذج -يمكن لـ OpenClaw استخدام العديد من موفري LLM. اختر موفرًا، ثم أكمل المصادقة، ثم اضبط +يمكن لـ OpenClaw استخدام العديد من موفري LLM. اختر موفّرًا، وأكمل المصادقة، ثم عيّن النموذج الافتراضي بصيغة `provider/model`. -هل تبحث عن وثائق قنوات الدردشة (WhatsApp/Telegram/Discord/Slack/Mattermost (plugin)/إلخ)؟ راجع [القنوات](/ar/channels). +هل تبحث عن وثائق قنوات الدردشة (WhatsApp/Telegram/Discord/Slack/Mattermost (Plugin)/إلخ)؟ راجع [القنوات](/ar/channels). -## بداية سريعة +## البدء السريع -1. أكمل المصادقة مع الموفر (عادةً عبر `openclaw onboard`). -2. اضبط النموذج الافتراضي: +1. أكمل المصادقة مع المزوّد (عادةً عبر `openclaw onboard`). +2. عيّن النموذج الافتراضي: ```json5 { @@ -31,13 +31,13 @@ x-i18n: } ``` -## وثائق الموفرين +## وثائق المزوّدين - [Alibaba Model Studio](/ar/providers/alibaba) - [Amazon Bedrock](/ar/providers/bedrock) - [Anthropic (API + Claude CLI)](/ar/providers/anthropic) - [Arcee AI (نماذج Trinity)](/ar/providers/arcee) -- [BytePlus (الدولي)](/ar/concepts/model-providers#byteplus-international) +- [BytePlus (دولي)](/ar/concepts/model-providers#byteplus-international) - [Chutes](/ar/providers/chutes) - [ComfyUI](/ar/providers/comfy) - [Cloudflare AI Gateway](/ar/providers/cloudflare-ai-gateway) @@ -48,10 +48,11 @@ x-i18n: - [نماذج GLM](/ar/providers/glm) - [Google (Gemini)](/ar/providers/google) - [Groq (استدلال LPU)](/ar/providers/groq) -- [Hugging Face (Inference)](/ar/providers/huggingface) +- [Hugging Face (الاستدلال)](/ar/providers/huggingface) - [inferrs (نماذج محلية)](/ar/providers/inferrs) - [Kilocode](/ar/providers/kilocode) -- [LiteLLM (بوابة موحدة)](/ar/providers/litellm) +- [LiteLLM (بوابة موحّدة)](/ar/providers/litellm) +- [LM Studio (نماذج محلية)](/ar/providers/lmstudio) - [MiniMax](/ar/providers/minimax) - [Mistral](/ar/providers/mistral) - [Moonshot AI (Kimi + Kimi Coding)](/ar/providers/moonshot) @@ -61,7 +62,7 @@ x-i18n: - [OpenCode](/ar/providers/opencode) - [OpenCode Go](/ar/providers/opencode-go) - [OpenRouter](/ar/providers/openrouter) -- [Perplexity (بحث الويب)](/ar/providers/perplexity-provider) +- [Perplexity (البحث على الويب)](/ar/providers/perplexity-provider) - [Qianfan](/ar/providers/qianfan) - [Qwen Cloud](/ar/providers/qwen) - [Runway](/ar/providers/runway) @@ -69,7 +70,7 @@ x-i18n: - [StepFun](/ar/providers/stepfun) - [Synthetic](/ar/providers/synthetic) - [Together AI](/ar/providers/together) -- [Venice (Venice AI، مع التركيز على الخصوصية)](/ar/providers/venice) +- [Venice (Venice AI، مع تركيز على الخصوصية)](/ar/providers/venice) - [Vercel AI Gateway](/ar/providers/vercel-ai-gateway) - [Vydra](/ar/providers/vydra) - [vLLM (نماذج محلية)](/ar/providers/vllm) @@ -80,18 +81,18 @@ x-i18n: ## صفحات النظرة العامة المشتركة -- [المتغيرات المضمنة الإضافية](/ar/providers/models#additional-bundled-provider-variants) - Anthropic Vertex وCopilot Proxy وGemini CLI OAuth -- [إنشاء الصور](/ar/tools/image-generation) - الأداة المشتركة `image_generate`، واختيار الموفر، وسلوك التبديل الاحتياطي -- [إنشاء الموسيقى](/ar/tools/music-generation) - الأداة المشتركة `music_generate`، واختيار الموفر، وسلوك التبديل الاحتياطي -- [إنشاء الفيديو](/ar/tools/video-generation) - الأداة المشتركة `video_generate`، واختيار الموفر، وسلوك التبديل الاحتياطي +- [متغيرات إضافية مضمّنة](/ar/providers/models#additional-bundled-provider-variants) - Anthropic Vertex وCopilot Proxy وGemini CLI OAuth +- [توليد الصور](/ar/tools/image-generation) - أداة `image_generate` المشتركة، واختيار المزوّد، والتبديل التلقائي عند الفشل +- [توليد الموسيقى](/ar/tools/music-generation) - أداة `music_generate` المشتركة، واختيار المزوّد، والتبديل التلقائي عند الفشل +- [توليد الفيديو](/ar/tools/video-generation) - أداة `video_generate` المشتركة، واختيار المزوّد، والتبديل التلقائي عند الفشل -## موفرو النسخ الصوتي +## مزودو التفريغ النصي -- [Deepgram (نسخ الصوت)](/ar/providers/deepgram) +- [Deepgram (تفريغ نصي للصوت)](/ar/providers/deepgram) ## أدوات المجتمع -- [Claude Max API Proxy](/ar/providers/claude-max-api-proxy) - وكيل مجتمعي لبيانات اعتماد اشتراك Claude (تحقق من سياسة Anthropic/الشروط قبل الاستخدام) +- [Claude Max API Proxy](/ar/providers/claude-max-api-proxy) - وكيل مجتمع لبيانات اعتماد اشتراك Claude (تحقق من سياسة Anthropic/الشروط قبل الاستخدام) -للاطلاع على فهرس الموفرين الكامل (xAI وGroq وMistral وما إلى ذلك) والإعدادات المتقدمة، +للحصول على فهرس المزوّدين الكامل (xAI وGroq وMistral وما إلى ذلك) والإعدادات المتقدمة، راجع [موفرو النماذج](/ar/concepts/model-providers). diff --git a/docs/ar/providers/lmstudio.md b/docs/ar/providers/lmstudio.md new file mode 100644 index 000000000..0c13c9b52 --- /dev/null +++ b/docs/ar/providers/lmstudio.md @@ -0,0 +1,163 @@ +--- +read_when: + - تريد تشغيل OpenClaw باستخدام نماذج مفتوحة المصدر عبر LM Studio + - تريد إعداد LM Studio وتكوينه +summary: شغّل OpenClaw باستخدام LM Studio +title: LM Studio +x-i18n: + generated_at: "2026-04-13T07:28:51Z" + model: gpt-5.4 + provider: openai + source_hash: 11264584e8277260d4215feb7c751329ce04f59e9228da1c58e147c21cd9ac2c + source_path: providers/lmstudio.md + workflow: 15 +--- + +# LM Studio + +يُعد LM Studio تطبيقًا سهل الاستخدام لكنه قوي لتشغيل النماذج مفتوحة الأوزان على أجهزتك الخاصة. يتيح لك تشغيل نماذج llama.cpp ‏(GGUF) أو MLX ‏(Apple Silicon). يتوفر كحزمة بواجهة رسومية أو كخادم دون واجهة (`llmster`). للاطلاع على وثائق المنتج والإعداد، راجع [lmstudio.ai](https://lmstudio.ai/). + +## البدء السريع + +1. ثبّت LM Studio (سطح المكتب) أو `llmster` (دون واجهة)، ثم ابدأ الخادم المحلي: + +```bash +curl -fsSL https://lmstudio.ai/install.sh | bash +``` + +2. ابدأ الخادم + +تأكد من أنك إما تشغّل تطبيق سطح المكتب أو تشغّل الخادم باستخدام الأمر التالي: + +```bash +lms daemon up +``` + +```bash +lms server start --port 1234 +``` + +إذا كنت تستخدم التطبيق، فتأكد من تمكين JIT للحصول على تجربة سلسة. تعرّف على المزيد في [دليل JIT وTTL في LM Studio](https://lmstudio.ai/docs/developer/core/ttl-and-auto-evict). + +3. يتطلب OpenClaw قيمة رمز مميز لـ LM Studio. اضبط `LM_API_TOKEN`: + +```bash +export LM_API_TOKEN="your-lm-studio-api-token" +``` + +إذا كانت المصادقة معطّلة في LM Studio، فاستخدم أي قيمة رمز مميز غير فارغة: + +```bash +export LM_API_TOKEN="placeholder-key" +``` + +للحصول على تفاصيل إعداد المصادقة في LM Studio، راجع [مصادقة LM Studio](https://lmstudio.ai/docs/developer/core/authentication). + +4. شغّل الإعداد الأولي واختر `LM Studio`: + +```bash +openclaw onboard +``` + +5. أثناء الإعداد الأولي، استخدم موجّه `Default model` لاختيار نموذج LM Studio الخاص بك. + +يمكنك أيضًا تعيينه أو تغييره لاحقًا: + +```bash +openclaw models set lmstudio/qwen/qwen3.5-9b +``` + +تتبع مفاتيح نماذج LM Studio تنسيق `author/model-name` (مثل `qwen/qwen3.5-9b`). وتضيف مراجع نماذج OpenClaw اسم المزوّد في البداية: `lmstudio/qwen/qwen3.5-9b`. يمكنك العثور على المفتاح الدقيق لأي نموذج عبر تشغيل `curl http://localhost:1234/api/v1/models` والنظر إلى الحقل `key`. + +## الإعداد الأولي غير التفاعلي + +استخدم الإعداد الأولي غير التفاعلي عندما تريد إعدادًا قابلًا للبرمجة النصية (CI، التهيئة، الإقلاع الأولي عن بُعد): + +```bash +openclaw onboard \ + --non-interactive \ + --accept-risk \ + --auth-choice lmstudio +``` + +أو حدّد عنوان URL الأساسي أو النموذج مع مفتاح API: + +```bash +openclaw onboard \ + --non-interactive \ + --accept-risk \ + --auth-choice lmstudio \ + --custom-base-url http://localhost:1234/v1 \ + --lmstudio-api-key "$LM_API_TOKEN" \ + --custom-model-id qwen/qwen3.5-9b +``` + +يأخذ `--custom-model-id` مفتاح النموذج كما يعيده LM Studio (مثل `qwen/qwen3.5-9b`)، من دون بادئة المزوّد `lmstudio/`. + +يتطلب الإعداد الأولي غير التفاعلي `--lmstudio-api-key` (أو `LM_API_TOKEN` في البيئة). +وبالنسبة إلى خوادم LM Studio غير التي تتطلب المصادقة، تعمل أي قيمة رمز مميز غير فارغة. + +يبقى `--custom-api-key` مدعومًا للتوافق، لكن يُفضّل `--lmstudio-api-key` مع LM Studio. + +يكتب هذا `models.providers.lmstudio`، ويضبط النموذج الافتراضي إلى +`lmstudio/`، ويكتب ملف تعريف المصادقة `lmstudio:default`. + +يمكن للإعداد التفاعلي أن يطلب طول سياق تحميل مفضّل اختياريًا ويطبّقه على نماذج LM Studio المكتشفة التي يحفظها في الإعدادات. + +## الإعدادات + +### إعدادات صريحة + +```json5 +{ + models: { + providers: { + lmstudio: { + baseUrl: "http://localhost:1234/v1", + apiKey: "${LM_API_TOKEN}", + api: "openai-completions", + models: [ + { + id: "qwen/qwen3-coder-next", + name: "Qwen 3 Coder Next", + reasoning: false, + input: ["text"], + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + contextWindow: 128000, + maxTokens: 8192, + }, + ], + }, + }, + }, +} +``` + +## استكشاف الأخطاء وإصلاحها + +### لم يتم اكتشاف LM Studio + +تأكد من أن LM Studio قيد التشغيل وأنك قمت بتعيين `LM_API_TOKEN` (وبالنسبة إلى الخوادم غير التي تتطلب المصادقة، تعمل أي قيمة رمز مميز غير فارغة): + +```bash +# Start via desktop app, or headless: +lms server start --port 1234 +``` + +تحقق من إمكانية الوصول إلى API: + +```bash +curl http://localhost:1234/api/v1/models +``` + +### أخطاء المصادقة (HTTP 401) + +إذا أبلغ الإعداد عن HTTP 401، فتحقق من مفتاح API الخاص بك: + +- تأكد من أن `LM_API_TOKEN` يطابق المفتاح المهيأ في LM Studio. +- للحصول على تفاصيل إعداد المصادقة في LM Studio، راجع [مصادقة LM Studio](https://lmstudio.ai/docs/developer/core/authentication). +- إذا كان الخادم لا يتطلب المصادقة، فاستخدم أي قيمة رمز مميز غير فارغة لـ `LM_API_TOKEN`. + +### تحميل النموذج عند الطلب + +يدعم LM Studio تحميل النماذج عند الطلب (JIT)، حيث تُحمَّل النماذج عند أول طلب. تأكد من تمكين هذا لتجنب أخطاء "Model not loaded". diff --git a/docs/ar/reference/api-usage-costs.md b/docs/ar/reference/api-usage-costs.md index 4b0b54de0..1b8edcbf3 100644 --- a/docs/ar/reference/api-usage-costs.md +++ b/docs/ar/reference/api-usage-costs.md @@ -1,23 +1,23 @@ --- read_when: - - تريد فهم الميزات التي قد تستدعي APIs مدفوعة - - تحتاج إلى مراجعة المفاتيح، والتكاليف، ووضوح الاستخدام - - أنت تشرح تقارير التكلفة في /status أو /usage -summary: راجع ما الذي يمكن أن ينفق المال، والمفاتيح المستخدمة، وكيفية عرض الاستخدام + - تريد أن تفهم الميزات التي قد تستدعي واجهات API مدفوعة الثمن + - تحتاج إلى مراجعة المفاتيح والتكاليف وإمكانية عرض الاستخدام + - أنت تشرح تقارير التكلفة في `/status` أو `/usage` +summary: راجع ما الذي يمكن أن ينفق المال، وما المفاتيح المستخدمة، وكيفية عرض الاستخدام title: استخدام API والتكاليف x-i18n: - generated_at: "2026-04-07T07:21:59Z" + generated_at: "2026-04-13T07:28:51Z" model: gpt-5.4 provider: openai - source_hash: ab6eefcde9ac014df6cdda7aaa77ef48f16936ab12eaa883d9fe69425a31a2dd + source_hash: f5077e74d38ef781ac7a72603e9f9e3829a628b95c5a9967915ab0f321565429 source_path: reference/api-usage-costs.md workflow: 15 --- # استخدام API والتكاليف -يسرد هذا المستند **الميزات التي يمكنها استدعاء مفاتيح API** والمكان الذي تظهر فيه تكاليفها. ويركز على -ميزات OpenClaw التي يمكنها توليد استخدام للمزود أو استدعاءات API مدفوعة. +تسرد هذه الوثيقة **الميزات التي يمكن أن تستدعي مفاتيح API** وأماكن ظهور تكاليفها. وتركّز على +ميزات OpenClaw التي يمكن أن تولّد استخدامًا لمزوّد الخدمة أو استدعاءات API مدفوعة. ## أين تظهر التكاليف (الدردشة + CLI) @@ -25,131 +25,134 @@ x-i18n: - يعرض `/status` نموذج الجلسة الحالي، واستخدام السياق، ورموز آخر استجابة. - إذا كان النموذج يستخدم **مصادقة بمفتاح API**، فإن `/status` يعرض أيضًا **التكلفة التقديرية** لآخر رد. -- إذا كانت البيانات الوصفية الحية للجلسة محدودة، يمكن لـ `/status` استعادة - عدادات الرموز/الذاكرة المؤقتة وعلامة نموذج وقت التشغيل النشط من أحدث إدخال استخدام في transcript. - وتظل القيم الحية غير الصفرية الموجودة مسبقًا هي صاحبة الأولوية، ويمكن لإجماليات transcript - بحجم prompt أن تتغلب عندما تكون الإجماليات المخزنة مفقودة أو أصغر. +- إذا كانت البيانات الوصفية للجلسة الحية محدودة، يمكن لـ `/status` استعادة + عدّادات الرموز/التخزين المؤقت + ووسم نموذج وقت التشغيل النشط من أحدث إدخال لاستخدام السجل + النصي. وتظل القيم الحية الحالية غير الصفرية ذات أولوية، كما يمكن أن + تتفوّق إجماليات السجل النصي ذات حجم المطالبة عندما تكون الإجماليات المخزّنة + مفقودة أو أصغر. -**تذييل التكلفة لكل رسالة** +**تذييل تكلفة لكل رسالة** -- يقوم `/usage full` بإلحاق تذييل استخدام بكل رد، بما في ذلك **التكلفة التقديرية** (لمصادقة مفتاح API فقط). -- يعرض `/usage tokens` الرموز فقط؛ وتخفي تدفقات OAuth/token وCLI ذات نمط الاشتراك التكلفة بالدولار. -- ملاحظة Gemini CLI: عندما يعيد CLI مخرجات JSON، يقرأ OpenClaw معلومات الاستخدام من - `stats`، ويُطبّع `stats.cached` إلى `cacheRead`، ويستنتج رموز الإدخال +- يضيف `/usage full` تذييل استخدام إلى كل رد، بما في ذلك **التكلفة التقديرية** (لمفاتيح API فقط). +- يعرض `/usage tokens` الرموز فقط؛ بينما تُخفي تدفقات OAuth/الرموز بنمط الاشتراك وتدفقات CLI تكلفة الدولار. +- ملاحظة Gemini CLI: عندما يعيد CLI مخرجات JSON، يقرأ OpenClaw الاستخدام من + `stats`، ويطبّع `stats.cached` إلى `cacheRead`، ويستنتج رموز الإدخال من `stats.input_tokens - stats.cached` عند الحاجة. -ملاحظة Anthropic: أخبرنا موظفو Anthropic أن استخدام Claude CLI بأسلوب OpenClaw -مسموح به مجددًا، لذلك يتعامل OpenClaw مع إعادة استخدام Claude CLI واستخدام `claude -p` على أنه -معتمد لهذا التكامل ما لم تنشر Anthropic سياسة جديدة. -ولا تزال Anthropic لا تعرض تقديرًا بالدولار لكل رسالة يمكن لـ OpenClaw +ملاحظة Anthropic: أخبرنا فريق Anthropic أن استخدام Claude CLI بأسلوب OpenClaw +مسموح به مرة أخرى، لذا يتعامل OpenClaw مع إعادة استخدام Claude CLI واستخدام `claude -p` على أنهما +مصرّح بهما لهذا التكامل ما لم تنشر Anthropic سياسة جديدة. +ولا تزال Anthropic لا توفّر تقديرًا بالدولار لكل رسالة يمكن لـ OpenClaw عرضه في `/usage full`. -**نوافذ استخدام CLI ‏(حصص المزود)** +**نوافذ استخدام CLI (حصص المزوّد)** -- يعرض `openclaw status --usage` و`openclaw channels list` **نوافذ استخدام** المزود - (لقطات للحصة، وليست تكاليف لكل رسالة). -- يتم تطبيع المخرجات البشرية إلى `X% left` عبر جميع المزودين. -- مزودو نوافذ الاستخدام الحاليون: Anthropic، وGitHub Copilot، وGemini CLI، - وOpenAI Codex، وMiniMax، وXiaomi، وz.ai. -- ملاحظة MiniMax: تعني الحقول الخام `usage_percent` / `usagePercent` مقدار - الحصة المتبقية، لذلك يعكسها OpenClaw قبل العرض. وتظل الحقول المعتمدة على العدّ هي الغالبة - عند وجودها. وإذا أعاد المزود `model_remains`، فإن OpenClaw يفضل +- يعرض `openclaw status --usage` و`openclaw channels list` **نوافذ الاستخدام** الخاصة بالمزوّد + (لقطات للحصص، وليست تكاليف لكل رسالة). +- يتم توحيد المخرجات البشرية إلى `X% left` عبر جميع المزوّدين. +- مزوّدو نوافذ الاستخدام الحاليون: Anthropic وGitHub Copilot وGemini CLI، + وOpenAI Codex وMiniMax وXiaomi وz.ai. +- ملاحظة MiniMax: تعني حقول `usage_percent` / `usagePercent` الخام لديه + الحصة المتبقية، لذلك يعكسها OpenClaw قبل العرض. وتظل الحقول المعتمدة على العد + ذات أولوية عند توفّرها. وإذا أعاد المزوّد `model_remains`، فإن OpenClaw يفضّل إدخال نموذج الدردشة، ويستنتج تسمية النافذة من الطوابع الزمنية عند الحاجة، - ويتضمن اسم النموذج في تسمية الخطة. -- تأتي مصادقة الاستخدام لنوافذ الحصص هذه من hooks خاصة بالمزود عند - توفرها؛ وإلا فإن OpenClaw يرجع إلى مطابقة بيانات اعتماد OAuth/API-key + ويضمّن اسم النموذج في تسمية الخطة. +- تأتي مصادقة الاستخدام لنوافذ الحصص تلك من خطّافات خاصة بالمزوّد عند + توفّرها؛ وإلا يعود OpenClaw إلى مطابقة بيانات اعتماد OAuth/مفاتيح API من ملفات تعريف المصادقة، أو البيئة، أو الإعدادات. راجع [استخدام الرموز والتكاليف](/ar/reference/token-use) للاطلاع على التفاصيل والأمثلة. -## كيف يتم اكتشاف المفاتيح +## كيفية اكتشاف المفاتيح يمكن لـ OpenClaw التقاط بيانات الاعتماد من: -- **ملفات تعريف المصادقة** (لكل وكيل، مخزنة في `auth-profiles.json`). -- **متغيرات البيئة** (مثل `OPENAI_API_KEY`, `BRAVE_API_KEY`, `FIRECRAWL_API_KEY`). -- **الإعدادات** (`models.providers.*.apiKey`, `plugins.entries.*.config.webSearch.apiKey`, - `plugins.entries.firecrawl.config.webFetch.apiKey`, `memorySearch.*`, - `talk.providers.*.apiKey`). -- **Skills** ‏(`skills.entries..apiKey`) التي قد تصدر المفاتيح إلى بيئة عملية Skill. +- **ملفات تعريف المصادقة** (لكل وكيل، وتُخزَّن في `auth-profiles.json`). +- **متغيّرات البيئة** (مثل `OPENAI_API_KEY` و`BRAVE_API_KEY` و`FIRECRAWL_API_KEY`). +- **الإعدادات** (`models.providers.*.apiKey` و`plugins.entries.*.config.webSearch.apiKey`، + و`plugins.entries.firecrawl.config.webFetch.apiKey` و`memorySearch.*`، + و`talk.providers.*.apiKey`). +- **Skills** (`skills.entries..apiKey`) التي قد تصدّر المفاتيح إلى بيئة عملية Skill. -## الميزات التي يمكنها إنفاق المفاتيح +## الميزات التي يمكن أن تنفق المفاتيح -### 1) استجابات النماذج الأساسية (الدردشة + الأدوات) +### 1) استجابات النموذج الأساسية (الدردشة + الأدوات) -كل رد أو استدعاء أداة يستخدم **مزود النموذج الحالي** (OpenAI أو Anthropic أو غيرهما). وهذا هو -المصدر الرئيسي للاستخدام والتكلفة. +كل رد أو استدعاء أداة يستخدم **مزوّد النموذج الحالي** (OpenAI أو Anthropic أو غيرهما). وهذا هو +المصدر الأساسي للاستخدام والتكلفة. -ويشمل ذلك أيضًا المزودين المستضافين بنمط الاشتراك الذين ما زالوا يفرضون الرسوم خارج -واجهة OpenClaw المحلية، مثل **OpenAI Codex** و**Alibaba Cloud Model Studio -Coding Plan** و**MiniMax Coding Plan** و**Z.AI / GLM Coding Plan** و -مسار تسجيل دخول Claude في OpenClaw من Anthropic مع تفعيل **Extra Usage**. +ويتضمن ذلك أيضًا المزوّدين المستضافين بنمط الاشتراك الذين لا تزال تتم +محاسبتهم خارج واجهة OpenClaw المحلية، مثل **OpenAI Codex** و**Alibaba Cloud Model Studio +Coding Plan** و**MiniMax Coding Plan** و**Z.AI / GLM Coding Plan**، +ومسار Claude-login في OpenClaw الخاص بـ Anthropic مع تفعيل **Extra Usage**. راجع [النماذج](/ar/providers/models) لإعدادات التسعير و[استخدام الرموز والتكاليف](/ar/reference/token-use) للعرض. ### 2) فهم الوسائط (الصوت/الصورة/الفيديو) -يمكن تلخيص الوسائط الواردة أو نسخها قبل تشغيل الرد. وهذا يستخدم APIs النماذج/المزودين. +يمكن تلخيص الوسائط الواردة أو تفريغها نصيًا قبل تنفيذ الرد. وهذا يستخدم واجهات API الخاصة بالنموذج/المزوّد. - الصوت: OpenAI / Groq / Deepgram / Google / Mistral. -- الصورة: OpenAI / OpenRouter / Anthropic / Google / MiniMax / Moonshot / Qwen / Z.A.I. +- الصورة: OpenAI / OpenRouter / Anthropic / Google / MiniMax / Moonshot / Qwen / Z.AI. - الفيديو: Google / Qwen / Moonshot. راجع [فهم الوسائط](/ar/nodes/media-understanding). -### 3) توليد الصور والفيديو +### 3) إنشاء الصور والفيديو -يمكن لقدرات التوليد المشتركة أيضًا إنفاق مفاتيح المزود: +يمكن لقدرات الإنشاء المشتركة أيضًا أن تستهلك مفاتيح المزوّدين: -- توليد الصور: OpenAI / Google / fal / MiniMax -- توليد الفيديو: Qwen +- إنشاء الصور: OpenAI / Google / fal / MiniMax +- إنشاء الفيديو: Qwen -يمكن لتوليد الصور استنتاج مزود افتراضي مدعوم بالمصادقة عندما -لا يتم ضبط `agents.defaults.imageGenerationModel`. أما توليد الفيديو فيتطلب حاليًا -`agents.defaults.videoGenerationModel` صريحًا مثل +يمكن لإنشاء الصور استنتاج مزوّد افتراضي يعتمد على المصادقة عندما +يكون `agents.defaults.imageGenerationModel` غير مضبوط. أما إنشاء الفيديو فيتطلّب حاليًا +ضبطًا صريحًا لـ `agents.defaults.videoGenerationModel` مثل `qwen/wan2.6-t2v`. -راجع [توليد الصور](/ar/tools/image-generation)، و[Qwen Cloud](/ar/providers/qwen)، +راجع [إنشاء الصور](/ar/tools/image-generation)، و[Qwen Cloud](/ar/providers/qwen)، و[النماذج](/ar/concepts/models). -### 4) Embeddings الذاكرة + البحث الدلالي +### 4) تضمينات الذاكرة + البحث الدلالي -يستخدم البحث الدلالي في الذاكرة **APIs embeddings** عند ضبطه لمزودات بعيدة: +يستخدم البحث الدلالي في الذاكرة **واجهات API للتضمينات** عند تهيئته لمزوّدين بعيدين: -- `memorySearch.provider = "openai"` ← OpenAI embeddings -- `memorySearch.provider = "gemini"` ← Gemini embeddings -- `memorySearch.provider = "voyage"` ← Voyage embeddings -- `memorySearch.provider = "mistral"` ← Mistral embeddings -- `memorySearch.provider = "ollama"` ← Ollama embeddings ‏(محلي/مستضاف ذاتيًا؛ وعادةً لا توجد رسوم API مستضافة) -- إمكانية fallback اختيارية إلى مزود بعيد إذا فشلت embeddings المحلية +- `memorySearch.provider = "openai"` ← تضمينات OpenAI +- `memorySearch.provider = "gemini"` ← تضمينات Gemini +- `memorySearch.provider = "voyage"` ← تضمينات Voyage +- `memorySearch.provider = "mistral"` ← تضمينات Mistral +- `memorySearch.provider = "lmstudio"` ← تضمينات LM Studio (محلي/مستضاف ذاتيًا) +- `memorySearch.provider = "ollama"` ← تضمينات Ollama (محلي/مستضاف ذاتيًا؛ عادةً بلا فوترة API مستضافة) +- رجوع اختياري إلى مزوّد بعيد إذا فشلت التضمينات المحلية -يمكنك إبقاؤه محليًا باستخدام `memorySearch.provider = "local"` ‏(بدون استخدام API). +يمكنك إبقاءه محليًا باستخدام `memorySearch.provider = "local"` (من دون استخدام API). راجع [الذاكرة](/ar/concepts/memory). ### 5) أداة البحث على الويب -قد تتحمل `web_search` رسوم استخدام حسب المزود: +قد تؤدي `web_search` إلى رسوم استخدام بحسب مزوّدك: - **Brave Search API**: ‏`BRAVE_API_KEY` أو `plugins.entries.brave.config.webSearch.apiKey` - **Exa**: ‏`EXA_API_KEY` أو `plugins.entries.exa.config.webSearch.apiKey` - **Firecrawl**: ‏`FIRECRAWL_API_KEY` أو `plugins.entries.firecrawl.config.webSearch.apiKey` - **Gemini (Google Search)**: ‏`GEMINI_API_KEY` أو `plugins.entries.google.config.webSearch.apiKey` - **Grok (xAI)**: ‏`XAI_API_KEY` أو `plugins.entries.xai.config.webSearch.apiKey` -- **Kimi (Moonshot)**: ‏`KIMI_API_KEY`, `MOONSHOT_API_KEY` أو `plugins.entries.moonshot.config.webSearch.apiKey` -- **MiniMax Search**: ‏`MINIMAX_CODE_PLAN_KEY`, `MINIMAX_CODING_API_KEY`, `MINIMAX_API_KEY` أو `plugins.entries.minimax.config.webSearch.apiKey` -- **Ollama Web Search**: بدون مفتاح افتراضيًا، لكنه يتطلب مضيف Ollama يمكن الوصول إليه بالإضافة إلى `ollama signin`؛ ويمكنه أيضًا إعادة استخدام مصادقة bearer العادية لمزود Ollama عندما يتطلبها المضيف -- **Perplexity Search API**: ‏`PERPLEXITY_API_KEY`, `OPENROUTER_API_KEY` أو `plugins.entries.perplexity.config.webSearch.apiKey` +- **Kimi (Moonshot)**: ‏`KIMI_API_KEY` أو `MOONSHOT_API_KEY` أو `plugins.entries.moonshot.config.webSearch.apiKey` +- **MiniMax Search**: ‏`MINIMAX_CODE_PLAN_KEY` أو `MINIMAX_CODING_API_KEY` أو `MINIMAX_API_KEY` أو `plugins.entries.minimax.config.webSearch.apiKey` +- **Ollama Web Search**: بلا مفتاح افتراضيًا، لكنه يتطلّب مضيف Ollama يمكن الوصول إليه بالإضافة إلى `ollama signin`؛ ويمكنه أيضًا إعادة استخدام مصادقة bearer العادية الخاصة بمزوّد Ollama عندما يتطلّبها المضيف +- **Perplexity Search API**: ‏`PERPLEXITY_API_KEY` أو `OPENROUTER_API_KEY` أو `plugins.entries.perplexity.config.webSearch.apiKey` - **Tavily**: ‏`TAVILY_API_KEY` أو `plugins.entries.tavily.config.webSearch.apiKey` -- **DuckDuckGo**: fallback بدون مفتاح (من دون رسوم API، لكنه غير رسمي ويعتمد على HTML) -- **SearXNG**: ‏`SEARXNG_BASE_URL` أو `plugins.entries.searxng.config.webSearch.baseUrl` ‏(بدون مفتاح/مستضاف ذاتيًا؛ من دون رسوم API مستضافة) +- **DuckDuckGo**: بديل احتياطي بلا مفتاح (من دون فوترة API، لكنه غير رسمي ويعتمد على HTML) +- **SearXNG**: ‏`SEARXNG_BASE_URL` أو `plugins.entries.searxng.config.webSearch.baseUrl` (بلا مفتاح/مستضاف ذاتيًا؛ من دون فوترة API مستضافة) -لا تزال مسارات المزود القديمة `tools.web.search.*` تُحمّل عبر طبقة التوافق المؤقتة، لكنها لم تعد سطح الإعدادات الموصى به. +لا تزال مسارات المزوّد القديمة `tools.web.search.*` تُحمَّل عبر طبقة التوافق المؤقتة، لكنها لم تعد سطح الإعدادات الموصى به. -**رصيد Brave Search المجاني:** تتضمن كل خطة Brave رصيدًا مجانيًا متجددًا بقيمة \$5 شهريًا. -تبلغ تكلفة خطة Search مبلغ \$5 لكل 1,000 طلب، لذلك يغطي الرصيد -1,000 طلب شهريًا بدون رسوم. اضبط حد الاستخدام في لوحة تحكم Brave -لتجنب الرسوم غير المتوقعة. +**رصيد Brave Search المجاني:** تتضمن كل خطة Brave رصيدًا مجانيًا متجددًا +بقيمة \$5 شهريًا. وتبلغ تكلفة خطة Search ‏\$5 لكل 1,000 طلب، لذا يغطي الرصيد +1,000 طلب شهريًا من دون رسوم. اضبط حد الاستخدام في لوحة تحكم Brave +لتجنّب الرسوم غير المتوقعة. راجع [أدوات الويب](/ar/tools/web). @@ -159,45 +162,45 @@ Coding Plan** و**MiniMax Coding Plan** و**Z.AI / GLM Coding Plan** و - `FIRECRAWL_API_KEY` أو `plugins.entries.firecrawl.config.webFetch.apiKey` -إذا لم يتم ضبط Firecrawl، فستعود الأداة إلى fetch مباشر + readability ‏(من دون API مدفوع). +إذا لم يكن Firecrawl مهيّأً، فستعود الأداة إلى الجلب المباشر + readability (من دون API مدفوع). راجع [أدوات الويب](/ar/tools/web). -### 6) لقطات استخدام المزود (الحالة/السلامة) +### 6) لقطات استخدام المزوّد (الحالة/السلامة) -تستدعي بعض أوامر الحالة **endpoints استخدام المزود** لعرض نوافذ الحصص أو سلامة المصادقة. -وتكون هذه الاستدعاءات عادة منخفضة الحجم لكنها ما تزال تضرب APIs المزود: +تستدعي بعض أوامر الحالة **نقاط نهاية استخدام المزوّد** لعرض نوافذ الحصص أو سلامة المصادقة. +وعادةً ما تكون هذه استدعاءات منخفضة الحجم، لكنها لا تزال تضرب واجهات API الخاصة بالمزوّد: - `openclaw status --usage` - `openclaw models status --json` -راجع [CLI النماذج](/cli/models). +راجع [Models CLI](/cli/models). -### 7) تلخيص وسيلة الحماية للضغط +### 7) تلخيص حماية Compaction -يمكن لوسيلة الحماية للضغط تلخيص سجل الجلسة باستخدام **النموذج الحالي**، ما -يستدعي APIs المزود عند تشغيلها. +يمكن لحماية Compaction تلخيص سجل الجلسة باستخدام **النموذج الحالي**، ما +يستدعي واجهات API الخاصة بالمزوّد عند تشغيله. -راجع [إدارة الجلسات + الضغط](/ar/reference/session-management-compaction). +راجع [إدارة الجلسة + Compaction](/ar/reference/session-management-compaction). -### 8) فحص / استكشاف النماذج +### 8) فحص / سبر النموذج -يمكن لـ `openclaw models scan` فحص نماذج OpenRouter ويستخدم `OPENROUTER_API_KEY` عندما -يكون الفحص مفعّلًا. +يمكن لـ `openclaw models scan` سبر نماذج OpenRouter ويستخدم `OPENROUTER_API_KEY` عندما +يكون السبر مفعّلًا. -راجع [CLI النماذج](/cli/models). +راجع [Models CLI](/cli/models). -### 9) Talk ‏(الكلام) +### 9) Talk (الكلام) -يمكن لوضع Talk استدعاء **ElevenLabs** عند ضبطه: +يمكن لوضع Talk استدعاء **ElevenLabs** عند تهيئته: - `ELEVENLABS_API_KEY` أو `talk.providers.elevenlabs.apiKey` راجع [وضع Talk](/ar/nodes/talk). -### 10) Skills ‏(APIs خارجية) +### 10) Skills (واجهات API لجهات خارجية) -يمكن لـ Skills تخزين `apiKey` في `skills.entries..apiKey`. وإذا استخدمت Skill هذا المفتاح مع -APIs خارجية، فقد تتحمل تكاليف وفقًا لمزود تلك Skill. +يمكن لـ Skills تخزين `apiKey` في `skills.entries..apiKey`. وإذا كانت Skill تستخدم هذا المفتاح مع +واجهات API خارجية، فقد تترتب عليها تكاليف وفقًا لمزوّد تلك Skill. راجع [Skills](/ar/tools/skills).