Configurar DeepSeek Harness: API Key, Base URL y modelos
Conecta DeepSeek Harness a BetterToken con API Key y Base URL en el perfil headless. Elige el protocolo y comprueba la lectura de archivos.
Conecta DeepSeek Harness (dsh) a BetterToken con un proveedor personalizado en el perfil headless. En las pruebas en macOS, @deepseek-ai/dsh@0.2.1-rc.2 completó las solicitudes de texto y las llamadas a herramientas de lectura de archivos en los 3 intentos de cada combinación: Chat Completions con un modelo GPT, Responses con un modelo GPT, Anthropic Messages con un modelo Claude y Anthropic Messages con un modelo GPT.
Ajustes principales
| Campo | Valor |
|---|---|
| API Key | BetterToken API Key, leída de la variable de entorno cuyo nombre indica apiKeyEnv |
| Base URL | https://bettertoken.ai/v1 — Chat Completions / Responses |
| Base URL para Anthropic Messages | https://bettertoken.ai, sin /v1 |
| Modelo | YOUR_MODEL_ID |
| Archivo de configuración | $DSH_HOME/profiles/headless/cordis.patch.yml (DSH_HOME usa ~/.dsh de forma predeterminada) |
Requisitos previos
- Node.js 24.9 o posterior, según las notas oficiales de actualización a rc.2
- Una BetterToken API Key: regístrate y obtén una
- Un Model ID copiado de la model plaza
Instalación
Ejecuta la versión probada aquí sin instalarla de forma global:
npx @deepseek-ai/dsh@0.2.1-rc.2 --helpDurante las pruebas, la etiqueta npm latest apuntaba a 0.2.1-rc.2, una versión candidata. No se probaron otras etiquetas, como next.
Configuración manual
Exporta la API Key y sustituye YOUR_API_KEY:
export BETTERTOKEN_API_KEY="YOUR_API_KEY"Crea ~/.dsh/profiles/headless/cordis.patch.yml. El archivo contiene una lista de parches de Cordis. Sustituye los dos valores YOUR_MODEL_ID por el mismo Model ID exacto:
Chat Completions
- id: llm-pi-ai config: providers: bettertoken: api: openai-completions baseURL: https://bettertoken.ai/v1 apiKeyEnv: BETTERTOKEN_API_KEY retryPolicy: mode: normal maxRetries: 2 models: - id: YOUR_MODEL_ID- id: agent-default-model config: provider: bettertoken model: YOUR_MODEL_IDResponses
- id: llm-pi-ai config: providers: bettertoken: api: openai-responses baseURL: https://bettertoken.ai/v1 apiKeyEnv: BETTERTOKEN_API_KEY retryPolicy: mode: normal maxRetries: 2 models: - id: YOUR_MODEL_ID- id: agent-default-model config: provider: bettertoken model: YOUR_MODEL_IDAnthropic Messages
- id: llm-pi-ai config: providers: bettertoken: api: anthropic-messages baseURL: https://bettertoken.ai apiKeyEnv: BETTERTOKEN_API_KEY retryPolicy: mode: normal maxRetries: 2 models: - id: YOUR_MODEL_ID- id: agent-default-model config: provider: bettertoken model: YOUR_MODEL_IDapiKeyEnv contiene el nombre de una variable de entorno, no la API Key ni una expresión ${...}. Un proveedor personalizado requiere api, baseURL y al menos una entrada en models; en cada entrada solo es obligatorio el id del modelo. Si ya tienes configurado llm-pi-ai, copia los proveedores que quieras conservar en el mismo config, porque una entrada nueva sustituye a la existente.
El campo api solo admite openai-completions, openai-responses y anthropic-messages para proveedores personalizados. La Base URL de Anthropic es la raíz del sitio, ya que el cliente añade /v1/messages.
Para comprobar la sintaxis sin enviar una solicitud al modelo, ejecuta npx @deepseek-ai/dsh@0.2.1-rc.2 --profile headless --dump-config.
Verificar la conexión
Ejecuta lo siguiente en el mismo terminal:
npx @deepseek-ai/dsh@0.2.1-rc.2 --profile headless --json "Reply with only: OK"--json imprime un evento JSON por línea. Comprueba que el código de salida sea 0, que turn_end.reason indique un cierre normal y que el campo text del último evento final sea OK. Una ejecución fallida también puede imprimir un evento final vacío; su presencia no basta para confirmar el éxito.
Para comprobar el acceso a archivos, crea sample.txt en un directorio vacío y ejecuta allí el mismo comando con el mensaje Read sample.txt using a tool. Reply with only its exact contents.. Confirma que la salida contenga un tool_call, un tool_result con el texto del archivo y un texto final que coincida.
Cambiar de modelo
Cambia los dos valores YOUR_MODEL_ID por otro Model ID exacto. Si el nuevo modelo usa otro protocolo, como un modelo Claude mediante Anthropic Messages, cambia api y baseURL a la vez. Para consultar los modelos que devuelve la pasarela, usa Fetch available models con un proveedor personalizado en la interfaz web de DeepSeek Harness. Durante las pruebas, el mismo servicio de descubrimiento devolvió la lista de modelos de BetterToken para los tres protocolos.
Errores frecuentes
| Síntoma | Qué comprobar |
|---|---|
MISSING_CREDENTIAL, código de salida 1 y ninguna solicitud en el panel de control | El proceso no recibió la variable indicada por apiKeyEnv. Expórtala en el terminal desde el que inicias dsh y comprueba su nombre. Esta comprobación se realiza localmente. |
El perfil headless ignora una Key guardada en la interfaz web | El perfil headless solo lee credenciales del entorno de inicio, después de .env en el directorio actual y después de .env en DSH_HOME, en ese orden. |
404 con una ruta de solicitud que termina en /v1/v1/messages | La baseURL de Anthropic termina en /v1. Usa https://bettertoken.ai. |
| No se encuentra el modelo | Vuelve a copiar el Model ID de la model plaza y úsalo en ambos lugares. |
| Muchos reintentos tras un fallo | Si omites retryPolicy, el adaptador hace 5 reintentos de forma predeterminada. Define maxRetries explícitamente, como en los ejemplos. |
| Error de versión de Node.js | Usa Node.js 24.9 o posterior. |
Documentación relacionada
- Comparar herramientas compatibles
- Errores de API y límites de solicitudes
- Documentación oficial de proveedores
Detalles técnicos
En las pruebas, las rutas reales de solicitud fueron /v1/chat/completions, /v1/responses y /v1/messages para los tres valores de api. dsh también envía automáticamente una solicitud para generar el título de la sesión mediante el proveedor y el modelo configurados, por lo que una tarea puede producir varias solicitudes. El cliente añadió límites de salida predeterminados, por ejemplo, 32768 tokens en la solicitud principal; no estaban definidos en la configuración.
Los campos input y contextWindow de una entrada de modelo son declaraciones para el cliente. No consultan ni verifican los límites de la pasarela. No se probó la entrada de imágenes. Las pruebas solo se realizaron en macOS.

