Documentation

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.

Paramètres → Modèles → Ajouter un fournisseur de modèles → API de modèle personnalisé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-5
L’URL de base dépend du protocole de l’API. openai-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.
Kunavo ne propose aucun modèle DeepSeek. Ce fournisseur se trouve à côté de la fiche DeepSeek, il ne la remplace pas : gardez votre clé DeepSeek là où elle se trouve pour les identifiants 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.
Le journal de votre session n’est pas transmis. Sur sa route DeepSeek intégrée, dsh ajoute à chaque requête deux champs que le modèle ne voit jamais : 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.
Personne chez Kunavo n’a testé DeepSeek Harness avec son point de terminaison. Le test effectué, à la date indiquée ci-dessous : dsh 0.2.0-rc.2 installé depuis npm, en mode sans interface, avec trois sessions vierges par route contre un substitut local qui enregistre chaque requête et répond par un appel d’outil — ni Kunavo ni un modèle. Les neuf sessions ont toutes effectué un aller-retour complet avec diffusion en continu et envoyé les mêmes octets à chaque fois, ce qui confirme les chemins et les limites indiqués sur cette page. Cela ne dit rien sur l’authentification ou le routage de Kunavo, ni sur les réponses d’un modèle. La partie Kunavo correspond à curl ci-dessous, et vous pouvez la vérifier en dix secondes ; dsh est une préversion pour développeurs qui évolue encore.
Kunavo ne propose aucun modèle d’intégration de vecteurs, de synthèse vocale ou de transcription vocale ; ce fournisseur ne répond donc qu’aux requêtes de complétion de chat. Un module du harnais qui transcrit de l’audio ou crée un index vectoriel conserve la clé du fournisseur qu’il utilise déjà : l’ajout de ce fournisseur ne redirige pas ces appels.
Pas encore de clé ? Créez un compte Kunavo, créez une clé (elle commence par 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

  1. Créez une clé sur /app/keys et copiez-la — elle n’est affichée qu’une seule fois.
  2. 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 dans dsh ; sélectionnez Custom model API.
  3. 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.yaml et ne stocke qu’une référence dans le profil.
  4. 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.
  5. 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 identifiants claude- (pourquoi seulement ceux-ci).
  6. 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èleEntrée / sortie sur KunavoOù cela s’intègre dans DeepSeek Harness
claude-sonnet-5$1.40 / $7.00le modèle de travail par défaut pour les sessions qui modifient des fichiers
claude-opus-5$3.50 / $17.50planifier une modification dont une erreur coûterait cher
claude-haiku-4-5$0.70 / $3.50requêtes économiques — triage, résumés, boucle qui tourne toute la journée
gpt-5-6-sol$2.00 / $12.00un 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.20les longues entrées, pour lesquelles le tarif par jeton détermine la facture
La facturation se fait au token à partir d’un solde prépayé, sans frais mensuels — consultez la facturation. Avec un contexte répété — ce qu’envoient la plupart des éditeurs et clients de chat — la mise en cache des prompts influe davantage sur la facture que le choix du modèle.

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/messages de Kunavo prend en charge les identifiants claude- et rien d’autre ; un identifiant gpt- y reçoit une réponse 404 qui nomme /v1/chat/completions. Gardez GPT sur le fournisseur openai-completions.
  • La récupération répertorie tous les modèles ; n’ajoutez que ceux de Claude. Le fichier README de llm-pi-ai dsh indique que, pour ce protocole, la détection envoie une requête GET /v1/models avec l’en-tête x-api-key d’Anthropic, et que la liste des modèles Kunavo accepte la clé dans cet en-tête, comme dans Authorization: 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 identifiants claude-. 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 depuis https://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ôle developer n’intervient pas. Kunavo la transmet telle quelle, sans la convertir depuis le format OpenAI. Le fournisseur openai-completions permet 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 :

  1. 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é exactement max_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.
  2. compat.supportsDeveloperRole — inutile. Le harnais le recommande pour les passerelles qui rejettent le rôle developer ; 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.)
  3. compat.maxTokensField — laissez-le tel quel. Le harnais l’associe au réglage ci-dessus comme correctif initial habituel, mais le gestionnaire propre à Kunavo lit max_completion_tokens et utilise max_tokens comme valeur de repli ; le réglage par défaut fonctionne donc déjà.
  4. 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 ; sur openai-completions, chaque clé est un niveau et sa valeur est la forme envoyée comme reasoning_effort. Cela fonctionne avec un identifiant gpt- ; avec un identifiant claude-, cela n’a aucun effet, car l’interface de chat de Kunavo ne transmet pas reasoning_effort à Anthropic (/docs/chat#reasoning).
  5. 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 /models avant 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.