Initial commit
This commit is contained in:
476
references/top-errors.md
Normal file
476
references/top-errors.md
Normal file
@@ -0,0 +1,476 @@
|
||||
# Top 8 Errors with OpenAI Responses API
|
||||
|
||||
**Last Updated**: 2025-10-25
|
||||
|
||||
This document covers the most common errors encountered when using the Responses API and their solutions.
|
||||
|
||||
---
|
||||
|
||||
## 1. Session State Not Persisting
|
||||
|
||||
**Error Symptom:**
|
||||
Model doesn't remember previous conversation turns.
|
||||
|
||||
**Causes:**
|
||||
- Not using conversation IDs
|
||||
- Using different conversation IDs per turn
|
||||
- Creating new conversation for each request
|
||||
|
||||
**Solution:**
|
||||
```typescript
|
||||
// ❌ BAD: New conversation each time
|
||||
const response1 = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
input: 'Question 1',
|
||||
});
|
||||
const response2 = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
input: 'Question 2', // Model doesn't remember question 1
|
||||
});
|
||||
|
||||
// ✅ GOOD: Reuse conversation ID
|
||||
const conv = await openai.conversations.create();
|
||||
const response1 = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
conversation: conv.id, // ✅ Same ID
|
||||
input: 'Question 1',
|
||||
});
|
||||
const response2 = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
conversation: conv.id, // ✅ Same ID - remembers previous
|
||||
input: 'Question 2',
|
||||
});
|
||||
```
|
||||
|
||||
**Prevention:**
|
||||
- Create conversation once
|
||||
- Store conversation ID (database, session, cookie)
|
||||
- Reuse ID for all related turns
|
||||
|
||||
---
|
||||
|
||||
## 2. MCP Server Connection Failed
|
||||
|
||||
**Error:**
|
||||
```json
|
||||
{
|
||||
"error": {
|
||||
"type": "mcp_connection_error",
|
||||
"message": "Failed to connect to MCP server"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Causes:**
|
||||
- Invalid server URL
|
||||
- Missing or expired authorization token
|
||||
- Server not responding
|
||||
- Network issues
|
||||
|
||||
**Solutions:**
|
||||
```typescript
|
||||
// 1. Verify URL is correct
|
||||
const response = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
input: 'Test MCP',
|
||||
tools: [
|
||||
{
|
||||
type: 'mcp',
|
||||
server_label: 'stripe',
|
||||
server_url: 'https://mcp.stripe.com', // ✅ Full HTTPS URL
|
||||
authorization: process.env.STRIPE_OAUTH_TOKEN, // ✅ Valid token
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
// 2. Test server URL manually
|
||||
const testResponse = await fetch('https://mcp.stripe.com');
|
||||
console.log(testResponse.status); // Should be 200
|
||||
|
||||
// 3. Check token expiration
|
||||
const tokenExpiry = parseJWT(token).exp;
|
||||
if (Date.now() / 1000 > tokenExpiry) {
|
||||
console.error('Token expired, refresh it');
|
||||
}
|
||||
```
|
||||
|
||||
**Prevention:**
|
||||
- Use environment variables for secrets
|
||||
- Implement token refresh logic
|
||||
- Add retry with exponential backoff
|
||||
- Log connection attempts for debugging
|
||||
|
||||
---
|
||||
|
||||
## 3. Code Interpreter Timeout
|
||||
|
||||
**Error:**
|
||||
```json
|
||||
{
|
||||
"error": {
|
||||
"type": "code_interpreter_timeout",
|
||||
"message": "Code execution exceeded time limit"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Cause:**
|
||||
Code runs longer than 30 seconds (standard mode limit)
|
||||
|
||||
**Solution:**
|
||||
```typescript
|
||||
// ❌ BAD: Long-running code in standard mode
|
||||
const response = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
input: 'Process this massive dataset',
|
||||
tools: [{ type: 'code_interpreter' }], // Timeout after 30s
|
||||
});
|
||||
|
||||
// ✅ GOOD: Use background mode for long tasks
|
||||
const response = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
input: 'Process this massive dataset',
|
||||
background: true, // ✅ Up to 10 minutes
|
||||
tools: [{ type: 'code_interpreter' }],
|
||||
});
|
||||
|
||||
// Poll for results
|
||||
let result = await openai.responses.retrieve(response.id);
|
||||
while (result.status === 'in_progress') {
|
||||
await new Promise(r => setTimeout(r, 5000));
|
||||
result = await openai.responses.retrieve(response.id);
|
||||
}
|
||||
console.log(result.output_text);
|
||||
```
|
||||
|
||||
**Prevention:**
|
||||
- Use `background: true` for tasks > 30 seconds
|
||||
- Break large tasks into smaller chunks
|
||||
- Optimize code for performance
|
||||
|
||||
---
|
||||
|
||||
## 4. Image Generation Rate Limit
|
||||
|
||||
**Error:**
|
||||
```json
|
||||
{
|
||||
"error": {
|
||||
"type": "rate_limit_error",
|
||||
"message": "DALL-E rate limit exceeded"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Cause:**
|
||||
Too many image generation requests in short time
|
||||
|
||||
**Solution:**
|
||||
```typescript
|
||||
// Implement retry with exponential backoff
|
||||
async function generateImageWithRetry(prompt: string, retries = 3): Promise<any> {
|
||||
for (let i = 0; i < retries; i++) {
|
||||
try {
|
||||
return await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
input: prompt,
|
||||
tools: [{ type: 'image_generation' }],
|
||||
});
|
||||
} catch (error: any) {
|
||||
if (error.type === 'rate_limit_error' && i < retries - 1) {
|
||||
const delay = Math.pow(2, i) * 1000; // 1s, 2s, 4s
|
||||
console.log(`Rate limited, retrying in ${delay}ms`);
|
||||
await new Promise(resolve => setTimeout(resolve, delay));
|
||||
} else {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const response = await generateImageWithRetry('Create an image of a sunset');
|
||||
```
|
||||
|
||||
**Prevention:**
|
||||
- Implement rate limiting on your side
|
||||
- Use exponential backoff for retries
|
||||
- Queue image requests
|
||||
- Monitor API usage
|
||||
|
||||
---
|
||||
|
||||
## 5. File Search Relevance Issues
|
||||
|
||||
**Problem:**
|
||||
File search returns irrelevant or low-quality results
|
||||
|
||||
**Causes:**
|
||||
- Vague queries
|
||||
- Poor file quality (OCR errors, formatting)
|
||||
- Not enough context
|
||||
|
||||
**Solutions:**
|
||||
```typescript
|
||||
// ❌ BAD: Vague query
|
||||
const response = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
input: 'Find pricing', // Too vague
|
||||
tools: [{ type: 'file_search', file_ids: [fileId] }],
|
||||
});
|
||||
|
||||
// ✅ GOOD: Specific query
|
||||
const response = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
input: 'Find the monthly subscription pricing for the premium plan in the 2025 pricing document',
|
||||
tools: [{ type: 'file_search', file_ids: [fileId] }],
|
||||
});
|
||||
|
||||
// ✅ ALSO GOOD: Filter low-confidence results
|
||||
response.output.forEach(item => {
|
||||
if (item.type === 'file_search_call') {
|
||||
const highConfidence = item.results.filter(r => r.score > 0.7);
|
||||
console.log('High confidence results:', highConfidence);
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
**Prevention:**
|
||||
- Use specific, detailed queries
|
||||
- Upload high-quality documents (PDFs, Markdown)
|
||||
- Filter results by confidence score (> 0.7)
|
||||
- Provide context in query
|
||||
|
||||
---
|
||||
|
||||
## 6. Variable Substitution Errors (Reusable Prompts)
|
||||
|
||||
**Error:**
|
||||
Variables not replaced in prompt templates
|
||||
|
||||
**Cause:**
|
||||
Incorrect variable syntax or missing values
|
||||
|
||||
**Solution:**
|
||||
```typescript
|
||||
// ❌ BAD: Incorrect variable syntax
|
||||
const response = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
input: 'Hello {username}', // Not supported directly
|
||||
});
|
||||
|
||||
// ✅ GOOD: Use template literals
|
||||
const username = 'Alice';
|
||||
const response = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
input: `Hello ${username}`, // ✅ JavaScript template literal
|
||||
});
|
||||
|
||||
// ✅ ALSO GOOD: Build message dynamically
|
||||
function buildPrompt(vars: Record<string, string>) {
|
||||
return `Hello ${vars.username}, your order ${vars.orderId} is ready.`;
|
||||
}
|
||||
|
||||
const response = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
input: buildPrompt({ username: 'Alice', orderId: '12345' }),
|
||||
});
|
||||
```
|
||||
|
||||
**Prevention:**
|
||||
- Use JavaScript template literals
|
||||
- Validate all variables before substitution
|
||||
- Provide defaults for optional variables
|
||||
|
||||
---
|
||||
|
||||
## 7. Chat Completions Migration Breaking Changes
|
||||
|
||||
**Errors:**
|
||||
- `messages parameter not found`
|
||||
- `choices is undefined`
|
||||
- `system role not recognized`
|
||||
|
||||
**Cause:**
|
||||
Using Chat Completions syntax with Responses API
|
||||
|
||||
**Solution:**
|
||||
```typescript
|
||||
// ❌ BAD: Chat Completions syntax
|
||||
const response = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
messages: [{ role: 'system', content: 'You are helpful.' }], // Wrong
|
||||
});
|
||||
console.log(response.choices[0].message.content); // Wrong
|
||||
|
||||
// ✅ GOOD: Responses syntax
|
||||
const response = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
input: [{ role: 'developer', content: 'You are helpful.' }], // ✅
|
||||
});
|
||||
console.log(response.output_text); // ✅
|
||||
```
|
||||
|
||||
**Breaking Changes:**
|
||||
| Chat Completions | Responses API |
|
||||
|-----------------|---------------|
|
||||
| `messages` | `input` |
|
||||
| `system` role | `developer` role |
|
||||
| `choices[0].message.content` | `output_text` |
|
||||
| `/v1/chat/completions` | `/v1/responses` |
|
||||
|
||||
**Prevention:**
|
||||
- Read migration guide: `references/migration-guide.md`
|
||||
- Update all references systematically
|
||||
- Test thoroughly after migration
|
||||
|
||||
---
|
||||
|
||||
## 8. Cost Tracking Confusion
|
||||
|
||||
**Problem:**
|
||||
Billing different than expected
|
||||
|
||||
**Cause:**
|
||||
Not accounting for tool tokens and conversation storage
|
||||
|
||||
**Explanation:**
|
||||
- **Chat Completions**: input tokens + output tokens
|
||||
- **Responses API**: input tokens + output tokens + tool tokens + conversation storage
|
||||
|
||||
**Solution:**
|
||||
```typescript
|
||||
const response = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
input: 'Hello',
|
||||
store: false, // ✅ Disable storage if not needed
|
||||
tools: [{ type: 'code_interpreter' }],
|
||||
});
|
||||
|
||||
// Monitor usage
|
||||
console.log('Input tokens:', response.usage.prompt_tokens);
|
||||
console.log('Output tokens:', response.usage.completion_tokens);
|
||||
console.log('Tool tokens:', response.usage.tool_tokens);
|
||||
console.log('Total tokens:', response.usage.total_tokens);
|
||||
|
||||
// Calculate cost
|
||||
const inputCost = response.usage.prompt_tokens * 0.00001; // Example rate
|
||||
const outputCost = response.usage.completion_tokens * 0.00003;
|
||||
const toolCost = response.usage.tool_tokens * 0.00002;
|
||||
const totalCost = inputCost + outputCost + toolCost;
|
||||
console.log('Estimated cost: $' + totalCost.toFixed(4));
|
||||
```
|
||||
|
||||
**Prevention:**
|
||||
- Monitor `usage.tool_tokens` in responses
|
||||
- Set `store: false` for one-off requests
|
||||
- Track conversation count (storage costs)
|
||||
- Implement cost alerts
|
||||
|
||||
---
|
||||
|
||||
## Common Error Response Formats
|
||||
|
||||
### Authentication Error
|
||||
```json
|
||||
{
|
||||
"error": {
|
||||
"type": "authentication_error",
|
||||
"message": "Invalid API key"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Rate Limit Error
|
||||
```json
|
||||
{
|
||||
"error": {
|
||||
"type": "rate_limit_error",
|
||||
"message": "Rate limit exceeded",
|
||||
"retry_after": 5
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Invalid Request Error
|
||||
```json
|
||||
{
|
||||
"error": {
|
||||
"type": "invalid_request_error",
|
||||
"message": "Conversation conv_xyz not found"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Server Error
|
||||
```json
|
||||
{
|
||||
"error": {
|
||||
"type": "server_error",
|
||||
"message": "Internal server error"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## General Error Handling Pattern
|
||||
|
||||
```typescript
|
||||
async function handleResponsesAPI(input: string) {
|
||||
try {
|
||||
const response = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
input,
|
||||
});
|
||||
|
||||
return response.output_text;
|
||||
} catch (error: any) {
|
||||
// Handle specific errors
|
||||
switch (error.type) {
|
||||
case 'rate_limit_error':
|
||||
console.error('Rate limited, retry after:', error.retry_after);
|
||||
break;
|
||||
case 'mcp_connection_error':
|
||||
console.error('MCP server failed:', error.message);
|
||||
break;
|
||||
case 'code_interpreter_timeout':
|
||||
console.error('Code execution timed out, use background mode');
|
||||
break;
|
||||
case 'authentication_error':
|
||||
console.error('Invalid API key');
|
||||
break;
|
||||
default:
|
||||
console.error('Unexpected error:', error.message);
|
||||
}
|
||||
|
||||
throw error; // Re-throw or handle
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Prevention Checklist
|
||||
|
||||
- [ ] Use conversation IDs for multi-turn interactions
|
||||
- [ ] Provide valid MCP server URLs and tokens
|
||||
- [ ] Use `background: true` for tasks > 30 seconds
|
||||
- [ ] Implement exponential backoff for rate limits
|
||||
- [ ] Use specific queries for file search
|
||||
- [ ] Use template literals for variable substitution
|
||||
- [ ] Update Chat Completions syntax to Responses syntax
|
||||
- [ ] Monitor `usage.tool_tokens` and conversation count
|
||||
|
||||
---
|
||||
|
||||
## Getting Help
|
||||
|
||||
If you encounter an error not covered here:
|
||||
|
||||
1. Check official docs: https://platform.openai.com/docs/api-reference/responses
|
||||
2. Search OpenAI Community: https://community.openai.com
|
||||
3. Contact OpenAI Support: https://help.openai.com
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: 2025-10-25
|
||||
Reference in New Issue
Block a user