Configuración de Cordis
El motor Cordis/DSH integrado se configura mediante dos documentos y un conjunto de variables de entorno. Ambos documentos se encuentran junto al backend de forma predeterminada; LIBRE_CORDIS_CONFIG y LIBRE_CORDIS_SETTINGS permiten cambiar su ubicación.
| Documento | Responsable | Estructura | Finalidad |
|---|---|---|---|
cordis.patch.yml | Cargador Cordis | Array YAML de nivel superior | Entradas de plugins que montan el motor |
cordis.config.yml | Host Libre WebUI | Mapa YAML | Proveedor, origen de credenciales e interruptores de funciones |
Se necesitan dos documentos porque el portador del árbol Cordis Include lee la composición y rechaza cualquier archivo que no sea un array de nivel superior. Por ello, los ajustes del host no pueden compartir ese archivo.
Activación
Un administrador activa el motor en Configuración → Gestión de usuarios → Acceso y políticas → Motor Cordis. El cambio se aplica de inmediato: activarlo inicia el motor en su siguiente solicitud y desactivarlo lo libera. No requiere reiniciar.
Dos fuentes del despliegue pueden fijar el valor. Ambas deshabilitan el interruptor en lugar de ser anuladas silenciosamente:
| Fuente | Efecto |
|---|---|
Variable de entorno LIBRE_CORDIS_ENABLED | true/false fija la función para el despliegue |
features.enabled en cordis.config.yml | Un valor explícito lo fija; omitir la clave deja la decisión al administrador |
El motor también necesita una composición. Parte de los ejemplos incluidos:
cd backend
cp cordis.patch.example.yml cordis.patch.yml
cp cordis.config.example.yml cordis.config.yml
El host lee cordis.patch.yml, combina sus valores predeterminados con la entrada del puente y escribe el resultado en <DATA_DIR>/cordis-runtime/cordis.composed.yml. Ese archivo generado es desechable y no debe editarse: el documento de referencia es el cordis.patch.yml del operador.
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
Claves de nivel superior
| Clave | Tipo | Predeterminado | Significado |
|---|---|---|---|
trace | booleano | false | Registrar cada transición de activación de Cordis |
model | mapa | – | Selección del adaptador de modelo; véase más abajo |
features | mapa | – | Interruptores de capacidades; véase más abajo |
features
| Clave | Tipo | Predeterminado | Significado |
|---|---|---|---|
enabled | booleano | false | Montar el motor. Cuando es falso, todas las rutas devuelven 503. |
streaming | booleano | true | Aceptar turnos que transmiten la salida del modelo |
tools | booleano | true | Permitir herramientas del motor y exponer su registro |
persistence | booleano | true | Activar la persistencia JSONL y exigir su servicio; las sesiones sobreviven al reinicio |
features.enabled es el único interruptor que debe establecerse para activar el puente. No se lee una clave enabled de nivel superior; mantener todos los interruptores dentro de features concentra en un lugar lo que está activado.
model
| Clave | Tipo | Predeterminado | Significado |
|---|---|---|---|
provider | cadena | libre-webui | libre-webui, deepseek, pi-ai o none |
apiKeyEnv | cadena | OPENAI_API_KEY | Nombre de la variable de entorno que contiene la clave |
route | cadena | libre-webui | Ruta de proveedor que nombra el motor en las solicitudes |
model | cadena | '' | Identificador del modelo solicitado. Establécelo para una ruta declarada manualmente |
baseUrl | cadena | '' | Endpoint alternativo; vacío utiliza el predeterminado del adaptador |
providers | mapa | {} | Rutas de proveedores declaradas manualmente, indexadas por nombre |
De dónde proceden los modelos del motor
El motor no tiene una configuración de proveedores propia. Llama a los que ya existen en Libre WebUI mediante la ruta libre-webui registrada por la entrada libre-webui-llm-adapter. Los modelos con los que puedes conversar en la interfaz son los que puede usar el motor: descarga uno en la interfaz y el motor lo verá, con las credenciales y el endpoint ya configurados.
Establece model.provider: libre-webui para usarlo. Es el valor predeterminado incluido; las credenciales y endpoints permanecen en los ajustes existentes de Libre WebUI.
model indica el modelo solicitado por el motor. Vacío significa «usar el modelo predeterminado de la aplicación». Si el despliegue no tiene uno, el motor toma el primer modelo de chat comunicado por la capa de proveedores, priorizando los modelos locales disponibles. Se excluyen los modelos de embeddings. Las rutas seleccionadas internamente conservan proveedor y modelo: lwui:ollama:<encoded-model> o lwui:plugin:<encoded-provider>:<encoded-model>. Esto evita que nombres coincidentes o una caída de Ollama redirijan una solicitud local hacia un proveedor remoto. Una selección explícita de proveedor falla si no está disponible; nunca cambia silenciosamente a otro.
Un model vacío solo es seguro en la ruta libre-webui. Una ruta atendida por un paquete proveedor requiere un modelo explícito: dsh-llm-pi-ai resuelve su catálogo para responder consultas, pero no utiliza automáticamente su primera entrada. Por tanto, una ruta manual sin model no acepta turnos y falla con:
provider "<route>" resolves no models; the installed catalog does not describe
this route, so its models must be listed in configuration
Establece model a un identificador de la lista models de esa ruta. El ejemplo incluido combina route: ollama con model: llama3.2, correspondiente a la entrada llama3.2 declarada.
provider selecciona el paquete adaptador que se monta:
libre-webuiatiende al motor mediante la propia capa de proveedores del despliegue. Es el modo compatible y predeterminado.noneinicia el motor sin acceso a modelos. Se listan herramientas y funcionan las sesiones, pero no se puede responder a un turno; es útil para probar composiciones.deepseekypi-aimontan directamente un paquete proveedor. Esos paquetes no son dependencias de este backend: incluir todos los SDK añadía 59 paquetes transitivos, incluidos algunos obsoletos para funciones que el motor nunca utiliza. Instala el paquete deseado y monta su entrada en la composición; el host identifica el paquete si falta.
Una ruta de proveedor se describe mediante:
| Campo | Significado |
|---|---|
displayName | Nombre legible |
api | Protocolo de comunicación, por ejemplo openai-completions |
baseURL | Base del endpoint |
apiKeyEnv | Variable de entorno que contiene la clave |
models | Lista de modelos; cada entrada admite id, name, contextWindow, maxTokens |
Las credenciales nunca se escriben en ninguno de los documentos. apiKeyEnv nombra una variable de entorno que el adaptador resuelve en cada solicitud, de modo que rotar una clave no requiere reiniciar.
cordis.patch.yml
Un array de nivel superior con entradas del cargador Cordis. El ejemplo incluido monta nueve entradas y es el punto de partida recomendado.
- 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'
Campos de entrada
| Campo | Obligatorio | Significado |
|---|---|---|
id | no | Identificador estable para apuntar a la entrada. Se deriva de name si se omite |
name | sí | Especificador de módulo importado por el cargador. Debe ser una cadena literal |
config | no | Configuración del plugin; admite expresiones !!js |
disabled | no | Omitir la entrada sin borrarla; admite !!js |
inject | no | Servicios obligatorios adicionales o configuración de intercepción de la entrada |
El cargador importa name directamente y nunca lo evalúa, por lo que no puede ser una expresión !!js. Los valores de config sí pueden usar !!js; esas expresiones se evalúan después, en la fibra propietaria de la entrada, con acceso al contexto del cargador. Funcionan process.env y ctx.get(...), pero no import.meta.
Los especificadores relativos se resuelven desde el directorio del propio archivo de composición. Los especificadores de paquete se resuelven mediante el paquete backend, de modo que @deepseek-ai/dsh-tools encuentra la copia de backend/node_modules.
El orden de las entradas no determina el orden de carga. Cordis activa una entrada cuando están disponibles sus servicios declarados; la agrupación anterior solo facilita la lectura.
Entradas requeridas
Un motor que responde al chat necesita todos estos elementos:
| Entrada | Proporciona | Necesaria para |
|---|---|---|
dsh-llm | llm | bucle del agente |
dsh-session | sessions | bucle del agente y puente |
dsh-session-projection | sessionProjections | bucle del agente |
dsh-system-prompt | systemPrompt | herramientas y bucle del agente |
dsh-tools | tools | bucle del agente y puente |
dsh-agent | agents | puente |
dsh-agent-loop | controlador del agente | responder a turnos |
| entrada del puente | libreDshEngine | todas las rutas |
Montar además un plugin de herramientas, como @deepseek-ai/dsh-fs-sandbox junto con @deepseek-ai/dsh-tool-fs, permite que GET /api/cordis/tools devuelva herramientas; un registro sin plugins de herramientas puede estar vacío legítimamente.
Variables de entorno
Cada ajuste tiene una anulación por variable de entorno. La variable prevalece sobre el documento y este sobre el valor predeterminado integrado.
| Variable | Anula | Predeterminado |
|---|---|---|
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 | Ruta del documento de composición | <cwd>/cordis.patch.yml |
LIBRE_CORDIS_SETTINGS | Ruta del documento de ajustes | Junto al documento de composición |
LIBRE_CORDIS_WORKSPACE | Espacio predeterminado del motor | <DATA_DIR>/cordis-workspace |
LIBRE_CORDIS_SESSION_STORE | Directorio de sesiones persistentes | <DATA_DIR>/cordis-sessions |
Las variables booleanas aceptan 1/true/yes/on y 0/false/no/off. Si no puede interpretarse un valor, se usa el documento en lugar de adivinar.
Las expresiones !!js de la composición incluida también leen LIBRE_CORDIS_SESSION_STORE y LIBRE_CORDIS_WORKSPACE; por eso el host las exporta antes de montar el árbol.
Ejemplos completos
Ollama local, completamente sin conexión
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 ignora la clave, pero el cliente OpenAI exige que esté definida. Exporta OLLAMA_API_KEY=ollama para cumplirlo sin inventar un secreto. Nada sale de la máquina.
Una pasarela compatible con 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
Establece DEEPSEEK_API_KEY en el entorno del backend.
Sin proveedor, solo herramientas
features:
enabled: true
model:
provider: none
El motor arranca, pueden crearse sesiones y GET /api/cordis/tools lista los plugins de herramientas configurados. Enviar un mensaje falla porque ningún adaptador puede atender la solicitud.
Notas de migración
El puente Cordis es adicional. No cambia ningún comportamiento existente cuando está desactivado, que es su estado predeterminado.
Actualizar un despliegue existente. No requiere hacer nada. Los documentos de ejemplo se distribuyen como cordis.patch.example.yml y cordis.config.example.yml, por lo que no se cargan hasta copiarlos y activar la función. No se ejecutan migraciones, no se crean tablas y no se toca ningún directorio de datos existente.
Activarlo por primera vez. Copia ambos ejemplos, establece features.enabled: true y no instales nada más: los paquetes del motor ya son dependencias del backend. En la primera solicitud se crean <DATA_DIR>/cordis-workspace, <DATA_DIR>/cordis-sessions y <DATA_DIR>/cordis-runtime. Son directorios nuevos dentro del directorio de datos existente, así que las copias y restauraciones que cubren ese directorio también los cubren.
Actualizar el motor. Las versiones resueltas se registran en package-lock.json. backend/package.json declara intervalos compatibles con versiones alpha. Actualiza deliberadamente y valida los contratos de proveedores y sesiones tras ejecutar npm install. Si un paquete DSH incorpora una dependencia par, npm lo comunica durante la instalación y no durante el montaje. DSH controla los formatos de modelos y sesiones; un cambio de formato corresponde a sus notas de versión, no a una migración de Libre WebUI.
Revertir. Establece features.enabled: false y reinicia, o elimina la entrada del puente de cordis.patch.yml. Se retira el servicio libreDshEngine, se libera su receptor y se cierran los agentes que creó. Los archivos de sesiones permanecen en disco como datos; elimina el directorio sessionStorePath para recuperar espacio. Desinstalar los paquetes es opcional y no afecta a otras funciones de Libre WebUI.
Despliegues Chat y Work existentes. Chat incorpora una selección DeepSeek Harness exclusiva de administradores, con sesiones transitorias del motor y la conversación Chat existente. Work incorpora un motor DeepSeek Harness separado mediante un controlador DSH aislado y el flujo actual de aprobaciones y sandbox de Work. Las selecciones de modelos existentes conservan su comportamiento habitual.
Con el adaptador estándar libre-webui, el selector Agentes de Chat incluye opciones explícitas de proveedor y modelo DSH además del perfil base. Las elecciones explícitas conservan su identidad cualificada. El perfil base utiliza el modelo predeterminado de la composición en ejecución. Los títulos y resúmenes de razonamiento de estas selecciones llaman directamente al proveedor subyacente, sin herramientas del agente. Una ruta de adaptador personalizada mantiene solo su entrada Chat base y requiere un modelo de tareas Ollama o de plugin independiente para generar títulos y resúmenes de razonamiento.
DSH respeta el interruptor Ollama del administrador. Al desactivar Ollama no se listan ni consultan sus modelos y una elección explícita falla sin cambiar de proveedor. Los nombres de modelo no cualificados fijados por el operador también necesitan el catálogo de Ollama para resolverse de forma segura; utiliza una elección cualificada lwui:plugin:<plugin>:<model> en un despliegue exclusivamente de plugins.
Límites operativos
- El motor del host y Chat son exclusivos de administradores y del modo individual. La página es una consola administrativa compartida con almacén JSONL local. No puede montarse en modo equipo. Work aislado utiliza sus repositorios SQL existentes.
- Las llamadas al modelo usan al solicitante autenticado. Los turnos interactivos utilizan las credenciales del proveedor y la preferencia de modelo del administrador. Una composición no interactiva de confianza puede establecer explícitamente
LIBRE_CORDIS_USERcon el identificador de un administrador activo. No existe selección implícita del administrador más antiguo. - Las herramientas de archivos del host se limitan al espacio de trabajo. Las lecturas y escrituras comprueban el destino canónico; una sesión no puede elegir un directorio fuera de la raíz configurada. Siguen vigentes las restricciones nativas de modificación de DSH. Los plugins adicionales instalados por el operador son código de servidor de confianza.
- Las herramientas del host usan las políticas de DSH. La página ofrece controles por sesión de solo lectura o escritura en el espacio y tarjetas nativas de aprobación puntual. Nunca eluden el límite configurado del espacio. Los turnos Chat sin interfaz rechazan aprobaciones que no pueden presentar. El controlador DSH de Work utiliza las aprobaciones Work y el aislamiento del contenedor, sin herramientas de archivos del host.
- Los flujos contienen texto en vivo y razonamiento expuesto. Los mensajes persistentes conservan la conversación terminada; los clientes no reciben otra copia del texto en vivo.
- El reinicio y la eliminación usan sesiones almacenadas. Las sesiones vacías y completadas sobreviven a los reinicios. Eliminar una sesión JSONL creada por el puente detiene su escritor y elimina el artefacto. Otras implementaciones de persistencia deben proporcionar un adaptador de eliminación adecuado.
- Los registros antiguos malformados requieren reparación explícita. Versiones anteriores del puente escribían mensajes de usuario sin identificadores obligatorios. El lector estricto rechaza esos registros en lugar de descartarlos. Consulta el procedimiento en Solución de problemas.
- Los títulos se derivan localmente. Los resúmenes usan el primer mensaje humano como título breve; las sesiones vacías no tienen título derivado.
Conectar modelos de una instancia DSH en ejecución
El plugin opcional dsh-native-provider expone los modelos y conexiones ya configurados en otra instancia DSH, como la aplicación web local en el puerto 3080. Instálalo en el perfil existente de esa instancia. Solo llama a ctx.llm: las claves permanecen en DSH y la conexión no puede crear sesiones, ejecutar agentes, leer archivos adjuntos nativos ni ejecutar herramientas nativas.
Ambos procesos deben ejecutarse en el mismo host Unix con la misma cuenta del sistema operativo. El transporte usa un socket Unix configurado explícitamente, en un directorio físico propiedad de esa cuenta con modo 0700, y un socket con modo 0600. No añade un receptor TCP ni reutiliza o debilita la autenticación del navegador DSH. Esta conexión local no admite Windows ni hosts DSH remotos.
La cuenta del sistema operativo define el límite de acceso local: otros procesos ejecutados con ella pueden usar su socket. La conexión no ofrece credenciales nativas separadas ni aislamiento entre aplicaciones que comparten esa cuenta.
Instalar el plugin independiente
En DSH → Plugins → Add plugin, pega la URL pública del repositorio en Package name or address y pulsa Install:
https://github.com/libre-webui/dsh-native-provider
Activa el componente cuando DSH lo solicite. El paquete público es la versión 0.1.1, con licencia Apache-2.0, e incluye el runtime precompilado y el parche del bundle. No requiere compilación local, scripts de instalación ni dependencias npm de ejecución. El nombre @libre-webui/dsh-native-provider no está publicado en npm; usa la URL de GitHub en el diálogo.
El bundle elige <DSH home>/lwui-provider/llm.sock, normalmente $HOME/.dsh/lwui-provider/llm.sock. Un DSH_HOME configurado tiene prioridad. Se crea el directorio privado del socket si falta. Usa un puente activo por directorio DSH, o cambia la ruta del socket mediante el cordis.patch.yml de usuario para perfiles adicionales. La ruta completa debe ocupar como máximo 100 bytes UTF-8 y no tener componentes de enlace simbólico. Consulta la guía de configuración independiente para las anulaciones.
El equivalente opcional por CLI es:
dsh plugin --profile web add https://github.com/libre-webui/dsh-native-provider
Sustituye web por el perfil que ejecuta tu instancia si es distinto. Reinicia ese perfil después de instalar por CLI; una instalación desde la interfaz en vivo puede activar el plugin inmediatamente. Sigue cualquier aviso de reinicio que muestre DSH. No necesitas modificar el código fuente nativo ni copiar claves de proveedores.
Preparar un bundle desde Libre WebUI
Libre WebUI también incluye un script de preparación. Desde un checkout, compila el backend y prepara un directorio de salida nuevo:
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
Las distribuciones npm instaladas ya contienen el backend compilado y el script; ejecuta los dos últimos comandos desde ese directorio sin compilar. Reinicia después el perfil DSH seleccionado. Ambas vías rechazan directorios de salida existentes e incluyen los metadatos del paquete, la licencia y las instrucciones de instalación.
Conectar Libre WebUI
Apunta el cordis.config.yml de Libre WebUI a la misma ruta absoluta del socket. Para el valor predeterminado del bundle público, sustituye /absolute/home por tu directorio personal real:
nativeProvider:
socketPath: /absolute/home/.dsh/lwui-provider/llm.sock
También puedes establecer LIBRE_DSH_PROVIDER_SOCKET a esa ruta absoluta. Un valor de entorno vacío desactiva la conexión aunque el archivo declare una ruta. Activa Motor Cordis en LWUI. Los administradores activos podrán elegir modelos nativos en el motor DeepSeek Harness de Work, la página del motor y el grupo Agentes de Chat (Chat también requiere Modelos de agentes CLI). Work conserva el modelo nativo original y el identificador del proveedor con providerType: dsh; las tareas DSH existentes gestionadas por LWUI conservan su identidad de proveedor y marcador de motor originales.
La lista nativa se lee en vivo. Cambiar la configuración del proveedor o sus credenciales invalida la generación de la conexión y cancela las llamadas nativas en curso. Un socket, modelo o proveedor no disponible detiene la solicitud; LWUI no cambia a Ollama ni a otro proveedor. Los títulos y resúmenes de razonamiento llaman directamente al LLM nativo seleccionado sin herramientas. Esta conexión inicial acepta mensajes de texto, razonamiento y herramientas; rechaza referencias nativas de imágenes o archivos.
Las credenciales nativas pertenecen al operador DSH, por lo que la conexión sigue siendo exclusiva de administradores aunque Work ordinario esté disponible para más usuarios. Las solicitudes pueden salir del host según el proveedor configurado en DSH; Work muestra su aviso de proveedor remoto. En un despliegue de equipo, cada worker que procese estas tareas necesita acceso a la conexión local; si falta, se bloquea la solicitud. Desactivar Cordis o retirar la ruta del socket revoca el acceso nativo y conserva las tareas. Si DSH falla y deja un socket, detén la instancia propietaria y elimina únicamente ese socket obsoleto antes de reiniciar; el plugin rechaza sustituir una entrada de archivos existente.
Actualizar o eliminar el plugin
Finaliza o cancela las solicitudes nativas activas antes de cambiar el plugin. Para sustituir el antiguo bundle local 0.0.0/0.1.0 desde la interfaz DSH, utiliza Uninstall, vuelve a Add plugin e instala la URL pública anterior. Conserva cualquier ruta personalizada con una anulación de perfil admitida. Se preservan sesiones y credenciales nativas.
Si la instalación ya procede de GitHub, puede actualizarse por CLI:
dsh plugin --profile web update @libre-webui/dsh-native-provider
Reinicia después de actualizar por CLI y verifica la versión. Un plugin previamente desactivado permanece así; comprueba su estado antes de probar la conexión. Para fijar o revertir una revisión, usa github:libre-webui/dsh-native-provider#<commit> como origen. En bundles preparados localmente, crea un directorio de salida nuevo y vuelve a añadirlo; actualizar una dependencia local no descarga GitHub.
Para retirar la conexión, elimina primero el ajuste nativeProvider.socketPath de LWUI o deja vacío LIBRE_DSH_PROVIDER_SOCKET, y ejecuta:
dsh plugin --profile web remove @libre-webui/dsh-native-provider
Reinicia el perfil DSH tras la eliminación. Las tareas guardadas en LWUI permanecen, pero sus solicitudes nativas fallarán hasta restaurar la misma conexión explícita. Eliminar el plugin no borra los proveedores ni las credenciales de DSH. Borra directorios de bundles generados antiguos solo cuando ya no estén instalados.
Uso del proveedor nativo
Las solicitudes nativas aparecen en Uso del proveedor bajo DeepSeek Harness · proveedor, con el modelo original elegido. Cada solicitud real se cuenta una vez, incluidos los turnos de herramientas, títulos y resúmenes de razonamiento. El panel incluye llamadas correctas, fallidas y canceladas, latencia y tokens reportados por DSH. La entrada en caché se incluye una vez en el total de entrada; el uso ausente queda sin medir en lugar de estimarse. Los identificadores usan dsh-native:<percent-encoded-native-provider-id> para las reglas existentes de tarifas e informes de costes. Las tarifas desconocidas quedan sin precio.
Las solicitudes DSH a través de proveedores configurados en LWUI conservan los registros existentes de esos proveedores. Consultar el catálogo o rechazar solicitudes antes de llegar a la inferencia nativa no genera registros adicionales. La medición empieza al instalar esta versión; no inventa uso histórico. Los datos guardados contienen identidad, estado, tiempo y contadores, sin prompts, respuestas, credenciales, endpoints ni textos de error del proveedor.
Verificar una configuración
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" }
]
}
Un 503 con code: CORDIS_UNAVAILABLE significa que no se montó la composición. El campo error contiene la causa y LIBRE_CORDIS_TRACE=true añade el registro de activación de Cordis. Consulta Solución de problemas para las causas habituales.