Documentation
DeepSeek Harness
DeepSeek Harness conserve sa propre fiche DeepSeek et ajoute la vôtre à côté. Cinq champs dans « Add model provider » → « Custom model API » permettent de retrouver Claude et GPT dans le même sélecteur de modèles, avec une seule clé.
Settings → Models → « Add model provider » → « Custom model API » demande cinq champs — Provider ID, display name, base URL, API protocol et API key — et place Claude et GPT dans le même sélecteur que la carte DeepSeek intégrée.
# 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 utilise https://api.kunavo.com/v1 ; anthropic-messages utilise https://api.kunavo.com, sans /v1, car dsh ajoute lui-même /v1/messages. Un test de dsh 0.2.0-rc.2 contre un substitut qui enregistre les requêtes a confirmé les deux cas : le premier a envoyé sa requête à /v1/chat/completions, le second à /v1/messages?beta=true depuis la racine sans chemin — et à /v1/v1/messages lorsque son URL de base conservait /v1, ce à quoi une vraie passerelle répond par un 404, et non par une erreur d’authentification.reasoningEfforts modifie le rôle de l’invite système, pas sa réception. La documentation du harnais indique qu’un modèle déclarant le raisonnement reçoit son invite système sous la forme role: "developer". Kunavo interprète ce rôle comme le tour système pour toutes les familles, Claude compris ; aucun réglage compat n’est donc nécessaire. Jusqu’au 2026-09-30, le chemin Claude supprimait le rôle, et cette fiche vous indiquait de définir compat.supportsDeveloperRole: false ; si vous l’avez fait, cela ne pose pas de problème et vous pouvez le conserver.deepseek-, et utilisez celle-ci pour les identifiants Claude et GPT du tableau ci-dessous. Cela signifie également que le réglage compat.thinkingFormat: deepseek documenté par le harnais pour « DeepSeek V4 derrière une passerelle compatible avec OpenAI » n’a aucun effet ici.dsh_session_log, les événements de la session, y compris le chemin de votre répertoire de travail, et dsh_plugin_packages. Lors du test, aucun des deux fournisseurs personnalisés ne les a envoyés ; un fournisseur Kunavo ne les reçoit donc pas. Leur poids et le réglage qui désactive leur envoi sont indiqués dans les tarifs de DeepSeek Harness.curl ci-dessous, et vous pouvez la vérifier en dix secondes ; dsh est une préversion pour développeurs qui évolue encore.sk-kn-) et ajoutez un crédit à partir de 10 $ — les appels sont payés sur ce solde et les appels échoués ne sont pas facturés. Le tableau de bord s’ouvre ensuite sur la configuration DeepSeek Harness.Étape par étape
- Créez une clé sur
/app/keyset copiez-la — elle n’est affichée qu’une seule fois. - Démarrez l’interface Web (
dsh web) et accédez à Settings → Models. Choisissez Add model provider. La fiche s’ouvre sur Third-party model provider, qui ne répertorie que les fournisseurs inclus dansdsh; sélectionnez Custom model API. - Renseignez Provider ID (en minuscules et définitif — la documentation précise que les requêtes, les sessions enregistrées, les modèles par défaut et les références d’identifiants y font tous appel ; pour le renommer, il faut ajouter un nouveau fournisseur et supprimer l’ancien), le nom d’affichage, l’URL de base
https://api.kunavo.com/v1, le protocole d’API OpenAI Chat Completions et la clé API. La clé est accessible uniquement en écriture ; dsh la conserve dans$DSH_HOME/.credentials.yamlet ne stocke qu’une référence dans le profil. - Dans Model catalog, choisissez Fetch available models : Kunavo répond à
GET /v1/models, et le sélecteur se remplit donc automatiquement. Cochez les modèles souhaités et choisissez Add selected. Les identifiants saisis manuellement fonctionnent tout aussi bien ; la documentation recommande d’utiliser cette méthode de remplacement lorsque la détection ne renvoie aucun modèle. - Facultatif : pour les identifiants Claude utilisant le protocole propre à Anthropic, ajoutez une deuxième API de modèle personnalisée avec son propre Provider ID, l’URL de base
https://api.kunavo.com— sans/v1—, le protocole d’API Anthropic Messages et la même clé. La récupération répertorie ici aussi tout le catalogue ; n’ajoutez que les identifiantsclaude-(pourquoi seulement ceux-ci). - Choisissez un modèle dans le compositeur et envoyez un tour qui touche un fichier, plutôt qu’une simple salutation : le harnais s’appuie sur l’appel d’outils pour la plupart de ses tâches, et un premier essai qui lit et modifie quelque chose vous en apprendra davantage. Les changements de modèle prennent effet à la requête suivante ; la documentation précise qu’aucun redémarrage n’est nécessaire.
Vérifié avec la page « Configure models » de DeepSeek Harness (même texte que docs/user/guide/providers.md à la balise dsh-v0.2.0-rc.2) le 1 octobre 2026. Les paramètres tiers évoluent ; si le nom d’un champ ne correspond plus à ce que vous voyez ici, cette page fait autorité, pas celle-ci.
Vérifiez avant de déboguer le client
Une requête suffit à déterminer si l’échec vient de l’endpoint, de la clé ou du fichier de configuration. Si cette requête renvoie du JSON, la même URL de base et la même clé fonctionnent dans 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-..."Quel identifiant de modèle saisir dans le champ
Tous les modèles textuels sont accessibles sous forme d’identifiant de modèle — la liste à jour se trouve sur GET /v1/models, et le catalogue avec les prix sur la page des modèles. Les tarifs sont en USD par million de tokens, entrée / sortie.
| Identifiant du modèle | Entrée / sortie sur Kunavo | Où cela s’intègre dans DeepSeek Harness |
|---|---|---|
claude-sonnet-5 | $1.40 / $7.00 | le modèle de travail par défaut pour les sessions qui modifient des fichiers |
claude-opus-5 | $3.50 / $17.50 | planifier une modification dont une erreur coûterait cher |
claude-haiku-4-5 | $0.70 / $3.50 | requêtes économiques — triage, résumés, boucle qui tourne toute la journée |
gpt-5-6-sol | $2.00 / $12.00 | un deuxième avis provenant d’une autre famille, avec la même clé et le même fournisseur |
gpt-5-6-terra | $0.70 / $4.20 | les longues entrées, pour lesquelles le tarif par jeton détermine la facture |
Claude avec Anthropic Messages
Kunavo répond également à l’API Anthropic Messages, et anthropic-messages est l’un des trois protocoles proposés dans le formulaire. La documentation du harnais indique clairement : « Un fournisseur utilise un protocole ; une passerelle qui en propose deux nécessite donc deux fournisseurs ». Il s’agit donc d’un deuxième fournisseur à côté du premier, et non d’un réglage de celui-ci.
- URL de base
https://api.kunavo.com, la racine sans chemin. Lors du test, cette racine a envoyé la requête à/v1/messages?beta=true— le chemin qu’utilise aussi Claude Code et auquel Kunavo répond. Avec/v1à la fin, la requête a été envoyée à/v1/v1/messages. DeepSeek Harness et Claude Code présente côte à côte les requêtes des deux clients. - Uniquement les identifiants Claude. L’API
/v1/messagesde Kunavo prend en charge les identifiantsclaude-et rien d’autre ; un identifiantgpt-y reçoit une réponse404qui nomme/v1/chat/completions. Gardez GPT sur le fournisseuropenai-completions. - La récupération répertorie tous les modèles ; n’ajoutez que ceux de Claude. Le fichier README de
llm-pi-aidsh indique que, pour ce protocole, la détection envoie une requêteGET /v1/modelsavec l’en-têtex-api-keyd’Anthropic, et que la liste des modèles Kunavo accepte la clé dans cet en-tête, comme dansAuthorization: Bearer— ces informations proviennent du code source de dsh et des propres tests de Kunavo, pas du test décrit ici. La commande Fetch available models renvoie l’ensemble du catalogue, y compris les modèles GPT et d’image ; ne cochez donc que les identifiantsclaude-. La saisie manuelle donne le même résultat. Une liste complète prouve moins qu’il n’y paraît : le même fichier README indique que l’URL de liste est acceptée avec ou sans/v1, tandis que les requêtes de modèles utilisent l’URL de base sans modification. Ainsi, la récupération remplit aussi la liste depuishttps://api.kunavo.com/v1, et le premier tour envoyé depuis cette URL de base aboutit à/v1/v1/messages. - Ce que cela vous apporte. La requête arrive au format Anthropic : lors du test, l’invite système a été transmise dans le champ de premier niveau
system, de sorte que le rôledevelopern’intervient pas. Kunavo la transmet telle quelle, sans la convertir depuis le format OpenAI. Le fournisseuropenai-completionspermet d’accéder aux mêmes identifiants Claude par traduction ; c’est pourquoi il est utilisé dans la procédure.
Le fichier derrière le formulaire
La page Models écrit dans $DSH_HOME/profiles/<profile>/cordis.patch.yml — $DSH_HOME/profiles/web/cordis.patch.yml lorsque vous commencez avec dsh web. Les anciennes versions de la documentation dsh indiquaient $DSH_HOME/settings.yaml ; ce n’est plus le cas dans celle de la version 0.2.0-rc.2. Lorsque le navigateur et le serveur se trouvent sur la même machine, Open configuration file dans l’en-tête Settings ouvre ce fichier, et les adaptateurs le relisent à la requête suivante. Cinq éléments comptent pour ce point de terminaison :
- Fenêtre de contexte et nombre maximal de jetons de sortie — dans le formulaire, sous Customized settings → Model options. Un identifiant saisi manuellement ne comporte aucune de ces valeurs ; les valeurs de repli de la route s’appliquent donc : 262,144 jetons de contexte et 32,768 jetons de sortie, selon le fichier README de
llm-pi-ai. Lors du test, les deux fournisseurs personnalisés ont demandé exactementmax_tokens: 32768. Chaque identifiant du tableau ci-dessus accepte une valeur supérieure ; vérifiez la ligne correspondante dans tous les cas et augmentez ces valeurs à partir de l’entrée du catalogue du modèle si vous le souhaitez. Kunavo facture les jetons générés par le modèle, pas la limite maximale. compat.supportsDeveloperRole— inutile. Le harnais le recommande pour les passerelles qui rejettent le rôledeveloper; Kunavo interprète ce rôle comme le tour système pour toutes les familles, Claude compris. (Jusqu’au 2026-09-30, le chemin Claude le supprimait et cet élément vous indiquait d’activer le réglage ; le laisser activé ne pose pas de problème.)compat.maxTokensField— laissez-le tel quel. Le harnais l’associe au réglage ci-dessus comme correctif initial habituel, mais le gestionnaire propre à Kunavo litmax_completion_tokenset utilisemax_tokenscomme valeur de repli ; le réglage par défaut fonctionne donc déjà.reasoningEfforts— aucun champ dans le formulaire. Un modèle saisi manuellement ne déclare aucun niveau ; le menu Effort n’apparaît donc pas et la valeur par défaut propre au point de terminaison détermine si le modèle raisonne. Déclarez les niveaux vous-même si vous souhaitez afficher ce menu ; suropenai-completions, chaque clé est un niveau et sa valeur est la forme envoyée commereasoning_effort. Cela fonctionne avec un identifiantgpt-; avec un identifiantclaude-, cela n’a aucun effet, car l’interface de chat de Kunavo ne transmet pasreasoning_effortà Anthropic (/docs/chat#reasoning).- Types d’entrée (
input: [text, image]dans le fichier) — la documentation précise que cela « énonce une affirmation au sujet de votre point de terminaison au lieu de la vérifier ». Si vous cochez Image pour un identifiant qui ne prend pas les images en charge, le harnais ne le détecte pas ; la requête sera refusée plus loin dans le traitement. Vérifiez l’identifiant sur/modelsavant de cocher la case.
Le reste des éléments envoyés par une session — 24 définitions d’outils par tour, une courte requête de titre pour chaque nouvelle session et les champs supplémentaires sur la route DeepSeek intégrée — est détaillé dans les tarifs de DeepSeek Harness.
Questions fréquentes
Comment ajouter un fournisseur d’API personnalisé à DeepSeek Harness ?
Démarrez l’interface Web avec dsh web, accédez à Settings → Models et choisissez « Add model provider ». La fiche s’ouvre sur « Third-party model provider », qui ne répertorie que les fournisseurs inclus dans dsh ; sélectionnez « Custom model API ». Le formulaire demande un Provider ID en minuscules, un nom d’affichage, une URL de base, un protocole d’API et une clé API, puis au moins un modèle dans Model catalog. Le Provider ID est définitif, car les requêtes, les sessions enregistrées, les modèles par défaut et les références d’identifiants y font tous appel ; pour le renommer, il faut ajouter un nouveau fournisseur et supprimer l’ancien. Dans la version 0.2.0-rc.2, la page enregistre les paramètres dans cordis.patch.yml du profil actif — $DSH_HOME/profiles/web/cordis.patch.yml avec dsh web.
L’URL de base de DeepSeek Harness doit-elle se terminer par /v1 ?
Cela dépend du protocole d’API. Pour openai-completions, oui : https://api.kunavo.com/v1, qui a envoyé la requête à /v1/chat/completions lors d’un test de dsh 0.2.0-rc.2. Pour anthropic-messages, non : https://api.kunavo.com, car dsh ajoute lui-même /v1/messages. La racine sans chemin a envoyé la requête à /v1/messages?beta=true, tandis qu’une URL de base se terminant par /v1 l’a envoyée à /v1/v1/messages ; une vraie passerelle répond à cette dernière par une erreur 404, et non par une erreur d’authentification. Le test a été effectué contre un substitut local qui enregistre les requêtes, pas contre Kunavo.
DeepSeek Harness peut-il utiliser des modèles Claude ou GPT à la place de DeepSeek ?
Oui. Le champ du protocole d’API désigne le format réseau, pas le fournisseur : openai-completions correspond à OpenAI Chat Completions, openai-responses à l’API Responses et anthropic-messages à l’API Anthropic Messages. Un fournisseur personnalisé transmet directement l’identifiant de modèle que vous avez indiqué à l’URL de base configurée ; l’identifiant Claude ou GPT est donc résolu à ce point de terminaison, et non dans le harnais. Sur Kunavo, un fournisseur openai-completions à l’adresse https://api.kunavo.com/v1 donne accès aux identifiants Claude et GPT ; un deuxième fournisseur anthropic-messages à l’adresse https://api.kunavo.com donne accès uniquement aux identifiants Claude, dans le format de requête propre à Anthropic. Les deux s’ajoutent à la fiche DeepSeek intégrée au lieu de la remplacer ; les identifiants DeepSeek continuent donc d’utiliser votre clé DeepSeek.
Que transmet DeepSeek Harness à un fournisseur personnalisé ?
Lors d’un test enregistré de dsh 0.2.0-rc.2, les deux fournisseurs personnalisés — openai-completions et anthropic-messages — ont envoyé 24 définitions d’outils à chaque tour de l’agent, demandé max_tokens 32,768, valeur de repli du harnais pour un modèle saisi sans taille, et effectué une courte requête de titre par nouvelle session avec max_tokens 64. Aucun n’a envoyé dsh_session_log ou dsh_plugin_packages : ces deux champs, le journal des événements de la session et la liste des modules installés, n’ont été transmis qu’avec la route DeepSeek intégrée. Le test utilisait un substitut qui enregistre les requêtes, pas Kunavo ; il montre donc ce que dsh envoie, pas ce que les fournisseurs en font.
Pourquoi DeepSeek Harness se comporte-t-il comme s’il ignorait mon invite système ?
Vérifiez si le modèle déclare des niveaux de raisonnement. Avec openai-completions, le harnais envoie l’invite système d’un modèle de raisonnement sous le rôle « developer » plutôt que « system », car il déduit le format de la requête à partir de l’URL du point de terminaison et considère comme non reconnue toute adresse qui ne correspond pas à celle d’OpenAI. Kunavo interprète ce rôle comme le tour système pour toutes les familles de modèles, Claude compris ; sur Kunavo, l’invite arrive donc dans les deux cas. Jusqu’au 2026-09-30, le chemin Claude supprimait silencieusement ce rôle ; si une invite a disparu avant cette date, c’en était la cause. La solution de contournement consistait à définir compat.supportsDeveloperRole: false pour la route ou le modèle dans le fichier cordis.patch.yml du profil. Ce n’est plus nécessaire, et cela ne pose pas de problème si le réglage est conservé. Un fournisseur anthropic-messages n’envoie jamais ce rôle : l’invite système est transmise dans le champ system de premier niveau d’Anthropic.
Pourquoi « Fetch available models » ne renvoie-t-il rien ou une erreur 401 dans DeepSeek Harness ?
La détection utilise l’URL de base, le protocole et la clé actuellement renseignés dans le formulaire. Une réponse 401 indique généralement un problème de clé ; une liste vide, un problème d’URL de base ou un format de liste que la détection ne sait pas lire. Le harnais documente ces deux cas et indique de saisir les identifiants manuellement, ce qui fonctionne de la même façon. Les deux protocoles transmettent la clé différemment : openai-completions utilise Authorization: Bearer, tandis qu’anthropic-messages utilise l’en-tête x-api-key d’Anthropic ; la liste des modèles de Kunavo accepte les deux. Pour déterminer où se situe le problème, lancez un simple curl vers https://api.kunavo.com/v1/models avec la même clé dans le même en-tête : une réponse JSON indique un problème dans le formulaire, une erreur 401 indique un problème de clé et une erreur 404 un problème d’URL. Avec anthropic-messages, une liste complète laisse deux points à vérifier : l’URL de base, car la détection supprime un /v1 final de l’URL de liste, mais pas des requêtes de modèles ; et les identifiants que le fournisseur peut appeler, car la liste correspond à l’ensemble du catalogue et seuls les identifiants claude- fonctionnent ici. Un fournisseur intégré répond toujours à partir du catalogue installé, même lorsque son URL de base pointe ailleurs ; utilisez donc un fournisseur personnalisé pour voir ce que le point de terminaison propose réellement.