Volver a las guías
Solución de problemas·23 de septiembre de 2026·6 min de lectura

«Este modelo no admite el prellenado de mensajes del asistente»: qué modelos Claude dejaron de admitir el prellenado y qué lo sustituye

Tu matriz messages termina con un turno del asistente, y los modelos Claude 4.6 y posteriores lo interpretan como un prellenado y lo rechazan. Termina la conversación con un mensaje del usuario y traslada lo que hacía el prellenado —forzar JSON, omitir una introducción, mantener una persona o reanudar una respuesta interrumpida— al mecanismo de sustitución que Anthropic documenta para cada caso.

Última revisión: .

Tu matriz messages termina con un turno del asistente, y los modelos Claude 4.6 y posteriores lo interpretan como un prellenado y lo rechazan. Termina la conversación con un mensaje del usuario y traslada lo que hacía el prellenado —forzar JSON, omitir una introducción, mantener una persona o reanudar una respuesta interrumpida— al mecanismo de sustitución que Anthropic documenta para cada caso.

El error

Anthropic API response (HTTP 400)
{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "This model does not support assistant message prefill. The conversation must end with a user message."
  },
  "request_id": "req_..."
}

Causas y soluciones de un vistazo

CausaSolución
La última entrada de messages tiene role: "assistant"Eso es un prellenado, y los modelos Claude 4.6 y posteriores lo rechazan. Termina con un mensaje del usuario.
Un framework dejó un mensaje vacío del asistente al finalElimina el mensaje final del asistente que no tenga contenido antes de enviar la solicitud.
Prellenaste “{” para forzar JSONUsa salidas estructuradas (output_config.format).
Prellenaste para omitir una introducción, mantener una persona o reanudar una respuesta interrumpidaUna instrucción en el prompt del sistema, un rol en el prompt del sistema o una continuación en el turno del usuario.
Un gestor de memoria, bucle de agente o traspaso dejó un turno del asistente al finalNormaliza el final una sola vez, justo antes de la solicitud, en lugar de hacerlo en cada ruta del código.

Qué modelos Claude rechazan el prellenado (a septiembre de 2026)

La referencia de errores de Anthropic es clara: los modelos Claude 4.6 y posteriores no admiten prellenar el último mensaje del asistente, y una solicitud que lo haga devuelve exactamente este error 400 (https://platform.claude.com/docs/en/api/errors#prefill-not-supported). Por nombre, se trata de Claude Opus 4.6 y todos los Opus posteriores, incluido Claude Opus 5.5 (https://platform.claude.com/docs/en/models/opus-5-5/migration-guide); Claude Sonnet 4.6 y Claude Sonnet 5 (https://platform.claude.com/docs/en/models/sonnet-5/migration-guide); y Claude Fable 5 y Fable 5.1 (https://platform.claude.com/docs/en/models/fable-5-1/migration-guide). Claude Haiku 4.5 todavía acepta un prellenado, al igual que Claude Sonnet 4.5 y Claude Opus 4.5, por eso este error suele aparecer tras un cambio de ID de modelo y no de código. Los mensajes del asistente anteriores en la conversación, incluidos los ejemplos few-shot, no se ven afectados.

Termina con un turno del usuario — incluida la solución de una línea

A menudo nadie escribió un prellenado deliberadamente: algo en la pila dejó un mensaje del asistente al final. Informes públicos lo atribuyen a un gestor de memoria que añade uno (incidencia #1694 de Strands), un bucle de agente que vuelve a solicitar después de un turno que considera erróneamente incompleto (incidencia #46415 de opencode), respuestas consecutivas y traspasos de agentes (incidencia #4907 de LiveKit), y un mensaje vacío del asistente dejado al final (PR #7931 de AutoGen). Si el mensaje final está vacío, elimínalo: esa es la solución de una línea. Si contiene texto que quieres continuar, sigue las indicaciones de migración de Anthropic para continuaciones: coloca la continuación en un mensaje del usuario que cite dónde se detuvo la respuesta. Una excepción documentada que debes dejar intacta: un pause_turn procedente de herramientas del servidor, como la búsqueda web, se continúa enviando el contenido del asistente pausado tal cual (https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools).

end_on_user.py
from openai import OpenAI

client = OpenAI(base_url="https://api.kunavo.com/v1", api_key="sk-kn-...")

def end_on_user(messages: list[dict]) -> list[dict]:
    """Claude 4.6 and later reject a conversation whose last turn is the assistant's."""
    last = messages[-1] if messages else None
    if not last or last["role"] != "assistant" or last.get("tool_calls"):
        return messages               # tool_calls are owed tool results instead
    content = last.get("content")
    if not content or (isinstance(content, str) and not content.strip()):
        return messages[:-1]          # the one line: drop an empty tail
    tail = content[-200:] if isinstance(content, str) else "..."
    return messages + [{
        "role": "user",
        "content": f"Your previous response was interrupted and ended with {tail!r}. "
                   "Continue from where you left off.",
    }]

messages = [
    {"role": "user", "content": "Explain HTTP caching in three bullets."},
    {"role": "assistant", "content": ""},  # the empty tail a framework left behind
]

resp = client.chat.completions.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=end_on_user(messages),
)
print(resp.choices[0].message.content)

Sustituye lo que hacía el prellenado

La guía de prompting de Anthropic asigna cada uso anterior del prellenado a una alternativa (https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#migrating-away-from-prefilled-responses). Forzar JSON: salidas estructuradas, que restringen la respuesta a tu esquema y están disponibles en Claude Haiku 4.5, Sonnet 4.5, Opus 4.5 y todos los modelos posteriores (https://platform.claude.com/docs/en/build-with-claude/structured-outputs); para YAML u otro formato, la guía recomienda solicitar la estructura y volver a intentarlo si no se respeta. Clasificación: una herramienta con un enum de tus etiquetas válidas, o salidas estructuradas. Omitir una introducción: una instrucción en el prompt del sistema como «Responde directamente sin introducción». Mantener una persona: establece el rol en el prompt del sistema (https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#give-claude-a-role) y coloca recordatorios periódicos en el turno del usuario en lugar de usar un mensaje del asistente prellenado. Una respuesta interrumpida: la continuación en el turno del usuario descrita arriba. Forzar una llamada a herramienta no es un sustituto directo en todos los casos: Claude Fable 5.1 y Claude Opus 5.5 rechazan tool_choice any y tool con su propio error 400 (https://platform.claude.com/docs/en/api/errors#forced-tool-use-not-supported).

structured-output.sh
# Before: messages ended with {"role": "assistant", "content": "{"}
# Kunavo forwards output_config as sent; the reply is constrained to the schema.
curl https://api.kunavo.com/v1/messages \
  -H "x-api-key: sk-kn-..." \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-sonnet-4-6",
    "max_tokens": 1024,
    "messages": [
      {"role": "user", "content": "Extract the name and email: John Smith <john@example.com>"}
    ],
    "output_config": {
      "format": {
        "type": "json_schema",
        "schema": {
          "type": "object",
          "properties": {
            "name": {"type": "string"},
            "email": {"type": "string"}
          },
          "required": ["name", "email"],
          "additionalProperties": false
        }
      }
    }
  }'

Si llamas a través de Kunavo

Kunavo reenvía un turno final del asistente; no lo corrige. /v1/messages entrega tu matriz messages al proveedor ascendente sin cambios, y en /v1/chat/completions el traductor conserva un mensaje final con role: "assistant" como turno final del asistente en la solicitud a Claude, incluido uno vacío; por tanto, elimina tú mismo los mensajes vacíos. Anthropic rechaza un turno final prellenado en todos los modelos claude-* que ofrecemos excepto claude-haiku-4-5, y ese error 400 te llega con el texto del mensaje intacto, seguido del ID de solicitud del proveedor ascendente: con formato Anthropic en /v1/messages, de tipo invalid_request_error como en la API de Anthropic (hasta el 24 de septiembre de 2026 se leía api_error), y con formato OpenAI en /v1/chat/completions (type upstream_error, code upstream_400). Un 400 nunca se reintenta por otro canal y la llamada fallida se registra con coste cero. Para JSON, envía un esquema en lugar de un prellenado: /v1/messages reenvía output_config tal como lo enviaste y, en /v1/chat/completions, un response_format de tipo json_schema se traduce a output_config.format. El 24-09-2026 ese campo restringía la respuesta al esquema en todos los modelos claude-* que ofrecemos. Un response_format json_object no tiene equivalente en Claude y no se aplica, y un esquema enviado junto con un turno final prellenado produce su propio error 400, incluido claude-haiku-4-5: «When using output format, pre-filling the `assistant` response is not supported.» El endpoint nativo y la estructura de solicitud que transmite están documentados en la documentación de la API Messages.

Preguntas frecuentes

¿Qué modelos Claude no admiten el prellenado de mensajes del asistente?

Según la documentación de Anthropic a septiembre de 2026, todos los modelos Claude desde 4.6: Claude Opus 4.6 y todos los Opus posteriores, Claude Sonnet 4.6 y Sonnet 5, Claude Fable 5 y 5.1, y los modelos Mythos. Claude Haiku 4.5, Sonnet 4.5 y Opus 4.5 todavía aceptan uno.

¿Cómo fuerzo una salida JSON de Claude sin prellenado?

Usa salidas estructuradas: pasa un esquema JSON en output_config.format y la respuesta quedará restringida a él. Mediante un endpoint compatible con OpenAI, envíalo como response_format con type json_schema; Kunavo lo traduce a output_config.format. Anthropic indica que el prellenado de mensajes es incompatible con las salidas JSON en cualquier caso.

¿Por qué recibo este error si nunca hice un prellenado?

Algo en tu pila dejó un mensaje del asistente al final: un gestor de memoria o sesión, un bucle de agente que vuelve a solicitar después de un turno, un traspaso de agente o un mensaje vacío del asistente que nadie eliminó. Registra la matriz messages exactamente como se envía; su último elemento tendrá role: "assistant".

¿Todavía puedo incluir mensajes del asistente en la conversación?

Sí. Solo está restringido el turno final; los mensajes anteriores del asistente, incluidos los ejemplos few-shot, no se ven afectados.

¿Por qué ocurre también mediante un endpoint compatible con OpenAI?

Porque la puerta de enlace conserva tu mensaje final con role: "assistant" como un turno final del asistente de Claude: el mismo prellenado, con otra forma. El traductor de chat de Kunavo hace exactamente eso, y se ha informado del mismo mensaje a través de otras puertas de enlace compatibles con OpenAI (incidencia #13768 de opencode). La solución es la misma: termina con un mensaje del usuario.

Guías relacionadas

Encontrarás más detalles sobre el significado de los errores en referencia de errores; obtener una clave lleva un minuto mediante registro y la guía de autenticación.