Qu'est-ce qu'un harnais d'agent (agent harness) ?

Un harnais d'agent (agent harness) est la couche qui entoure un modèle de langage et transforme de simples appels au modèle en agent : il fait tourner la boucle, exécute les outils que le modèle demande, gère la fenêtre de contexte et décide de ce que le modèle a le droit de faire.

Où passent les frontières

Le terme se cerne le plus facilement par élimination. Un agent de code en fonctionnement compte quatre couches, et seules deux d'entre elles relèvent du harnais. En dessous se trouvent un modèle que vous n'avez pas entraîné et une API HTTP que vous ne contrôlez pas ; au-dessus, ce qui affiche la sortie à l'écran. Le harnais, c'est tout ce qui se trouve entre les deux — autrement dit, tout ce qui doit être décidé.

CoucheResponsableCe qu'elle décide
Poids du modèle et inférenceLe fournisseurAnthropic, OpenAI, Google, ou un runtime sur votre propre machine.
Format d'échangeLe fournisseurLe format HTTP propre à chaque fournisseur pour les messages, les outils et le streaming.
Boucle d'agentLe harnaisAppeler, lire la réponse, exécuter ce qui est demandé, rappeler, s'arrêter quand c'est terminé.
Exécution des outilsLe harnaisValider les arguments, exécuter l'outil et décider de ce qui tourne en parallèle.
Outils externes (MCP)Le harnaisDécouvrir les serveurs, attribuer un espace de noms à leurs outils, leur parler en JSON-RPC.
ContexteLe harnaisCe qui reste dans la fenêtre, ce qui est compacté, ce qui est rappelé d'avant.
PermissionsLe harnaisCe que l'agent peut faire sans demander, et ce pour quoi il doit d'abord demander.
RenduL'interfaceUn terminal, un navigateur, une fenêtre de bureau, ou aucun affichage.

Lisez le tableau de haut en bas et la raison d'être du terme devient évidente : les deux lignes du haut changent tous les quelques mois, celle du bas est une affaire de goût, et les cinq du milieu sont là où se jouent réellement toutes les décisions difficiles d'un agent. Nommer ce milieu, c'est le rôle du mot.

Pourquoi l'indépendance vis-à-vis du modèle est la partie difficile

Presque tous les harnais sont écrits pour un fournisseur, puis adaptés aux autres. C'est cet ordre qui pose problème : les hypothèses du premier fournisseur finissent dans le stockage des conversations, dans le schéma des outils, dans la façon dont une réponse en streaming est analysée — des endroits où personne ne pense à regarder ensuite. Changer suppose alors une migration, et une migration en pleine session signifie que vous ne changez pas.

L'alternative consiste à stocker l'historique dans un format qui n'appartient à aucun fournisseur, et à le rendre au format d'échange d'un fournisseur au moment où une requête part. Rien n'est converti quand le modèle change, parce que rien n'a jamais été au format de l'ancien modèle. C'est la décision de conception autour de laquelle OHarness est construit, et la page d'architecture explique comment ce découpage en couches est imposé, et pas seulement voulu.

Harnais, framework, SDK

  • Un SDK envoie une requête à un modèle et rapporte une réponse. Un appel, un fournisseur, aucune mémoire du précédent.
  • Un framework vous donne des pièces pour assembler un agent. Vous décidez toujours de la boucle, des nouvelles tentatives, de la politique de compaction — et vous en êtes responsable ensuite.
  • Un harnais est l'ensemble déjà assemblé. La boucle, l'exécution des outils, la gestion du contexte et les permissions sont déjà décidées ; vous fournissez des outils, un modèle et une politique.

Le test pratique : ce qui se passe le jour où vous voulez un autre modèle. Avec un SDK, vous réécrivez le point d'appel. Avec un framework, vous découvrez combien de vos propres pièces supposaient l'ancien fournisseur. Avec un harnais conçu pour cela, vous changez un réglage.

Questions fréquentes

Un harnais d'agent est-il la même chose qu'un framework d'agent ?

Les deux se recoupent, et la distinction utile porte sur ce que vous obtenez au bout du compte. Un framework vous demande de construire un agent à partir de ses pièces — vous écrivez la boucle, le graphe, les nouvelles tentatives. Un harnais, c'est la boucle, déjà écrite : vous lui donnez des outils, un modèle et un jeu de permissions, et il tourne. La plupart des frameworks permettent de construire un harnais ; un harnais est ce que vous auriez sinon construit vous-même.

Si un fournisseur propose déjà un SDK, ai-je besoin d'un harnais ?

Le SDK d'un fournisseur vous mène jusqu'à l'appel au modèle et s'arrête là. Il n'a aucun avis sur le moment de rappeler, sur ce qu'il faut faire du résultat d'un outil, sur ce qu'il faut abandonner quand la fenêtre de contexte se remplit, ni sur l'opportunité d'exécuter une commande shell sans demander. Ces décisions, c'est le harnais ; si vous n'en adoptez pas un, vous en écrirez un — généralement par accident, éparpillé dans une base de code, pour un seul et unique fournisseur.

Un même harnais peut-il dialoguer avec plusieurs fournisseurs de modèles ?

Oui, mais seulement s'il a été conçu ainsi dès le départ. La difficulté n'est pas le HTTP : c'est que l'historique de conversation, les définitions d'outils et la sortie en streaming ont tous une forme propre au fournisseur, et qu'un harnais qui stocke l'historique au format d'un fournisseur doit le migrer pour changer. Stocker l'historique sous une forme neutre et le rendre au format d'échange du fournisseur au moment de la requête, c'est ce qui rend le changement gratuit.

Existe-t-il un harnais d'agent open source ?

Plusieurs publient leur code source, dont OpenCode, Cline et Gemini CLI. OHarness est gratuit et ses paquets npm sont publiés sous licence MIT, mais son dépôt source est privé pour l'instant. Il parle nativement à Anthropic, OpenAI et Google Gemini, à n'importe quel endpoint compatible OpenAI et à des runtimes locaux comme Ollama, LM Studio et vLLM — et il tourne dans un terminal, un navigateur, une application de bureau et en mode headless, tous sur le même moteur.

Essayer l'implémentation

OHarness est un harnais d'agent indépendant du modèle, gratuit : deux dépendances d'exécution, chaque fournisseur joint en simple fetch et SSE, et son propre client MCP. La documentation est écrite à côté du code qu'elle décrit, et la page de téléchargement propose les versions de bureau et la ligne de commande.