740 lines
16 KiB
Markdown
740 lines
16 KiB
Markdown
# AI SDK Core - Top 12 Errors & Solutions
|
|
|
|
Comprehensive guide to the most common AI SDK Core errors with actionable solutions.
|
|
|
|
---
|
|
|
|
## 1. AI_APICallError
|
|
|
|
**Type:** Network/API Error
|
|
**Frequency:** Very Common
|
|
**Severity:** High
|
|
|
|
### Cause
|
|
|
|
API request to provider failed due to:
|
|
- Invalid API key
|
|
- Network connectivity issues
|
|
- Rate limit exceeded
|
|
- Provider service outage
|
|
|
|
### Solution
|
|
|
|
```typescript
|
|
import { AI_APICallError } from 'ai';
|
|
|
|
try {
|
|
const result = await generateText({
|
|
model: openai('gpt-4'),
|
|
prompt: 'Hello',
|
|
});
|
|
} catch (error) {
|
|
if (error instanceof AI_APICallError) {
|
|
console.error('API call failed:', error.message);
|
|
console.error('Status code:', error.statusCode);
|
|
console.error('Response:', error.responseBody);
|
|
|
|
// Handle specific status codes
|
|
if (error.statusCode === 401) {
|
|
// Invalid API key
|
|
console.error('Check OPENAI_API_KEY environment variable');
|
|
} else if (error.statusCode === 429) {
|
|
// Rate limit - implement exponential backoff
|
|
await wait(Math.pow(2, retryCount) * 1000);
|
|
// retry...
|
|
} else if (error.statusCode >= 500) {
|
|
// Provider issue - retry later
|
|
console.error('Provider service issue, retry in 1 minute');
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Prevention
|
|
|
|
- Validate API keys at application startup
|
|
- Implement retry logic with exponential backoff
|
|
- Monitor rate limits via response headers
|
|
- Handle network errors gracefully
|
|
- Set reasonable timeouts
|
|
|
|
### Resources
|
|
|
|
- Docs: https://ai-sdk.dev/docs/reference/ai-sdk-errors/ai-api-call-error
|
|
|
|
---
|
|
|
|
## 2. AI_NoObjectGeneratedError
|
|
|
|
**Type:** Generation Error
|
|
**Frequency:** Common
|
|
**Severity:** Medium
|
|
|
|
### Cause
|
|
|
|
Model didn't generate a valid object matching the Zod schema:
|
|
- Schema too complex for model
|
|
- Prompt doesn't provide enough context
|
|
- Model capabilities exceeded
|
|
- Safety filters triggered
|
|
|
|
### Solution
|
|
|
|
```typescript
|
|
import { AI_NoObjectGeneratedError } from 'ai';
|
|
|
|
try {
|
|
const result = await generateObject({
|
|
model: openai('gpt-4'),
|
|
schema: z.object({
|
|
// Complex schema
|
|
name: z.string(),
|
|
age: z.number(),
|
|
nested: z.object({ /* ... */ }),
|
|
}),
|
|
prompt: 'Generate a person',
|
|
});
|
|
} catch (error) {
|
|
if (error instanceof AI_NoObjectGeneratedError) {
|
|
console.error('No valid object generated');
|
|
|
|
// Solutions:
|
|
// 1. Simplify schema
|
|
const simpler = z.object({
|
|
name: z.string(),
|
|
age: z.number(),
|
|
});
|
|
|
|
// 2. Add more context
|
|
const betterPrompt = 'Generate a person profile with name (string) and age (number, 18-80)';
|
|
|
|
// 3. Try different model
|
|
const result2 = await generateObject({
|
|
model: openai('gpt-4'), // GPT-4 better than 3.5 for complex objects
|
|
schema: simpler,
|
|
prompt: betterPrompt,
|
|
});
|
|
}
|
|
}
|
|
```
|
|
|
|
### Prevention
|
|
|
|
- Start with simple schemas, add complexity gradually
|
|
- Include examples in prompt: `"Generate like: { name: 'Alice', age: 30 }"`
|
|
- Use GPT-4 or Claude for complex structured output
|
|
- Test schemas with sample data first
|
|
- Add descriptions to schema fields using `.describe()`
|
|
|
|
### Resources
|
|
|
|
- Docs: https://ai-sdk.dev/docs/reference/ai-sdk-errors/ai-no-object-generated-error
|
|
|
|
---
|
|
|
|
## 3. Worker Startup Limit (270ms+)
|
|
|
|
**Type:** Cloudflare Workers Issue
|
|
**Frequency:** Common (Workers only)
|
|
**Severity:** High (blocks deployment)
|
|
|
|
### Cause
|
|
|
|
AI SDK v5 + Zod initialization overhead exceeds Cloudflare Workers startup limit (must be <400ms):
|
|
- Top-level imports of AI SDK packages
|
|
- Complex Zod schemas at module level
|
|
- Provider initialization at startup
|
|
|
|
### Solution
|
|
|
|
```typescript
|
|
// ❌ BAD: Top-level imports cause startup overhead
|
|
import { createWorkersAI } from 'workers-ai-provider';
|
|
import { generateText } from 'ai';
|
|
import { complexSchema } from './schemas'; // Heavy Zod schemas
|
|
|
|
const workersai = createWorkersAI({ binding: env.AI }); // Runs at startup!
|
|
|
|
// ✅ GOOD: Lazy initialization inside handler
|
|
export default {
|
|
async fetch(request, env) {
|
|
// Import inside handler
|
|
const { createWorkersAI } = await import('workers-ai-provider');
|
|
const { generateText } = await import('ai');
|
|
|
|
const workersai = createWorkersAI({ binding: env.AI });
|
|
|
|
const result = await generateText({
|
|
model: workersai('@cf/meta/llama-3.1-8b-instruct'),
|
|
prompt: 'Hello',
|
|
});
|
|
|
|
return new Response(result.text);
|
|
}
|
|
};
|
|
```
|
|
|
|
### Alternative Solution (Move Schemas Inside Routes)
|
|
|
|
```typescript
|
|
// ❌ BAD: Top-level schema
|
|
import { z } from 'zod';
|
|
const PersonSchema = z.object({ /* complex schema */ });
|
|
|
|
// ✅ GOOD: Schema inside handler
|
|
export default {
|
|
async fetch(request, env) {
|
|
const { z } = await import('zod');
|
|
const PersonSchema = z.object({ /* complex schema */ });
|
|
|
|
// Use schema here
|
|
}
|
|
};
|
|
```
|
|
|
|
### Prevention
|
|
|
|
- Never initialize AI SDK at module top-level in Workers
|
|
- Move all imports inside route handlers
|
|
- Minimize top-level Zod schemas
|
|
- Monitor Worker startup time: `wrangler deploy` shows startup duration
|
|
- Target < 270ms startup time to be safe (limit is 400ms)
|
|
|
|
### Resources
|
|
|
|
- Cloudflare Workers AI Docs: https://developers.cloudflare.com/workers-ai/configuration/ai-sdk/
|
|
- GitHub: Search "Workers startup limit" in Vercel AI SDK issues
|
|
|
|
---
|
|
|
|
## 4. streamText Fails Silently
|
|
|
|
**Type:** Streaming Error
|
|
**Frequency:** Occasional
|
|
**Severity:** Medium (hard to debug)
|
|
|
|
### Cause
|
|
|
|
Stream errors are swallowed by `createDataStreamResponse()` or framework response handling:
|
|
- Error occurs during streaming
|
|
- Error handler not set up
|
|
- Response already committed
|
|
- Client disconnects
|
|
|
|
### Solution
|
|
|
|
```typescript
|
|
// ✅ GOOD: Add explicit error handling
|
|
const stream = streamText({
|
|
model: openai('gpt-4'),
|
|
prompt: 'Hello',
|
|
});
|
|
|
|
try {
|
|
for await (const chunk of stream.textStream) {
|
|
process.stdout.write(chunk);
|
|
}
|
|
} catch (error) {
|
|
// Error may not reach here if stream swallows it
|
|
console.error('Stream error:', error);
|
|
}
|
|
|
|
// ✅ BETTER: Always log on server side
|
|
console.log('Starting stream...');
|
|
const stream = streamText({
|
|
model: openai('gpt-4'),
|
|
prompt: 'Hello',
|
|
});
|
|
|
|
stream.result.then(
|
|
(result) => console.log('Stream success:', result.usage),
|
|
(error) => console.error('Stream failed:', error) // This will catch errors!
|
|
);
|
|
|
|
return stream.toDataStreamResponse();
|
|
```
|
|
|
|
### Prevention
|
|
|
|
- Always check server logs for stream errors
|
|
- Implement server-side error monitoring (e.g., Sentry)
|
|
- Test stream error handling explicitly
|
|
- Use `try-catch` around stream consumption
|
|
- Monitor for unexpected stream terminations
|
|
|
|
### Resources
|
|
|
|
- GitHub Issue: #4726
|
|
|
|
---
|
|
|
|
## 5. AI_LoadAPIKeyError
|
|
|
|
**Type:** Configuration Error
|
|
**Frequency:** Very Common (setup)
|
|
**Severity:** High (blocks usage)
|
|
|
|
### Cause
|
|
|
|
API key missing or invalid:
|
|
- `.env` file not loaded
|
|
- Wrong environment variable name
|
|
- API key format invalid
|
|
- Environment variable not set in deployment
|
|
|
|
### Solution
|
|
|
|
```typescript
|
|
import { AI_LoadAPIKeyError } from 'ai';
|
|
|
|
try {
|
|
const result = await generateText({
|
|
model: openai('gpt-4'),
|
|
prompt: 'Hello',
|
|
});
|
|
} catch (error) {
|
|
if (error instanceof AI_LoadAPIKeyError) {
|
|
console.error('API key error:', error.message);
|
|
|
|
// Debugging steps:
|
|
console.log('OPENAI_API_KEY exists:', !!process.env.OPENAI_API_KEY);
|
|
console.log('Key starts with sk-:', process.env.OPENAI_API_KEY?.startsWith('sk-'));
|
|
|
|
// Common issues:
|
|
// 1. .env not loaded → use dotenv or similar
|
|
// 2. Wrong variable name → check provider docs
|
|
// 3. Key format wrong → verify in provider dashboard
|
|
}
|
|
}
|
|
```
|
|
|
|
### Prevention
|
|
|
|
```typescript
|
|
// Validate at startup
|
|
function validateEnv() {
|
|
const required = ['OPENAI_API_KEY', 'ANTHROPIC_API_KEY'];
|
|
|
|
for (const key of required) {
|
|
if (!process.env[key]) {
|
|
throw new Error(`Missing required environment variable: ${key}`);
|
|
}
|
|
}
|
|
}
|
|
|
|
validateEnv();
|
|
```
|
|
|
|
### Environment Variable Names
|
|
|
|
| Provider | Variable Name |
|
|
|----------|---------------|
|
|
| OpenAI | `OPENAI_API_KEY` |
|
|
| Anthropic | `ANTHROPIC_API_KEY` |
|
|
| Google | `GOOGLE_GENERATIVE_AI_API_KEY` |
|
|
|
|
### Resources
|
|
|
|
- Docs: https://ai-sdk.dev/docs/reference/ai-sdk-errors/ai-load-api-key-error
|
|
|
|
---
|
|
|
|
## 6. AI_InvalidArgumentError
|
|
|
|
**Type:** Validation Error
|
|
**Frequency:** Common (development)
|
|
**Severity:** Low (easy to fix)
|
|
|
|
### Cause
|
|
|
|
Invalid parameters passed to AI SDK function:
|
|
- Negative `maxOutputTokens`
|
|
- Invalid temperature (must be 0-2)
|
|
- Wrong parameter types
|
|
- Missing required parameters
|
|
|
|
### Solution
|
|
|
|
```typescript
|
|
import { AI_InvalidArgumentError } from 'ai';
|
|
|
|
try {
|
|
const result = await generateText({
|
|
model: openai('gpt-4'),
|
|
maxOutputTokens: -1, // ❌ Invalid!
|
|
temperature: 3.0, // ❌ Must be 0-2
|
|
prompt: 'Hello',
|
|
});
|
|
} catch (error) {
|
|
if (error instanceof AI_InvalidArgumentError) {
|
|
console.error('Invalid argument:', error.message);
|
|
// Fix: Check parameter types and values
|
|
}
|
|
}
|
|
```
|
|
|
|
### Prevention
|
|
|
|
- Use TypeScript for compile-time type checking
|
|
- Validate inputs before calling AI SDK functions
|
|
- Read function signatures carefully
|
|
- Check official docs for parameter constraints
|
|
- Use IDE autocomplete
|
|
|
|
### Resources
|
|
|
|
- Docs: https://ai-sdk.dev/docs/reference/ai-sdk-errors/ai-invalid-argument-error
|
|
|
|
---
|
|
|
|
## 7. AI_NoContentGeneratedError
|
|
|
|
**Type:** Generation Error
|
|
**Frequency:** Occasional
|
|
**Severity:** Medium
|
|
|
|
### Cause
|
|
|
|
Model generated no content:
|
|
- Safety filters blocked output
|
|
- Prompt triggered content policy
|
|
- Model configuration issue
|
|
- Empty prompt
|
|
|
|
### Solution
|
|
|
|
```typescript
|
|
import { AI_NoContentGeneratedError } from 'ai';
|
|
|
|
try {
|
|
const result = await generateText({
|
|
model: openai('gpt-4'),
|
|
prompt: 'Some potentially problematic prompt',
|
|
});
|
|
} catch (error) {
|
|
if (error instanceof AI_NoContentGeneratedError) {
|
|
console.error('No content generated');
|
|
|
|
// Return user-friendly message
|
|
return {
|
|
text: 'Unable to generate response. Please try different input.',
|
|
error: true,
|
|
};
|
|
}
|
|
}
|
|
```
|
|
|
|
### Prevention
|
|
|
|
- Sanitize user inputs
|
|
- Avoid prompts that may trigger safety filters
|
|
- Have fallback messaging
|
|
- Log occurrences for analysis
|
|
- Test with edge cases
|
|
|
|
### Resources
|
|
|
|
- Docs: https://ai-sdk.dev/docs/reference/ai-sdk-errors/ai-no-content-generated-error
|
|
|
|
---
|
|
|
|
## 8. AI_TypeValidationError
|
|
|
|
**Type:** Validation Error
|
|
**Frequency:** Common (with generateObject)
|
|
**Severity:** Medium
|
|
|
|
### Cause
|
|
|
|
Zod schema validation failed on generated output:
|
|
- Model output doesn't match schema
|
|
- Schema too strict
|
|
- Model misunderstood schema
|
|
- Invalid JSON generated
|
|
|
|
### Solution
|
|
|
|
```typescript
|
|
import { AI_TypeValidationError } from 'ai';
|
|
|
|
try {
|
|
const result = await generateObject({
|
|
model: openai('gpt-4'),
|
|
schema: z.object({
|
|
age: z.number().min(0).max(120), // Strict validation
|
|
email: z.string().email(), // Strict format
|
|
}),
|
|
prompt: 'Generate person',
|
|
});
|
|
} catch (error) {
|
|
if (error instanceof AI_TypeValidationError) {
|
|
console.error('Validation failed:', error.message);
|
|
|
|
// Solutions:
|
|
// 1. Relax schema
|
|
const relaxed = z.object({
|
|
age: z.number(), // Remove min/max
|
|
email: z.string().optional(), // Make optional
|
|
});
|
|
|
|
// 2. Add guidance in prompt
|
|
const better = await generateObject({
|
|
model: openai('gpt-4'),
|
|
schema: relaxed,
|
|
prompt: 'Generate person with age 18-80 and valid email',
|
|
});
|
|
}
|
|
}
|
|
```
|
|
|
|
### Prevention
|
|
|
|
- Start with lenient schemas, tighten gradually
|
|
- Use `.optional()` for unreliable fields
|
|
- Add validation hints in field descriptions
|
|
- Test with various prompts
|
|
- Use mode: 'json' when available
|
|
|
|
### Resources
|
|
|
|
- Docs: https://ai-sdk.dev/docs/reference/ai-sdk-errors/ai-type-validation-error
|
|
|
|
---
|
|
|
|
## 9. AI_RetryError
|
|
|
|
**Type:** Network Error
|
|
**Frequency:** Occasional
|
|
**Severity:** High
|
|
|
|
### Cause
|
|
|
|
All retry attempts failed:
|
|
- Persistent network issue
|
|
- Provider outage
|
|
- Invalid configuration
|
|
- Unreachable API endpoint
|
|
|
|
### Solution
|
|
|
|
```typescript
|
|
import { AI_RetryError } from 'ai';
|
|
|
|
try {
|
|
const result = await generateText({
|
|
model: openai('gpt-4'),
|
|
prompt: 'Hello',
|
|
maxRetries: 3, // Default is 2
|
|
});
|
|
} catch (error) {
|
|
if (error instanceof AI_RetryError) {
|
|
console.error('All retries failed');
|
|
console.error('Last error:', error.lastError);
|
|
console.error('Retry count:', error.retryCount);
|
|
|
|
// Implement circuit breaker
|
|
if (isProviderDown()) {
|
|
switchToFallbackProvider();
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Prevention
|
|
|
|
- Investigate root cause of failures
|
|
- Adjust retry configuration if needed
|
|
- Implement circuit breaker pattern
|
|
- Have fallback providers
|
|
- Monitor provider status pages
|
|
|
|
### Resources
|
|
|
|
- Docs: https://ai-sdk.dev/docs/reference/ai-sdk-errors/ai-retry-error
|
|
|
|
---
|
|
|
|
## 10. Rate Limiting Errors
|
|
|
|
**Type:** API Limit Error
|
|
**Frequency:** Common (production)
|
|
**Severity:** High
|
|
|
|
### Cause
|
|
|
|
Exceeded provider rate limits:
|
|
- RPM (Requests Per Minute) exceeded
|
|
- TPM (Tokens Per Minute) exceeded
|
|
- Concurrent request limit hit
|
|
- Free tier limits reached
|
|
|
|
### Solution
|
|
|
|
```typescript
|
|
// Implement exponential backoff
|
|
async function generateWithBackoff(prompt: string, retries = 3) {
|
|
for (let i = 0; i < retries; i++) {
|
|
try {
|
|
return await generateText({
|
|
model: openai('gpt-4'),
|
|
prompt,
|
|
});
|
|
} catch (error: any) {
|
|
if (error.statusCode === 429) {
|
|
const delay = Math.pow(2, i) * 1000; // 1s, 2s, 4s, 8s...
|
|
console.log(`Rate limited, waiting ${delay}ms`);
|
|
await new Promise(resolve => setTimeout(resolve, delay));
|
|
} else {
|
|
throw error;
|
|
}
|
|
}
|
|
}
|
|
throw new Error('Rate limit retries exhausted');
|
|
}
|
|
|
|
// Or use queue
|
|
import PQueue from 'p-queue';
|
|
|
|
const queue = new PQueue({ concurrency: 5, interval: 60000, intervalCap: 50 });
|
|
|
|
async function generateQueued(prompt: string) {
|
|
return queue.add(() => generateText({ model: openai('gpt-4'), prompt }));
|
|
}
|
|
```
|
|
|
|
### Prevention
|
|
|
|
- Monitor rate limit headers in responses
|
|
- Queue requests to stay under limits
|
|
- Upgrade provider tier if needed
|
|
- Implement request throttling
|
|
- Cache results when possible
|
|
|
|
### Resources
|
|
|
|
- OpenAI Rate Limits: https://platform.openai.com/account/rate-limits
|
|
- Anthropic Rate Limits: https://docs.anthropic.com/en/api/rate-limits
|
|
|
|
---
|
|
|
|
## 11. TypeScript Performance with Zod
|
|
|
|
**Type:** Development Issue
|
|
**Frequency:** Occasional
|
|
**Severity:** Low (annoying)
|
|
|
|
### Cause
|
|
|
|
Complex Zod schemas slow down TypeScript type checking:
|
|
- Deeply nested schemas
|
|
- Many union types
|
|
- Recursive types
|
|
- Top-level complex schemas
|
|
|
|
### Solution
|
|
|
|
```typescript
|
|
// ❌ BAD: Complex schema at top level
|
|
const ComplexSchema = z.object({
|
|
// 100+ fields with nested objects...
|
|
});
|
|
|
|
// ✅ GOOD: Define inside function
|
|
function generateData() {
|
|
const schema = z.object({
|
|
// Complex schema here
|
|
});
|
|
|
|
return generateObject({ model: openai('gpt-4'), schema, prompt: '...' });
|
|
}
|
|
|
|
// ✅ GOOD: Use z.lazy() for recursive
|
|
type Category = { name: string; subcategories?: Category[] };
|
|
|
|
const CategorySchema: z.ZodType<Category> = z.lazy(() =>
|
|
z.object({
|
|
name: z.string(),
|
|
subcategories: z.array(CategorySchema).optional(),
|
|
})
|
|
);
|
|
|
|
// ✅ GOOD: Split large schemas
|
|
const AddressSchema = z.object({ /* ... */ });
|
|
const PersonSchema = z.object({
|
|
address: AddressSchema, // Reuse smaller schema
|
|
});
|
|
```
|
|
|
|
### Prevention
|
|
|
|
- Avoid top-level complex schemas
|
|
- Use `z.lazy()` for recursive types
|
|
- Split large schemas into smaller ones
|
|
- Use type assertions where appropriate
|
|
- Enable `skipLibCheck` in tsconfig.json if desperate
|
|
|
|
### Resources
|
|
|
|
- Troubleshooting: https://ai-sdk.dev/docs/troubleshooting/common-issues/slow-type-checking
|
|
|
|
---
|
|
|
|
## 12. Invalid JSON Response (Provider-Specific)
|
|
|
|
**Type:** Provider Issue
|
|
**Frequency:** Rare
|
|
**Severity:** Medium
|
|
|
|
### Cause
|
|
|
|
Some models occasionally return invalid JSON:
|
|
- Model error
|
|
- Provider API issue
|
|
- Specific model version bug (e.g., Imagen 3.0)
|
|
|
|
### Solution
|
|
|
|
```typescript
|
|
// Use built-in retry and mode selection
|
|
try {
|
|
const result = await generateObject({
|
|
model: openai('gpt-4'),
|
|
schema: mySchema,
|
|
prompt: 'Generate data',
|
|
mode: 'json', // Force JSON mode (GPT-4 supports this)
|
|
maxRetries: 3, // Retry on invalid JSON
|
|
});
|
|
} catch (error) {
|
|
// Fallback to different model
|
|
console.error('GPT-4 failed, trying Claude...');
|
|
const result2 = await generateObject({
|
|
model: anthropic('claude-3-5-sonnet-20241022'),
|
|
schema: mySchema,
|
|
prompt: 'Generate data',
|
|
});
|
|
}
|
|
```
|
|
|
|
### Prevention
|
|
|
|
- Use `mode: 'json'` when available
|
|
- Prefer GPT-4/Claude for structured output
|
|
- Implement retry logic
|
|
- Validate responses
|
|
- Have fallback models
|
|
|
|
### Resources
|
|
|
|
- GitHub Issue: #4302 (Imagen 3.0 Invalid JSON)
|
|
|
|
---
|
|
|
|
## For More Errors
|
|
|
|
See complete error reference (28 total error types):
|
|
https://ai-sdk.dev/docs/reference/ai-sdk-errors
|
|
|
|
---
|
|
|
|
**Last Updated:** 2025-10-21
|