1
0
Files
nex/docs/api_reference/test_mock_openai_responses.md
lanyuanxiaoyao bc1ee612d9 refactor: 实现 ConversionEngine 协议转换引擎,替代旧 protocol 包
- 新增 ConversionEngine 核心引擎,支持 OpenAI 和 Anthropic 协议转换
- 添加 stream decoder/encoder 实现
- 更新 provider client 支持新引擎
- 补充单元测试和集成测试
- 更新 specs 文档
2026-04-20 13:02:28 +08:00

2458 lines
58 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# OpenAI Responses API 端到端测试用例与 Mock 设计
本文档针对 `POST /responses` 接口OpenAI Responses API设计端到端测试用例及对应的 Mock 返回值结构。
---
## 一、测试场景总览
| 分类 | 测试用例 | 优先级 |
|------|----------|--------|
| 基础响应 | 1. 单轮纯文本响应 | P0 |
| 基础响应 | 2. 多轮对话previous_response_id | P0 |
| 基础响应 | 3. instructions 系统指令 | P1 |
| 基础响应 | 4. 含图片输入 | P1 |
| 基础响应 | 5. 含文件输入 | P1 |
| 参数控制 | 6. max_output_tokens 截断 | P1 |
| 参数控制 | 7. temperature + top_p | P1 |
| 参数控制 | 8. text.format 为 json_object | P1 |
| 参数控制 | 9. text.format 为 json_schema | P1 |
| 参数控制 | 10. text.verbosity 控制 | P2 |
| 推理模型 | 11. reasoning.effort 参数 | P1 |
| 推理模型 | 12. reasoning.generate_summary | P2 |
| 工具调用 | 13. function 工具调用 | P0 |
| 工具调用 | 14. 并行工具调用parallel_tool_calls | P1 |
| 工具调用 | 15. tool_choice 为 "required" | P2 |
| 工具调用 | 16. tool_choice 指定具体工具 | P2 |
| 工具调用 | 17. web_search 工具调用 | P1 |
| 工具调用 | 18. file_search 工具调用 | P2 |
| 工具调用 | 19. code_interpreter 工具调用 | P2 |
| 工具调用 | 20. image_generation 工具调用 | P2 |
| 工具调用 | 21. computer_use 工具调用 | P2 |
| 工具调用 | 22. mcp 工具调用 | P2 |
| 工具调用 | 23. custom 工具调用 | P2 |
| 流式响应 | 24. 流式文本响应SSE | P0 |
| 流式响应 | 25. 流式 + stream_options | P1 |
| 流式响应 | 26. 流式工具调用 | P1 |
| 上下文管理 | 27. truncation 为 "auto" | P2 |
| 上下文管理 | 28. context_management 配置 | P2 |
| 缓存 | 29. prompt_cache_key + prompt_cache_retention | P2 |
| 存储 | 30. store + background 模式 | P2 |
| 其他 | 31. metadata 元数据 | P2 |
| 其他 | 32. max_tool_calls 限制 | P2 |
| 其他 | 33. service_tier 选择 | P2 |
| 错误处理 | 34. 无效 model 返回错误 | P1 |
| 错误处理 | 35. 缺少 input 返回错误 | P1 |
| 错误处理 | 36. 内容安全策略拒绝 | P2 |
| Token 计数 | 37. /responses/input_tokens 端点 | P1 |
---
## 二、测试用例详情
### 用例 1单轮纯文本响应
**请求:**
```json
{
"model": "gpt-4o",
"input": "你好,请介绍一下你自己"
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test001",
"object": "response",
"created_at": 1700000001,
"model": "gpt-4o",
"status": "completed",
"output": [
{
"id": "msg_01test001",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "你好!我是由 OpenAI 开发的 AI 助手 GPT-4。我可以帮你回答问题、写作、编程、数学推理、数据分析等多种任务。我的知识截止到 2025 年 1 月。请问有什么我可以帮你的?"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"usage": {
"input_tokens": 12,
"output_tokens": 68,
"total_tokens": 80
},
"metadata": {}
}
```
**验证点:**
- `status` == `"completed"`
- `output[0].type` == `"message"`
- `output[0].content[0].type` == `"output_text"`
- `usage` 字段完整
---
### 用例 2多轮对话previous_response_id
**请求:**
```json
{
"model": "gpt-4o",
"input": "能举个例子吗?",
"previous_response_id": "resp_01test001"
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test002",
"object": "response",
"created_at": 1700000002,
"model": "gpt-4o",
"status": "completed",
"previous_response_id": "resp_01test001",
"output": [
{
"id": "msg_01test002",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "当然。例如定义一个 `Reader` interface\n\n```go\ntype Reader interface {\n Read(p []byte) (n int, err error)\n}\n```\n\n`os.File` 和 `bytes.Buffer` 都实现了 `Read` 方法,所以它们都自动实现了 `Reader` interface。"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"usage": {
"input_tokens": 120,
"output_tokens": 85,
"total_tokens": 205
},
"metadata": {}
}
```
---
### 用例 3instructions 系统指令
**请求:**
```json
{
"model": "gpt-4o",
"input": "什么是递归?",
"instructions": "你是一个专业的编程助手,请用简洁的语言回答问题。"
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test003",
"object": "response",
"created_at": 1700000003,
"model": "gpt-4o",
"status": "completed",
"instructions": "你是一个专业的编程助手,请用简洁的语言回答问题。",
"output": [
{
"id": "msg_01test003",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "递归是一种函数调用自身来解决问题的方法。它包含两个关键部分:\n\n1. **基准情况**:直接返回结果的终止条件\n2. **递归情况**:将问题分解为更小的子问题,调用自身解决\n\n例如计算阶乘`n! = n × (n-1)!`,基准情况是 `0! = 1`。"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"usage": {
"input_tokens": 45,
"output_tokens": 72,
"total_tokens": 117
},
"metadata": {}
}
```
---
### 用例 4含图片输入
**请求:**
```json
{
"model": "gpt-4o",
"input": [
{
"type": "input_text",
"text": "这张图片里有什么?"
},
{
"type": "input_image",
"image_url": "https://example.com/images/cat.jpg",
"detail": "auto"
}
]
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test004",
"object": "response",
"created_at": 1700000004,
"model": "gpt-4o",
"status": "completed",
"output": [
{
"id": "msg_01test004",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "图片中有一只橘色的猫,它正躺在沙发上晒太阳。猫的毛色是橘白相间的,眼睛是绿色的,看起来非常放松。"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"usage": {
"input_tokens": 1280,
"output_tokens": 45,
"total_tokens": 1325
},
"metadata": {}
}
```
---
### 用例 5含文件输入
**请求:**
```json
{
"model": "gpt-4o",
"input": [
{
"type": "input_text",
"text": "请总结这份文档的主要内容"
},
{
"type": "input_file",
"file_id": "file-abc123",
"filename": "report.pdf"
}
]
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test005",
"object": "response",
"created_at": 1700000005,
"model": "gpt-4o",
"status": "completed",
"output": [
{
"id": "msg_01test005",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "这份文档是一份关于机器学习入门的指南,主要内容包括:\n\n1. **机器学习概述**:定义、历史发展、主要应用领域\n2. **监督学习**:分类、回归、常见算法\n3. **无监督学习**:聚类、降维\n4. **深度学习基础**:神经网络结构、反向传播\n5. **实践建议**:数据预处理、模型评估、超参数调优\n\n文档适合初学者阅读提供了清晰的理论框架和实用的学习路径建议。"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"usage": {
"input_tokens": 5200,
"output_tokens": 145,
"total_tokens": 5345
},
"metadata": {}
}
```
---
### 用例 6max_output_tokens 截断
**请求:**
```json
{
"model": "gpt-4o",
"input": "请详细介绍一下人工智能的发展历史",
"max_output_tokens": 30
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test006",
"object": "response",
"created_at": 1700000006,
"model": "gpt-4o",
"status": "completed",
"max_output_tokens": 30,
"output": [
{
"id": "msg_01test006",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "人工智能起源于1950年代图灵提出了机器能否思考的问题。1956年达特茅斯会议正式确立了AI领域。此后经历了多次起伏..."
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"incomplete_details": {
"reason": "max_output_tokens",
"details": null
},
"usage": {
"input_tokens": 20,
"output_tokens": 30,
"total_tokens": 50
},
"metadata": {}
}
```
**验证点:**
- `incomplete_details.reason` == `"max_output_tokens"`
- `output_tokens` == 30等于 max_output_tokens
---
### 用例 7temperature + top_p
**请求:**
```json
{
"model": "gpt-4o",
"input": "写一首关于春天的短诗",
"temperature": 0.9,
"top_p": 0.95
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test007",
"object": "response",
"created_at": 1700000007,
"model": "gpt-4o",
"status": "completed",
"output": [
{
"id": "msg_01test007",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "春风拂面花自开,\n柳絮飞舞满园香。\n燕归巢中呢喃语\n万物复苏迎朝阳。"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 0.9,
"tool_choice": "auto",
"top_p": 0.95,
"usage": {
"input_tokens": 18,
"output_tokens": 32,
"total_tokens": 50
},
"metadata": {}
}
```
---
### 用例 8text.format 为 json_object
**请求:**
```json
{
"model": "gpt-4o",
"input": "提取以下信息的姓名和年龄张三今年25岁是一名工程师",
"text": {
"format": {
"type": "json_object"
}
}
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test008",
"object": "response",
"created_at": 1700000008,
"model": "gpt-4o",
"status": "completed",
"output": [
{
"id": "msg_01test008",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "{\"name\": \"张三\", \"age\": 25, \"occupation\": \"工程师\"}"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"text": {
"format": {
"type": "json_object"
}
},
"usage": {
"input_tokens": 35,
"output_tokens": 25,
"total_tokens": 60
},
"metadata": {}
}
```
**验证点:**
- `content[0].text` 是合法的 JSON 字符串
---
### 用例 9text.format 为 json_schema
**请求:**
```json
{
"model": "gpt-4o",
"input": "创建一个用户信息记录姓名李四年龄30岁",
"text": {
"format": {
"type": "json_schema",
"name": "user_info",
"schema": {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer"},
"email": {"type": "string"}
},
"required": ["name", "age"],
"additionalProperties": false,
"strict": true
}
}
}
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test009",
"object": "response",
"created_at": 1700000009,
"model": "gpt-4o",
"status": "completed",
"output": [
{
"id": "msg_01test009",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "{\"name\": \"李四\", \"age\": 30}"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"text": {
"format": {
"type": "json_schema",
"name": "user_info",
"schema": {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer"},
"email": {"type": "string"}
},
"required": ["name", "age"],
"additionalProperties": false,
"strict": true
}
}
},
"usage": {
"input_tokens": 120,
"output_tokens": 18,
"total_tokens": 138
},
"metadata": {}
}
```
**验证点:**
- 输出严格符合 JSON schema 定义
---
### 用例 10text.verbosity 控制
**请求:**
```json
{
"model": "gpt-4o",
"input": "解释什么是 API",
"text": {
"verbosity": "low"
}
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test010",
"object": "response",
"created_at": 1700000010,
"model": "gpt-4o",
"status": "completed",
"output": [
{
"id": "msg_01test010",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "API应用程序接口是软件系统之间交互的接口定义了不同程序之间通信的规则和方法。"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"text": {
"verbosity": "low"
},
"usage": {
"input_tokens": 15,
"output_tokens": 28,
"total_tokens": 43
},
"metadata": {}
}
```
---
### 用例 11reasoning.effort 参数
**请求:**
```json
{
"model": "o3",
"input": "一个房间里有3个灯泡房间外有3个开关每个开关控制一个灯泡。你只能进房间一次如何确定哪个开关控制哪个灯泡",
"reasoning": {
"effort": "high"
}
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test011",
"object": "response",
"created_at": 1700000011,
"model": "o3",
"status": "completed",
"reasoning": {
"effort": "high",
"summary": "这是一个经典的逻辑推理问题,需要利用灯泡的两种可观察状态(亮/灭)和一种物理属性(温度)来区分三个开关。"
},
"output": [
{
"id": "reason_01test011",
"type": "reasoning",
"content": "我需要找到一种方法,通过一次观察来区分三个开关。关键是灯泡有两种可观察的状态:亮或灭。但如果只用亮灭,我只能区分一个开关(开的那个)。我需要找到另一种可观察的属性...温度!灯泡开着会发热。"
},
{
"id": "msg_01test011",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "解决方案如下:\n\n1. **打开第一个开关**,等待几分钟\n2. **关闭第一个开关****打开第二个开关**\n3. **立即进入房间**\n\n此时观察\n- **亮着的灯** → 由第二个开关控制\n- **摸起来发热的灯** → 由第一个开关控制\n- **既不亮也不热的灯** → 由第三个开关控制"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"usage": {
"input_tokens": 95,
"output_tokens": 280,
"total_tokens": 375,
"output_tokens_details": {
"reasoning_tokens": 180
}
},
"metadata": {}
}
```
**验证点:**
- `reasoning` 配置被正确返回
- `output` 包含 `reasoning` 类型的输出项
- `reasoning_tokens` 在 usage 详情中体现
---
### 用例 12reasoning.generate_summary
**请求:**
```json
{
"model": "o3",
"input": "请帮我分析这个算法问题",
"reasoning": {
"effort": "medium",
"generate_summary": "concise"
}
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test012",
"object": "response",
"created_at": 1700000012,
"model": "o3",
"status": "completed",
"reasoning": {
"effort": "medium",
"generate_summary": "concise",
"summary": "用户没有提供具体的算法问题,需要请用户提供更多细节。"
},
"output": [
{
"id": "reason_01test012",
"type": "reasoning",
"content": "用户提到了一个算法问题,但没有具体说明是什么问题。我需要请用户提供更多细节。"
},
{
"id": "msg_01test012",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "我很乐意帮你分析算法问题!不过你没有具体说明是什么问题。请详细描述一下:\n\n1. 问题的具体要求是什么?\n2. 输入输出的格式是怎样的?\n3. 有没有什么约束条件?"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"usage": {
"input_tokens": 35,
"output_tokens": 95,
"total_tokens": 130,
"output_tokens_details": {
"reasoning_tokens": 45
}
},
"metadata": {}
}
```
---
### 用例 13function 工具调用
**请求:**
```json
{
"model": "gpt-4o",
"input": "北京天气怎么样?",
"tools": [
{
"type": "function",
"name": "get_weather",
"description": "获取指定城市的天气信息",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称"
}
},
"required": ["city"]
},
"strict": true
}
],
"tool_choice": "auto"
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test013",
"object": "response",
"created_at": 1700000013,
"model": "gpt-4o",
"status": "completed",
"output": [
{
"id": "fc_01test013",
"type": "function_call",
"call_id": "call_01test013",
"name": "get_weather",
"arguments": "{\"city\": \"北京\"}",
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"tools": [
{
"type": "function",
"name": "get_weather",
"description": "获取指定城市的天气信息",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"}
},
"required": ["city"]
},
"strict": true
}
],
"usage": {
"input_tokens": 180,
"output_tokens": 42,
"total_tokens": 222
},
"metadata": {}
}
```
**验证点:**
- `output[0].type` == `"function_call"`
- `arguments` 是合法的 JSON 字符串
---
### 用例 14并行工具调用
**请求:**
```json
{
"model": "gpt-4o",
"input": "帮我查一下北京、上海、广州三个城市的天气",
"tools": [
{
"type": "function",
"name": "get_weather",
"description": "获取指定城市的天气信息",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"}
},
"required": ["city"]
}
}
],
"parallel_tool_calls": true
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test014",
"object": "response",
"created_at": 1700000014,
"model": "gpt-4o",
"status": "completed",
"output": [
{
"id": "fc_01test014a",
"type": "function_call",
"call_id": "call_01test014a",
"name": "get_weather",
"arguments": "{\"city\": \"北京\"}",
"status": "completed"
},
{
"id": "fc_01test014b",
"type": "function_call",
"call_id": "call_01test014b",
"name": "get_weather",
"arguments": "{\"city\": \"上海\"}",
"status": "completed"
},
{
"id": "fc_01test014c",
"type": "function_call",
"call_id": "call_01test014c",
"name": "get_weather",
"arguments": "{\"city\": \"广州\"}",
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"tools": [
{
"type": "function",
"name": "get_weather",
"description": "获取指定城市的天气信息",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"}
},
"required": ["city"]
}
}
],
"usage": {
"input_tokens": 200,
"output_tokens": 120,
"total_tokens": 320
},
"metadata": {}
}
```
**验证点:**
- `output` 包含 3 个 `function_call` 类型的项
---
### 用例 15tool_choice 为 "required"
**请求:**
```json
{
"model": "gpt-4o",
"input": "随便聊聊",
"tools": [
{
"type": "function",
"name": "get_weather",
"description": "获取天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"}
}
}
}
],
"tool_choice": "required"
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test015",
"object": "response",
"created_at": 1700000015,
"model": "gpt-4o",
"status": "completed",
"output": [
{
"id": "fc_01test015",
"type": "function_call",
"call_id": "call_01test015",
"name": "get_weather",
"arguments": "{}",
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "required",
"top_p": 1.0,
"tools": [
{
"type": "function",
"name": "get_weather",
"description": "获取天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"}
}
}
}
],
"usage": {
"input_tokens": 150,
"output_tokens": 35,
"total_tokens": 185
},
"metadata": {}
}
```
**验证点:**
- 模型必须调用工具
---
### 用例 16tool_choice 指定具体工具
**请求:**
```json
{
"model": "gpt-4o",
"input": "查天气",
"tools": [
{
"type": "function",
"name": "get_weather",
"description": "获取天气",
"parameters": {"type": "object", "properties": {"city": {"type": "string"}}}
},
{
"type": "function",
"name": "get_news",
"description": "获取新闻",
"parameters": {"type": "object", "properties": {"topic": {"type": "string"}}}
}
],
"tool_choice": {
"type": "function",
"name": "get_weather"
}
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test016",
"object": "response",
"created_at": 1700000016,
"model": "gpt-4o",
"status": "completed",
"output": [
{
"id": "fc_01test016",
"type": "function_call",
"call_id": "call_01test016",
"name": "get_weather",
"arguments": "{}",
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": {
"type": "function",
"name": "get_weather"
},
"top_p": 1.0,
"tools": [
{
"type": "function",
"name": "get_weather",
"description": "获取天气",
"parameters": {"type": "object", "properties": {"city": {"type": "string"}}}
},
{
"type": "function",
"name": "get_news",
"description": "获取新闻",
"parameters": {"type": "object", "properties": {"topic": {"type": "string"}}}
}
],
"usage": {
"input_tokens": 200,
"output_tokens": 35,
"total_tokens": 235
},
"metadata": {}
}
```
**验证点:**
- 强制使用了 `get_weather` 而非 `get_news`
---
### 用例 17web_search 工具调用
**请求:**
```json
{
"model": "gpt-4o",
"input": "今天有什么重要的科技新闻?",
"tools": [
{
"type": "web_search",
"search_context_size": "medium",
"user_location": {
"type": "approximate",
"country": "CN"
}
}
]
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test017",
"object": "response",
"created_at": 1700000017,
"model": "gpt-4o",
"status": "completed",
"output": [
{
"id": "ws_01test017",
"type": "web_search_call",
"status": "completed",
"action": {
"type": "search",
"query": "今天 重要 科技新闻",
"sources": [
{
"url": "https://example.com/tech-news-1",
"title": "OpenAI 发布 GPT-5 更新",
"summary": "新的 GPT-5 版本在多个基准测试中表现优异..."
}
]
}
},
{
"id": "msg_01test017",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "根据最新的搜索结果,今天有以下重要科技新闻:\n\n1. **AI 领域**OpenAI 发布了 GPT-5 的更新版本,在代码生成和数学推理能力上有显著提升...\n\n2. **智能手机**Apple 宣布了新一代 iPhone 的发布日期...\n\n3. **电动汽车**Tesla 公布了最新的自动驾驶技术进展..."
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"tools": [
{
"type": "web_search",
"search_context_size": "medium",
"user_location": {
"type": "approximate",
"country": "CN"
}
}
],
"usage": {
"input_tokens": 180,
"output_tokens": 150,
"total_tokens": 330
},
"metadata": {}
}
```
---
### 用例 18file_search 工具调用
**请求:**
```json
{
"model": "gpt-4o",
"input": "在我的文档中搜索关于机器学习的内容",
"tools": [
{
"type": "file_search",
"vector_store_ids": ["vs_abc123"],
"max_num_results": 10,
"ranking_options": {
"ranker": "auto",
"score_threshold": 0.5
}
}
]
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test018",
"object": "response",
"created_at": 1700000018,
"model": "gpt-4o",
"status": "completed",
"output": [
{
"id": "fs_01test018",
"type": "file_search_call",
"status": "completed",
"queries": ["机器学习"],
"results": [
{
"file_id": "file-xyz789",
"filename": "ml_intro.pdf",
"score": 0.92,
"attributes": {},
"text": "机器学习是人工智能的一个分支,它使计算机能够从数据中学习..."
}
]
},
{
"id": "msg_01test018",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "我在你的文档中找到了关于机器学习的内容:\n\n**机器学习**是人工智能的一个分支,它使计算机能够从数据中学习模式和规律,而无需显式编程。主要类型包括监督学习、无监督学习和强化学习。"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"tools": [
{
"type": "file_search",
"vector_store_ids": ["vs_abc123"],
"max_num_results": 10,
"ranking_options": {
"ranker": "auto",
"score_threshold": 0.5
}
}
],
"usage": {
"input_tokens": 250,
"output_tokens": 85,
"total_tokens": 335
},
"metadata": {}
}
```
---
### 用例 19code_interpreter 工具调用
**请求:**
```json
{
"model": "gpt-4o",
"input": "帮我计算斐波那契数列的前10项",
"tools": [
{
"type": "code_interpreter",
"container": "auto"
}
]
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test019",
"object": "response",
"created_at": 1700000019,
"model": "gpt-4o",
"status": "completed",
"output": [
{
"id": "ci_01test019",
"type": "code_interpreter_call",
"status": "completed",
"code": "fib = [0, 1]\nfor i in range(2, 10):\n fib.append(fib[i-1] + fib[i-2])\nprint(fib)",
"container_id": "container_abc123",
"outputs": [
{
"type": "logs",
"logs": "[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]"
}
]
},
{
"id": "msg_01test019",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "斐波那契数列的前10项是\n\n**0, 1, 1, 2, 3, 5, 8, 13, 21, 34**\n\n这个数列的规律是每一项等于前两项之和。"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"tools": [
{
"type": "code_interpreter",
"container": "auto"
}
],
"usage": {
"input_tokens": 120,
"output_tokens": 95,
"total_tokens": 215
},
"metadata": {}
}
```
---
### 用例 20image_generation 工具调用
**请求:**
```json
{
"model": "gpt-4o",
"input": "生成一张日出的图片",
"tools": [
{
"type": "image_generation",
"action": "generate",
"size": "1024x1024",
"quality": "high",
"output_format": "png"
}
]
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test020",
"object": "response",
"created_at": 1700000020,
"model": "gpt-4o",
"status": "completed",
"output": [
{
"id": "ig_01test020",
"type": "image_generation_call",
"status": "completed",
"result": {
"type": "image",
"image": {
"file_id": "file-img001",
"url": "https://example.com/generated/sunrise.png"
}
}
},
{
"id": "msg_01test020",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "我已经为你生成了一张日出的图片!画面中金色的阳光洒满天际,云彩被染成了橙红色,远处的山峦在晨光中若隐若现。"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"tools": [
{
"type": "image_generation",
"action": "generate",
"size": "1024x1024",
"quality": "high",
"output_format": "png"
}
],
"usage": {
"input_tokens": 85,
"output_tokens": 75,
"total_tokens": 160
},
"metadata": {}
}
```
---
### 用例 21computer_use 工具调用
**请求:**
```json
{
"model": "gpt-4o",
"input": "帮我打开浏览器访问 Google",
"tools": [
{
"type": "computer_use_preview",
"environment": "browser",
"display_width": 1024,
"display_height": 768
}
]
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test021",
"object": "response",
"created_at": 1700000021,
"model": "gpt-4o",
"status": "completed",
"output": [
{
"id": "cc_01test021",
"type": "computer_call",
"status": "in_progress",
"call_id": "call_01test021",
"pending_safety_checks": [],
"action": {
"type": "click",
"x": 400,
"y": 50,
"button": "left"
}
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"tools": [
{
"type": "computer_use_preview",
"environment": "browser",
"display_width": 1024,
"display_height": 768
}
],
"usage": {
"input_tokens": 150,
"output_tokens": 55,
"total_tokens": 205
},
"metadata": {}
}
```
---
### 用例 22mcp 工具调用
**请求:**
```json
{
"model": "gpt-4o",
"input": "查看我的日历安排",
"tools": [
{
"type": "mcp",
"server_label": "google_calendar",
"connector_id": "conn_calendar_001",
"allowed_tools": ["list_events", "create_event"]
}
]
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test022",
"object": "response",
"created_at": 1700000022,
"model": "gpt-4o",
"status": "completed",
"output": [
{
"id": "mcp_list_022",
"type": "mcp_list_tools",
"status": "completed",
"tools": [
{
"name": "list_events",
"description": "列出指定时间范围内的日历事件"
},
{
"name": "create_event",
"description": "创建新的日历事件"
}
]
},
{
"id": "mcp_call_022",
"type": "mcp_call",
"status": "completed",
"call_id": "call_mcp_022",
"name": "list_events",
"arguments": "{\"date\": \"today\"}",
"result": {
"content": [
{
"type": "text",
"text": "今天你有3个日程安排\n1. 10:00 - 团队站会\n2. 14:00 - 产品评审会议\n3. 16:00 - 1:1 与经理"
}
]
}
},
{
"id": "msg_01test022",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "你今天有以下日程安排:\n\n1. **10:00** - 团队站会\n2. **14:00** - 产品评审会议\n3. **16:00** - 1:1 与经理"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"tools": [
{
"type": "mcp",
"server_label": "google_calendar",
"connector_id": "conn_calendar_001",
"allowed_tools": ["list_events", "create_event"]
}
],
"usage": {
"input_tokens": 200,
"output_tokens": 120,
"total_tokens": 320
},
"metadata": {}
}
```
---
### 用例 23custom 工具调用
**请求:**
```json
{
"model": "gpt-4o",
"input": "执行自定义操作",
"tools": [
{
"type": "custom",
"name": "my_custom_tool",
"description": "一个自定义工具",
"format": {
"type": "text"
}
}
]
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test023",
"object": "response",
"created_at": 1700000023,
"model": "gpt-4o",
"status": "completed",
"output": [
{
"id": "ct_01test023",
"type": "custom_tool_call",
"status": "completed",
"call_id": "call_custom_023",
"name": "my_custom_tool",
"input": "{\"action\": \"test\"}"
},
{
"id": "msg_01test023",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "自定义操作已成功执行。"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"tools": [
{
"type": "custom",
"name": "my_custom_tool",
"description": "一个自定义工具",
"format": {
"type": "text"
}
}
],
"usage": {
"input_tokens": 80,
"output_tokens": 45,
"total_tokens": 125
},
"metadata": {}
}
```
---
### 用例 24流式文本响应SSE
**请求:**
```json
{
"model": "gpt-4o",
"input": "你好",
"stream": true
}
```
**期望 Mock 响应200 OK, Content-Type: text/event-stream**
```
event: response.created
data: {"id":"resp_01stream001","object":"response","created_at":1700000024,"model":"gpt-4o","status":"in_progress","output":[],"parallel_tool_calls":true,"temperature":1.0,"tool_choice":"auto","top_p":1.0,"metadata":{}}
event: response.in_progress
data: {"id":"resp_01stream001","object":"response","created_at":1700000024,"model":"gpt-4o","status":"in_progress"}
event: response.output_item.added
data: {"id":"resp_01stream001","object":"response","item":{"id":"msg_01stream001","type":"message","role":"assistant","content":[]}}
event: response.content_part.added
data: {"id":"resp_01stream001","object":"response","part":{"type":"output_text","text":""},"item_id":"msg_01stream001","output_index":0,"content_index":0}
event: response.output_text.delta
data: {"id":"resp_01stream001","object":"response","delta":"你","item_id":"msg_01stream001","output_index":0,"content_index":0}
event: response.output_text.delta
data: {"id":"resp_01stream001","object":"response","delta":"好","item_id":"msg_01stream001","output_index":0,"content_index":0}
event: response.output_text.delta
data: {"id":"resp_01stream001","object":"response","delta":"","item_id":"msg_01stream001","output_index":0,"content_index":0}
event: response.output_text.delta
data: {"id":"resp_01stream001","object":"response","delta":"我","item_id":"msg_01stream001","output_index":0,"content_index":0}
event: response.output_text.delta
data: {"id":"resp_01stream001","object":"response","delta":"是","item_id":"msg_01stream001","output_index":0,"content_index":0}
event: response.output_text.delta
data: {"id":"resp_01stream001","object":"response","delta":"AI","item_id":"msg_01stream001","output_index":0,"content_index":0}
event: response.output_text.delta
data: {"id":"resp_01stream001","object":"response","delta":"助手","item_id":"msg_01stream001","output_index":0,"content_index":0}
event: response.output_text.delta
data: {"id":"resp_01stream001","object":"response","delta":"","item_id":"msg_01stream001","output_index":0,"content_index":0}
event: response.output_text.delta
data: {"id":"resp_01stream001","object":"response","delta":"很高兴","item_id":"msg_01stream001","output_index":0,"content_index":0}
event: response.output_text.delta
data: {"id":"resp_01stream001","object":"response","delta":"为你","item_id":"msg_01stream001","output_index":0,"content_index":0}
event: response.output_text.delta
data: {"id":"resp_01stream001","object":"response","delta":"服务","item_id":"msg_01stream001","output_index":0,"content_index":0}
event: response.output_text.delta
data: {"id":"resp_01stream001","object":"response","delta":"。","item_id":"msg_01stream001","output_index":0,"content_index":0}
event: response.content_part.done
data: {"id":"resp_01stream001","object":"response","part":{"type":"output_text","text":"你好我是AI助手很高兴为你服务。"},"item_id":"msg_01stream001","output_index":0,"content_index":0}
event: response.output_item.done
data: {"id":"resp_01stream001","object":"response","item":{"id":"msg_01stream001","type":"message","role":"assistant","content":[{"type":"output_text","text":"你好我是AI助手很高兴为你服务。"}],"status":"completed"}}
event: response.completed
data: {"id":"resp_01stream001","object":"response","created_at":1700000024,"model":"gpt-4o","status":"completed","output":[{"id":"msg_01stream001","type":"message","role":"assistant","content":[{"type":"output_text","text":"你好我是AI助手很高兴为你服务。"}],"status":"completed"}],"parallel_tool_calls":true,"temperature":1.0,"tool_choice":"auto","top_p":1.0,"usage":{"input_tokens":10,"output_tokens":18,"total_tokens":28},"metadata":{}}
```
**验证点:**
- 事件顺序response.created → response.in_progress → response.output_item.added → response.content_part.added → response.output_text.delta* → response.content_part.done → response.output_item.done → response.completed
- `response.created` 包含初始 response 对象
- `response.output_text.delta` 包含增量文本
- `response.completed` 包含完整的 response 对象和 usage
---
### 用例 25流式 + stream_options
**请求:**
```json
{
"model": "gpt-4o",
"input": "你好",
"stream": true,
"stream_options": {
"include_obfuscation": true
}
}
```
**期望 Mock 响应200 OK, Content-Type: text/event-stream**
与用例 24 类似,但部分 event 数据中包含随机填充字符以混淆 payload 大小:
```
event: response.created
data: {"id":"resp_01stream002","object":"response","created_at":1700000025,"model":"gpt-4o","status":"in_progress","output":[],"parallel_tool_calls":true,"temperature":1.0,"tool_choice":"auto","top_p":1.0,"metadata":{}}
... (正常 events) ...
event: response.output_text.delta
data: {"id":"resp_01stream002","object":"response","delta":"你","item_id":"msg_01stream002","output_index":0,"content_index":0,"_obfuscation":"xxxxxxxxxxxxxxxxxxxx"}
... (更多 events 带有 _obfuscation 字段) ...
event: response.completed
data: {"id":"resp_01stream002","object":"response","created_at":1700000025,"model":"gpt-4o","status":"completed","output":[...],"usage":{"input_tokens":10,"output_tokens":18,"total_tokens":28},"metadata":{}}
```
**验证点:**
- 部分 event 包含 `_obfuscation` 字段
- 不影响正常数据解析
---
### 用例 26流式工具调用
**请求:**
```json
{
"model": "gpt-4o",
"input": "北京天气怎么样?",
"tools": [
{
"type": "function",
"name": "get_weather",
"description": "获取天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"}
},
"required": ["city"]
}
}
],
"stream": true
}
```
**期望 Mock 响应200 OK, Content-Type: text/event-stream**
```
event: response.created
data: {"id":"resp_01stream003","object":"response","created_at":1700000026,"model":"gpt-4o","status":"in_progress","output":[],"parallel_tool_calls":true,"temperature":1.0,"tool_choice":"auto","top_p":1.0,"tools":[{"type":"function","name":"get_weather","description":"获取天气","parameters":{"type":"object","properties":{"city":{"type":"string"}},"required":["city"]}}],"metadata":{}}
event: response.in_progress
data: {"id":"resp_01stream003","object":"response","created_at":1700000026,"model":"gpt-4o","status":"in_progress"}
event: response.output_item.added
data: {"id":"resp_01stream003","object":"response","item":{"id":"fc_01stream003","type":"function_call","call_id":"call_01stream003","name":"get_weather","arguments":""}}
event: response.function_call_arguments.delta
data: {"id":"resp_01stream003","object":"response","delta":"{\"","item_id":"fc_01stream003","output_index":0}
event: response.function_call_arguments.delta
data: {"id":"resp_01stream003","object":"response","delta":"city","item_id":"fc_01stream003","output_index":0}
event: response.function_call_arguments.delta
data: {"id":"resp_01stream003","object":"response","delta":"\":\"","item_id":"fc_01stream003","output_index":0}
event: response.function_call_arguments.delta
data: {"id":"resp_01stream003","object":"response","delta":"北京","item_id":"fc_01stream003","output_index":0}
event: response.function_call_arguments.delta
data: {"id":"resp_01stream003","object":"response","delta":"\"}","item_id":"fc_01stream003","output_index":0}
event: response.output_item.done
data: {"id":"resp_01stream003","object":"response","item":{"id":"fc_01stream003","type":"function_call","call_id":"call_01stream003","name":"get_weather","arguments":"{\"city\": \"北京\"}","status":"completed"}}
event: response.completed
data: {"id":"resp_01stream003","object":"response","created_at":1700000026,"model":"gpt-4o","status":"completed","output":[{"id":"fc_01stream003","type":"function_call","call_id":"call_01stream003","name":"get_weather","arguments":"{\"city\": \"北京\"}","status":"completed"}],"parallel_tool_calls":true,"temperature":1.0,"tool_choice":"auto","top_p":1.0,"usage":{"input_tokens":180,"output_tokens":42,"total_tokens":222},"metadata":{}}
```
**验证点:**
- `response.function_call_arguments.delta` 逐步拼接完整的 JSON 参数
- 最终 `response.completed` 包含完整的 function_call
---
### 用例 27truncation 为 "auto"
**请求:**
```json
{
"model": "gpt-4o",
"input": "你好",
"truncation": "auto"
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test027",
"object": "response",
"created_at": 1700000027,
"model": "gpt-4o",
"status": "completed",
"truncation": "auto",
"output": [
{
"id": "msg_01test027",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "你好!我是由 OpenAI 开发的 AI 助手。请问有什么我可以帮你的?"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"usage": {
"input_tokens": 10,
"output_tokens": 22,
"total_tokens": 32
},
"metadata": {}
}
```
**验证点:**
- 当输入超过上下文窗口时,自动从开头截断
---
### 用例 28context_management 配置
**请求:**
```json
{
"model": "gpt-4o",
"input": "你好",
"context_management": {
"compaction": {
"enabled": true,
"trigger_tokens": 100000
}
}
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test028",
"object": "response",
"created_at": 1700000028,
"model": "gpt-4o",
"status": "completed",
"context_management": {
"compaction": {
"enabled": true,
"trigger_tokens": 100000
}
},
"output": [
{
"id": "msg_01test028",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "你好!我是由 OpenAI 开发的 AI 助手。请问有什么我可以帮你的?"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"usage": {
"input_tokens": 10,
"output_tokens": 22,
"total_tokens": 32
},
"metadata": {}
}
```
---
### 用例 29prompt_cache_key + prompt_cache_retention
**请求:**
```json
{
"model": "gpt-4o",
"input": "你好",
"instructions": "你是一个专业的编程助手。",
"prompt_cache_key": "programming_assistant_v1",
"prompt_cache_retention": "24h"
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test029",
"object": "response",
"created_at": 1700000029,
"model": "gpt-4o",
"status": "completed",
"prompt_cache_key": "programming_assistant_v1",
"prompt_cache_retention": "24h",
"output": [
{
"id": "msg_01test029",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "你好!我是你的专业编程助手,擅长解答各种编程问题、代码审查、架构设计等。请问有什么我可以帮助你的?"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"usage": {
"input_tokens": 25,
"output_tokens": 35,
"total_tokens": 60,
"input_tokens_details": {
"cached_tokens": 15
}
},
"metadata": {}
}
```
**验证点:**
- `input_tokens_details.cached_tokens` 反映缓存命中的 token 数
---
### 用例 30store + background 模式
**请求:**
```json
{
"model": "gpt-4o",
"input": "请分析这份数据",
"store": true,
"background": true
}
```
**期望 Mock 响应202 Accepted**
```json
{
"id": "resp_01test030",
"object": "response",
"created_at": 1700000030,
"model": "gpt-4o",
"status": "queued",
"background": true,
"store": true,
"output": [],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"metadata": {}
}
```
**验证点:**
- `status` == `"queued"`
- `background` == `true`
- `store` == `true`
---
### 用例 31metadata 元数据
**请求:**
```json
{
"model": "gpt-4o",
"input": "你好",
"metadata": {
"user_id": "user_12345",
"session_id": "session_abc",
"request_source": "web_app"
}
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test031",
"object": "response",
"created_at": 1700000031,
"model": "gpt-4o",
"status": "completed",
"metadata": {
"user_id": "user_12345",
"session_id": "session_abc",
"request_source": "web_app"
},
"output": [
{
"id": "msg_01test031",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "你好!我是由 OpenAI 开发的 AI 助手。请问有什么我可以帮你的?"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"usage": {
"input_tokens": 10,
"output_tokens": 22,
"total_tokens": 32
}
}
```
---
### 用例 32max_tool_calls 限制
**请求:**
```json
{
"model": "gpt-4o",
"input": "帮我查北京、上海、广州、深圳四个城市的天气",
"tools": [
{
"type": "function",
"name": "get_weather",
"description": "获取天气",
"parameters": {"type": "object", "properties": {"city": {"type": "string"}}}
}
],
"max_tool_calls": 2
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test032",
"object": "response",
"created_at": 1700000032,
"model": "gpt-4o",
"status": "incomplete",
"max_tool_calls": 2,
"output": [
{
"id": "fc_01test032a",
"type": "function_call",
"call_id": "call_01test032a",
"name": "get_weather",
"arguments": "{\"city\": \"北京\"}",
"status": "completed"
},
{
"id": "fc_01test032b",
"type": "function_call",
"call_id": "call_01test032b",
"name": "get_weather",
"arguments": "{\"city\": \"上海\"}",
"status": "completed"
}
],
"incomplete_details": {
"reason": "max_tool_calls",
"details": null
},
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"tools": [
{
"type": "function",
"name": "get_weather",
"description": "获取天气",
"parameters": {"type": "object", "properties": {"city": {"type": "string"}}}
}
],
"usage": {
"input_tokens": 200,
"output_tokens": 80,
"total_tokens": 280
},
"metadata": {}
}
```
**验证点:**
- `status` == `"incomplete"`
- `incomplete_details.reason` == `"max_tool_calls"`
- 只调用了 2 个工具(受 max_tool_calls 限制)
---
### 用例 33service_tier 选择
**请求:**
```json
{
"model": "gpt-4o",
"input": "你好",
"service_tier": "flex"
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test033",
"object": "response",
"created_at": 1700000033,
"model": "gpt-4o",
"status": "completed",
"service_tier": "flex",
"output": [
{
"id": "msg_01test033",
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "你好!我是由 OpenAI 开发的 AI 助手。请问有什么我可以帮你的?"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"usage": {
"input_tokens": 10,
"output_tokens": 22,
"total_tokens": 32
},
"metadata": {}
}
```
---
### 用例 34无效 model 返回错误
**请求:**
```json
{
"model": "nonexistent-model-xyz",
"input": "你好"
}
```
**期望 Mock 响应400 Bad Request**
```json
{
"error": {
"code": "invalid_model",
"message": "The model 'nonexistent-model-xyz' does not exist or you do not have access to it."
}
}
```
---
### 用例 35缺少 input 返回错误
**请求:**
```json
{
"model": "gpt-4o"
}
```
**期望 Mock 响应400 Bad Request**
```json
{
"error": {
"code": "missing_input",
"message": "The 'input' parameter is required. Please provide text, image, or file input."
}
}
```
---
### 用例 36内容安全策略拒绝
**请求:**
```json
{
"model": "gpt-4o",
"input": "生成违法内容..."
}
```
**期望 Mock 响应200 OK**
```json
{
"id": "resp_01test036",
"object": "response",
"created_at": 1700000036,
"model": "gpt-4o",
"status": "completed",
"output": [
{
"id": "msg_01test036",
"type": "message",
"role": "assistant",
"content": [
{
"type": "refusal",
"refusal": "抱歉,我无法生成此类内容。我的设计原则是提供有益、安全和负责任的帮助。如果你有其他问题或需要帮助的地方,我很乐意为你服务。"
}
],
"status": "completed"
}
],
"parallel_tool_calls": true,
"temperature": 1.0,
"tool_choice": "auto",
"top_p": 1.0,
"usage": {
"input_tokens": 15,
"output_tokens": 42,
"total_tokens": 57
},
"metadata": {}
}
```
**验证点:**
- `content[0].type` == `"refusal"`
---
### 用例 37/responses/input_tokens 端点
**请求:**
```json
{
"model": "gpt-4o",
"input": "你好,请介绍一下你自己"
}
```
**期望 Mock 响应200 OK**
```json
{
"object": "response.input_tokens",
"input_tokens": 12
}
```
**验证点:**
- `object` == `"response.input_tokens"`
- `input_tokens` 返回正确的 token 数量
- 不生成实际响应内容
---
## 三、Mock 响应通用结构规范
### 非流式响应通用结构
```json
{
"id": "resp_<unique_id>",
"object": "response",
"created_at": <unix_timestamp>,
"model": "<model_name>",
"status": "completed" | "failed" | "in_progress" | "cancelled" | "queued" | "incomplete",
"output": [
{
"id": "<item_id>",
"type": "message" | "function_call" | "function_call_output" | "web_search_call" | "file_search_call" | "code_interpreter_call" | "image_generation_call" | "computer_call" | "computer_call_output" | "reasoning" | "compaction" | "mcp_list_tools" | "mcp_call" | "mcp_approval_request" | "mcp_approval_response" | "custom_tool_call" | "custom_tool_call_output" | "tool_search_call" | "tool_search_output" | "shell_call" | "shell_call_output" | "local_shell_call" | "local_shell_call_output" | "apply_patch_call" | "apply_patch_call_output" | "item_reference",
"role": "assistant" | "user",
"content": [
{
"type": "output_text" | "refusal",
"text": "<text>" | null,
"refusal": "<refusal_text>" | null,
"annotations": []
}
],
"status": "completed" | "in_progress" | "incomplete",
"call_id": "<call_id>" | null,
"name": "<tool_name>" | null,
"arguments": "<json_string>" | null,
"code": "<code_string>" | null,
"container_id": "<container_id>" | null,
"outputs": [] | null,
"result": {} | null,
"action": {} | null,
"pending_safety_checks": [],
"content_text": "<thinking_content>" | null
}
],
"parallel_tool_calls": true | false,
"temperature": <number>,
"tool_choice": "auto" | "none" | "required" | {},
"tools": [],
"top_p": <number>,
"usage": {
"input_tokens": <int>,
"output_tokens": <int>,
"total_tokens": <int>,
"input_tokens_details": {
"cached_tokens": <int> | null
},
"output_tokens_details": {
"reasoning_tokens": <int> | null
}
},
"metadata": {},
"instructions": "<system_instructions>" | null,
"max_output_tokens": <int> | null,
"max_tool_calls": <int> | null,
"previous_response_id": "<response_id>" | null,
"reasoning": {"effort": "<effort>", "summary": "<summary>"} | null,
"text": {"format": {}, "verbosity": "low" | "medium" | "high"} | null,
"truncation": "auto" | "disabled" | null,
"incomplete_details": {"reason": "max_output_tokens" | "max_tool_calls" | "content_filter", "details": null} | null,
"service_tier": "auto" | "default" | "flex" | "scale" | "priority" | null,
"prompt_cache_key": "<key>" | null,
"prompt_cache_retention": "in-memory" | "24h" | null,
"store": true | false | null,
"background": true | false | null,
"completed_at": <unix_timestamp> | null,
"error": {"code": "<error_code>", "message": "<error_message>"} | null
}
```
### 流式 Event 类型
| Event Type | Key Fields |
|------------|-----------|
| `response.created` | 完整的 response 对象(空 output |
| `response.in_progress` | response 对象status = "in_progress" |
| `response.output_item.added` | 新增 output item |
| `response.content_part.added` | 新增 content part |
| `response.output_text.delta` | 文本增量 |
| `response.output_text.done` | 文本完成 |
| `response.function_call_arguments.delta` | 函数参数增量 |
| `response.content_part.done` | content part 完成 |
| `response.output_item.done` | output item 完成 |
| `response.completed` | 完整的 response 对象(含 usage |
### 错误响应通用结构
```json
{
"error": {
"code": "invalid_model" | "missing_input" | "server_error" | "rate_limit_exceeded" | "invalid_prompt" | "invalid_image" | "vector_store_timeout" | "content_filter_violation",
"message": "<human_readable_message>"
}
}
```
### 请求必需参数
| 参数 | 类型 | 说明 |
|------|------|------|
| `model` | string | 模型标识符(如 `gpt-4o``o3` |
| `input` | string/array | 文本、图片或文件输入 |
### 请求可选参数
| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `instructions` | string | - | 系统/开发者消息 |
| `max_output_tokens` | number | - | 最大生成 token 数 |
| `max_tool_calls` | number | - | 最大工具调用次数 |
| `temperature` | number | 1.0 | 采样温度0-2 |
| `top_p` | number | 1.0 | 核采样阈值 |
| `tools` | array | - | 工具定义数组 |
| `tool_choice` | string/object | auto | 工具选择策略 |
| `parallel_tool_calls` | boolean | true | 允许并行工具调用 |
| `reasoning` | object | - | 推理配置effort, summary |
| `text` | object | - | 文本配置format, verbosity |
| `stream` | boolean | false | 是否流式 |
| `previous_response_id` | string | - | 上一轮响应 ID |
| `store` | boolean | false | 存储响应 |
| `background` | boolean | false | 后台执行 |
| `metadata` | object | - | 元数据(最多 16 个键值对) |
| `truncation` | string | - | 截断策略auto/disabled |
| `prompt_cache_key` | string | - | 提示词缓存键 |
| `prompt_cache_retention` | string | - | 缓存保留策略 |
| `service_tier` | string | - | 服务层级 |
### Status 枚举
| 值 | 含义 |
|----|------|
| `completed` | 响应已完成 |
| `in_progress` | 响应生成中 |
| `failed` | 响应生成失败 |
| `incomplete` | 响应不完整(达到限制) |
| `cancelled` | 响应已取消 |
| `queued` | 响应已入队(后台模式) |