Saltar al contenido principal

La sesión excede la ventana de contexto

Síntoma​

Con curl o con el SDK, la petición falla de inmediato con HTTP 400 y este cuerpo:

{"error":{"type":"invalid_request_error","code":"provider_invalid_request","message":"This model's maximum context length is 131072 tokens. However, you requested 32000 output tokens and your prompt contains at least 133000 input tokens, for a total of at least 165000 tokens. Please reduce the length of the input prompt or the number of requested output tokens.","param":"input_tokens","request_id":"req_…"}}

En OpenCode hay dos comportamientos distintos según cuándo ocurre:

  • Si pasa en el primer mensaje, OpenCode imprime ese texto completo y termina.
  • Si pasa a media sesión, después de que el modelo ya leyó archivos, la sesión se queda muda: no imprime nada, no escribe nada en su registro y sigue reintentando en silencio hasta que la cierras. Un caso así estuvo 39 minutos sin decir nada.

El disparador típico del segundo caso es pedir algo como "lee todos los archivos de esta carpeta". El modelo pide varias lecturas en el mismo turno y el contexto salta de golpe: siete archivos de 50 KB suman cerca de 125 000 tokens.

Causa​

La ventana del modelo se reparte entre la pregunta y la respuesta. El context_window del Catálogo no es un tope de entrada: es el total del prompt más el max_tokens que pidas. Un modelo de 131 072 con max_tokens: 32000 acepta como máximo 99 072 tokens de prompt, y pedir max_tokens igual a la ventana completa falla siempre, incluso con un prompt de cuatro tokens.

Cuando el salto de contexto ocurre en un solo turno, ninguna configuración lo evita: el turno ya rebasó la ventana antes de que la herramienta pudiera resumir el historial.

Cómo confirmarlo​

  1. Repite la llamada con max_tokens pequeño y el mismo prompt. Si con max_tokens: 100 pasa y con el valor original falla, es esta causa y no un problema del modelo:

    curl -s https://api.<tu-dominio>/infernode/v1/chat/completions \
    -H "Authorization: Bearer $INFERNODE_API_KEY" -H 'Content-Type: application/json' \
    -d '{"model":"Saptiva Cortex","messages":[{"role":"user","content":"OK"}],"max_tokens":100}'
  2. Consulta la ventana real del modelo y compárala con lo que estás enviando:

    curl -s https://api.<tu-dominio>/infernode/v1/models/Saptiva%20Cortex \
    -H "Authorization: Bearer $INFERNODE_API_KEY"

    El mensaje del 400 ya trae la cuenta hecha: la ventana, los tokens de salida que pediste y los de entrada que mandaste.

  3. En OpenCode, si la sesión lleva más de un minuto sin imprimir nada después de varias lecturas, es el segundo caso. No hay error que buscar en el registro porque no lo escribe.

Solución​

  1. Baja max_tokens. Pide 8 192 en lugar del max_output_tokens del Catálogo: el nodo aborta cualquier petición que pase de unos 300 segundos, así que pedir más no sirve (Rendimiento medido).
  2. En OpenCode, declara limit.input además de limit.context y limit.output, para que resuma el historial antes de topar con la ventana (Elegir los límites).
  3. Cierra la sesión muda con Ctrl+C y vuelve a empezar. Lo que ya estaba escrito en disco no se pierde.
  4. Cambia la instrucción: pide los archivos de a uno, o usa una búsqueda (grep) en lugar de leer archivos completos. Un turno que lee siete archivos grandes rebasa la ventana de cualquier modelo.
  5. Si el prompt es largo por necesidad, parte la tarea en varias llamadas y pasa solo el fragmento relevante en cada una.

Siguiente paso​