La API Responses de llama-server informa erróneamente como completadas las salidas truncadas
Un error en la compilación b11753 de llama.cpp hace que el endpoint /v1/responses marque las respuestas cortadas y las llamadas a herramientas inválidas como completadas, lo que supone un riesgo de corrupción de datos para agentes de IA autoalojados.
Traducido automáticamente del original en inglés.
Se ha identificado un importante error de compatibilidad en el endpoint /v1/responses compatible con OpenAI de llama-server, que afecta a los despliegues autoalojados de modelos de lenguaje grandes. A fecha 20 de octubre de 2026, el problema persiste en la compilación b11753 de llama.cpp, donde el servidor informa incorrectamente como completadas las respuestas truncadas y las llamadas a herramientas incompletas. Esta discrepancia representa un riesgo para los desarrolladores que construyen agentes autónomos que dependen de señales de estado precisas para ejecutar tareas posteriores.
Qué ocurrió
El problema principal radica en cómo llama-server traduce los estados internos de generación al formato de la API Responses. Cuando una solicitud alcanza el límite de tokens definido por max_output_tokens, el motor subyacente de finalización de chat identifica correctamente el motivo de parada como "length" (longitud). Sin embargo, al convertir este resultado en un objeto de la API Responses, el servidor fija el campo de estado a "completed" (completado) sin importar si la salida terminó o fue cortada. Este comportamiento afecta tanto a la generación estándar de texto como a los escenarios de llamada a funciones.
En pruebas realizadas con modelos como Gemma-3-1b-it y Qwen3-0.6B, las solicitudes limitadas a ocho tokens devolvieron un estado de "completed" con detalles de incompletitud nulos, aunque el texto terminaba a mitad de frase. Más críticamente, las llamadas a herramientas truncadas por límites de tokens devolvían argumentos JSON inválidos —como {"path": "/— pero seguían marcándose como elementos completados. Los clientes que confían en esta bandera de estado pueden intentar analizar JSON roto o ejecutar comandos parciales, lo que conduce a fallos silenciosos o errores inesperados en entornos de producción.
Detalles clave
- El error afecta a la compilación b11753 de llama.cpp e impacta específicamente en el endpoint
/v1/responses, mientras que/v1/chat/completionsinforma correctamentefinish_reason: "length". - Los argumentos de llamadas a herramientas truncadas se devuelven como elementos
function_callválidos con estado "completed", a pesar de contener JSON malformado que no puede ser analizado. - Las respuestas en streaming tampoco emiten un evento
response.incomplete, terminando en su lugar conresponse.completedy omitiendo la señal esperadafunction_call_arguments.done. - El único indicador fiable de truncamiento en la API Responses es comprobar si
usage.output_tokenses igual a losmax_output_tokenssolicitados, aunque esto es una heurística y no un estado definitivo. - El código fuente en
tools/server/server-task.cppcontiene siete instancias donde el estado se fija rígidamente a "completed", sin lógica para leer el motivo de subyacente de parada ni establecer el estado como "incomplete". - No se había fusionado ninguna corrección upstream ni pull request para el problema ggml-org/llama.cpp#30773 a fecha 20 de octubre de 2026.
Contexto
La API Responses es una especificación más reciente diseñada para interacciones tipo agente, permitiendo a los modelos devolver salidas estructuradas que incluyen pasos de razonamiento y llamadas a herramientas. Llama-server implementa esto convirtiendo internamente las solicitudes entrantes de Responses en solicitudes estándar de Chat Completions. Aunque el proceso de generación funciona correctamente, la capa de traducción falla al mapear el finish_reason de la finalización de chat de vuelta a los campos status e incomplete_details de la API Responses. Esta conversión unidireccional descarta señales críticas de fallo, dejando a los clientes ignorantes de que el modelo no terminó su pensamiento o comando.
Para los desarrolladores, esto resalta una trampa común en las capas de compatibilidad: asegurar que los estados de error y las condiciones límite se preserven a través de las traducciones de API. Un campo de estado solo es útil si puede reflejar con precisión los resultados negativos. En este caso, el servidor prioriza devolver contenido sobre comunicar integridad, asumiendo que la mayoría de las respuestas cabrán dentro de los límites. Esta suposición se rompe para tareas complejas que requieren contextos largos o ejecución precisa de herramientas.
Por qué importa
Para los equipos que ejecutan agentes de IA autoalojados, este error introduce una brecha de fiabilidad sutil pero peligrosa. Los sistemas autónomos a menudo dependen del campo status para decidir si proceder con una tarea. Si un agente recibe un estado "completed" para una ruta de archivo o fragmento de código truncado, puede intentar ejecutar un comando parcial. Esto puede llevar a corrupción de datos, despliegues fallidos o vulnerabilidades de seguridad si el input parcial es malinterpretado por sistemas posteriores. El riesgo es mayor para modelos pequeños o prompts complejos donde los límites de tokens se alcanzan frecuentemente.
Además, este problema complica la depuración. Como el servidor no reporta un error, los registros pueden mostrar finalizaciones exitosas incluso cuando la salida es inutilizable. Los desarrolladores podrían atribuir erróneamente el fallo a las capacidades de razonamiento del modelo o a sus habilidades de formateo JSON, en lugar de identificar el truncamiento a nivel de infraestructura. Esta desorientación desperdicia tiempo de ingeniería y puede llevar a cambios innecesarios de modelo o ajustes de prompt engineering que no abordan la causa raíz.
Qué puedes hacer
- Implementa validación en el lado cliente para tratar cualquier respuesta donde
usage.output_tokenssea igual amax_output_tokenscomo potencialmente truncada y verifica la integridad de la salida antes de usarla. - Valida estrictamente todos los argumentos de llamadas a herramientas como JSON antes de la ejecución; rechaza cualquier elemento
function_callque falle en el análisis, independientemente de su estado reportado. - Prefiere usar el endpoint
/v1/chat/completionspara tareas críticas si tu arquitectura de aplicación lo permite, ya que informa correctamentefinish_reason: "length"para salidas truncadas. - Aumenta los límites de
max_output_tokenspara flujos de trabajo de agentes para reducir la frecuencia de truncamiento, asegurando que el modelo tenga espacio suficiente para completar razonamientos complejos o definiciones de herramientas. - Ejecuta scripts de diagnóstico como
check-llama-responses-status.shcontra tu despliegue para confirmar si tu versión y configuración específicas están afectadas por este comportamiento de estado fijado rígidamente. - Monitoriza los repositorios upstream para parches al problema #30773 de llama.cpp, y considera contribuir con una corrección que mapee el motivo de parada de la finalización de chat al campo de estado de la API Responses si tienes capacidad para ello.



