Cambiar de modelo a mitad de sesión no cuesta nada
· 3 min de lectura
Y eso es una decisión de diseño, no una función. La mayoría de las herramientas de agentes se escriben pensando en un proveedor y después se adaptan a los demás. El orden parece un detalle de implementación. Es todo el asunto.
Adaptar después significa que, cuando llega el segundo proveedor, las suposiciones del primero ya sostienen el peso. Están en el almacén de conversaciones, en cómo se representa una llamada a herramienta, en cómo se analiza una respuesta en streaming, y a nadie se le ocurre buscar en ninguno de esos sitios un año después. Lo único que se nota es el síntoma: cambiar de proveedor implica una migración, y una migración a mitad de sesión significa que no cambias de proveedor.
Dónde se esconde la suposición
El lugar obvio para buscar es la llamada HTTP, y el lugar obvio es el equivocado. Entre los endpoints de dos proveedores cualesquiera hay un fin de semana de trabajo. Lo caro es lo que hiciste con la respuesta.
Tomemos un detalle. La mayoría de los proveedores identifican el resultado de una herramienta por el id de la llamada que lo produjo. Gemini lo identifica por el nombre de la función. Si tu almacén de conversaciones guarda los resultados de herramientas tal como los describía el proveedor A, entonces admitir Gemini no es un nuevo cliente HTTP: es un cambio en la forma que ya tienen todas las transcripciones que has escrito.
Ese es el problema entero en miniatura. No hay adaptador que lo arregle, porque la información se descartó en el momento de escribir.
Historial neutral
La alternativa es decidir, antes de escribir el primer proveedor, que el historial no pertenece a ninguno de ellos.
OHarness guarda las transcripciones de sesión en una forma definida por el motor (packages/engine/src/core/types.ts), no en el formato de ningún proveedor. Un resultado de herramienta lleva toolName además de toolCallId; no porque el motor necesite ambos, sino porque Gemini necesita el nombre y todos los demás necesitan el id, y la forma neutral tiene que poder convertirse en cualquiera de los dos.
El formato de transmisión de un proveedor se genera en el momento en que sale una solicitud y se descarta cuando la respuesta se incorpora de nuevo. Nada persiste en él.
Así que cambiar de proveedor a mitad de sesión no convierte nada. No porque la conversión sea rápida, sino porque no hay ninguna forma antigua desde la que convertir.
Qué te da esto, en concreto
Un modelo es algo con precio, capacidad, un límite de solicitudes y una mala semana. Cuando eso lo deciden otros y solo tienes un modelo, esas decisiones pasan a ser tuyas. La gracia de un backend reemplazable no es la novedad: es que el día en que un proveedor cambia sus condiciones sea un día en el que puedes tener una opinión.
También hace que funcione el caso aburrido. Haz el borrador con algo barato, cambia a algo caro para la parte difícil, baja a un modelo en tu propio equipo cuando la red va mal o el código no debe salir del edificio. Todo eso es la misma sesión.
La parte que no es gratis
Con honestidad sobre la contrapartida: el formato neutral es un compromiso. Cada capacidad que varía entre proveedores —esfuerzo de razonamiento, caché de prompts, llamadas a herramientas en paralelo, soporte de imágenes— tiene que expresarse como un indicador del modelo en lugar de deducirse del proveedor, porque enviar la forma equivocada da un 400, no una respuesta degradada. Es un coste real, que se paga una vez, en un sitio donde se ve.
La alternativa es pagarlo una y otra vez, a oscuras, mientras viva el proyecto.
OHarness es un harness de agentes de código abierto con licencia MIT. Habla de forma nativa con Anthropic, OpenAI y Google Gemini, con cualquier endpoint compatible con OpenAI y con runtimes locales como Ollama, LM Studio y vLLM. La referencia de arquitectura describe cómo se impone la separación en capas en lugar de quedarse en una intención, y qué es un harness de agentes cubre la idea de fondo.