Changer de modèle en cours de session ne coûte rien
· 3 min de lecture
Et c'est un choix de conception, pas une fonctionnalité. La plupart des outils pour agents sont écrits pour un seul fournisseur, puis adaptés aux autres. Cet ordre a l'air d'un détail d'implémentation. C'est en réalité tout le sujet.
Adapter après coup signifie que les hypothèses du premier fournisseur sont déjà porteuses quand le deuxième arrive. Elles sont dans le stockage des conversations, dans la représentation d'un appel d'outil, dans l'analyse d'une réponse en streaming — autant d'endroits où personne ne pense à regarder un an plus tard. On n'en remarque que le symptôme : changer de fournisseur implique une migration, et une migration en pleine session signifie qu'on ne change pas de fournisseur.
Où se cache l'hypothèse
L'endroit évident où regarder, c'est l'appel HTTP, et c'est le mauvais. Entre les endpoints de deux fournisseurs, il y a un week-end de travail. Ce qui coûte cher, c'est ce que vous avez fait de la réponse.
Prenons un détail. La plupart des fournisseurs identifient un résultat d'outil par l'id de l'appel qui l'a produit. Gemini l'identifie par le nom de la fonction. Si votre stockage de conversations conserve les résultats d'outils tels que le fournisseur A les décrivait, prendre en charge Gemini ne demande pas un nouveau client HTTP : cela modifie la forme de toutes les transcriptions que vous avez déjà écrites.
Voilà tout le problème en miniature. Aucun adaptateur ne le résout, car l'information a été jetée au moment de l'écriture.
Un historique neutre
L'autre voie consiste à décider, avant d'écrire le premier fournisseur, que l'historique n'appartient à aucun d'eux.
OHarness stocke les transcriptions de session dans une forme définie par le moteur (packages/engine/src/core/types.ts), et non dans le format d'un fournisseur. Un résultat d'outil porte toolName en plus de toolCallId — non pas parce que le moteur a besoin des deux, mais parce que Gemini a besoin du nom et tous les autres de l'id, et que la forme neutre doit pouvoir se traduire dans l'une comme dans l'autre.
Le format de transmission d'un fournisseur est produit au moment où une requête part et abandonné lorsque la réponse est réintégrée. Rien n'est conservé sous cette forme.
Changer de fournisseur en cours de session ne convertit donc rien. Non pas parce que la conversion est rapide, mais parce qu'il n'existe aucune ancienne forme à partir de laquelle convertir.
Ce que cela apporte, concrètement
Un modèle, c'est un tarif, une capacité, une limite de débit et de mauvaises semaines. Quand ces décisions appartiennent à quelqu'un d'autre et que vous n'avez qu'un modèle, elles deviennent les vôtres. L'intérêt d'un backend remplaçable n'est pas la nouveauté : c'est que le jour où un fournisseur change ses conditions devient un jour où vous pouvez avoir votre mot à dire.
Cela fait aussi fonctionner le cas ordinaire. Rédiger avec un modèle bon marché, passer à un modèle coûteux pour la partie difficile, revenir à un modèle sur votre propre machine quand le réseau est mauvais ou que le code ne doit pas quitter les locaux. C'est la même session.
Ce qui n'est pas gratuit
Soyons honnêtes sur le compromis : le format neutre est un engagement. Chaque capacité qui diffère d'un fournisseur à l'autre — effort de raisonnement, cache de prompt, appels d'outils parallèles, prise en charge des images — doit être exprimée comme un indicateur sur le modèle plutôt que déduite du fournisseur, car envoyer la mauvaise forme donne une erreur 400, pas une réponse dégradée. C'est un vrai coût, payé une seule fois, à un endroit où il est visible.
L'alternative est de le payer encore et encore, à l'aveugle, pendant toute la vie du projet.
OHarness est un harnais d'agent open source, sous licence MIT. Il parle nativement à Anthropic, OpenAI et Google Gemini, à tout endpoint compatible OpenAI, ainsi qu'aux runtimes locaux comme Ollama, LM Studio et vLLM. La référence d'architecture décrit comment la séparation en couches est imposée plutôt que simplement souhaitée, et qu'est-ce qu'un harnais d'agent présente l'idée générale.