Al migrar desde Text Completions a Messages, considera los siguientes cambios.

Entradas y salidas

El cambio más grande entre Text Completions y Messages es la forma en que especificas las entradas del modelo y recibes las salidas del modelo.

Con Text Completions, las entradas son cadenas de texto sin procesar:

Python
prompt = "\n\nHuman: Hola\n\nAssistant: Hola, soy Claude. ¿Cómo puedo ayudar?\n\nHuman: ¿Puedes explicarme la Glucólisis?\n\nAssistant:"

Con Messages, especificas una lista de mensajes de entrada en lugar de un prompt sin procesar:

messages = [
  {"role": "user", "content": "Hola."},
  {"role": "assistant", "content": "Hola, soy Claude. ¿Cómo puedo ayudar?"},
  {"role": "user", "content": "¿Puedes explicarme la Glucólisis?"},
]

Cada mensaje de entrada tiene un role y content.

Nombres de roles

La API de Text Completions espera turnos alternos de \n\nHuman: y \n\nAssistant:, pero la API de Messages espera roles user y assistant. Puedes ver documentación que se refiere a turnos “human” o “user”. Estos se refieren al mismo rol, y será “user” en adelante.

Con Text Completions, el texto generado por el modelo se devuelve en los valores completion de la respuesta:

Python
>>> response = anthropic.completions.create(...)
>>> response.completion
" Hola, soy Claude"

Con Messages, la respuesta es el valor content, que es una lista de bloques de contenido:

Python
>>> response = anthropic.messages.create(...)
>>> response.content
[{"type": "text", "text": "Hola, soy Claude"}]

Poner palabras en la boca de Claude

Con Text Completions, puedes pre-llenar parte de la respuesta de Claude:

Python
prompt = "\n\nHuman: Hola\n\nAssistant: Hola, mi nombre es"

Con Messages, puedes lograr el mismo resultado haciendo que el último mensaje de entrada tenga el rol assistant:

Python
messages = [
  {"role": "human", "content": "Hola"},
  {"role": "assistant", "content": "Hola, mi nombre es"},
]

Al hacerlo, el content de la respuesta continuará desde el content del último mensaje de entrada:

JSON
{
  "role": "assistant",
  "content": [{"type": "text", "text": " Claude. ¿Cómo puedo asistirte hoy?" }],
  ...
}

System prompt

Con Text Completions, el system prompt se especifica agregando texto antes del primer turno \n\nHuman::

Python
prompt = "Hoy es 1 de enero de 2024.\n\nHuman: Hola, Claude\n\nAssistant:"

Con Messages, especificas el system prompt con el parámetro system:

Python
anthropic.Anthropic().messages.create(
    model="claude-3-opus-20240229",
    max_tokens=1024,
    system="Hoy es 1 de enero de 2024.", # <-- system prompt
    messages=[
        {"role": "user", "content": "Hola, Claude"}
    ]
)

Nombres de modelos

La API de Messages requiere que especifiques la versión completa del modelo (ej. claude-3-opus-20240229).

Anteriormente soportábamos especificar solo el número de versión principal (ej. claude-2), lo que resultaba en actualizaciones automáticas a versiones menores. Sin embargo, ya no recomendamos este patrón de integración, y Messages no lo soporta.

Razón de parada

Text Completions siempre tienen un stop_reason de:

  • "stop_sequence": El modelo terminó su turno naturalmente, o una de tus secuencias de parada personalizadas fue generada.
  • "max_tokens": El modelo generó tu max_tokens especificado de contenido, o alcanzó su máximo absoluto.

Messages tienen un stop_reason de uno de los siguientes valores:

  • "end_turn": El turno conversacional terminó naturalmente.
  • "stop_sequence": Una de tus secuencias de parada personalizadas especificadas fue generada.
  • "max_tokens": (sin cambios)

Especificar tokens máximos

  • Text Completions: parámetro max_tokens_to_sample. Sin validación, pero valores limitados por modelo.
  • Messages: parámetro max_tokens. Si pasas un valor mayor al que el modelo soporta, devuelve un error de validación.

Formato de streaming

Al usar "stream": true con Text Completions, la respuesta incluía cualquiera de los eventos enviados por el servidor completion, ping, y error. Ver Text Completions streaming para detalles.

Messages pueden contener múltiples bloques de contenido de tipos variados, y por lo tanto su formato de streaming es algo más complejo. Ver Messages streaming para detalles.