Chat Completions 和 Responses
打开课程的练习场,你会看到两个按钮,分别对应 OpenAI 的两种 API 形式:Chat Completions 和 Responses。你在别人的代码和供应商的文档中也会看到这两个名字,但通常没人会解释为什么有两种。
它们做的是同一件事。两者都是把指令和用户消息发给模型,然后获取回复。不同之处在于你把请求的各个部分放在哪里,以及回复文本最后出现在哪里。第二个差异特别容易踩坑,当你从某个地方复制代码片段时尤其如此。
这些练习场按钮调用的是 Express 服务器上的路由。Express 是一个小型 Node 程序,课程项目在它旁边运行,这样模型请求就发生在浏览器代码之外,你的 API 密钥永远不会暴露。在 Scrimba 中,这些服务器路由的输出会显示在 Runner 标签页而不是控制台标签页中。
下面两个例子都用同一种方式构建的客户端,使用的是你在提供商设置中保存的值:
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.AI_KEY,
baseURL: process.env.AI_URL,
});Chat Completions
Chat Completions 是第一个稳定的、被广泛采用的语言模型 API,其他提供商也实现了相同的结构,这就是为什么它出现在很多代码示例中。它把系统提示和用户输入放在一起的 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.",
},
],
});回复文本嵌套在第一个 choice 下:
response.choices[0].message.contentmessages 列表中:系统提示在前,然后是你的问题。回复出现在 response.choices[0].message.content。 这个路径前几次打的时候可能觉得有点复杂。仔细读一遍,因为你几乎会在所有网上找到的代码示例中看到它。
Responses
Responses 给系统提示提供了自己的 instructions 字段。对于简单请求,input 可以是一个直接的字符串:
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.",
});当你需要消息形式时,同样的直接字符串可以移到一个 role/content 消息对象中:
input: [
{
role: "user",
content: "Give me a short explanation of why open-source tools matter.",
},
],Responses 直接暴露回复文本:
response.output_text它也把完整的响应结构保存在 response.output 中。基本的文本响应通常包含一个消息项,其 content 包括相同的输出文本。
instructions 字段而不是共享列表,当你只是问一个问题时 input 可以是普通字符串。 回复位于 response.output_text,只需要一步而不是三步。如果 Responses 按钮在 Runner 标签页中打印了回复,说明你的提供商和模型支持这个 API。
为什么本课程使用 Responses
Chat Completions 仍然是一个支持的 API,本课程的智能体功能也可以用它来构建。
本课程使用 Responses 是因为你已经能在上面两个代码块中看到的区别。读取回复是 response.output_text 而不是 response.choices[0].message.content,系统提示有一个命名的位置而不是数组中的第一项(你还要往里面追加用户轮次)。一旦工具调用和对话历史开始积累,这个结构意味着更少的代码来把各个部分连接在一起。
OpenRouter 也支持 Responses API,但与 OpenAI 有一个区别:它不在服务器上存储对话状态。这不会影响本课程,因为本课程在代码中保持自己的对话历史。
需要结构时使用完整输出
output_text 是读取最终文本回复的便捷方式。需要检查完整的响应项集合时使用 output。
你不需要记住这些区别。在这里使用 Responses,在别的地方遇到 Chat Completions 时识别它就行。
接下来
本地运行代码解释了在你从 Scrimba 下载课程后浏览器和 Express 服务器如何连接。如果你还没有选择模型,推荐模型涵盖了智能体工作需要什么。

