Configurer DeepSeek Harness : clé API, Base URL et modèles
Connectez DeepSeek Harness à BetterToken via le profil headless. Configurez la clé API, la Base URL et le protocole, puis vérifiez la lecture de fichiers.
Connectez DeepSeek Harness (dsh) à BetterToken avec un fournisseur personnalisé dans le profil headless. Lors des tests sur macOS, @deepseek-ai/dsh@0.2.1-rc.2 a exécuté les requêtes de texte et les appels d’outils de lecture de fichiers avec succès dans les 3 essais de chaque combinaison : Chat Completions avec un modèle GPT, Responses avec un modèle GPT, Anthropic Messages avec un modèle Claude et Anthropic Messages avec un modèle GPT.
Paramètres principaux
| Champ | Valeur |
|---|---|
| API Key | BetterToken API Key, lue dans la variable d’environnement dont le nom est indiqué par apiKeyEnv |
| Base URL | https://bettertoken.ai/v1 — Chat Completions / Responses |
| Base URL pour Anthropic Messages | https://bettertoken.ai, sans /v1 |
| Modèle | YOUR_MODEL_ID |
| Fichier de configuration | $DSH_HOME/profiles/headless/cordis.patch.yml (DSH_HOME vaut ~/.dsh par défaut) |
Prérequis
- Node.js 24.9 ou ultérieur, conformément aux notes officielles de mise à niveau vers rc.2
- Une BetterToken API Key : inscrivez-vous pour en obtenir une
- Un Model ID copié depuis le model plaza
Installation
Exécutez la version testée ici sans installation globale :
npx @deepseek-ai/dsh@0.2.1-rc.2 --helpLors des tests, le tag npm latest désignait 0.2.1-rc.2, une version candidate. Les autres tags, comme next, n’ont pas été testés.
Configuration manuelle
Exportez la clé API en remplaçant YOUR_API_KEY :
export BETTERTOKEN_API_KEY="YOUR_API_KEY"Créez ~/.dsh/profiles/headless/cordis.patch.yml. Ce fichier contient une liste de correctifs Cordis. Remplacez les deux valeurs YOUR_MODEL_ID par le même Model ID exact :
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 contient le nom d’une variable d’environnement, pas la clé API ni une expression ${...}. Un fournisseur personnalisé nécessite api, baseURL et au moins une entrée dans models ; seul l’id du modèle est obligatoire dans chaque entrée. Si llm-pi-ai est déjà configuré, copiez les fournisseurs à conserver dans le même config, car une nouvelle entrée remplace l’entrée existante.
Le champ api accepte uniquement openai-completions, openai-responses et anthropic-messages pour les fournisseurs personnalisés. La Base URL Anthropic est la racine du site, car le client ajoute lui-même /v1/messages.
Pour vérifier la syntaxe sans envoyer de requête au modèle, exécutez npx @deepseek-ai/dsh@0.2.1-rc.2 --profile headless --dump-config.
Vérifier la connexion
Exécutez cette commande dans le même terminal :
npx @deepseek-ai/dsh@0.2.1-rc.2 --profile headless --json "Reply with only: OK"--json affiche un événement JSON par ligne. Vérifiez que le code de sortie est 0, que turn_end.reason indique une fin normale et que le champ text du dernier événement final vaut OK. Une exécution en échec peut aussi afficher un événement final vide ; sa seule présence ne suffit donc pas.
Pour vérifier l’accès aux fichiers, créez sample.txt dans un répertoire vide, puis exécutez-y la même commande avec le prompt Read sample.txt using a tool. Reply with only its exact contents.. Confirmez que la sortie contient un tool_call, un tool_result avec le texte du fichier et un texte final identique à ce contenu.
Changer de modèle
Remplacez les deux valeurs YOUR_MODEL_ID par un autre Model ID exact. Si le nouveau modèle utilise un autre protocole, par exemple un modèle Claude via Anthropic Messages, modifiez api et baseURL ensemble. Pour afficher les modèles renvoyés par la passerelle, utilisez Fetch available models avec un fournisseur personnalisé dans l’interface web de DeepSeek Harness. Lors des tests, le même service de découverte a renvoyé la liste des modèles BetterToken pour les trois protocoles.
Erreurs courantes
| Symptôme | Vérification |
|---|---|
MISSING_CREDENTIAL, code de sortie 1 et aucune requête dans le tableau de bord | Le processus n’a pas reçu la variable indiquée par apiKeyEnv. Exportez-la dans le terminal qui lance dsh et vérifiez son orthographe. Cette vérification est locale. |
Le profil headless ignore une Key enregistrée dans l’interface web | Le profil headless lit les identifiants uniquement dans cet ordre : environnement de lancement, .env du répertoire courant, puis .env sous DSH_HOME. |
404 avec un chemin de requête se terminant par /v1/v1/messages | La baseURL Anthropic se termine par /v1. Utilisez https://bettertoken.ai. |
| Modèle introuvable | Copiez à nouveau le Model ID depuis le model plaza et utilisez-le aux deux endroits. |
| Nombreuses tentatives après un échec | Sans retryPolicy, l’adaptateur effectue 5 nouvelles tentatives par défaut. Définissez explicitement maxRetries, comme dans les exemples. |
| Erreur de version Node.js | Utilisez Node.js 24.9 ou ultérieur. |
Documentation associée
- Comparer les outils compatibles
- Erreurs API et limites de requêtes
- Documentation officielle des fournisseurs
Détails techniques
Lors des tests, les chemins de requête réels étaient /v1/chat/completions, /v1/responses et /v1/messages pour les trois valeurs de api. dsh envoie aussi automatiquement une requête de génération du titre de session via le fournisseur et le modèle configurés ; une tâche peut donc produire plusieurs requêtes. Le client a ajouté des limites de sortie par défaut, par exemple 32768 tokens pour la requête principale ; elles n’étaient pas définies dans la configuration.
Les champs input et contextWindow d’une entrée de modèle sont des déclarations destinées au client. Ils ne consultent ni ne confirment les limites de la passerelle. L’entrée d’images n’a pas été testée. Les tests ont porté uniquement sur macOS.

