Configurarea Cordis
Motorul integrat folosește două documente și variabile de mediu. Implicit, documentele sunt lângă backend; LIBRE_CORDIS_CONFIG și LIBRE_CORDIS_SETTINGS le mută.
| Document | Proprietar | Formă | Scop |
|---|---|---|---|
cordis.patch.yml | Cordis Loader | Tablou YAML superior | Rândurile care montează motorul |
cordis.config.yml | Gazda Libre WebUI | Mapare YAML | Furnizor, sursa acreditărilor și comutatoare |
Sunt separate deoarece Cordis Include citește compoziția și acceptă numai un tablou la nivel superior. Setările gazdei nu pot sta în același fișier.
Activare
Administratorul activează în Settings → User Management → Access & policies → Cordis Engine. Efectul este imediat: activarea pornește la următoarea cerere, dezactivarea eliberează motorul. Fără restart.
Două surse de implementare pot fixa valoarea; ambele blochează comutatorul în loc să fie suprascrise silențios:
| Sursă | Efect |
|---|---|
LIBRE_CORDIS_ENABLED variabilă de mediu | true/false fixează funcția pentru implementare |
features.enabled în cordis.config.yml | Valoarea explicită fixează; lipsa cheii lasă alegerea administratorului |
Motorul cere și o compoziție. Porniți de la exemplele livrate:
cd backend
cp cordis.patch.example.yml cordis.patch.yml
cp cordis.config.example.yml cordis.config.yml
Gazda citește cordis.patch.yml, îmbină implicitele în rândul punții și scrie <DATA_DIR>/cordis-runtime/cordis.composed.yml. Fișierul generat este înlocuibil și nu se editează; autoritatea este cordis.patch.yml al operatorului.
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
Chei de nivel superior
| Cheie | Tip | Implicit | Semnificație |
|---|---|---|---|
trace | boolean | false | Jurnalizează fiecare tranziție de activare |
model | mapare | – | Selectarea adaptorului; vedeți mai jos |
features | mapare | – | Comutatoare de capacități; vedeți mai jos |
features
| Cheie | Tip | Implicit | Semnificație |
|---|---|---|---|
enabled | boolean | false | Montează motorul; oprit, rutele dau 503. |
streaming | boolean | true | Acceptă ture cu răspuns în flux |
tools | boolean | true | Permite instrumente și expune registrul |
persistence | boolean | true | Activează și cere JSONL; sesiunile rezistă restartului |
features.enabled este singurul comutator necesar pornirii punții. Un enabled de nivel superior nu se citește; toate funcțiile sunt sub features, într-un singur loc.
model
| Cheie | Tip | Implicit | Semnificație |
|---|---|---|---|
provider | șir | libre-webui | libre-webui, deepseek, pi-ai sau none |
apiKeyEnv | șir | OPENAI_API_KEY | Numele variabilei cu cheia |
route | șir | libre-webui | Ruta furnizorului numită în cereri |
model | șir | '' | ID solicitat. Setați-l pentru o rută manuală |
baseUrl | șir | '' | Adresă alternativă; gol folosește implicitul adaptorului |
providers | mapare | {} | Rute declarate manual după nume |
De unde vin modelele motorului
Motorul nu are configurație separată de furnizori. Folosește furnizorii LWUI prin ruta libre-webui înregistrată de libre-webui-llm-adapter. Un model disponibil în Chat este disponibil și motorului: după descărcarea din UI îl vede cu acreditările și endpointul existente.
Setați model.provider: libre-webui, implicitul livrat. Acreditările și endpointurile rămân în setările normale LWUI.
model indică modelul solicitat. Gol înseamnă implicitul aplicației; dacă lipsește, se alege primul model chat raportat, preferând cele locale disponibile. Modelele embedding sunt excluse. Rutele interne păstrează furnizor și model: lwui:ollama:<encoded-model> ori lwui:plugin:<encoded-provider>:<encoded-model>. Numele identice sau căderea Ollama nu redirecționează o cerere locală în exterior. Un furnizor explicit indisponibil eșuează, fără înlocuire ascunsă.
Un model gol este sigur numai pe libre-webui. Ruta unui pachet de furnizor cere model explicit: dsh-llm-pi-ai rezolvă catalogul pentru interogări, dar nu alege automat prima intrare. Ruta manuală fără model refuză tura cu:
provider "<route>" resolves no models; the installed catalog does not describe
this route, so its models must be listed in configuration
Alegeți model din lista models a rutei. Exemplul asociază route: ollama cu model: llama3.2, corespunzător intrării declarate llama3.2.
provider decide pachetul adaptor montat:
libre-webuifolosește stratul furnizorilor implementării; acesta este modul suportat și implicit.nonepornește fără model. Sesiunile și lista instrumentelor funcționează, dar tura nu primește răspuns; util la verificarea compoziției.deepseekșipi-aimontează direct pachete. Nu sunt dependențe ale backendului: toate SDK-urile adăugau 59 de pachete tranzitive, inclusiv depreciate, pentru funcții neutilizate. Instalați pachetul ales și rândul său; gazda numește pachetul lipsă.
O rută are câmpurile:
| Câmp | Semnificație |
|---|---|
displayName | Nume lizibil |
api | Protocol de transport, de exemplu openai-completions |
baseURL | Baza endpointului |
apiKeyEnv | Variabila cu cheia |
models | Lista modelelor; fiecare ia id, name, contextWindow, maxTokens |
Acreditările nu se scriu niciodată în documente. apiKeyEnv numește o variabilă, rezolvată de adaptor per cerere. Rotirea cheii nu cere restart.
cordis.patch.yml
Un tablou superior de intrări Cordis Loader. Exemplul montează nouă rânduri și este punctul de plecare recomandat.
- 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'
Câmpurile intrării
| Câmp | Obligatoriu | Semnificație |
|---|---|---|
id | nu | ID stabil; derivat din name dacă lipsește |
name | da | Specificator importat; trebuie șir literal |
config | nu | Configurația pluginului; permite !!js |
disabled | nu | Sare rândul fără ștergere; permite !!js |
inject | nu | Servicii suplimentare sau configurare intercept |
name se importă direct, nu se evaluează, deci nu poate fi !!js. Valorile config pot folosi !!js, evaluate ulterior în fibra rândului cu contextul Loader. process.env și ctx.get(...) merg, import.meta nu.
Specificatorii relativi se rezolvă față de directorul compoziției. Numele simple prin pachetul backend: @deepseek-ai/dsh-tools găsește copia din backend/node_modules.
Ordinea rândurilor nu controlează încărcarea. Cordis activează când serviciile declarate există; gruparea este doar pentru cititori.
Rânduri obligatorii
Pentru răspunsuri chat sunt necesare toate:
| Rând | Oferă | Cerut de |
|---|---|---|
dsh-llm | llm | bucla agentului |
dsh-session | sessions | buclă agent, punte |
dsh-session-projection | sessionProjections | bucla agentului |
dsh-system-prompt | systemPrompt | instrumente, buclă agent |
dsh-tools | tools | buclă agent, punte |
dsh-agent | agents | punte |
dsh-agent-loop | driver agent | răspunde turelor |
| rândul punții | libreDshEngine | toate rutele |
Pentru rezultate în GET /api/cordis/tools, montați și un plugin de instrumente, de exemplu @deepseek-ai/dsh-fs-sandbox plus @deepseek-ai/dsh-tool-fs. Un registru fără pluginuri este corect gol.
Variabile de mediu
Fiecare setare are o suprascriere de mediu. Variabila câștigă față de document, documentul față de implicitul integrat.
| Variabilă | Suprascrie | Implicit |
|---|---|---|
LIBRE_CORDIS_ENABLED | features.enabled | false |
LIBRE_CORDIS_STREAMING | features.streaming | true |
LIBRE_CORDIS_TOOLS | features.tools | true |
LIBRE_CORDIS_PERSISTENCE | features.persistence | true |
LIBRE_CORDIS_TRACE | trace | false |
LIBRE_CORDIS_MODEL_PROVIDER | model.provider | libre-webui |
LIBRE_CORDIS_MODEL_ROUTE | model.route | libre-webui |
LIBRE_CORDIS_MODEL | model.model | '' |
LIBRE_CORDIS_API_KEY_ENV | model.apiKeyEnv | OPENAI_API_KEY |
LIBRE_CORDIS_BASE_URL | model.baseUrl | '' |
LIBRE_CORDIS_CONFIG | Calea compoziției | <cwd>/cordis.patch.yml |
LIBRE_CORDIS_SETTINGS | Calea setărilor | lângă documentul de compoziție |
LIBRE_CORDIS_WORKSPACE | Spațiul implicit al motorului | <DATA_DIR>/cordis-workspace |
LIBRE_CORDIS_SESSION_STORE | Directorul sesiunilor persistente | <DATA_DIR>/cordis-sessions |
Booleenii acceptă 1/true/yes/on și 0/false/no/off. O valoare neinterpretabilă revine la document, fără presupuneri.
Expresiile !!js livrate citesc și LIBRE_CORDIS_SESSION_STORE și LIBRE_CORDIS_WORKSPACE; gazda le exportă înainte de montare.
Exemple practice
Ollama locală, complet offline
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 ignoră cheia, dar clientul OpenAI cere una. Exportați OLLAMA_API_KEY=ollama, fără a inventa un secret. Nimic nu părăsește mașina.
Un gateway compatibil 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 oficial
features:
enabled: true
model:
provider: deepseek
route: deepseek
apiKeyEnv: DEEPSEEK_API_KEY
Setați DEEPSEEK_API_KEY în mediul backendului.
Fără furnizor, numai instrumente
features:
enabled: true
model:
provider: none
Motorul pornește, sesiunile se creează și GET /api/cordis/tools listează pluginurile. Mesajul eșuează fiindcă nu există adaptor pentru cerere.
Note de migrare
Puntea adaugă funcționalitate. Când este oprită, ca implicit, comportamentul existent nu se schimbă.
Actualizarea implementării. Nu trebuie făcut nimic. cordis.patch.example.yml și cordis.config.example.yml nu sunt citite până la copiere și activare. Nu rulează migrare, nu se creează tabel și nu se atinge director existent de date.
Prima activare. Copiați exemplele, setați features.enabled: true; pachetele sunt deja dependențe backend. Prima cerere creează <DATA_DIR>/cordis-workspace, <DATA_DIR>/cordis-sessions și <DATA_DIR>/cordis-runtime, directoare noi sub datele existente, acoperite de backupul/restaurarea acelui director.
Actualizarea motorului. Versiunile rezolvate sunt în package-lock.json; backend/package.json declară intervale compatibile alpha. Actualizați intenționat și validați contractele după npm install. O nouă dependență peer se anunță la instalare, nu la montare. Formatele de model/sesiune aparțin DSH; schimbarea lor ține de notele DSH, nu de migrarea LWUI.
Revenire. Setați features.enabled: false și reporniți, ori scoateți rândul din cordis.patch.yml. libreDshEngine și listenerul se retrag, agenții se eliberează. Sesiunile rămân ca date; ștergeți sessionStorePath pentru spațiu. Dezinstalarea pachetelor este opțională și nu afectează restul LWUI.
Chat și Work existente. Chat primește DSH numai pentru administratori cu sesiuni temporare și transcriere existentă. Work primește un motor separat, driver izolat și sandboxul/aprobările curente. Modelele anterioare își păstrează comportamentul.
Cu libre-webui, Agents din Chat conține selecții DSH furnizor-model și profilul de bază. Selecțiile păstrează identitatea calificată; baza folosește implicitul compoziției active. Titlurile și rezumatele cheamă furnizorul direct, fără instrumente. Adaptoarele personalizate oferă doar baza și necesită separat model de sarcini Ollama sau plugin pentru acestea.
DSH respectă comutatorul Ollama. Oprit, modelele nu sunt listate sau probate; alegerea explicită eșuează fără alt furnizor. Numele necalificate fixate de operator cer și ele catalogul Ollama pentru rezolvare sigură; pentru instalare numai cu pluginuri folosiți lwui:plugin:<plugin>:<model>.
Granițe operaționale
- Engine gazdă și Chat sunt numai pentru administratori și solo. Pagina este consolă comună cu JSONL local, imposibil de montat în team. Work folosește depozitele SQL existente.
- Modelul folosește apelantul autentificat. Tura interactivă folosește acreditările și preferința sa. O compoziție neinteractivă de încredere poate seta explicit
LIBRE_CORDIS_USERla un administrator activ. Nu există alegerea implicită a celui mai vechi administrator. - Fișierele gazdei sunt limitate la workspace. Citirea/scrierea verifică ținta canonică; directorul sesiunii nu poate ieși din rădăcină. Restricțiile DSH rămân. Pluginurile operatorului sunt cod server de încredere.
- Instrumentele gazdei folosesc politica DSH. Engine oferă moduri citire/scriere și aprobări native unice fără a ocoli limita. Chat headless refuză întrebări imposibil de afișat. Work folosește aprobările și containerele sale, fără unelte de fișiere gazdă.
- Fluxurile conțin text viu și raționament expus. Mesajele durabile păstrează conversația finală, fără a transmite textul a doua oară.
- Restartul și ștergerea folosesc sesiuni salvate. Sesiunile goale și complete rezistă restartului. Ștergerea JSONL oprește scriitorul și elimină artefactul; alte stocări cer adaptor de ștergere.
- Logurile vechi invalide cer reparație explicită. Mesajele vechi fără ID sunt refuzate de cititorul strict, nu eliminate. Vezi Depanare.
- Titlurile se derivă local. Primul mesaj uman devine titlu scurt; o sesiune goală nu are titlu derivat.
Conectarea modelelor unei instanțe DSH active
Pluginul opțional dsh-native-provider expune modelele și conexiunile altei instanțe configurate, precum aplicația locală de pe portul 3080. Instalați-l în profilul existent. Apelează doar ctx.llm: cheile rămân în DSH; nu creează sesiuni, nu pornește agenți, nu citește atașamente native și nu execută instrumente native.
Procesele trebuie să folosească aceeași gazdă Unix și același cont OS. Socketul Unix explicit are director fizic deținut de cont, cu 0700, și socket 0600. Nu adaugă listener TCP și nu reutilizează sau slăbește autentificarea browserului DSH. Windows și gazde DSH la distanță nu sunt suportate.
Contul OS este limita locală: alte procese ale lui pot folosi socketul. Nu sunt acreditări native separate sau izolare între aplicațiile acelui cont.
Instalarea pluginului separat
În DSH → Plugins → Add plugin, lipiți URL-ul public în Package name or address, apoi Install:
https://github.com/libre-webui/dsh-native-provider
Activați componenta când se cere. Pachetul 0.1.1 Apache-2.0 include runtime construit și patch bundle. Nu necesită build local, scripturi de instalare ori dependențe runtime npm. Numele @libre-webui/dsh-native-provider nu este publicat pe npm; folosiți URL-ul GitHub.
Bundle-ul alege <DSH home>/lwui-provider/llm.sock, normal $HOME/.dsh/lwui-provider/llm.sock; DSH_HOME are prioritate. Directorul privat este creat dacă lipsește. Folosiți o singură punte activă per DSH home sau suprascrieți socketul în cordis.patch.yml al profilului pentru profile suplimentare. Calea completă trebuie să încapă în 100 de octeți UTF-8, fără legături simbolice. Ghidul separat explică suprascrierile.
Echivalentul CLI opțional:
dsh plugin --profile web add https://github.com/libre-webui/dsh-native-provider
Înlocuiți web cu profilul activ. Reporniți după instalarea CLI; instalarea UI poate activa imediat. Respectați mesajele de restart DSH. Nu modificați sursele DSH și nu copiați chei.
Pregătirea unui bundle din Libre WebUI
LWUI include un script de pregătire. Din checkout sursă, construiți backendul și un director de ieșire nou:
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
Distribuțiile npm conțin backendul construit și scriptul; rulați ultimele două comenzi din instalare fără build. Reporniți profilul ales. Ambele metode refuză directoare existente și includ metadata, licență și note de instalare.
Conectarea Libre WebUI
Indicați același socket absolut în cordis.config.yml. Pentru implicitul public, înlocuiți /absolute/home cu directorul personal real:
nativeProvider:
socketPath: /absolute/home/.dsh/lwui-provider/llm.sock
Alternativ setați LIBRE_DSH_PROVIDER_SOCKET. O valoare goală oprește conexiunea chiar dacă documentul are o cale. Activați Cordis Engine. Administratorii activi pot alege modele native în motorul DeepSeek Harness Work, pagina Engine și Agents din Chat, unde mai trebuie Agent CLI models. Work păstrează modelul brut și ID-ul cu providerType: dsh; sarcinile LWUI existente păstrează furnizorul și marcajul motorului.
Catalogul este citit live. Modificări de furnizor sau acreditări invalidează generația și anulează cererile active. Socketul, modelul ori furnizorul indisponibil oprește cererea, fără Ollama sau alt fallback. Titlurile și rezumatele apelează direct LLM-ul, fără instrumente. Conexiunea acceptă inițial text, raționament și mesaje de instrumente; referințele native de imagini/fișiere sunt respinse.
Acreditările aparțin operatorului DSH, deci conexiunea este doar pentru administratori chiar dacă Work are acces mai larg. Cererile pot ieși din gazdă conform furnizorului DSH; Work arată avertismentul. În team, fiecare worker trebuie să poată accesa conexiunea locală; lipsa ei blochează execuția. Dezactivarea Cordis sau eliminarea socketului retrage accesul, păstrând sarcinile. Dacă DSH cade și lasă socketul, opriți instanța proprietară și eliminați doar socketul învechit înainte de restart; pluginul refuză înlocuirea unei intrări existente.
Actualizarea sau eliminarea pluginului
Încheiați ori anulați cererile înainte de modificare. Înlocuiți bundle-ul local 0.0.0/0.1.0 prin Uninstall, revenire la Add plugin și URL-ul GitHub. Păstrați o cale personalizată prin suprascrierea suportată a profilului utilizatorului. Sesiunile și acreditările native rămân.
Instalarea GitHub se poate actualiza prin CLI:
dsh plugin --profile web update @libre-webui/dsh-native-provider
Reporniți și verificați versiunea. Pluginul anterior oprit rămâne oprit; verificați înainte de test. Pentru fixare sau revenire folosiți github:libre-webui/dsh-native-provider#<commit>. Pentru bundle local propriu construiți alt director și adăugați-l; actualizarea unei dependențe locale nu descarcă GitHub.
Pentru eliminare, întâi ștergeți nativeProvider.socketPath din LWUI sau goliți LIBRE_DSH_PROVIDER_SOCKET, apoi:
dsh plugin --profile web remove @libre-webui/dsh-native-provider
Reporniți profilul. Sarcinile LWUI rămân, dar cererile native eșuează până la restaurarea aceleiași conexiuni explicite. Pluginul nu șterge furnizorii sau acreditările DSH. Eliminați directoarele bundle vechi numai după dezinstalarea lor.
Utilizarea furnizorului nativ
Cererile apar în Provider Usage sub DeepSeek Harness · provider, cu model brut. Fiecare cerere reală se numără o dată, inclusiv runde de instrumente, titluri și rezumate. Panoul arată succese, erori, anulări, latență și tokenurile DSH. Intrarea cache se include o dată; lipsa utilizării rămâne nemăsurată, nu estimată. ID-urile dsh-native:<percent-encoded-native-provider-id> folosesc tarifele și regulile existente. Tariful necunoscut rămâne neevaluat.
DSH prin furnizori LWUI păstrează înregistrările lor. Catalogul și cererile respinse înainte de inferență nu creează apeluri suplimentare. Măsurarea începe la instalarea versiunii, nu inventează istoric. Se salvează identitate, status, timp și contoare, fără prompturi, răspunsuri, acreditări, endpointuri sau erori text ale furnizorului.
Verificarea configurației
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 cu code: CORDIS_UNAVAILABLE înseamnă compoziție neîncărcată. error arată cauza; LIBRE_CORDIS_TRACE=true adaugă logul Cordis. Vedeți Depanare pentru cauzele comune.