Documentación

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.

Configuración → Modelos → Añadir proveedor de modelos → API de modelo personalizada
# 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-5
La URL base depende del protocolo de la API. openai-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.
Kunavo no ofrece ningún modelo DeepSeek. Este proveedor se añade junto a la tarjeta de DeepSeek, no la sustituye: conserva tu clave de DeepSeek para los ID 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í.
El registro de tu sesión no se envía junto con las solicitudes. En su ruta integrada de DeepSeek, dsh añade dos campos a cada solicitud que el modelo nunca ve: 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.
Nadie en Kunavo ha ejecutado DeepSeek Harness contra su endpoint. Esto es lo que se ejecutó en la fecha indicada más abajo: dsh 0.2.0-rc.2 de npm, sin interfaz, tres sesiones nuevas por ruta contra un sustituto local que registra cada solicitud y responde con una llamada a herramienta; no Kunavo ni un modelo. Las nueve sesiones completaron un intercambio de herramientas transmitido y enviaron los mismos bytes cada vez, lo que confirma las rutas y los límites descritos en esta página. No dice nada sobre la autenticación de Kunavo, su enrutamiento ni las respuestas de un modelo. La 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.
Kunavo no ofrece modelos de embeddings, conversión de texto a voz ni conversión de voz a texto, por lo que este proveedor solo responde a solicitudes de finalización de chat. Un complemento del harness que transcriba audio o cree un índice vectorial conserva la clave del proveedor que ya tenga; añadir este proveedor no redirige esas llamadas.
¿Aún no tienes una clave? Crea una cuenta de Kunavo, genera una clave (empieza por 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

  1. Cree una clave en /app/keys y cópiela: se muestra una sola vez.
  2. 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 en dsh; cambia a Custom model API.
  3. 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.yaml y almacena únicamente una referencia en el perfil.
  4. 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.
  5. 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 ID claude- (por qué solo esos).
  6. 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 modeloEntrada / salida de KunavoDónde encaja en DeepSeek Harness
claude-sonnet-5$1.40 / $7.00el modelo de trabajo predeterminado para sesiones que modifican archivos
claude-opus-5$3.50 / $17.50planificar un cambio en el que un error sería costoso
claude-haiku-4-5$0.70 / $3.50turnos económicos: triaje, resúmenes y el ciclo que funciona todo el día
gpt-5-6-sol$2.00 / $12.00una segunda opinión de otra familia, con la misma clave y el mismo proveedor
gpt-5-6-terra$0.70 / $4.20entradas largas, en las que la tarifa por token determina la factura
La facturación es por token desde un saldo prepago, sin cuota mensual; consulta facturación. Con contexto repetido —que constituye la mayor parte de lo que envía un editor o cliente de chat—, la caché de indicaciones cambia más la factura que la elección del modelo.

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 /v1 al 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/messages de Kunavo ofrece ID claude- y nada más; un ID gpt- genera allí un 404 que indica /v1/chat/completions. Mantén GPT en el proveedor openai-completions.
  • Fetch muestra todos los modelos; añade solo los de Claude. El README de dsh llm-pi-ai indica que la detección mediante este protocolo solicita GET /v1/models con el encabezado x-api-key de Anthropic, y que la lista de modelos de Kunavo acepta la clave en ese encabezado, igual que en Authorization: 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 ID claude-; 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 desde https://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 rol developer. Kunavo la reenvía tal cual, en lugar de traducirla del formato de OpenAI. El proveedor openai-completions llega 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:

  1. 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 exactamente max_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.
  2. compat.supportsDeveloperRole: no hace falta. El harness lo recomienda para las pasarelas que rechazan el rol developer; 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.)
  3. 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 lee max_completion_tokens y usa max_tokens como valor alternativo, así que el valor predeterminado ya funciona.
  4. 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; en openai-completions, cada clave es un nivel y su valor es el nombre que se envía como reasoning_effort. Esto llega a un ID gpt-; en un ID claude- no tiene efecto, porque la interfaz de chat de Kunavo no reenvía reasoning_effort a Anthropic (/docs/chat#reasoning).
  5. 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 /models antes 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.