Chat Completions e Responses
Abra o playground da aula e você vai encontrar dois botões, um para cada uma das duas formas de API do OpenAI: Chat Completions e Responses. Você vai ver esses dois nomes novamente no código de outras pessoas e na documentação do próprio provedor, geralmente sem explicação de por que existem dois.
Eles fazem o mesmo trabalho. Ambos enviam instruções e uma mensagem do usuário para um modelo e recebem uma resposta de volta. O que muda é onde você coloca cada parte da requisição, e onde o texto da resposta aparece depois, e essa segunda diferença é a que causa confusão quando você está copiando um trecho de código de algum lugar.
Esses botões do playground chamam rotas no servidor Express, o pequeno programa Node que o projeto do curso executa junto com a página, para que as requisições ao modelo aconteçam longe do código do navegador e sua chave de API nunca fique exposta. No Scrimba, a saída dessas rotas do servidor aparece na aba Runner em vez da aba Console.
Ambos os exemplos abaixo usam um cliente construído da mesma forma, a partir dos valores que você salvou em Configuração do provedor:
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.AI_KEY,
baseURL: process.env.AI_URL,
});Chat Completions
Chat Completions foi a primeira API estável e amplamente adotada para modelos de linguagem, e outros provedores implementaram a mesma forma, e é por isso que aparece em tantas amostras de código. Ela coloca o prompt do sistema e a entrada do usuário juntos em messages:
const response = await client.chat.completions.create({
model: process.env.AI_MODEL,
messages: [
{ role: "system", content: "You are a helpful assistant." },
{
role: "user",
content: "Give me a short explanation of why open-source tools matter.",
},
],
});O texto da resposta está aninhado sob a primeira choice:
response.choices[0].message.contentmessages: o prompt do sistema primeiro, depois sua pergunta. A resposta volta em response.choices[0].message.content. Esse caminho parece chato nas primeiras vezes que você digita. Leia com calma uma vez, porque você vai ver em quase toda amostra de código online.
Responses
Responses dá seu próprio campo instructions ao prompt do sistema. Para uma requisição simples, input pode ser uma string direta:
const response = await client.responses.create({
model: process.env.AI_MODEL,
instructions: "You are a helpful assistant.",
input: "Give me a short explanation of why open-source tools matter.",
});A mesma string direta pode ser movida para um objeto message com role/content quando você precisa da forma de message:
input: [
{
role: "user",
content: "Give me a short explanation of why open-source tools matter.",
},
],Responses expõe o texto da resposta diretamente:
response.output_textTambém mantém a estrutura completa da resposta em response.output. Uma resposta de texto básica geralmente contém um item de message cujo content inclui o mesmo texto de saída.
instructions em vez de compartilhar a lista, e input pode ser uma string simples quando você está perguntando apenas uma coisa. A resposta fica em response.output_text, a um passo de distância em vez de três. Se o botão Responses imprime uma resposta na aba Runner, seu provedor e modelo suportam essa API.
Por que o curso usa Responses
Chat Completions ainda é uma API suportada, e a funcionalidade de agente neste curso poderia ser construída com ela.
O curso usa Responses por causa da diferença que você já pode ver nos dois blocos de código acima. Ler uma resposta é response.output_text em vez de response.choices[0].message.content, e o prompt do sistema tem um lugar nomeado em vez de ser o primeiro item em um array no qual você também adiciona turnos do usuário. Assim que chamadas de ferramentas e histórico de conversa começam a se acumular, essa forma significa menos código mantendo as peças juntas.
OpenRouter também suporta a API Responses, com uma diferença do OpenAI: ele não armazena estado de conversa em seus servidores. Isso não afeta o curso, que mantém seu próprio histórico de conversa em código.
Use a saída completa quando você precisar da estrutura
output_text é a forma conveniente de ler uma resposta de texto final. Use output quando você precisar inspecionar o conjunto completo de itens de resposta.
Você não precisa memorizar as diferenças. Use Responses aqui, e reconheça Chat Completions quando encontrá-la em outro lugar.
Para onde isso vai a seguir
Rodando o código localmente explica como o navegador e o servidor Express se conectam depois que você baixa uma aula do Scrimba. Se você ainda não escolheu um modelo, Modelos recomendados cobre o que o trabalho com agentes requer.

