Error Codes
Understand and handle ModelPilot API errors effectively.
Error Response Format
Standard Error Structure
json
{
"error": {
"message": "Human-readable error message",
"type": "error_type",
"code": "specific_error_code",
"param": "parameter_name", // Optional
"retry_after": 60 // Optional, for rate limits
}
}HTTP Status Codes
400
Bad Request
The request was invalid or cannot be served
json
{
"error": {
"message": "Invalid request: missing required field 'messages'",
"type": "validation_error",
"code": "missing_required_field",
"param": "messages"
}
}401
Unauthorized
Authentication failed or API key is missing
json
{
"error": {
"message": "Invalid API key provided",
"type": "authentication_error",
"code": "invalid_api_key"
}
}403
Forbidden
Valid authentication but insufficient permissions
json
{
"error": {
"message": "You do not have access to this router",
"type": "authorization_error",
"code": "router_access_denied"
}
}404
Not Found
The requested resource doesn't exist
json
{
"error": {
"message": "Router not found",
"type": "not_found_error",
"code": "router_not_found"
}
}429
Too Many Requests
Rate limit exceeded
json
{
"error": {
"message": "Rate limit exceeded",
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"retry_after": 42
}
}500
Internal Server Error
Something went wrong on our end
json
{
"error": {
"message": "Internal server error",
"type": "internal_error",
"code": "internal_error"
}
}502
Bad Gateway
Error communicating with upstream AI provider
json
{
"error": {
"message": "Provider error: OpenAI API unavailable",
"type": "provider_error",
"code": "provider_error"
}
}503
Service Unavailable
Service temporarily unavailable
json
{
"error": {
"message": "Service temporarily unavailable",
"type": "service_unavailable_error",
"code": "service_unavailable"
}
}Common Error Types
Authentication Errors
invalid_api_key- API key is invalid or expiredmissing_api_key- No API key providedrevoked_api_key- API key has been revoked
Router Errors
router_not_found- Router ID doesn't existrouter_inactive- Router is disabledrouter_access_denied- No permission to use this router
Billing Errors
insufficient_credits- Not enough credits for requestpayment_required- Payment method requiredsubscription_expired- Subscription has expired
Model Errors
model_not_available- Requested model unavailablecontext_length_exceeded- Input too long for modelinvalid_model- Model not supported
Handling Errors
Try-Catch Pattern
javascript
import ModelPilot from 'modelpilot';
const client = new ModelPilot({
apiKey: process.env.MODELPILOT_API_KEY,
routerId: process.env.MODELPILOT_ROUTER_ID,
});
try {
const completion = await client.chat.completions.create({
messages: [{ role: 'user', content: 'Hello!' }],
});
console.log(completion.choices[0].message.content);
} catch (error) {
// Handle specific error types
if (error.status === 401) {
console.error('Authentication failed:', error.message);
// Refresh API key
} else if (error.status === 429) {
console.error('Rate limit exceeded');
// Wait and retry
const retryAfter = error.retry_after || 60;
await new Promise(r => setTimeout(r, retryAfter * 1000));
} else if (error.status === 402) {
console.error('Insufficient credits');
// Redirect to billing page
} else {
console.error('API error:', error.message);
}
}Error Type Checking
javascript
try {
const completion = await client.chat.completions.create({
messages: [{ role: 'user', content: 'Hello!' }],
});
} catch (error) {
switch (error.type) {
case 'authentication_error':
// Handle authentication issues
break;
case 'rate_limit_error':
// Handle rate limiting
break;
case 'insufficient_credits':
// Handle billing issues
break;
case 'provider_error':
// Upstream provider issue
break;
default:
// Generic error handling
console.error('Unexpected error:', error);
}
}Best Practices
- Always handle errors gracefully
Never expose raw error messages to end users
- Implement retry logic
Use exponential backoff for transient errors
- Log errors for debugging
Include request IDs and context
- Monitor error rates
Set up alerts for unusual error patterns