responses api的格式

A
Admin

如果你已经在研究 Codex 架构,那么 Responses API 可以理解为 OpenAI 新一代的 Agent API

它的设计目标就是:

让模型、工具调用、推理过程、多轮上下文管理统一到一个接口里。

相比以前的 Chat Completions:

messages
   ↓
model
   ↓
text

Responses API 更像:

input
   ↓
model
   ↓
reasoning
   ↓
tool call
   ↓
tool result
   ↓
reasoning
   ↓
final answer

这其实就是 Codex 内部 Agent Loop 所依赖的能力。


传统 Chat Completion

以前调用大概是:

{
  "model": "gpt-4o",
  "messages": [
    {
      "role": "user",
      "content": "北京天气"
    }
  ]
}

返回:

{
  "choices": [
    {
      "message": {
        "content": "..."
      }
    }
  ]
}

模型主要负责生成文本。


Responses API

结构变成:

{
  "model": "gpt-5",
  "input": "北京天气"
}

返回内容不再只有文本。

而是一个 Output 数组:

{
  "output": [
    {
      "type": "reasoning",
      ...
    },
    {
      "type": "function_call",
      ...
    }
  ]
}

概念上类似:

Response
 ├─ reasoning
 ├─ function_call
 ├─ message
 └─ ...

Tool 调用示例

假设注册了:

{
  "name": "get_weather",
  "parameters": {
    "type": "object",
    "properties": {
      "city": {
        "type": "string"
      }
    }
  }
}

用户:

东京天气

模型可能返回:

{
  "type": "function_call",
  "name": "get_weather",
  "arguments": {
    "city": "Tokyo"
  }
}

你的程序执行:

get_weather("Tokyo")

得到:

{
  "temperature": 27
}

再把结果送回模型。


Agent Loop 长什么样

这是最关键的部分。

Codex、Claude Code、OpenHands 本质上都在干类似事情:

while True:

    response = client.responses.create(...)

    if response.contains_tool_call():

        result = execute_tool()

        response = client.responses.create(
            previous_response_id=response.id,
            input=result
        )

    else:
        break

流程:

User
 ↓
Response API
 ↓
Tool Call
 ↓
Tool Result
 ↓
Response API
 ↓
Final Answer

previous_response_id

这是 Responses API 非常重要的设计。

以前:

messages = [
  ...
]

每轮都要传整个历史。

现在:

response = client.responses.create(...)

返回:

{
  "id": "resp_abc123"
}

下一轮:

client.responses.create(
    previous_response_id="resp_abc123",
    input=tool_result
)

OpenAI 后端自动关联上下文。

所以:

response1
      ↓
response2
      ↓
response3

形成一棵执行链。

这也是 Codex 能长时间执行任务的重要基础。


对你做数据分析 Agent意味着什么

假设你有:

query_db(sql)

Tool Schema:

{
  "name": "query_db"
}

用户:

上个月收入多少?

Responses API 返回:

{
  "type": "function_call",
  "name": "query_db",
  "arguments": {
    "sql": "..."
  }
}

执行后:

{
  "rows": [
    {
      "revenue": 1000000
    }
  ]
}

再送回:

client.responses.create(
    previous_response_id=response.id,
    input=tool_result
)

模型最终输出:

上个月收入为100万元。

从 Agent 架构角度理解

可以把 Responses API 看成:

Chat Completion
+
Function Calling
+
Conversation State
+
Reasoning Items
+
Tool Loop Support

即:

Responses API
    =
    Agent Runtime API

这也是为什么你看 Codex 源码时,会发现很多逻辑不再围绕:

messages[]

展开,而是围绕:

response
tool_call
tool_result
previous_response_id

展开。

因为 OpenAI 近两年的方向就是把 Agent 所需的基础能力下沉到 Responses API,而不是让每个开发者自己拼装一个 ReAct 框架。


responses api的格式 | JBLOG