Documentation

Documentation

OpenHands

OpenHands fait passer chaque appel de modèle par LiteLLM ; l’endpoint se configure donc avec deux champs qui doivent correspondre : un identifiant de modèle préfixé par openai/ et une URL de base qui conserve /v1. Une fois cette paire correctement renseignée, l’onglet Advanced communique avec Claude et GPT à l’aide d’une seule clé.

Settings → LLM → Advanced demande trois champs — Custom Model, Base URL, API Key — avec l’identifiant du modèle portant le préfixe openai/ et l’URL de base conservant son /v1.

Paramètres → LLM → Avancé
# Settings → LLM → Advanced  (toggle "Advanced" on first)
Custom Model   openai/claude-sonnet-5
Base URL       https://api.kunavo.com/v1
API Key        sk-kn-...

# The "openai/" prefix is the provider, not a vendor: it tells OpenHands to
# speak the OpenAI Chat Completions protocol to the Base URL above. The model
# id after the slash is Kunavo's, and resolves at Kunavo.
#
# Keep the /v1. It belongs to the openai/ prefix — a litellm_proxy/ model
# takes the bare origin instead, which is the opposite convention.
Conservez le /v1 et le préfixe openai/ : ils relèvent d’un seul et même choix. La page des paramètres d’OpenHands dit seulement : « Si votre fournisseur a une URL de base spécifique, indiquez-la ici. » Le champ lui-même ne permet donc pas de déterminer le format. Le préfixe, lui, le permet. La page Configure a Model prescrit openai/<served-model-id> pour un serveur compatible avec OpenAI, en indiquant de prendre l’identifiant « généralement depuis son endpoint GET /v1/models » ; la seule valeur concrète présentée pour le Base URL de cette route se termine par /v1 — http://host.docker.internal:1234/v1 dans le guide LM Studio. Le contraste le prouve : un modèle litellm_proxy/ est documenté avec une URL de base https://your-litellm-proxy.com, sans aucun /v1. Mélanger les deux — openai/ avec une origine sans chemin ou /v1 sous litellm_proxy/ — est une cause fréquente d’erreur 404 plutôt que 401.
Les deux exemples openai/ d’OpenHands concernent des serveurs locaux : LM Studio, Ollama, vLLM et SGLang. Sa documentation ne présente aucun exemple concret de passerelle distante compatible avec OpenAI ; l’explication ci-dessus porte donc sur la règle de préfixe et la forme de la valeur, et non sur une page consacrée à ce cas. Si OpenHands en documente une ultérieurement, cette page fera autorité.
Cette configuration a été relevée dans la documentation officielle d’OpenHands à la date indiquée ci-dessous. Kunavo n’a pas exécuté OpenHands avec son endpoint — aucune conversation, aucun tour en flux continu, aucun aller-retour avec outil, aucune version du client épinglée. Une page de configuration publiée n’est pas un test, et rien ici ne doit être interprété comme tel. Le curl ci-dessous est le point que vous pouvez vérifier en dix secondes ; le comportement du client relève d’OpenHands.
Kunavo ne propose aucun modèle d’embeddings, de synthèse vocale ni de transcription vocale ; cet endpoint répond donc uniquement aux complétions de chat. Laissez LLM_EMBEDDING_MODEL et LLM_EMBEDDING_DEPLOYMENT_NAME non définis, et conservez le fournisseur qui alimente déjà votre index vectoriel ou votre étape audio.
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 OpenHands.

Étape par étape

  1. Créez une clé sur /app/keys et copiez-la — elle n’est affichée qu’une seule fois.
  2. Ouvrez Paramètres → LLM et activez le bouton Advanced. Les trois champs apparaissent dans cet ordre : Custom Model, Base URL, API Key.
  3. Saisissez l’identifiant du modèle avec son préfixe — openai/claude-sonnet-5, et non claude-sonnet-5. Les identifiants proposés par Kunavo sont ceux renvoyés par GET /v1/models, soit la même liste que la documentation officielle d’OpenHands vous indique d’utiliser pour choisir un identifiant personnalisé.
  4. Collez https://api.kunavo.com/v1 dans le champ Base URL et votre clé dans API Key, puis cliquez sur Save Changes. OpenHands indique que l’enregistrement d’un profil local valide d’abord la configuration auprès du backend et bloque l’enregistrement en cas d’échec ; une erreur ici correspond donc à un véritable rejet, et non à un simple problème d’affichage.
  5. Vérifiez ce à quoi le backend peut accéder, et non votre navigateur. L’URL de base doit être accessible depuis la machine exécutant l’Agent Server — la documentation précise que si Agent Canvas s’exécute dans Docker, 127.0.0.1 est le conteneur. Un endpoint public comme celui de Kunavo est le cas le plus simple ; un proxy d’entreprise placé devant lui ne l’est pas.
  6. Démarrez une conversation nouvelle et confiez-lui une tâche qui lit et modifie un fichier. OpenHands précise qu’un LLM enregistré s’applique aux nouvelles conversations et que les anciennes doivent d’abord être redémarrées ; une exécution qui utilise les outils vous renseigne davantage sur l’association que ne le ferait un simple salut.

Vérifié avec Page des paramètres du modèle de langage (LLM) d’OpenHands le 21 septembre 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 OpenHands.

# 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 OpenHands
claude-sonnet-5$1.40 / $7.00le modèle de travail quotidien — saisissez-le sous la forme openai/claude-sonnet-5
claude-opus-4-8$3.50 / $17.50le modèle placé en tête de la famille Claude dans la table d’index officielle d’OpenHands
claude-haiku-4-5$0.70 / $3.50un profil économique pour les modifications courantes, vers lequel basculer au cours d’une conversation
gpt-5-6-sol$2.00 / $12.00une deuxième famille utilisant la même clé et la même Base URL
gpt-6-astra$4.00 / $20.00un troisième avis lorsqu’un plan déraille sans cesse
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.

Trois particularités à connaître avant le débogage

OpenHands comporte davantage d’éléments qu’une interface en ligne de commande à processus unique, et deux d’entre eux ressemblent à l’endpoint LLM sans en être un. Voici ce qu’indique sa documentation officielle, consultée à la date mentionnée ci-dessus :

  1. Le bac à sable n’est pas le modèle. OpenHands exécute votre travail dans un bac à sable du serveur agent et appelle le modèle sur le réseau ; ce sont des interfaces distinctes, avec des identifiants d’accès distincts. Une clé configurée ici autorise des appels au modèle. Elle ne détermine en rien ce à quoi le bac à sable peut accéder ; un problème réseau dans le bac à sable ne ressemble pas à une erreur d’authentification.
  2. Les agents ACP sont entièrement distincts. Agent Canvas peut déléguer à Claude Code, Codex ou Gemini CLI en tant qu’agent ACP, et la page Configure a Model précise qu’ils « gèrent leur propre accès aux modèles » — un profil LLM ne redirige donc pas ce sous-processus. Si vous vous attendiez à voir du trafic sur votre clé et qu’il n’y en a pas, vérifiez quel agent est réellement en cours d’exécution. La comparaison entre OpenHands et Claude Code explique cette distinction, y compris la règle de priorité des identifiants qui la détermine.
  3. Profils et limite de 10 profils. Une configuration enregistrée devient un profil LLM ; le dernier profil enregistré devient actif pour les nouvelles conversations, et il est possible de changer de profil en cours de conversation sans perdre le contexte — c’est ce qui permet d’utiliser un identifiant économique et un identifiant coûteux avec une seule clé. La documentation limite ce nombre à 10 profils par compte. Une connexion de fournisseur enregistre une fois le fournisseur, la clé API et l’URL de base facultative pour plusieurs profils. La même page précise que ce panneau est disponible sur les backends de serveur agent locaux et masqué sur un backend OpenHands Cloud.

Questions fréquentes

Comment configurer un endpoint d’API personnalisé dans OpenHands ?

Ouvrez Paramètres → LLM et activez le bouton Advanced, qui, selon la documentation d’OpenHands, permet de « définir des modèles personnalisés ainsi que certains paramètres LLM supplémentaires ». Trois champs apparaissent dans cet ordre : Custom Model, Base URL, API Key. Saisissez l’identifiant du modèle avec un préfixe de fournisseur — openai/<model-id> pour un endpoint compatible avec OpenAI —, indiquez l’endpoint dans Base URL, collez votre clé, puis cliquez sur Save Changes. La configuration enregistrée devient un profil LLM et s’applique aux nouvelles conversations ; les anciennes doivent être redémarrées pour la prendre en compte.

L’URL de base d’OpenHands doit-elle se terminer par /v1 ?

Pour un modèle avec le préfixe openai/, oui. La page des paramètres indique seulement de préciser l’URL de base si votre fournisseur en a une spécifique ; elle ne suffit donc pas à déterminer la valeur — c’est le préfixe qui le permet. La page « Configure a Model » d’OpenHands prescrit openai/<served-model-id> pour un serveur compatible avec OpenAI et récupère l’identifiant depuis son endpoint GET /v1/models. La seule URL de base fournie en exemple pour cette configuration, dans le guide LM Studio, est http://host.docker.internal:1234/v1. C’est l’inverse pour un modèle litellm_proxy/ : son URL de base documentée est l’origine du proxy seule, sans /v1. Pour Kunavo, utilisez donc https://api.kunavo.com/v1.

Pourquoi OpenHands refuse-t-il d’enregistrer mon profil LLM ?

OpenHands valide un profil local auprès du backend avant de l’enregistrer. Sa documentation précise qu’en cas d’échec de la validation — elle cite une clé API invalide ou un modèle indisponible — l’enregistrement est bloqué et l’erreur affichée. Un enregistrement bloqué correspond donc à un véritable rejet. Déterminez d’abord, en dehors du client, lequel des deux éléments est en cause : une requête curl vers /v1/models sur l’endpoint, avec la même clé, renvoie du JSON si la paire est correcte, une erreur 401 si la clé est incorrecte et une erreur 404 si l’URL l’est. Les anciens backends qui ne prennent pas en charge la validation ignorent cette vérification et enregistrent le profil normalement.

OpenHands peut-il utiliser des modèles Claude via un endpoint compatible avec OpenAI ?

Oui. Le préfixe openai/ désigne un protocole de communication, et non un fournisseur : OpenHands envoie une complétion de chat au format OpenAI à l’URL de base que vous avez configurée et transmet tel quel l’identifiant qui suit la barre oblique. L’identifiant Claude est donc résolu par cet endpoint, et non par OpenHands. Gardez à l’esprit qu’OpenHands s’appuie fortement sur l’appel d’outils et que sa documentation indique qu’il lui faut un modèle puissant pour fonctionner correctement. Ce n’est donc pas l’endroit où choisir l’identifiant le moins cher possible.

Kunavo a-t-il testé cette configuration dans OpenHands ?

Non. La vérification effectuée le 21 septembre 2026 porte sur la documentation d’OpenHands : les noms des champs, leur ordre, la règle du préfixe et le format de l’URL de base en sont tirés. Kunavo n’a pas exécuté de conversation OpenHands avec son endpoint et ne fait ici aucune affirmation concernant l’authentification, le streaming, les échanges d’appels d’outils ou le routage des modèles dans une version donnée du client. La seule chose que vous pouvez vérifier indépendamment est que l’endpoint et la clé fonctionnent, ce que permet de tester la requête curl sur cette page.