claude-flow-multilang
Version:
Revolutionary multilingual AI orchestration framework with cultural awareness and DDD architecture
248 lines (234 loc) • 6.67 kB
text/typescript
/**
* Claude API specific error types with enhanced error handling
*/
import { ClaudeFlowError } from '../utils/errors.js';
/**
* Base error class for Claude API errors
*/
export class ClaudeAPIError extends ClaudeFlowError {
constructor(
message: string,
public readonly statusCode?: number,
public readonly retryable: boolean = false,
details?: unknown,
) {
super(message, 'CLAUDE_API_ERROR', details);
this.name = 'ClaudeAPIError';
}
}
/**
* Error for 500 Internal Server Error
*/
export class ClaudeInternalServerError extends ClaudeAPIError {
constructor(message: string, details?: unknown) {
super(
message || 'Claude API internal server error. The service may be temporarily unavailable.',
500,
true, // Retryable
details,
);
this.name = 'ClaudeInternalServerError';
}
}
/**
* Error for 503 Service Unavailable
*/
export class ClaudeServiceUnavailableError extends ClaudeAPIError {
constructor(message: string, details?: unknown) {
super(
message || 'Claude API service is temporarily unavailable. Please try again later.',
503,
true, // Retryable
details,
);
this.name = 'ClaudeServiceUnavailableError';
}
}
/**
* Error for 429 Too Many Requests (Rate Limit)
*/
export class ClaudeRateLimitError extends ClaudeAPIError {
constructor(
message: string,
public readonly retryAfter?: number,
details?: unknown,
) {
super(
message || 'Rate limit exceeded. Please wait before making more requests.',
429,
true, // Retryable
details,
);
this.name = 'ClaudeRateLimitError';
}
}
/**
* Error for network timeouts
*/
export class ClaudeTimeoutError extends ClaudeAPIError {
constructor(message: string, public readonly timeout: number, details?: unknown) {
super(
message || `Request timed out after ${timeout}ms. The API may be slow or unreachable.`,
undefined,
true, // Retryable
details,
);
this.name = 'ClaudeTimeoutError';
}
}
/**
* Error for network-related issues
*/
export class ClaudeNetworkError extends ClaudeAPIError {
constructor(message: string, details?: unknown) {
super(
message || 'Network error occurred. Please check your internet connection.',
undefined,
true, // Retryable
details,
);
this.name = 'ClaudeNetworkError';
}
}
/**
* Error for authentication issues
*/
export class ClaudeAuthenticationError extends ClaudeAPIError {
constructor(message: string, details?: unknown) {
super(
message || 'Authentication failed. Please check your API key.',
401,
false, // Not retryable
details,
);
this.name = 'ClaudeAuthenticationError';
}
}
/**
* Error for invalid requests
*/
export class ClaudeValidationError extends ClaudeAPIError {
constructor(message: string, details?: unknown) {
super(
message || 'Invalid request. Please check your parameters.',
400,
false, // Not retryable
details,
);
this.name = 'ClaudeValidationError';
}
}
/**
* Health check result
*/
export interface HealthCheckResult {
healthy: boolean;
latency?: number;
error?: string;
timestamp: Date;
}
/**
* User-friendly error messages and fallback suggestions
*/
export const ERROR_MESSAGES = {
INTERNAL_SERVER_ERROR: {
title: 'Claude API Service Error',
message: 'The Claude API is experiencing technical difficulties.',
suggestions: [
'Wait a few minutes and try again',
'Check the Anthropic status page for service updates',
'Consider using a fallback AI service if available',
'Cache previous responses for offline usage',
],
},
SERVICE_UNAVAILABLE: {
title: 'Service Temporarily Unavailable',
message: 'Claude API is temporarily unavailable or undergoing maintenance.',
suggestions: [
'Try again in 5-10 minutes',
'Check if there\'s scheduled maintenance',
'Use cached responses if available',
'Consider implementing a queue for requests',
],
},
RATE_LIMIT: {
title: 'Rate Limit Exceeded',
message: 'You\'ve made too many requests to the Claude API.',
suggestions: [
'Implement request throttling',
'Batch multiple requests together',
'Consider upgrading your API plan',
'Use exponential backoff for retries',
],
},
TIMEOUT: {
title: 'Request Timeout',
message: 'The request took too long to complete.',
suggestions: [
'Check your internet connection',
'Try a simpler request',
'Increase the timeout duration',
'Break large requests into smaller ones',
],
},
NETWORK_ERROR: {
title: 'Network Connection Error',
message: 'Unable to connect to the Claude API.',
suggestions: [
'Check your internet connection',
'Verify firewall/proxy settings',
'Try using a different network',
'Check if the API endpoint is correct',
],
},
AUTHENTICATION: {
title: 'Authentication Failed',
message: 'Unable to authenticate with the Claude API.',
suggestions: [
'Verify your API key is correct',
'Check if your API key has expired',
'Ensure the API key has proper permissions',
'Generate a new API key if needed',
],
},
VALIDATION: {
title: 'Invalid Request',
message: 'The request contains invalid parameters.',
suggestions: [
'Check the request parameters',
'Verify the model name is correct',
'Ensure message format is valid',
'Review the API documentation',
],
},
};
/**
* Get user-friendly error information
*/
export function getUserFriendlyError(error: ClaudeAPIError): {
title: string;
message: string;
suggestions: string[];
retryable: boolean;
} {
let errorInfo = ERROR_MESSAGES.INTERNAL_SERVER_ERROR; // Default
if (error instanceof ClaudeInternalServerError) {
errorInfo = ERROR_MESSAGES.INTERNAL_SERVER_ERROR;
} else if (error instanceof ClaudeServiceUnavailableError) {
errorInfo = ERROR_MESSAGES.SERVICE_UNAVAILABLE;
} else if (error instanceof ClaudeRateLimitError) {
errorInfo = ERROR_MESSAGES.RATE_LIMIT;
} else if (error instanceof ClaudeTimeoutError) {
errorInfo = ERROR_MESSAGES.TIMEOUT;
} else if (error instanceof ClaudeNetworkError) {
errorInfo = ERROR_MESSAGES.NETWORK_ERROR;
} else if (error instanceof ClaudeAuthenticationError) {
errorInfo = ERROR_MESSAGES.AUTHENTICATION;
} else if (error instanceof ClaudeValidationError) {
errorInfo = ERROR_MESSAGES.VALIDATION;
}
return {
...errorInfo,
retryable: error.retryable,
};
}