Chat Completions y Responses
Abre el playground de la lección y encontrarás dos botones, uno para cada una de las dos formas de API de OpenAI: Chat Completions y Responses. Volverás a encontrar ambos nombres en el código de otras personas y en la documentación del proveedor, generalmente sin explicación de por qué existen dos.
Hacen lo mismo. Ambas envían instrucciones y un mensaje del usuario a un modelo y reciben una respuesta. Lo que difiere es dónde pones cada parte de la solicitud, y dónde aparece el texto de la respuesta después, y esa segunda diferencia es la que te causa problemas cuando copias un fragmento de código de algún lado.
Esos botones del playground llaman rutas en el servidor Express, el pequeño programa Node que el proyecto del curso ejecuta junto a la página, para que las solicitudes al modelo ocurran fuera del código del navegador y tu clave API nunca quede expuesta. En Scrimba, la salida de esas rutas del servidor aparece en la pestaña Runner en lugar de la pestaña Console.
Ambos ejemplos a continuación usan un cliente construido de la misma manera, con los valores que guardaste en Configuración del proveedor:
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.AI_KEY,
baseURL: process.env.AI_URL,
});Chat Completions
Chat Completions fue la primera API estable y ampliamente adoptada para modelos de lenguaje, y otros proveedores implementaron la misma forma, por eso aparece en tantas muestras de código. Coloca el prompt del sistema y la entrada del usuario juntos en messages:
const response = await client.chat.completions.create({
model: process.env.AI_MODEL,
messages: [
{ role: "system", content: "Eres un asistente útil." },
{
role: "user",
content: "Dame una explicación breve de por qué las herramientas de código abierto son importantes.",
},
],
});El texto de la respuesta está anidado bajo la primera opción:
response.choices[0].message.contentmessages: primero el prompt del sistema, luego tu pregunta. La respuesta regresa en response.choices[0].message.content. Ese camino se ve complicado las primeras veces que lo escribes. Léelo lentamente una vez, porque lo verás en casi todas las muestras de código en línea.
Responses
Responses le da al prompt del sistema su propio campo instructions. Para una solicitud simple, input puede ser una cadena directa:
const response = await client.responses.create({
model: process.env.AI_MODEL,
instructions: "Eres un asistente útil.",
input: "Dame una explicación breve de por qué las herramientas de código abierto son importantes.",
});La misma cadena directa puede moverse a un objeto de mensaje role/content cuando necesitas la forma de mensaje:
input: [
{
role: "user",
content: "Dame una explicación breve de por qué las herramientas de código abierto son importantes.",
},
],Responses expone el texto de la respuesta directamente:
response.output_textTambién mantiene la estructura completa de la respuesta en response.output. Una respuesta de texto básica generalmente contiene un elemento de mensaje cuyo content incluye el mismo texto de salida.
instructions en lugar de compartir la lista, e input puede ser una cadena simple cuando solo haces una pregunta. La respuesta está en response.output_text, un paso de distancia en lugar de tres. Si el botón Responses imprime una respuesta en la pestaña Runner, tu proveedor y modelo manejan esta API.
Por qué el curso usa Responses
Chat Completions sigue siendo una API compatible, y la funcionalidad de agentes en este curso podría construirse con ella.
El curso usa Responses por la diferencia que ya puedes ver en los dos bloques de código anteriores. Leer una respuesta es response.output_text en lugar de response.choices[0].message.content, y el prompt del sistema tiene un hogar con nombre en lugar de ser el primer elemento en un array al que también agregas turnos del usuario. Una vez que las llamadas de herramientas y el historial de conversación empiezan a acumularse, esa forma significa menos código sosteniendo las piezas.
OpenRouter también soporta la API de Responses, con una diferencia respecto a OpenAI: no almacena el estado de la conversación en sus servidores. Eso no afecta el curso, que mantiene su propio historial de conversación en código.
Usa la salida completa cuando necesites la estructura
output_text es la manera conveniente de leer una respuesta de texto final. Usa output cuando necesites inspeccionar el conjunto completo de elementos de respuesta.
No necesitas memorizar las diferencias. Usa Responses aquí, y reconoce Chat Completions cuando lo encuentres en otro lado.
Hacia dónde va esto
Ejecutar el código localmente explica cómo se conectan el navegador y el servidor Express después de que descargas una lección de Scrimba. Si aún no has elegido un modelo, Modelos recomendados cubre lo que requiere el trabajo de agentes.

