الاختبار
يحتوي OpenClaw على ثلاث مجموعات Vitest (unit/integration و e2e و live) ومجموعة صغيرة من مشغّلات Docker. هذا المستند هو دليل “كيف نختبر”:- ما الذي تغطيه كل مجموعة (وما الذي لا تغطيه عمدًا)
- الأوامر التي يجب تشغيلها لعمليات العمل الشائعة (محليًا، قبل الدفع، تصحيح الأخطاء)
- كيف تكتشف الاختبارات الحية بيانات الاعتماد وتختار النماذج/المزوّدين
- كيفية إضافة اختبارات انحدار لمشكلات النماذج/المزوّدين الواقعية
البداية السريعة
في معظم الأيام:- البوابة الكاملة (متوقعة قبل الدفع):
pnpm build && pnpm check && pnpm test - تشغيل أسرع للمجموعة الكاملة محليًا على جهاز ذي موارد كبيرة:
pnpm test:max - حلقة مراقبة Vitest مباشرة:
pnpm test:watch - الاستهداف المباشر للملفات يمر الآن أيضًا عبر مسارات الامتدادات/القنوات:
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
- المجموعة الحية (فحوصات النماذج + أدوات/صور Gateway):
pnpm test:live - استهدف ملفًا حيًا واحدًا بهدوء:
pnpm test:live -- src/agents/models.profiles.live.test.ts
المشغّلات الخاصة بـ QA
توجد هذه الأوامر بجانب مجموعات الاختبار الرئيسية عندما تحتاج إلى واقعية QA-lab:pnpm openclaw qa suite- يشغّل سيناريوهات QA المدعومة من المستودع مباشرة على المضيف.
- يشغّل عدة سيناريوهات محددة بالتوازي افتراضيًا مع عمّال Gateway معزولين، حتى 64 عاملًا أو بعدد السيناريوهات المحددة. استخدم
--concurrency <count>لضبط عدد العمال، أو--concurrency 1للمسار التسلسلي الأقدم.
pnpm openclaw qa suite --runner 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 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 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 تركيبية واسعة وليس جزءًا من مصفوفة تغطية النقل الحي.
| المسار | 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/
OPENCLAW_QA_CONVEX_SITE_URL(على سبيل المثالhttps://your-deployment.convex.site)- سر واحد للدور المحدد:
OPENCLAW_QA_CONVEX_SECRET_MAINTAINERللدورmaintainerOPENCLAW_QA_CONVEX_SECRET_CIللدورci
- اختيار دور بيانات الاعتماد:
- CLI:
--credential-role maintainer|ci - القيمة الافتراضية في env:
OPENCLAW_QA_CREDENTIAL_ROLE(القيمة الافتراضيةmaintainer)
- CLI:
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 للمشرفين:
--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 }
- الطلب:
{ groupId: string, driverToken: string, sutToken: string }- يجب أن يكون
groupIdسلسلة تمثل معرّف دردشة Telegram رقميًا. - يتحقق
admin/addمن هذا الشكل لـkind: "telegram"ويرفض الحمولة غير الصحيحة.
إضافة قناة إلى QA
تتطلب إضافة قناة إلى نظام QA المكتوب بـ markdown شيئين فقط بالضبط:- محول نقل للقناة.
- حزمة سيناريوهات تمارس عقد القناة.
qa-lab المشترك
أن يمتلك التدفق.
يمتلك qa-lab الآليات المشتركة:
- بدء المجموعة وإنهاؤها
- تزامن العمال
- كتابة القطع
- توليد التقارير
- تنفيذ السيناريوهات
- الأسماء المستعارة التوافقية لسيناريوهات
qa-channelالأقدم
- كيفية ضبط Gateway لذلك النقل
- كيفية التحقق من الجاهزية
- كيفية حقن الأحداث الواردة
- كيفية ملاحظة الرسائل الصادرة
- كيفية كشف النصوص المنسوخة وحالة النقل المطبّعة
- كيفية تنفيذ الإجراءات المدعومة بالنقل
- كيفية التعامل مع إعادة الضبط أو التنظيف الخاص بالنقل
- تنفيذ محول النقل على واجهة
qa-labالمشتركة. - تسجيل المحول في سجل النقل.
- إبقاء الآليات الخاصة بالنقل داخل المحول أو حزام القناة.
- تأليف أو تكييف سيناريوهات markdown تحت
qa/scenarios/. - استخدام مساعدات السيناريو العامة للسيناريوهات الجديدة.
- الإبقاء على الأسماء المستعارة التوافقية الحالية عاملة ما لم يكن المستودع يقوم بترحيل مقصود.
- إذا أمكن التعبير عن السلوك مرة واحدة في
qa-lab، فضعه فيqa-lab. - إذا كان السلوك يعتمد على نقل قناة واحدة، فأبقِه في ذلك المحول أو حزام Plugin.
- إذا احتاج السيناريو إلى قدرة جديدة يمكن لأكثر من قناة استخدامها، فأضف مساعدًا عامًا بدلًا من فرع خاص بقناة في
suite.ts. - إذا كان السلوك ذا معنى فقط لنقل واحد، فأبقِ السيناريو خاصًا بذلك النقل واجعل ذلك واضحًا في عقد السيناريو.
waitForTransportReadywaitForChannelReadyinjectInboundMessageinjectOutboundMessagewaitForTransportOutboundMessagewaitForChannelOutboundMessagewaitForNoTransportOutboundgetTransportSnapshotreadTransportMessagereadTransportTranscriptformatTransportTranscriptresetTransport
waitForQaChannelReadywaitForOutboundMessagewaitForNoOutboundformatConversationTranscriptresetBus
مجموعات الاختبار (ما الذي يعمل وأين)
فكّر في المجموعات على أنها “زيادة في الواقعية” (وزيادة في عدم الاستقرار/التكلفة):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 - النطاق:
- اختبارات unit خالصة
- اختبارات integration داخل العملية (مصادقة gateway، والتوجيه، والأدوات، والتحليل، والإعداد)
- اختبارات انحدار حتمية للأخطاء المعروفة
- التوقعات:
- تعمل في 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يستخدم رسم المشاريع الأصلي لـ rootvitest.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، حافظ على مستويي التغطية كليهما.
- أضف اختبارات انحدار مركزة للمساعدات الخاصة بحدود التوجيه/التطبيع الخالصة.
- وحافظ أيضًا على سلامة مجموعات 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؛ ولا تُعد اختبارات المساعدات وحدها بديلًا كافيًا عن مسارات integration هذه.
- ملاحظة الـ pool:
- أصبح إعداد Vitest الأساسي يستخدم
threadsافتراضيًا. - كما يثبّت إعداد 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 القياسي.
- أصبح إعداد Vitest الأساسي يستخدم
- ملاحظة التكرار المحلي السريع:
- يمر
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عرض profiling نفسه على الملفات المتغيرة منذorigin/main.
- يفعّل
- يقارن
pnpm test:perf:changed:bench -- --ref <git-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 مع تعطيل التوازي على مستوى الملفات.
- يكتب
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 افتراضيًا).
- يعمل في الوضع الصامت افتراضيًا لتقليل كلفة I/O في الطرفية.
- يستخدم
- تجاوزات مفيدة:
OPENCLAW_E2E_WORKERS=<n>لفرض عدد العمال (بحد أقصى 16).OPENCLAW_E2E_VERBOSE=1لإعادة تفعيل خرج الطرفية التفصيلي.
- النطاق:
- سلوك gateway من طرف إلى طرف متعدد النسخ
- أسطح WebSocket/HTTP، واقتران Node، والشبكات الأثقل
- التوقعات:
- تعمل في CI (عندما تكون مفعّلة في خط التنفيذ)
- لا تتطلب مفاتيح حقيقية
- تحتوي على أجزاء متحركة أكثر من اختبارات unit (وقد تكون أبطأ)
E2E: اختبار smoke للواجهة الخلفية OpenShell
- الأمر:
pnpm test:e2e:openshell - الملف:
test/openshell-sandbox.e2e.test.ts - النطاق:
- يبدأ OpenShell gateway معزولًا على المضيف عبر Docker
- ينشئ sandbox من Dockerfile محلي مؤقت
- يختبر الواجهة الخلفية OpenClaw الخاصة بـ OpenShell عبر
sandbox ssh-config+ تنفيذ SSH الحقيقي - يتحقق من سلوك نظام الملفات canonical البعيد عبر جسر sandbox fs
- التوقعات:
- اختيارية فقط؛ وليست جزءًا من التشغيل الافتراضي
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 ثنائي أو wrapper script غير افتراضي
Live (مزوّدون حقيقيون + نماذج حقيقية)
- الأمر:
pnpm test:live - الإعداد:
vitest.live.config.ts - الملفات:
src/**/*.live.test.ts - الافتراضي: مفعّل بواسطة
pnpm test:live(يضبطOPENCLAW_LIVE_TEST=1) - النطاق:
- “هل يعمل هذا المزوّد/النموذج فعلًا اليوم باستخدام بيانات اعتماد حقيقية؟”
- اكتشاف تغييرات تنسيق المزوّد، ومراوغات استدعاء الأدوات، ومشكلات المصادقة، وسلوك تحديد المعدل
- التوقعات:
- غير مستقرة بالنسبة إلى 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مضيقًا
Live: مسح قدرات Android Node
- الاختبار:
src/gateway/android-node.capabilities.live.test.ts - السكربت:
pnpm android:test:integration - الهدف: استدعاء كل أمر يتم الإعلان عنه حاليًا بواسطة Android Node متصل والتحقق من سلوك عقد الأمر.
- النطاق:
- إعداد يدوي/مسبق الشروط (المجموعة لا تثبّت التطبيق ولا تشغّله ولا تقترنه).
- تحقق
node.invokeعلى مستوى gateway أمرًا بأمر من أجل Android Node المحدد.
- الإعداد المسبق المطلوب:
- أن يكون تطبيق Android متصلًا ومقترنًا بالفعل بـ gateway.
- إبقاء التطبيق في الواجهة الأمامية.
- منح الأذونات/الموافقة على الالتقاط للقدرات التي تتوقع نجاحها.
- تجاوزات الهدف الاختيارية:
OPENCLAW_ANDROID_NODE_IDأوOPENCLAW_ANDROID_NODE_NAME.OPENCLAW_ANDROID_GATEWAY_URL/OPENCLAW_ANDROID_GATEWAY_TOKEN/OPENCLAW_ANDROID_GATEWAY_PASSWORD.
- تفاصيل إعداد Android الكاملة: تطبيق Android
Live: اختبار smoke للنموذج (مفاتيح profile)
تنقسم الاختبارات الحية إلى طبقتين حتى نتمكن من عزل الإخفاقات:- يخبرنا “النموذج المباشر” ما إذا كان المزوّد/النموذج قادرًا على الرد أساسًا بالمفتاح المعطى.
- يخبرنا “اختبار 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 - كيفية اختيار النماذج:
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"(قائمة سماح مفصولة بفواصل)
- من أين تأتي المفاتيح:
- افتراضيًا: من مخزن profile والبدائل الاحتياطية في env
- اضبط
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1لفرض مخزن profile فقط
- لماذا يوجد هذا:
- يفصل بين “واجهة API الخاصة بالمزوّد معطلة / المفتاح غير صالح” و “خط gateway agent معطل”
- يحتوي على اختبارات انحدار صغيرة ومعزولة (مثال: OpenAI Responses/Codex Responses reasoning replay + تدفقات tool-call)
الطبقة 2: اختبار smoke لـ Gateway + dev agent (ما الذي يفعله “@openclaw” فعليًا)
- الاختبار:
src/gateway/gateway-models.profiles.live.test.ts - الهدف:
- تشغيل gateway داخل العملية
- إنشاء/ترقيع جلسة
agent:dev:*(مع تجاوز النموذج في كل تشغيل) - التكرار عبر النماذج التي تملك مفاتيح والتحقق من:
- استجابة “ذات معنى” (من دون أدوات)
- أن استدعاء أداة حقيقي يعمل (
readprobe) - probes إضافية اختيارية للأدوات (
exec+readprobe) - استمرار عمل مسارات انحدار OpenAI (
tool-call-only → follow-up)
- تفاصيل probes (حتى تتمكن من شرح الإخفاقات بسرعة):
- probe
read: يكتب الاختبار ملف nonce في مساحة العمل ويطلب من الوكيلreadقراءته ثم إعادة nonce. - probe
exec+read: يطلب الاختبار من الوكيل كتابة nonce في ملف مؤقت عبرexec، ثم قراءته مجددًا عبرread. - probe الصورة: يرفق الاختبار ملف PNG مُولّدًا (قطة + رمز عشوائي) ويتوقع من النموذج إرجاع
cat <CODE>. - مرجع التنفيذ:
src/gateway/gateway-models.profiles.live.test.tsوsrc/gateway/live-image-probe.ts.
- probe
- كيفية التمكين:
pnpm test:live(أوOPENCLAW_LIVE_TEST=1إذا كنت تستدعي Vitest مباشرة)
- كيفية اختيار النماذج:
- الافتراضي: قائمة السماح الحديثة (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 الحديثة/
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+ probeexec+read(ضغط على الأدوات) - يعمل probe الصورة عندما يعلن النموذج دعم إدخال الصور
- التدفق (على مستوى عالٍ):
- يولّد الاختبار ملف PNG صغيرًا يحتوي على “CAT” + رمز عشوائي (
src/gateway/live-image-probe.ts) - يرسله عبر
agentمعattachments: [{ mimeType: "image/png", content: "<base64>" }] - يحلل Gateway المرفقات إلى
images[](src/gateway/server-methods/agent.ts+src/gateway/chat-attachments.ts) - يمرّر الوكيل المضمّن رسالة مستخدم متعددة الوسائط إلى النموذج
- التحقق: يحتوي الرد على
cat+ الرمز (مع سماحية OCR: الأخطاء الطفيفة مسموح بها)
- يولّد الاختبار ملف PNG صغيرًا يحتوي على “CAT” + رمز عشوائي (
- probe
provider/model الدقيقة)، شغّل:
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 مباشرة)OPENCLAW_LIVE_CLI_BACKEND=1
- القيم الافتراضية:
- المزوّد/النموذج الافتراضي:
claude-cli/claude-sonnet-4-6 - يأتي سلوك الأمر/الوسائط/الصورة من بيانات 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لإرسال مرفق صورة حقيقي (تُحقن المسارات في 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لتعطيل probe الاستمرارية الافتراضي داخل الجلسة نفسها Claude Sonnet -> Opus (اضبطه على1لفرض تشغيله عندما يدعم النموذج المحدد هدف تبديل).
- يوجد مشغّل Docker في
scripts/test-live-cli-backend-docker.sh. - يشغّل اختبار 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 - الهدف: التحقق من تدفق Conversation-bind الحقيقي لـ ACP باستخدام وكيل ACP حي:
- إرسال
/acp spawn <agent> --bind here - ربط محادثة channel للرسائل تركيبية في مكانها
- إرسال متابعة عادية على نفس المحادثة
- التحقق من أن المتابعة تصل إلى transcript الجلسة المرتبطة بـ ACP
- إرسال
- التمكين:
pnpm test:live src/gateway/gateway-acp-bind.live.test.tsOPENCLAW_LIVE_ACP_BIND=1
- القيم الافتراضية:
- وكلاء ACP في Docker:
claude,codex,gemini - وكيل ACP للتشغيل المباشر
pnpm test:live ...:claude - القناة التركيبية: سياق محادثة على نمط Slack DM
- الواجهة الخلفية لـ ACP:
acpx
- وكلاء ACP في Docker:
- التجاوزات:
OPENCLAW_LIVE_ACP_BIND_AGENT=claudeOPENCLAW_LIVE_ACP_BIND_AGENT=codexOPENCLAW_LIVE_ACP_BIND_AGENT=geminiOPENCLAW_LIVE_ACP_BIND_AGENTS=claude,codex,geminiOPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND='npx -y @agentclientprotocol/claude-agent-acp@<version>'
- ملاحظات:
- يستخدم هذا المسار سطح gateway
chat.sendمع حقول originating-route تركيبية مخصصة للمشرف فقط حتى تتمكن الاختبارات من إرفاق سياق قناة الرسائل من دون الادعاء بالتسليم الخارجي. - عندما لا يكون
OPENCLAW_LIVE_ACP_BIND_AGENT_COMMANDمضبوطًا، يستخدم الاختبار سجل الوكلاء المضمّن الخاص بـ Pluginacpxللوكيل المحدد في harness الخاص بـ ACP.
- يستخدم هذا المسار سطح gateway
- يوجد مشغّل Docker في
scripts/test-live-acp-bind-docker.sh. - افتراضيًا، يشغّل اختبار 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 قابلة للكتابة، ثم يثبت 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 harness
- الهدف: التحقق من Codex harness المملوك لـ Plugin عبر طريقة gateway
العادية
agent:- تحميل Plugin
codexالمضمّن - اختيار
OPENCLAW_AGENT_RUNTIME=codex - إرسال أول دور للوكيل عبر gateway إلى
codex/gpt-5.4 - إرسال دور ثانٍ إلى جلسة OpenClaw نفسها والتحقق من أن خيط app-server يمكنه الاستئناف
- تشغيل
/codex statusو/codex modelsعبر مسار أوامر gateway نفسه
- تحميل Plugin
- الاختبار:
src/gateway/gateway-codex-harness.live.test.ts - التمكين:
OPENCLAW_LIVE_CODEX_HARNESS=1 - النموذج الافتراضي:
codex/gpt-5.4 - 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
- يوجد مشغّل Docker في
scripts/test-live-codex-harness-docker.sh. - يعتمد على
~/.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 harness.
وصفات حية موصى بها
قوائم السماح الضيقة والصريحة هي الأسرع والأقل عرضة للتذبذب:-
نموذج واحد، مباشر (من دون gateway):
OPENCLAW_LIVE_MODELS="openai/gpt-5.4" pnpm test:live src/agents/models.profiles.live.test.ts
-
نموذج واحد، اختبار smoke لـ gateway:
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
-
استدعاء الأدوات عبر عدة مزوّدين:
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):
- 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
- Gemini (مفتاح API):
- يستخدم
google/...واجهة Gemini API (مفتاح API). - يستخدم
google-antigravity/...جسر Antigravity OAuth (نقطة نهاية وكيل على نمط Cloud Code Assist). - يستخدم
google-gemini-cli/...Gemini CLI المحلي على جهازك (مصادقة منفصلة ومراوغات أدوات منفصلة). - Gemini API مقابل Gemini CLI:
- API: يستدعي OpenClaw واجهة Gemini API المستضافة من Google عبر HTTP (مفتاح API / مصادقة profile)؛ وهذا هو ما يقصده معظم المستخدمين عندما يقولون “Gemini”.
- CLI: يستدعي OpenClaw ملف
geminiالثنائي المحلي؛ وله مصادقته الخاصة ويمكن أن يتصرف بشكل مختلف (البث، ودعم الأدوات، واختلاف الإصدارات).
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 - Z.AI (GLM):
zai/glm-4.7 - MiniMax:
minimax/MiniMax-M2.7
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 اختياري)
اختر واحدًا على الأقل من كل عائلة مزوّدين:- OpenAI:
openai/gpt-5.4(أوopenai/gpt-5.4-mini) - Anthropic:
anthropic/claude-opus-4-6(أوanthropic/claude-sonnet-4-6) - Google:
google/gemini-3-flash-preview(أوgoogle/gemini-3.1-pro-preview) - Z.AI (GLM):
zai/glm-4.7 - MiniMax:
minimax/MiniMax-M2.7
- xAI:
xai/grok-4(أو أحدث إصدار متاح) - Mistral:
mistral/… (اختر نموذجًا واحدًا مفعّلًا وقادرًا علىtools) - Cerebras:
cerebras/… (إذا كانت لديك صلاحية وصول) - LM Studio:
lmstudio/… (محلي؛ يعتمد استدعاء الأدوات على وضع API)
Vision: إرسال الصور (مرفق ← رسالة متعددة الوسائط)
ضمّن نموذجًا واحدًا على الأقل قادرًا على التعامل مع الصور فيOPENCLAW_LIVE_GATEWAY_MODELS (مثل Claude/Gemini/OpenAI بالإصدارات الداعمة للرؤية، إلخ) لممارسة probe الصور.
المجمعات / البوابات البديلة
إذا كانت لديك مفاتيح مفعّلة، فإننا ندعم أيضًا الاختبار عبر:- OpenRouter:
openrouter/...(مئات النماذج؛ استخدمopenclaw models scanللعثور على المرشحين القادرين على الأدوات+الصور) - OpenCode:
opencode/...لـ Zen وopencode-go/...لـ Go (المصادقة عبرOPENCODE_API_KEY/OPENCODE_ZEN_API_KEY)
- المضمّنون:
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(...) على جهازك + المفاتيح المتاحة.
بيانات الاعتماد (لا تُلتزم أبدًا)
تكتشف الاختبارات الحية بيانات الاعتماد بالطريقة نفسها التي يعمل بها CLI. الآثار العملية:- إذا كان CLI يعمل، فيجب أن تعثر الاختبارات الحية على المفاتيح نفسها.
-
إذا قال اختبار حي “لا توجد بيانات اعتماد”، فقم بالتصحيح بالطريقة نفسها التي ستصحح بها
openclaw models list/ اختيار النموذج. -
ملفات profile للمصادقة لكل وكيل:
~/.openclaw/agents/<agentId>/agent/auth-profiles.json(وهذا ما تعنيه “profile keys” في الاختبارات الحية) -
الإعداد:
~/.openclaw/openclaw.json(أوOPENCLAW_CONFIG_PATH) -
دليل الحالة القديم:
~/.openclaw/credentials/(يُنسخ إلى home الحي المجهّز عند وجوده، لكنه ليس مخزن المفاتيح الرئيسي لـ profile) -
تقوم التشغيلات الحية المحلية بنسخ الإعداد النشط وملفات
auth-profiles.jsonلكل وكيل وcredentials/القديم وأدلة مصادقة CLI الخارجية المدعومة إلى home اختبار مؤقت افتراضيًا؛ وتتجاوز البيئات الحية المجهّزةworkspace/وsandboxes/، كما تُزال تجاوزات المسارagents.*.workspace/agentDirحتى تبقى probes بعيدة عن مساحة العمل الحقيقية على المضيف.
~/.profile)، فشغّل الاختبارات المحلية بعد source ~/.profile، أو استخدم مشغّلات Docker أدناه (يمكنها تركيب ~/.profile داخل الحاوية).
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
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_CODING_MODEL=ark-code-latest
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 - النطاق:
- يمارس المسارات المضمّنة الخاصة بـ comfy للصور والفيديو و
music_generate - يتجاوز كل قدرة ما لم يكن
models.providers.comfy.<capability>مضبوطًا - مفيد بعد تغيير تقديم تدفق عمل comfy أو polling أو التنزيلات أو تسجيل Plugin
- يمارس المسارات المضمّنة الخاصة بـ comfy للصور والفيديو و
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 - النطاق:
- يعدّد كل Plugin مزوّد مسجل لتوليد الصور
- يحمّل متغيرات env المفقودة الخاصة بالمزوّد من shell تسجيل الدخول (
~/.profile) قبل الفحص - يستخدم مفاتيح API الحية/من env قبل ملفات profile المخزنة افتراضيًا، حتى لا تخفي مفاتيح الاختبار القديمة في
auth-profiles.jsonبيانات اعتماد shell الحقيقية - يتجاوز المزوّدين الذين لا يملكون مصادقة/profile/نموذجًا صالحًا
- يشغّل المتغيرات القياسية لتوليد الصور عبر القدرة المشتركة لوقت التشغيل:
google:flash-generategoogle:pro-generategoogle:pro-editopenai:default-generate
- المزوّدون المضمّنون الحاليون الذين تتم تغطيتهم:
openaigoogle
- التضييق الاختياري:
OPENCLAW_LIVE_IMAGE_GENERATION_PROVIDERS="openai,google"OPENCLAW_LIVE_IMAGE_GENERATION_MODELS="openai/gpt-image-1,google/gemini-3.1-flash-image-preview"OPENCLAW_LIVE_IMAGE_GENERATION_CASES="google:flash-generate,google:pro-edit"
- سلوك المصادقة الاختياري:
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1لفرض مصادقة مخزن profile وتجاهل التجاوزات المعتمدة على env فقط
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 - النطاق:
- يمارس المسار المضمّن المشترك لمزوّدات توليد الموسيقى
- يغطي حاليًا Google و MiniMax
- يحمّل متغيرات env الخاصة بالمزوّد من shell تسجيل الدخول (
~/.profile) قبل الفحص - يستخدم مفاتيح API الحية/من env قبل ملفات profile المخزنة افتراضيًا، حتى لا تخفي مفاتيح الاختبار القديمة في
auth-profiles.jsonبيانات اعتماد shell الحقيقية - يتجاوز المزوّدين الذين لا يملكون مصادقة/profile/نموذجًا صالحًا
- يشغّل وضعي وقت التشغيل المعلنين كليهما عند توفرهما:
generateمع إدخال يعتمد على prompt فقطeditعندما يعلن المزوّدcapabilities.edit.enabled
- التغطية الحالية في المسار المشترك:
google:generateوeditminimax:generatecomfy: ملف 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 فقط
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 - النطاق:
- يمارس المسار المضمّن المشترك لمزوّدات توليد الفيديو
- يحمّل متغيرات 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:runwayفقط عندما يكون النموذج المحدد هوrunway/gen4_aleph
- المزوّدون المعلن عنهم حاليًا لكن المتجاوزون في المسح المشترك لـ
videoToVideo:alibabaوqwenوxaiلأن هذه المسارات تتطلب حاليًا عناوين URL مرجعية بعيدة من نوعhttp(s)/ MP4googleلأن مسار 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 - الغرض:
- يشغّل مجموعات image و music و video الحية المشتركة عبر نقطة دخول أصلية واحدة للمستودع
- يحمّل تلقائيًا متغيرات env المفقودة الخاصة بالمزوّد من
~/.profile - يضيّق تلقائيًا كل مجموعة إلى المزوّدين الذين يملكون حاليًا مصادقة صالحة افتراضيًا
- يعيد استخدام
scripts/test-live.mjs، بحيث يبقى سلوك Heartbeat والوضع الهادئ متسقًا
- أمثلة:
pnpm test:live:mediapnpm test:live:media image video --providers openai,google,minimaxpnpm test:live:media video --video-providers openai,runway --all-providerspnpm test:live:media music --quiet
مشغّلات Docker (فحوصات اختيارية من نوع “تعمل على Linux”)
تنقسم مشغّلات 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-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. تجاوز متغيرات 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تشغّل حاوية واحدة أو أكثر حقيقية وتتحقق من مسارات تكامل ذات مستوى أعلى.
- النماذج المباشرة:
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)
.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 توافقًا أعلى مستوى: فهو يبدأ
حاوية 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، ثم
يتحقق من اكتشاف المحادثات الموجّهة، وقراءة transcript، وmetadata الخاصة بالمرفقات،
وسلوك طابور الأحداث الحية، وتوجيه الإرسال الصادر، وإشعارات القناة +
الأذونات على نمط Claude عبر جسر stdio MCP الحقيقي. يفحص اختبار الإشعارات
إطارات stdio MCP الخام مباشرة حتى يتحقق اختبار smoke مما يصدره الجسر
فعليًا، وليس فقط مما تعرضه مجموعة SDK معينة للعميل.
اختبار smoke يدوي لخيط ACP بلغة طبيعية عادية (ليس في CI):
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- احتفظ بهذا السكريبت من أجل تدفقات عمل الانحدار/تصحيح الأخطاء. فقد تكون هناك حاجة إليه مرة أخرى للتحقق من توجيه خيوط ACP، لذلك لا تحذفه.
OPENCLAW_CONFIG_DIR=...(الافتراضي:~/.openclaw) ويُركّب إلى/home/node/.openclawOPENCLAW_WORKSPACE_DIR=...(الافتراضي:~/.openclaw/workspace) ويُركّب إلى/home/node/.openclaw/workspaceOPENCLAW_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
- الأدلة الافتراضية:
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=...لتضييق التشغيلOPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=...لتصفية المزوّدين داخل الحاويةOPENCLAW_SKIP_DOCKER_BUILD=1لإعادة استخدام صورةopenclaw:local-liveالحالية في إعادة التشغيلات التي لا تحتاج إلى إعادة بناءOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1لضمان أن تأتي بيانات الاعتماد من مخزن profile (وليس من env)OPENCLAW_OPENWEBUI_MODEL=...لاختيار النموذج الذي يعرّضه gateway لاختبار smoke الخاص بـ Open WebUIOPENCLAW_OPENWEBUI_PROMPT=...لتجاوز prompt فحص nonce المستخدم في اختبار smoke الخاص بـ Open WebUIOPENWEBUI_IMAGE=...لتجاوز وسم صورة Open WebUI المثبتة
سلامة المستندات
شغّل فحوصات المستندات بعد تعديلها:pnpm check:docs.
وشغّل التحقق الكامل من روابط/anchors الخاصة بـ Mintlify عندما تحتاج إلى فحوصات عناوين داخل الصفحة أيضًا: pnpm docs:check-links:anchors.
اختبار انحدار دون اتصال (آمن لـ CI)
هذه اختبارات انحدار “لخط حقيقي” من دون مزوّدين حقيقيين:- استدعاء أدوات 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 التي تتصرف مثل “تقييمات موثوقية الوكيل”:- استدعاء أدوات وهمية عبر حلقة gateway + agent الحقيقية (
src/gateway/gateway.test.ts). - تدفقات wizard من طرف إلى طرف تتحقق من توصيل الجلسة وتأثيرات config (
src/gateway/gateway.test.ts).
- اتخاذ القرار: عند إدراج Skills في prompt، هل يختار الوكيل Skill الصحيحة (أو يتجنب غير ذات الصلة)؟
- الامتثال: هل يقرأ الوكيل
SKILL.mdقبل الاستخدام ويلتزم بالخطوات/الوسائط المطلوبة؟ - عقود سير العمل: سيناريوهات متعددة الأدوار تؤكد ترتيب الأدوات، واستمرار سجل الجلسة، وحدود sandbox.
- مشغّل سيناريوهات يستخدم مزوّدين وهميين لتأكيد استدعاءات الأدوات + ترتيبها، وقراءات ملفات Skill، وتوصيل الجلسات.
- مجموعة صغيرة من السيناريوهات المركزة على Skills (استخدام مقابل تجنب، والبوابات، وحقن prompt).
- تقييمات حية اختيارية (مقيّدة بالبيئة ومفعّلة اختياريًا) فقط بعد وضع المجموعة الآمنة لـ CI.
اختبارات العقود (شكل Plugin والقناة)
تتحقق اختبارات العقود من أن كل Plugin وقناة مسجلين يلتزمان بعقد الواجهة الخاصة بهما. فهي تتكرر على جميع Plugins المكتشفة وتشغّل مجموعة من التحققات الخاصة بالشكل والسلوك. يتجاوز مسار unit الافتراضيpnpm test
عمدًا هذه الملفات المشتركة الخاصة بالوصلات واختبار smoke؛ شغّل أوامر العقود صراحةً
عندما تلمس الأسطح المشتركة للقنوات أو المزوّدين.
الأوامر
- جميع العقود:
pnpm test:contracts - عقود القنوات فقط:
pnpm test:contracts:channels - عقود المزوّدين فقط:
pnpm test:contracts:plugins
عقود القنوات
تقع فيsrc/channels/plugins/contracts/*.contract.test.ts:
- plugin - شكل Plugin الأساسي (المعرّف، والاسم، والقدرات)
- setup - عقد معالج الإعداد
- session-binding - سلوك ربط الجلسة
- outbound-payload - بنية حمولة الرسالة
- inbound - معالجة الرسائل الواردة
- actions - معالجات إجراءات القناة
- threading - معالجة معرّف الخيط
- directory - واجهة API للدليل/القائمة
- group-policy - فرض سياسة المجموعة
عقود حالة المزوّد
تقع فيsrc/plugins/contracts/*.contract.test.ts.
- status - probes حالة القناة
- registry - شكل سجل Plugin
عقود المزوّدين
تقع فيsrc/plugins/contracts/*.contract.test.ts:
- auth - عقد تدفق المصادقة
- auth-choice - اختيار/تحديد المصادقة
- catalog - واجهة API لفهرس النماذج
- discovery - اكتشاف Plugin
- loader - تحميل Plugin
- runtime - وقت تشغيل المزوّد
- shape - شكل/واجهة Plugin
- wizard - معالج الإعداد
متى يجب التشغيل
- بعد تغيير صادرات أو مسارات
plugin-sdk - بعد إضافة Plugin قناة أو مزوّد أو تعديله
- بعد إعادة هيكلة تسجيل Plugin أو اكتشافه
إضافة اختبارات انحدار (إرشادات)
عند إصلاح مشكلة مزوّد/نموذج اكتُشفت في live:- أضف اختبار انحدار آمنًا لـ 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في ذلك الاختبار. يفشل الاختبار عمدًا عند وجود معرّفات هدف غير مصنفة حتى لا يمكن تجاوز الفئات الجديدة بصمت.