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

72 lines (71 loc) 2.44 kB
export function inferClaudeProxyModelTier(modelName) { const normalized = modelName.toLowerCase(); if (normalized.includes("opus")) { return "opus"; } if (normalized.includes("sonnet")) { return "sonnet"; } if (normalized.includes("haiku")) { return "haiku"; } return "other"; } /** * Build a translation plan for a Claude-compatible proxy request. * The plan lists the primary provider followed by eligible fallback targets. * All configured fallback entries are always eligible — no contract-based gating. * When no fallback chain is configured, an "auto-provider" entry is appended. */ export function buildProxyTranslationPlan(primary, fallbackChain, requestedModel, _parsed) { const attempts = [ { provider: primary.provider, model: primary.model, label: `${primary.provider}/${primary.model ?? "unknown"}`, }, ]; for (const fallback of fallbackChain) { if (fallback.provider === primary.provider && fallback.model === primary.model) { continue; } attempts.push({ provider: fallback.provider, model: fallback.model, label: `${fallback.provider}/${fallback.model}`, }); } // Append auto-provider when no configured fallback chain exists, // or when all configured entries were deduped (same as primary). if (fallbackChain.length === 0 || attempts.length === 1) { attempts.push({ label: "auto-provider" }); } return { requestedModel, modelTier: inferClaudeProxyModelTier(requestedModel), attempts, skipped: [], }; } // --------------------------------------------------------------------------- // Retry-after parsing helper // --------------------------------------------------------------------------- /** * Parse the retry-after header from an upstream 429 response. * Returns milliseconds to wait, or 0 if no valid header present. */ export function parseRetryAfterMs(retryAfterHeader) { if (!retryAfterHeader) { return 0; } const seconds = parseInt(retryAfterHeader, 10); if (!Number.isNaN(seconds)) { return Math.max(1, seconds) * 1000; } const date = new Date(retryAfterHeader); if (!Number.isNaN(date.getTime())) { return Math.max(1000, date.getTime() - Date.now()); } return 0; }