API Protocol Comparison Report
OpenAI Classic (Chat Completions) vs OpenAI Responses vs Anthropic Messages
1. Overview
| Aspect |
OpenAI Classic |
OpenAI Responses |
Anthropic Messages |
| Endpoint |
/v1/chat/completions |
/v1/responses |
/v1/messages |
| Message Unit |
messages[] (Message objects) |
input (string or Item[]) |
messages[] (Message objects) |
| System Prompt |
Via role: "system" or role: "developer" |
Via instructions parameter |
Via system parameter |
| Tool Format |
tools[].function.{name,description,parameters} |
tools[].{name,description,parameters} |
tools[].{name,description,input_schema} |
| Response Format |
choices[].message |
output[] (Item array) |
content[] (ContentBlock array) |
| Streaming |
SSE with data: {...} + [DONE] |
SSE with event types |
SSE with event types |
2. Request Fields Comparison
2.1 Core Parameters
| Parameter |
OpenAI Classic |
OpenAI Responses |
Anthropic Messages |
| Model |
model (required) |
model (required) |
model (required) |
| Messages/Input |
messages (required) |
input (required) |
messages (required) |
| System Prompt |
In messages with role: "system" |
instructions |
system (string or blocks) |
| Max Tokens |
max_tokens or max_completion_tokens |
max_output_tokens |
max_tokens (required) |
| Temperature |
temperature (0-2, default 1) |
temperature (0-2, default 1) |
temperature (0-1, default 1) |
| Top P |
top_p (default 1) |
top_p (default 1) |
top_p |
| Top K |
Not supported |
Not supported |
top_k |
| Stop Sequences |
stop (string or array, max 4) |
stop (array, max 4) |
stop_sequences (array) |
| Stream |
stream (boolean) |
stream (boolean) |
stream (boolean) |
| Seed |
seed (integer) |
seed (integer) |
Not supported |
| User ID |
user (string) |
user (string) |
metadata.user_id |
| Logprobs |
logprobs, top_logprobs |
Not directly supported |
Not supported |
| N (multiple choices) |
n (default 1) |
Not supported |
Not supported |
| Presence Penalty |
presence_penalty (-2 to 2) |
Not supported |
Not supported |
| Frequency Penalty |
frequency_penalty (-2 to 2) |
Not supported |
Not supported |
2.2 Tool/Function Calling
| Aspect |
OpenAI Classic |
OpenAI Responses |
Anthropic Messages |
| Tool Declaration |
tools[] |
tools[] |
tools[] |
| Tool Type |
type: "function" |
type: "function" |
Implicit function |
| Name Location |
function.name |
name |
name |
| Description Location |
function.description |
description |
description |
| Schema Location |
function.parameters |
parameters |
input_schema |
| Strict Mode |
function.strict |
strict |
Not supported |
| Tool Choice |
tool_choice |
tool_choice |
tool_choice |
| Auto Choice |
"auto" |
{"type": "auto"} |
{"type": "auto"} |
| None Choice |
"none" |
{"type": "none"} |
{"type": "none"} |
| Required Choice |
"required" |
Not available |
{"type": "any"} |
| Specific Tool |
{"type": "function", "function": {"name": "..."}} |
{"type": "function", "name": "..."} |
{"type": "tool", "name": "..."} |
| Parallel Tool Calls |
parallel_tool_calls (boolean) |
Implicit |
tool_choice.disable_parallel_tool_use |
Tool Declaration Format Examples
OpenAI Classic:
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get current weather",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string"}
},
"required": ["location"]
},
"strict": true
}
}
OpenAI Responses:
{
"type": "function",
"name": "get_weather",
"description": "Get current weather",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string"}
},
"required": ["location"]
},
"strict": true
}
Anthropic Messages:
{
"name": "get_weather",
"description": "Get current weather",
"input_schema": {
"type": "object",
"properties": {
"location": {"type": "string"}
},
"required": ["location"]
}
}
2.3 Message/Content Structure
Role Mapping
| OpenAI Classic |
OpenAI Responses |
Anthropic Messages |
system |
Via instructions |
Via system parameter |
developer |
Via instructions |
Via system parameter |
user |
user (in items) |
user |
assistant |
assistant (in items) |
assistant |
tool |
function_call_output (item type) |
tool_result (content block) |
Content Block Types
| Content Type |
OpenAI Classic |
OpenAI Responses |
Anthropic Messages |
| Text |
{"type": "text", "text": "..."} |
{"type": "text", "text": "..."} |
{"type": "text", "text": "..."} |
| Image URL |
{"type": "image_url", "image_url": {"url": "..."}} |
{"type": "image_url", "image_url": "..."} |
{"type": "image", "source": {"type": "url", "url": "..."}} |
| Image Base64 |
{"type": "image_url", "image_url": {"url": "data:..."}} |
{"type": "image_url", "image_url": "data:..."} |
{"type": "image", "source": {"type": "base64", "media_type": "...", "data": "..."}} |
| Tool Call |
In tool_calls[] |
function_call item |
{"type": "tool_use", ...} |
| Tool Result |
role: "tool" message |
function_call_output item |
{"type": "tool_result", ...} |
| Audio |
{"type": "input_audio", ...} |
{"type": "input_audio", ...} |
Not directly supported |
| Document/PDF |
Not directly supported |
File search tool |
{"type": "document", ...} |
2.4 Response Format/Structured Outputs
| Aspect |
OpenAI Classic |
OpenAI Responses |
Anthropic Messages |
| JSON Mode |
response_format: {"type": "json_object"} |
text: {"format": {"type": "json_object"}} |
Not directly supported |
| JSON Schema |
response_format: {"type": "json_schema", "json_schema": {...}} |
text: {"format": {"type": "json_schema", ...}} |
Not directly supported |
3. Response Fields Comparison
3.1 Top-Level Response Structure
| Field |
OpenAI Classic |
OpenAI Responses |
Anthropic Messages |
| ID |
id (chatcmpl-xxx) |
id (resp_xxx) |
id (msg_xxx) |
| Object Type |
object: "chat.completion" |
object: "response" |
type: "message" |
| Created |
created (unix timestamp) |
created_at (unix timestamp) |
Not included |
| Model |
model |
model |
model |
| Content |
choices[].message |
output[] |
content[] |
| Finish Reason |
choices[].finish_reason |
output[].status or status |
stop_reason |
| Usage |
usage object |
usage object |
usage object |
3.2 Finish/Stop Reason Mapping
| Reason |
OpenAI Classic |
OpenAI Responses |
Anthropic Messages |
| Normal completion |
stop |
completed |
end_turn |
| Max tokens |
length |
incomplete (with max_output_tokens) |
max_tokens |
| Tool call |
tool_calls |
N/A (continues in output) |
tool_use |
| Stop sequence |
stop |
completed |
stop_sequence |
| Content filter |
content_filter |
incomplete (with reason) |
refusal |
3.3 Usage Structure
| Field |
OpenAI Classic |
OpenAI Responses |
Anthropic Messages |
| Input Tokens |
prompt_tokens |
input_tokens |
input_tokens |
| Output Tokens |
completion_tokens |
output_tokens |
output_tokens |
| Total Tokens |
total_tokens |
total_tokens |
(compute from above) |
| Cached Input |
prompt_tokens_details.cached_tokens |
input_tokens_details.cached_tokens |
cache_read_input_tokens |
| Cache Creation |
Not explicit |
Not explicit |
cache_creation_input_tokens |
| Reasoning Tokens |
completion_tokens_details.reasoning_tokens |
output_tokens_details.reasoning_tokens |
Not exposed (in thinking) |
3.4 Tool Call Response Format
OpenAI Classic:
{
"choices": [{
"message": {
"role": "assistant",
"content": null,
"tool_calls": [{
"id": "call_abc123",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"location\": \"Paris\"}"
}
}]
},
"finish_reason": "tool_calls"
}]
}
OpenAI Responses:
{
"output": [
{
"type": "function_call",
"id": "fc_abc123",
"call_id": "call_abc123",
"name": "get_weather",
"arguments": "{\"location\": \"Paris\"}"
}
]
}
Anthropic Messages:
{
"content": [{
"type": "tool_use",
"id": "toolu_abc123",
"name": "get_weather",
"input": {"location": "Paris"}
}],
"stop_reason": "tool_use"
}
4. Streaming Events Comparison
4.1 Event Format
| Aspect |
OpenAI Classic |
OpenAI Responses |
Anthropic Messages |
| Format |
data: {...} |
event: xxx\ndata: {...} |
event: xxx\ndata: {...} |
| Termination |
data: [DONE] |
event: response.done |
event: message_stop |
| Chunk Object |
chat.completion.chunk |
Various event types |
Various event types |
4.2 Stream Event Types
OpenAI Classic Stream Events
- Each chunk has
object: "chat.completion.chunk"
choices[].delta contains incremental content
choices[].delta.content for text
choices[].delta.tool_calls for tool calls
- Final chunk may have
choices[].finish_reason
- Ends with
data: [DONE]
OpenAI Responses Stream Events
| Event Type |
Description |
response.created |
Response object created |
response.in_progress |
Response is being generated |
response.output_item.added |
New output item added |
response.output_item.done |
Output item completed |
response.content_part.added |
Content part started |
response.content_part.delta |
Content delta |
response.content_part.done |
Content part completed |
response.text.delta |
Text content delta |
response.text.done |
Text content complete |
response.function_call_arguments.delta |
Function arguments delta |
response.function_call_arguments.done |
Function call complete |
response.done |
Response complete |
error |
Error occurred |
Anthropic Messages Stream Events
| Event Type |
Description |
message_start |
Message object with initial metadata |
content_block_start |
New content block started |
content_block_delta |
Content delta (text_delta, input_json_delta, thinking_delta) |
content_block_stop |
Content block completed |
message_delta |
Message-level delta (stop_reason, usage) |
message_stop |
Stream complete |
ping |
Keep-alive ping |
error |
Error occurred |
4.3 Delta Structures
OpenAI Classic Delta:
{
"id": "chatcmpl-xxx",
"object": "chat.completion.chunk",
"choices": [{
"index": 0,
"delta": {"content": "Hello"},
"finish_reason": null
}]
}
OpenAI Responses Delta:
event: response.text.delta
data: {"type": "response.text.delta", "item_id": "item_xxx", "output_index": 0, "content_index": 0, "delta": "Hello"}
Anthropic Messages Delta:
event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "text_delta", "text": "Hello"}}
5. Error Response Comparison
5.1 Error Structure
OpenAI (both APIs):
{
"error": {
"message": "Error description",
"type": "invalid_request_error",
"param": "messages",
"code": "invalid_type"
}
}
Anthropic:
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "Error description"
}
}
5.2 Error Code Mapping
| HTTP Status |
OpenAI Type |
Anthropic Type |
| 400 |
invalid_request_error |
invalid_request_error |
| 401 |
authentication_error |
authentication_error |
| 403 |
permission_error |
permission_error |
| 404 |
not_found_error |
not_found_error |
| 429 |
rate_limit_error |
rate_limit_error |
| 500 |
server_error |
api_error |
| 503 |
service_unavailable_error |
N/A |
| 529 |
N/A |
overloaded_error |
6. Multimodal Capabilities
6.1 Image Input Support
| Capability |
OpenAI Classic |
OpenAI Responses |
Anthropic Messages |
| URL images |
Yes |
Yes |
Yes |
| Base64 images |
Yes |
Yes |
Yes |
| Supported formats |
JPEG, PNG, GIF, WebP |
JPEG, PNG, GIF, WebP |
JPEG, PNG, GIF, WebP |
| Max images |
Multiple |
Multiple |
Up to 20 |
| Max size |
20MB |
20MB |
3.75MB each |
6.2 Image Generation
| Capability |
OpenAI Classic |
OpenAI Responses |
Anthropic Messages |
| Native support |
No (separate API) |
Yes (image_generation tool) |
No |
6.3 Audio Support
| Capability |
OpenAI Classic |
OpenAI Responses |
Anthropic Messages |
| Audio input |
Yes (GPT-4o) |
Yes |
No |
| Audio output |
Yes (GPT-4o) |
Yes |
No |
6.4 Document/File Support
| Capability |
OpenAI Classic |
OpenAI Responses |
Anthropic Messages |
| PDF input |
No |
Via file_search tool |
Yes (native) |
| Text files |
No |
Via file_search tool |
Yes (native) |
7. Special Features
7.1 Extended Thinking
| Feature |
OpenAI Classic |
OpenAI Responses |
Anthropic Messages |
| Thinking blocks |
Via reasoning models |
Via reasoning models |
thinking parameter |
| Budget control |
Not explicit |
Not explicit |
thinking.budget_tokens |
| Thinking output |
Summarized |
Encrypted or summarized |
Raw or signature-verified |
7.2 Caching
| Feature |
OpenAI Classic |
OpenAI Responses |
Anthropic Messages |
| Prompt caching |
Automatic |
Automatic |
Explicit cache_control |
| Cache TTL |
System-managed |
System-managed |
5m or 1h |
7.3 Stateful Conversations
| Feature |
OpenAI Classic |
OpenAI Responses |
Anthropic Messages |
| State management |
Client-side (send full history) |
previous_response_id |
Client-side (send full history) |
| Storage |
store: true |
store: true (default) |
No built-in storage |
8. Conversion Strategies
8.1 Lossless vs Lossy Conversions
Lossless mappings:
- Text content between all three APIs
- Basic tool declarations (name, description, schema)
- Role mappings (user, assistant)
- Temperature, max_tokens, stop sequences
- Image inputs (URL and base64)
Lossy mappings (require degradation):
top_k (Anthropic → OpenAI): Drop or store in metadata
seed (OpenAI → Anthropic): Drop or store in metadata
n multiple completions (OpenAI → others): Not supported
- Presence/frequency penalty (OpenAI → others): Not supported
logprobs (OpenAI → others): Not supported
- Native audio I/O (OpenAI → Anthropic): Not supported
- Extended thinking format differences
8.2 Recommended Degradation Strategies
- Unsupported parameters: Store in
metadata.unsupported_params for round-trip preservation
- Capability gaps: Raise
CapabilityNotSupportedError with details
- Value range differences: Clamp values (e.g., temperature 0-2 → 0-1)
- Format differences: Transform to equivalent format (e.g., tool schema nesting)
9. References
1---2name: 2578-protocol-comparison-c1dff7573description: API Protocol Comparison Report4---5# API Protocol Comparison Report67OpenAI Classic (Chat Completions) vs OpenAI Responses vs Anthropic Messages89## 1. Overview1011| Aspect | OpenAI Classic | OpenAI Responses | Anthropic Messages |12|--------|----------------|------------------|-------------------|13| Endpoint | `/v1/chat/completions` | `/v1/responses` | `/v1/messages` |14| Message Unit | `messages[]` (Message objects) | `input` (string or Item[]) | `messages[]` (Message objects) |15| System Prompt | Via `role: "system"` or `role: "developer"` | Via `instructions` parameter | Via `system` parameter |16| Tool Format | `tools[].function.{name,description,parameters}` | `tools[].{name,description,parameters}` | `tools[].{name,description,input_schema}` |17| Response Format | `choices[].message` | `output[]` (Item array) | `content[]` (ContentBlock array) |18| Streaming | SSE with `data: {...}` + `[DONE]` | SSE with event types | SSE with event types |1920---2122## 2. Request Fields Comparison2324### 2.1 Core Parameters2526| Parameter | OpenAI Classic | OpenAI Responses | Anthropic Messages |27|-----------|----------------|------------------|-------------------|28| Model | `model` (required) | `model` (required) | `model` (required) |29| Messages/Input | `messages` (required) | `input` (required) | `messages` (required) |30| System Prompt | In `messages` with `role: "system"` | `instructions` | `system` (string or blocks) |31| Max Tokens | `max_tokens` or `max_completion_tokens` | `max_output_tokens` | `max_tokens` (required) |32| Temperature | `temperature` (0-2, default 1) | `temperature` (0-2, default 1) | `temperature` (0-1, default 1) |33| Top P | `top_p` (default 1) | `top_p` (default 1) | `top_p` |34| Top K | Not supported | Not supported | `top_k` |35| Stop Sequences | `stop` (string or array, max 4) | `stop` (array, max 4) | `stop_sequences` (array) |36| Stream | `stream` (boolean) | `stream` (boolean) | `stream` (boolean) |37| Seed | `seed` (integer) | `seed` (integer) | Not supported |38| User ID | `user` (string) | `user` (string) | `metadata.user_id` |39| Logprobs | `logprobs`, `top_logprobs` | Not directly supported | Not supported |40| N (multiple choices) | `n` (default 1) | Not supported | Not supported |41| Presence Penalty | `presence_penalty` (-2 to 2) | Not supported | Not supported |42| Frequency Penalty | `frequency_penalty` (-2 to 2) | Not supported | Not supported |4344### 2.2 Tool/Function Calling4546| Aspect | OpenAI Classic | OpenAI Responses | Anthropic Messages |47|--------|----------------|------------------|-------------------|48| Tool Declaration | `tools[]` | `tools[]` | `tools[]` |49| Tool Type | `type: "function"` | `type: "function"` | Implicit function |50| Name Location | `function.name` | `name` | `name` |51| Description Location | `function.description` | `description` | `description` |52| Schema Location | `function.parameters` | `parameters` | `input_schema` |53| Strict Mode | `function.strict` | `strict` | Not supported |54| Tool Choice | `tool_choice` | `tool_choice` | `tool_choice` |55| Auto Choice | `"auto"` | `{"type": "auto"}` | `{"type": "auto"}` |56| None Choice | `"none"` | `{"type": "none"}` | `{"type": "none"}` |57| Required Choice | `"required"` | Not available | `{"type": "any"}` |58| Specific Tool | `{"type": "function", "function": {"name": "..."}}` | `{"type": "function", "name": "..."}` | `{"type": "tool", "name": "..."}` |59| Parallel Tool Calls | `parallel_tool_calls` (boolean) | Implicit | `tool_choice.disable_parallel_tool_use` |6061#### Tool Declaration Format Examples6263**OpenAI Classic:**64```json65{66 "type": "function",67 "function": {68 "name": "get_weather",69 "description": "Get current weather",70 "parameters": {71 "type": "object",72 "properties": {73 "location": {"type": "string"}74 },75 "required": ["location"]76 },77 "strict": true78 }79}80```8182**OpenAI Responses:**83```json84{85 "type": "function",86 "name": "get_weather",87 "description": "Get current weather",88 "parameters": {89 "type": "object",90 "properties": {91 "location": {"type": "string"}92 },93 "required": ["location"]94 },95 "strict": true96}97```9899**Anthropic Messages:**100```json101{102 "name": "get_weather",103 "description": "Get current weather",104 "input_schema": {105 "type": "object",106 "properties": {107 "location": {"type": "string"}108 },109 "required": ["location"]110 }111}112```113114### 2.3 Message/Content Structure115116#### Role Mapping117118| OpenAI Classic | OpenAI Responses | Anthropic Messages |119|----------------|------------------|-------------------|120| `system` | Via `instructions` | Via `system` parameter |121| `developer` | Via `instructions` | Via `system` parameter |122| `user` | `user` (in items) | `user` |123| `assistant` | `assistant` (in items) | `assistant` |124| `tool` | `function_call_output` (item type) | `tool_result` (content block) |125126#### Content Block Types127128| Content Type | OpenAI Classic | OpenAI Responses | Anthropic Messages |129|--------------|----------------|------------------|-------------------|130| Text | `{"type": "text", "text": "..."}` | `{"type": "text", "text": "..."}` | `{"type": "text", "text": "..."}` |131| Image URL | `{"type": "image_url", "image_url": {"url": "..."}}` | `{"type": "image_url", "image_url": "..."}` | `{"type": "image", "source": {"type": "url", "url": "..."}}` |132| Image Base64 | `{"type": "image_url", "image_url": {"url": "data:..."}}` | `{"type": "image_url", "image_url": "data:..."}` | `{"type": "image", "source": {"type": "base64", "media_type": "...", "data": "..."}}` |133| Tool Call | In `tool_calls[]` | `function_call` item | `{"type": "tool_use", ...}` |134| Tool Result | `role: "tool"` message | `function_call_output` item | `{"type": "tool_result", ...}` |135| Audio | `{"type": "input_audio", ...}` | `{"type": "input_audio", ...}` | Not directly supported |136| Document/PDF | Not directly supported | File search tool | `{"type": "document", ...}` |137138### 2.4 Response Format/Structured Outputs139140| Aspect | OpenAI Classic | OpenAI Responses | Anthropic Messages |141|--------|----------------|------------------|-------------------|142| JSON Mode | `response_format: {"type": "json_object"}` | `text: {"format": {"type": "json_object"}}` | Not directly supported |143| JSON Schema | `response_format: {"type": "json_schema", "json_schema": {...}}` | `text: {"format": {"type": "json_schema", ...}}` | Not directly supported |144145---146147## 3. Response Fields Comparison148149### 3.1 Top-Level Response Structure150151| Field | OpenAI Classic | OpenAI Responses | Anthropic Messages |152|-------|----------------|------------------|-------------------|153| ID | `id` (chatcmpl-xxx) | `id` (resp_xxx) | `id` (msg_xxx) |154| Object Type | `object: "chat.completion"` | `object: "response"` | `type: "message"` |155| Created | `created` (unix timestamp) | `created_at` (unix timestamp) | Not included |156| Model | `model` | `model` | `model` |157| Content | `choices[].message` | `output[]` | `content[]` |158| Finish Reason | `choices[].finish_reason` | `output[].status` or `status` | `stop_reason` |159| Usage | `usage` object | `usage` object | `usage` object |160161### 3.2 Finish/Stop Reason Mapping162163| Reason | OpenAI Classic | OpenAI Responses | Anthropic Messages |164|--------|----------------|------------------|-------------------|165| Normal completion | `stop` | `completed` | `end_turn` |166| Max tokens | `length` | `incomplete` (with `max_output_tokens`) | `max_tokens` |167| Tool call | `tool_calls` | N/A (continues in output) | `tool_use` |168| Stop sequence | `stop` | `completed` | `stop_sequence` |169| Content filter | `content_filter` | `incomplete` (with reason) | `refusal` |170171### 3.3 Usage Structure172173| Field | OpenAI Classic | OpenAI Responses | Anthropic Messages |174|-------|----------------|------------------|-------------------|175| Input Tokens | `prompt_tokens` | `input_tokens` | `input_tokens` |176| Output Tokens | `completion_tokens` | `output_tokens` | `output_tokens` |177| Total Tokens | `total_tokens` | `total_tokens` | (compute from above) |178| Cached Input | `prompt_tokens_details.cached_tokens` | `input_tokens_details.cached_tokens` | `cache_read_input_tokens` |179| Cache Creation | Not explicit | Not explicit | `cache_creation_input_tokens` |180| Reasoning Tokens | `completion_tokens_details.reasoning_tokens` | `output_tokens_details.reasoning_tokens` | Not exposed (in thinking) |181182### 3.4 Tool Call Response Format183184**OpenAI Classic:**185```json186{187 "choices": [{188 "message": {189 "role": "assistant",190 "content": null,191 "tool_calls": [{192 "id": "call_abc123",193 "type": "function",194 "function": {195 "name": "get_weather",196 "arguments": "{\"location\": \"Paris\"}"197 }198 }]199 },200 "finish_reason": "tool_calls"201 }]202}203```204205**OpenAI Responses:**206```json207{208 "output": [209 {210 "type": "function_call",211 "id": "fc_abc123",212 "call_id": "call_abc123",213 "name": "get_weather",214 "arguments": "{\"location\": \"Paris\"}"215 }216 ]217}218```219220**Anthropic Messages:**221```json222{223 "content": [{224 "type": "tool_use",225 "id": "toolu_abc123",226 "name": "get_weather",227 "input": {"location": "Paris"}228 }],229 "stop_reason": "tool_use"230}231```232233---234235## 4. Streaming Events Comparison236237### 4.1 Event Format238239| Aspect | OpenAI Classic | OpenAI Responses | Anthropic Messages |240|--------|----------------|------------------|-------------------|241| Format | `data: {...}` | `event: xxx\ndata: {...}` | `event: xxx\ndata: {...}` |242| Termination | `data: [DONE]` | `event: response.done` | `event: message_stop` |243| Chunk Object | `chat.completion.chunk` | Various event types | Various event types |244245### 4.2 Stream Event Types246247#### OpenAI Classic Stream Events248- Each chunk has `object: "chat.completion.chunk"`249- `choices[].delta` contains incremental content250- `choices[].delta.content` for text251- `choices[].delta.tool_calls` for tool calls252- Final chunk may have `choices[].finish_reason`253- Ends with `data: [DONE]`254255#### OpenAI Responses Stream Events256| Event Type | Description |257|------------|-------------|258| `response.created` | Response object created |259| `response.in_progress` | Response is being generated |260| `response.output_item.added` | New output item added |261| `response.output_item.done` | Output item completed |262| `response.content_part.added` | Content part started |263| `response.content_part.delta` | Content delta |264| `response.content_part.done` | Content part completed |265| `response.text.delta` | Text content delta |266| `response.text.done` | Text content complete |267| `response.function_call_arguments.delta` | Function arguments delta |268| `response.function_call_arguments.done` | Function call complete |269| `response.done` | Response complete |270| `error` | Error occurred |271272#### Anthropic Messages Stream Events273| Event Type | Description |274|------------|-------------|275| `message_start` | Message object with initial metadata |276| `content_block_start` | New content block started |277| `content_block_delta` | Content delta (text_delta, input_json_delta, thinking_delta) |278| `content_block_stop` | Content block completed |279| `message_delta` | Message-level delta (stop_reason, usage) |280| `message_stop` | Stream complete |281| `ping` | Keep-alive ping |282| `error` | Error occurred |283284### 4.3 Delta Structures285286**OpenAI Classic Delta:**287```json288{289 "id": "chatcmpl-xxx",290 "object": "chat.completion.chunk",291 "choices": [{292 "index": 0,293 "delta": {"content": "Hello"},294 "finish_reason": null295 }]296}297```298299**OpenAI Responses Delta:**300```json301event: response.text.delta302data: {"type": "response.text.delta", "item_id": "item_xxx", "output_index": 0, "content_index": 0, "delta": "Hello"}303```304305**Anthropic Messages Delta:**306```json307event: content_block_delta308data: {"type": "content_block_delta", "index": 0, "delta": {"type": "text_delta", "text": "Hello"}}309```310311---312313## 5. Error Response Comparison314315### 5.1 Error Structure316317**OpenAI (both APIs):**318```json319{320 "error": {321 "message": "Error description",322 "type": "invalid_request_error",323 "param": "messages",324 "code": "invalid_type"325 }326}327```328329**Anthropic:**330```json331{332 "type": "error",333 "error": {334 "type": "invalid_request_error",335 "message": "Error description"336 }337}338```339340### 5.2 Error Code Mapping341342| HTTP Status | OpenAI Type | Anthropic Type |343|-------------|-------------|----------------|344| 400 | `invalid_request_error` | `invalid_request_error` |345| 401 | `authentication_error` | `authentication_error` |346| 403 | `permission_error` | `permission_error` |347| 404 | `not_found_error` | `not_found_error` |348| 429 | `rate_limit_error` | `rate_limit_error` |349| 500 | `server_error` | `api_error` |350| 503 | `service_unavailable_error` | N/A |351| 529 | N/A | `overloaded_error` |352353---354355## 6. Multimodal Capabilities356357### 6.1 Image Input Support358359| Capability | OpenAI Classic | OpenAI Responses | Anthropic Messages |360|------------|----------------|------------------|-------------------|361| URL images | Yes | Yes | Yes |362| Base64 images | Yes | Yes | Yes |363| Supported formats | JPEG, PNG, GIF, WebP | JPEG, PNG, GIF, WebP | JPEG, PNG, GIF, WebP |364| Max images | Multiple | Multiple | Up to 20 |365| Max size | 20MB | 20MB | 3.75MB each |366367### 6.2 Image Generation368369| Capability | OpenAI Classic | OpenAI Responses | Anthropic Messages |370|------------|----------------|------------------|-------------------|371| Native support | No (separate API) | Yes (image_generation tool) | No |372373### 6.3 Audio Support374375| Capability | OpenAI Classic | OpenAI Responses | Anthropic Messages |376|------------|----------------|------------------|-------------------|377| Audio input | Yes (GPT-4o) | Yes | No |378| Audio output | Yes (GPT-4o) | Yes | No |379380### 6.4 Document/File Support381382| Capability | OpenAI Classic | OpenAI Responses | Anthropic Messages |383|------------|----------------|------------------|-------------------|384| PDF input | No | Via file_search tool | Yes (native) |385| Text files | No | Via file_search tool | Yes (native) |386387---388389## 7. Special Features390391### 7.1 Extended Thinking392393| Feature | OpenAI Classic | OpenAI Responses | Anthropic Messages |394|---------|----------------|------------------|-------------------|395| Thinking blocks | Via reasoning models | Via reasoning models | `thinking` parameter |396| Budget control | Not explicit | Not explicit | `thinking.budget_tokens` |397| Thinking output | Summarized | Encrypted or summarized | Raw or signature-verified |398399### 7.2 Caching400401| Feature | OpenAI Classic | OpenAI Responses | Anthropic Messages |402|---------|----------------|------------------|-------------------|403| Prompt caching | Automatic | Automatic | Explicit `cache_control` |404| Cache TTL | System-managed | System-managed | `5m` or `1h` |405406### 7.3 Stateful Conversations407408| Feature | OpenAI Classic | OpenAI Responses | Anthropic Messages |409|---------|----------------|------------------|-------------------|410| State management | Client-side (send full history) | `previous_response_id` | Client-side (send full history) |411| Storage | `store: true` | `store: true` (default) | No built-in storage |412413---414415## 8. Conversion Strategies416417### 8.1 Lossless vs Lossy Conversions418419**Lossless mappings:**420- Text content between all three APIs421- Basic tool declarations (name, description, schema)422- Role mappings (user, assistant)423- Temperature, max_tokens, stop sequences424- Image inputs (URL and base64)425426**Lossy mappings (require degradation):**427- `top_k` (Anthropic → OpenAI): Drop or store in metadata428- `seed` (OpenAI → Anthropic): Drop or store in metadata429- `n` multiple completions (OpenAI → others): Not supported430- Presence/frequency penalty (OpenAI → others): Not supported431- `logprobs` (OpenAI → others): Not supported432- Native audio I/O (OpenAI → Anthropic): Not supported433- Extended thinking format differences434435### 8.2 Recommended Degradation Strategies4364371. **Unsupported parameters**: Store in `metadata.unsupported_params` for round-trip preservation4382. **Capability gaps**: Raise `CapabilityNotSupportedError` with details4393. **Value range differences**: Clamp values (e.g., temperature 0-2 → 0-1)4404. **Format differences**: Transform to equivalent format (e.g., tool schema nesting)441442---443444## 9. References445446- [OpenAI Chat Completions API](https://platform.openai.com/docs/api-reference/chat)447- [OpenAI Responses API](https://platform.openai.com/docs/api-reference/responses)448- [OpenAI Migration Guide](https://platform.openai.com/docs/guides/migrate-to-responses)449- [Anthropic Messages API](https://docs.anthropic.com/en/api/messages)450- [Anthropic Streaming](https://docs.anthropic.com/en/api/messages-streaming)