Logo
Nuevos usuarios de RPC: 35% de descuento el primer mesVer oferta
OnFinality Learn
Integración y Desarrollo11 min de lectura

Kimi K2.5 en OpenRouter: IDs de modelo, enrutamiento de proveedores y evaluación reproducible

Una guía práctica para llamar a Kimi K2.5 a través de OpenRouter, fijar proveedores, manejar errores de ID de modelo y medir el comportamiento de enrutamiento con tus propias pruebas reproducibles.

TL;DR

Kimi K2.5 es un modelo multimodal de Moonshot AI que OpenRouter expone bajo el identificador de modelo moonshotai/kimi-k2.5, con solicitudes enrutadas a uno de varios proveedores de inferencia externos. El desafío práctico no es enviar una solicitud, sino controlar qué proveedor la atiende, comprender cómo los precios y el almacenamiento en caché cambian el costo efectivo, y medir la latencia y el rendimiento por ti mismo en lugar de confiar en una única instantánea del panel. Este artículo explica el modelo de enrutamiento, proporciona código ejecutable de solicitud y diagnóstico, y describe un procedimiento de medición reproducible que puedes ejecutar con tu propia carga de trabajo. Evita deliberadamente citar números de referencia fijos, porque las combinaciones de proveedores, la cuantización y los modos de enrutamiento cambian con el tiempo.

Qué significa realmente llamar a Kimi K2.5 a través de OpenRouter

OpenRouter es una capa de enrutamiento, no un único host de inferencia. Cuando envías una solicitud de finalización de chat para moonshotai/kimi-k2.5, OpenRouter selecciona uno de los proveedores que ha listado ese modelo y reenvía la solicitud. La respuesta que recibes es generada por el despliegue de ese proveedor, que puede diferir en hardware, cuantización, procesamiento por lotes y comportamiento de caché de otro proveedor que ofrece el mismo nombre de modelo.

Esto importa para la reproducibilidad. Dos solicitudes con prompts idénticos pueden devolver latencia, rendimiento e incluso distribuciones de salida sutilmente diferentes si llegan a proveedores distintos o a niveles de cuantización diferentes. El identificador del modelo es estable; la ruta de servicio no lo es. Trata el ID del modelo como el contrato y el proveedor como un detalle de implementación que puedes influir pero no garantizar completamente a menos que lo fijes.

La página del modelo Kimi K2.5 en OpenRouter enumera las modalidades, la ventana de contexto, el precio base, la tabla de proveedores y el historial de disponibilidad. Esos son puntos de partida útiles, pero son instantáneas. Para decisiones de producción, combina el comportamiento documentado con tus propias mediciones contra las formas reales de tus prompts.

  • ID de modelo: moonshotai/kimi-k2.5 (el prefijo moonshotai/ es parte del ID).
  • Los modos de enrutamiento descritos por OpenRouter incluyen selección equilibrada, más rápida y más económica.
  • Los precios a nivel de proveedor, el precio de lectura de caché, la latencia, el rendimiento y el tiempo de actividad se enumeran por proveedor.
  • Tu costo efectivo depende de la tasa de aciertos de caché y los descuentos, no solo del precio titular por millón de tokens.

Requisitos previos y supuestos antes de comenzar

Necesitas una cuenta de OpenRouter y una clave API almacenada en una variable de entorno, no en el código fuente. Debes tener una forma de ejecutar curl y Python o Node.js. También debes conocer la forma de tu carga de trabajo: longitud del prompt, longitud esperada de salida, si envías imágenes y si reutilizas prompts del sistema lo suficiente como para que el almacenamiento en caché importe.

Esta guía asume que estás llamando al endpoint de finalizaciones de chat de OpenRouter y que deseas comparar proveedores en lugar de aceptar lo que el enrutador predeterminado elija. No asume que ningún proveedor específico sea el mejor; eso depende de tu región, presupuesto y tolerancia a la latencia. Si aún estás eligiendo entre rutas de inferencia alojadas e infraestructura dedicada para otras partes de tu stack, las páginas de OnFinality descripción general del servicio API y precios de RPC explican el modelo de infraestructura adyacente.

export OPENROUTER_API_KEY="your-key-here"
export OPENROUTER_BASE_URL="https://openrouter.ai/api/v1"

Cómo enruta OpenRouter una solicitud de Kimi K2.5

El enrutador recibe tu solicitud, filtra la lista de proveedores a aquellos que anuncian el modelo solicitado y satisfacen tus restricciones, luego aplica una preferencia de enrutamiento. En modo equilibrado pondera precio y velocidad; en modo más rápido favorece la baja latencia; en modo más económico favorece el precio listado más bajo. También puedes restringir explícitamente el conjunto de candidatos con una lista de permitidos o denegados de proveedores, que es la única forma de hacer determinista la selección de proveedor.

Las restricciones de proveedor se expresan en el cuerpo de la solicitud bajo un objeto provider. Los nombres exactos de los campos están documentados por OpenRouter; el punto de diseño importante es que fijar convierte una decisión de enrutamiento probabilística en una determinista. Eso es esencial para la evaluación comparativa y para los requisitos de cumplimiento que restringen dónde se procesan los datos.

Fijar tiene un costo. Si tu proveedor fijado se degrada o te limita la tasa, el enrutador no puede recurrir silenciosamente a una alternativa saludable a menos que permitas respaldos. Decide explícitamente si la disponibilidad o el determinismo importan más para cada carga de trabajo.

  • Enrutamiento predeterminado: el enrutador elige entre los proveedores elegibles.
  • Lista de permitidos: solo los proveedores nombrados pueden atender la solicitud.
  • Lista de denegados: los proveedores nombrados quedan excluidos, útil para restricciones de residencia de datos.
  • Comportamiento de respaldo: si el enrutador puede reintentar con otro proveedor cuando el primero falla.

Una solicitud mínima ejecutable con fijación de proveedor

La siguiente llamada curl envía un prompt corto, fija un único proveedor y deshabilita los respaldos para que el resultado sea atribuible a una sola ruta de servicio. Reemplaza el slug del proveedor por uno que hayas verificado en la página actual del modelo. La respuesta incluye campos de uso que puedes registrar para la contabilidad de costos.

curl -s "$OPENROUTER_BASE_URL/chat/completions" \
  -H "Authorization: Bearer $OPENROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "moonshotai/kimi-k2.5",
    "messages": [
      {"role": "system", "content": "You are a concise technical assistant."},
      {"role": "user", "content": "Explain idempotency keys in two sentences."}
    ],
    "max_tokens": 200,
    "provider": {
      "order": ["PROVIDER_SLUG"],
      "allow_fallbacks": false
    }
  }'

Manejo correcto del prefijo del ID de modelo moonshotai

Un fallo de integración recurrente es duplicar el prefijo del nombre del modelo. Algunos SDK y wrappers normalizan los nombres de proveedores y anteponen un prefijo de proveedor, produciendo un identificador inválido como moonshot/moonshotai/kimi-k2.5. OpenRouter rechaza esto con un error 400 que indica que el ID del modelo no es válido. La solución es pasar el identificador exacto de OpenRouter y deshabilitar cualquier prefijado a nivel de wrapper para este proveedor.

Esto es un error de configuración, no un error del modelo. Cuando veas un 400 con un mensaje de modelo inválido, registra la cadena exacta enviada en la red antes de depurar cualquier otra cosa. Muchos frameworks exponen una configuración de prefijo de proveedor que debe desactivarse o mapearse para que moonshotai/ no se duplique.

import os, json, urllib.request

payload = {
    "model": "moonshotai/kimi-k2.5",
    "messages": [{"role": "user", "content": "Return the word OK."}],
    "max_tokens": 10,
}
req = urllib.request.Request(
    os.environ["OPENROUTER_BASE_URL"] + "/chat/completions",
    data=json.dumps(payload).encode(),
    headers={
        "Authorization": "Bearer " + os.environ["OPENROUTER_API_KEY"],
        "Content-Type": "application/json",
    },
)
with urllib.request.urlopen(req, timeout=60) as r:
    body = json.load(r)
print(body["model"], body.get("usage"))

Diseño de una prueba reproducible de latencia y rendimiento

Los números de latencia y rendimiento del panel son agregados de muchos usuarios y formas de prompt. Para tomar una decisión para tu aplicación, ejecuta una prueba controlada: prompt fijo, max_tokens fijo, proveedor fijo, repetido suficientes veces para ver la varianza. Registra el tiempo hasta el primer token por separado de la duración total, porque el comportamiento de streaming difiere del comportamiento sin streaming.

Usa un script pequeño que emita N solicitudes secuenciales y registre los tiempos de reloj de pared. No ejecutes solicitudes en paralelo a menos que estés probando específicamente la concurrencia, porque la carga paralela cambia la cola en el proveedor. Almacena los resultados sin procesar por solicitud para que puedas recalcular percentiles más tarde.

La siguiente tabla es una plantilla, no un conjunto de valores medidos. Complétala con tus propias ejecuciones. Informa el slug del proveedor, la marca de tiempo, la región y el modo de enrutamiento junto con cada número, porque una cifra de latencia sin ese contexto no es reproducible.

import os, time, json, urllib.request, statistics

URL = os.environ["OPENROUTER_BASE_URL"] + "/chat/completions"
HEADERS = {
    "Authorization": "Bearer " + os.environ["OPENROUTER_API_KEY"],
    "Content-Type": "application/json",
}
PROMPT = "Write a 120-word explanation of database connection pooling."

def one_call(provider):
    payload = {
        "model": "moonshotai/kimi-k2.5",
        "messages": [{"role": "user", "content": PROMPT}],
        "max_tokens": 300,
        "provider": {"order": [provider], "allow_fallbacks": False},
    }
    req = urllib.request.Request(URL, data=json.dumps(payload).encode(), headers=HEADERS)
    start = time.perf_counter()
    with urllib.request.urlopen(req, timeout=120) as r:
        body = json.load(r)
    elapsed = time.perf_counter() - start
    usage = body.get("usage", {})
    return elapsed, usage.get("completion_tokens", 0)

results = []
for _ in range(10):
    elapsed, out_tokens = one_call("PROVIDER_SLUG")
    results.append({"seconds": elapsed, "tokens": out_tokens,
                    "tps": out_tokens / elapsed if elapsed else None})

secs = [r["seconds"] for r in results]
print(json.dumps({
    "runs": len(results),
    "median_seconds": statistics.median(secs),
    "min_seconds": min(secs),
    "max_seconds": max(secs),
}, indent=2))

Tabla de resultados y procedimiento de verificación

Después de ejecutar el script, completa una tabla con una fila por proveedor y una columna por métrica. Una tabla defendible se ve así, con tus propios valores sustituidos. | Proveedor | Ejecuciones | TTFT mediano (s) | Total mediano (s) | tok/s de salida medianos | Tasa de error | Notas |. Deja las celdas en blanco en lugar de adivinar si no se capturó una métrica.

Verificar significa confirmar que el proveedor que pretendías fue realmente el que atendió la solicitud. Registra el campo model de la respuesta y cualquier metadato del proveedor devuelto, y compáralo con tu lista de permitidos. Si fijaste un proveedor y la respuesta indica otro, el cuerpo de tu solicitud no se está aplicando como se pretende, o los respaldos están habilitados.

También verifica la atribución de costos. Multiplica los recuentos de tokens de entrada y salida por los precios listados del proveedor, luego compara con el registro de uso en tu panel de OpenRouter. Las discrepancias suelen provenir de lecturas de caché, que se facturan a una tasa diferente, o de descuentos que aplican a proveedores específicos.

  • Confirma que la cadena del modelo en la respuesta coincida con moonshotai/kimi-k2.5.
  • Confirma que el proveedor que atiende coincida con tu lista de permitidos.
  • Concilia los recuentos de tokens con el objeto usage, no con tu propia estimación del tokenizador.
  • Repite la ejecución a una hora diferente del día para ver si la latencia es estable.

Solución de problemas comunes de enrutamiento de Kimi K2.5

La mayoría de los fallos se agrupan en cuatro categorías: ID de modelo inválido, proveedor no disponible, limitación de tasa y tiempo de espera agotado. El ID de modelo inválido casi siempre es un problema de prefijado o error tipográfico. Proveedor no disponible significa que tu lista de permitidos excluyó a todos los proveedores saludables o que el proveedor fijado está caído; decide si relajar la fijación o aceptar el error. La limitación de tasa es por proveedor y por cuenta, por lo que puede aparecer incluso cuando la página del modelo muestra disponibilidad saludable.

Los tiempos de espera merecen especial atención con salidas largas. Si configuras un tiempo de espera del cliente más corto que el tiempo de generación del proveedor, verás fallos que parecen caídas del proveedor pero en realidad son del lado del cliente. Mide primero tu duración total p95, luego configura tiempos de espera con margen por encima de eso.

Para patrones más amplios de confiabilidad de infraestructura que aplican a cualquier dependencia de API, la guía de OnFinality sobre alojamiento de nodos blockchain cubre el diseño de redundancia y conmutación por error que se transfiere bien al enrutamiento de modelos.

  • 400 modelo inválido: verifica si hay prefijos duplicados como moonshot/moonshotai/....
  • 404 o error de ningún proveedor: tu lista de permitidos puede ser demasiado estrecha.
  • 429: retrocede y reintenta, o amplía el conjunto de proveedores.
  • Tiempo de espera del cliente: auméntalo por encima de tu p95 medido, no de tu mediana.

Limitaciones, compensaciones y cuándo elegir un camino diferente

OpenRouter te da acceso a muchos proveedores detrás de una API, lo cual es conveniente para la experimentación y para evitar el bloqueo de un solo proveedor. La compensación es que heredas variabilidad que no controlas. Fijar un proveedor restaura el determinismo pero elimina la capacidad del enrutador de sortear fallos. No hay configuración que te dé tanto determinismo perfecto como disponibilidad perfecta.

El manejo de datos es otra consideración. Diferentes proveedores pueden procesar solicitudes en distintas jurisdicciones y bajo diferentes políticas de retención. Si tu carga de trabajo involucra código sensible o datos regulados, revisa los términos de cada proveedor y usa listas de permitidos o denegados para hacer cumplir tus requisitos. La capa de enrutamiento no toma esa decisión por ti.

Si tu carga de trabajo es crítica en latencia y estable, la infraestructura dedicada puede ser más predecible que el enrutamiento compartido. El modelo de nodo dedicado de OnFinality ilustra la misma compensación para cargas de trabajo blockchain: pagas por aislamiento y previsibilidad en lugar de elasticidad. Para la inferencia de modelos específicamente, compara tus números medidos con las cifras publicadas del proveedor antes de comprometerte.

Próximos pasos para una integración en producción

Comienza fijando un proveedor y ejecutando el script de medición contra la distribución real de tus prompts. Registra los resultados con marcas de tiempo. Luego ejecuta la misma prueba con respaldos habilitados y compara las tasas de error y la latencia de cola. Elige la configuración que coincida con tus requisitos de disponibilidad y determinismo, y documenta la elección para que los cambios futuros sean deliberados.

Agrega registro estructurado para el ID del modelo, el proveedor, los recuentos de tokens, la latencia y los códigos de error. Construye un pequeño panel a partir de esos registros en lugar de depender de páginas externas. Vuelve a ejecutar la comparación cuando cambies las formas de los prompts, porque el comportamiento de caché y los recuentos de tokens cambian con la estructura de entrada.

Si estás integrando llamadas a modelos en una aplicación Web3 más amplia, la misma disciplina se aplica a tu capa de acceso a la cadena. Revisa la guía de endpoints RPC multicadena y el directorio de redes para aplicar prácticas consistentes de fijación de proveedores y medición en tus dependencias de IA y blockchain. Para recomendaciones concretas de endpoints y proveedores, usa RPC Assistant en lugar de codificar un proveedor de un tutorial.

Nunca te preocupes por la infraestructura nuevamente

OnFinality elimina la carga pesada de DevOps para que puedas construir de forma más inteligente y rápida.

Comenzar