Muchos servicios de modelos grandes ofrecen APIs “compatibles con OpenAI”. Al integrarlos, lo primero que debes confirmar son dos cosas:
BASE_URL: la dirección de API proporcionada por el servicio.OPENAI_API_KEY: tu clave de acceso.
Si el proveedor es compatible con la API Chat Completions, la forma de la solicitud suele parecerse a /v1/chat/completions de OpenAI. Aun así, OpenAI también está impulsando la Responses API. Chat Completions sigue siendo común, especialmente en APIs compatibles de terceros, pero si estás creando un proyecto nuevo directamente sobre capacidades oficiales de OpenAI, también conviene prestar atención a la Responses API.
Referencias oficiales:
Ejemplo mínimo de solicitud
Una solicitud mínima de Chat Completions se ve aproximadamente así:
|
|
Si usas un servicio de terceros compatible con OpenAI, normalmente solo necesitas reemplazar la primera línea por el BASE_URL del proveedor:
|
|
Los tres errores más comunes son:
- añadir o quitar por error
/v1enBASE_URL; - olvidar que
Authorizationdebe usarBearer; - usar un valor de
modelque el proveedor no soporta realmente.
Los campos más importantes del cuerpo de la solicitud
El cuerpo de una solicitud Chat Completions es un objeto JSON. Los campos más básicos y frecuentes son estos.
model
model es obligatorio e indica el ID del modelo que se va a llamar.
|
|
En servicios de terceros compatibles con OpenAI, el ID del modelo no siempre será gpt-4o-mini. Algunos proveedores usan nombres propios, como deepseek-chat, qwen-plus o llama-3.1-70b. Debes seguir la documentación o la lista de modelos del proveedor.
messages
messages es obligatorio y representa el historial de conversación de principio a fin. Es un arreglo, y cada elemento es un mensaje.
Los roles comunes son:
system: instrucciones del sistema que definen el comportamiento del asistente;user: mensajes del usuario;assistant: respuestas previas del modelo;tool: resultados de ejecución de herramientas.
Una conversación simple de varios turnos puede escribirse así:
|
|
system message
Un mensaje system suele colocarse al principio y le indica al modelo qué rol debe asumir y qué reglas debe seguir.
|
|
Campos comunes:
role: fijo comosystem;content: contenido del prompt del sistema;name: opcional, para etiquetar al participante.
No todos los servicios compatibles implementan el comportamiento de system exactamente igual. Si el prompt del sistema parece no funcionar, revisa primero si el proveedor modifica las reglas de roles.
user message
Un mensaje user representa la entrada del usuario. Lo más común es texto plano:
|
|
En modelos que soportan entrada multimodal, content también puede ser un arreglo con texto e imágenes:
|
|
Que una API compatible soporte imágenes depende del modelo concreto. No asumas soporte multimodal solo porque la ruta del endpoint sea compatible con OpenAI.
assistant message
Un mensaje assistant suele aparecer en el historial de varios turnos y representa lo que el modelo dijo antes.
|
|
Cuando el modelo decide llamar a una herramienta, el mensaje assistant puede no contener texto normal y traer tool_calls en su lugar.
tool message
Un mensaje tool se usa para devolver al modelo el resultado de una herramienta. Debe corresponder a un tool_calls.id del mensaje assistant anterior.
|
|
Esto es habitual en flujos de Agent: el modelo decide primero qué función llamar, la aplicación ejecuta realmente esa función, y luego envía el resultado como mensaje tool para que el modelo genere la respuesta final.
tools y tool_choice
tools le dice al modelo qué herramientas puede llamar. El tipo más común es una herramienta de función.
Este es un ejemplo para consultar el clima:
|
|
Si el modelo considera que necesita una herramienta, la respuesta puede contener algo así:
|
|
Aquí hay dos detalles importantes:
- El modelo solo está sugiriendo llamar a una función. No ejecuta realmente la función por tu programa.
argumentses una cadena JSON generada por el modelo. Debes validarla antes de usarla.
tool_choice controla si el modelo llama herramientas:
"none": no llama herramientas y solo genera texto;"auto": el modelo decide entre generar texto o llamar herramientas;"required": obliga al modelo a llamar una o más herramientas;- especificar una función: fuerza la llamada a una herramienta concreta.
Los campos antiguos functions y function_call fueron reemplazados por tools y tool_choice. En proyectos heredados todavía pueden aparecer, pero en código nuevo conviene usar la forma nueva.
stream salida en streaming
stream es un booleano opcional. Al establecerlo en true, la API devuelve contenido por partes mediante SSE, algo útil para interfaces de chat en tiempo real.
|
|
Una respuesta sin streaming espera a que el modelo termine y devuelve todo de una vez. Una respuesta en streaming devuelve chunks continuamente. Un fragmento típico se parece a esto:
|
|
El frontend o backend debe leer continuamente las líneas data:, concatenar cada delta.content y detenerse al recibir [DONE].
Cómo leer una respuesta sin streaming
Una respuesta Chat Completions sin streaming suele contener campos como estos:
|
|
Lo más usado es:
choices[0].message.content: respuesta final del modelo;choices[0].message.tool_calls: herramientas que el modelo quiere llamar;choices[0].finish_reason: motivo de parada;usage: uso de tokens.
Valores comunes de finish_reason:
stop: parada natural;length: se alcanzó el límite de tokens;tool_calls: el modelo solicitó llamar una herramienta;content_filter: el contenido fue filtrado.
Lista de comprobación para APIs compatibles
Al integrar un servicio de terceros compatible con OpenAI, no basta con mirar que la ruta del endpoint sea igual. Conviene revisar:
- Si
BASE_URLincluye/v1. - Si
OPENAI_API_KEYcorresponde realmente al proveedor actual. - Si
modeles un ID de modelo válido. - Si soporta mensajes
system. - Si soporta entrada multimodal
image_url. - Si soporta
toolsytool_choice. - Si soporta
stream: true. - Si el campo de límite de tokens es
max_completion_tokenso el antiguomax_tokens. - Si el formato de errores coincide exactamente con OpenAI.
- Si hay límites adicionales de velocidad, concurrencia o región.
“Compatible con OpenAI” normalmente significa que la forma de llamada es similar. No significa que todas las capacidades del modelo, semánticas de campos y formatos de error sean idénticos.
Conclusión
Si solo quieres hacer chat básico, para Chat Completions los campos centrales son prácticamente tres:
|
|
Si quieres construir un Agent o automatización de negocio, necesitas entender además:
tools: decirle al modelo qué funciones puede usar;tool_choice: controlar si el modelo llama herramientas;tool_calls: leer qué quiere llamar el modelo;toolmessage: devolver al modelo los resultados reales de herramientas;stream: convertir la respuesta en salida en tiempo real.
Para APIs compatibles con OpenAI, el camino más seguro es: primero hacer funcionar la solicitud mínima de texto, luego añadir streaming, y por último conectar llamadas a herramientas. Cada vez que agregues una capacidad, pruébala con el modelo real y el proveedor real. No infieras compatibilidad solo por el nombre de los campos.