Cordis ब्रिज
Cordis ब्रिज DeepSeek Harness (DSH) इंजन को Libre WebUI बैकएंड में एम्बेड करता है। DSH, Libre WebUI द्वारा होस्ट किए गए Cordis रनटाइम में प्लगइन ट्री के रूप में चलता है। उसकी क्षमताएँ सीधे आयातित मॉड्यूल के बजाय Cordis सेवाओं से मिलती हैं।
ब्रिज डिफ़ॉल्ट रूप से बंद है। ऑपरेटर के सक्षम करने तक इस पृष्ठ की कोई प्रक्रिया नहीं चलती। Cordis कॉन्फ़िगरेशन देखें।
सीधे एकीकरण के बजाय ब्रिज क्यों
Libre WebUI सेवाओं में DSH पैकेज सीधे आयात करने से कोड कम होता, लेकिन इंजन कंपाइल-समय की निर्भरता बन जाता। मॉडल अडैप्टर या एजेंट लूप बदलने और इंजन हटाने के लिए Libre WebUI को बदलकर फिर तैनात करना पड़ता।
ब्रिज निर्भरता उलट देता है। Libre WebUI एक अमूर्त अनुबंध पर निर्भर है; Cordis कंपोज़िशन दस्तावेज़ उसका कार्यान्वयन चुनता है:
- बिना दोबारा बिल्ड किए प्रदाता बदलें। कंपोज़िशन YAML फ़ाइल है, इसलिए दूसरे प्रदाता का चयन सेटिंग का बदलाव है।
- क्षमताएँ कॉन्फ़िगर करें। हर क्षमता Loader की पंक्ति है। ऑपरेटर के बदलाव अगले होस्ट प्रारंभ पर लागू होते हैं।
- पूरी तरह हटाएँ। इंजन की सभी सेवाएँ, लिसनर और प्रभाव रूट फ़ाइबर के स्वामित्व में हैं। उसे मुक्त करने से सब वापस हो जाता है; Libre WebUI पुनः शुरू किए बिना इंजन रोक सकते हैं।
परतें
DSH की प्रत्यक्ष निर्भरताएँ backend/src/cordis/dsh/ में रहती हैं। रूट और एप्लिकेशन सेवाएँ ब्रिज अनुबंध इस्तेमाल करती हैं। Work ड्राइवर की अलग इन-मेमोरी कंपोज़िशन है; वह होस्ट फ़ाइल सिस्टम प्लगइन कभी माउंट नहीं करता।
अनुबंध
अनुबंध backend/src/cordis/contracts.ts में है। यह जानबूझकर सीमित है: इंजन की शब्दावली के बिना केवल Libre WebUI API के लिए आवश्यक डेटा।
| अनुबंध | उद्देश्य |
|---|---|
DshEngine.status() | हर इंजन सेवा का जीवनचक्र (pending / ready / failed) |
DshEngine.modelConfiguration() | चलती कंपोज़िशन का डिफ़ॉल्ट मॉडल और प्रदाता |
DshEngine.listSessions() | नवीनतम पहले, सत्र सारांश |
DshEngine.getSession(id) | सत्र और उसके प्रोजेक्ट किए गए संदेश |
DshEngine.createSession(opts) | सत्र ID और कार्य निर्देशिका आरक्षित करना |
DshEngine.updateSessionSettings(id, settings) | निष्क्रिय समय में वास्तविक मॉडल चयन और नेटिव फ़ाइल अनुमति मोड सहेजना |
DshEngine.decideApproval(id, approvalId, decision) | संबंधित सत्र के एक लंबित नेटिव टूल अनुमोदन का निर्णय |
DshEngine.deleteSession(id) | सत्र समाप्त कर एजेंट मुक्त करना |
DshEngine.listAgents() | रूट या चाइल्ड के रूप में चिह्नित सक्रिय एजेंट |
DshEngine.listTools() | इंजन द्वारा मॉडल के लिए पंजीकृत टूल |
DshEngine.sendMessage(id, txt) | टर्न शुरू करके स्ट्रीम हैंडल देना |
DshEngine.cancel(id) | सत्र का जारी टर्न रद्द करना |
अनुबंध libreDshEngine Cordis सेवा के रूप में उपलब्ध है। उपभोक्ता ctx.get('libreDshEngine') से पढ़ता है, ब्रिज मॉड्यूल आयात नहीं करता।
EngineStreamChunk में text, reasoning, tool-call, tool-result, approval-request, approval-decision, error और done होते हैं। लाइव फ़्रेम उनके एजेंट और सत्र के अनुसार भेजे जाते हैं; संबंधित स्थायी सहायक संदेश दोबारा नहीं भेजा जाता। sendMessage के हैंडल का subscribe पहले भेजी सामग्री दोहराता है। इसलिए इंजन के शुरू होने और HTTP लिसनर जुड़ने के बीच बना पहला टोकन भी नहीं खोता।
क्रम: चैट का एक टर्न
टर्न अनुरोध के बाद सर्वर से क्लाइंट की ओर एक क्रम है, इसलिए NDJSON इस्तेमाल होता है। POST में रखने से दूसरा हैंडशेक, टिकट या पुनः कनेक्शन प्रोटोकॉल नहीं चाहिए और पूरा टर्न एक प्रमाणित अनुरोध में रहता है।
DONE और PENDING
Cordis घोषित सेवाएँ उपलब्ध होने पर प्लगइन सक्रिय करता है। इस दौरान पंक्ति अभी न चलने वाली स्थिति में रह सकती है। निम्न दो अवधारणाओं को मिलाना इंजन के बिना उत्तर दिए रहने का सामान्य कारण है।
Loader एंट्री की स्थिति। Loader हर पंक्ति को PENDING → LOADING → ACTIVE या FAILED के रूप में देखता है। घोषित सेवा न हो तो पंक्ति त्रुटि देने के बजाय अनिश्चित समय तक लंबित रहती है। अधूरी कंपोज़िशन में इंजन शुरू होकर भी कुछ उपलब्ध नहीं कराता।
सेवा की उपलब्धता। होस्ट हर अपेक्षित सेवा की स्थिति बताता है:
| स्थिति | अर्थ | कारण |
|---|---|---|
pending | संदर्भ में पंजीकृत नहीं | प्रदाता पंक्ति सक्रिय नहीं हुई या बंद है |
ready | पंजीकृत और उपयोग योग्य | प्रदाता पंक्ति सक्रिय हो गई |
failed | घोषित, लेकिन उपयोग योग्य नहीं | कारण detail स्ट्रिंग में बताया जाता है |
host.status() सभी अपेक्षित सेवाओं की उपलब्धता और गायब अनिवार्य सेवाओं के नाम देता है। GET /api/cordis/health भी यही जानकारी देता है। अनिवार्य सेवा न हो तो प्रारंभ त्रुटि देता है, खाली सूचियाँ लौटाने वाला इंजन नहीं देता।
दो निर्भरता शृंखलाएँ आसानी से गलत हो सकती हैं:
dsh-tools,systemPromptके बिना शुरू नहीं होता।dsh-agent-loopकोagents,sessions,llm,tools,systemPromptऔरsessionProjectionsसभी चाहिए।
इनमें से एक भी न हो तो सत्र भंडार चल सकता है, लेकिन इंजन किसी संदेश का उत्तर नहीं देगा।
प्रदाता कॉन्फ़िगरेशन
साथ आने वाली libre-webui-llm-adapter पंक्ति Libre WebUI में कॉन्फ़िगर किए प्रदाता उपलब्ध कराती है। इंजन पृष्ठ का मॉडल चयन इस पंक्ति को बदले बिना सत्र के लिए प्रदाता मॉडल चुनता है।
कंपोज़िशन पंक्तियों में बदलाव अगले होस्ट प्रारंभ पर लागू होता है। बैकएंड पुनः शुरू करें, या प्रशासक का स्विच लॉक न हो तो Cordis बंद करके फिर खोलें। सहेजे सत्र कॉन्फ़िगर भंडार में रहते हैं और नई कंपोज़िशन से जारी होते हैं।
विश्वसनीय एकीकरण कोड Cordis Loader जीवनचक्र API सीधे इस्तेमाल कर सकता है। ब्रिज अडैप्टर बदलने का endpoint नहीं देता और बदलाव विफल होने पर पुराना अडैप्टर अपने आप वापस नहीं लाता।
रोलबैक
होस्ट का रूट फ़ाइबर मुक्त करने से इंजन की सभी स्थापित चीज़ें हटती हैं। यही स्वामित्व संबंध गारंटी देता है:
- सेवाएँ प्लगइन दर्ज करते हैं, इसलिए फ़ाइबर के साथ हटती हैं।
session/eventसदस्यताएँ ब्रिज के अपने constructor में दर्ज होती हैं और उसकी पंक्ति के फ़ाइबर की होती हैं।- ब्रिज एजेंट हैंडल ट्रैक करता है और सफ़ाई प्रभाव में उन्हें मुक्त करता है।
- होस्ट सभी पंक्तियों के स्वामी रूट संदर्भ को मुक्त करता है।
stopCordisHost() बार-बार सुरक्षित रूप से चल सकता है और बैकएंड बंद करने की प्रक्रिया में जुड़ा है। इंजन के टाइमर और फ़ाइल हैंडल प्रक्रिया समाप्त होने के भरोसे छोड़ने के बजाय मुक्त किए जाते हैं।
सत्र पहचान और स्थायी भंडारण
इंजन पृष्ठ सत्र बनाते समय अपारदर्शी सत्र ID आरक्षित करता है। स्थायी भंडारण चालू हो तो हेडर तुरंत सहेजता है; खाली सत्र भी पुनः शुरू करने के बाद रहता है। ब्रिज सहेजे और सक्रिय दोनों सत्र दिखाता है, DSH की सत्यापित persistence API से लॉग पढ़ता है और अगले टर्न में उसी ID से एजेंट जारी करता है। नए उपयोगकर्ता संदेश DSH के पहचानयुक्त संदेश constructor का उपयोग करते हैं।
सत्र हटाने से पहले एजेंट रद्द और मुक्त किया जाता है, फिर उसका संग्रहित आर्टिफ़ैक्ट हटता है। स्थानीय JSONL deletion अडैप्टर भंडार और सत्र पथ जाँचता है तथा प्रतीकात्मक लिंक अस्वीकार करता है। deletion रहित कस्टम बैकएंड डेटा हटाने का दावा करने के बजाय त्रुटि देते हैं।
रद्द करना नेटिव एजेंट, मॉडल अनुरोध और टूल कार्य तक पहुँचता है। क्लाइंट कटने पर उसका टर्न रद्द होता है; पूरे हो चुके संदेश पढ़े जा सकते हैं। स्ट्रीम रिप्ले का बफ़र सीमित है और पाठक जुड़ने से पहले आई तेज़ प्रतिक्रिया सुरक्षित रखता है।
होस्ट इंजन एक प्रतिकृति वाली solo सुविधा है। Team तैनाती उसका स्थानीय JSONL रनटाइम माउंट नहीं कर सकती। सैंडबॉक्स Work मौजूदा SQL टास्क, रन, संदेश, अनुमोदन और इवेंट भंडार उपयोग करता है।
HTTP इंटरफ़ेस
| विधि | पथ | उद्देश्य |
|---|---|---|
GET | /api/cordis/health | ब्रिज स्थिति; प्रमाणीकरण नहीं चाहिए |
GET | /api/cordis/sessions | सत्र सूची |
POST | /api/cordis/sessions | सत्र बनाना |
GET | /api/cordis/sessions/:id | सत्र और संदेश पढ़ना |
DELETE | /api/cordis/sessions/:id | सत्र समाप्त करना |
POST | /api/cordis/sessions/:id/messages | संदेश भेजकर NDJSON स्ट्रीम पाना |
POST | /api/cordis/sessions/:id/cancel | जारी टर्न रद्द करना |
GET | /api/cordis/agents | सक्रिय एजेंट सूची |
GET | /api/cordis/tools | पंजीकृत टूल सूची |
/health के अलावा हर रूट को प्रमाणित प्रशासक सत्र चाहिए। ब्रिज अनुरोध न संभाल सके तो 503 देता है और code में CORDIS_DISABLED, CORDIS_STARTING या CORDIS_UNAVAILABLE होता है।

पृष्ठ frontend/src/pages/CordisPage.tsx में है और साइडबार से /cordis पर खुलता है। यह सत्र और टूल सूची, सत्र निर्माण और टर्न स्ट्रीमिंग देता है। ब्रिज बंद या शुरू न हो तो खाली सूची के बजाय कारण दिखाता है, ताकि बिना सत्र और बिना इंजन की स्थितियाँ अलग रहें।
ब्राउज़र क्लाइंट frontend/src/utils/api/cordisApi.ts है। यह केवल इस API को उपयोग करता है, कोई बैकएंड टाइप या @deepseek-ai/* पैकेज आयात नहीं करता। इंजन बदलने पर फ्रंटएंड बदलना नहीं पड़ता। sendMessage(sessionId, text, { onChunk }) टर्न पढ़ता है; क्लाइंट नई पंक्ति वाले JSON को स्वयं पार्स करता है और अलग नेटवर्क रीड में बँटे chunks भी संभालता है।
इंजन चैट नियंत्रण
इंजन पृष्ठ Markdown, टेबल और syntax-highlighted कोड दिखाता है तथा उत्तर और कोड कॉपी करने देता है। सिस्टम प्रॉम्प्ट और इंजेक्ट किया रनटाइम संदर्भ बंद सत्र का संदर्भ भाग में रहते हैं, उपयोगकर्ता के संदेश नहीं बनते। दिखने वाला तर्क और टूल गतिविधि अलग खुलती हैं; रीलोड के बाद परिणाम सही टूल ऑपरेशन से जुड़े रहते हैं।
कंपोज़र में वास्तविक प्रदाता मॉडल चुनें। सूची लॉगिन प्रशासक के उपलब्ध स्थानीय और प्लगइन मॉडल, उनकी प्रदाता पहचान सहित देती है। Chat के पर्सोना और एजेंट विकल्प मॉडल ID नहीं हैं; उनके निर्देश इंजन वार्तालाप में नहीं जुड़ते। पहले विफल हुए पर्सोना हेडर डिफ़ॉल्ट मॉडल के संकेत नहीं बनते, और सहेजा लॉग नहीं बदलता।
हर सत्र में केवल पढ़ना या कार्यक्षेत्र में लिखना विकल्प है। DSH फ़ाइल नीति और ब्रिज की कैनॉनिकल कार्यक्षेत्र सीमा इन्हें लागू करती है। कंपोज़र दायरा दिखाता है। सेटिंग नेटिव सत्र इवेंट के रूप में सहेजी जाती है और पुनः शुरू होने पर रहती है; जारी टर्न में बदलाव अस्वीकार होता है।
नेटिव अनुमति-वृद्धि अनुरोध संबंधित ऑपरेशन के साथ एक बार अनुमति दें / अस्वीकार करें कार्ड में आता है। मंज़ूरी केवल उस अनुरोध की है, स्थायी अनुमति मोड नहीं बदलती। पुराने या रद्द अनुरोध मंज़ूर नहीं हो सकते; बिना इंटरफ़ेस Chat ऐसे प्रश्न अस्वीकार करता है जिन्हें दिखा नहीं सकता। ब्रिज असीमित होस्ट पहुँच नहीं देता।
अतिरिक्त प्रशासकीय endpoints:
| विधि | पथ | उद्देश्य |
|---|---|---|
GET | /api/cordis/models | उपलब्ध प्रदाता मॉडल और वर्तमान वास्तविक डिफ़ॉल्ट |
PATCH | /api/cordis/sessions/:id/settings | इस सत्र का मॉडल और/या अनुमति मोड तय करना |
POST | /api/cordis/sessions/:id/approvals/:approvalId | एक लंबित अनुरोध पर allowed-once या rejected निर्णय |
Chat में इंजन का उपयोग
पहुँच और नीतियाँ → एजेंट CLI मॉडल और कॉर्डिस इंजन दोनों सक्षम करें। प्रशासक फिर Chat में DeepSeek Harness चुन सकता है। हर अनुरोध को नया अस्थायी इंजन सत्र मिलता है जिसमें उसी Chat अनुरोध की दी हुई बातचीत होती है। सामान्य Chat डेटाबेस प्रामाणिक स्रोत रहता है; असंबंधित वार्तालाप, शाखाएँ और पुनः प्रयास छिपा इंजन इतिहास साझा नहीं करते। पूरा या रद्द होने पर अस्थायी लॉग हट जाता है और इंजन पृष्ठ में नहीं आता।
सामान्य प्रदाता कंपोज़िशन एजेंट समूह में DeepSeek Harness · मॉडल (प्रदाता) विकल्प भी देती है। सहेजे ID इंजन पृष्ठ जैसी प्रदाता रूट समेटते हैं: dsh:lwui:ollama:<model> या dsh:lwui:plugin:<plugin>:<model>, जिनके हिस्से percent-encoded होते हैं। वैकल्पिक स्थानीय नेटिव DSH कनेक्शन उस इंस्टेंस की लाइव सूची से dsh:native:<provider>:<model> जोड़ता है और उसी की सेटिंग व क्रेडेंशियल उपयोग करता है। libre-webui/dsh-native-provider का Apache-2.0 पैकेज स्थापित करें या Libre WebUI वितरण से bundle बनाएँ। दोनों @libre-webui/dsh-native-provider नाम रखते हैं और प्रदाता कुंजियाँ DSH में रहती हैं। एक Unix होस्ट, एक OS खाता और निजी Unix सॉकेट चाहिए। एक ही खाता साझा करने वाले ऐप अलग नहीं होते। केवल मॉडल inference मिलता है, नेटिव एजेंट सत्र या टूल निष्पादन नहीं। स्थापना, प्रोफ़ाइल पुनः प्रारंभ, अपडेट और हटाने के लिए कॉन्फ़िगरेशन गाइड देखें। कनेक्शन या चुना मॉडल न हो तो प्रदाता बदले बिना विफलता मिलती है। नेटिव कॉल प्रदाता उपयोग में मॉडल, रिपोर्ट हुए टोकन, विलंब और परिणाम सहित दिखती हैं। मूल dsh प्रोफ़ाइल चलती कंपोज़िशन का डिफ़ॉल्ट रखती है। कस्टम अडैप्टर केवल मूल प्रोफ़ाइल देते हैं, असमर्थित Libre WebUI प्रदाता बदलाव नहीं दिखाते।
शीर्षक और सोच-सारांश DSH चयन के मूल प्रदाता को सीधे पाठ अनुरोध देते हैं, बिना टूल या एजेंट सत्र के। मूल प्रोफ़ाइल चलती इंजन सेटिंग और ब्रिज पंक्ति के override पढ़ती है, सूची से अनुमान नहीं लगाती। कस्टम अडैप्टर को इन सुविधाओं के लिए स्पष्ट Ollama या प्लगइन टास्क मॉडल चाहिए। चुना प्रदाता अनुपलब्ध हो तो सामान्य त्रुटि या स्थानीय शीर्षक पूर्वावलोकन मिलता है, दूसरे प्रदाता को अनुरोध नहीं जाता।
अनुरोध प्रमाणित प्रशासक की प्रदाता सेटिंग और क्रेडेंशियल इस्तेमाल करता है। दूसरे प्रशासक की जानकारी चुपचाप नहीं चुनी जाती। कॉन्फ़िगर Cordis कार्यक्षेत्र डिफ़ॉल्ट रहता है; Chat उसे सर्वर उपयोगकर्ता के होम से नहीं बदलता।
सैंडबॉक्स में Work
Cordis चालू हो तो Work अलग इंजन विकल्प में Libre WebUI और DeepSeek Harness देता है। मॉडल नाम और प्रदाता पहचान बने रहते हैं। LWUI प्रदाताओं के लिए DSH विकल्प dsh:<model> के रूप में सहेजता है। नेटिव विकल्प में providerType: dsh, सही नेटिव प्रदाता ID और मूल मॉडल ID रहते हैं। सामान्य टूल क्षमता और पहुँच जाँच लागू हैं; नेटिव क्रेडेंशियल के लिए सक्रिय प्रशासक भी ज़रूरी है।
हर रन अलग इन-मेमोरी DSH एजेंट लूप बनाता है। अडैप्टर मौजूदा Work बातचीत, प्रदाता मेटाडेटा, चित्र और टूल स्कीमा लेता है। टूल बॉडी सिर्फ Work के परिणाम की प्रतीक्षा करती है; होस्ट फ़ाइल पढ़ या होस्ट प्रक्रिया शुरू नहीं कर सकती।
आर्ग्युमेंट जाँच, अनुमति माँगना, कार्यक्षेत्र रनटाइम में टूल चलाना, परिणाम और प्रदाता रिप्ले स्टेट SQL में रखना, बजट लागू करना और इवेंट देना Work की ज़िम्मेदारी है। अस्वीकृत टूल सामान्य अस्वीकृति देता है। रद्द करने पर DSH मुक्त होता है और Work की मौजूदा कंटेनर सफ़ाई चलती है। वर्कर बहाल होने पर नया DSH ड्राइवर सहेजा Work संदर्भ लेता है और पूरे हो चुके टूल प्रभाव नहीं दोहराता।
Work एकीकरण को होस्ट इंजन कंपोज़िशन या JSONL सत्र भंडार नहीं चाहिए। यह मौजूदा Docker/Kubernetes रनटाइम और तैनाती नियम, सहित team की साझा persistence आवश्यकताएँ, मानता है।
सुरक्षा सीमा
इंजन पृष्ठ और होस्ट-आधारित Chat एजेंट केवल प्रशासकों के लिए हैं। सिस्टम प्रॉम्प्ट सहित इंजन सत्र साझा प्रशासकीय कंसोल हैं, प्रति-उपयोगकर्ता कार्यक्षेत्र नहीं। सामान्य खाते API से उन्हें पढ़, बना, बदल या रद्द नहीं कर सकते।
साथ आने वाले होस्ट फ़ाइल टूल प्रतीकात्मक लिंक हल करके कैनॉनिकल लक्ष्य के आधार पर पढ़ने और लिखने को तय कार्यक्षेत्र में रोकते हैं। सत्र की बदली कार्य निर्देशिका भी भीतर होनी चाहिए। DSH बदलाव नीति और एकबारगी इंजन अनुमति जारी रहती है। ऑपरेटर के जोड़े प्लगइन विश्वसनीय सर्वर कोड हैं और अतिरिक्त क्षमता दे सकते हैं। इंजन मंज़ूरी Work के अनुमोदन और कंटेनर प्रवाह से अलग है।
Work का DSH ड्राइवर अलग है: वह होस्ट फ़ाइल, shell या persistence प्लगइन माउंट नहीं करता। केवल मौजूदा Work अधिकार और सैंडबॉक्स से चलता है। दूरस्थ प्रदाता स्पष्ट स्वीकृति पर ही उपयोग होते हैं और चुने खाते की कॉन्फ़िगर रूट लेते हैं।