237 lines
4.7 KiB
Markdown
237 lines
4.7 KiB
Markdown
# Migration Guide: Chat Completions → Responses API
|
|
|
|
**Last Updated**: 2025-10-25
|
|
|
|
Quick guide for migrating from Chat Completions to Responses API.
|
|
|
|
---
|
|
|
|
## Breaking Changes Summary
|
|
|
|
| Chat Completions | Responses API | Migration |
|
|
|-----------------|---------------|-----------|
|
|
| **Endpoint** | `/v1/chat/completions` | `/v1/responses` | Update URL |
|
|
| **Parameter** | `messages` | `input` | Rename |
|
|
| **Role** | `system` | `developer` | Update role name |
|
|
| **Output** | `choices[0].message.content` | `output_text` | Update accessor |
|
|
| **State** | Manual (messages array) | Automatic (conversation ID) | Use conversations |
|
|
| **Tools** | `tools` array with functions | Built-in types + MCP | Update tool definitions |
|
|
|
|
---
|
|
|
|
## Step-by-Step Migration
|
|
|
|
### Step 1: Update Endpoint
|
|
|
|
**Before:**
|
|
```typescript
|
|
const response = await openai.chat.completions.create({...});
|
|
```
|
|
|
|
**After:**
|
|
```typescript
|
|
const response = await openai.responses.create({...});
|
|
```
|
|
|
|
### Step 2: Rename `messages` to `input`
|
|
|
|
**Before:**
|
|
```typescript
|
|
{
|
|
messages: [
|
|
{ role: 'system', content: '...' },
|
|
{ role: 'user', content: '...' }
|
|
]
|
|
}
|
|
```
|
|
|
|
**After:**
|
|
```typescript
|
|
{
|
|
input: [
|
|
{ role: 'developer', content: '...' },
|
|
{ role: 'user', content: '...' }
|
|
]
|
|
}
|
|
```
|
|
|
|
### Step 3: Update Response Access
|
|
|
|
**Before:**
|
|
```typescript
|
|
const text = response.choices[0].message.content;
|
|
```
|
|
|
|
**After:**
|
|
```typescript
|
|
const text = response.output_text;
|
|
```
|
|
|
|
### Step 4: Use Conversation IDs (Optional but Recommended)
|
|
|
|
**Before (Manual History):**
|
|
```typescript
|
|
let messages = [...previousMessages, newMessage];
|
|
const response = await openai.chat.completions.create({
|
|
model: 'gpt-5',
|
|
messages,
|
|
});
|
|
```
|
|
|
|
**After (Automatic):**
|
|
```typescript
|
|
const response = await openai.responses.create({
|
|
model: 'gpt-5',
|
|
conversation: conv.id, // ✅ Automatic state
|
|
input: newMessage,
|
|
});
|
|
```
|
|
|
|
---
|
|
|
|
## Complete Example
|
|
|
|
**Before (Chat Completions):**
|
|
```typescript
|
|
import OpenAI from 'openai';
|
|
|
|
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
|
|
|
|
let messages = [
|
|
{ role: 'system', content: 'You are a helpful assistant.' },
|
|
];
|
|
|
|
async function chat(userMessage: string) {
|
|
messages.push({ role: 'user', content: userMessage });
|
|
|
|
const response = await openai.chat.completions.create({
|
|
model: 'gpt-5',
|
|
messages,
|
|
});
|
|
|
|
const assistantMessage = response.choices[0].message;
|
|
messages.push(assistantMessage);
|
|
|
|
return assistantMessage.content;
|
|
}
|
|
|
|
// Usage
|
|
await chat('Hello');
|
|
await chat('Tell me a joke');
|
|
```
|
|
|
|
**After (Responses):**
|
|
```typescript
|
|
import OpenAI from 'openai';
|
|
|
|
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
|
|
|
|
const conversation = await openai.conversations.create({
|
|
items: [
|
|
{ type: 'message', role: 'developer', content: 'You are a helpful assistant.' },
|
|
],
|
|
});
|
|
|
|
async function chat(userMessage: string) {
|
|
const response = await openai.responses.create({
|
|
model: 'gpt-5',
|
|
conversation: conversation.id,
|
|
input: userMessage,
|
|
});
|
|
|
|
return response.output_text;
|
|
}
|
|
|
|
// Usage
|
|
await chat('Hello');
|
|
await chat('Tell me a joke'); // Remembers previous turn automatically
|
|
```
|
|
|
|
---
|
|
|
|
## Tool Migration
|
|
|
|
### Chat Completions Functions → Responses Built-in Tools
|
|
|
|
**Before (Custom Function):**
|
|
```typescript
|
|
{
|
|
tools: [
|
|
{
|
|
type: 'function',
|
|
function: {
|
|
name: 'get_weather',
|
|
description: 'Get weather',
|
|
parameters: { /* schema */ }
|
|
}
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**After (Built-in or MCP):**
|
|
```typescript
|
|
{
|
|
tools: [
|
|
{ type: 'web_search' }, // Built-in
|
|
{ type: 'code_interpreter' }, // Built-in
|
|
{
|
|
type: 'mcp', // External tools
|
|
server_label: 'weather',
|
|
server_url: 'https://weather-mcp.example.com'
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Streaming Migration
|
|
|
|
**Before:**
|
|
```typescript
|
|
const stream = await openai.chat.completions.create({
|
|
model: 'gpt-5',
|
|
messages,
|
|
stream: true,
|
|
});
|
|
|
|
for await (const chunk of stream) {
|
|
process.stdout.write(chunk.choices[0]?.delta?.content || '');
|
|
}
|
|
```
|
|
|
|
**After:**
|
|
```typescript
|
|
const stream = await openai.responses.create({
|
|
model: 'gpt-5',
|
|
input,
|
|
stream: true,
|
|
});
|
|
|
|
for await (const chunk of stream) {
|
|
// Handle polymorphic outputs
|
|
if (chunk.type === 'message_delta') {
|
|
process.stdout.write(chunk.content || '');
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Testing Checklist
|
|
|
|
- [ ] Update all endpoint calls
|
|
- [ ] Rename `messages` to `input`
|
|
- [ ] Update `system` role to `developer`
|
|
- [ ] Update response access (`choices[0]` → `output_text`)
|
|
- [ ] Implement conversation management
|
|
- [ ] Update tool definitions
|
|
- [ ] Test multi-turn conversations
|
|
- [ ] Verify streaming works
|
|
- [ ] Check cost tracking (tool tokens)
|
|
|
|
---
|
|
|
|
**Official Docs**: https://platform.openai.com/docs/guides/responses
|