Cordis-híd
A híd a DeepSeek Harness (DSH) motort a Libre WebUI backendjébe építi. A DSH az LWUI által üzemeltetett Cordis futtatókörnyezet pluginfája, így a képességek importált modulok helyett Cordis-szolgáltatásként érkeznek.
A híd alapértelmezetten ki van kapcsolva. Az itt leírtak csak operátori engedélyezés után történnek; lásd a Cordis-konfigurációt.
Miért híd a közvetlen integráció helyett
A DSH-csomagok közvetlen importja rövidebb, de rosszabb lenne: fordításkori függőséggé tenné a motort. Az adapter, ágensciklus cseréje vagy a motor eltávolítása LWUI-módosítást és újratelepítést igényelne.
A híd megfordítja a függőséget. Az LWUI egy absztrakt szerződésre támaszkodik; a Cordis-kompozíció választja a megvalósítást:
- Más cél újraépítés nélkül. A YAML-kompozícióban a szolgáltatóváltás konfigurációmódosítás.
- Képességek konfigurálása. Minden képesség Loader-sor; az operátori módosítás a következő gazdainduláskor hat.
- Tiszta eltávolítás. A gyökérfiber birtokol minden szolgáltatást, figyelőt és hatást. Felszabadítása mindent visszavon, az LWUI újraindítása nélkül.
Rétegek
A konkrét DSH-függőségek a backend/src/cordis/dsh/ alatt maradnak. Az útvonalak és alkalmazásszolgáltatások a hídszerződést használják. A Work-meghajtó külön memóriabeli kompozíció, gazdaoldali fájlplugin nélkül.
Szerződések
A szerződés a backend/src/cordis/contracts.ts fájlban csak az API számára szükséges adatokat írja le, belső motorfogalmak nélkül.
| Szerződés | Cél |
|---|---|
DshEngine.status() | Szolgáltatások életciklusállapota (pending / ready / failed) |
DshEngine.modelConfiguration() | Futó kompozíció alapmodellje és szolgáltatója |
DshEngine.listSessions() | Munkamenetösszefoglalók, legújabb elöl |
DshEngine.getSession(id) | Egy munkamenet vetített üzenetekkel |
DshEngine.createSession(opts) | ID és munkakönyvtár lefoglalása |
DshEngine.updateSessionSettings(id, settings) | Valódi modell és natív fájljogosultság mentése üresjáratban |
DshEngine.decideApproval(id, approvalId, decision) | A munkamenethez tartozó natív jóváhagyás eldöntése |
DshEngine.deleteSession(id) | Munkamenet lezárása és ágens felszabadítása |
DshEngine.listAgents() | Aktív fő- és gyermekágensek |
DshEngine.listTools() | Modell által látható regisztrált eszközök |
DshEngine.sendMessage(id, txt) | Forduló indítása, streamhandle visszaadása |
DshEngine.cancel(id) | Aktív forduló megszakítása |
Cordis-szolgáltatásként, libreDshEngine néven jelenik meg. A fogyasztó ctx.get('libreDshEngine') hívással olvassa, nem importálja a hídmodult.
Az EngineStreamChunk tartalma text, reasoning, tool-call, tool-result, approval-request, approval-decision, error és done. Az élő keretek tulajdonos ágensükhöz és munkamenetükhöz jutnak; a megfelelő tartós üzenet nem jelenik meg másodszor. A sendMessage handle-jének subscribe metódusa a már kibocsátott adatot is visszajátssza, így a gyors első token nem vész el a HTTP-figyelő csatlakozásáig.
Egy chatforduló menete
NDJSON használatos WebSocket helyett, mert a forduló a kérés után egyetlen szerver–kliens sorozat. A POST megtartása elkerül egy második kézfogást, ticketet és újracsatlakozási protokollt, és a fordulót egy hitelesített kérésben tartja.
DONE és PENDING
Cordis a deklarált szolgáltatások meglétekor aktiválja a plugint, ezért a sor futás előtti állapotokban is lehet. A következő fogalmak összekeverése gyakran néma motort eredményez.
Loader-bejegyzés állapota. A sor PENDING → LOADING → ACTIVE vagy FAILED állapotba jut. Hiányzó szolgáltatáskor hiba helyett korlátlanul vár, így a hiányos kompozíció elindulhat anélkül, hogy bármit kiszolgálna.
Szolgáltatáselérhetőség. A gazda az elvárt szolgáltatásokat így jelzi:
| Állapot | Jelentés | Ok |
|---|---|---|
pending | Nincs regisztrálva a kontextusban | A szolgáltató sor nem aktív vagy letiltott |
ready | Regisztrált és használható | A szolgáltató sor aktív |
failed | Deklarált, de használhatatlan | detail szöveggel jelentve |
A host.status() az elérhetőséget és hiányzó kötelező elemeket mutatja; a GET /api/cordis/health ugyanezt közli. Kötelező szolgáltatás nélkül az indulás hibázik, nem üres listás motor jelenik meg.
Két gyakran elrontott függőségi lánc:
- A
dsh-toolsigényli asystemPromptszolgáltatást. - A
dsh-agent-loopmegvárja azagents,sessions,llm,tools,systemPromptéssessionProjectionsszolgáltatásokat.
Bármelyik hiányakor működhet a munkamenettároló, de a motor nem válaszol üzenetre.
Szolgáltatókonfiguráció
A mellékelt libre-webui-llm-adapter az LWUI konfigurált szolgáltatóit használja. Az Engine munkamenetmodell-választója nem helyettesíti ezt a sort.
A kompozíció módosítása a következő gazdainduláskor érvényes. Indítsa újra a backendet, vagy zárolatlan kapcsolónál kapcsolja ki és be a Cordist. A tartós munkamenetek a tárolóban maradnak, és az aktuális kompozícióval folytatódnak.
Megbízható integrációs kód közvetlenül használhat Loader-életciklus-API-kat. A híd nem ad adaptercsere-endpointot, és hibás helyettesítő után nem állítja automatikusan vissza a korábbit.
Visszavonás
A gyökérfiber felszabadítása mindent eltávolít, amit a motor telepített. A tulajdonosi kapcsolat a teljes garancia:
- A pluginok szolgáltatásai a fiberrel visszavonódnak.
- A
session/eventfeliratkozás a híd konstruktorában történik, és annak sorfiberéhez tartozik. - A híd nyilvántartja az ágenshandle-öket, és takarításkor felszabadítja őket.
- A gazda felszabadítja az összes sort birtokló gyökérkontextust.
A stopCordisHost() idempotens, és a backend leállításának része, így az időzítők és fájlhandle-ök felszabadulnak, nem csak a folyamat kilépésére várnak.
Munkamenetazonosság és tartósság
Az Engine létrehozáskor átlátszatlan ID-t foglal. Bekapcsolt tárolásnál a fejléc azonnal mentődik, ezért üres munkamenet is túléli az újraindítást. A híd aktív és mentett munkameneteket listáz, validált DSH-API-val olvas naplókat, és ugyanazon ID-n folytatja az ágenst. Az új felhasználói üzenetek a DSH azonosítós konstruktorát használják.
Törléskor előbb megszakad és felszabadul az ágens, utána tűnik el az állománya. A helyi JSONL-adapter ellenőrzi a tároló- és munkamenetutakat, elutasítja a symlinkeket. Törlés nélküli egyedi backend hibát ad, nem állítja, hogy eltűnt az adat.
A megszakítás az ágenshez, modellkéréshez és eszközökhöz is eljut. A kliens bontása megszakítja a fordulót; kész üzenetek olvashatók maradnak. A korlátozott streambuffer megőrzi az olvasó csatlakozása előtti gyors választ.
A gazdamotor egyreplikás solo funkció. Team telepítés nem töltheti be helyi JSONL-runtime-ját. A sandboxolt Work a meglévő SQL feladat-, futás-, üzenet-, jóváhagyás- és eseménytárolókat használja.
HTTP-felület
| Metódus | Útvonal | Cél |
|---|---|---|
GET | /api/cordis/health | Hídállapot; hitelesítés nélkül |
GET | /api/cordis/sessions | Munkamenetek listája |
POST | /api/cordis/sessions | Munkamenet létrehozása |
GET | /api/cordis/sessions/:id | Munkamenet és üzenetek olvasása |
DELETE | /api/cordis/sessions/:id | Munkamenet lezárása |
POST | /api/cordis/sessions/:id/messages | Üzenetküldés és NDJSON-stream |
POST | /api/cordis/sessions/:id/cancel | Aktív forduló megszakítása |
GET | /api/cordis/agents | Aktív ágensek listája |
GET | /api/cordis/tools | Regisztrált eszközök listája |
A /health kivételével minden útvonal hitelesített adminisztrátori munkamenetet kér. Amíg a híd nem szolgálhat ki, 503 és CORDIS_DISABLED, CORDIS_STARTING vagy CORDIS_UNAVAILABLE értékű code érkezik.

Az oldal frontend/src/pages/CordisPage.tsx, az oldalsávból /cordis címen nyílik. Munkameneteket és eszközöket mutat, munkamenetet készít és a beszélgetésbe streamel. Kikapcsoláskor vagy indulási hibánál az okot adja, nem üres listát, mert „nincs munkamenet” és „nincs motor” másként azonosnak látszana.
A böngészőkliens frontend/src/utils/api/cordisApi.ts. Csak ezt az API-t használja, backendtípusok és @deepseek-ai/* import nélkül, így a motor frontendmódosítás nélkül cserélhető. A sendMessage(sessionId, text, { onChunk }) olvassa a fordulót; a kliens soronként dolgozza fel a JSON-t és kezeli a hálózati olvasások közt elvágott kereteket.
Engine-chat vezérlők
Az oldal Markdown-t, táblázatot és színezett kódot jelenít meg válasz- és kódmásolással. A rendszerprompt és injektált környezet a csukott Session context alatt van, nem felhasználói üzenetként. A látható gondolkodás és eszközaktivitás külön nyitható; az eredmények újratöltés után is a megfelelő művelethez tartoznak.
Valódi szolgáltatói modellt válasszon az adminisztrátor elérhető helyi és pluginmodelljeiből, szolgáltatóazonossággal együtt. A Chat perszonái és ágensei nem modell-ID-k, és nem szúrják utasításaikat Engine-beszélgetésbe. A régi hibás perszonamodellek fejléce alapértékként figyelmen kívül marad, a napló átírása nélkül.
Minden munkamenet Read-only vagy Workspace write módú, DSH-fájlpolitika és kanonikus munkatérhatár mellett. A composer mutatja a hatókört. A beállítások natív eseményként mentődnek, túlélik az újraindítást; aktív forduló alatt nem módosíthatók.
A natív jogkérés a műveletnél Allow once / Deny kártyát ad. Csak az adott kérésre érvényes, a tartós mód nem változik. Elavult vagy megszakított kérés nem hagyható jóvá; a headless Chat elutasítja a nem megjeleníthető kérdéseket. A híd nem ad korlátlan gazdaelérést.
További adminisztrátori endpointok:
| Metódus | Útvonal | Cél |
|---|---|---|
GET | /api/cordis/models | Elérhető modellek és a jelenlegi valódi alapmodell |
PATCH | /api/cordis/sessions/:id/settings | Munkamenetmodell vagy jogosultság beállítása |
POST | /api/cordis/sessions/:id/approvals/:approvalId | Döntés allowed-once vagy rejected értékkel |
A motor használata Chatben
Engedélyezze az Access & policies → Agent CLI models és Cordis Engine funkciót. Az adminisztrátor a Chatben DeepSeek Harness modellt választhat. Minden kérés új átmeneti motormunkamenetet kap a megadott beszélgetéssel. A Chat-adatbázis marad mérvadó; külön beszélgetés, elágazás vagy újrapróbálkozás nem oszt rejtett előzményt. A log befejezéskor/megszakításkor törlődik, az Engine oldalon nem látszik.
Az alapkompozíció DeepSeek Harness · model (provider) választásokat is kínál az Agents csoportban. Mentett ID-jük az Engine minősített útvonalait csomagolja: dsh:lwui:ollama:<model> vagy dsh:lwui:plugin:<plugin>:<model>, összetevőnként százalékkódolva. Az opcionális helyi natív DSH-kapcsolat dsh:native:<provider>:<model> választásokat ad az élő katalógusból, a natív beállítások és hitelesítő adatok felhasználásával.
Telepítse az Apache-2.0 csomagot a libre-webui/dsh-native-provider repóból, vagy készítsen bundle-t LWUI-ból. Mindkettő @libre-webui/dsh-native-provider nevet használ, és DSH-ban tartja a kulcsokat. Azonos Unix-gazda és OS-fiók kell privát Unix-sockettel; azonos fiók alkalmazásai nem szigetelődnek el. Csak inferencia érhető el, natív ágensmunkamenet és eszközfuttatás nélkül. Telepítés, profilújraindítás, frissítés és eltávolítás a konfigurációs útmutatóban található. Hiányzó kapcsolat vagy modell másik szolgáltatóra váltás nélkül hibázik. A natív hívás a Provider Usage oldalon modell, token, késleltetés és eredmény adatokkal látszik.
Az alap dsh profil a futó kompozíció alapmodelljét tartja meg. Egyedi adapter csak ezt a profilt kínálja, nem hirdet támogatás nélküli LWUI-szolgáltatócserét.
Címek és gondolkodási összefoglalók közvetlenül a DSH mögötti szolgáltatót kérik, ágensmunkamenet és eszközök nélkül. Az alap a futó motor értékeit, a hídsor felülírásait is olvassa, nem katalógusból találgat. Egyedi adapterhez külön Ollama- vagy plugin-feladatmodell kell. Nem elérhető szolgáltató szokásos hibát vagy helyi címelőnézetet ad, nem más szolgáltatóhoz intézett kérést.
A hitelesített adminisztrátor adatai és beállításai használódnak; más adminisztrátoréi nem választódnak implicit módon. A beállított Cordis-munkatér marad alapértelmezett, a Chat nem cseréli a szerverfelhasználó saját könyvtárára.
Sandboxolt Work
Engedélyezett Cordisnál a Work külön Engine vezérlőt ad Libre WebUI és DeepSeek Harness választással. A modellek és szolgáltatók neve megmarad. LWUI-szolgáltatónál dsh:<model> tárolódik; natív esetben providerType: dsh, pontos szolgáltató-ID és nyers modell-ID. A szokásos eszköz- és hozzáférésellenőrzés megmarad; a natív adatok aktív adminisztrátort is kérnek.
Minden futás külön memóriabeli DSH-ágensciklust készít. Adaptere megkapja az aktuális Work-beszélgetést, metaadatokat, képeket és eszközsémákat. Az eszköztörzsek csak Work-eredményre várnak; nem olvasnak gazdafájlt és nem indítanak gazdafolyamatot.
A Work validálja az argumentumokat, jóváhagyást kér, munkatér-runtime-ban futtat, eredményt és szolgáltatói replay-állapotot ír SQL-be, budgetet tartat be és eseményt küld. Tiltott eszköz a normál tiltási eredményt adja. Megszakítás felszabadítja DSH-t és követi a Work konténertakarítását. Worker-helyreállításkor új meghajtó kapja a visszaállított kontextust, lezárt mellékhatások megismétlése nélkül.
Gazdamotor-kompozíció és JSONL nem kell. A Work Docker/Kubernetes- és telepítési szabályai érvényesek, a team megosztott tárolási követelményeivel együtt.
Biztonsági határ
Az Engine oldal és gazdaoldali Chat-ágens csak adminisztrátoroknak való. A munkamenet közös adminisztrátori konzol a rendszerpromptokkal együtt, nem felhasználónkénti tér. Normál fiók API-n keresztül sem olvashatja, hozhatja létre, módosíthatja vagy szakíthatja meg.
A mellékelt fájleszközök kanonikus utak és symlinkfeloldás szerint a beállított térre korlátozzák az olvasást/írást. Munkamenet-könyvtárnak is ezen belül kell maradnia. A DSH módosítási politikája és egyszeri Engine-jóváhagyás érvényes. Az operátori plugin megbízható szerverkód, amely további képességeket adhat. Az Engine engedélyezése különálló a Work jóváhagyási és konténerfuttatási folyamatától.
A Work-meghajtó külön működik: nincs gazdafájl-, shell- vagy tárolópluginja, csak a Work meglévő jogosultsága és sandboxa útján hajthat végre. Távoli modellek külön engedélyezettek, a kiválasztott fiók beállított szolgáltatói útvonalával.