Sari la conținutul principal

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ă.

DocumentProprietarFormăScop
cordis.patch.ymlCordis LoaderTablou YAML superiorRândurile care montează motorul
cordis.config.ymlGazda Libre WebUIMapare YAMLFurnizor, 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

Comutatorul Cordis Engine din Settings, lângă opțiunea Agents.

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 mediutrue/false fixează funcția pentru implementare
features.enabled în cordis.config.ymlValoarea 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

CheieTipImplicitSemnificație
tracebooleanfalseJurnalizează fiecare tranziție de activare
modelmapareSelectarea adaptorului; vedeți mai jos
featuresmapareComutatoare de capacități; vedeți mai jos

features

CheieTipImplicitSemnificație
enabledbooleanfalseMontează motorul; oprit, rutele dau 503.
streamingbooleantrueAcceptă ture cu răspuns în flux
toolsbooleantruePermite instrumente și expune registrul
persistencebooleantrueActivează ș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

CheieTipImplicitSemnificație
providerșirlibre-webuilibre-webui, deepseek, pi-ai sau none
apiKeyEnvșirOPENAI_API_KEYNumele variabilei cu cheia
routeșirlibre-webuiRuta furnizorului numită în cereri
modelșir''ID solicitat. Setați-l pentru o rută manuală
baseUrlșir''Adresă alternativă; gol folosește implicitul adaptorului
providersmapare{}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-webui folosește stratul furnizorilor implementării; acesta este modul suportat și implicit.
  • none pornește fără model. Sesiunile și lista instrumentelor funcționează, dar tura nu primește răspuns; util la verificarea compoziției.
  • deepseek și pi-ai montează 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âmpSemnificație
displayNameNume lizibil
apiProtocol de transport, de exemplu openai-completions
baseURLBaza endpointului
apiKeyEnvVariabila cu cheia
modelsLista 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âmpObligatoriuSemnificație
idnuID stabil; derivat din name dacă lipsește
namedaSpecificator importat; trebuie șir literal
confignuConfigurația pluginului; permite !!js
disablednuSare rândul fără ștergere; permite !!js
injectnuServicii 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ândOferăCerut de
dsh-llmllmbucla agentului
dsh-sessionsessionsbuclă agent, punte
dsh-session-projectionsessionProjectionsbucla agentului
dsh-system-promptsystemPromptinstrumente, buclă agent
dsh-toolstoolsbuclă agent, punte
dsh-agentagentspunte
dsh-agent-loopdriver agentrăspunde turelor
rândul punțiilibreDshEnginetoate 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ăSuprascrieImplicit
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_CONFIGCalea compoziției<cwd>/cordis.patch.yml
LIBRE_CORDIS_SETTINGSCalea setărilorlângă documentul de compoziție
LIBRE_CORDIS_WORKSPACESpațiul implicit al motorului<DATA_DIR>/cordis-workspace
LIBRE_CORDIS_SESSION_STOREDirectorul 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_USER la 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.