1. 文本模型上的差异
- 系统提示词 (System Prompt)
这是最常见的改动点:OpenAI 将其放入数组,Anthropic 将其提取到顶层。
OpenAI:
{
"model": "gpt-4o",
"messages": [
{"role": "system", "content": "你是一个翻译官"},
{"role": "user", "content": "你好"}
]
}
Anthropic:
{
"model": "claude-3-7-sonnet-20250219",
"system": "你是一个翻译官", // 独立参数,不在 messages 数组里
"messages": [
{"role": "user", "content": "你好"}
]
}
- 连续消息 (Consecutive Roles)
OpenAI 允许连续两个 User 消息,Anthropic 会直接报错。
OpenAI (合法):
"messages": [
{"role": "user", "content": "第一部分指令"},
{"role": "user", "content": "第二部分指令"}
]
Anthropic
Anthropic 要求合并,或者中间插入 Assistant。
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "第一部分指令"},
{"type": "text", "text": "第二部分指令"}
]
}
]
- 工具调用 (Tool Use / Function Calling)
OpenAI 使用专有的 tool_calls 字段,Anthropic 则把工具调用视为一种“内容块”。
OpenAI:
// Assistant 发起调用
"message": {
"role": "assistant",
"tool_calls": [{ "id": "123", "type": "function", "function": {"name": "get_weather", "arguments": "..."}}]
}
// User 返回结果
{ "role": "tool", "tool_call_id": "123", "content": "25度" }
Anthropic:
// Assistant 发起调用
"content": [
{ "type": "text", "text": "查一下天气" },
{ "type": "tool_use", "id": "123", "name": "get_weather", "input": {...} }
]
// User 返回结果
"role": "user",
"content": [
{ "type": "tool_result", "tool_use_id": "123", "content": "25度" }
]
- 思考过程 (Reasoning / Thinking)
Claude 3.7 推出的新特性,支持显式的思考字段。
Anthropic:
"content": [
{ "type": "thinking", "thinking": "我需要先分析这个逻辑...", "signature": "..." },
{ "type": "text", "text": "最终答案是..." }
]
注:OpenAI 的 o1/o3 系列模型虽然有思考过程,但通常不在 Chat API 的 message 数组里以结构化 Block 形式返回,而是隐藏或放入 reasoning_content。
2. 多模态的更多差异
- 多模态图像上传 (Base64)
主要区别在于 OpenAI 使用特定的image_url对象,而 Anthropic 将图像视为与文本位于同一数组中的内容块类型。
OpenAI 格式:
{
"role": "user",
"content": [
{ "type": "text", "text": "What is in this image?" },
{
"type": "image_url",
"image_url": {
"url": "data:image/jpeg;base64,/9j/4AAQSkZJRg...",
"detail": "high" // Optional: low, high, auto
}
}
]
}
Anthropic 格式:
{
"role": "user",
"content": [
{ "type": "text", "text": "What is in this image?" },
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": "/9j/4AAQSkZJRg..." // Raw base64 only, no data URI prefix
}
}
]
}
- 关键区别: OpenAI 需要在url前半部分增加图片类型 data:image/jpeg;base64; Anthropic 只需要图像base64字符串和一个独立属性 media_type 来单独标识图片类型.
- 流式输出(Server-Sent Events)
OpenAI 的数据流是“增量中心”的(发送小段文本),而 Anthropic 的数据流是“事件中心”的(在代码块开始、进行和结束时通知您)
OpenAI Stream Chunk: OpenAI 重复发送chat.completion.chunk 对象.
json
data: {"id":"gen-123","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"Hello"},"finish_reason":null}]}
data: {"id":"gen-123","choices":[{"index":0,"delta":{"content":" there"},"finish_reason":null}]}
data: [DONE]
Anthropic Stream Events: Anthropic 使用更复杂的状态机,具有不同的事件类型。
- message_start: 初始元数据.
- content_block_start: 告诉你即将开始的是哪种类型的内容(text/thinking)。.
- content_block_delta: 实际文本增量.
- message_delta: 最终使用统计数据和停止原因.
json
event: message_start
data: {"type": "message_start", "message": {"id": "msg_123", "role": "assistant", ...}}
event: content_block_start
data: {"type": "content_block_start", "index": 0, "content_block": {"type": "text", "text": ""}}
event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "text_delta", "text": "Hello"}}
event: message_stop
data: {"type": "message_stop"}
总结表
| Features | OpenAI | Anthropic |
|---|---|---|
| Image Input | image_url (includes data URI) | image (raw base64 + media_type) |
| Stream Type | Flat list of deltas | Categorized events (Start → Delta → Stop) |
| Usage Info | Sent in every chunk or final chunk | Sent in message_start and message_delta |