Mismo slug, otro modelo: aliases, retiros y precios con fecha
Un agente que paga por llamada está pagando por un string. En la última semana, Google empezó a enrutar dos IDs de modelo "estables" hacia modelos más nuevos, OpenAI dio tres meses de aviso para GPT-4o, y un modelo lanzado el martes llegó con un precio que se duplica el 1 de diciembre. Nada de eso aparece en un 402.
Cuando un agente envía model: "x" y firma un pago, tres preguntas deciden si obtuvo lo que pagó. ¿Qué pesos nombra x hoy? ¿Cuánto tiempo va a seguir funcionando x? ¿Y cuánto va a costar x mañana? Las respuestas viven en la documentación de los proveedores, en tablas de deprecación y en changelogs. El pago vive en una firma que no cubre ninguna de ellas.
Nuestras fuentes, todas leídas o descargadas el 2026-10-15: la página de IDs y versionado de modelos de Anthropic, su overview de modelos, su página de deprecaciones y la referencia de su Models API; la página de deprecaciones de OpenAI, sus páginas de modelos, su página de precios y su spec OpenAPI en 2cc9e14; las páginas de modelos, deprecaciones, precios y changelog de Gemini y la referencia de generateContent; el catálogo en vivo de OpenRouter (462 entradas), su guía de modelos y su guía de latest-resolution; el mapa de precios de LiteLLM en 3fec507; y la especificación x402 v2 en e95b066. También pedimos cotizaciones 402 gratuitas a nuestro propio gateway para 30 strings de modelo.
La versión corta: los tres grandes proveedores dan hoy tres respuestas distintas a "¿este string cambia alguna vez?", y uno de ellos cambió la respuesta para dos IDs etiquetados como estables. Los catálogos de más abajo se atrasan en ambas direcciones: cotizan un modelo re-enrutado a su tarifa vieja y llevan fechas de expiración de rutas, no de modelos. x402 no se compromete con nada de esto. Y nuestro propio 402 cotiza un modelo re-enrutado a 2.4 veces su sucesor, sigue vendiendo dos modelos que Anthropic ya retiró y sigue emitiendo una cotización de un centavo para strings de modelo que no tenemos.
Tres contratos para un mismo string
Anthropic fija todo. Su página de versionado dice que cada ID de modelo "identifies a pinned version of the model", y que desde la generación 4.6 los IDs sin fecha como claude-sonnet-4-6 no son punteros perennes: "It is the snapshot." Los modelos anteriores todavía tienen aliases de conveniencia. claude-sonnet-4-5 "resolves to the most recent dated snapshot for that minor version." Hay una salvedad, y le importa a cualquiera que reproduzca corridas de agentes: "the serving infrastructure around the model can change over time", incluyendo "the request router, safety classifiers, and sampling logic." Pesos fijos no son comportamiento fijo.
OpenAI fija snapshots detrás de aliases. Cada página de modelo lista un snapshot por defecto. gpt-4o resuelve a gpt-4o-2024-08-06. gpt-5.5 resuelve a gpt-5.5-2026-04-23. Desde GPT-5.6, las páginas listan el ID sin fecha como su propio snapshot: el único snapshot de gpt-6-luna es gpt-6-luna. OpenAI también mantiene un nombre flotante a propósito. chat-latest "points to the latest Instant model currently used in ChatGPT", y "the underlying model snapshot will be regularly updated."
Los aliases llevan precio. La página de precios lista gpt-4o a $2.50 de input y $10 de output por millón de tokens y gpt-4o-2024-05-13 a $5 y $15. Misma familia, dos precios, decididos por el snapshot al que apunta el nombre.
Google nombra cuatro patrones. La página de modelos define strings stable, preview, latest y experimental. Un string stable "points to a specific stable model. Stable models usually don't change." Un alias latest "will get hot-swapped with every new release", con "a 2-week notice" por email "for breaking changes." Los previews pueden deprecarse "with at least 2 weeks notice." El changelog muestra los hot-swaps en acción: el 21 de enero de 2026 gemini-flash-latest pasó a gemini-3-flash-preview; el 19 de mayo pasó a gemini-3.5-flash.
Los agregadores suman una cuarta capa. El catálogo de OpenRouter tiene hoy 19 aliases ~author/family-latest, como ~anthropic/claude-opus-latest, que resuelve a Claude Opus 5.5. Su guía de latest-resolution es franca: "Versions can change at any time." Cada entrada tiene además un canonical_slug, documentado como el "permanent slug for the model that never changes." En 317 de 462 entradas difiere del ID que llamas: openai/gpt-5.5 es canónicamente openai/gpt-5.5-20260423. Las fechas son del propio agregador. El snapshot de Opus 4.5 de Anthropic es claude-opus-4-5-20251101; su slug canónico allí termina en 20251124.
Cuando un ID estable se re-enruta
El 8 de octubre, el changelog de Google anunció dos deprecaciones de un tipo que los cuatro patrones no describen. gemini-3.7-flash "is deprecated and has been replaced by gemini-3.8-flash", y "API requests to gemini-3.7-flash are automatically routed to gemini-3.8-flash." El mismo texto aplica a gemini-3.5-flash, que ahora se enruta a gemini-3.6-flash. La tabla de deprecaciones lista ambos con fecha de shutdown "N/A": "the endpoint is not shutting down."
Ambos eran strings stable. Ninguno devuelve error. Un agente que los fijó sigue funcionando y corre otro modelo.
La diferencia no es cosmética. La guía de 3.6 Flash describe un modelo que "completes multi-step workflows with fewer reasoning steps, conversational turns, and tool calls than Gemini 3.5." También cambia el contrato del request. Desde 3.6 Flash, temperature, top_p y top_k quedan deprecados: "The API ignores these parameters and returns an error in future model generations." Un agente que fijó gemini-3.5-flash con temperature: 0 para tener salidas repetibles ahora recibe un modelo que ignora ese ajuste.
El precio también se movió. La misma guía lista 3.6 Flash a $1.50 de input y $7.50 de output, "versus $9.00/1M for 3.5 Flash." La página de precios ya no lista ni 3.5 Flash ni 3.7 Flash. Ninguna de las dos páginas dice a qué precio se factura un request re-enrutado.
Los catálogos no se han puesto al día. OpenRouter todavía lista google/gemini-3.5-flash a $1.50 y $9.00 en sus endpoints estándar, sin fecha de expiración. La entrada gemini/gemini-3.5-flash de LiteLLM lleva los mismos precios y ninguna fecha de deprecación. Su entrada de Vertex AI con el mismo nombre lleva fecha de deprecación el 19 de mayo de 2027. Un string, tres entradas de catálogo, tres respuestas distintas.
Los aliases latest ahora también discrepan. El ~google/gemini-flash-latest de OpenRouter resuelve a gemini-3.8-flash. El último cambio del gemini-flash-latest propio de Google registrado en su changelog es el paso del 19 de mayo a gemini-3.5-flash, el ID que ahora se enruta a 3.6.
El calendario de retiros
Los retiros están mejor documentados que los re-enrutamientos. Cada proveedor declara un período de aviso. La página de deprecaciones de OpenAI promete al menos seis meses para modelos generalmente disponibles, tres meses para variantes especializadas como los modelos chat y Codex, y apenas dos semanas para los previews. La página de deprecaciones de Anthropic promete "at least 60 days' notice" para modelos lanzados públicamente. Google da al menos dos semanas a los previews.
El aviso de OpenAI de ayer merece una lectura atenta. El 14 de octubre, OpenAI notificó que GPT-4o (gpt-4o-2024-08-06, gpt-4o-2024-11-20), GPT-4o mini, GPT-4.1 y GPT-4.1 mini salen de la API el 14 de enero de 2027, con gpt-6-luna como reemplazo. Son tres meses para modelos generalmente disponibles. La misma página declara un mínimo de seis meses para esa categoría "unless safety or compliance concerns require a faster timeline", y no da ninguna razón para este caso. La fila nombra la familia y sus snapshots. No explicita qué hace después el alias pelado gpt-4o.
Este es el calendario cercano para modelos de texto, según las tres páginas de deprecación y la página de precios de Gemini:
# leído 2026-10-15; "earliest" = el "not sooner than" de Anthropic
2026-10-15 Anthropic earliest claude-haiku-4-5-20251001
2026-10-23 OpenAI shutdown gpt-3.5-turbo, gpt-4, gpt-4-turbo, gpt-4.1-nano,
gpt-4o-2024-05-13, o1, o1-pro, o3-mini, o4-mini
2026-11-24 Anthropic earliest claude-opus-4-5-20251101
2026-11-30 Anthropic retire claude-sonnet-4-5-20250929 -> claude-sonnet-5-5
2026-12-01 Google precio gemini-4-argon $2/$10 -> $4/$20
2026-12-11 OpenAI shutdown gpt-5-2025-08-07 (+mini, nano), gpt-5-pro-2025-10-06,
o3-2025-04-16, o3-pro-2025-06-10
2027-01-01 Google precio gemini-3.6-flash, gemini-3.8-flash $0.75/$3.75 -> $1.50/$7.50
2027-01-14 OpenAI shutdown gpt-4o-2024-08-06, gpt-4o-2024-11-20,
gpt-4o-mini-2024-07-18, gpt-4.1-2025-04-14,
gpt-4.1-mini-2025-04-14
2027-04-01 OpenAI shutdown gpt-5.1, gpt-5.3-codex, gpt-5.4-nano
Los tres proveedores publican hoy datos de ciclo de vida legibles por máquina. Solo uno los envía con la respuesta. El GET /v1/models de OpenAI devuelve un shutdown_date opcional. La Models API de Anthropic devuelve lifecycle (active, deprecated o retired), deprecated_at y retires_at, con una nota cuidadosa: "A past date on a deprecated model means retirement is overdue, not that it has occurred." Los modelos retirados solo aparecen si los pides.
Gemini va más lejos. Cada GenerateContentResponse puede traer un objeto modelStatus con un modelStage (de EXPERIMENTAL pasando por STABLE y LEGACY hasta RETIRED), un retirementTime y un message, junto a un campo modelVersion descrito como "the model version used to generate the response." Es el aviso de retiro entregado en la llamada misma. El shape de respuesta de Chat Completions no tiene campo para nada de esto. Un gateway que habla ese shape lo descarta, la misma pérdida en la traducción que encontramos para las categorías de refusal.
Lo que saben los catálogos
La mayoría de los agentes nunca lee una página de deprecaciones. Lee un catálogo: la lista de modelos de un agregador, el mapa de precios de una librería, el /models de un gateway. Contrastamos dos catálogos públicos con el calendario de arriba.
OpenRouter. De 462 entradas, 20 llevan expiration_date. Mapeamos los 32 identificadores de modelos de texto de OpenAI con shutdown anunciado a entradas del catálogo, por ID o por slug canónico. 23 entradas cubren 27 de ellos. Ninguna de las 23 tiene fecha de expiración, incluidas las nueve entradas del lote del 23 de octubre, a ocho días. Seis de esas nueve (gpt-3.5-turbo, gpt-4-turbo, o1, o1-pro, o3-mini, o4-mini) listan a OpenAI como su único host. Las otras tres también listan Azure, que fija su propio calendario, así que ahí una fecha nula puede ser correcta.
El campo también falla en la otra dirección. google/gemini-2.5-flash, 2.5-pro y 2.5-flash-lite llevan fecha de expiración el 20 de octubre de 2026. La propia página de Google dice que los modelos 2.5 "are not deprecated and will continue to be served until further notice", aunque desde el 18 de septiembre el acceso está limitado a usuarios previos. El catálogo documenta expiration_date como la "deprecation date for the model endpoint." Describe una ruta, no un modelo. Y las rutas también sobreviven a los modelos: anthropic/claude-opus-4.1, que Anthropic retiró de sus propias plataformas el 5 de agosto, sigue listado, servido solo a través de Amazon Bedrock, sin fecha de expiración. La página de Anthropic aclara que "Amazon Bedrock and Google Cloud set their own retirement schedules."
Los aliases ~latest vienen con una promesa de precio. La guía dice que sus filas "report the pricing ... of the target they currently resolve to", y que "requests are billed at the concrete model's price." En el listado de hoy, 5 de las 19 filas de alias muestran precios distintos a los de la fila de su target:
# USD por millón de tokens, input / output, listado del 2026-10-15
~moonshotai/kimi-latest 0.29 / 24.00 target kimi-k3 0.45 / 15.00
~deepseek/deepseek-pro-latest 0.225 / 8.00 target deepseek-v4-pro-0813 1.32 / 3.96
~z-ai/glm-flash-latest 0.036 / 0.90 target glm-5.3-flash 0.15 / 0.50
~z-ai/glm-latest 0.024 / 4.40 target glm-5.3 0.03 / 4.80
~deepseek/deepseek-v4-flash-latest 0.0144 / 0.576 target deepseek-v4-flash-0731 0.016 / 0.64
Los aliases también cambian el request. La misma guía dice que un slug ~latest "remaps unsupported reasoning parameters": reasoning: { effort: "none" } "is upgraded to the lowest effort the model supports", y enabled: false "is flipped to enabled." Con un slug concreto, el mismo request a un modelo que exige reasoning devuelve un 400. Un agente que apagó el reasoning para acotar su factura recibe reasoning tokens, que se cobran como output, como medimos en nuestra auditoría de reasoning tokens.
LiteLLM. Su mapa de precios, actualizado hoy a las 05:29 UTC, tiene 4,122 entradas, 783 con deprecation_date y 207 de ellas ya en el pasado. Lleva la fecha exacta de shutdown para 27 de los 32 identificadores de OpenAI. Las cinco que le faltan son los snapshots del 14 de enero anunciados ayer. El mapa se mantiene de cerca, y aun así va detrás de la fuente.
Precios con fecha
Las deprecaciones son la mitad visible. La otra mitad son precios que cambian según un calendario. La página de precios de Google ahora los escribe como rangos. Gemini 4 Argon, disponible de forma general desde el 13 de octubre, cuesta "$2.00 through November 30, 2026. $4.00 starting December 1, 2026" de input, y $10 y luego $20 de output. Gemini 3.8 Flash y 3.6 Flash cuestan $0.75 y $3.75 "through December 31, 2026", y luego $1.50 y $7.50. Cuando 3.7 Flash salió en agosto, el changelog llamó a su tarifa "an introductory price through December 31, 2026."
Ninguno de los dos catálogos tiene dónde poner eso. El objeto pricing de OpenRouter guarda un número por tipo de token. El mapa de LiteLLM no tiene ningún campo para una fecha de vigencia; la única clave con forma de fecha en 4,122 entradas es deprecation_date. Su entrada de Gemini 4 Argon dice $2 y $10, lo cual es correcto hasta el 30 de noviembre e incorrecto desde el 1 de diciembre.
Para una persona con factura mensual, eso es una sorpresa en la factura. Para un agente con presupuesto, es un supuesto roto. Un spend cap dimensionado con el precio de lista de hoy compra la mitad de llamadas a Gemini 4 Argon el 1 de diciembre. Los agentes con caps son justamente el punto. El propio SDK de x402 trae un cap por pago por defecto.
x402 paga por una URL, no por un modelo
La especificación x402 v2 describe para qué es un pago con un objeto ResourceInfo: un url obligatorio, más description, mimeType, serviceName y tags opcionales. Cada entrada de accepts da un scheme, una red, un monto, un asset, un beneficiario y un timeout. Nada nombra un modelo.
En una API de inferencia, la URL es la misma para todos los modelos. Nuestro 402 dice "url": "https://api.llm4agents.com/v1/chat/completions" y "description": "LLM chat completion (x402)", pida el body Gemini o Claude. La autorización EIP-3009 que firma el agente cubre from, to, value, una ventana de validez y un nonce. El string del modelo está en el body del request, fuera de todo lo firmado.
Así que el recibo es la respuesta. La spec de OpenAI describe el model de la respuesta como "the model used for the chat completion." Gemini agrega modelVersion. La guía de OpenRouter dice que para slugs ~latest "the response's model field reflects the concrete model that actually served the request." Nuestro gateway devuelve X-Model-Used en las respuestas pagadas. Estos campos dicen lo que reporta la capa que sirve. No son prueba de qué pesos corrieron; ese es el problema que vimos en nuestra auditoría de attested inference. Pero son el único registro que recibe un agente, y la mayoría de los agentes nunca los guarda.
Nuestro propio 402, medido
Pedir un 402 es gratis, así que le pedimos cotizaciones a nuestro gateway. Prompt de una palabra, sin pago, montos leídos del header payment-required, 15 de octubre:
# max_tokens 100,000; cotización en USDC sobre Base
google/gemini-3.5-flash $1.09 # Google lo enruta a 3.6 Flash
google/gemini-3.6-flash $0.46
google/gemini-3.7-flash $0.46 # Google lo enruta a 3.8 Flash
google/gemini-3.8-flash $0.46
openai/gpt-4o $1.21
openai/gpt-4o-2024-05-13 $1.81 # shutdown de OpenAI el 23 oct
anthropic/claude-sonnet-4 $1.81 # retirado por Anthropic el 15 jun
anthropic/claude-opus-4.1 $9.01 # retirado por Anthropic el 5 ago
# max_tokens 10,000; shutdown de OpenAI el 23 oct
openai/gpt-3.5-turbo $0.02 openai/gpt-4-turbo $0.37 openai/o1 $0.73
openai/o3-mini $0.06 openai/o4-mini $0.06
# fuera de nuestro catálogo
~google/gemini-flash-latest $0.01
~anthropic/claude-opus-latest $0.01
openai/gpt-5.5-20260423 $0.01
anthropic/claude-3-opus $0.01
nonexistent/model-xyz $0.01
Cuatro hallazgos.
Primero, el modelo re-enrutado se cotiza a su precio viejo. gemini-3.5-flash le pide a un agente 2.4 veces más autorización que el 3.6 Flash que, según Google, ahora lo responde. La cotización es el monto que el agente debe firmar, y por lo tanto el monto que su spend cap tiene que permitir.
Segundo, vendemos lo que el primer proveedor ya retiró. Claude Sonnet 4 y Claude Opus 4.1 cotizan con normalidad. Bien puede que corran, a través de una nube partner con su propio calendario. Pero nada en el 402 ni en la lista de modelos lo dice.
Tercero, cinco modelos que OpenAI apaga en ocho días cotizan como cualquier otro. Salvo que otro host los tome, después del 23 de octubre van a fallar después de que el agente haya firmado. Nuestro camino walk-up no liquida nada ante un error, así que el agente no pierde dinero. Pierde un round trip y una decisión de fallback que podría haber tomado antes de pagar.
Cuarto, los strings que no tenemos siguen recibiendo una cotización de un centavo: aliases, un slug canónico con fecha, un modelo retirado en enero y un nombre inventado. Lo señalamos en la auditoría de reasoning tokens el 3 de octubre. Sigue siendo cierto.
Nuestra lista pública de modelos tampoco agrega datos de ciclo de vida. El objeto ModelInfo de nuestro contrato OpenAPI tiene slug, displayName, provider, dos precios, contextWindow y lastSyncedAt. No hay etapa de ciclo de vida, ni fecha de retiro, ni target de enrutamiento, ni fecha de vigencia para un precio.
Qué significa para LLM4Agents
Vendemos strings de modelo, y el significado de un string lo fija otro. Un proveedor puede re-enrutarlo, retirarlo, cambiarle el precio o dejar que una nube partner lo mantenga vivo. Cada cambio llega a nuestro catálogo solo cuando nuestra fuente de precios lo refleja. Nada de eso le llega al agente a través del 402.
Eso hace del gateway el lugar correcto para arreglarlo. Un agente no puede leer tres páginas de deprecación, un changelog y el calendario de una nube partner antes de cada llamada. Nosotros sí, una vez, para todos. Los proveedores hicieron la parte difícil: shutdown_date, retires_at y modelStatus existen. El trabajo es llevarlos a través de la frontera en lugar de descartarlos.
También cambia cómo deberían funcionar las cadenas de fallback. Una cadena que descubre un modelo retirado fallando en él es una cadena que paga latencia por información publicada meses antes. Un eslabón retirado debería saltarse antes de la cotización, no después de la firma.
La amenaza es más silenciosa que una caída. Un ID estable re-enrutado no falla. Responde, desde otro modelo, a un precio que nadie aguas abajo actualizó, mientras ignora un parámetro del que dependía el agente. Un agente que fijó un modelo para tener reproducibilidad la pierde sin ningún error que atrapar. Si dejamos pasar eso en silencio, somos parte del problema.
Cómo mantenerse en la frontera
En orden de costo y urgencia.
1. Rechazar antes del 402. Los strings desconocidos reciben un 404 con los slugs válidos más cercanos, no una cotización de un centavo. Los strings pasados su retiro de primera parte y sin ruta viva reciben un 410 con el reemplazo recomendado por el proveedor. Es una búsqueda que ya hacemos; solo corre después del pago en lugar de antes.
2. Poner el ciclo de vida en el catálogo. Agregar lifecycle, retiresAt, routedTo y providerModelId a ModelInfo. Tomarlos de las APIs de primera parte (el shutdown_date de OpenAI, el retires_at de Anthropic) y de las páginas de deprecación, no solo de un listado de más abajo. La expiración de una ruta y el retiro de un modelo son campos distintos.
3. Cotizar los re-enrutamientos al precio del target. Mantener una tabla corta de re-enrutamientos, empezando por gemini-3.5-flash a gemini-3.6-flash y gemini-3.7-flash a gemini-3.8-flash. Cotizar el request re-enrutado al precio del target, y decirlo en la respuesta.
4. Cargar los precios con fecha antes de sus fechas. Guardar precios con un effectiveFrom, publicar los cambios próximos en la lista de modelos y cotizar con el precio que estará vigente cuando se liquide el pago. El 1 de diciembre y el 1 de enero ya están en el calendario.
5. Señalar la deprecación en la respuesta. Cuando un request nombra un modelo con retiro programado, devolver los headers Sunset (RFC 8594) y Deprecation (RFC 9745) con un link al reemplazo. Ambos RFCs acotan la señal a una URI, y nuestra URI la comparten todos los modelos, así que hay que enviarlos por request. Reenviar el modelStatus.message de Gemini donde lo tengamos.
6. Hacer que el recibo nombre el modelo. Mantener X-Model-Used, agregar el snapshot o el modelVersion del proveedor, y poner el string pedido, el modelo resuelto y la base de precio en el resource.description del 402. No está firmado, pero le permite a un agente registrar para qué le cotizaron junto a lo que recibió.
7. Dejar los aliases flotantes fuera de los pagos walk-up. No ofrecer aliases tipo ~latest en el camino x402 hasta que la cotización pueda calcularse con el target actual y el remapeo de parámetros quede declarado. Un string cuyo modelo, precio y parámetros pueden cambiar entre dos llamadas es lo opuesto de aquello para lo que sirve una cotización firmada.
8. Correr el censo de hoy todos los días. Comparar las tres páginas de deprecación, el changelog de Gemini y las Models APIs contra nuestro catálogo. Alertar cuando un slug que vendemos tenga un retiro de primera parte a menos de 30 días, un re-enrutamiento o un cambio de precio con fecha. Las mediciones de este post tomaron minutos; deberían correr todos los días.
Paga por llamada, en stablecoins, sobre una API compatible con OpenAI
Un 402, una firma, más de 345 modelos. Sin suscripción, sin mínimo.
Registra tu agente