Finalización de chat

Estructura de solicitud y respuesta, streaming y los endpoints equivalentes en los protocolos Anthropic y Gemini.

La finalización de chat es el endpoint más usado: envías una lista de mensajes al modelo y recibes la respuesta generada. La entrada principal de la plataforma es el protocolo compatible con OpenAI; los protocolos Anthropic y Gemini son equivalentes isomorfos.

Estructura de la solicitud (compatible con OpenAI)

POST {base}/chat/completions — autenticación en Autenticación:

{
  "model": "your-model",
  "messages": [
    {"role": "system", "content": "You are a support assistant."},
    {"role": "user", "content": "Where is my order?"},
    {"role": "assistant", "content": "Sure, may I have the order number?"},
    {"role": "user", "content": "A1024"}
  ],
  "temperature": 0.7,
  "max_tokens": 1024,
  "stream": false
}
  • messages es el historial ordenado de la conversación; role es system / user / assistant. En conversaciones de varios turnos, el cliente concatena todo el historial y lo reenvía cada vez;
  • Un temperature más alto produce resultados más variados (habitualmente entre 0 y 1); max_tokens limita la longitud de la respuesta;
  • Streaming: con "stream": true la respuesta se envía de forma incremental por SSE (choices[0].delta), ideal para mostrar el texto a medida que se genera. Con los SDK oficiales: pasa stream=True e itera.

Estructura de la respuesta

Campos clave de una respuesta sin streaming:

{
  "choices": [
    {
      "message": {"role": "assistant", "content": "..."},
      "finish_reason": "stop"
    }
  ],
  "usage": {"prompt_tokens": 58, "completion_tokens": 132, "total_tokens": 190}
}
  • choices[0].message.content contiene la respuesta; finish_reason con valor stop significa que terminó de forma natural, y length que se cortó por max_tokens;
  • usage es el consumo de tokens de esta llamada: tanto la facturación como la página «Uso» se basan en él.

Endpoints equivalentes en otros protocolos

  • Anthropic: POST {base}/v1/messages — cambian los nombres de los campos (max_tokens es obligatorio, la respuesta vive en el array content), pero la semántica es idéntica;
  • Gemini: POST {base}/v1beta/models/{model}:generateContent — los mensajes van en el array contents.

Los tres protocolos son isomorfos; migrar consiste sobre todo en renombrar campos. Lo práctico es usar el SDK oficial correspondiente (openai / @anthropic-ai/sdk / @google/genai) con base_url apuntando a la plataforma.