إنتقل إلى المحتوى الرئيسي

تهيئة Cordis

يُهيّأ محرك Cordis/DSH المضمّن بوثيقتين ومجموعة من متغيرات البيئة. توجد الوثيقتان افتراضيًا بجوار الواجهة الخلفية؛ ويمكن تغيير موضعهما باستخدام LIBRE_CORDIS_CONFIG وLIBRE_CORDIS_SETTINGS.

الوثيقةالمسؤولالبنيةالغرض
cordis.patch.ymlمحمّل Cordisمصفوفة YAML في المستوى الأعلىصفوف الإضافات التي تحمّل المحرك
cordis.config.ymlمضيف Libre WebUIخريطة YAMLالمزوّد ومصدر بيانات الاعتماد ومفاتيح الميزات

نستخدم وثيقتين لأن حامل شجرة Cordis المسمى Include يقرأ التركيب نفسه ويرفض أي ملف لا تكون بنيته العليا مصفوفة. لذلك لا يمكن وضع إعدادات المضيف في الملف نفسه.

التفعيل

خيار تفعيل محرك Cordis في الإعدادات بجانب خيار تفعيل الوكلاء.

يفعّل المسؤول المحرك عبر الإعدادات → إدارة المستخدمين → الوصول والسياسات → محرك Cordis. يسري التغيير فورًا: يؤدي التفعيل إلى بدء المحرك عند طلبه التالي، بينما ينهيه التعطيل. لا تتطلب العملية إعادة تشغيل.

يمكن لمصدرين على مستوى النشر تثبيت القيمة. ويجعل كلاهما المفتاح غير متاح بدلًا من تجاوز قيمته بصمت:

المصدرالأثر
متغير البيئة LIBRE_CORDIS_ENABLEDتثبّت true/false حالة الميزة على مستوى النشر
features.enabled في cordis.config.ymlالقيمة المحددة صراحة تثبّت الحالة؛ وحذف المفتاح يترك الاختيار للمسؤول

يحتاج المحرك أيضًا إلى تركيب. ابدأ بالأمثلة المرفقة:

cd backend
cp cordis.patch.example.yml cordis.patch.yml
cp cordis.config.example.yml cordis.config.yml

يقرأ المضيف cordis.patch.yml، ويدمج قيمه الافتراضية في صف الجسر، ويكتب النتيجة إلى <DATA_DIR>/cordis-runtime/cordis.composed.yml. هذا الملف مولّد وقابل للاستبدال، ويجب ألا تعدّله؛ الوثيقة المرجعية هي cordis.patch.yml الخاصة بالمشغّل.

cordis.config.yml

trace: false

model:
provider: libre-webui
# Empty selects the authenticated caller's configured default/fallback route.
model: ''

features:
# Omit enabled to let the administrator use the Settings toggle.
streaming: true
tools: true
persistence: true

# Optional absolute paths; defaults live under Libre WebUI's data directory.
# workspacePath: /absolute/path/to/workspace
# sessionStorePath: /absolute/path/to/sessions

مفاتيح المستوى الأعلى

المفتاحالنوعالافتراضيالمعنى
traceمنطقيfalseتسجيل كل انتقال تفعيل في Cordis
modelخريطةاختيار محوّل النموذج؛ انظر أدناه
featuresخريطةمفاتيح الإمكانات؛ انظر أدناه

features

المفتاحالنوعالافتراضيالمعنى
enabledمنطقيfalseتحميل المحرك. عندما تكون القيمة خاطئة يعيد كل مسار 503.
streamingمنطقيtrueقبول الدورات التي تبث مخرجات النموذج
toolsمنطقيtrueالسماح بأدوات المحرك وإتاحة سجلها
persistenceمنطقيtrueتفعيل استدامة JSONL واشتراط خدمتها؛ تنجو الجلسات من إعادة التشغيل

features.enabled هو المفتاح الوحيد الذي يجب ضبطه لتشغيل الجسر. لا يُقرأ مفتاح enabled في المستوى الأعلى؛ فوضع مفاتيح الإمكانات كلها داخل features يوفر مكانًا واحدًا لمعرفة ما هو مفعّل.

model

المفتاحالنوعالافتراضيالمعنى
providerسلسلةlibre-webuilibre-webui أو deepseek أو pi-ai أو none
apiKeyEnvسلسلةOPENAI_API_KEYاسم متغير البيئة الذي يحمل المفتاح
routeسلسلةlibre-webuiمسار المزوّد الذي يسميه المحرك في الطلبات
modelسلسلة''معرّف النموذج الذي يطلبه المحرك. اضبطه للمسار المعلن يدويًا
baseUrlسلسلة''تجاوز نقطة النهاية؛ تستخدم القيمة الفارغة افتراضي المحوّل نفسه
providersخريطة{}مسارات مزوّدين معلنة يدويًا ومفهرسة باسم المسار

مصدر نماذج المحرك

ليست للمحرك تهيئة مزوّدين مستقلة. فهو يستدعي المزوّدين الموجودين في Libre WebUI عبر المسار libre-webui الذي يسجله صف libre-webui-llm-adapter في التركيب. ما تستطيع محادثته في الواجهة هو ما يستطيع المحرك استخدامه: نزّل نموذجًا من الواجهة فيراه المحرك مع بيانات الاعتماد ونقطة النهاية المهيّأتين مسبقًا.

اضبط model.provider: libre-webui لاستخدامه. هذا هو الافتراضي المرفق؛ وتبقى بيانات الاعتماد ونقاط نهاية المزوّدين في إعدادات Libre WebUI الحالية.

يسمّي model النموذج الذي يطلبه المحرك. تعني القيمة الفارغة «استخدم النموذج الافتراضي للتطبيق»، وإذا لم يكن للنشر افتراضي يأخذ المحرك أول نموذج محادثة تعلنه طبقة المزوّدين، مع تفضيل النماذج المحلية المتاحة. تُستبعد نماذج التضمين. وتحتفظ المسارات المختارة داخليًا بهويتي المزوّد والنموذج: lwui:ollama:<encoded-model> أو lwui:plugin:<encoded-provider>:<encoded-model>. يمنع ذلك إعادة توجيه طلب محلي إلى مزوّد بعيد بسبب تطابق أسماء النماذج أو انقطاع Ollama. يفشل اختيار المزوّد الصريح إذا لم يتوفر؛ ولا يتحول بصمت إلى مزوّد آخر.

تكون قيمة model الفارغة آمنة فقط على مسار libre-webui. يحتاج المسار الذي تخدمه حزمة مزوّد إلى اسم صريح: يحل dsh-llm-pi-ai كتالوج المسار للإجابة عن استعلاماته، لكنه لا يرجع إلى أول إدخال فيه. لذلك لا يقبل المسار المعلن يدويًا دون model أي دورة، ويفشل بالرسالة:

provider "<route>" resolves no models; the installed catalog does not describe
this route, so its models must be listed in configuration

اضبط model على معرّف من قائمة models لذلك المسار. يقرن المثال المرفق route: ollama مع model: llama3.2، بما يطابق إدخال llama3.2 الذي يعلنه.

يختار provider حزمة المحوّل المحمّلة:

  • يخدم libre-webui المحرك عبر طبقة المزوّدين الخاصة بهذا النشر. وهو الوضع المدعوم والافتراضي.
  • يبدأ none المحرك دون وصول إلى النماذج. تُسرد الأدوات وتعمل الجلسات، لكن لا يمكن الإجابة عن دورة؛ وهذا مفيد لاختبار التركيب.
  • يحمّل deepseek وpi-ai حزمة مزوّد مباشرة. ليستا من اعتمادات هذه الواجهة الخلفية: تضمين جميع حزم SDK للمزوّدين كان يجلب 59 حزمة اعتماد غير مباشر، بينها حزم مهملة لإمكانات لا يستخدمها المحرك أصلًا. ثبّت الحزمة المطلوبة وأضف صفها إلى التركيب؛ ويسمّي المضيف الحزمة المفقودة إذا لم تكن موجودة.

يوصف مسار المزوّد بالحقول التالية:

الحقلالمعنى
displayNameاسم قابل للقراءة
apiبروتوكول الاتصال، مثل openai-completions
baseURLأساس نقطة النهاية
apiKeyEnvمتغير البيئة الذي يحمل المفتاح
modelsقائمة النماذج؛ يقبل كل إدخال id وname وcontextWindow وmaxTokens

لا تُكتب بيانات الاعتماد في أي من الوثيقتين مطلقًا. يسمّي apiKeyEnv متغير بيئة يحله المحوّل لكل طلب، لذلك لا يتطلب تدوير المفتاح إعادة تشغيل.

cordis.patch.yml

مصفوفة في المستوى الأعلى لإدخالات محمّل Cordis. يحمّل المثال المرفق تسعة صفوف، وهو نقطة البداية الموصى بها.

- id: llm
name: '@deepseek-ai/dsh-llm'

- id: session
name: '@deepseek-ai/dsh-session'

- id: session-projection
name: '@deepseek-ai/dsh-session-projection'

- id: session-persistence
name: '@deepseek-ai/dsh-session-persistence-jsonl'
config:
# The host supplies the resolved sessionStorePath.

- id: system-prompt
name: '@deepseek-ai/dsh-system-prompt'
config:
personaPrefix: ''

- id: tools
name: '@deepseek-ai/dsh-tools'

- id: agent
name: '@deepseek-ai/dsh-agent'

- id: agent-loop
name: '@deepseek-ai/dsh-agent-loop'
config:
agents: []

- id: libre-webui-bridge
name: './dist/cordis/dsh/engine-plugin.js'

حقول الإدخال

الحقلمطلوبالمعنى
idلامعرّف ثابت لاستهداف الصف. يُشتق من name إذا حُذف
nameنعممحدد الوحدة الذي يستورده المحمّل. يجب أن يكون سلسلة حرفية
configلاتهيئة الإضافة؛ تُسمح تعبيرات !!js
disabledلاتخطي الصف دون حذفه؛ يُسمح !!js
injectلاخدمات مطلوبة إضافية أو تهيئة اعتراض للصف

يستورد المحمّل name مباشرة ولا يقيّمه مطلقًا، لذلك لا يمكن أن يكون تعبير !!js. يمكن لقيم config استخدام !!js؛ وتُقيّم تلك التعبيرات لاحقًا في ليفة الصف المالك مع إتاحة سياق المحمّل. يعمل process.env وctx.get(...)، ولا يعمل import.meta.

تُحل المحددات النسبية انطلاقًا من دليل ملف التركيب نفسه. وتُحل المحددات المجردة عبر حزمة الواجهة الخلفية، ولذلك يجد @deepseek-ai/dsh-tools النسخة الموجودة في backend/node_modules.

لا يفرض ترتيب الصفوف ترتيب تحميل. يفعّل Cordis الصف عند توفر الخدمات التي يعلنها؛ والتجميع أعلاه مخصص للقراءة فقط.

الصفوف المطلوبة

يحتاج المحرك الذي يجيب عن المحادثة إلى كل ما يلي:

الصفيوفّريحتاجه
dsh-llmllmحلقة الوكيل
dsh-sessionsessionsحلقة الوكيل والجسر
dsh-session-projectionsessionProjectionsحلقة الوكيل
dsh-system-promptsystemPromptالأدوات وحلقة الوكيل
dsh-toolstoolsحلقة الوكيل والجسر
dsh-agentagentsالجسر
dsh-agent-loopبرنامج تشغيل الوكيلالإجابة عن الدورات
صف الجسرlibreDshEngineجميع المسارات

إضافة صف لأداة أيضًا، مثل @deepseek-ai/dsh-fs-sandbox مع @deepseek-ai/dsh-tool-fs، هي ما يجعل GET /api/cordis/tools يعيد أدوات؛ أما سجل الأدوات دون إضافات أدوات فمن الطبيعي أن يكون فارغًا.

متغيرات البيئة

لكل قيمة إعداد تجاوز عبر البيئة. يتقدم المتغير على الوثيقة، وتتقدم الوثيقة على الافتراضي المضمّن.

المتغيريتجاوزالافتراضي
LIBRE_CORDIS_ENABLEDfeatures.enabledfalse
LIBRE_CORDIS_STREAMINGfeatures.streamingtrue
LIBRE_CORDIS_TOOLSfeatures.toolstrue
LIBRE_CORDIS_PERSISTENCEfeatures.persistencetrue
LIBRE_CORDIS_TRACEtracefalse
LIBRE_CORDIS_MODEL_PROVIDERmodel.providerlibre-webui
LIBRE_CORDIS_MODEL_ROUTEmodel.routelibre-webui
LIBRE_CORDIS_MODELmodel.model''
LIBRE_CORDIS_API_KEY_ENVmodel.apiKeyEnvOPENAI_API_KEY
LIBRE_CORDIS_BASE_URLmodel.baseUrl''
LIBRE_CORDIS_CONFIGمسار وثيقة التركيب<cwd>/cordis.patch.yml
LIBRE_CORDIS_SETTINGSمسار وثيقة الإعداداتبجوار وثيقة التركيب
LIBRE_CORDIS_WORKSPACEمساحة العمل الافتراضية للمحرك<DATA_DIR>/cordis-workspace
LIBRE_CORDIS_SESSION_STOREدليل الجلسات المحفوظة<DATA_DIR>/cordis-sessions

تقبل المتغيرات المنطقية 1/true/yes/on و0/false/no/off. تعيد القيمة غير القابلة للقراءة الأولوية للوثيقة بدلًا من التخمين.

تقرأ تعبيرات !!js في التركيب المرفق أيضًا LIBRE_CORDIS_SESSION_STORE وLIBRE_CORDIS_WORKSPACE، ولهذا يصدّرهما المضيف قبل تحميل الشجرة.

أمثلة مشروحة

Ollama محلي دون اتصال تمامًا

features:
enabled: true
model:
provider: pi-ai
route: ollama
model: llama3.2
apiKeyEnv: OLLAMA_API_KEY
providers:
ollama:
api: openai-completions
baseURL: http://127.0.0.1:11434/v1
apiKeyEnv: OLLAMA_API_KEY
models:
- id: llama3.2
contextWindow: 131072
maxTokens: 4096

يتجاهل Ollama المفتاح، لكن عميل OpenAI يشترط ضبطه. صدّر OLLAMA_API_KEY=ollama لتلبية الشرط دون اختراع سر. لا يغادر شيء الجهاز.

بوابة متوافقة مع OpenAI

features:
enabled: true
model:
provider: pi-ai
route: gateway
model: acme-large
apiKeyEnv: ACME_GATEWAY_API_KEY
providers:
gateway:
displayName: Acme Gateway
api: openai-completions
baseURL: https://gateway.acme.example/v1
apiKeyEnv: ACME_GATEWAY_API_KEY
models:
- id: acme-large
contextWindow: 65536
maxTokens: 4096

DeepSeek الرسمي

features:
enabled: true
model:
provider: deepseek
route: deepseek
apiKeyEnv: DEEPSEEK_API_KEY

اضبط DEEPSEEK_API_KEY في بيئة الواجهة الخلفية.

دون مزوّد، أدوات فقط

features:
enabled: true
model:
provider: none

يبدأ المحرك، ويمكن إنشاء جلسات، وتسرد GET /api/cordis/tools إضافات الأدوات المهيّأة. يفشل إرسال الرسائل لأن أي محوّل لا يستطيع خدمة الطلب.

ملاحظات الترحيل

جسر Cordis إضافة اختيارية. لا يتغير أي سلوك قائم عندما يكون معطّلًا، وهو معطّل افتراضيًا.

ترقية نشر قائم. لا يلزم أي إجراء. تُرفق وثيقتا المثال باسمَي cordis.patch.example.yml وcordis.config.example.yml، فلا تُقرأ أي منهما قبل نسخها وتفعيل الميزة. لا يُشغّل ترحيل، ولا يُنشأ جدول، ولا يُمس أي دليل بيانات قائم.

التفعيل لأول مرة. انسخ المثالين، واضبط features.enabled: true، ولا تثبّت شيئًا إضافيًا؛ فحزم المحرك من اعتمادات الواجهة الخلفية أصلًا. ينشئ المحرك عند أول طلب <DATA_DIR>/cordis-workspace و<DATA_DIR>/cordis-sessions و<DATA_DIR>/cordis-runtime. كلها أدلة جديدة تحت دليل البيانات القائم، لذا تغطيها أي عملية نسخ احتياطي أو استعادة تشمل ذلك الدليل.

ترقية المحرك. تُسجّل إصدارات المحرك المحسومة في package-lock.json. ويعلن backend/package.json نطاقات متوافقة مع إصدارات alpha. رقِّ بصورة متعمدة، وتحقق من عقود المزوّد والجلسة بعد تشغيل npm install. إذا اكتسبت حزمة DSH اعتمادًا نظيرًا، يبلّغ عنه npm عند التثبيت لا عند التحميل. يملك DSH تنسيقات النماذج والجلسات؛ فتغيير التنسيق يخص ملاحظات إصدار DSH، وليس ترحيل Libre WebUI.

التراجع. اضبط features.enabled: false وأعد التشغيل، أو احذف صف الجسر من cordis.patch.yml. تُسحب خدمة libreDshEngine، ويُحرر مستمعها، وتُنهى الوكلاء التي أنشأتها. تبقى ملفات الجلسات على القرص كبيانات؛ احذف دليل sessionStorePath لاستعادة المساحة. إزالة الحزم اختيارية ولا تؤثر في ميزات Libre WebUI الأخرى.

عمليات نشر Chat وWork القائمة. يحصل Chat على اختيار DeepSeek Harness للمسؤولين فقط، باستخدام جلسات محرك عابرة ونص المحادثة الحالي. ويحصل Work على خيار محرك DeepSeek Harness منفصل يعتمد على برنامج تشغيل DSH معزول ومسار Work الحالي للموافقات والعزل. تظل اختيارات النماذج الحالية تعمل كالمعتاد.

مع المحوّل القياسي libre-webui، يتضمن منتقي الوكلاء في Chat اختيارات صريحة لمزوّد ونموذج DSH، إضافة إلى الملف الأساسي. تحتفظ الاختيارات الصريحة بهوية المزوّد المؤهلة. يستخدم الملف الأساسي النموذج الافتراضي للتركيب الجاري. تستدعي العناوين وملخصات التفكير لهذه الاختيارات المزوّد الأساسي مباشرة دون أدوات وكيل. أما مسار محوّل النموذج المخصص فيحتفظ بإدخال Chat الأساسي فقط، ويتطلب نموذج مهمة Ollama أو إضافة منفصلًا لتوليد العناوين وملخصات التفكير.

يحترم DSH مفتاح Ollama الذي يضبطه المسؤول. عند تعطيل Ollama لا تُسرد نماذجه ولا تُفحص، ويفشل اختياره الصريح دون تبديل المزوّدين. تتطلب أسماء النماذج غير المؤهلة التي يثبّتها المشغّل أيضًا كتالوج Ollama لحلها بأمان؛ استخدم اختيارًا مؤهلًا من الشكل lwui:plugin:<plugin>:<model> في نشر يعتمد على الإضافات فقط.

الحدود التشغيلية

  • محرك المضيف وChat للمسؤولين وللنمط الفردي فقط. صفحة المحرك وحدة تحكم مشتركة للمسؤولين بمخزن JSONL محلي. لا يمكن تحميلها في وضع الفريق. يستخدم Work المعزول مستودعات SQL الحالية بدلًا منها.
  • تستخدم استدعاءات النموذج المستدعي الموثّق. تستخدم الدورات التفاعلية للمضيف بيانات اعتماد المزوّد وتفضيل النموذج الافتراضي لذلك المسؤول. يمكن لتركيب غير تفاعلي موثوق ضبط LIBRE_CORDIS_USER صراحة على معرّف مسؤول نشط. لا يوجد رجوع ضمني إلى أقدم مسؤول.
  • تُحصر أدوات نظام ملفات المضيف في مساحة العمل. تتحقق القراءة والكتابة من الهدف الفعلي بعد حل المسار؛ ولا تستطيع الجلسة اختيار دليل خارج الجذر المهيّأ. تظل قيود التعديل الأصلية في DSH سارية. الإضافات الإضافية التي يثبتها المشغّل كود خادم موثوق.
  • تستخدم أدوات المضيف سياسات DSH. توفّر صفحة المحرك تحكمًا لكل جلسة في القراءة فقط أو الكتابة في مساحة العمل، وبطاقات موافقة أصلية لمرة واحدة. لا تتجاوز هذه الضوابط حدود مساحة العمل المحددة. ترفض دورات Chat دون واجهة طلبات الموافقة التي لا تستطيع عرضها. ويستخدم برنامج تشغيل DSH في Work بدلًا منها موافقات Work وعزل الحاويات دون أدوات نظام ملفات المضيف.
  • تحتوي التدفقات على النص الحي والاستدلال المكشوف. تحفظ الرسائل الدائمة النص المكتمل، ولا يتلقى العملاء نسخة ثانية من النص الحي.
  • تستخدم إعادة التشغيل والحذف الجلسات المحفوظة. تنجو جلسات المحرك الفارغة والمكتملة من إعادة التشغيل. يوقف حذف جلسة JSONL أنشأها الجسر كاتبها ويزيل أثرها. وعلى تطبيقات الاستدامة الأخرى توفير محوّل حذف مناسب.
  • تحتاج السجلات القديمة المشوهة إلى إصلاح صريح. كتبت إصدارات سابقة للجسر رسائل مستخدم دون معرّفات مطلوبة. يرفض القارئ الصارم تلك السجلات بدلًا من إسقاطها. راجع إجراء الاستعادة في استكشاف الأخطاء.
  • تُشتق العناوين محليًا. تستخدم ملخصات الجلسات أول رسالة بشرية كعنوان قصير؛ ولا يُشتق عنوان للجلسات الفارغة.

توصيل نماذج من نسخة DSH قيد التشغيل

تعرض إضافة dsh-native-provider الاختيارية النماذج واتصالات المزوّدين المهيّأة في نسخة DSH أخرى، مثل تطبيق الويب المحلي على المنفذ 3080. ثبّتها في الملف التعريفي القائم لتلك النسخة. لا تستدعي إلا ctx.llm: تبقى مفاتيح المزوّدين في DSH، ولا تستطيع الوصلة إنشاء جلسات أو تشغيل وكلاء أو قراءة ملفات مرفقات أصلية أو تنفيذ أدوات أصلية.

يجب تشغيل العمليتين على مضيف Unix نفسه وتحت حساب نظام التشغيل نفسه. يستخدم النقل مقبس Unix مهيّأ صراحة، بدليل فعلي يملكه ذلك الحساب ووضعه 0700، وبمقبس وضعه 0600. لا يضيف مستمع TCP ولا يعيد استخدام مصادقة متصفح DSH أو يضعفها. لا تدعم هذه الوصلة المحلية Windows أو مضيفي DSH البعيدين.

حساب نظام التشغيل هو حد الوصول المحلي: تستطيع العمليات الأخرى العاملة بهذا الحساب استخدام مقبسه. لا توفر الوصلة بيانات اعتماد أصلية منفصلة للمزوّدين، ولا تعزل التطبيقات التي تشارك ذلك الحساب.

تثبيت الإضافة المستقلة

في DSH → Plugins → Add plugin، الصق عنوان المستودع العام التالي في Package name or address، ثم انقر Install:

https://github.com/libre-webui/dsh-native-provider

فعّل المكوّن عندما يطلب DSH ذلك. إصدار الحزمة العامة هو 0.1.1، وترخيصها Apache-2.0، وتشمل بيئة تشغيل مبنية مسبقًا ورقعة الحزمة. لا تحتاج إلى بناء محلي أو سكربتات تثبيت أو اعتمادات npm وقت التشغيل. اسم الحزمة المجرد @libre-webui/dsh-native-provider غير منشور على npm؛ استخدم عنوان GitHub في مربع الحوار.

تختار الحزمة <DSH home>/lwui-provider/llm.sock، وهو عادة $HOME/.dsh/lwui-provider/llm.sock. يتقدم DSH_HOME إذا كان مهيّأ. يُنشأ دليل المقبس الخاص إذا كان مفقودًا. استخدم جسرًا نشطًا واحدًا لكل دليل DSH، أو تجاوز مسار المقبس في ملف cordis.patch.yml الخاص بالمستخدم للملفات التعريفية الإضافية. يجب ألا يتجاوز المسار الكامل 100 بايت UTF-8 وألا يحتوي على مكوّنات روابط رمزية. راجع دليل تهيئة الحزمة المستقلة لتفاصيل التجاوزات.

البديل الاختياري عبر سطر الأوامر هو:

dsh plugin --profile web add https://github.com/libre-webui/dsh-native-provider

استبدل web بالملف التعريفي الذي يشغّل نسخة DSH فعليًا إن كان مختلفًا. أعد تشغيله بعد التثبيت بسطر الأوامر؛ أما التثبيت عبر الواجهة الحية فيستطيع تفعيل الإضافة فورًا. اتبع أي إشعار إعادة تشغيل يعرضه DSH. لا تحتاج إلى تعديل مصادر DSH الأصلي أو نسخ مفاتيح المزوّدين.

تجهيز حزمة من Libre WebUI

يرفق Libre WebUI أيضًا سكربت تجهيز. من نسخة المصادر، ابنِ الواجهة الخلفية وجهّز دليل إخراج جديدًا:

npm run build:backend
node scripts/prepare-dsh-provider.mjs /absolute/dsh-provider-bundle /absolute/private-directory/provider.sock
dsh plugin --profile web add /absolute/dsh-provider-bundle

تتضمن توزيعات npm المثبتة بالفعل الواجهة الخلفية المترجمة وسكربت التجهيز؛ نفّذ الأمرين الأخيرين من دليل التثبيت دون خطوة البناء. أعد تشغيل ملف DSH المحدد بعدها. ترفض طريقتا التجهيز أدلة الإخراج الموجودة، وتدرجان بيانات الحزمة الوصفية والترخيص وملاحظات التثبيت.

توصيل Libre WebUI

وجّه cordis.config.yml الخاص بـ Libre WebUI إلى مسار المقبس المطلق نفسه. لاستخدام افتراضي الحزمة العامة، استبدل /absolute/home بدليلك المنزلي الحقيقي:

nativeProvider:
socketPath: /absolute/home/.dsh/lwui-provider/llm.sock

يمكنك بدلًا من ذلك ضبط LIBRE_DSH_PROVIDER_SOCKET على ذلك المسار المطلق. تعطّل قيمة البيئة الفارغة الوصلة حتى لو أعلن الملف مسارًا. فعّل محرك Cordis في LWUI. يمكن للمسؤولين النشطين بعدها اختيار النماذج الأصلية في محرك DeepSeek Harness الخاص بـ Work وصفحة المحرك ومجموعة الوكلاء في Chat (يتطلب Chat أيضًا نماذج وكلاء CLI). يحتفظ Work بمعرّف النموذج الأصلي الخام ومعرّف المزوّد مع providerType: dsh؛ وتحتفظ مهام DSH الحالية التي تعتمد على LWUI بهوية المزوّد وعلامة المحرك الأصليتين.

تُقرأ قائمة النماذج الأصلية مباشرة. يؤدي تغيير تهيئة المزوّد أو بيانات اعتماده إلى إبطال جيل الوصلة وإلغاء الاستدعاءات الأصلية الجارية. يوقف عدم توفر المقبس أو النموذج أو المزوّد الأصلي الطلب؛ ولا يرجع LWUI إلى Ollama أو مزوّد آخر. تستدعي العناوين وملخصات التفكير LLM الأصلي المحدد مباشرة دون أدوات. تقبل هذه الوصلة الأولى رسائل النص والاستدلال والأدوات، وترفض مراجع الصور والملفات الأصلية.

تخص بيانات الاعتماد الأصلية مشغّل DSH، لذلك تبقى الوصلة للمسؤولين فقط حتى إن أتيح Work العادي لمستخدمين إضافيين. قد تغادر طلبات النماذج المضيف بحسب المزوّد المهيّأ في DSH؛ ويعرض Work إفصاح المزوّد البعيد. في نشر الفريق، يحتاج كل عامل يتولى هذه المهام إلى الوصول للوصلة المحلية المهيّأة؛ ويُرفض التنفيذ عند غيابها. يؤدي تعطيل Cordis أو إزالة إعداد المقبس إلى سحب الوصول الأصلي مع الحفاظ على المهام المحفوظة. إذا تعطل DSH وترك مقبسًا، أوقف النسخة المالكة وأزل ذلك المقبس القديم فقط قبل إعادة التشغيل؛ فالإضافة ترفض استبدال إدخال موجود في نظام الملفات.

ترقية الإضافة أو إزالتها

أكمل أو ألغِ الطلبات الأصلية النشطة قبل تغيير الإضافة. لاستبدال الحزمة المحلية القديمة 0.0.0/0.1.0 عبر واجهة DSH، استخدم Uninstall ثم ارجع إلى Add plugin وثبّت عنوان GitHub العام أعلاه. احتفظ بأي مسار مقبس مخصص عبر تجاوز مدعوم في ملف المستخدم التعريفي. تبقى الجلسات وبيانات الاعتماد الأصلية محفوظة.

يمكن تحديث التثبيت الذي مصدره GitHub بالفعل عبر سطر الأوامر:

dsh plugin --profile web update @libre-webui/dsh-native-provider

أعد التشغيل بعد تحديثات سطر الأوامر وتحقق من الإصدار. تظل الإضافة المعطّلة سابقًا معطّلة؛ افحص تفعيلها قبل اختبار الوصلة. لتثبيت مراجعة محددة أو التراجع، استخدم github:libre-webui/dsh-native-provider#<commit> كمصدر. أما الحزم المجهزة محليًا، فابنِ دليل إخراج جديدًا وأضفه من جديد؛ فتحديث اعتماد محلي لا يسحب GitHub.

لإزالة الوصلة، احذف أولًا إعداد nativeProvider.socketPath من LWUI أو اضبط LIBRE_DSH_PROVIDER_SOCKET على قيمة فارغة، ثم نفّذ:

dsh plugin --profile web remove @libre-webui/dsh-native-provider

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

استخدام المزوّد الأصلي

تظهر الطلبات الأصلية في استخدام المزود تحت DeepSeek Harness · المزوّد، مع النموذج الخام المحدد. يُحسب كل طلب نموذج فعلي مرة واحدة، بما في ذلك دورات الأدوات والعناوين وملخصات التفكير. تشمل اللوحة الاستدعاءات الناجحة والفاشلة والملغاة وزمن الاستجابة والرموز التي يبلّغ عنها DSH. تُدرج المدخلات المخزنة مؤقتًا مرة واحدة في إجمالي الإدخال؛ وتبقى بيانات الاستخدام المفقودة غير مقاسة بدلًا من تقديرها. تستخدم معرّفات المزوّدين dsh-native:<percent-encoded-native-provider-id> لقواعد التعرفة وحساب التكلفة الموجودة. تبقى التعرفات المجهولة دون تسعير.

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

التحقق من التهيئة

curl -s http://127.0.0.1:3001/api/cordis/health | jq
{
"success": true,
"enabled": true,
"ready": true,
"services": [
{ "name": "llm", "state": "ready" },
{ "name": "systemPrompt", "state": "ready" },
{ "name": "sessions", "state": "ready" },
{ "name": "tools", "state": "ready" },
{ "name": "agents", "state": "ready" }
]
}

تعني 503 مع code: CORDIS_UNAVAILABLE أن التركيب لم يُحمّل. يحمل حقل error السبب، ويضيف LIBRE_CORDIS_TRACE=true سجل تفعيل Cordis. راجع استكشاف الأخطاء للأسباب الشائعة.