Ugrás a fő tartalomra

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ésCé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:

ÁllapotJelentésOk
pendingNincs regisztrálva a kontextusbanA szolgáltató sor nem aktív vagy letiltott
readyRegisztrált és használhatóA szolgáltató sor aktív
failedDeklarált, de használhatatlandetail 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-tools igényli a systemPrompt szolgáltatást.
  • A dsh-agent-loop megvárja az agents, sessions, llm, tools, systemPrompt és sessionProjections szolgá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/event feliratkozá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ÚtvonalCél
GET/api/cordis/healthHídállapot; hitelesítés nélkül
GET/api/cordis/sessionsMunkamenetek listája
POST/api/cordis/sessionsMunkamenet létrehozása
GET/api/cordis/sessions/:idMunkamenet és üzenetek olvasása
DELETE/api/cordis/sessions/:idMunkamenet lezárása
POST/api/cordis/sessions/:id/messagesÜzenetküldés és NDJSON-stream
POST/api/cordis/sessions/:id/cancelAktív forduló megszakítása
GET/api/cordis/agentsAktív ágensek listája
GET/api/cordis/toolsRegisztrá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.

A Cordis Engine oldala munkamenetlistával, eszközökkel és streamelt beszélgetéssel.

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ÚtvonalCél
GET/api/cordis/modelsElérhető modellek és a jelenlegi valódi alapmodell
PATCH/api/cordis/sessions/:id/settingsMunkamenetmodell vagy jogosultság beállítása
POST/api/cordis/sessions/:id/approvals/:approvalIdDö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.