UNPKG

@juspay/neurolink

Version:

Universal AI Development Platform with working MCP integration, multi-provider support, voice (TTS/STT/realtime), and professional CLI. 58+ external MCP servers discoverable, multimodal file processing, RAG pipelines. Build, test, and deploy AI applicatio

267 lines (266 loc) 10.2 kB
/** * Retry and Circuit Breaker Constants for NeuroLink * * Centralized retry configuration to replace magic numbers throughout the codebase. * Includes retry attempts, delays, backoff strategies, and circuit breaker settings. * * @fileoverview Retry and resilience constants for robust error handling * @author NeuroLink Team * @version 1.0.0 */ /** * Retry attempt configuration * Balanced for reliability vs performance across different operation types */ export const RETRY_ATTEMPTS = { /** Default retry attempts for most operations */ DEFAULT: 3, // 3 attempts - Balance reliability vs speed /** Critical operations that must succeed */ CRITICAL: 5, // 5 attempts - High-importance operations /** Quick operations that should fail fast */ QUICK: 1, // 1 attempt, no retries — fail fast /** Network operations prone to transient failures */ NETWORK: 4, // 4 attempts - Network operations /** Authentication operations */ AUTH: 2, // 2 attempts - Auth should fail fast for security /** Database operations */ DATABASE: 3, // 3 attempts - Standard DB operations /** File I/O operations */ FILE_IO: 2, // 2 attempts - File operations }; /** * Retry delay configuration * Configured to prevent overwhelming services while providing quick recovery */ export const RETRY_DELAYS = { /** Base delay for exponential backoff */ BASE_MS: 1000, // 1s - Starting delay /** Minimum delay between retries */ MIN_MS: 500, // 500ms - Minimum wait time /** Maximum delay between retries */ MAX_MS: 30000, // 30s - Maximum wait time /** Quick retry delay for fast operations */ QUICK_MS: 200, // 200ms - Fast retry for quick operations /** Network operation base delay */ NETWORK_BASE_MS: 2000, // 2s - Network-specific base delay /** Authentication delay (security consideration) */ AUTH_MS: 3000, // 3s - Auth retry delay for security }; /** * Exponential backoff configuration * Controls how delays increase with each retry attempt */ export const BACKOFF_CONFIG = { /** Standard exponential multiplier */ MULTIPLIER: 2, // 2x - Standard exponential backoff /** Conservative multiplier for sensitive operations */ CONSERVATIVE_MULTIPLIER: 1.5, // 1.5x - Gentler backoff /** Aggressive multiplier for operations that should back off quickly */ AGGRESSIVE_MULTIPLIER: 3, // 3x - Rapid backoff /** Jitter factor to prevent thundering herd */ JITTER_FACTOR: 0.1, // 10% - Random jitter /** Maximum jitter amount in milliseconds */ MAX_JITTER_MS: 1000, // 1s - Cap on random jitter }; /** * Circuit breaker configuration * Prevents cascading failures and provides automatic recovery */ export const CIRCUIT_BREAKER = { /** Failure threshold before opening circuit */ FAILURE_THRESHOLD: 5, // 5 failures - Balance sensitivity vs stability /** Success threshold for closing circuit from half-open */ SUCCESS_THRESHOLD: 3, // 3 successes - Confirm recovery /** Minimum calls before calculating failure rate */ MIN_CALLS: 10, // 10 calls - Statistical significance /** Failure rate threshold (0.0 to 1.0) */ FAILURE_RATE_THRESHOLD: 0.5, // 50% - Failure rate to open circuit /** Monitoring window for failure tracking */ MONITORING_WINDOW_MS: 300000, // 5m - Sliding window for statistics /** Half-open max calls for testing recovery */ HALF_OPEN_MAX_CALLS: 3, // 3 calls - Limited test calls }; /** * Provider-specific retry configuration * Different providers may need different retry strategies */ export const PROVIDER_RETRY = { /** OpenAI retry configuration */ OPENAI: { maxAttempts: RETRY_ATTEMPTS.DEFAULT, baseDelay: RETRY_DELAYS.BASE_MS, maxDelay: RETRY_DELAYS.MAX_MS, multiplier: BACKOFF_CONFIG.MULTIPLIER, }, /** Anthropic retry configuration */ ANTHROPIC: { maxAttempts: RETRY_ATTEMPTS.DEFAULT, baseDelay: RETRY_DELAYS.BASE_MS, maxDelay: RETRY_DELAYS.MAX_MS, multiplier: BACKOFF_CONFIG.CONSERVATIVE_MULTIPLIER, // More conservative }, /** Google (Vertex/Google AI) retry configuration */ GOOGLE: { maxAttempts: RETRY_ATTEMPTS.NETWORK, baseDelay: RETRY_DELAYS.NETWORK_BASE_MS, maxDelay: RETRY_DELAYS.MAX_MS, multiplier: BACKOFF_CONFIG.MULTIPLIER, }, /** AWS Bedrock retry configuration */ BEDROCK: { maxAttempts: RETRY_ATTEMPTS.CRITICAL, baseDelay: RETRY_DELAYS.BASE_MS, maxDelay: RETRY_DELAYS.MAX_MS, multiplier: BACKOFF_CONFIG.CONSERVATIVE_MULTIPLIER, }, /** Azure OpenAI retry configuration */ AZURE: { maxAttempts: RETRY_ATTEMPTS.DEFAULT, baseDelay: RETRY_DELAYS.BASE_MS, maxDelay: RETRY_DELAYS.MAX_MS, multiplier: BACKOFF_CONFIG.MULTIPLIER, }, /** Ollama retry configuration (local service) */ OLLAMA: { maxAttempts: RETRY_ATTEMPTS.QUICK, baseDelay: RETRY_DELAYS.QUICK_MS, maxDelay: 5000, // 5s max for local service multiplier: BACKOFF_CONFIG.CONSERVATIVE_MULTIPLIER, }, }; /** * Operation-specific retry configuration * Different operations may require different retry strategies */ export const OPERATION_RETRY = { /** Tool execution retry config */ TOOL_EXECUTION: { maxAttempts: RETRY_ATTEMPTS.DEFAULT, baseDelay: RETRY_DELAYS.BASE_MS, circuitBreaker: true, }, /** MCP operation retry config */ MCP_OPERATION: { maxAttempts: RETRY_ATTEMPTS.QUICK, baseDelay: RETRY_DELAYS.QUICK_MS, circuitBreaker: false, // MCP operations are usually fast }, /** Network request retry config */ NETWORK_REQUEST: { maxAttempts: RETRY_ATTEMPTS.NETWORK, baseDelay: RETRY_DELAYS.NETWORK_BASE_MS, circuitBreaker: true, }, /** Database operation retry config */ DATABASE_OPERATION: { maxAttempts: RETRY_ATTEMPTS.DATABASE, baseDelay: RETRY_DELAYS.BASE_MS, circuitBreaker: true, }, /** Authentication retry config */ AUTHENTICATION: { maxAttempts: RETRY_ATTEMPTS.AUTH, baseDelay: RETRY_DELAYS.AUTH_MS, circuitBreaker: false, // Don't circuit break auth for security }, }; /** * Retry utility functions */ export const RetryUtils = { /** * Calculate exponential backoff delay * @param attempt - Current attempt number (0-based) * @param baseDelay - Base delay in milliseconds * @param multiplier - Exponential multiplier * @param maxDelay - Maximum delay cap * @param jitter - Whether to add random jitter * @returns Calculated delay in milliseconds */ calculateBackoffDelay: (attempt, baseDelay = RETRY_DELAYS.BASE_MS, multiplier = BACKOFF_CONFIG.MULTIPLIER, maxDelay = RETRY_DELAYS.MAX_MS, jitter = true) => { const safeAttempt = Math.max(0, attempt); const base = Math.max(baseDelay, RETRY_DELAYS.MIN_MS); const delay = Math.min(base * Math.pow(multiplier, safeAttempt), maxDelay); if (!jitter) { return delay; } const jitterCap = Math.min(BACKOFF_CONFIG.MAX_JITTER_MS, delay * BACKOFF_CONFIG.JITTER_FACTOR); return Math.min(maxDelay, Math.floor(delay + Math.random() * jitterCap)); }, /** * Check if an error is retriable * @param error - The error to check * @returns True if the error should be retried */ isRetriableError: (error) => { if (!error) { return false; } const err = error; // Network/system codes const code = typeof err?.code === "string" ? err.code : undefined; if (code && ["ENOTFOUND", "ECONNRESET", "ETIMEDOUT", "ECONNREFUSED"].includes(code)) { return true; } // HTTP status const status = typeof err?.status === "number" ? err.status : typeof err?.statusCode === "number" ? err.statusCode : undefined; if (typeof status === "number" && (status >= 500 || status === 429 || status === 408)) { return true; } // Messages const msg = typeof err?.message === "string" ? err.message.toLowerCase() : ""; if (msg.includes("rate limit") || msg.includes("quota") || msg.includes("throttle")) { return true; } if (msg.includes("timeout")) { return true; } return false; }, /** * Get retry configuration for a specific provider * @param provider - Provider name * @returns Retry configuration object */ getProviderRetryConfig: (provider) => { const normalizedProvider = provider.toLowerCase().replace(/[-_]/g, ""); switch (normalizedProvider) { case "openai": return PROVIDER_RETRY.OPENAI; case "anthropic": return PROVIDER_RETRY.ANTHROPIC; case "googleai": case "vertex": return PROVIDER_RETRY.GOOGLE; case "bedrock": return PROVIDER_RETRY.BEDROCK; case "azure": return PROVIDER_RETRY.AZURE; case "ollama": return PROVIDER_RETRY.OLLAMA; default: return { maxAttempts: RETRY_ATTEMPTS.DEFAULT, baseDelay: RETRY_DELAYS.BASE_MS, maxDelay: RETRY_DELAYS.MAX_MS, multiplier: BACKOFF_CONFIG.MULTIPLIER, }; } }, }; // Legacy compatibility exports export const DEFAULT_RETRY_ATTEMPTS = RETRY_ATTEMPTS.DEFAULT; export const DEFAULT_INITIAL_DELAY = RETRY_DELAYS.BASE_MS; export const DEFAULT_MAX_DELAY = RETRY_DELAYS.MAX_MS; export const DEFAULT_BACKOFF_MULTIPLIER = BACKOFF_CONFIG.MULTIPLIER; export const CIRCUIT_BREAKER_FAILURE_THRESHOLD = CIRCUIT_BREAKER.FAILURE_THRESHOLD; // Single source of truth: re-export from timeouts export { CIRCUIT_BREAKER_RESET_MS } from "./timeouts.js";