Documentación
DeepSeek Harness
DeepSeek Harness conserva su propia tarjeta de DeepSeek y añade la tuya junto a ella. Cinco campos en «Add model provider» → «Custom model API» ponen Claude y GPT en el mismo selector de modelos, con una sola clave.
Settings → Models → “Add model provider” → “Custom model API” acepta cinco campos — Provider ID, display name, base URL, API protocol y API key — y coloca Claude y GPT en el mismo selector que la tarjeta DeepSeek integrada.
# Settings → Models → Add model provider → Custom model API
#
# Provider ID kunavo (lowercase, and permanent)
# display name Kunavo
# base URL https://api.kunavo.com/v1
# API protocol OpenAI Chat Completions (openai-completions)
# API key sk-kn-...
#
# Then Model catalog → Fetch available models → Add selected,
# or type the ids by hand. The page writes the active profile's
# $DSH_HOME/profiles/<profile>/cordis.patch.yml — profile "web" under
# `dsh web`. The same provider there, plus an optional second one
# that sends Claude ids over Anthropic Messages, whose base URL has
# NO /v1. This entry replaces the whole llm-pi-ai config: keep any
# provider already in it.
- id: llm-pi-ai
config:
providers:
kunavo:
apiKeyEnv: KUNAVO_API_KEY
api: openai-completions
baseURL: https://api.kunavo.com/v1 # → /v1/chat/completions
models:
- id: claude-sonnet-5
- id: claude-opus-5
- id: claude-haiku-4-5
- id: gpt-5-6-sol
kunavo-claude:
apiKeyEnv: KUNAVO_API_KEY
api: anthropic-messages
baseURL: https://api.kunavo.com # → /v1/messages
models:
- id: claude-sonnet-5
- id: claude-haiku-4-5openai-completions usa https://api.kunavo.com/v1; anthropic-messages usa https://api.kunavo.com, sin /v1, porque dsh añade /v1/messages por sí mismo. Una ejecución de dsh 0.2.0-rc.2 contra un sustituto local de registro confirmó ambos casos: la primera solicitud se envió a /v1/chat/completions, la segunda a /v1/messages?beta=true desde la raíz sin ruta, y a /v1/v1/messages cuando su URL base conservaba /v1, a lo que una pasarela real responde con un 404, no con un error de autenticación.reasoningEfforts cambia el rol de la instrucción del sistema, no si esta llega. La documentación del harness indica que, cuando un modelo declara razonamiento, la instrucción del sistema se envía como role: "developer". Kunavo interpreta ese rol como el turno del sistema en todas las familias, incluida Claude, así que no hace falta activar compat. Hasta 2026-09-30, la ruta de Claude descartaba el rol, y esta tarjeta te indicaba que activaras compat.supportsDeveloperRole: false; si lo hiciste, no causa problemas y puedes dejarlo activado.deepseek- y usa esta para los ID de Claude y GPT de la tabla siguiente. Esto también significa que la opción compat.thinkingFormat: deepseek que el harness documenta para «DeepSeek V4 detrás de una pasarela compatible con OpenAI» no tiene ninguna función aquí.dsh_session_log, los eventos de la sesión, incluida la ruta del directorio de trabajo, y dsh_plugin_packages. En la ejecución, ninguno de los dos proveedores personalizados envió esos campos, así que un proveedor de Kunavo no los recibe. Su peso y la opción que desactiva la carga se detallan en Precios de DeepSeek Harness.curl de abajo corresponde a la parte de Kunavo y puedes comprobarla en diez segundos; dsh es una versión preliminar para desarrolladores y sigue evolucionando.sk-kn-) y añade crédito desde $10; las llamadas se pagan con ese saldo y las llamadas fallidas no se facturan. El panel se abre entonces en la configuración de DeepSeek Harness.Paso a paso
- Cree una clave en
/app/keysy cópiela: se muestra una sola vez. - Inicia la interfaz web (
dsh web) y ve a Settings → Models. Elige Add model provider. La tarjeta se abre en Third-party model provider, donde solo aparecen los proveedores incluidos endsh; cambia a Custom model API. - Completa Provider ID (en minúsculas y permanente: según la documentación, las solicitudes, las sesiones guardadas, los valores predeterminados de los modelos y las referencias a credenciales lo usan; para cambiarle el nombre hay que añadir un proveedor nuevo y eliminar el anterior), display name, base URL
https://api.kunavo.com/v1, API protocol OpenAI Chat Completions y API key. La clave es de solo escritura; dsh la conserva en$DSH_HOME/.credentials.yamly almacena únicamente una referencia en el perfil. - En Model catalog, elige Fetch available models: Kunavo responde con
GET /v1/models, así que el selector se completa automáticamente. Marca los modelos que quieras y elige Add selected. Los ID escritos a mano funcionan igual, y la documentación recomienda recurrir a ellos cuando la detección no muestra ningún resultado. - Opcional: para usar los ID de Claude con el protocolo propio de Anthropic, añade otra API de modelo personalizada con su propio Provider ID, URL base
https://api.kunavo.com, sin/v1, protocolo de API Anthropic Messages y la misma clave. La opción Fetch también muestra aquí todo el catálogo; añade solo los IDclaude-(por qué solo esos). - Elige un modelo en el compositor y envía un turno que interactúe con un archivo, no un saludo: el harness depende de las llamadas a herramientas para la mayoría de sus funciones, así que una primera ejecución que lea y edite algo te dará más información. Los cambios de modelo se aplican en la siguiente solicitud; la documentación indica explícitamente que no hace falta reiniciar.
Comprobado con la página «Configure models» de DeepSeek Harness (el mismo texto que docs/user/guide/providers.md en la etiqueta dsh-v0.2.0-rc.2) el 1 de octubre de 2026. La configuración de terceros puede cambiar; si el nombre de un campo ya no coincide con lo que ves, esa página es la autoridad, no esta.
Verifica antes de depurar el cliente
Una solicitud determina si el fallo está en el endpoint, la clave o el archivo de configuración. Si devuelve JSON, la misma URL base y la misma clave funcionan en DeepSeek Harness.
# Settles whether a failure is the endpoint, the key, or the client.
curl -sS https://api.kunavo.com/v1/models \
-H "Authorization: Bearer sk-kn-..."Qué ID de modelo introducir en el campo
Todos los modelos de texto están disponibles mediante un ID de modelo; la lista activa está en GET /v1/models, y el catálogo con precios está en la página de modelos. Las tarifas son USD por 1M de tokens, entrada / salida.
| ID de modelo | Entrada / salida de Kunavo | Dónde encaja en DeepSeek Harness |
|---|---|---|
claude-sonnet-5 | $1.40 / $7.00 | el modelo de trabajo predeterminado para sesiones que modifican archivos |
claude-opus-5 | $3.50 / $17.50 | planificar un cambio en el que un error sería costoso |
claude-haiku-4-5 | $0.70 / $3.50 | turnos económicos: triaje, resúmenes y el ciclo que funciona todo el día |
gpt-5-6-sol | $2.00 / $12.00 | una segunda opinión de otra familia, con la misma clave y el mismo proveedor |
gpt-5-6-terra | $0.70 / $4.20 | entradas largas, en las que la tarifa por token determina la factura |
Claude mediante Anthropic Messages
Kunavo también responde a la API de Anthropic Messages, y anthropic-messages es uno de los tres protocolos que ofrece el formulario. La documentación del harness lo deja claro: «Un proveedor habla un protocolo, así que una pasarela que ofrece dos necesita dos proveedores». Por tanto, este es un segundo proveedor junto al primero, no una opción de este.
- URL base
https://api.kunavo.com, la raíz sin ruta. En la ejecución, esa raíz envió la solicitud a/v1/messages?beta=true, la ruta que también usa Claude Code y a la que Kunavo responde. Con/v1al final, la solicitud se envió a/v1/v1/messages. DeepSeek Harness frente a Claude Code compara las solicitudes de ambos clientes. - Solo ID de Claude.
/v1/messagesde Kunavo ofrece IDclaude-y nada más; un IDgpt-genera allí un404que indica/v1/chat/completions. Mantén GPT en el proveedoropenai-completions. - Fetch muestra todos los modelos; añade solo los de Claude. El README de dsh
llm-pi-aiindica que la detección mediante este protocolo solicitaGET /v1/modelscon el encabezadox-api-keyde Anthropic, y que la lista de modelos de Kunavo acepta la clave en ese encabezado, igual que enAuthorization: Bearer; esto se basa en el código fuente de dsh y las propias pruebas de Kunavo, no en la ejecución. Lo que devuelve Fetch available models es todo el catálogo, incluidos GPT y los modelos de imagen, así que marca solo los IDclaude-; escribirlos a mano funciona igual. Una lista completa demuestra menos de lo que parece: el mismo README indica que se acepta la URL de listado con o sin/v1, mientras que las solicitudes de modelos usan la URL base sin cambios. Por eso Fetch también completa la lista desdehttps://api.kunavo.com/v1, pero el primer turno con esa URL base se envía a/v1/v1/messages. - Qué te ofrece. La solicitud llega con el formato de Anthropic: en la ejecución, la instrucción del sistema se envió como el campo de nivel superior
system, así que no interviene el roldeveloper. Kunavo la reenvía tal cual, en lugar de traducirla del formato de OpenAI. El proveedoropenai-completionsllega a los mismos ID de Claude mediante traducción; por eso es el que se usa en los pasos.
El archivo que hay detrás del formulario
La página Models escribe en $DSH_HOME/profiles/<profile>/cordis.patch.yml: $DSH_HOME/profiles/web/cordis.patch.yml cuando empiezas desde dsh web. La documentación anterior de dsh indicaba $DSH_HOME/settings.yaml; la versión 0.2.0-rc.2 ya no. Cuando el navegador y el servidor están en la misma máquina, Open configuration file en el encabezado de Settings abre el archivo y los adaptadores lo vuelven a leer en la siguiente solicitud. Para este endpoint importan cinco cosas:
- Ventana de contexto y tokens de salida máximos: en el formulario, bajo Customized settings → Model options. Un ID escrito a mano no incluye ninguno de esos valores, así que se aplican los valores alternativos de la ruta: 262,144 tokens de contexto y 32,768 de salida, según el README de
llm-pi-ai; en la ejecución, ambos proveedores personalizados solicitaron exactamentemax_tokens: 32768. Todos los ID de la tabla anterior admiten más; comprueba la fila en cualquier caso y, si quieres aumentar los límites, consúltalos en la entrada del catálogo del modelo. Kunavo factura los tokens que genera el modelo, no el límite. compat.supportsDeveloperRole: no hace falta. El harness lo recomienda para las pasarelas que rechazan el roldeveloper; Kunavo interpreta ese rol como el turno del sistema en todas las familias, incluida Claude. (Hasta 2026-09-30, la ruta de Claude lo descartaba y este elemento te indicaba que activaras la opción; dejarla activada no causa problemas.)compat.maxTokensField: déjalo como está. El harness lo combina con la opción anterior como primera solución habitual, pero el controlador de Kunavo leemax_completion_tokensy usamax_tokenscomo valor alternativo, así que el valor predeterminado ya funciona.reasoningEfforts: no hay ningún campo en el formulario. Un modelo que añadas manualmente no declara niveles, así que no aparece el menú Effort y el valor predeterminado del propio endpoint determina si el modelo razona. Si quieres que aparezca el menú, declara tú mismo los niveles; enopenai-completions, cada clave es un nivel y su valor es el nombre que se envía comoreasoning_effort. Esto llega a un IDgpt-; en un IDclaude-no tiene efecto, porque la interfaz de chat de Kunavo no reenvíareasoning_efforta Anthropic (/docs/chat#reasoning).- Tipos de entrada (
input: [text, image]en el archivo): la documentación aclara que esto «declara una característica de tu endpoint, no la comprueba». Si marcas Image en un ID que no admite imágenes, el harness no lo detecta; la solicitud se rechaza más adelante. Comprueba el ID en/modelsantes de marcar la casilla.
El resto de lo que envía una sesión —24 definiciones de herramientas por turno, una solicitud breve de título para cada sesión nueva y los campos adicionales en la ruta propia de DeepSeek— se detalla en Precios de DeepSeek Harness.
Preguntas frecuentes
¿Cómo añado un proveedor de API personalizado a DeepSeek Harness?
Inicia la interfaz web con dsh web, ve a Settings → Models y elige «Add model provider». La tarjeta se abre en «Third-party model provider», donde solo aparecen los proveedores incluidos en dsh; cambia a «Custom model API». El formulario solicita un Provider ID en minúsculas, un nombre para mostrar, una URL base, un protocolo de API y una clave de API; después, al menos un modelo en Model catalog. El Provider ID es permanente porque lo usan las solicitudes, las sesiones guardadas, los valores predeterminados de los modelos y las referencias a credenciales; para cambiarle el nombre hay que añadir un proveedor nuevo y eliminar el anterior. En la versión 0.2.0-rc.2, la página guarda la configuración en el cordis.patch.yml del perfil activo: $DSH_HOME/profiles/web/cordis.patch.yml al usar dsh web.
¿La URL base de DeepSeek Harness debe terminar en /v1?
Depende del protocolo de la API. Para openai-completions, sí: https://api.kunavo.com/v1, que en una ejecución de dsh 0.2.0-rc.2 envió la solicitud a /v1/chat/completions. Para anthropic-messages, no: https://api.kunavo.com, porque dsh añade /v1/messages por sí mismo. La raíz sin ruta envió la solicitud a /v1/messages?beta=true; en cambio, con una URL base que terminaba en /v1, la solicitud se envió a /v1/v1/messages, a lo que una pasarela real responde con 404 en lugar de un error de autenticación. La ejecución se hizo contra un sustituto local que registra las solicitudes, no contra Kunavo.
¿Puede DeepSeek Harness usar modelos Claude o GPT en lugar de DeepSeek?
Sí. El campo del protocolo de API indica el formato de transmisión, no el proveedor: openai-completions corresponde a OpenAI Chat Completions, openai-responses a Responses API y anthropic-messages a Anthropic Messages API. Un proveedor personalizado pasa el ID del modelo directamente a la URL base que hayas configurado, así que el ID de Claude o GPT se resuelve en ese endpoint, no dentro del harness. En Kunavo, un proveedor openai-completions con https://api.kunavo.com/v1 da acceso a ID de Claude y GPT; un segundo proveedor con anthropic-messages y https://api.kunavo.com da acceso únicamente a los ID de Claude, con el formato de solicitud propio de Anthropic. Ambos se añaden junto a la tarjeta integrada de DeepSeek, en lugar de sustituirla, así que los ID de DeepSeek siguen usando tu clave de DeepSeek.
¿Qué envía DeepSeek Harness a un proveedor personalizado?
En una ejecución registrada de dsh 0.2.0-rc.2, ambos proveedores personalizados —openai-completions y anthropic-messages— enviaron 24 definiciones de herramientas con cada turno del agente, solicitaron max_tokens 32,768, el valor alternativo del harness para un modelo que añadiste sin especificar su tamaño, e hicieron una solicitud breve de título por cada sesión nueva con max_tokens 64. Ninguno envió dsh_session_log ni dsh_plugin_packages: esos dos campos, el registro de eventos de la sesión y la lista de complementos instalados, solo se enviaron con la ruta integrada de DeepSeek. La ejecución usó un sustituto que registra las solicitudes, no Kunavo, así que muestra lo que envía dsh, no lo que hace cualquier proveedor con ello.
¿Por qué DeepSeek Harness parece ignorar mi instrucción del sistema?
Comprueba si el modelo declara niveles de razonamiento. Con openai-completions, el harness envía la instrucción del sistema de un modelo de razonamiento con el rol "developer" en lugar de "system", porque deduce el formato de la solicitud a partir de la URL del endpoint y trata como si fuera el propio OpenAI cualquier dirección que no reconoce. Kunavo interpreta ese rol como el turno del sistema en todas las familias de modelos, incluida Claude, así que en Kunavo la instrucción llega de cualquier forma. Hasta 2026-09-30, la ruta de Claude descartaba el rol en silencio; si antes de esa fecha faltaba una instrucción, esa era la causa, y compat.supportsDeveloperRole: false en la ruta o el modelo del cordis.patch.yml del perfil era la solución provisional. Ya no hace falta y no causa problemas si se deja. Un proveedor anthropic-messages nunca envía el rol: su instrucción del sistema se envía como el campo system de nivel superior de Anthropic.
¿Por qué «Fetch available models» no devuelve nada o devuelve un 401 en DeepSeek Harness?
La detección usa la URL base, el protocolo y la clave que estén en el formulario en ese momento; por eso un 401 suele señalar un problema con la clave y una lista vacía, con la URL base o con un formato de listado que la detección no puede leer. El harness documenta ambos resultados e indica que se introduzcan los ID a mano; funcionan igual. Los dos protocolos envían la clave de forma distinta: openai-completions como Authorization: Bearer y anthropic-messages en el encabezado x-api-key de Anthropic; Kunavo acepta ambos en su lista de modelos. Determina cuál de las dos partes falla con una solicitud curl sencilla a https://api.kunavo.com/v1/models, usando la misma clave en el mismo encabezado: si recibes JSON, el problema está en el formulario; un 401 indica la clave y un 404, la URL. En anthropic-messages, una lista completa deja dos dudas: si la URL base es correcta, porque la detección elimina un /v1 final de la URL de listado y las solicitudes de modelos no, y a qué ID puede llamar el proveedor, porque la lista contiene todo el catálogo y ahí solo funcionan los ID claude-. Un proveedor integrado siempre obtiene la respuesta del catálogo instalado, aunque su URL base apunte a otro sitio; usa la detección desde un proveedor personalizado para ver qué ofrece realmente el endpoint.