@agentproto/llm-endpoint 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -1
- package/dist/cli.mjs +97 -32
- package/dist/cli.mjs.map +1 -1
- package/dist/index.d.ts +78 -1
- package/dist/index.mjs +243 -33
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/packs.ts","../src/responses.ts","../src/batches.ts","../src/endpoints.ts","../src/index.ts"],"names":["httpRequest","resolvePath","homedir","path","readFileSync","httpsRequest","start","body"],"mappings":"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","file":"index.mjs","sourcesContent":["import { createHash } from 'crypto';\n\n/**\n * Capability tier of a route, coarse enough to map onto the four Claude\n * families. Used by {@link toAnthropicStyle} to pick a family prefix for the\n * generated Anthropic-shaped id (see {@link TIER_TO_FAMILY}).\n */\nexport type ModelTier = 'extra-high' | 'high' | 'medium' | 'small';\n\nexport interface ModelRoute {\n provider: string;\n model: string;\n /**\n * Optional Claude-shaped compatibility alias. Committed packs never hardcode\n * this — it is populated either by a local pack (loaded from\n * `packs.local.json`) or on demand by {@link toAnthropicStyle} when a request\n * opts into the Anthropic-style format. Committed packs use\n * provider-transparent model IDs and never pretend to be real Claude models.\n */\n equivalentClaudeName?: string;\n /**\n * Coarse capability tier. Only consumed by {@link toAnthropicStyle} to select\n * a Claude family for the generated alias; ignored on every routing path.\n */\n tier?: ModelTier;\n /**\n * Verified context window of the upstream route, in tokens. Surfaced in the\n * /v1/models metadata when present; never guessed — leave absent when the\n * limit for this specific route is not verified.\n */\n contextWindow?: number;\n /**\n * Verified max output tokens for the upstream route, in tokens. Same\n * honesty rule as {@link ModelRoute.contextWindow}.\n */\n maxOutputTokens?: number;\n}\n\n/**\n * A pack is a curated set of model routes. Packs solve the collision problem\n * when multiple providers share the same display name, and they let users opt\n * into local compatibility aliases for clients that only speak the Anthropic\n * model namespace.\n *\n * Selection methods:\n * - URL path: /v1/{packId}/messages → pack = {packId}\n * - Query param: /v1/messages?pack={packId}\n * - Header: X-Proxy-Pack: {packId}\n * - Default: no pack specified → uses 'default' pack\n */\n\nexport interface ModelPack {\n id: string;\n label: string;\n description: string;\n models: Record<string, ModelRoute>;\n /**\n * Exclude-list of tool-name patterns applied to every request routed through\n * this pack (wildcards allowed, e.g. \"mcp__*\"). Cuts upstream prefill cost\n * when a client (e.g. Claude Desktop) sends hundreds of tool definitions.\n * Applied after per-request header/query trims so an explicit client\n * X-Proxy-Tools allow-list still wins.\n */\n toolsExclude?: string[];\n /**\n * Allow-list of tool-name patterns applied to every request routed through\n * this pack (wildcards allowed). Kept only when no toolsAllow is set on the\n * request itself; a request-level ?tools=/X-Proxy-Tools always wins.\n */\n toolsAllow?: string[];\n}\n\n// ── Official packs (committed) ─────────────────────────────────────────────\n// These are public, provider-transparent model routes. They never contain\n// private codenames or bare Claude aliases mapping to non-Anthropic targets.\n// For Claude compatibility aliases, use a local pack (packs.local.json).\n\nexport const defaultPack: ModelPack = {\n id: 'default',\n label: 'Default transparent routes',\n description: 'Provider-transparent model IDs routed directly to each backend',\n models: {\n 'kimi-k3': { provider: 'moonshot', model: 'kimi-k3' },\n 'kimi-k2.7-code': { provider: 'moonshot', model: 'kimi-k2.7-code' },\n 'kimi-k2.6': { provider: 'moonshot', model: 'kimi-k2.6' },\n 'llama-3.3-70b-versatile': { provider: 'groq', model: 'llama-3.3-70b-versatile' },\n 'qwen/qwen3.6-27b': { provider: 'groq', model: 'qwen/qwen3.6-27b' },\n 'glm-5.2': { provider: 'zai', model: 'glm-5.2' },\n 'gpt-4.1': { provider: 'openai', model: 'gpt-4.1' },\n 'gpt-4o': { provider: 'openai', model: 'gpt-4o' },\n 'gpt-4o-mini': { provider: 'openai', model: 'gpt-4o-mini' },\n // OpenRouter-hosted GLM. Also reachable via the transparent\n // \"openrouter/z-ai/glm-5.3-flash\" reference, but a plain code is needed\n // for the `@llm-endpoint` daemon route, which forwards a bare\n // \"<vendor>/<model>\" string (one slash only) as the model field.\n 'z-ai/glm-5.3-flash': { provider: 'openrouter', model: 'z-ai/glm-5.3-flash' },\n },\n};\n\nexport const xaiPack: ModelPack = {\n id: 'xai',\n label: 'xAI (Grok)',\n description: 'xAI Grok models via the OpenAI-compatible API',\n models: {\n 'grok-4.5': { provider: 'xai', model: 'grok-4.5' },\n 'grok-4.3': { provider: 'xai', model: 'grok-4.3' },\n 'grok-4.20': { provider: 'xai', model: 'grok-4.20' },\n 'grok-build-0.1': { provider: 'xai', model: 'grok-build-0.1' },\n },\n};\n\n// Source: OpenRouter /api/v1/models (fetched 2026-07-16), filtered to openai/*\nexport const openaiPack: ModelPack = {\n id: 'openai',\n label: 'OpenAI',\n description: 'OpenAI models via the OpenAI-compatible API — synced from OpenRouter catalog',\n models: {\n // ── GPT-5.6 series ──\n 'gpt-5.6-luna': { provider: 'openai', model: 'gpt-5.6-luna' },\n 'gpt-5.6-luna-pro': { provider: 'openai', model: 'gpt-5.6-luna-pro' },\n 'gpt-5.6-terra': { provider: 'openai', model: 'gpt-5.6-terra' },\n 'gpt-5.6-terra-pro': { provider: 'openai', model: 'gpt-5.6-terra-pro' },\n 'gpt-5.6-sol': { provider: 'openai', model: 'gpt-5.6-sol' },\n 'gpt-5.6-sol-pro': { provider: 'openai', model: 'gpt-5.6-sol-pro' },\n // ── GPT-5.5 ──\n 'gpt-5.5': { provider: 'openai', model: 'gpt-5.5' },\n 'gpt-5.5-pro': { provider: 'openai', model: 'gpt-5.5-pro' },\n // ── GPT-5.4 ──\n 'gpt-5.4': { provider: 'openai', model: 'gpt-5.4' },\n 'gpt-5.4-mini': { provider: 'openai', model: 'gpt-5.4-mini' },\n 'gpt-5.4-nano': { provider: 'openai', model: 'gpt-5.4-nano' },\n 'gpt-5.4-pro': { provider: 'openai', model: 'gpt-5.4-pro' },\n 'gpt-5.4-image-2': { provider: 'openai', model: 'gpt-5.4-image-2' },\n // ── GPT-5.3 ──\n 'gpt-5.3-chat': { provider: 'openai', model: 'gpt-5.3-chat' },\n 'gpt-5.3-codex': { provider: 'openai', model: 'gpt-5.3-codex' },\n // ── GPT-5.2 ──\n 'gpt-5.2': { provider: 'openai', model: 'gpt-5.2' },\n 'gpt-5.2-pro': { provider: 'openai', model: 'gpt-5.2-pro' },\n 'gpt-5.2-chat': { provider: 'openai', model: 'gpt-5.2-chat' },\n 'gpt-5.2-codex': { provider: 'openai', model: 'gpt-5.2-codex' },\n // ── GPT-5.1 ──\n 'gpt-5.1': { provider: 'openai', model: 'gpt-5.1' },\n 'gpt-5.1-chat': { provider: 'openai', model: 'gpt-5.1-chat' },\n 'gpt-5.1-codex': { provider: 'openai', model: 'gpt-5.1-codex' },\n 'gpt-5.1-codex-mini': { provider: 'openai', model: 'gpt-5.1-codex-mini' },\n 'gpt-5.1-codex-max': { provider: 'openai', model: 'gpt-5.1-codex-max' },\n // ── GPT-5 ──\n 'gpt-5': { provider: 'openai', model: 'gpt-5' },\n 'gpt-5-pro': { provider: 'openai', model: 'gpt-5-pro' },\n 'gpt-5-mini': { provider: 'openai', model: 'gpt-5-mini' },\n 'gpt-5-nano': { provider: 'openai', model: 'gpt-5-nano' },\n 'gpt-5-chat': { provider: 'openai', model: 'gpt-5-chat' },\n 'gpt-5-codex': { provider: 'openai', model: 'gpt-5-codex' },\n 'gpt-chat-latest': { provider: 'openai', model: 'gpt-chat-latest' },\n // ── GPT-5 image ──\n 'gpt-5-image': { provider: 'openai', model: 'gpt-5-image' },\n 'gpt-5-image-mini': { provider: 'openai', model: 'gpt-5-image-mini' },\n // ── GPT-4.x ──\n 'gpt-4.1': { provider: 'openai', model: 'gpt-4.1' },\n 'gpt-4.1-mini': { provider: 'openai', model: 'gpt-4.1-mini' },\n 'gpt-4.1-nano': { provider: 'openai', model: 'gpt-4.1-nano' },\n 'gpt-4o': { provider: 'openai', model: 'gpt-4o' },\n 'gpt-4o-mini': { provider: 'openai', model: 'gpt-4o-mini' },\n 'gpt-4o-2024-05-13': { provider: 'openai', model: 'gpt-4o-2024-05-13' },\n 'gpt-4o-2024-08-06': { provider: 'openai', model: 'gpt-4o-2024-08-06' },\n 'gpt-4o-2024-11-20': { provider: 'openai', model: 'gpt-4o-2024-11-20' },\n 'gpt-4o-mini-2024-07-18': { provider: 'openai', model: 'gpt-4o-mini-2024-07-18' },\n 'gpt-4o-mini-search-preview': { provider: 'openai', model: 'gpt-4o-mini-search-preview' },\n 'gpt-4o-search-preview': { provider: 'openai', model: 'gpt-4o-search-preview' },\n 'gpt-4': { provider: 'openai', model: 'gpt-4' },\n 'gpt-4-turbo': { provider: 'openai', model: 'gpt-4-turbo' },\n 'gpt-4-turbo-preview': { provider: 'openai', model: 'gpt-4-turbo-preview' },\n // ── GPT-3.5 (legacy) ──\n 'gpt-3.5-turbo': { provider: 'openai', model: 'gpt-3.5-turbo' },\n 'gpt-3.5-turbo-16k': { provider: 'openai', model: 'gpt-3.5-turbo-16k' },\n 'gpt-3.5-turbo-0613': { provider: 'openai', model: 'gpt-3.5-turbo-0613' },\n 'gpt-3.5-turbo-instruct': { provider: 'openai', model: 'gpt-3.5-turbo-instruct' },\n // ── Audio ──\n 'gpt-audio': { provider: 'openai', model: 'gpt-audio' },\n 'gpt-audio-mini': { provider: 'openai', model: 'gpt-audio-mini' },\n // ── o-series (reasoning) ──\n o1: { provider: 'openai', model: 'o1' },\n 'o1-pro': { provider: 'openai', model: 'o1-pro' },\n o3: { provider: 'openai', model: 'o3' },\n 'o3-pro': { provider: 'openai', model: 'o3-pro' },\n 'o3-mini': { provider: 'openai', model: 'o3-mini' },\n 'o3-mini-high': { provider: 'openai', model: 'o3-mini-high' },\n 'o3-deep-research': { provider: 'openai', model: 'o3-deep-research' },\n 'o4-mini': { provider: 'openai', model: 'o4-mini' },\n 'o4-mini-high': { provider: 'openai', model: 'o4-mini-high' },\n 'o4-mini-deep-research': { provider: 'openai', model: 'o4-mini-deep-research' },\n // ── OSS ──\n 'gpt-oss-20b': { provider: 'openai', model: 'gpt-oss-20b' },\n 'gpt-oss-20b:free': { provider: 'openai', model: 'gpt-oss-20b:free' },\n 'gpt-oss-120b': { provider: 'openai', model: 'gpt-oss-120b' },\n 'gpt-oss-safeguard-20b': { provider: 'openai', model: 'gpt-oss-safeguard-20b' },\n },\n};\n\nexport const anthropicPack: ModelPack = {\n id: 'anthropic',\n label: 'Anthropic (direct)',\n description: 'Claude models routed directly to api.anthropic.com via ANTHROPIC_API_KEY',\n models: {\n 'claude-opus-4-8': { provider: 'anthropic', model: 'claude-opus-4-8' },\n 'claude-sonnet-5': { provider: 'anthropic', model: 'claude-sonnet-5' },\n // Unlike the other entries here, Anthropic's live /v1/models does not\n // expose a bare \"claude-haiku-4-5\" id — only the datestamped one\n // resolves (verified against a live models-list fetch; see\n // packages/model-catalog/src/llm/context-windows.generated.ts). Do not\n // \"fix\" this to match the other entries — that would 404 upstream.\n 'claude-haiku-4-5': { provider: 'anthropic', model: 'claude-haiku-4-5-20251001' },\n // claude-fable-5 is registered in the model catalog (catalog.ts) and\n // context-windows.generated.ts with confirmed pricing. The model ID is\n // used as-is because Anthropic exposes it without a datestamp alias.\n 'claude-fable-5': { provider: 'anthropic', model: 'claude-fable-5' },\n },\n};\n\nexport const openrouterPack: ModelPack = {\n id: 'openrouter',\n label: 'OpenRouter',\n description: 'Source-backed models available through OpenRouter',\n models: {\n 'anthropic/claude-3-5-sonnet-20241022': {\n provider: 'openrouter',\n model: 'anthropic/claude-3-5-sonnet-20241022',\n equivalentClaudeName: 'claude-3-5-sonnet-20241022',\n },\n 'anthropic/claude-3-opus-20240229': {\n provider: 'openrouter',\n model: 'anthropic/claude-3-opus-20240229',\n equivalentClaudeName: 'claude-3-opus-20240229',\n },\n 'openai/gpt-4o': { provider: 'openrouter', model: 'openai/gpt-4o' },\n 'openai/gpt-4o-mini': { provider: 'openrouter', model: 'openai/gpt-4o-mini' },\n },\n};\n\nexport const requestyPack: ModelPack = {\n id: 'requesty',\n label: 'Requesty',\n description: 'Source-backed models available through the Requesty router',\n models: {\n // Requesty ids are already vendor-prefixed, so the pack code IS the\n // upstream id — transparent, no aliasing. Claude-name compatibility for\n // this router belongs in a local pack (see packs.local.example.ts).\n 'sference/thinkingcap-qwen3.6-27b': {\n provider: 'requesty',\n model: 'sference/thinkingcap-qwen3.6-27b',\n },\n 'sference/glm-5.2': { provider: 'requesty', model: 'sference/glm-5.2' },\n 'openai/gpt-4.1': { provider: 'requesty', model: 'openai/gpt-4.1' },\n 'openai/gpt-4o': { provider: 'requesty', model: 'openai/gpt-4o' },\n },\n};\n\n// Curated production coding models, all routed through OpenRouter's native\n// Anthropic-compatible endpoint. Provider-transparent (code === upstream id);\n// no preview/free routes. Tiers feed toAnthropicStyle only. Cross-check the ids\n// against `GET https://openrouter.ai/api/v1/models?supported_parameters=tools`\n// when refreshing this list — availability and pricing drift.\nexport const codingPack: ModelPack = {\n id: 'coding',\n label: 'Coding (OpenRouter)',\n description: 'Curated production coding models routed through OpenRouter',\n models: {\n 'openai/gpt-5.5': { provider: 'openrouter', model: 'openai/gpt-5.5', tier: 'extra-high' },\n 'anthropic/claude-opus-4.8': { provider: 'openrouter', model: 'anthropic/claude-opus-4.8', tier: 'high' },\n 'deepseek/deepseek-v4-pro': { provider: 'openrouter', model: 'deepseek/deepseek-v4-pro', tier: 'high' },\n 'anthropic/claude-sonnet-5': { provider: 'openrouter', model: 'anthropic/claude-sonnet-5', tier: 'medium' },\n 'z-ai/glm-5.2': { provider: 'openrouter', model: 'z-ai/glm-5.2', tier: 'medium' },\n 'minimax/minimax-m3': { provider: 'openrouter', model: 'minimax/minimax-m3', tier: 'small' },\n },\n};\n\n// ── Registry ──────────────────────────────────────────────────────────────\n// Start with official packs. Local packs are merged at runtime if present.\nexport const PACK_REGISTRY: Record<string, ModelPack> = {\n [defaultPack.id]: defaultPack,\n [xaiPack.id]: xaiPack,\n [openaiPack.id]: openaiPack,\n [openrouterPack.id]: openrouterPack,\n [requestyPack.id]: requestyPack,\n [anthropicPack.id]: anthropicPack,\n [codingPack.id]: codingPack,\n};\n\n// Default pack used when no pack is specified.\nexport const DEFAULT_PACK_ID = 'default';\n\n/**\n * Resolve a pack by ID from the official registry.\n * Returns the default pack when packId is null/undefined.\n * Throws a RangeError for non-null IDs that are not in the registry —\n * callers that need silent fallback should check `PACK_REGISTRY[id]` first.\n */\nexport function resolvePack(packId: string | null | undefined): ModelPack {\n if (!packId) return PACK_REGISTRY[DEFAULT_PACK_ID]!;\n const pack = PACK_REGISTRY[packId];\n if (!pack) throw new RangeError(`Unknown pack id: \"${packId}\". Available: ${Object.keys(PACK_REGISTRY).join(', ')}`);\n return pack;\n}\n\n/**\n * Build a flat route mapping from a pack.\n */\nexport function buildMappingFromPack(pack: ModelPack): Record<string, ModelRoute> {\n return { ...pack.models };\n}\n\n/**\n * List all available pack IDs for discovery.\n */\nexport function listPackIds(): string[] {\n return Object.keys(PACK_REGISTRY);\n}\n\n// ── Local-pack schema validation ────────────────────────────────────────────\n// Local packs come from a hand-edited, gitignored packs.local.json, so they are\n// untrusted input. The repo ships no schema library, so these are hand-written\n// typed guards over the ModelPack/ModelRoute shape. Each error names the\n// offending pack + field so a fail-soft load can warn precisely and the reload\n// endpoint (POST /v1/packs/reload) can return a legible 400.\n\n/** Narrow an unknown to a plain object (records, not arrays/null). */\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** The four legal ModelRoute tiers, as a guard so `tier` narrows to ModelTier. */\nfunction isModelTier(value: string): value is ModelTier {\n return value === 'extra-high' || value === 'high' || value === 'medium' || value === 'small';\n}\n\n/**\n * Validate a single ModelRoute, appending `<where>.<field>`-scoped messages to\n * `errors`. Returns the rebuilt, typed route on success, else null — the route\n * is reconstructed from the validated primitives rather than cast, so the\n * caller gets a real ModelRoute without an `as`.\n */\nfunction validateModelRoute(route: unknown, where: string, errors: string[]): ModelRoute | null {\n if (!isRecord(route)) {\n errors.push(`${where}: expected an object, got ${route === null ? 'null' : typeof route}`);\n return null;\n }\n const { provider, model, equivalentClaudeName, tier, contextWindow, maxOutputTokens } = route;\n let ok = true;\n if (typeof provider !== 'string' || provider.length === 0) {\n errors.push(`${where}.provider: required non-empty string`);\n ok = false;\n }\n if (typeof model !== 'string' || model.length === 0) {\n errors.push(`${where}.model: required non-empty string`);\n ok = false;\n }\n if (equivalentClaudeName !== undefined && typeof equivalentClaudeName !== 'string') {\n errors.push(`${where}.equivalentClaudeName: must be a string when present`);\n ok = false;\n }\n if (tier !== undefined && !(typeof tier === 'string' && isModelTier(tier))) {\n errors.push(`${where}.tier: must be one of extra-high|high|medium|small when present`);\n ok = false;\n }\n if (contextWindow !== undefined && !(typeof contextWindow === 'number' && Number.isFinite(contextWindow) && contextWindow > 0)) {\n errors.push(`${where}.contextWindow: must be a positive finite number when present`);\n ok = false;\n }\n if (maxOutputTokens !== undefined && !(typeof maxOutputTokens === 'number' && Number.isFinite(maxOutputTokens) && maxOutputTokens > 0)) {\n errors.push(`${where}.maxOutputTokens: must be a positive finite number when present`);\n ok = false;\n }\n if (!ok || typeof provider !== 'string' || typeof model !== 'string') return null;\n const built: ModelRoute = { provider, model };\n if (typeof equivalentClaudeName === 'string') built.equivalentClaudeName = equivalentClaudeName;\n if (typeof tier === 'string' && isModelTier(tier)) built.tier = tier;\n if (typeof contextWindow === 'number' && Number.isFinite(contextWindow) && contextWindow > 0) {\n built.contextWindow = contextWindow;\n }\n if (typeof maxOutputTokens === 'number' && Number.isFinite(maxOutputTokens) && maxOutputTokens > 0) {\n built.maxOutputTokens = maxOutputTokens;\n }\n return built;\n}\n\n/** The outcome of validating one pack: the rebuilt typed pack, or its errors. */\nexport type ModelPackValidation =\n | { ok: true; pack: ModelPack }\n | { ok: false; errors: string[] };\n\n/**\n * Validate a single ModelPack shape. On success returns the rebuilt, typed\n * pack; on failure returns the collected, field-scoped errors. `label` scopes\n * the messages (e.g. the pack key from the envelope). Accepts a built-in pack\n * and rejects anything missing an id / a valid models map / a valid route.\n */\nexport function validateModelPack(pack: unknown, label = 'pack'): ModelPackValidation {\n const errors: string[] = [];\n if (!isRecord(pack)) {\n return { ok: false, errors: [`${label}: expected an object, got ${pack === null ? 'null' : typeof pack}`] };\n }\n const { id, label: packLabel, description, models, toolsExclude, toolsAllow } = pack;\n if (typeof id !== 'string' || id.length === 0) errors.push(`${label}.id: required non-empty string`);\n if (typeof packLabel !== 'string') errors.push(`${label}.label: required string`);\n if (typeof description !== 'string') errors.push(`${label}.description: required string`);\n /** Validates an optional string[] of non-empty tool-name patterns. */\n const validPatternList = (v: unknown): v is string[] =>\n Array.isArray(v) && v.every((p) => typeof p === 'string' && p.length > 0);\n if (toolsExclude !== undefined && !validPatternList(toolsExclude)) {\n errors.push(`${label}.toolsExclude: must be an array of non-empty strings when present`);\n }\n if (toolsAllow !== undefined && !validPatternList(toolsAllow)) {\n errors.push(`${label}.toolsAllow: must be an array of non-empty strings when present`);\n }\n const builtModels: Record<string, ModelRoute> = {};\n if (!isRecord(models)) {\n errors.push(`${label}.models: required object mapping code → route`);\n } else {\n for (const [code, route] of Object.entries(models)) {\n const built = validateModelRoute(route, `${label}.models.${code}`, errors);\n if (built) builtModels[code] = built;\n }\n }\n if (errors.length > 0) return { ok: false, errors };\n // Re-narrow the primitives (the imperative checks above don't flow through) to\n // rebuild a typed ModelPack with no cast. Unreachable else — errors would be set.\n if (typeof id === 'string' && typeof packLabel === 'string' && typeof description === 'string') {\n return {\n ok: true,\n pack: {\n id,\n label: packLabel,\n description,\n models: builtModels,\n ...(validPatternList(toolsExclude) ? { toolsExclude } : {}),\n ...(validPatternList(toolsAllow) ? { toolsAllow } : {}),\n },\n };\n }\n return { ok: false, errors: [`${label}: failed final type narrowing`] };\n}\n\n/** The outcome of validating a `{ packs: {...} }` envelope. */\nexport type LocalPacksValidation =\n | { ok: true; packs: Record<string, ModelPack> }\n | { ok: false; errors: string[] };\n\n/**\n * Validate the `{ packs: { <id>: ModelPack } }` envelope read from\n * packs.local.json. On success returns the typed pack map; on failure returns\n * the collected, field-scoped errors from every invalid pack.\n */\nexport function validateLocalPacks(envelope: unknown): LocalPacksValidation {\n if (!isRecord(envelope)) {\n return { ok: false, errors: [`root: expected an object with a \"packs\" key, got ${envelope === null ? 'null' : typeof envelope}`] };\n }\n if (!isRecord(envelope.packs)) {\n return { ok: false, errors: ['packs: expected an object mapping id → pack'] };\n }\n const errors: string[] = [];\n const packs: Record<string, ModelPack> = {};\n for (const [id, pack] of Object.entries(envelope.packs)) {\n const result = validateModelPack(pack, `packs.${id}`);\n if (result.ok) packs[id] = result.pack;\n else errors.push(...result.errors);\n }\n if (errors.length > 0) return { ok: false, errors };\n return { ok: true, packs };\n}\n\n/**\n * Providers that support transparent `provider/model` routing on the OpenAI\n * chat/completions and Responses surfaces. This is the allow-list for both\n * `?p=` overrides and model-id prefixes.\n */\nexport const KNOWN_TRANSPARENT_PROVIDERS = new Set([\n 'anthropic',\n 'moonshot',\n 'openrouter',\n 'requesty',\n 'zai',\n 'groq',\n 'xai',\n 'openai',\n // Self-hosted fine-tunes (vLLM --enable-lora) — see FORGE_BASE_URL in\n // src/index.ts. Absent from every committed pack: LoRA adapters are\n // registered on the forge server itself, not known ahead of time here.\n 'forge',\n // Nebius AI Studio — see NEBIUS_BASE_URL/NEBIUS_API_KEY in src/index.ts.\n // Same \"configurable OpenAI-compatible upstream\" mechanism as forge, but\n // with a working default host (api.studio.nebius.com) and a required key.\n 'nebius',\n]);\n\n/**\n * Parse a transparent model reference of the form `provider/model`.\n * Returns `{ provider, model }` when the prefix is a known provider, else null.\n * For `openrouter` and `requesty`, the remainder may contain additional slashes\n * (e.g. `openrouter/anthropic/claude-3-5-sonnet-20241022`,\n * `requesty/sference/thinkingcap-qwen3.6-27b`) — the split is on the FIRST\n * slash only, so the router's own vendor prefix survives intact.\n */\nexport function parseTransparentModel(model: string): { provider: string; model: string } | null {\n const slashIdx = model.indexOf('/');\n if (slashIdx <= 0 || slashIdx === model.length - 1) return null;\n const provider = model.slice(0, slashIdx);\n if (!KNOWN_TRANSPARENT_PROVIDERS.has(provider)) return null;\n return { provider, model: model.slice(slashIdx + 1) };\n}\n\n/**\n * Wildcard/pattern matching helper for tool names.\n * Supports exact match and trailing wildcard: \"agentproto_*\" matches \"agentproto_start\",\n * \"prefix*\" matches \"prefixFoo\", \"*\" matches everything.\n */\nexport function matchesPattern(name: string, pattern: string): boolean {\n return pattern.endsWith('*') ? name.startsWith(pattern.slice(0, -1)) : name === pattern;\n}\n\n// ── Anthropic-style format transform ────────────────────────────────────────\n// Relabels each route with an opaque, Claude-shaped id so Anthropic-only\n// clients get ids they'll accept, WITHOUT impersonating a real Claude model.\n// Applied on demand (never committed) when a request opts into the\n// Anthropic-style format — see the X-Proxy-Format handling in index.ts.\n\n/** Maps a coarse capability tier onto a Claude family used as the id prefix. */\nexport const TIER_TO_FAMILY: Record<ModelTier, string> = {\n 'extra-high': 'fable',\n high: 'opus',\n medium: 'sonnet',\n small: 'haiku',\n};\n\n// Family used when a route carries no tier — a neutral middle default.\nconst DEFAULT_FAMILY = 'sonnet';\n\nexport interface ToAnthropicStyleOptions {\n /** New pack id (defaults to the source pack's id). */\n id?: string;\n /** New label (defaults to the source pack's label). */\n label?: string;\n /** Number of decimal digits in the sha-derived suffix (default 7). */\n digits?: number;\n /** Alias prefix (default \"claude-\"). */\n idPrefix?: string;\n}\n\n/**\n * Derive a deterministic, fixed-length numeric string from a model id via\n * sha256. Distinct upstream ids yield distinct numbers (collision-resistant\n * within a pack); the same id always yields the same number, so ids are stable\n * across process restarts and unit-testable. No Math.random.\n */\nexport function shaNumericId(model: string, digits = 7): string {\n const hex = createHash('sha256').update(model).digest('hex');\n // 15 hex chars ≈ 60 bits — safely below Number/BigInt-from-hex limits and\n // more than enough entropy for the small pack sizes here.\n const n = BigInt('0x' + hex.slice(0, 15)) % (10n ** BigInt(digits));\n return n.toString().padStart(digits, '0');\n}\n\n/**\n * Convert a pack to \"Anthropic style\": every route keeps its transparent code\n * (the display name) and its real provider/model, and gains an\n * `equivalentClaudeName` of the form `claude-<family>-<sha>`. The family comes\n * from the route's {@link ModelTier} (fallback `sonnet`); the suffix is a\n * sha-derived number of the upstream model id. Pure and deterministic.\n */\nexport function toAnthropicStyle(pack: ModelPack, opts: ToAnthropicStyleOptions = {}): ModelPack {\n const { digits = 7, idPrefix = 'claude-' } = opts;\n const models: Record<string, ModelRoute> = {};\n for (const [code, route] of Object.entries(pack.models)) {\n const family = route.tier ? TIER_TO_FAMILY[route.tier] : DEFAULT_FAMILY;\n models[code] = {\n ...route,\n equivalentClaudeName: `${idPrefix}${family}-${shaNumericId(route.model, digits)}`,\n };\n }\n return {\n id: opts.id ?? pack.id,\n label: opts.label ?? pack.label,\n description: pack.description,\n models,\n };\n}\n","/**\n * OpenAI Responses API → OpenAI Chat Completions facade.\n *\n * Codex custom providers require `wire_api = \"responses\"` and POST to\n * `<base_url>/responses`. This module translates those requests into the\n * provider's OpenAI-compatible chat/completions endpoint and converts the\n * upstream response back into the Responses API contract.\n */\n\n// ── Request types ──────────────────────────────────────────────────────────\n\nexport interface ResponsesInputText {\n type: 'input_text';\n text: string;\n}\n\nexport interface ResponsesOutputText {\n type: 'output_text';\n text: string;\n}\n\nexport type ResponsesContentItem = ResponsesInputText | ResponsesOutputText;\n\nexport interface ResponsesMessageItem {\n type: 'message';\n role: 'user' | 'assistant' | 'system' | 'developer';\n content: string | ResponsesContentItem[];\n}\n\nexport interface ResponsesFunctionCallOutputItem {\n type: 'function_call_output';\n call_id: string;\n output: string;\n}\n\nexport type ResponsesInputItem =\n | ResponsesMessageItem\n | ResponsesFunctionCallOutputItem;\n\nexport interface ResponsesFunctionTool {\n type: 'function';\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n strict?: boolean;\n}\n\nexport interface ResponsesReasoning {\n effort?: 'low' | 'medium' | 'high';\n summary?: 'auto' | 'detailed' | 'concise' | 'auto_verbose';\n}\n\nexport interface ResponsesTextControls {\n verbosity?: 'low' | 'medium' | 'high';\n format?: unknown;\n}\n\nexport interface ResponsesRequestBody {\n model: string;\n input: string | ResponsesInputItem[];\n instructions?: string;\n tools?: ResponsesFunctionTool[];\n tool_choice?: 'auto' | 'none' | 'required' | { type: 'function'; name: string };\n stream?: boolean;\n parallel_tool_calls?: boolean;\n max_output_tokens?: number;\n max_tokens?: number;\n temperature?: number;\n top_p?: number;\n // Provider metadata that the facade accepts but cannot preserve across the\n // chat/completions translation; they are dropped after validation.\n store?: boolean;\n include?: string[];\n client_metadata?: Record<string, string>;\n service_tier?: string;\n prompt_cache_key?: string;\n stream_options?: unknown;\n reasoning?: ResponsesReasoning;\n text?: ResponsesTextControls;\n // Explicitly unsupported.\n previous_response_id?: string;\n}\n\n// ── Chat Completions types ─────────────────────────────────────────────────\n\nexport interface ChatCompletionsMessage {\n role: string;\n content?: string | null;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }>;\n tool_call_id?: string;\n name?: string;\n}\n\nexport interface ChatCompletionsTool {\n type: 'function';\n function: {\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n };\n strict?: boolean;\n}\n\nexport interface ChatCompletionsRequestBody {\n model: string;\n messages: ChatCompletionsMessage[];\n tools?: ChatCompletionsTool[];\n tool_choice?: unknown;\n stream?: boolean;\n parallel_tool_calls?: boolean;\n max_tokens?: number;\n temperature?: number;\n top_p?: number;\n reasoning_effort?: string;\n /** vLLM's OpenAI-compatible extension — see endpoints.ts's defaultRequestFields. */\n chat_template_kwargs?: Record<string, unknown>;\n}\n\n// ── Validation ─────────────────────────────────────────────────────────────\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction assertString(value: unknown, field: string): string {\n if (typeof value !== 'string') {\n throw new TypeError(`Expected ${field} to be a string`);\n }\n return value;\n}\n\nfunction assertOptionalString(value: unknown, field: string): string | undefined {\n if (value === undefined || value === null) return undefined;\n return assertString(value, field);\n}\n\nfunction assertOptionalNumber(value: unknown, field: string): number | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== 'number' || Number.isNaN(value)) {\n throw new TypeError(`Expected ${field} to be a number`);\n }\n return value;\n}\n\nfunction assertOptionalBoolean(value: unknown, field: string): boolean | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== 'boolean') {\n throw new TypeError(`Expected ${field} to be a boolean`);\n }\n return value;\n}\n\nfunction validateContentItem(item: unknown): ResponsesContentItem {\n if (!isPlainObject(item)) {\n throw new TypeError('Input message content items must be objects');\n }\n const type = item.type;\n if (type !== 'input_text' && type !== 'output_text') {\n throw new TypeError(\n `Unsupported input message content item type \"${String(type)}\"; only \"input_text\" and \"output_text\" are supported`\n );\n }\n return { type, text: assertString(item.text, 'content item text') };\n}\n\nfunction validateInputItem(item: unknown): ResponsesInputItem {\n if (!isPlainObject(item)) {\n throw new TypeError('Input items must be objects');\n }\n const type = item.type;\n if (type === 'message') {\n const role = assertString(item.role, 'input message role');\n if (role !== 'user' && role !== 'assistant' && role !== 'system' && role !== 'developer') {\n throw new TypeError(\n `Unsupported input message role \"${role}\"; only \"user\", \"assistant\", \"system\", and \"developer\" are supported`\n );\n }\n let content: string | ResponsesContentItem[];\n if (typeof item.content === 'string') {\n content = item.content;\n } else if (Array.isArray(item.content)) {\n content = item.content.map(validateContentItem);\n } else {\n throw new TypeError('Input message content must be a string or an array of content items');\n }\n return { type: 'message', role, content };\n }\n if (type === 'function_call_output') {\n return {\n type: 'function_call_output',\n call_id: assertString(item.call_id, 'function_call_output call_id'),\n output: typeof item.output === 'string'\n ? item.output\n : JSON.stringify(item.output ?? {}),\n };\n }\n throw new TypeError(\n `Unsupported input item type \"${String(type)}\"; only \"message\" and \"function_call_output\" are supported`\n );\n}\n\nfunction validateTool(tool: unknown): ResponsesFunctionTool {\n if (!isPlainObject(tool)) {\n throw new TypeError('Tools must be objects');\n }\n if (tool.type !== 'function') {\n throw new TypeError(\n `Unsupported tool type \"${String(tool.type)}\"; only \"function\" tools are supported`\n );\n }\n return {\n type: 'function',\n name: assertString(tool.name, 'tool name'),\n description: assertOptionalString(tool.description, 'tool description'),\n parameters: isPlainObject(tool.parameters) ? tool.parameters : undefined,\n strict: assertOptionalBoolean(tool.strict, 'tool strict'),\n };\n}\n\n/**\n * Validates and normalizes an incoming OpenAI Responses API request body.\n * Throws a descriptive TypeError for unsupported constructs before any\n * provider I/O occurs.\n */\nexport function validateResponsesRequest(body: unknown): ResponsesRequestBody {\n if (!isPlainObject(body)) {\n throw new TypeError('Request body must be a JSON object');\n }\n\n const model = assertString(body.model, 'model');\n\n let input: string | ResponsesInputItem[];\n if (typeof body.input === 'string') {\n input = body.input;\n } else if (Array.isArray(body.input)) {\n input = body.input.map(validateInputItem);\n } else {\n throw new TypeError('\"input\" must be a string or an array of input items');\n }\n\n const instructions = assertOptionalString(body.instructions, 'instructions');\n\n let tools: ResponsesFunctionTool[] | undefined;\n if (body.tools !== undefined && body.tools !== null) {\n if (!Array.isArray(body.tools)) {\n throw new TypeError('\"tools\" must be an array');\n }\n tools = body.tools.map(validateTool);\n }\n\n let toolChoice: ResponsesRequestBody['tool_choice'];\n if (body.tool_choice !== undefined && body.tool_choice !== null) {\n if (typeof body.tool_choice === 'string') {\n const tc = body.tool_choice;\n if (tc !== 'auto' && tc !== 'none' && tc !== 'required') {\n throw new TypeError(\n `Unsupported tool_choice \"${tc}\"; must be \"auto\", \"none\", \"required\", or a function object`\n );\n }\n toolChoice = tc;\n } else if (isPlainObject(body.tool_choice)) {\n const tc = body.tool_choice;\n if (tc.type !== 'function') {\n throw new TypeError(\n `Unsupported tool_choice type \"${String(tc.type)}\"; only \"function\" is supported`\n );\n }\n toolChoice = {\n type: 'function',\n name: assertString(tc.name, 'tool_choice function name'),\n };\n } else {\n throw new TypeError('\"tool_choice\" must be a string or an object');\n }\n }\n\n // Unsupported constructs that cannot be preserved across the translation.\n if (body.previous_response_id !== undefined && body.previous_response_id !== null) {\n throw new TypeError(\n '\"previous_response_id\" is not supported; the facade translates each request independently'\n );\n }\n if (\n body.text !== undefined &&\n body.text !== null &&\n isPlainObject(body.text) &&\n body.text.format !== undefined &&\n body.text.format !== null\n ) {\n throw new TypeError(\n '\"text.format\" / structured output is not supported by this facade'\n );\n }\n\n const result: ResponsesRequestBody = {\n model,\n input,\n instructions,\n tools,\n tool_choice: toolChoice,\n stream: assertOptionalBoolean(body.stream, 'stream'),\n parallel_tool_calls: assertOptionalBoolean(body.parallel_tool_calls, 'parallel_tool_calls'),\n max_output_tokens: assertOptionalNumber(body.max_output_tokens, 'max_output_tokens'),\n max_tokens: assertOptionalNumber(body.max_tokens, 'max_tokens'),\n temperature: assertOptionalNumber(body.temperature, 'temperature'),\n top_p: assertOptionalNumber(body.top_p, 'top_p'),\n // Harmless provider metadata: accepted to keep Codex happy, but dropped\n // before the upstream call because chat/completions does not preserve them.\n store: assertOptionalBoolean(body.store, 'store'),\n include: Array.isArray(body.include) ? body.include.map((v) => assertString(v, 'include')) : undefined,\n client_metadata: isPlainObject(body.client_metadata) ? body.client_metadata as Record<string, string> : undefined,\n service_tier: assertOptionalString(body.service_tier, 'service_tier'),\n prompt_cache_key: assertOptionalString(body.prompt_cache_key, 'prompt_cache_key'),\n stream_options: body.stream_options,\n reasoning: body.reasoning !== undefined && body.reasoning !== null\n ? {\n effort: ['low', 'medium', 'high'].includes(String((body.reasoning as any).effort))\n ? (String((body.reasoning as any).effort) as 'low' | 'medium' | 'high')\n : undefined,\n summary: ['auto', 'detailed', 'concise', 'auto_verbose'].includes(\n String((body.reasoning as any).summary)\n )\n ? (String((body.reasoning as any).summary) as 'auto' | 'detailed' | 'concise' | 'auto_verbose')\n : undefined,\n }\n : undefined,\n text: body.text !== undefined && body.text !== null\n ? { verbosity: ['low', 'medium', 'high'].includes(String((body.text as any).verbosity))\n ? (String((body.text as any).verbosity) as 'low' | 'medium' | 'high')\n : undefined }\n : undefined,\n };\n\n return result;\n}\n\n// ── Request translation: Responses → Chat Completions ──────────────────────\n\nfunction flattenContent(content: string | ResponsesContentItem[]): string {\n if (typeof content === 'string') return content;\n return content.map((c) => c.text).join('');\n}\n\nfunction translateInputToMessages(\n input: string | ResponsesInputItem[],\n instructions: string | undefined\n): ChatCompletionsMessage[] {\n const messages: ChatCompletionsMessage[] = [];\n\n if (instructions) {\n messages.push({ role: 'system', content: instructions });\n }\n\n if (typeof input === 'string') {\n messages.push({ role: 'user', content: input });\n return messages;\n }\n\n for (const item of input) {\n if (item.type === 'message') {\n messages.push({\n role: item.role === 'developer' ? 'system' : item.role,\n content: flattenContent(item.content),\n });\n } else if (item.type === 'function_call_output') {\n messages.push({\n role: 'tool',\n tool_call_id: item.call_id,\n content: item.output,\n });\n }\n }\n\n return messages;\n}\n\nfunction translateToolToChatCompletions(tool: ResponsesFunctionTool): ChatCompletionsTool {\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n strict: tool.strict,\n };\n}\n\nfunction translateToolChoice(toolChoice: ResponsesRequestBody['tool_choice']): unknown {\n if (!toolChoice) return undefined;\n if (typeof toolChoice === 'string') return toolChoice;\n return {\n type: 'function',\n function: { name: toolChoice.name },\n };\n}\n\n/**\n * Converts a validated Responses API request into an OpenAI Chat Completions\n * request that the existing provider infrastructure can forward.\n */\nexport function responsesToChatCompletionsRequest(\n body: ResponsesRequestBody,\n _resolvedTarget: { provider: string; model: string }\n): ChatCompletionsRequestBody {\n const messages = translateInputToMessages(body.input, body.instructions);\n\n const result: ChatCompletionsRequestBody = {\n model: _resolvedTarget.model,\n messages,\n stream: body.stream,\n parallel_tool_calls: body.parallel_tool_calls,\n max_tokens: body.max_output_tokens ?? body.max_tokens,\n temperature: body.temperature,\n top_p: body.top_p,\n };\n\n if (body.tools && body.tools.length > 0) {\n result.tools = body.tools.map(translateToolToChatCompletions);\n }\n\n if (body.tool_choice) {\n result.tool_choice = translateToolChoice(body.tool_choice);\n }\n\n // Map Responses reasoning.effort to the OpenAI chat/completions parameter.\n // Reasoning summary is Responses-API-specific and is dropped.\n if (body.reasoning?.effort) {\n result.reasoning_effort = body.reasoning.effort;\n }\n\n return result;\n}\n\n// ── Response translation: Chat Completions → Responses API ─────────────────\n\nfunction generateResponseId(): string {\n return `resp_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction generateOutputItemId(prefix: string): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction chatChoiceToOutputItems(choice: any): any[] {\n const output: any[] = [];\n const msg = choice && choice.message;\n if (!msg) return output;\n\n const text = typeof msg.content === 'string' ? msg.content : '';\n if (text) {\n output.push({\n type: 'message',\n id: generateOutputItemId('msg'),\n role: 'assistant',\n content: [\n { type: 'output_text', text, annotations: [] },\n ],\n });\n }\n\n if (Array.isArray(msg.tool_calls)) {\n for (const tc of msg.tool_calls) {\n const fn = tc.function || {};\n output.push({\n type: 'function_call',\n id: tc.id || generateOutputItemId('fc'),\n call_id: tc.id || generateOutputItemId('call'),\n name: fn.name || '',\n arguments: typeof fn.arguments === 'string' ? fn.arguments : JSON.stringify(fn.arguments ?? {}),\n });\n }\n }\n\n return output;\n}\n\nfunction chatUsageToResponsesUsage(usage: any): any {\n const prompt = usage?.prompt_tokens ?? 0;\n const completion = usage?.completion_tokens ?? 0;\n const cached = usage?.prompt_tokens_details?.cached_tokens ?? 0;\n const reasoning = usage?.completion_tokens_details?.reasoning_tokens ?? 0;\n return {\n input_tokens: prompt,\n input_tokens_details: { cached_tokens: cached },\n output_tokens: completion,\n output_tokens_details: { reasoning_tokens: reasoning },\n total_tokens: usage?.total_tokens ?? prompt + completion,\n };\n}\n\n/**\n * Converts a non-streaming OpenAI Chat Completions JSON response into an\n * OpenAI Responses API JSON response.\n */\nexport function chatCompletionsJsonToResponses(\n jsonStr: string,\n opts: { requestedModel: string; responseId?: string }\n): string {\n try {\n const upstream = JSON.parse(jsonStr);\n if (upstream && typeof upstream === 'object' && upstream.error) {\n return JSON.stringify({\n error: upstream.error,\n });\n }\n\n const choice = upstream.choices && upstream.choices[0];\n const responseId = opts.responseId || upstream.id || generateResponseId();\n const now = Math.floor(Date.now() / 1000);\n\n const response = {\n id: responseId,\n object: 'response',\n created_at: now,\n status: 'completed',\n error: null,\n incomplete_details: null,\n instructions: null,\n max_output_tokens: null,\n model: opts.requestedModel,\n output: chatChoiceToOutputItems(choice),\n parallel_tool_calls: upstream.parallel_tool_calls ?? false,\n tool_choice: 'auto',\n tools: [],\n usage: chatUsageToResponsesUsage(upstream.usage),\n };\n\n return JSON.stringify(response);\n } catch {\n return jsonStr;\n }\n}\n\n// ── Streaming translation ──────────────────────────────────────────────────\n\ninterface StreamState {\n responseId: string;\n requestedModel: string;\n textItemId: string | null;\n textStarted: boolean;\n toolItems: Map<number, { id: string; callId: string; name: string; index: number }>;\n accUsage: { prompt_tokens?: number; completion_tokens?: number };\n finished: boolean;\n sentCreated: boolean;\n}\n\nfunction sse(event: string, data: any): string {\n return `event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`;\n}\n\nfunction createInitialResponse(responseId: string, model: string): any {\n return {\n id: responseId,\n object: 'response',\n created_at: Math.floor(Date.now() / 1000),\n status: 'in_progress',\n error: null,\n incomplete_details: null,\n instructions: null,\n max_output_tokens: null,\n model,\n output: [],\n parallel_tool_calls: false,\n tool_choice: 'auto',\n tools: [],\n usage: { input_tokens: 0, output_tokens: 0, total_tokens: 0 },\n };\n}\n\n/**\n * Converts an upstream OpenAI Chat Completions SSE stream into an OpenAI\n * Responses API SSE stream. Emits the events Codex needs:\n * response.created\n * response.output_item.added\n * response.output_text.delta\n * response.output_item.done\n * response.custom_tool_call_input.delta\n * response.completed\n */\nexport class OpenAIChatToResponsesStreamConverter {\n private state: StreamState;\n private buffer = '';\n\n constructor(opts: { requestedModel: string; responseId?: string }) {\n this.state = {\n responseId: opts.responseId || generateResponseId(),\n requestedModel: opts.requestedModel,\n textItemId: null,\n textStarted: false,\n toolItems: new Map(),\n accUsage: {},\n finished: false,\n sentCreated: false,\n };\n }\n\n push(chunk: string): string[] {\n this.buffer += chunk;\n const out: string[] = [];\n const parts = this.buffer.split(/\\r?\\n\\r?\\n/);\n this.buffer = parts.pop() ?? '';\n for (const part of parts) {\n const transformed = this.transformEvent(part);\n if (transformed) out.push(...transformed);\n }\n return out;\n }\n\n flush(): string[] {\n if (this.buffer.trim()) {\n const transformed = this.transformEvent(this.buffer);\n this.buffer = '';\n return transformed || [];\n }\n return [];\n }\n\n private ensureCreated(): string[] {\n if (this.state.sentCreated) return [];\n this.state.sentCreated = true;\n return [sse('response.created', {\n type: 'response.created',\n response: createInitialResponse(this.state.responseId, this.state.requestedModel),\n })];\n }\n\n private transformEvent(rawEvent: string): string[] | null {\n const lines = rawEvent.split(/\\r?\\n/);\n const dataLines: string[] = [];\n for (const line of lines) {\n if (line.startsWith('data:')) dataLines.push(line.slice(5).trim());\n }\n if (!dataLines.length) return null;\n\n const out: string[] = [];\n for (const dl of dataLines) {\n if (dl === '[DONE]') {\n if (this.state.finished) continue;\n out.push(...this.finalize());\n this.state.finished = true;\n continue;\n }\n\n let data: any;\n try { data = JSON.parse(dl); } catch { continue; }\n\n const choice = data.choices && data.choices[0];\n const delta = choice && choice.delta;\n const content = delta && delta.content;\n const toolCalls = delta && delta.tool_calls;\n\n out.push(...this.ensureCreated());\n\n // Text streaming.\n if (typeof content === 'string') {\n if (!this.state.textItemId) {\n this.state.textItemId = generateOutputItemId('msg');\n out.push(sse('response.output_item.added', {\n type: 'response.output_item.added',\n item: {\n type: 'message',\n id: this.state.textItemId,\n role: 'assistant',\n content: [],\n },\n output_index: 0,\n }));\n }\n if (content) {\n if (!this.state.textStarted) {\n out.push(sse('response.content_part.added', {\n type: 'response.content_part.added',\n item_id: this.state.textItemId,\n output_index: 0,\n content_index: 0,\n part: { type: 'output_text', text: '' },\n }));\n this.state.textStarted = true;\n }\n out.push(sse('response.output_text.delta', {\n type: 'response.output_text.delta',\n item_id: this.state.textItemId,\n output_index: 0,\n content_index: 0,\n delta: content,\n }));\n }\n }\n\n // Tool call streaming.\n if (Array.isArray(toolCalls)) {\n for (const tc of toolCalls) {\n const idx = typeof tc.index === 'number' ? tc.index : 0;\n let tool = this.state.toolItems.get(idx);\n if (tc.function && tc.function.name && !tool) {\n tool = {\n id: tc.id || generateOutputItemId('fc'),\n callId: tc.id || generateOutputItemId('call'),\n name: tc.function.name,\n index: idx,\n };\n this.state.toolItems.set(idx, tool);\n out.push(sse('response.output_item.added', {\n type: 'response.output_item.added',\n item: {\n type: 'function_call',\n id: tool.id,\n call_id: tool.callId,\n name: tool.name,\n arguments: '',\n },\n output_index: this.state.textItemId ? 1 : 0,\n }));\n }\n if (tool && tc.function && tc.function.arguments) {\n out.push(sse('response.custom_tool_call_input.delta', {\n type: 'response.custom_tool_call_input.delta',\n item_id: tool.id,\n call_id: tool.callId,\n delta: tc.function.arguments,\n }));\n }\n }\n }\n\n // Usage accumulation.\n const u = data.x_groq && data.x_groq.usage ? data.x_groq.usage : data.usage;\n if (u) {\n if (u.prompt_tokens != null) this.state.accUsage.prompt_tokens = u.prompt_tokens;\n if (u.completion_tokens != null) this.state.accUsage.completion_tokens = u.completion_tokens;\n }\n\n // Finish reason handling.\n const fr = choice && choice.finish_reason;\n if (fr && !this.state.finished) {\n out.push(...this.finalize());\n this.state.finished = true;\n }\n }\n\n return out.length ? out : null;\n }\n\n private finalize(): string[] {\n const out: string[] = [];\n\n if (this.state.textItemId) {\n if (this.state.textStarted) {\n out.push(sse('response.content_part.done', {\n type: 'response.content_part.done',\n item_id: this.state.textItemId,\n output_index: 0,\n content_index: 0,\n part: { type: 'output_text', text: '' },\n }));\n }\n out.push(sse('response.output_item.done', {\n type: 'response.output_item.done',\n item: {\n type: 'message',\n id: this.state.textItemId,\n role: 'assistant',\n content: [{ type: 'output_text', text: '' }],\n },\n output_index: 0,\n }));\n }\n\n this.state.toolItems.forEach((tool, idx) => {\n out.push(sse('response.output_item.done', {\n type: 'response.output_item.done',\n item: {\n type: 'function_call',\n id: tool.id,\n call_id: tool.callId,\n name: tool.name,\n arguments: '',\n },\n output_index: this.state.textItemId ? 1 + idx : idx,\n }));\n });\n\n const usage = {\n input_tokens: this.state.accUsage.prompt_tokens || 0,\n input_tokens_details: { cached_tokens: 0 },\n output_tokens: this.state.accUsage.completion_tokens || 0,\n output_tokens_details: { reasoning_tokens: 0 },\n total_tokens: (this.state.accUsage.prompt_tokens || 0) + (this.state.accUsage.completion_tokens || 0),\n };\n\n out.push(sse('response.completed', {\n type: 'response.completed',\n response: {\n id: this.state.responseId,\n object: 'response',\n status: 'completed',\n output: [],\n usage,\n },\n }));\n\n return out;\n }\n}\n","/**\n * `/v1/messages/batches*` — an Anthropic-shaped Batches surface on top of\n * `@agentproto/batch`. Batch is a delivery mode, not a model: each item's\n * `params` is the same Messages body the sync `/v1/messages` route already\n * understands, so per-item routing/tool-trimming is reused verbatim from\n * `index.ts` (hence the circular import — both sides only touch the other's\n * exports from inside a function body, never at module top level, so ESM's\n * circular-resolution rules leave it safe).\n *\n * Per resolved provider:\n * - anthropic → native Anthropic Message Batches (50%, 24h window).\n * - openrouter → native OpenRouter Batch API (50%, one provider batch per model).\n * - everything else → localQueueDriver emulation: items are run through the\n * proxy's OWN sync /v1/messages path over loopback, full price.\n * A batch spanning several providers is split into sub-batches keyed by\n * `custom_id` and re-aggregated on every read.\n */\n\nimport { randomBytes } from 'node:crypto';\nimport { mkdir, readFile, readdir, rename, rm, writeFile } from 'node:fs/promises';\nimport { request as httpRequest } from 'node:http';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport {\n anthropicBatchDriver,\n anthropicMessageSchema,\n assertUniqueCustomIds,\n batchHandleSchema,\n BatchStore,\n BatchUnsupportedError,\n BatchValidationError,\n localQueueDriver,\n messagesBodySchema,\n newBatchId,\n openrouterBatchDriver,\n RetryableCompletionError,\n ulid,\n validateForBatch,\n type AnthropicMessage,\n type BatchCounts,\n type BatchDriver,\n type BatchHandle,\n type BatchOutcome,\n type BatchRequest,\n type BatchResultError,\n type LocalQueueDriver,\n type MessagesBody,\n} from '@agentproto/batch';\nimport { resolveModelRoute, resolveUpstreamCredential, stripThinkingFromAnthropicJson, trimTools } from './index.js';\nimport type { ModelRouteContext, UpstreamCredential } from './index.js';\nimport type { ModelPack } from './packs.js';\n\n// ── Process-local loopback bypass token ─────────────────────────────────────\n// Generated once per process, kept in memory only (never persisted, never\n// logged). The local-queue transport attaches it as `X-Proxy-Internal` on its\n// loopback call to this proxy's own `/v1/messages`; the gate in index.ts\n// accepts it as an alternative to a normal access token so the internal call\n// isn't itself blocked by LLM_ENDPOINT_ACCESS_TOKENS/LLM_ENDPOINT_EDGE_TOKENS.\nconst INTERNAL_TOKEN = randomBytes(32).toString('hex');\n\n/** The process-local loopback bypass token. Exported for tests; treat as a secret. */\nexport function getInternalProxyToken(): string {\n return INTERNAL_TOKEN;\n}\n\n/** True when `headers` carry the correct `X-Proxy-Internal` token. */\nexport function isInternalLoopbackRequest(headers: IncomingMessage['headers']): boolean {\n const raw = headers['x-proxy-internal'];\n const value = Array.isArray(raw) ? raw[0] : raw;\n return value !== undefined && value === INTERNAL_TOKEN;\n}\n\n// ── Config ───────────────────────────────────────────────────────────────\n\nconst BATCH_TTL_MS = 24 * 60 * 60 * 1000;\nconst PRUNE_AFTER_MS = 29 * 24 * 60 * 60 * 1000;\nconst DEFAULT_LOCAL_QUEUE_CONCURRENCY = 4;\n\nfunction stateDir(): string {\n return process.env.LLM_ENDPOINT_STATE_DIR || path.join(homedir(), '.agentproto', 'llm-endpoint');\n}\n\nfunction batchConcurrency(): number {\n const raw = process.env.LLM_ENDPOINT_BATCH_CONCURRENCY;\n const n = raw ? Number.parseInt(raw, 10) : NaN;\n return Number.isFinite(n) && n > 0 ? n : DEFAULT_LOCAL_QUEUE_CONCURRENCY;\n}\n\nfunction defaultLoopbackPort(): number {\n const raw = process.env.LLM_ENDPOINT_PORT ?? process.env.PORT;\n const n = raw ? Number.parseInt(raw, 10) : NaN;\n return Number.isFinite(n) ? n : 18090;\n}\n\n// ── Durable proxy-level batch record ────────────────────────────────────────\n// A composite record over one or more @agentproto/batch sub-batches, stored\n// as its own small JSON file under `<stateDir>/proxy-batches/<id>.json` — a\n// distinct namespace from `@agentproto/batch`'s own `<stateDir>/batches/<id>/`\n// layout (used below for the local-queue driver's per-item store), so the two\n// never collide even though they share a state root.\n\nconst proxySubBatchSchema = z.object({\n provider: z.enum(['anthropic', 'openrouter', 'local-queue']),\n handle: batchHandleSchema,\n customIds: z.array(z.string()),\n cancelError: z.string().nullable(),\n});\n\ntype ProxySubBatch = z.infer<typeof proxySubBatchSchema>;\ntype BatchDriverKind = ProxySubBatch['provider'];\n\nconst batchResultErrorShapeSchema = z.object({ type: z.string(), message: z.string() });\n\nconst resultLineOutcomeSchema = z.union([\n z.object({ type: z.literal('succeeded'), message: anthropicMessageSchema }),\n z.object({ type: z.literal('errored'), error: batchResultErrorShapeSchema }),\n z.object({ type: z.literal('canceled') }),\n z.object({ type: z.literal('expired') }),\n]);\n\nconst cachedResultLineSchema = z.object({\n customId: z.string(),\n result: resultLineOutcomeSchema,\n});\n\ntype CachedResultLine = z.infer<typeof cachedResultLineSchema>;\n\nconst proxyBatchRecordSchema = z.object({\n id: z.string(),\n createdAt: z.string(),\n expiresAt: z.string(),\n cancelInitiatedAt: z.string().nullable(),\n endedAt: z.string().nullable(),\n subBatches: z.array(proxySubBatchSchema),\n cachedResults: z.array(cachedResultLineSchema).nullable(),\n});\n\ntype ProxyBatchRecord = z.infer<typeof proxyBatchRecordSchema>;\n\nfunction newProxyBatchId(): string {\n return `msgbatch_${ulid()}`;\n}\n\nclass ProxyBatchFileStore {\n constructor(private readonly dir: string) {}\n\n private file(id: string): string {\n return path.join(this.dir, `${id}.json`);\n }\n\n async save(record: ProxyBatchRecord): Promise<void> {\n await mkdir(this.dir, { recursive: true });\n const target = this.file(record.id);\n const tmp = `${target}.tmp-${randomBytes(8).toString('hex')}`;\n await writeFile(tmp, JSON.stringify(record, null, 2), 'utf8');\n await rename(tmp, target);\n }\n\n async remove(id: string): Promise<void> {\n await rm(this.file(id), { force: true });\n }\n\n /** Loads a record, pruning (and returning `undefined` for) one older than 29 days. */\n async load(id: string): Promise<ProxyBatchRecord | undefined> {\n const raw = await readFile(this.file(id), 'utf8').catch(() => undefined);\n if (raw === undefined) return undefined;\n const record = proxyBatchRecordSchema.parse(JSON.parse(raw));\n if (Date.now() - Date.parse(record.createdAt) > PRUNE_AFTER_MS) {\n await this.remove(id);\n return undefined;\n }\n return record;\n }\n\n async list(): Promise<ProxyBatchRecord[]> {\n const entries = await readdir(this.dir).catch((): string[] => []);\n const records: ProxyBatchRecord[] = [];\n for (const entry of entries) {\n if (!entry.endsWith('.json') || entry.includes('.tmp-')) continue;\n const record = await this.load(entry.slice(0, -'.json'.length));\n if (record) records.push(record);\n }\n return records;\n }\n}\n\nlet _proxyStore: ProxyBatchFileStore | undefined;\nfunction proxyStore(): ProxyBatchFileStore {\n if (!_proxyStore) _proxyStore = new ProxyBatchFileStore(path.join(stateDir(), 'proxy-batches'));\n return _proxyStore;\n}\n\nlet _localQueueStore: BatchStore | undefined;\nfunction localQueueStore(): BatchStore {\n if (!_localQueueStore) _localQueueStore = new BatchStore({ stateDir: stateDir() });\n return _localQueueStore;\n}\n\n// ── Test seam ────────────────────────────────────────────────────────────\n\nexport interface BatchDriverFactories {\n anthropic?: (opts: { apiKey: string }) => BatchDriver;\n openrouter?: (opts: { apiKey: string }) => BatchDriver;\n localQueue?: (opts: { store: BatchStore; concurrency: number }) => LocalQueueDriver;\n}\n\nlet driverOverrides: BatchDriverFactories = {};\n\n/** Test seam: inject fake drivers keyed by provider. See `resetBatchState`. */\nexport function configureBatchDrivers(factories: BatchDriverFactories): void {\n driverOverrides = factories;\n}\n\n/** Resets driver overrides and cached store handles — call between tests. */\nexport function resetBatchState(): void {\n driverOverrides = {};\n _proxyStore = undefined;\n _localQueueStore = undefined;\n}\n\n// ── Loopback transport for local-queue emulation ────────────────────────────\n\nfunction makeLoopbackComplete(port: number): (body: MessagesBody) => Promise<AnthropicMessage> {\n return (body: MessagesBody) =>\n new Promise<AnthropicMessage>((resolve, reject) => {\n const payload = JSON.stringify(body);\n const outgoing = httpRequest(\n {\n hostname: '127.0.0.1',\n port,\n path: '/v1/messages',\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Content-Length': Buffer.byteLength(payload),\n 'X-Proxy-Internal': INTERNAL_TOKEN,\n },\n },\n (loopbackRes) => {\n let data = '';\n loopbackRes.setEncoding('utf8');\n loopbackRes.on('data', (chunk: string) => {\n data += chunk;\n });\n loopbackRes.on('end', () => {\n const status = loopbackRes.statusCode ?? 0;\n if (status === 429 || status >= 500) {\n reject(new RetryableCompletionError(`loopback /v1/messages returned ${status}`, status));\n return;\n }\n if (status >= 400) {\n reject(new Error(`loopback /v1/messages returned ${status}: ${data.slice(0, 200)}`));\n return;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n reject(new Error('loopback /v1/messages returned invalid JSON'));\n return;\n }\n const result = anthropicMessageSchema.safeParse(parsed);\n if (!result.success) {\n reject(new Error('loopback /v1/messages returned an unexpected message shape'));\n return;\n }\n resolve(result.data);\n });\n },\n );\n outgoing.on('error', reject);\n outgoing.write(payload);\n outgoing.end();\n });\n}\n\nfunction defaultLocalQueueDriver(opts: { store: BatchStore; concurrency: number }, port: number): LocalQueueDriver {\n return localQueueDriver({ store: opts.store, concurrency: opts.concurrency, complete: makeLoopbackComplete(port) });\n}\n\nfunction localQueueDriverInstance(port: number): LocalQueueDriver {\n const factory = driverOverrides.localQueue ?? ((o: { store: BatchStore; concurrency: number }) => defaultLocalQueueDriver(o, port));\n return factory({ store: localQueueStore(), concurrency: batchConcurrency() });\n}\n\n/** Thrown when a resolved credential can't be used for batch operations — mapped to a 401. */\nclass BatchCredentialError extends Error {}\n\nasync function getDriverForSubBatch(sub: ProxySubBatch, port: number): Promise<BatchDriver> {\n if (sub.provider === 'anthropic') {\n const cred = await resolveUpstreamCredential('anthropic');\n if (!cred || !cred.value) throw new BatchCredentialError('No API key for provider \"anthropic\"');\n if (cred.method !== 'api-key') {\n throw new BatchCredentialError(\n 'Anthropic batches require an API key credential; the resolved credential is a subscription OAuth token, which cannot be used with the Batches API.',\n );\n }\n return (driverOverrides.anthropic ?? ((o: { apiKey: string }) => anthropicBatchDriver(o)))({ apiKey: cred.value });\n }\n if (sub.provider === 'openrouter') {\n const cred = await resolveUpstreamCredential('openrouter');\n if (!cred || !cred.value) throw new BatchCredentialError('No API key for provider \"openrouter\"');\n return (driverOverrides.openrouter ?? ((o: { apiKey: string }) => openrouterBatchDriver(o)))({ apiKey: cred.value });\n }\n return localQueueDriverInstance(port);\n}\n\nfunction batchDriverKind(provider: string): BatchDriverKind {\n if (provider === 'anthropic') return 'anthropic';\n if (provider === 'openrouter') return 'openrouter';\n return 'local-queue';\n}\n\n// ── Aggregate status across sub-batches ─────────────────────────────────────\n\ninterface AggregateStatus {\n state: 'in_progress' | 'canceling' | 'ended';\n counts: BatchCounts;\n endedAt: string | null;\n}\n\nasync function computeAggregateStatus(record: ProxyBatchRecord, port: number): Promise<AggregateStatus> {\n const counts: BatchCounts = { processing: 0, succeeded: 0, errored: 0, canceled: 0, expired: 0 };\n let allTerminal = true;\n for (const sub of record.subBatches) {\n const driver = await getDriverForSubBatch(sub, port);\n const status = await driver.status(sub.handle);\n counts.processing += status.counts.processing;\n counts.succeeded += status.counts.succeeded;\n counts.errored += status.counts.errored;\n counts.canceled += status.counts.canceled;\n counts.expired += status.counts.expired;\n if (status.state !== 'ended' && status.state !== 'failed') allTerminal = false;\n }\n if (!allTerminal) {\n return { state: record.cancelInitiatedAt ? 'canceling' : 'in_progress', counts, endedAt: null };\n }\n return { state: 'ended', counts, endedAt: record.endedAt ?? new Date().toISOString() };\n}\n\nasync function getStatusAndPersist(record: ProxyBatchRecord, port: number): Promise<AggregateStatus> {\n const status = await computeAggregateStatus(record, port);\n if (status.endedAt && !record.endedAt) {\n record.endedAt = status.endedAt;\n await proxyStore().save(record);\n }\n return status;\n}\n\nfunction toBatchObject(record: ProxyBatchRecord, status: AggregateStatus) {\n return {\n id: record.id,\n type: 'message_batch' as const,\n processing_status: status.state,\n request_counts: status.counts,\n ended_at: status.endedAt,\n created_at: record.createdAt,\n expires_at: record.expiresAt,\n cancel_initiated_at: record.cancelInitiatedAt,\n results_url: status.state === 'ended' ? `/v1/messages/batches/${record.id}/results` : null,\n archived_at: null,\n };\n}\n\nfunction toResultShape(\n outcome: BatchOutcome,\n message: AnthropicMessage | undefined,\n error: BatchResultError | undefined,\n): CachedResultLine['result'] {\n switch (outcome) {\n case 'succeeded':\n if (!message) return { type: 'errored', error: { type: 'api_error', message: 'succeeded result missing a message' } };\n return { type: 'succeeded', message };\n case 'errored':\n return { type: 'errored', error: error ?? { type: 'api_error', message: 'unknown error' } };\n case 'canceled':\n return { type: 'canceled' };\n case 'expired':\n return { type: 'expired' };\n }\n}\n\n// ── Inbound validation ───────────────────────────────────────────────────\n\nconst batchCreateItemSchema = z.object({\n custom_id: z.string().min(1),\n params: messagesBodySchema,\n});\n\nconst batchCreateBodySchema = z.object({\n requests: z.array(batchCreateItemSchema).min(1),\n});\n\nfunction describeZodError(error: z.ZodError): string {\n return error.issues.map((issue) => `${issue.path.join('.') || '(root)'}: ${issue.message}`).join('; ');\n}\n\n// ── HTTP plumbing ──────────────────────────────────────────────────────────\n\nfunction respondJson(res: ServerResponse, status: number, body: unknown): void {\n res.writeHead(status, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(body));\n}\n\nfunction invalidRequest(message: string) {\n return { error: { type: 'invalid_request_error', message } };\n}\n\nfunction notFoundBatch(id: string) {\n return { error: { type: 'not_found_error', message: `Batch \"${id}\" not found.` } };\n}\n\nfunction readRequestBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n let data = '';\n req.on('data', (chunk: Buffer) => {\n data += chunk.toString('utf8');\n });\n req.on('end', () => resolve(data));\n req.on('error', reject);\n });\n}\n\nexport interface BatchesRequestContext {\n activePack: ModelPack;\n parsedUrl: URL;\n queryModelCode: string | null;\n queryProvider: string | null;\n forcedAliasCode: string | null;\n anthropicFormat: boolean;\n queryTools: string | null;\n queryNoTools: string | null;\n headerTools: string | null;\n headerNoTools: string | null;\n headerExcludeTools: string | null;\n}\n\ntype BatchesRouteMatch =\n | { kind: 'collection' }\n | { kind: 'item'; id: string }\n | { kind: 'results'; id: string }\n | { kind: 'cancel'; id: string };\n\nconst BATCHES_PATH_MARKER = '/messages/batches';\n\nfunction matchBatchesPath(urlPath: string): BatchesRouteMatch | null {\n const idx = urlPath.indexOf(BATCHES_PATH_MARKER);\n if (idx === -1) return null;\n const rest = urlPath.slice(idx + BATCHES_PATH_MARKER.length);\n if (rest === '') return { kind: 'collection' };\n const segments = rest.split('/').filter((s) => s.length > 0);\n const id = segments[0];\n if (id === undefined) return null;\n if (segments.length === 1) return { kind: 'item', id };\n const sub = segments[1];\n if (segments.length === 2 && sub === 'results') return { kind: 'results', id };\n if (segments.length === 2 && sub === 'cancel') return { kind: 'cancel', id };\n return null;\n}\n\n/**\n * Entry point wired from `index.ts`'s dispatch. Returns `true` (and takes\n * over the response, asynchronously) when `ctx`'s path is a batches route;\n * `false` lets the caller fall through to the rest of the dispatch.\n */\nexport function handleBatchesRequest(req: IncomingMessage, res: ServerResponse, ctx: BatchesRequestContext, urlPath: string): boolean {\n const match = matchBatchesPath(urlPath);\n if (!match) return false;\n void dispatchBatchesRequest(req, res, ctx, match).catch((err: unknown) => {\n if (err instanceof BatchCredentialError) {\n respondJson(res, 401, { error: { type: 'authentication_error', message: err.message } });\n return;\n }\n console.error('[Proxy][batches] unhandled error', err);\n if (res.headersSent) {\n res.end();\n return;\n }\n respondJson(res, 500, { error: { type: 'api_error', message: err instanceof Error ? err.message : 'internal error' } });\n });\n return true;\n}\n\nasync function dispatchBatchesRequest(\n req: IncomingMessage,\n res: ServerResponse,\n ctx: BatchesRequestContext,\n match: BatchesRouteMatch,\n): Promise<void> {\n const method = req.method ?? 'GET';\n const port = req.socket.localPort ?? defaultLoopbackPort();\n\n if (match.kind === 'collection') {\n if (method === 'POST') return handleCreate(req, res, ctx, port);\n if (method === 'GET') return handleList(res, ctx.parsedUrl, port);\n return respondJson(res, 404, { error: { type: 'not_found', message: 'Route not found' } });\n }\n if (match.kind === 'item') {\n if (method === 'GET') return handleRetrieve(res, match.id, port);\n if (method === 'DELETE') return handleDeleteBatch(res, match.id, port);\n return respondJson(res, 404, { error: { type: 'not_found', message: 'Route not found' } });\n }\n if (match.kind === 'results') {\n if (method === 'GET') return handleResults(res, match.id, port);\n return respondJson(res, 404, { error: { type: 'not_found', message: 'Route not found' } });\n }\n if (method === 'POST') return handleCancel(res, match.id, port);\n return respondJson(res, 404, { error: { type: 'not_found', message: 'Route not found' } });\n}\n\n// ── Create ───────────────────────────────────────────────────────────────\n\nasync function handleCreate(req: IncomingMessage, res: ServerResponse, ctx: BatchesRequestContext, port: number): Promise<void> {\n const raw = await readRequestBody(req);\n let json: unknown;\n try {\n json = JSON.parse(raw);\n } catch {\n respondJson(res, 400, invalidRequest('Invalid JSON body'));\n return;\n }\n\n const parsedBody = batchCreateBodySchema.safeParse(json);\n if (!parsedBody.success) {\n respondJson(res, 400, invalidRequest(describeZodError(parsedBody.error)));\n return;\n }\n const items = parsedBody.data.requests;\n\n try {\n assertUniqueCustomIds(items.map((item) => ({ customId: item.custom_id, body: item.params })));\n } catch (err) {\n if (!(err instanceof BatchValidationError)) throw err;\n respondJson(res, 400, invalidRequest(err.message));\n return;\n }\n\n const problems: string[] = [];\n for (const item of items) {\n try {\n validateForBatch({ customId: item.custom_id, body: item.params });\n } catch (err) {\n if (!(err instanceof BatchValidationError)) throw err;\n problems.push(err.message);\n }\n }\n if (problems.length > 0) {\n respondJson(res, 400, invalidRequest(problems.join('; ')));\n return;\n }\n\n const routeCtx: ModelRouteContext = {\n activePack: ctx.activePack,\n queryModelCode: ctx.queryModelCode,\n queryProvider: ctx.queryProvider,\n forcedAliasCode: ctx.forcedAliasCode,\n allowAliases: true,\n anthropicFormat: ctx.anthropicFormat,\n };\n\n interface ResolvedItem {\n customId: string;\n provider: string;\n body: MessagesBody;\n }\n const resolved: ResolvedItem[] = [];\n for (const item of items) {\n let target: { provider: string; model: string };\n try {\n target = resolveModelRoute(item.params, routeCtx);\n } catch (err) {\n problems.push(`\"${item.custom_id}\": ${err instanceof Error ? err.message : String(err)}`);\n continue;\n }\n const body: MessagesBody = { ...item.params, model: target.model };\n trimTools(body, {\n provider: target.provider,\n queryTools: ctx.queryTools,\n queryNoTools: ctx.queryNoTools,\n headerTools: ctx.headerTools,\n headerNoTools: ctx.headerNoTools,\n headerExcludeTools: ctx.headerExcludeTools,\n });\n resolved.push({ customId: item.custom_id, provider: target.provider, body });\n }\n if (problems.length > 0) {\n respondJson(res, 400, invalidRequest(problems.join('; ')));\n return;\n }\n\n const groups = new Map<BatchDriverKind, BatchRequest[]>();\n for (const item of resolved) {\n const kind = batchDriverKind(item.provider);\n const body = kind === 'local-queue' ? { ...item.body, model: `${item.provider}/${item.body.model}` } : item.body;\n const list = groups.get(kind);\n if (list) list.push({ customId: item.customId, body });\n else groups.set(kind, [{ customId: item.customId, body }]);\n }\n\n // Resolve+validate every needed credential BEFORE submitting anything, so a\n // missing credential for one provider doesn't leave another already submitted.\n const credentials = new Map<'anthropic' | 'openrouter', UpstreamCredential>();\n for (const kind of groups.keys()) {\n if (kind !== 'anthropic' && kind !== 'openrouter') continue;\n const cred = await resolveUpstreamCredential(kind);\n if (!cred || !cred.value) {\n respondJson(res, 401, { error: { type: 'authentication_error', message: `No API key for provider \"${kind}\"` } });\n return;\n }\n if (kind === 'anthropic' && cred.method !== 'api-key') {\n respondJson(res, 401, {\n error: {\n type: 'authentication_error',\n message:\n 'Anthropic batches require an API key credential; the resolved credential is a subscription OAuth token, which cannot be used with the Batches API.',\n },\n });\n return;\n }\n credentials.set(kind, cred);\n }\n\n const subBatches: ProxySubBatch[] = [];\n for (const [kind, requests] of groups) {\n if (kind === 'anthropic') {\n const cred = credentials.get('anthropic');\n if (!cred) throw new Error('anthropic credential resolved but missing from cache');\n const driver = (driverOverrides.anthropic ?? ((o: { apiKey: string }) => anthropicBatchDriver(o)))({ apiKey: cred.value });\n const handle = await driver.submit(requests);\n subBatches.push({ provider: 'anthropic', handle, customIds: requests.map((r) => r.customId), cancelError: null });\n } else if (kind === 'openrouter') {\n const cred = credentials.get('openrouter');\n if (!cred) throw new Error('openrouter credential resolved but missing from cache');\n const driver = (driverOverrides.openrouter ?? ((o: { apiKey: string }) => openrouterBatchDriver(o)))({ apiKey: cred.value });\n const handle = await driver.submit(requests);\n subBatches.push({ provider: 'openrouter', handle, customIds: requests.map((r) => r.customId), cancelError: null });\n } else {\n const handle: BatchHandle = {\n id: newBatchId(),\n driver: 'local-queue',\n provider: { batchIds: [] },\n createdAt: new Date().toISOString(),\n requestCount: requests.length,\n models: Array.from(new Set(requests.map((r) => r.body.model))),\n };\n await localQueueStore().create(handle, requests);\n const driver = localQueueDriverInstance(port);\n void driver.resume(handle).catch((err: unknown) => {\n console.error(`[Proxy][batches] local-queue batch \"${handle.id}\" failed`, err);\n });\n subBatches.push({ provider: 'local-queue', handle, customIds: requests.map((r) => r.customId), cancelError: null });\n }\n }\n\n const now = new Date();\n const record: ProxyBatchRecord = {\n id: newProxyBatchId(),\n createdAt: now.toISOString(),\n expiresAt: new Date(now.getTime() + BATCH_TTL_MS).toISOString(),\n cancelInitiatedAt: null,\n endedAt: null,\n subBatches,\n cachedResults: null,\n };\n await proxyStore().save(record);\n const status = await getStatusAndPersist(record, port);\n respondJson(res, 200, toBatchObject(record, status));\n}\n\n// ── Retrieve / list ──────────────────────────────────────────────────────\n\nasync function handleRetrieve(res: ServerResponse, id: string, port: number): Promise<void> {\n const record = await proxyStore().load(id);\n if (!record) {\n respondJson(res, 404, notFoundBatch(id));\n return;\n }\n const status = await getStatusAndPersist(record, port);\n respondJson(res, 200, toBatchObject(record, status));\n}\n\nasync function handleList(res: ServerResponse, parsedUrl: URL, port: number): Promise<void> {\n const records = await proxyStore().list();\n records.sort((a, b) => b.createdAt.localeCompare(a.createdAt));\n\n const limitParam = parsedUrl.searchParams.get('limit');\n const parsedLimit = limitParam ? Number.parseInt(limitParam, 10) : NaN;\n const limit = Number.isFinite(parsedLimit) && parsedLimit > 0 ? parsedLimit : records.length;\n const page = records.slice(0, limit);\n\n const data = [];\n for (const record of page) {\n const status = await getStatusAndPersist(record, port);\n data.push(toBatchObject(record, status));\n }\n respondJson(res, 200, {\n data,\n has_more: false,\n first_id: data.length > 0 ? data[0]!.id : null,\n last_id: data.length > 0 ? data[data.length - 1]!.id : null,\n });\n}\n\n// ── Results ──────────────────────────────────────────────────────────────\n\nasync function handleResults(res: ServerResponse, id: string, port: number): Promise<void> {\n const record = await proxyStore().load(id);\n if (!record) {\n respondJson(res, 404, notFoundBatch(id));\n return;\n }\n const status = await getStatusAndPersist(record, port);\n if (status.state !== 'ended') {\n respondJson(res, 404, {\n error: { type: 'not_found_error', message: `Batch \"${id}\" results are not available until processing_status is \"ended\".` },\n });\n return;\n }\n\n let lines = record.cachedResults;\n if (!lines) {\n lines = [];\n for (const sub of record.subBatches) {\n const driver = await getDriverForSubBatch(sub, port);\n for await (const r of driver.results(sub.handle)) {\n let message = r.message;\n if (sub.provider === 'openrouter' && message) {\n const stripped: unknown = JSON.parse(stripThinkingFromAnthropicJson(JSON.stringify(message)));\n const strippedResult = anthropicMessageSchema.safeParse(stripped);\n if (strippedResult.success) message = strippedResult.data;\n }\n lines.push({ customId: r.customId, result: toResultShape(r.outcome, message, r.error) });\n }\n }\n record.cachedResults = lines;\n await proxyStore().save(record);\n }\n\n res.writeHead(200, { 'Content-Type': 'application/x-jsonl; charset=utf-8' });\n for (const line of lines) {\n res.write(`${JSON.stringify({ custom_id: line.customId, result: line.result })}\\n`);\n }\n res.end();\n}\n\n// ── Cancel / delete ──────────────────────────────────────────────────────\n\nasync function handleCancel(res: ServerResponse, id: string, port: number): Promise<void> {\n const record = await proxyStore().load(id);\n if (!record) {\n respondJson(res, 404, notFoundBatch(id));\n return;\n }\n if (!record.cancelInitiatedAt) record.cancelInitiatedAt = new Date().toISOString();\n\n for (const sub of record.subBatches) {\n const driver = await getDriverForSubBatch(sub, port);\n try {\n await driver.cancel(sub.handle);\n } catch (err) {\n if (!(err instanceof BatchUnsupportedError)) throw err;\n sub.cancelError = err.message;\n }\n }\n await proxyStore().save(record);\n\n const status = await getStatusAndPersist(record, port);\n const forced: AggregateStatus = status.state === 'ended' ? status : { ...status, state: 'canceling' };\n respondJson(res, 200, toBatchObject(record, forced));\n}\n\nasync function bestEffortDeleteAnthropicBatch(sub: ProxySubBatch): Promise<void> {\n const cred = await resolveUpstreamCredential('anthropic');\n if (!cred || !cred.value || cred.method !== 'api-key') return;\n const providerId = sub.handle.provider.batchIds[0];\n if (!providerId) return;\n await fetch(`https://api.anthropic.com/v1/messages/batches/${providerId}`, {\n method: 'DELETE',\n headers: { 'x-api-key': cred.value, 'anthropic-version': '2023-06-01' },\n }).catch(() => undefined);\n}\n\nasync function handleDeleteBatch(res: ServerResponse, id: string, port: number): Promise<void> {\n const record = await proxyStore().load(id);\n if (!record) {\n respondJson(res, 404, notFoundBatch(id));\n return;\n }\n const status = await getStatusAndPersist(record, port);\n if (status.state !== 'ended') {\n respondJson(res, 409, invalidRequest(`Batch \"${id}\" cannot be deleted before it has ended.`));\n return;\n }\n for (const sub of record.subBatches) {\n if (sub.provider === 'anthropic') await bestEffortDeleteAnthropicBatch(sub);\n }\n await proxyStore().remove(id);\n respondJson(res, 200, { id, type: 'message_batch_deleted' });\n}\n\n// ── Boot-time reconciliation ─────────────────────────────────────────────\n\n/**\n * Resumes local-queue sub-batches left unfinished by a prior process's crash.\n * Native sub-batches need no boot action — their status/results are re-polled\n * from the provider on demand using the persisted handle.\n */\nexport async function resumeIncompleteLocalQueueBatches(): Promise<void> {\n const port = defaultLoopbackPort();\n const records = await proxyStore().list();\n for (const record of records) {\n for (const sub of record.subBatches) {\n if (sub.provider !== 'local-queue') continue;\n const driver = localQueueDriverInstance(port);\n void driver.resume(sub.handle).catch((err: unknown) => {\n console.error(`[Proxy][batches] failed to resume local-queue batch \"${sub.handle.id}\" on boot`, err);\n });\n }\n }\n}\n","/**\n * Named OpenAI-compatible endpoints — N local/LAN model servers (Ollama,\n * llama-server, vLLM, …) configured from a JSON file instead of one-off env\n * vars. Mirrors the field names of `openagentik/router`'s `providers[]`\n * schema (`kind`, `baseUrl`, `apiKeyEnv`, `defaultRequestFields`, `timeoutMs`)\n * so a config is portable between the two — see\n * `projects/openagentik/router/router.example.yaml` and\n * `packages/core/src/config/schema.ts` in that repo.\n *\n * Deliberately dependency-free (no zod, no fs writes) and side-effect-free at\n * import time, like packs.ts — this module is imported by both the proxy\n * (src/index.ts) and the CLI (`agentproto llm endpoints …`), which must NOT\n * pull in an HTTP server just to read/validate the config file.\n */\n\nimport { readFileSync } from 'fs';\nimport { homedir } from 'os';\nimport { resolve as resolvePath } from 'path';\nimport { isRecord } from './packs.js';\n\n/** A JSON value — what `JSON.parse` can ever produce. */\nexport type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\n\n/** Keys that would let a config override routing or auth on the outbound\n * request instead of merely defaulting a model parameter — rejected at\n * parse time regardless of value. */\nconst FORBIDDEN_DEFAULT_REQUEST_FIELD_KEYS = new Set(['model', 'messages', 'stream', 'tools', 'input']);\n\n/** Arbitrary top-level OpenAI-compatible request fields, merged UNDER the\n * client's own request (see index.ts's applyDefaultRequestFields) —\n * everything from vLLM's `chat_template_kwargs` extension to a plain field\n * like LM Studio's `reasoning_effort`. See README's \"Adding an\n * OpenAI-compatible upstream provider\" section. */\nexport type EndpointDefaultRequestFields = Record<string, JsonValue>;\n\nexport interface EndpointTimeoutConfig {\n /** Applied as the outbound socket timeout (time-to-first-byte). */\n firstTokenMs?: number;\n}\n\n/**\n * One configured endpoint. `kind` is carried (mirroring the router schema)\n * but only `\"openai\"` is meaningful here — every routable endpoint in\n * llm-endpoint speaks the OpenAI chat/completions wire shape, same as forge.\n */\nexport interface EndpointConfig {\n id: string;\n kind: 'openai';\n baseUrl: string;\n /** Name of the env var holding the key — never the key itself. Absent ⇒\n * the endpoint is always keyless (a private/LAN server with no auth). */\n apiKeyEnv?: string;\n defaultRequestFields?: EndpointDefaultRequestFields;\n timeoutMs?: EndpointTimeoutConfig;\n}\n\n/** `forge` is always the implicit `FORGE_BASE_URL`/`FORGE_API_KEY` endpoint\n * (see index.ts) — a file entry may not reuse its id. */\nconst RESERVED_ENDPOINT_IDS = new Set(['forge']);\n\nexport interface ParsedEndpointsResult {\n endpoints: EndpointConfig[];\n errors: string[];\n}\n\n/**\n * Validate one `endpoints[]` entry, appending `<where>.<field>`-scoped\n * messages to `errors`. Returns the rebuilt, typed config on success, else\n * null — mirrors packs.ts's validateModelRoute shape.\n */\nfunction validateEndpointConfig(raw: unknown, where: string, errors: string[]): EndpointConfig | null {\n if (!isRecord(raw)) {\n errors.push(`${where}: expected an object, got ${raw === null ? 'null' : typeof raw}`);\n return null;\n }\n const { id, kind, baseUrl, apiKeyEnv, defaultRequestFields, timeoutMs } = raw;\n let ok = true;\n\n if (typeof id !== 'string' || id.length === 0) {\n errors.push(`${where}.id: required non-empty string`);\n ok = false;\n }\n if (kind !== 'openai') {\n errors.push(`${where}.kind: must be \"openai\" (got ${JSON.stringify(kind)})`);\n ok = false;\n }\n\n let validUrl = false;\n if (typeof baseUrl !== 'string' || baseUrl.length === 0) {\n errors.push(`${where}.baseUrl: required non-empty string`);\n ok = false;\n } else {\n try {\n const parsed = new URL(baseUrl);\n if (parsed.protocol === 'http:' || parsed.protocol === 'https:') {\n validUrl = true;\n } else {\n errors.push(`${where}.baseUrl: must use http:// or https:// (got \"${baseUrl}\")`);\n ok = false;\n }\n } catch {\n errors.push(`${where}.baseUrl: \"${baseUrl}\" is not a valid URL`);\n ok = false;\n }\n }\n\n if (apiKeyEnv !== undefined && (typeof apiKeyEnv !== 'string' || apiKeyEnv.length === 0)) {\n errors.push(`${where}.apiKeyEnv: must be a non-empty string when present`);\n ok = false;\n }\n\n let builtFields: EndpointDefaultRequestFields | undefined;\n if (defaultRequestFields !== undefined) {\n if (!isRecord(defaultRequestFields)) {\n errors.push(`${where}.defaultRequestFields: must be an object when present`);\n ok = false;\n } else {\n const forbiddenKeys = Object.keys(defaultRequestFields).filter((k) => FORBIDDEN_DEFAULT_REQUEST_FIELD_KEYS.has(k));\n if (forbiddenKeys.length > 0) {\n errors.push(`${where}.defaultRequestFields: cannot set routing/auth field(s): ${forbiddenKeys.join(', ')}`);\n ok = false;\n } else if (defaultRequestFields.chat_template_kwargs !== undefined && !isRecord(defaultRequestFields.chat_template_kwargs)) {\n errors.push(`${where}.defaultRequestFields.chat_template_kwargs: must be an object when present`);\n ok = false;\n } else {\n // Parsed from JSON (readEndpointsFromDisk) or an equivalent literal in\n // tests — every value is already JSON-shaped, so this is a type\n // narrowing, not an unchecked assertion.\n builtFields = defaultRequestFields as EndpointDefaultRequestFields;\n }\n }\n }\n\n let builtTimeout: EndpointTimeoutConfig | undefined;\n if (timeoutMs !== undefined) {\n if (!isRecord(timeoutMs)) {\n errors.push(`${where}.timeoutMs: must be an object when present`);\n ok = false;\n } else if (\n timeoutMs.firstTokenMs !== undefined &&\n !(typeof timeoutMs.firstTokenMs === 'number' && Number.isFinite(timeoutMs.firstTokenMs) && timeoutMs.firstTokenMs > 0)\n ) {\n errors.push(`${where}.timeoutMs.firstTokenMs: must be a positive finite number when present`);\n ok = false;\n } else if (typeof timeoutMs.firstTokenMs === 'number') {\n builtTimeout = { firstTokenMs: timeoutMs.firstTokenMs };\n }\n }\n\n if (!ok || typeof id !== 'string' || typeof baseUrl !== 'string' || !validUrl) return null;\n\n const built: EndpointConfig = { id, kind: 'openai', baseUrl };\n if (typeof apiKeyEnv === 'string') built.apiKeyEnv = apiKeyEnv;\n if (builtFields) built.defaultRequestFields = builtFields;\n if (builtTimeout) built.timeoutMs = builtTimeout;\n return built;\n}\n\n/**\n * Validate the `{ endpoints: [...] }` envelope. Checks each entry's shape,\n * plus duplicate ids — including against the implicit `forge` id, which a\n * file entry may never reuse.\n */\nexport function parseEndpointsConfig(parsed: unknown): ParsedEndpointsResult {\n if (!isRecord(parsed) || !Array.isArray(parsed.endpoints)) {\n return { endpoints: [], errors: ['root: expected an object with an \"endpoints\" array'] };\n }\n const errors: string[] = [];\n const endpoints: EndpointConfig[] = [];\n const seenIds = new Set<string>(RESERVED_ENDPOINT_IDS);\n for (const [i, raw] of parsed.endpoints.entries()) {\n const built = validateEndpointConfig(raw, `endpoints[${i}]`, errors);\n if (!built) continue;\n if (seenIds.has(built.id)) {\n errors.push(\n `endpoints[${i}].id: duplicate endpoint id \"${built.id}\"` +\n (RESERVED_ENDPOINT_IDS.has(built.id) ? ' (reserved — \"forge\" is always the implicit FORGE_BASE_URL endpoint)' : ''),\n );\n continue;\n }\n seenIds.add(built.id);\n endpoints.push(built);\n }\n if (errors.length > 0) return { endpoints: [], errors };\n return { endpoints, errors: [] };\n}\n\n/** `~/.agentproto/llm-endpoints.json`, overridable via `LLM_ENDPOINT_ENDPOINTS_FILE`. */\nexport function resolveEndpointsFilePath(): string {\n const override = process.env.LLM_ENDPOINT_ENDPOINTS_FILE?.trim();\n if (override) return override;\n return resolvePath(homedir(), '.agentproto', 'llm-endpoints.json');\n}\n\nexport interface EndpointsFileLoad extends ParsedEndpointsResult {\n path: string;\n}\n\n/**\n * Read + validate the endpoints file from disk. A missing file is NOT an\n * error (fail-soft, like packs.local.json) — it means \"no named endpoints\n * configured\", which is the normal case. Malformed JSON or a shape error IS\n * an error, and yields an empty endpoint list (fail closed on that file\n * rather than partially trusting it).\n */\nexport function readEndpointsFromDisk(path: string = resolveEndpointsFilePath()): EndpointsFileLoad {\n let raw: string;\n try {\n raw = readFileSync(path, 'utf-8');\n } catch {\n return { endpoints: [], errors: [], path };\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n return { endpoints: [], errors: [`${path}: invalid JSON — ${err instanceof Error ? err.message : String(err)}`], path };\n }\n const result = parseEndpointsConfig(parsed);\n return { ...result, path };\n}\n\nlet _endpointsCache: EndpointConfig[] | null = null;\n\n/** Cached, validated endpoint list — re-read from disk on first call after\n * boot or after {@link resetConfiguredEndpointsCache}. A file-load error is\n * logged once and treated as \"no endpoints configured\" (fail-soft), mirroring\n * index.ts's getLocalPacks(). */\nexport function getConfiguredEndpoints(): EndpointConfig[] {\n if (_endpointsCache !== null) return _endpointsCache;\n const { endpoints, errors, path } = readEndpointsFromDisk();\n for (const e of errors) {\n console.warn(`[llm-endpoint] Skipping invalid endpoints file ${path} — ${e}`);\n }\n _endpointsCache = endpoints;\n return _endpointsCache;\n}\n\n/** Drop the cached endpoint list so the next call re-reads the file. */\nexport function resetConfiguredEndpointsCache(): void {\n _endpointsCache = null;\n}\n\n/** A resolved OpenAI-compatible upstream — host/port/protocol/path-prefix\n * parsed from a base URL. Shared shape for forge, nebius, and every\n * file-configured endpoint (see index.ts's ConfigurableProviderSpec). */\nexport interface ConfigurableUpstream {\n hostname: string;\n port: number;\n protocol: 'http' | 'https';\n /** URL pathname with any trailing slash stripped, e.g. \"/v1\" or \"\" for root. */\n pathPrefix: string;\n}\n\n/**\n * Parse an already-validated base URL into a routable upstream. Pure (no\n * warning side effect) — callers that need one-time-warn-on-invalid behavior\n * (forge/nebius, whose base URL comes from an env var that can go bad at any\n * time) wrap this themselves; a file-configured endpoint's baseUrl is\n * guaranteed valid by {@link parseEndpointsConfig} at load time, so this\n * never returns null for one.\n */\nexport function parseUpstreamUrl(value: string): ConfigurableUpstream | null {\n let parsed: URL;\n try {\n parsed = new URL(value);\n } catch {\n return null;\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return null;\n const protocol: 'http' | 'https' = parsed.protocol === 'http:' ? 'http' : 'https';\n const port = parsed.port ? Number(parsed.port) : (protocol === 'https' ? 443 : 80);\n const pathPrefix = parsed.pathname.replace(/\\/+$/, '');\n return { hostname: parsed.hostname, port, protocol, pathPrefix };\n}\n","import { createServer, IncomingMessage, ServerResponse, request as httpRequest } from 'http';\nimport { request as httpsRequest, RequestOptions } from 'https';\nimport { readFileSync } from 'fs';\nimport { resolve as resolvePath } from 'path';\nimport { fileURLToPath } from 'url';\nimport {\n ModelPack,\n ModelRoute,\n PACK_REGISTRY,\n resolvePack,\n buildMappingFromPack,\n listPackIds,\n matchesPattern,\n DEFAULT_PACK_ID,\n parseTransparentModel,\n KNOWN_TRANSPARENT_PROVIDERS,\n toAnthropicStyle,\n validateLocalPacks,\n isRecord,\n} from './packs.js';\nimport {\n validateResponsesRequest,\n responsesToChatCompletionsRequest,\n chatCompletionsJsonToResponses,\n OpenAIChatToResponsesStreamConverter,\n} from './responses.js';\nimport { getAuthProfile, KeychainStore } from '@agentproto/auth';\nimport { handleBatchesRequest, isInternalLoopbackRequest, resumeIncompleteLocalQueueBatches } from './batches.js';\nimport {\n getConfiguredEndpoints,\n parseUpstreamUrl,\n type ConfigurableUpstream,\n type EndpointConfig,\n type EndpointDefaultRequestFields,\n} from './endpoints.js';\n\n// Port local du proxy — surchargeable via env (LLM_ENDPOINT_PORT | PORT).\n// NOTE: evaluated once at module-load time. Set the env variable *before*\n// importing this module if you need a non-default port without passing it\n// explicitly to start(port).\nconst PORT = Number(process.env.LLM_ENDPOINT_PORT ?? process.env.PORT ?? 18090);\n\n// Helper: merged pack IDs (official + local). Cached after first call — the\n// list is effectively static once getLocalPacks() has populated its cache.\nlet _mergedPackIdsCache: string[] | null = null;\nfunction getMergedPackIds(): string[] {\n if (_mergedPackIdsCache !== null) return _mergedPackIdsCache;\n _mergedPackIdsCache = [...new Set([...listPackIds(), ...Object.keys(getLocalPacks())])];\n return _mergedPackIdsCache;\n}\n\nfunction resolvePackMerged(packId: string | null | undefined): ModelPack {\n if (!packId) packId = DEFAULT_PACK_ID;\n const local = getLocalPacks()[packId];\n if (local) return local;\n // resolvePack throws RangeError on unknown IDs; callers validate first via getMergedPackIds().\n return resolvePack(packId);\n}\n\nlet _localPacksCache: Record<string, ModelPack> | null = null;\n\n/** Outcome of reading packs.local.json from disk: the validated local packs,\n * any field-scoped validation errors, and which candidate file was used. */\ninterface LocalPacksLoad {\n packs: Record<string, ModelPack>;\n errors: string[];\n path: string | null;\n}\n\n// Read + validate local pack overrides from gitignored JSON (ESM-safe; uses\n// fileURLToPath). Searches: CWD/packs.local.json, then src/packs.local.json\n// (dev), then the directory of this module file. Returns the FIRST candidate\n// carrying a `{ packs: {...} }` envelope, validated against the ModelPack shape;\n// `errors` names each offending pack/field. Does NOT touch the cache — callers\n// decide fail-soft (load time) vs hard-fail (the reload endpoint).\nfunction readLocalPacksFromDisk(): LocalPacksLoad {\n const moduleDir = fileURLToPath(new URL('.', import.meta.url));\n const candidates = [\n resolvePath(process.cwd(), 'packs.local.json'),\n resolvePath(process.cwd(), 'src', 'packs.local.json'),\n resolvePath(moduleDir, 'packs.local.json'),\n ];\n for (const localPath of candidates) {\n let raw: string;\n try {\n raw = readFileSync(localPath, 'utf-8');\n } catch {\n // file doesn't exist — try next candidate\n continue;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n return { packs: {}, errors: [`${localPath}: invalid JSON — ${err instanceof Error ? err.message : String(err)}`], path: localPath };\n }\n // A file without a truthy `packs` envelope isn't a local-packs source —\n // ignore it and try the next candidate (unchanged from prior behaviour).\n if (!isRecord(parsed) || !('packs' in parsed) || !parsed.packs) {\n continue;\n }\n const result = validateLocalPacks(parsed);\n if (!result.ok) {\n return { packs: {}, errors: result.errors.map((e) => `${localPath}: ${e}`), path: localPath };\n }\n // validateLocalPacks (packs.ts) only checks shape — it doesn't know the\n // set of routable providers (that's runtime config: forge/nebius/the\n // endpoints file), so cross-checking each route's provider happens here,\n // at load, instead. A local pack may target a named endpoint id as its\n // provider (e.g. \"bonsai\") — anything else is a clear load-time error\n // rather than a confusing 400 the first time a client hits that code.\n const providerErrors = validateLocalPackProviders(result.packs);\n if (providerErrors.length > 0) {\n return { packs: {}, errors: providerErrors.map((e) => `${localPath}: ${e}`), path: localPath };\n }\n return { packs: result.packs, errors: [], path: localPath };\n }\n return { packs: {}, errors: [], path: null };\n}\n\n/**\n * Every route's `provider` must resolve somewhere: a canonical upstream\n * (anthropic, groq, …), forge, nebius, or a named endpoint from the\n * endpoints file. Returns one `<packId>.models.<code>.provider`-scoped\n * message per unresolvable provider — see the caller in readLocalPacksFromDisk.\n */\nfunction validateLocalPackProviders(packs: Record<string, ModelPack>): string[] {\n const errors: string[] = [];\n for (const [packId, pack] of Object.entries(packs)) {\n for (const [code, route] of Object.entries(pack.models)) {\n if (!isKnownProvider(route.provider)) {\n errors.push(\n `packs.${packId}.models.${code}.provider: unknown provider \"${route.provider}\" ` +\n `(known: ${[...KNOWN_PROVIDERS, ...getConfiguredEndpoints().map((e) => e.id)].join(', ')})`,\n );\n }\n }\n }\n return errors;\n}\n\n// Load (and cache) local pack overrides. Fail-soft at load time: an invalid\n// packs.local.json is skipped so the proxy keeps serving the built-in registry,\n// but every offending pack/field is named in the warning — the reload endpoint\n// turns the same errors into a hard 400.\nfunction getLocalPacks(): Record<string, ModelPack> {\n if (_localPacksCache !== null) return _localPacksCache;\n const { packs, errors } = readLocalPacksFromDisk();\n for (const e of errors) {\n console.warn(`[llm-endpoint] Skipping invalid packs.local.json — ${e}`);\n }\n _localPacksCache = packs;\n return _localPacksCache;\n}\n\n/**\n * Drop the cached local packs (and the derived merged-id cache) so the next\n * getLocalPacks()/getMergedPackIds() re-reads packs.local.json from disk. The\n * clear lives here rather than in the reload handler so the handler never\n * reaches into the module cache vars directly.\n */\nfunction resetLocalPacksCache(): void {\n _localPacksCache = null;\n _mergedPackIdsCache = null;\n}\n\n// Limite max d'outils par provider (au-delà, Groq renvoie 400 \"maximum number of items is 128\").\n// Les providers non listés sont illimités. Le CLI `claude` charge sa config MCP globale\n// (~/.claude + .mcp.json + skills) → dépasse souvent 128 outils → on tronque côté proxy.\nconst PROVIDER_MAX_TOOLS: Record<string, number> = {\n groq: 128,\n xai: 200\n};\n\n// Providers routables — sert d'allow-list pour l'override `?p=` et les préfixes\n// transparents `provider/model`. Un `?p=<inconnu>` laisserait sinon hostname\n// vide et échouerait plus loin avec une erreur opaque.\nconst KNOWN_PROVIDERS = new Set([...KNOWN_TRANSPARENT_PROVIDERS]);\n\n// Options bag for trimTools — avoids tracking 7 ordered positional arguments.\nexport interface ToolTrimOptions {\n provider: string;\n queryTools: string | null;\n queryNoTools: string | null;\n headerTools: string | null;\n headerNoTools: string | null;\n headerExcludeTools: string | null;\n /** Pack-level exclude patterns (pack.toolsExclude) — applied last. */\n packToolsExclude?: string[];\n /** Pack-level allow patterns (pack.toolsAllow) — applied last. */\n packToolsAllow?: string[];\n}\n\n// Trimme/strip les outils du payload selon :\n// - queryTools (\"a,b,c\") : allow-list explicite (garde uniquement ces outils, par nom).\n// - queryNoTools (\"1\") : strip TOUS les outils (+ tool_choice) → mode \"lean\".\n// - headers X-Proxy-Tools (allow-list) et X-Proxy-No-Tools (strip total)\n// - sinon : tronque au cap du provider si dépassé.\n// `toolName` extrait le nom d'un outil quelle que soit sa forme (Anthropic: .name ;\n// OpenAI function: .function.name). Doit tourner AVANT la transformation de forme\n// propre à chaque provider (ZAI/Groq mappent input_schema → function.parameters).\nexport function trimTools(payload: any, opts: ToolTrimOptions): void {\n const { provider, queryTools, queryNoTools, headerTools, headerNoTools, headerExcludeTools, packToolsExclude, packToolsAllow } = opts;\n if (!payload || !Array.isArray(payload.tools) || payload.tools.length === 0) return;\n\n // 1. Strip total demandé explicite (?notools=1 ou ?tools=none ou header X-Proxy-No-Tools: 1)\n if (queryNoTools === '1' || queryTools === 'none' || headerNoTools === '1') {\n console.log(`[Proxy][tools] strip total (${payload.tools.length} outils supprimés)`);\n delete payload.tools;\n delete payload.tool_choice;\n return;\n }\n\n // 2. Allow-list explicite (?tools=Bash,Read,Write ou header X-Proxy-Tools: Bash,Read,Write)\n // Supporte les wildcards : \"agentproto_*\" garde tous les outils dont le nom commence par \"agentproto_\".\n const allowList = headerTools || queryTools;\n if (allowList) {\n const patterns = allowList.split(',').map(s => s.trim()).filter(Boolean);\n const before = payload.tools.length;\n payload.tools = payload.tools.filter((t: any) => {\n const name = (t && (t.name || (t.function && t.function.name))) || '';\n return patterns.some(p => matchesPattern(name, p));\n });\n console.log(`[Proxy][tools] allow-list {${patterns.join(',')}} → ${before}→${payload.tools.length}`);\n if (payload.tools.length === 0) { delete payload.tools; delete payload.tool_choice; }\n return;\n }\n\n // 2b. Exclude-list via header X-Proxy-Exclude-Tools (strip certains outils, garde le reste)\n if (headerExcludeTools) {\n const patterns = headerExcludeTools.split(',').map((s: string) => s.trim()).filter(Boolean);\n const before = payload.tools.length;\n payload.tools = payload.tools.filter((t: any) => {\n const name = (t && (t.name || (t.function && t.function.name))) || '';\n return !patterns.some((p: string) => matchesPattern(name, p));\n });\n console.log(`[Proxy][tools] exclude-list {${patterns.join(',')}} → ${before}→${payload.tools.length}`);\n if (payload.tools.length === 0) { delete payload.tools; delete payload.tool_choice; }\n return;\n }\n\n // 2c. Filtres déclarés au niveau du pack (toolsExclude / toolsAllow dans le\n // pack, typically packs.local.json) — s'appliquent à TOUTE requête routée via\n // ce pack, après les overrides explicites du client (headers/query ci-dessus).\n // Cas d'usage : un client type Claude Desktop envoie des centaines de\n // définitions d'outils que le prefill upstream paie à chaque tour ; le pack\n // rogne sans que le client ait à changer.\n if (packToolsExclude && packToolsExclude.length > 0) {\n const before = payload.tools.length;\n payload.tools = payload.tools.filter((t: any) => {\n const name = (t && (t.name || (t.function && t.function.name))) || '';\n return !packToolsExclude!.some((p) => matchesPattern(name, p));\n });\n console.log(`[Proxy][tools] pack exclude-list {${packToolsExclude.join(',')}} → ${before}→${payload.tools.length}`);\n } else if (packToolsAllow && packToolsAllow.length > 0) {\n const before = payload.tools.length;\n payload.tools = payload.tools.filter((t: any) => {\n const name = (t && (t.name || (t.function && t.function.name))) || '';\n return packToolsAllow.some((p) => matchesPattern(name, p));\n });\n console.log(`[Proxy][tools] pack allow-list {${packToolsAllow.join(',')}} → ${before}→${payload.tools.length}`);\n }\n if (payload.tools.length === 0) { delete payload.tools; delete payload.tool_choice; }\n\n // 3. Troncation au cap du provider (?tools absent)\n const cap = PROVIDER_MAX_TOOLS[provider];\n if (cap && payload.tools.length > cap) {\n const before = payload.tools.length;\n payload.tools = payload.tools.slice(0, cap);\n console.log(`[Proxy][tools] troncation cap ${cap} pour ${provider} → ${before}→${payload.tools.length}`);\n }\n}\n\n// Clés API par provider — forme fixe (accès `.openrouter` etc. typé `string`,\n// pas soumis à noUncheckedIndexedAccess comme le serait un Record indexé).\ninterface ProviderKeys {\n anthropic: string;\n moonshot: string;\n openrouter: string;\n requesty: string;\n zai: string;\n groq: string;\n xai: string;\n openai: string;\n}\n\n// Résolution des clés API d'hôtes depuis les variables d'environnement.\n// Place un fichier .env à la racine du workspace ou exporte les variables\n// d'environnement avant de démarrer le serveur.\nfunction resolveSecretKeys(): ProviderKeys {\n return {\n anthropic: process.env.ANTHROPIC_API_KEY || '',\n moonshot: process.env.MOONSHOT_API_KEY || '',\n openrouter: process.env.OPENROUTER_API_KEY || '',\n requesty: process.env.REQUESTY_API_KEY || '',\n zai: process.env.ZHIPUAI_API_KEY || process.env.ZAI_API_KEY || '',\n groq: process.env.GROQ_API_KEY || '',\n xai: process.env.XAI_API_KEY || '',\n openai: process.env.OPENAI_API_KEY || '',\n };\n}\n\nfunction getResolvedKeys(): ProviderKeys {\n return resolveSecretKeys();\n}\n\n/** Re-exported for back-compat — see {@link ConfigurableUpstream} in endpoints.ts. */\nexport type { ConfigurableUpstream };\n\n/** Back-compat name — see {@link ConfigurableUpstream}. */\nexport type ForgeUpstream = ConfigurableUpstream;\n\n/**\n * A \"configurable\" provider is any OpenAI-compatible upstream wired up purely\n * from two env vars: `<PROVIDER>_BASE_URL` (scheme/host/port/path prefix) and\n * `<PROVIDER>_API_KEY` (sent as `Authorization: Bearer`, the same header shape\n * every non-anthropic/moonshot provider already gets by default). `forge`\n * (self-hosted, no default host — only exists once its base URL is set, key\n * optional) and `nebius` (hosted, has a default host, key required like every\n * fixed-hostname provider) are both instances of this — see the README's\n * \"Adding an OpenAI-compatible upstream provider\" section.\n */\ninterface ConfigurableProviderSpec {\n baseUrlEnv: string;\n apiKeyEnv: string;\n /**\n * Present ⇒ the base-URL env var is an override, not a switch — the\n * provider works out of the box against this default host (nebius).\n * Absent ⇒ the provider only exists once its base-URL env var is set\n * (forge — no sensible default for a self-hosted server).\n */\n defaultBaseUrl?: string;\n /**\n * false (forge) ⇒ a request proceeds with no `Authorization` header when\n * the key is unset, instead of the usual 401. true (nebius, and implicitly\n * every fixed-hostname provider) ⇒ a missing key 401s exactly like today.\n */\n keyRequired: boolean;\n}\n\nconst CONFIGURABLE_PROVIDERS: Record<string, ConfigurableProviderSpec> = {\n forge: { baseUrlEnv: 'FORGE_BASE_URL', apiKeyEnv: 'FORGE_API_KEY', keyRequired: false },\n nebius: {\n baseUrlEnv: 'NEBIUS_BASE_URL',\n apiKeyEnv: 'NEBIUS_API_KEY',\n defaultBaseUrl: 'https://api.studio.nebius.com/v1',\n keyRequired: true,\n },\n};\n\n/** false for every fixed-hostname provider and nebius; true for forge and every\n * file-configured named endpoint — a private/LAN server may be keyless. */\nfunction isUpstreamKeyOptional(provider: string): boolean {\n return getConfigurableProviderSpec(provider)?.keyRequired === false;\n}\n\n/**\n * Human-readable reason a configurable provider's `<model>` request can't be\n * routed: unset (forge — no default host) or malformed (either provider,\n * including a bad override on one that does have a default).\n */\nfunction configurableProviderUnavailableMessage(provider: string): string {\n const spec = CONFIGURABLE_PROVIDERS[provider];\n if (!spec) return `Provider \"${provider}\" is not configured.`;\n if (spec.defaultBaseUrl) {\n return `\"${provider}\" upstream is misconfigured — ${spec.baseUrlEnv} is set but invalid (must be a valid http:// or https:// URL).`;\n }\n return `${provider} provider not configured — set ${spec.baseUrlEnv} to enable \"${provider}/<model>\" routing.`;\n}\n\n/**\n * Parse one base-URL value into a routable upstream; shared by every\n * env-configured provider (forge, nebius). Wraps the pure\n * {@link parseUpstreamUrl} with a one-time warning on failure — a file-\n * configured endpoint doesn't need this wrapper since its baseUrl is already\n * validated at load time (see endpoints.ts's parseEndpointsConfig).\n */\nfunction parseConfigurableUpstreamUrl(value: string, provider: string): ConfigurableUpstream | null {\n let parsed: URL;\n try {\n parsed = new URL(value);\n } catch {\n warnUpstreamOnce(`${provider}:bad-url`, `[Proxy][${provider}] \"${value}\" is not a valid URL; ${provider} provider disabled.`);\n return null;\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n warnUpstreamOnce(`${provider}:bad-scheme`, `[Proxy][${provider}] \"${value}\" must use http:// or https://; ${provider} provider disabled.`);\n return null;\n }\n return parseUpstreamUrl(value);\n}\n\n/**\n * Parse `FORGE_BASE_URL` into a routable upstream. Unlike every other\n * provider here (fixed https hostname, implicit :443), forge points at a\n * private, self-hosted OpenAI-compatible server (vLLM `--enable-lora`) so the\n * scheme, host, port, and path prefix are all env-configured — e.g.\n * `http://10.0.10.20:8000/v1`. Returns null when unset or malformed, which\n * callers treat as \"forge provider not configured\" (a 400, never a crash).\n */\nexport function resolveForgeBaseUrl(raw: string | undefined = process.env.FORGE_BASE_URL): ConfigurableUpstream | null {\n const value = raw?.trim();\n if (!value) return null;\n return parseConfigurableUpstreamUrl(value, 'forge');\n}\n\n/**\n * Resolve the Nebius AI Studio upstream. Defaults to the public\n * `https://api.studio.nebius.com/v1` endpoint — nebius works with just\n * `NEBIUS_API_KEY` set. `NEBIUS_BASE_URL` overrides it, e.g. to point at a\n * Nebius *dedicated* endpoint on a different host, with no code change.\n * Returns null only when the override is set but malformed — an unset\n * `NEBIUS_BASE_URL` is the normal case and resolves to the default.\n */\nexport function resolveNebiusBaseUrl(raw: string | undefined = process.env.NEBIUS_BASE_URL): ConfigurableUpstream | null {\n const value = raw?.trim() || CONFIGURABLE_PROVIDERS.nebius!.defaultBaseUrl!;\n return parseConfigurableUpstreamUrl(value, 'nebius');\n}\n\n/**\n * A configurable provider's routing info, resolved uniformly regardless of\n * whether it's one of the two static env-configured providers (forge,\n * nebius) or a file-configured named endpoint. This is the \"ONE code path\"\n * every dispatch site (the /v1/messages switch, /v1/chat/completions,\n * /v1/responses, GET /v1/models merging, GET /v1/endpoints) goes through —\n * adding a new named endpoint to the JSON file never needs a new case\n * anywhere in this file.\n */\ninterface ResolvedConfigurableProvider {\n /** false ⇒ a request proceeds with no Authorization header when the key is\n * unset (forge, every file endpoint — a private/LAN server may be\n * keyless). true ⇒ a missing key 401s (nebius only). */\n keyRequired: boolean;\n /** Env var the key is read from. Undefined ⇒ this endpoint never sends a key. */\n apiKeyEnv?: string;\n defaultRequestFields?: EndpointDefaultRequestFields;\n resolveUpstream(): ConfigurableUpstream | null;\n unavailableMessage(): string;\n}\n\n/**\n * Look up `provider` as a configurable provider — forge/nebius (env-\n * configured, unchanged from before) or a named endpoint from the JSON file\n * (see endpoints.ts). Returns undefined for every fixed-hostname provider\n * (anthropic, groq, …), which callers fall through to their existing switch\n * for.\n */\nfunction getConfigurableProviderSpec(provider: string): ResolvedConfigurableProvider | undefined {\n const staticSpec = CONFIGURABLE_PROVIDERS[provider];\n if (staticSpec) {\n return {\n keyRequired: staticSpec.keyRequired,\n apiKeyEnv: staticSpec.apiKeyEnv,\n resolveUpstream: () => (provider === 'forge' ? resolveForgeBaseUrl() : resolveNebiusBaseUrl()),\n unavailableMessage: () => configurableProviderUnavailableMessage(provider),\n };\n }\n const fileEndpoint = getConfiguredEndpoints().find((e) => e.id === provider);\n if (fileEndpoint) {\n // Validated (a syntactically valid http(s) URL) at config-load time —\n // parseUpstreamUrl cannot fail here, but a defensive null-safe caller is\n // cheaper than a non-null assertion that a future load-path change could\n // silently invalidate.\n const upstream = parseUpstreamUrl(fileEndpoint.baseUrl);\n return {\n keyRequired: false,\n apiKeyEnv: fileEndpoint.apiKeyEnv,\n defaultRequestFields: fileEndpoint.defaultRequestFields,\n resolveUpstream: () => upstream,\n unavailableMessage: () => `\"${provider}\" endpoint is misconfigured (invalid baseUrl).`,\n };\n }\n return undefined;\n}\n\n/**\n * Merges an endpoint's `defaultRequestFields` UNDER the client's own request\n * — openai-kind dispatch only, mirrors openagentik/router's\n * `defaultRequestFields` (see endpoints.ts). Arbitrary top-level fields: the\n * client wins per top-level key; for an object-valued key (e.g. vLLM's\n * `chat_template_kwargs`) present on both sides, they merge one level deep\n * with the client's sub-keys winning.\n *\n * `skipKeys` lets a caller withhold specific default keys for reasons the\n * generic client-wins rule can't see on its own — e.g. the Anthropic\n * `/v1/messages` path, where a client's `thinking: {type:\"enabled\"}` is\n * consumed (and discarded) by `adaptAnthropicToOpenAI` before this runs, so\n * there is no `reasoning_effort` on `payload` for \"client wins\" to protect.\n */\nfunction applyDefaultRequestFields(\n payload: Record<string, unknown>,\n defaults: EndpointDefaultRequestFields | undefined,\n skipKeys?: ReadonlySet<string>,\n): void {\n if (!defaults) return;\n for (const [key, value] of Object.entries(defaults)) {\n if (skipKeys?.has(key)) continue;\n const existing = payload[key];\n if (existing === undefined) {\n payload[key] = value;\n } else if (isRecord(existing) && isRecord(value)) {\n payload[key] = { ...value, ...existing };\n }\n // else: client already sent a non-mergeable value for this key — client wins, leave as-is.\n }\n}\n\n/**\n * Dispatch an outbound upstream request over plain http or tls, chosen by\n * `protocol`. Every fixed-hostname provider is https, so this only matters\n * for a configurable provider like forge (private upstream, http OR https,\n * non-443 port).\n */\nfunction sendUpstreamRequest(\n protocol: 'http' | 'https',\n options: RequestOptions,\n callback: (res: IncomingMessage) => void,\n) {\n return protocol === 'http' ? httpRequest(options, callback) : httpsRequest(options, callback);\n}\n\n// OpenAI-compatible chat/completions endpoint for the OpenAI surface and the\n// Responses API facade. Returns null for providers that only speak the\n// Anthropic Messages shape (anthropic itself has no /chat/completions\n// endpoint) so callers can fail loud with a 400 instead of misrouting. `port`/\n// `protocol` default to 443/https when absent (every fixed-hostname provider).\nfunction getChatCompletionsEndpoint(provider: string): { hostname: string; path: string; port?: number; protocol?: 'http' | 'https' } | null {\n const configurableSpec = getConfigurableProviderSpec(provider);\n if (configurableSpec) {\n const upstream = configurableSpec.resolveUpstream();\n if (!upstream) return null;\n return { hostname: upstream.hostname, path: `${upstream.pathPrefix}/chat/completions`, port: upstream.port, protocol: upstream.protocol };\n }\n switch (provider) {\n case 'anthropic':\n return null;\n case 'openrouter':\n return { hostname: 'openrouter.ai', path: '/api/v1/chat/completions' };\n case 'requesty':\n return { hostname: 'router.requesty.ai', path: '/v1/chat/completions' };\n case 'zai':\n return { hostname: 'open.bigmodel.cn', path: '/api/paas/v4/chat/completions' };\n case 'groq':\n return { hostname: 'api.groq.com', path: '/openai/v1/chat/completions' };\n case 'xai':\n return { hostname: 'api.x.ai', path: '/v1/chat/completions' };\n case 'openai':\n return { hostname: 'api.openai.com', path: '/v1/chat/completions' };\n case 'moonshot':\n default:\n return { hostname: 'api.moonshot.ai', path: '/v1/chat/completions' };\n }\n}\n\n/** Outcome of an OpenAI-compatible `/models` probe: `ok` distinguishes \"asked\n * and it answered\" (even with zero models) from \"unreachable / malformed\n * response\" — used by GET /v1/endpoints' `reachable` field. */\ninterface ModelProbeResult {\n ok: boolean;\n ids: string[];\n}\n\n/**\n * GET `<pathPrefix>/models` against a resolved upstream and parse the\n * OpenAI-shaped `{data:[{id}]}` list. Best-effort: any failure (network\n * error, non-JSON body, timeout) resolves `{ok:false, ids:[]}` rather than\n * rejecting — the caller decides whether that's fatal.\n */\nfunction probeOpenAiModels(upstream: ConfigurableUpstream, cred: UpstreamCredential | undefined, timeoutMs: number): Promise<ModelProbeResult> {\n const headers: Record<string, string> = {};\n if (cred?.value) headers['Authorization'] = `Bearer ${cred.value}`;\n return new Promise((resolvePromise) => {\n const options: RequestOptions = {\n hostname: upstream.hostname,\n port: upstream.port,\n path: `${upstream.pathPrefix}/models`,\n method: 'GET',\n headers,\n };\n const req = sendUpstreamRequest(upstream.protocol, options, (res) => {\n let body = '';\n res.setEncoding('utf8');\n res.on('data', (chunk) => { body += chunk; });\n res.on('end', () => {\n try {\n const parsed: unknown = JSON.parse(body);\n const data = isRecord(parsed) && Array.isArray(parsed.data) ? parsed.data : [];\n const ids: string[] = data\n .map((m: unknown) => (isRecord(m) && typeof m.id === 'string' ? m.id : null))\n .filter((id: string | null): id is string => id !== null);\n resolvePromise({ ok: true, ids });\n } catch {\n resolvePromise({ ok: false, ids: [] });\n }\n });\n });\n req.on('error', () => resolvePromise({ ok: false, ids: [] }));\n req.setTimeout(timeoutMs, () => {\n req.destroy();\n resolvePromise({ ok: false, ids: [] });\n });\n req.end();\n });\n}\n\n/**\n * Live GET `${FORGE_BASE_URL}/models`, for merging into GET /v1/models.\n * Unlike every other provider here (a fixed, committed pack of model ids),\n * forge's LoRA adapters are registered on the vLLM server itself and unknown\n * ahead of time — so the id list can only come from asking it. Best-effort:\n * any failure (unset/invalid URL, network error, bad JSON, timeout) resolves\n * to an empty list rather than failing the whole /v1/models response.\n * nebius is not merged this way — its catalog is a well-known, static id\n * list a client already knows, unlike forge's dynamically-registered LoRAs.\n * Uncached — forge's base URL/key can change (env) between requests within\n * the same process, unlike a file-configured endpoint (see\n * fetchFileEndpointModelIds's 30s cache below).\n */\nasync function fetchForgeModelIds(): Promise<string[]> {\n const forge = resolveForgeBaseUrl();\n if (!forge) return [];\n const cred = await resolveUpstreamCredential('forge');\n return (await probeOpenAiModels(forge, cred, 4000)).ids;\n}\n\nconst ENDPOINT_MODEL_PROBE_TIMEOUT_MS = 4000;\nconst ENDPOINT_MODEL_CACHE_TTL_MS = 30_000;\nconst _endpointProbeCache = new Map<string, { expiresAt: number; result: ModelProbeResult }>();\n\n/**\n * Live GET `<baseUrl>/models` for one file-configured endpoint, for merging\n * into GET /v1/models as `<id>/<model>` (same idea as fetchForgeModelIds,\n * generalized to N endpoints). Cached for 30s per endpoint id — unlike forge,\n * a client may probe several named endpoints in quick succession (each model\n * listed under its own endpoint), so an uncached fan-out would multiply\n * upstream round-trips on every /v1/models call.\n */\nasync function probeFileEndpointModels(endpoint: EndpointConfig): Promise<ModelProbeResult> {\n const now = Date.now();\n const cached = _endpointProbeCache.get(endpoint.id);\n if (cached && cached.expiresAt > now) return cached.result;\n const upstream = parseUpstreamUrl(endpoint.baseUrl);\n if (!upstream) return { ok: false, ids: [] };\n const cred = await resolveUpstreamCredential(endpoint.id);\n const result = await probeOpenAiModels(upstream, cred, ENDPOINT_MODEL_PROBE_TIMEOUT_MS);\n _endpointProbeCache.set(endpoint.id, { expiresAt: now + ENDPOINT_MODEL_CACHE_TTL_MS, result });\n return result;\n}\n\nexport interface ModelRouteContext {\n activePack: ModelPack;\n queryModelCode: string | null;\n queryProvider: string | null;\n forcedAliasCode: string | null;\n /**\n * When true, the Messages path is allowed to match local-pack\n * `equivalentClaudeName` aliases. The OpenAI chat/completions and Responses\n * surfaces are always transparent and never resolve default alias packs.\n */\n allowAliases: boolean;\n /**\n * When true, the active pack has been run through {@link toAnthropicStyle}\n * for this request, so its `equivalentClaudeName` aliases are resolvable even\n * though it is an official (non-local) pack.\n */\n anthropicFormat?: boolean;\n}\n\n/** KNOWN_PROVIDERS plus every id from the endpoints file — the file's ids are\n * runtime-configured (unlike KNOWN_TRANSPARENT_PROVIDERS' static set), so\n * they're checked separately rather than folded into that Set at import time. */\nfunction isKnownProvider(provider: string): boolean {\n return KNOWN_PROVIDERS.has(provider) || getConfiguredEndpoints().some((e) => e.id === provider);\n}\n\nfunction applyProviderOverride(\n target: { provider: string; model: string; equivalentClaudeName?: string },\n providerOverride: string | null\n): { provider: string; model: string } {\n const route = { provider: target.provider, model: target.model };\n if (!providerOverride) return route;\n if (!isKnownProvider(providerOverride)) {\n const allowed = [...KNOWN_PROVIDERS, ...getConfiguredEndpoints().map((e) => e.id)];\n throw new Error(`Unknown provider \"${providerOverride}\" in ?p= (allowed: ${allowed.join(', ')})`);\n }\n return { provider: providerOverride, model: route.model };\n}\n\n/**\n * Parse a transparent `provider/model` reference against BOTH the static\n * KNOWN_TRANSPARENT_PROVIDERS set (packs.ts) and the runtime-configured\n * endpoints file — so `bonsai/bonsai-27b` routes the same way `forge/my-lora`\n * always has. packs.ts stays dependency-free (no fs); this extension lives\n * here, where the endpoints file is already read.\n */\nfunction parseAnyTransparentModel(model: string): { provider: string; model: string } | null {\n const known = parseTransparentModel(model);\n if (known) return known;\n const slashIdx = model.indexOf('/');\n if (slashIdx <= 0 || slashIdx === model.length - 1) return null;\n const provider = model.slice(0, slashIdx);\n if (!getConfiguredEndpoints().some((e) => e.id === provider)) return null;\n return { provider, model: model.slice(slashIdx + 1) };\n}\n\n/**\n * Resolves the upstream provider/model for a request.\n *\n * Messages path (`allowAliases: true`):\n * - X-Proxy-Model-Alias header / PROXY_MODEL_ALIAS env forces a pack code.\n * - Explicit ?m=<code> selects a pack code.\n * - Local packs may define `equivalentClaudeName` aliases.\n * - Public pack codes match transparent model IDs.\n * - `provider/model` references are parsed transparently.\n * - `?p=<provider>` with a bare model id routes to that provider.\n *\n * Chat/Responses paths (`allowAliases: false`):\n * - Only `provider/model` references or `?p=<provider>` with a bare model id.\n * - Pack aliases and regex fallbacks are intentionally not used.\n *\n * Throws a plain Error for unknown explicit codes/providers.\n */\nexport function resolveModelRoute(\n payload: { model?: string },\n ctx: ModelRouteContext,\n localPacks: Record<string, ModelPack> = getLocalPacks()\n): { provider: string; model: string } {\n const mapping = buildMappingFromPack(ctx.activePack);\n const isLocalPack = Boolean(localPacks[ctx.activePack.id]);\n // Alias-bearing when the pack is local OR has been transformed to Anthropic\n // style for this request. Either way its equivalentClaudeName ids resolve.\n const isAliasPack = isLocalPack || Boolean(ctx.anthropicFormat);\n\n if (ctx.forcedAliasCode) {\n const forcedCode = ctx.forcedAliasCode.toLowerCase();\n const target = Object.entries(mapping).find(([code]) => code.toLowerCase() === forcedCode)?.[1];\n if (!target) {\n throw new Error(`Unknown model alias \"${ctx.forcedAliasCode}\" in active pack \"${ctx.activePack.id}\"`);\n }\n console.log(`[Proxy] Forced model alias \"${ctx.forcedAliasCode}\" -> ${target.provider}:${target.model}`);\n return applyProviderOverride(target, ctx.queryProvider);\n }\n\n if (ctx.queryModelCode) {\n const queryCode = ctx.queryModelCode.toLowerCase();\n const target = Object.entries(mapping).find(([code]) => code.toLowerCase() === queryCode)?.[1];\n if (!target) {\n throw new Error(`Unknown model code \"${ctx.queryModelCode}\" in active pack \"${ctx.activePack.id}\"`);\n }\n console.log(`[Proxy] Detected URL model parameter code \"${ctx.queryModelCode}\" -> ${target.provider}:${target.model}`);\n return applyProviderOverride(target, ctx.queryProvider);\n }\n\n const incomingModel = (payload.model || '').trim();\n if (!incomingModel) {\n throw new Error('Missing \"model\" field in request body');\n }\n const incomingLower = incomingModel.toLowerCase();\n\n if (ctx.allowAliases && isAliasPack) {\n const aliasEntry = Object.entries(mapping).find(\n ([code, target]) =>\n target.equivalentClaudeName?.toLowerCase() === incomingLower ||\n code.toLowerCase() === incomingLower\n );\n if (aliasEntry) {\n const target = aliasEntry[1];\n console.log(`[Proxy] Matched alias \"${incomingModel}\" -> ${target.provider}:${target.model}`);\n return applyProviderOverride(target, ctx.queryProvider);\n }\n }\n\n if (ctx.allowAliases) {\n const codeEntry = Object.entries(mapping).find(([code]) => code.toLowerCase() === incomingLower);\n if (codeEntry) {\n const target = codeEntry[1];\n console.log(`[Proxy] Matched pack code \"${incomingModel}\" -> ${target.provider}:${target.model}`);\n return applyProviderOverride(target, ctx.queryProvider);\n }\n }\n\n const transparent = parseAnyTransparentModel(incomingModel);\n if (transparent) {\n console.log(`[Proxy] Transparent model reference \"${incomingModel}\" -> ${transparent.provider}:${transparent.model}`);\n return applyProviderOverride(transparent, ctx.queryProvider);\n }\n\n if (ctx.queryProvider) {\n return applyProviderOverride({ provider: ctx.queryProvider, model: incomingModel }, ctx.queryProvider);\n }\n\n throw new Error(\n `Unable to resolve model \"${incomingModel}\". Use a transparent \"provider/model\" reference (e.g. \"moonshot/kimi-k2.7-code\"), select a pack, or provide ?p=<provider>.`\n );\n}\n\nfunction readQueryAndToolOptions(parsedUrl: URL, req: IncomingMessage) {\n const queryProvider = parsedUrl.searchParams.get('p');\n const queryModelCode = parsedUrl.searchParams.get('m');\n const queryTools = parsedUrl.searchParams.get('tools');\n const queryNoTools = parsedUrl.searchParams.get('notools');\n\n const rawHeaderTools = req.headers['x-proxy-tools'];\n const headerTools: string | null = (Array.isArray(rawHeaderTools) ? rawHeaderTools[0] : rawHeaderTools) || null;\n const rawHeaderNoTools = req.headers['x-proxy-no-tools'];\n const headerNoTools: string | null = (Array.isArray(rawHeaderNoTools) ? rawHeaderNoTools[0] : rawHeaderNoTools) || null;\n const rawHeaderExcludeTools = req.headers['x-proxy-exclude-tools'];\n const headerExcludeTools: string | null = (Array.isArray(rawHeaderExcludeTools) ? rawHeaderExcludeTools[0] : rawHeaderExcludeTools) || null;\n\n const rawHeaderAlias = req.headers['x-proxy-model-alias'];\n const headerAlias = (Array.isArray(rawHeaderAlias) ? rawHeaderAlias[0] : rawHeaderAlias)?.toLowerCase().trim();\n const envAlias = process.env.PROXY_MODEL_ALIAS?.toLowerCase().trim();\n const forcedAliasCode = headerAlias || envAlias || null;\n\n // Anthropic-style format toggle — relabels the active pack's routes with\n // opaque `claude-<family>-<sha>` ids (see toAnthropicStyle). Header\n // `X-Proxy-Format: anthropic` or `?format=anthropic`.\n const rawHeaderFormat = req.headers['x-proxy-format'];\n const headerFormat = (Array.isArray(rawHeaderFormat) ? rawHeaderFormat[0] : rawHeaderFormat)?.toLowerCase().trim();\n const queryFormat = parsedUrl.searchParams.get('format')?.toLowerCase().trim();\n const anthropicFormat = headerFormat === 'anthropic' || queryFormat === 'anthropic';\n\n return {\n queryProvider,\n queryModelCode,\n queryTools,\n queryNoTools,\n headerTools,\n headerNoTools,\n headerExcludeTools,\n forcedAliasCode,\n anthropicFormat,\n };\n}\n\nfunction getApiKey(provider: string): string {\n // Configurable providers (forge, nebius, and every named endpoint from the\n // JSON file) sit outside the fixed 8-provider ProviderKeys/CANONICAL_UPSTREAMS\n // shape (env-configured URL, an optional key) — resolved separately via\n // their own apiKeyEnv rather than widening that shape for providers that\n // don't fit its \"always-on, fixed hostname\" assumptions.\n const configurable = getConfigurableProviderSpec(provider);\n if (configurable) return configurable.apiKeyEnv ? (process.env[configurable.apiKeyEnv] || '') : '';\n return getResolvedKeys()[provider as keyof ProviderKeys] || '';\n}\n\n// ── Named-auth-profile credential resolution ──────────────────────────────\n// An upstream can be authenticated from a NAMED auth-profile\n// (`@agentproto/auth`) instead of only per-provider env vars. Map a provider\n// to a profile id via `LLM_ENDPOINT_PROFILE_<PROVIDER_UPPER>`\n// (e.g. LLM_ENDPOINT_PROFILE_ANTHROPIC=claude-subs-agentik). Absent → the\n// existing env-key path is used, byte-identical to before.\n\n// Anthropic OAuth wire constants — re-declared locally as string literals\n// (mirrors remaining-quota.ts:179-181) so this package never imports\n// @agentproto/runtime.\nconst ANTHROPIC_VERSION = '2023-06-01';\nconst ANTHROPIC_OAUTH_BETA = 'oauth-2025-04-20';\n\ntype UpstreamAuthMethod = 'api-key' | 'oauth-bearer';\n\n/** A resolved upstream credential: the secret plus the header shape to use. */\nexport interface UpstreamCredential {\n value: string;\n method: UpstreamAuthMethod;\n}\n\nfunction upstreamProfileEnvVar(provider: string): string {\n return `LLM_ENDPOINT_PROFILE_${provider.toUpperCase()}`;\n}\n\n// Anthropic OAuth Access Tokens (subscription OATs) are shape-identifiable —\n// `sk-ant-oat…` — and require `Authorization: Bearer`, never `x-api-key`.\n// Mirrors the same prefix check adapters/mastra-agent and the pi CLI's own\n// SDK use; re-declared locally (not imported) for the same reason as the\n// ANTHROPIC_VERSION/ANTHROPIC_OAUTH_BETA constants above — this package\n// never imports @agentproto/runtime.\nfunction isAnthropicOAuthToken(provider: string, value: string): boolean {\n return provider === 'anthropic' && value.startsWith('sk-ant-oat');\n}\n\n// Log-once dedupe so a persistent misconfig (e.g. non-darwin keychain) doesn't\n// spam a warning on every single request.\nconst _warnedUpstream = new Set<string>();\nfunction warnUpstreamOnce(key: string, message: string): void {\n if (_warnedUpstream.has(key)) return;\n _warnedUpstream.add(key);\n console.warn(message);\n}\n\n/**\n * Resolve the outbound credential for `provider`. Mirrors getApiKey()'s\n * provider-string contract but returns the credential AND the header method.\n *\n * - `LLM_ENDPOINT_PROFILE_<P>` set → resolve the named profile:\n * • missing / disabled → undefined (caller 401s, as today)\n * • source-backed (no credRef) → undefined + a clear follow-up log\n * (self-refresh not supported here yet)\n * • credentialRef-backed → { value, method: profile.method }\n * • keychain read returns null (credential absent / present-but-unreadable\n * on a supported host, e.g. a locked Keychain) → undefined (fail-closed;\n * caller 401s — we do NOT silently downgrade a mapped profile to the env\n * key)\n * • keychain read throws (platform-unsupported backend, e.g. non-darwin\n * host) → env-key fallback + a one-time log; never crashes the request\n * - no mapping → env-key path: method is derived from the credential's own\n * shape, not hardcoded — an anthropic env key that is actually a\n * subscription OAT (`sk-ant-oat…`, e.g. injected by the runtime's\n * billing-auth resolver for a modelDerivedApiKey adapter with no\n * `authSubscription`, such as pi) resolves to \"oauth-bearer\" so\n * {@link buildUpstreamAuthHeaders} sends it as `Authorization: Bearer`\n * instead of `x-api-key` — Anthropic hard-401s an OAT presented as\n * `x-api-key` (\"invalid x-api-key\"). Any other anthropic key, and every\n * other provider, keeps \"api-key\" exactly as before.\n */\nexport async function resolveUpstreamCredential(\n provider: string,\n): Promise<UpstreamCredential | undefined> {\n const profileId = process.env[upstreamProfileEnvVar(provider)]?.trim();\n if (profileId) {\n const profile = await getAuthProfile(profileId);\n if (!profile || profile.disabled) {\n warnUpstreamOnce(\n `profile:${provider}:${profileId}`,\n `[Proxy][auth] profile \"${profileId}\" mapped for provider \"${provider}\" is ${profile ? 'disabled' : 'missing'}; request will 401. Enable/create it or unset ${upstreamProfileEnvVar(provider)}.`,\n );\n return undefined;\n }\n if (!profile.credentialRef) {\n // Source-backed profile (e.g. source:\"claude-code-oauth\"). Self-refresh\n // would require re-homing a runtime helper — out of scope for the proxy.\n warnUpstreamOnce(\n `source:${provider}:${profileId}`,\n `[Proxy][auth] profile \"${profileId}\" is source-backed (source=\"${profile.source ?? '?'}\"); source-backed profiles are not yet supported by the proxy — use a credentialRef profile or a per-provider API-key env var instead. Request will 401.`,\n );\n return undefined;\n }\n try {\n const stored = await new KeychainStore().read({ path: profile.credentialRef });\n if (!stored) {\n // Read succeeded but the credential is absent / unreadable (e.g. a\n // locked or emptied Keychain entry on a supported host). Fail closed —\n // do NOT fall back to the env key, which could silently swap in a\n // different credential for a deliberately-mapped profile.\n warnUpstreamOnce(\n `noref:${provider}:${profileId}`,\n `[Proxy][auth] profile \"${profileId}\" credentialRef resolved no stored credential; failing closed — request will 401 (no env-key fallback for a mapped profile).`,\n );\n return undefined;\n }\n return { value: stored.value, method: profile.method };\n } catch (err) {\n // Keychain backend unusable on this host (platform-unsupported, e.g. a\n // non-darwin host with no Keychain) → fall back to the env key rather than\n // failing the request. This is the ONLY keychain path that degrades to the\n // env key; a null read above fails closed instead.\n warnUpstreamOnce(\n `keychain:${provider}:${profileId}`,\n `[Proxy][auth] keychain backend unavailable for profile \"${profileId}\" (${(err as Error).message}); platform-unsupported — falling back to the ${provider} env key.`,\n );\n // fall through to the env-key path below\n }\n }\n // No mapping (or keychain fallback): existing env-key path, method now\n // shape-derived instead of hardcoded (see doc comment above).\n const value = getApiKey(provider);\n return { value, method: isAnthropicOAuthToken(provider, value) ? 'oauth-bearer' : 'api-key' };\n}\n\n/**\n * Single source of truth for the outbound upstream-auth header shape. Given a\n * resolved credential, returns the auth-related headers to merge into the\n * request. For an `api-key` credential each provider keeps its existing header\n * exactly; for `oauth-bearer` (only meaningful on the anthropic upstream) it\n * emits the Bearer + anthropic-version + anthropic-beta triple.\n *\n * Fail-closed: an `oauth-bearer` credential (e.g. a Claude subscription OAT)\n * resolved for a NON-anthropic provider returns `null` — the token is never\n * emitted to a third-party upstream. Callers MUST treat `null` as a hard 401\n * and send no request.\n */\nexport function buildUpstreamAuthHeaders(\n provider: string,\n cred: UpstreamCredential,\n): Record<string, string> | null {\n const { value, method } = cred;\n\n if (method === 'oauth-bearer') {\n if (provider !== 'anthropic') {\n // oauth-bearer is only meaningful for the anthropic upstream. Sending a\n // Claude subscription OAT to any other host would leak the token to a\n // third party — reject rather than forward it.\n warnUpstreamOnce(\n `oauth-misconfig:${provider}`,\n `[Proxy][auth] oauth-bearer credential resolved for non-anthropic provider \"${provider}\"; refusing to forward it (subscription/oauth credentials are only valid for the anthropic upstream). Request will 401.`,\n );\n return null;\n }\n return {\n 'Authorization': `Bearer ${value}`,\n 'anthropic-version': ANTHROPIC_VERSION,\n 'anthropic-beta': ANTHROPIC_OAUTH_BETA,\n };\n }\n\n // api-key — preserve each provider's existing header shape verbatim.\n switch (provider) {\n case 'anthropic':\n return { 'x-api-key': value, 'anthropic-version': ANTHROPIC_VERSION };\n case 'moonshot':\n return { 'X-API-Key': value };\n // openrouter/requesty also set `anthropic-version` at their call sites\n // (left inline — it is a request-shape header, not an auth header).\n default:\n return { 'Authorization': `Bearer ${value}` };\n }\n}\n\n/**\n * Fail-closed guard for the OpenAI-compatible surfaces (/v1/responses,\n * /v1/chat/completions). Those surfaces are ALWAYS non-anthropic\n * (getChatCompletionsEndpoint returns null for anthropic) and forward the\n * resolved credential as `Authorization: Bearer <value>` — so only an\n * `api-key` credential may be used. A subscription/oauth credential (e.g. a\n * Claude OAT) must be rejected, never leaked to a third-party host.\n *\n * Returns true when the credential may proceed on this surface. An absent\n * credential returns true here (the caller's missing-key check 401s it).\n */\nexport function isCredentialAllowedOnOpenAiSurface(\n cred: UpstreamCredential | undefined,\n): boolean {\n return !cred || cred.method === 'api-key';\n}\n\n// ── Per-upstream credential status (GET /v1/upstreams) ────────────────────────\n// A read-only view of HOW a credential would resolve for each canonical\n// upstream — the profile/env/none precedence resolveUpstreamCredential itself\n// applies — WITHOUT ever returning the secret. Powers the vscode Upstreams\n// subtree + the optional live test below.\n\n// The 8 canonical upstreams. Built from a `Record<keyof ProviderKeys, …>` so\n// the compiler forces this list to stay exactly in sync with ProviderKeys\n// (every key required, no extras) — no drift, no runtime cost.\nconst CANONICAL_UPSTREAM_ORDER: Record<keyof ProviderKeys, true> = {\n anthropic: true,\n moonshot: true,\n openrouter: true,\n requesty: true,\n zai: true,\n groq: true,\n xai: true,\n openai: true,\n};\nexport const CANONICAL_UPSTREAMS = Object.keys(CANONICAL_UPSTREAM_ORDER) as (keyof ProviderKeys)[];\n\n/** Narrow an arbitrary provider string to one of the canonical upstreams. */\nexport function isCanonicalUpstream(provider: string): provider is keyof ProviderKeys {\n return (CANONICAL_UPSTREAMS as readonly string[]).includes(provider);\n}\n\n/** How a credential WOULD resolve for an upstream (never leaks the value). */\nexport type UpstreamSource = 'profile' | 'env' | 'none';\n\n/**\n * Non-secret status of one upstream's outbound credential:\n * - `linkedProfile`: the `LLM_ENDPOINT_PROFILE_<P>` profile id, or null.\n * - `source`: how a credential would resolve — a mapped profile (\"profile\",\n * even if that profile is missing/disabled), else a non-empty per-provider\n * env key (\"env\"), else \"none\".\n * - `method`: the outbound auth shape — the mapped profile's method, or\n * \"api-key\" for the env path, or null when nothing is configured.\n * - `present`: whether a credential actually resolves. Known for free for the\n * env (\"env\" ⇒ true) and none (\"none\" ⇒ false) sources; for a profile source\n * it is `null` unless `?probe=1` was requested, because confirming it reads\n * the OS keychain (one read per mapped profile).\n */\nexport interface UpstreamStatus {\n provider: string;\n linkedProfile: string | null;\n source: UpstreamSource;\n method: UpstreamAuthMethod | null;\n present: boolean | null;\n}\n\n/**\n * Whether a credential actually resolves for `provider`, as a pure boolean —\n * reuses resolveUpstreamCredential's exact precedence (profile → keychain →\n * env fallback) and NEVER exposes the value. For a profile source this reads\n * the keychain, so it is only called on the `?probe=1` path.\n */\nasync function upstreamCredentialPresent(provider: string): Promise<boolean> {\n const cred = await resolveUpstreamCredential(provider);\n return Boolean(cred?.value);\n}\n\n/**\n * Describe one upstream's credential status without returning a secret. The\n * default (mapping-only) view is cheap — an env-var read plus, for a mapped\n * provider, one auth-profiles.json read for the method. `present` for a profile\n * source is filled only when `opts.probe` is set (it costs a keychain read).\n */\nexport async function describeUpstreamStatus(\n provider: string,\n opts: { probe: boolean },\n): Promise<UpstreamStatus> {\n const linkedProfile = process.env[upstreamProfileEnvVar(provider)]?.trim() || null;\n if (linkedProfile) {\n // Profile metadata only (no keychain, no secret) — `method` and whether the\n // mapped profile even exists. `source` stays \"profile\" regardless: a\n // missing/disabled profile still describes intent, and `present` (on probe)\n // tells the truth about whether it resolves.\n const profile = await getAuthProfile(linkedProfile);\n const present = opts.probe ? await upstreamCredentialPresent(provider) : null;\n return { provider, linkedProfile, source: 'profile', method: profile?.method ?? null, present };\n }\n // getApiKey returns the env secret — used ONLY as a boolean here, never\n // returned. A non-empty env key ⇒ present:true for free.\n if (getApiKey(provider)) {\n return { provider, linkedProfile: null, source: 'env', method: 'api-key', present: true };\n }\n return { provider, linkedProfile: null, source: 'none', method: null, present: false };\n}\n\n/** Status for all 8 canonical upstreams, in ProviderKeys order. */\nexport async function collectUpstreamStatuses(opts: { probe: boolean }): Promise<UpstreamStatus[]> {\n return Promise.all(CANONICAL_UPSTREAMS.map((provider) => describeUpstreamStatus(provider, opts)));\n}\n\n// ── Per-upstream live test (POST /v1/upstreams/:provider/test) ────────────────\n// Best-effort, time-boxed: the CHEAPEST authenticated call to an upstream (a\n// models-list GET / key-info GET — no token cost) using the resolved\n// credential, reporting only {ok, status, detail} — never a secret, never the\n// upstream body. Upstreams with no cheap safe probe return {ok:null,\n// reason:\"no-probe\"} rather than inventing a costly call.\n\nconst UPSTREAM_TEST_TIMEOUT_MS = 4000;\n\ninterface UpstreamProbe {\n hostname: string;\n path: string;\n}\n\n/**\n * The cheapest authenticated GET that verifies an upstream credential. Most\n * providers expose an OpenAI-style `/v1/models` that 401s without a valid key;\n * anthropic has its native Models API; openrouter's `/api/v1/key` returns the\n * key's own metadata. Returns null for a provider with no cheap safe probe\n * (caller responds {ok:null, reason:\"no-probe\"}).\n *\n * NOTE (honesty): the zai / requesty paths are best-effort and unverified live\n * — a wrong path surfaces honestly as a non-2xx `status` with a \"not found\"\n * detail, distinct from the 401/403 \"credential rejected\" verdict.\n */\nfunction getUpstreamProbe(provider: string): UpstreamProbe | null {\n switch (provider) {\n case 'anthropic':\n return { hostname: 'api.anthropic.com', path: '/v1/models?limit=1' };\n case 'moonshot':\n return { hostname: 'api.moonshot.ai', path: '/v1/models' };\n case 'openrouter':\n return { hostname: 'openrouter.ai', path: '/api/v1/key' };\n case 'requesty':\n return { hostname: 'router.requesty.ai', path: '/v1/models' };\n case 'zai':\n return { hostname: 'open.bigmodel.cn', path: '/api/paas/v4/models' };\n case 'groq':\n return { hostname: 'api.groq.com', path: '/openai/v1/models' };\n case 'xai':\n return { hostname: 'api.x.ai', path: '/v1/models' };\n case 'openai':\n return { hostname: 'api.openai.com', path: '/v1/models' };\n default:\n return null;\n }\n}\n\n/** The result of a per-upstream live test — a verdict, or \"no cheap probe\". */\nexport type UpstreamTestResult =\n | { ok: boolean; status: number; detail: string }\n | { ok: null; reason: 'no-probe' };\n\n/** Human-readable interpretation of a probe's HTTP status (no secret). */\nfunction describeProbeStatus(status: number): string {\n if (status >= 200 && status < 300) return 'authenticated ok';\n if (status === 401 || status === 403) return 'credential rejected';\n if (status === 404) return 'probe endpoint not found (best-effort path)';\n if (status === 429) return 'rate limited';\n return `unexpected status ${status}`;\n}\n\n/**\n * Issue the time-boxed authenticated GET and resolve to {ok, status, detail}.\n * The upstream body is drained and discarded — only the HTTP status shapes the\n * verdict, so no account identifiers or secrets can leak through. Network\n * errors / timeouts resolve (never reject) with ok:false and status 0.\n */\nfunction probeUpstreamHttp(\n probe: UpstreamProbe,\n headers: Record<string, string>,\n timeoutMs: number,\n): Promise<{ ok: boolean; status: number; detail: string }> {\n return new Promise((resolvePromise) => {\n const proxyReq = httpsRequest(\n { hostname: probe.hostname, port: 443, path: probe.path, method: 'GET', headers },\n (proxyRes) => {\n const status = proxyRes.statusCode ?? 0;\n proxyRes.on('data', () => {}); // drain + discard — never parsed/returned\n proxyRes.on('end', () =>\n resolvePromise({ ok: status >= 200 && status < 300, status, detail: describeProbeStatus(status) }),\n );\n },\n );\n proxyReq.on('error', (err) =>\n resolvePromise({ ok: false, status: 0, detail: `network error: ${err.message}` }),\n );\n proxyReq.setTimeout(timeoutMs, () => {\n proxyReq.destroy();\n resolvePromise({ ok: false, status: 0, detail: `timed out after ${timeoutMs}ms` });\n });\n proxyReq.end();\n });\n}\n\n/**\n * Run the cheapest authenticated call for `provider` and return a verdict.\n * Resolves the credential through the same precedence as a real request, then\n * uses buildUpstreamAuthHeaders for the exact per-provider header shape — so an\n * oauth-bearer credential mis-mapped to a non-anthropic upstream is refused\n * (never forwarded) rather than tested.\n */\nexport async function testUpstream(provider: string): Promise<UpstreamTestResult> {\n const probe = getUpstreamProbe(provider);\n if (!probe) return { ok: null, reason: 'no-probe' };\n const cred = await resolveUpstreamCredential(provider);\n if (!cred?.value) {\n return { ok: false, status: 401, detail: 'no credential resolved for this upstream' };\n }\n const authHeaders = buildUpstreamAuthHeaders(provider, cred);\n if (!authHeaders) {\n return { ok: false, status: 401, detail: 'resolved credential is not forwardable to this upstream' };\n }\n return probeUpstreamHttp(probe, authHeaders, UPSTREAM_TEST_TIMEOUT_MS);\n}\n\n/**\n * GET /v1/upstreams — write the per-upstream credential status list. Async\n * (profile/keychain reads) so it's invoked fire-and-forget from the sync\n * server callback; a resolution failure returns a 500 rather than hanging.\n */\nasync function handleUpstreamsStatus(res: ServerResponse, opts: { probe: boolean }): Promise<void> {\n try {\n const data = await collectUpstreamStatuses(opts);\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ object: 'list', probe: opts.probe, data }));\n } catch (e) {\n console.error('[Proxy][upstreams] status error', e);\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'api_error', message: e instanceof Error ? e.message : String(e) } }));\n }\n}\n\n/**\n * POST /v1/upstreams/:provider/test — write the per-upstream live-test verdict.\n * A non-canonical provider is a 404; everything else returns {provider, ...}\n * with the {ok, status, detail} or {ok:null, reason} shape.\n */\nasync function handleUpstreamTest(res: ServerResponse, provider: string): Promise<void> {\n try {\n if (!isCanonicalUpstream(provider)) {\n res.writeHead(404, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: `Unknown upstream \"${provider}\". Known: ${CANONICAL_UPSTREAMS.join(', ')}` } }));\n return;\n }\n const result = await testUpstream(provider);\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ provider, ...result }));\n } catch (e) {\n console.error('[Proxy][upstreams] test error', e);\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'api_error', message: e instanceof Error ? e.message : String(e) } }));\n }\n}\n\n/** One GET /v1/endpoints entry — never a credential, only whether one resolved. */\ninterface EndpointHealth {\n id: string;\n baseUrl: string;\n reachable: boolean;\n models: string[];\n latencyMs: number;\n}\n\nasync function describeEndpointHealth(id: string, upstream: ConfigurableUpstream): Promise<EndpointHealth> {\n const baseUrl = `${upstream.protocol}://${upstream.hostname}:${upstream.port}${upstream.pathPrefix}`;\n const cred = await resolveUpstreamCredential(id);\n const start = Date.now();\n const { ok, ids } = await probeOpenAiModels(upstream, cred, ENDPOINT_MODEL_PROBE_TIMEOUT_MS);\n return { id, baseUrl, reachable: ok, models: ids, latencyMs: Date.now() - start };\n}\n\n/**\n * GET /v1/endpoints — write the health of forge (if configured) plus every\n * file-configured named endpoint. Best-effort per entry: one endpoint being\n * unreachable never fails the whole response (each probe already resolves\n * `{ok:false}` rather than throwing).\n */\nasync function handleEndpointsStatus(res: ServerResponse): Promise<void> {\n try {\n const entries: EndpointHealth[] = [];\n const forge = resolveForgeBaseUrl();\n if (forge) entries.push(await describeEndpointHealth('forge', forge));\n for (const endpoint of getConfiguredEndpoints()) {\n const upstream = parseUpstreamUrl(endpoint.baseUrl);\n if (!upstream) continue; // guaranteed valid at config-load time; defensive only\n entries.push(await describeEndpointHealth(endpoint.id, upstream));\n }\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ object: 'list', data: entries }));\n } catch (e) {\n console.error('[Proxy][endpoints] status error', e);\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'api_error', message: e instanceof Error ? e.message : String(e) } }));\n }\n}\n\n/**\n * Handles POST /v1/responses (and /v1/{pack}/responses).\n *\n * Validates the Responses API request, translates it to an OpenAI Chat\n * Completions request, forwards it to the provider's OpenAI-compatible\n * endpoint, and converts the upstream response back to the Responses API\n * format (JSON or SSE).\n */\nfunction handleResponsesRequest(\n req: IncomingMessage,\n res: ServerResponse,\n opts: {\n activePack: ModelPack;\n queryModelCode: string | null;\n queryProvider: string | null;\n queryTools: string | null;\n queryNoTools: string | null;\n headerTools: string | null;\n headerNoTools: string | null;\n headerExcludeTools: string | null;\n forcedAliasCode: string | null;\n }\n): void {\n let body = '';\n req.on('data', chunk => {\n body += chunk;\n });\n\n req.on('end', async () => {\n try {\n const payload = JSON.parse(body);\n const validated = validateResponsesRequest(payload);\n\n let resolvedTarget: { provider: string; model: string };\n try {\n resolvedTarget = resolveModelRoute(validated, {\n activePack: opts.activePack,\n queryModelCode: null, // Responses facade uses transparent routing only\n queryProvider: opts.queryProvider,\n forcedAliasCode: null,\n allowAliases: false,\n });\n } catch (e: any) {\n console.warn(`[Proxy][responses] ${e.message}`);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: e.message } }));\n return;\n }\n\n const chatPayload = responsesToChatCompletionsRequest(validated, resolvedTarget);\n\n trimTools(chatPayload, {\n provider: resolvedTarget.provider,\n queryTools: opts.queryTools,\n queryNoTools: opts.queryNoTools,\n headerTools: opts.headerTools,\n headerNoTools: opts.headerNoTools,\n headerExcludeTools: opts.headerExcludeTools,\n });\n\n const responsesConfigurableSpec = getConfigurableProviderSpec(resolvedTarget.provider);\n const endpoint = getChatCompletionsEndpoint(resolvedTarget.provider);\n if (!endpoint) {\n const message = responsesConfigurableSpec\n ? responsesConfigurableSpec.unavailableMessage()\n : `Provider \"${resolvedTarget.provider}\" does not support the OpenAI-compatible /v1/responses surface.`;\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message } }));\n return;\n }\n // chatPayload is the strongly-typed ChatCompletionsRequestBody (no index\n // signature); defaultRequestFields may carry arbitrary vendor fields\n // (e.g. LM Studio's reasoning_effort) that aren't part of that type but\n // still belong on the outbound wire payload.\n if (responsesConfigurableSpec) applyDefaultRequestFields(chatPayload as unknown as Record<string, unknown>, responsesConfigurableSpec.defaultRequestFields);\n const { hostname, path, port = 443, protocol = 'https' } = endpoint;\n const cred = await resolveUpstreamCredential(resolvedTarget.provider);\n const targetApiKey = cred?.value ?? '';\n // Fail closed: this OpenAI-compatible surface is ALWAYS non-anthropic\n // (getChatCompletionsEndpoint returns null for anthropic). A non-api-key\n // credential (e.g. a Claude subscription OAT) must never be forwarded as a\n // Bearer token to a third-party host — reject before sending the request.\n if (!isCredentialAllowedOnOpenAiSurface(cred)) {\n console.warn(`[Proxy][responses] refusing to forward a ${cred!.method} credential to non-anthropic provider \"${resolvedTarget.provider}\"; returning 401.`);\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'authentication_error', message: `Subscription/oauth credentials cannot be used on this OpenAI-compatible surface for provider \"${resolvedTarget.provider}\".` } }));\n return;\n }\n // A configurable provider may declare its key optional (forge — a\n // private/self-hosted server); every other provider (including nebius)\n // requires one and 401s when absent, exactly as before.\n if (!targetApiKey && !isUpstreamKeyOptional(resolvedTarget.provider)) {\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'authentication_error', message: `No API key for provider \"${resolvedTarget.provider}\"` } }));\n return;\n }\n\n console.log(`[Proxy Sortant][responses] Redirection vers ${resolvedTarget.provider} (${hostname}${path}) avec le modèle \"${chatPayload.model}\"`);\n\n // OpenAI-compatible surface — always Authorization: Bearer (never a\n // provider's Anthropic-surface header). buildUpstreamAuthHeaders is\n // keyed on provider, not surface, so it is NOT used here; only the\n // resolved credential value is (credentialRef-backed profiles included).\n const options: RequestOptions = {\n hostname,\n port,\n path,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(targetApiKey ? { 'Authorization': `Bearer ${targetApiKey}` } : {}),\n },\n };\n\n const proxyReq = sendUpstreamRequest(protocol, options, (proxyRes) => {\n const status = proxyRes.statusCode || 200;\n const contentType = proxyRes.headers['content-type'] as string || '';\n const isStreaming = validated.stream === true && /text\\/event-stream/i.test(contentType);\n\n if (isStreaming) {\n const respHeaders: Record<string, string | string[] | undefined> = { ...proxyRes.headers };\n delete respHeaders['content-length'];\n delete respHeaders['transfer-encoding'];\n respHeaders['content-type'] = 'text/event-stream';\n res.writeHead(status, respHeaders);\n const converter = new OpenAIChatToResponsesStreamConverter({ requestedModel: validated.model });\n proxyRes.setEncoding('utf8');\n proxyRes.on('data', (c: string) => {\n for (const out of converter.push(c)) res.write(out);\n });\n proxyRes.on('end', () => {\n for (const out of converter.flush()) res.write(out);\n res.end();\n });\n } else {\n const respHeaders: Record<string, string | string[] | undefined> = { ...proxyRes.headers };\n delete respHeaders['content-length'];\n delete respHeaders['transfer-encoding'];\n respHeaders['content-type'] = 'application/json';\n res.writeHead(status, respHeaders);\n let upstreamBody = '';\n proxyRes.setEncoding('utf8');\n proxyRes.on('data', (c: string) => { upstreamBody += c; });\n proxyRes.on('end', () => {\n res.end(chatCompletionsJsonToResponses(upstreamBody || '{}', { requestedModel: validated.model }));\n });\n }\n });\n\n proxyReq.on('error', (err) => {\n console.error('[Proxy SORTANT error]', err);\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'api_error', message: err.message } }));\n });\n\n proxyReq.write(JSON.stringify(chatPayload));\n proxyReq.end();\n\n } catch (e: any) {\n console.error('[Payload Error]', e);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: e.message } }));\n }\n });\n}\n\n/**\n * Handles POST /v1/chat/completions (and /v1/{pack}/chat/completions).\n *\n * This is the normal OpenAI-compatible surface. It does not perform Anthropic\n * schema adaptation; it resolves a transparent `provider/model` reference and\n * forwards the request to the matching provider chat/completions endpoint.\n */\nfunction handleChatCompletionsRequest(\n req: IncomingMessage,\n res: ServerResponse,\n opts: {\n activePack: ModelPack;\n queryProvider: string | null;\n queryTools: string | null;\n queryNoTools: string | null;\n headerTools: string | null;\n headerNoTools: string | null;\n headerExcludeTools: string | null;\n }\n): void {\n let body = '';\n req.on('data', chunk => {\n body += chunk;\n });\n\n req.on('end', async () => {\n try {\n const payload = JSON.parse(body);\n\n let resolvedTarget: { provider: string; model: string };\n try {\n resolvedTarget = resolveModelRoute(payload, {\n activePack: opts.activePack,\n queryModelCode: null,\n queryProvider: opts.queryProvider,\n forcedAliasCode: null,\n allowAliases: false,\n });\n } catch (e: any) {\n console.warn(`[Proxy][chat/completions] ${e.message}`);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: e.message } }));\n return;\n }\n\n payload.model = resolvedTarget.model;\n\n trimTools(payload, {\n provider: resolvedTarget.provider,\n queryTools: opts.queryTools,\n queryNoTools: opts.queryNoTools,\n headerTools: opts.headerTools,\n headerNoTools: opts.headerNoTools,\n headerExcludeTools: opts.headerExcludeTools,\n });\n\n const chatConfigurableSpec = getConfigurableProviderSpec(resolvedTarget.provider);\n const endpoint = getChatCompletionsEndpoint(resolvedTarget.provider);\n if (!endpoint) {\n const message = chatConfigurableSpec\n ? chatConfigurableSpec.unavailableMessage()\n : `Provider \"${resolvedTarget.provider}\" does not support the OpenAI-compatible /v1/chat/completions surface.`;\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message } }));\n return;\n }\n if (chatConfigurableSpec) applyDefaultRequestFields(payload, chatConfigurableSpec.defaultRequestFields);\n const { hostname, path, port = 443, protocol = 'https' } = endpoint;\n const cred = await resolveUpstreamCredential(resolvedTarget.provider);\n const targetApiKey = cred?.value ?? '';\n // Fail closed: this OpenAI-compatible surface is ALWAYS non-anthropic\n // (getChatCompletionsEndpoint returns null for anthropic). A non-api-key\n // credential (e.g. a Claude subscription OAT) must never be forwarded as a\n // Bearer token to a third-party host — reject before sending the request.\n if (!isCredentialAllowedOnOpenAiSurface(cred)) {\n console.warn(`[Proxy][chat/completions] refusing to forward a ${cred!.method} credential to non-anthropic provider \"${resolvedTarget.provider}\"; returning 401.`);\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'authentication_error', message: `Subscription/oauth credentials cannot be used on this OpenAI-compatible surface for provider \"${resolvedTarget.provider}\".` } }));\n return;\n }\n // A configurable provider may declare its key optional (forge — a\n // private/self-hosted server); every other provider (including nebius)\n // requires one and 401s when absent, exactly as before.\n if (!targetApiKey && !isUpstreamKeyOptional(resolvedTarget.provider)) {\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'authentication_error', message: `No API key for provider \"${resolvedTarget.provider}\"` } }));\n return;\n }\n\n console.log(`[Proxy Sortant][chat/completions] Redirection vers ${resolvedTarget.provider} (${hostname}${path}) avec le modèle \"${payload.model}\"`);\n\n // OpenAI-compatible surface — always Authorization: Bearer (see the\n // /v1/responses handler above for why buildUpstreamAuthHeaders, which is\n // keyed on provider not surface, is deliberately not used here).\n const options: RequestOptions = {\n hostname,\n port,\n path,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(targetApiKey ? { 'Authorization': `Bearer ${targetApiKey}` } : {}),\n },\n };\n\n const proxyReq = sendUpstreamRequest(protocol, options, (proxyRes) => {\n const status = proxyRes.statusCode || 200;\n const respHeaders: Record<string, string | string[] | undefined> = { ...proxyRes.headers };\n delete respHeaders['content-length'];\n delete respHeaders['transfer-encoding'];\n res.writeHead(status, respHeaders);\n proxyRes.pipe(res);\n });\n\n proxyReq.on('error', (err) => {\n console.error('[Proxy SORTANT error]', err);\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'api_error', message: err.message } }));\n });\n\n proxyReq.write(JSON.stringify(payload));\n proxyReq.end();\n\n } catch (e: any) {\n console.error('[Payload Error]', e);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: e.message } }));\n }\n });\n}\n\n// Adapte un payload Anthropic Messages vers le schéma OpenAI Chat Completions\n// (Groq / OpenRouter / ZAI / xAI / OpenAI). Moonshot expose un endpoint /anthropic\n// natif et n'a PAS besoin de cette adaptation. Renvoie les champs problématiques\n// supprimés et les champs sémantiquement équivalents convertis (system,\n// tool_choice, stop).\nfunction adaptAnthropicToOpenAI(payload: any) {\n // 1. system (string | content blocks) -> message role:system en tête de messages\n if (payload.system != null) {\n let sysText = '';\n if (typeof payload.system === 'string') {\n sysText = payload.system;\n } else if (Array.isArray(payload.system)) {\n sysText = payload.system\n .map((b: any) => (typeof b === 'string' ? b : b?.text ?? ''))\n .filter(Boolean)\n .join('\\n\\n');\n }\n if (sysText) {\n if (!Array.isArray(payload.messages)) payload.messages = [];\n // Évite le double si un message system existe déjà en tête.\n if (!payload.messages[0] || payload.messages[0].role !== 'system') {\n payload.messages.unshift({ role: 'system', content: sysText });\n }\n }\n delete payload.system;\n }\n\n // 2. tool_choice : {type:auto|any|tool|none, name?} -> schéma OpenAI.\n // Groq n'accepte QUE \"auto\"/\"none\"/function — pas \"required\" — donc on\n // mappe any -> \"auto\" (perte sémantique mineure, mais accepté partout).\n if (payload.tool_choice && typeof payload.tool_choice === 'object') {\n const tc = payload.tool_choice;\n if (tc.type === 'any') {\n payload.tool_choice = 'auto';\n } else if (tc.type === 'tool' && tc.name) {\n payload.tool_choice = { type: 'function', function: { name: tc.name } };\n }\n // 'auto' et 'none' passent tels quels côté OpenAI.\n }\n\n // 3. stop_sequences -> stop\n if (Array.isArray(payload.stop_sequences) && payload.stop_sequences.length) {\n payload.stop = payload.stop_sequences;\n }\n\n // 3b. Conversion des blocs de contenu Anthropic -> format OpenAI.\n // Anthropic: content: [{type:\"text\"}, {type:\"tool_use\",id,name,input},\n // {type:\"tool_result\",tool_use_id,content}, {type:\"thinking\"}]\n // OpenAI: content \"string\" | null + tool_calls[] ;\n // tool_result -> messages role:\"tool\" séparés.\n // SANS cette conversion, Groq/ZAI renvoient 400 :\n // - assistant content[0].type != \"text\" (tool_use non converti en tool_calls)\n // - \"Failed to call a function\" (historique tool_use illisible par le modèle)\n //\n // Cas particulier « orphaned tool call » : si le tools array a été\n // tronqué (ex. Groq limité à 128), l'historique peut contenir des\n // tool_use pour des outils non déclarés. Groq valide strictement et\n // rejette (« attempted to call tool 'X' which was not in request.tools »).\n // -> on convertit ces tool_use orphelins (et leur tool_result) en texte.\n if (Array.isArray(payload.messages)) {\n const declaredTools = new Set<string>(\n Array.isArray(payload.tools) ? payload.tools.map((t: any) => t?.name).filter(Boolean) : []\n );\n const orphanedToolUseIds = new Set<string>();\n if (process.env.PROXY_DEBUG) {\n console.error(`[adapt] declaredTools=${declaredTools.size} names=${JSON.stringify([...declaredTools].slice(0, 20))}`);\n }\n\n const newMessages: any[] = [];\n for (const msg of payload.messages) {\n if (msg.content == null || typeof msg.content === 'string') {\n newMessages.push(msg);\n continue;\n }\n if (!Array.isArray(msg.content)) {\n newMessages.push(msg);\n continue;\n }\n const blocks = msg.content;\n\n // Cas 1 : message user contenant des tool_result -> messages role:\"tool\" OpenAI\n // (ou texte si le tool_use correspondant est orphelin)\n if (msg.role === 'user' && blocks.some((b: any) => b && b.type === 'tool_result')) {\n const userTextParts: string[] = [];\n for (const b of blocks) {\n if (!b) continue;\n if (b.type === 'tool_result') {\n let trContent = '';\n if (typeof b.content === 'string') trContent = b.content;\n else if (Array.isArray(b.content)) {\n trContent = b.content.map((c: any) => typeof c === 'string' ? c : (c?.text ?? '')).join('\\n');\n }\n if (orphanedToolUseIds.has(b.tool_use_id)) {\n // tool_use orphelin : on garde le résultat comme contexte texte user\n if (trContent) userTextParts.push(`[Tool result: ${trContent}]`);\n } else {\n newMessages.push({ role: 'tool', tool_call_id: b.tool_use_id, content: trContent || '' });\n }\n } else if (b.type === 'text' && b.text) {\n userTextParts.push(b.text);\n }\n }\n if (userTextParts.length) {\n newMessages.push({ role: 'user', content: userTextParts.join('\\n') });\n }\n continue;\n }\n\n // Cas 2 : assistant/user avec blocs text + tool_use (thinking ignoré)\n const textParts: string[] = [];\n const toolCalls: any[] = [];\n for (const b of blocks) {\n if (!b) continue;\n if (b.type === 'text' && b.text) {\n textParts.push(b.text);\n } else if (b.type === 'tool_use') {\n // Orphelin si l'outil n'est PAS déclaré, OU si aucun outil n'est déclaré\n // (ex. turn \"lean\" sans tools, ?notools=1, follow-up sans tools array).\n // Si on ne convertit pas, Groq rejette : « tool X not in request.tools »\n // car les tool_use passent en tool_calls OpenAI contre un tools array vide.\n const isOrphan = !declaredTools.has(b.name);\n if (process.env.PROXY_DEBUG) {\n console.error(`[adapt] tool_use name=${b.name} isOrphan=${isOrphan} declaredHas=${declaredTools.has(b.name)} declaredSize=${declaredTools.size}`);\n }\n if (isOrphan) {\n // Outil non déclaré (tools tronqué) : convertir en note texte\n const argStr = typeof b.input === 'string' ? b.input : JSON.stringify(b.input ?? {});\n textParts.push(`[Used tool ${b.name} with args ${argStr}]`);\n if (b.id) orphanedToolUseIds.add(b.id);\n } else {\n toolCalls.push({\n id: b.id || `call_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,\n type: 'function',\n function: {\n name: b.name,\n arguments: typeof b.input === 'string' ? b.input : JSON.stringify(b.input ?? {})\n }\n });\n }\n }\n // thinking / redacted_thinking : ignorés (raisonnement interne, pas envoyé à OpenAI)\n }\n const newMsg: any = { role: msg.role };\n newMsg.content = textParts.length ? textParts.join('\\n') : (toolCalls.length ? null : '');\n if (toolCalls.length) newMsg.tool_calls = toolCalls;\n if (msg.name) newMsg.name = msg.name;\n newMessages.push(newMsg);\n }\n payload.messages = newMessages;\n }\n\n // 4. Champs spécifiques Anthropic non reconnus par OpenAI -> suppression.\n // (Le CLI `claude` 2.x peut envoyer output_config, context_management, etc.\n // que Groq/ZAI/OpenRouter rejettent en 400 \"unsupported\".)\n delete payload.thinking;\n delete payload.context_management;\n delete payload.top_k;\n delete payload.metadata;\n delete payload.betas;\n delete payload.anthropic_beta;\n delete payload.stop_sequences;\n delete payload.cache_control;\n delete payload.output_config;\n delete payload.service_tier;\n delete payload.mcp_servers;\n}\n\n// --- OpenRouter : strip des blocs thinking/redacted_thinking ---\n// Le CLI `claude` (Claude Code) VÉRIFIE la signature des blocs thinking pour les\n// modèles courants (claude-sonnet-5, opus-4-8, fable-5, haiku-4-5). OpenRouter\n// renvoie ces blocs avec signature:\"\" (invalide) → le CLI laisse tomber TOUT le\n// contenu et n'affiche rien. On retire donc thinking/redacted_thinking côté proxy\n// pour ne garder que les blocs text/tool_use que le CLI sait afficher.\n\nexport function stripThinkingFromAnthropicJson(jsonStr: string): string {\n try {\n const obj = JSON.parse(jsonStr);\n if (Array.isArray(obj.content)) {\n obj.content = obj.content.filter(\n (b: any) => b && b.type !== 'thinking' && b.type !== 'redacted_thinking'\n );\n }\n return JSON.stringify(obj);\n } catch {\n return jsonStr;\n }\n}\n\n// --- Empty-turn retry ---------------------------------------------------\n// Certains modèles \"reasoning\" servis derrière un routeur (vérifié : Requesty\n// sur sference/thinkingcap-qwen3.6-27b, ~12% des tours) raisonnent puis\n// n'émettent RIEN : que des blocs thinking, aucun text, aucun tool_use, et\n// stop_reason \"end_turn\". Le tour est un no-op silencieux — et comme on strip\n// justement les blocs thinking, le client reçoit un message vide.\n//\n// Le tour vide est un défaut MODÈLE, pas un défaut de traduction : mesuré\n// identique (12%) sur les deux surfaces de Requesty (Anthropic et OpenAI).\n// On rejoue donc une fois, ce qui ramène ~12% à ~1.4%.\n//\n// Portée volontairement étroite :\n// - seulement les providers `needsStrip` (ceux qui présentent le défaut) ;\n// - seulement sur HTTP 200 — une 429/500 n'est pas un tour vide ;\n// - seulement sur stop_reason \"end_turn\" — un \"max_tokens\" signifie que le\n// modèle a brûlé son budget dans le thinking, et rejouer à budget\n// identique reproduirait le même résultat en facturant deux fois ;\n// - 1 essai par défaut (`LLM_ENDPOINT_EMPTY_TURN_RETRY=0` désactive).\n// Chaque rejeu est loggé : un retry silencieux masquerait un vrai tour vide,\n// que @agentproto/runtime remonte justement comme `empty: true`.\nconst DEFAULT_EMPTY_TURN_RETRIES = 1;\n\nfunction resolveEmptyTurnRetries(): number {\n const raw = process.env.LLM_ENDPOINT_EMPTY_TURN_RETRY;\n if (raw === undefined) return DEFAULT_EMPTY_TURN_RETRIES;\n const n = Number.parseInt(raw, 10);\n return Number.isFinite(n) && n >= 0 ? n : DEFAULT_EMPTY_TURN_RETRIES;\n}\n\n/**\n * True when an Anthropic Messages JSON body is a \"tour vide\": ended normally\n * (`end_turn`) but carries no client-visible content once thinking is stripped.\n */\nfunction isEmptyAnthropicTurn(jsonStr: string): boolean {\n try {\n const obj = JSON.parse(jsonStr);\n if (!obj || obj.type === 'error' || !Array.isArray(obj.content)) return false;\n if (obj.stop_reason !== 'end_turn') return false;\n return !obj.content.some(\n (b: any) => b && b.type !== 'thinking' && b.type !== 'redacted_thinking'\n );\n } catch {\n return false;\n }\n}\n\n// Transformeur SSE en flux : filtre les content_block_start/delta/stop des blocs\n// thinking/redacted_thinking et réindexe les blocs conservés (0,1,2…) pour que le\n// CLI voie des indices contigus. Garde message_start/message_delta/message_stop/ping.\nclass AnthropicThinkingStripper {\n private skipIndices = new Set<number>();\n private indexMap = new Map<number, number>();\n private nextOut = 0;\n private buffer = '';\n /**\n * True once a NON-thinking content block has started — i.e. the turn is\n * producing something the client will actually see (text or tool_use).\n * Read by the empty-turn retry: a turn that ends without this produced\n * nothing but stripped thinking, so nothing has been written downstream yet\n * and the attempt is still safely discardable.\n */\n hasMeaningfulContent = false;\n /** stop_reason seen on message_delta, if any. */\n stopReason: string | null = null;\n\n push(chunk: string): string[] {\n this.buffer += chunk;\n const out: string[] = [];\n const parts = this.buffer.split(/\\r?\\n\\r?\\n/);\n this.buffer = parts.pop() ?? '';\n for (const part of parts) {\n const transformed = this.transformEvent(part);\n if (transformed) out.push(transformed);\n }\n return out;\n }\n\n flush(): string[] {\n if (this.buffer.trim()) {\n const transformed = this.transformEvent(this.buffer);\n this.buffer = '';\n return transformed ? [transformed] : [];\n }\n return [];\n }\n\n private transformEvent(rawEvent: string): string | null {\n const lines = rawEvent.split(/\\r?\\n/);\n let eventLine: string | null = null;\n const dataLines: string[] = [];\n for (const line of lines) {\n if (line.startsWith('event:')) eventLine = line.slice(6).trim();\n else if (line.startsWith('data:')) dataLines.push(line.slice(5).trim());\n }\n if (!dataLines.length) return rawEvent ? rawEvent + '\\n\\n' : null;\n\n let data: any;\n try {\n data = JSON.parse(dataLines.join('\\n'));\n } catch {\n return rawEvent + '\\n\\n';\n }\n\n const type = data.type;\n if (type === 'content_block_start') {\n const ct = data.content_block && data.content_block.type;\n if (ct === 'thinking' || ct === 'redacted_thinking') {\n this.skipIndices.add(data.index);\n return null;\n }\n const outIdx = this.nextOut++;\n this.indexMap.set(data.index, outIdx);\n data.index = outIdx;\n this.hasMeaningfulContent = true;\n } else if (type === 'message_delta') {\n const sr = data.delta && data.delta.stop_reason;\n if (typeof sr === 'string') this.stopReason = sr;\n } else if (type === 'content_block_delta') {\n if (this.skipIndices.has(data.index)) return null;\n const dt = data.delta && data.delta.type;\n if (dt === 'thinking_delta' || dt === 'signature_delta' || dt === 'redacted_thinking_delta') return null;\n data.index = this.indexMap.get(data.index) ?? data.index;\n } else if (type === 'content_block_stop') {\n if (this.skipIndices.has(data.index)) return null;\n data.index = this.indexMap.get(data.index) ?? data.index;\n }\n\n const ev = eventLine ? `event: ${eventLine}\\n` : '';\n return ev + `data: ${JSON.stringify(data)}\\n\\n`;\n }\n}\n\n// --- Groq/ZAI/xAI/OpenAI : conversion OpenAI → Anthropic ---\n// Ces providers ne parlent que l'API OpenAI (chat/completions). Le CLI `claude`\n// ne parse QUE le format Anthropic. On convertit donc la réponse OpenAI (JSON\n// ou SSE) en Anthropic côté proxy.\n\nfunction openaiFinishToAnthropicStop(fr: string | null | undefined): string {\n switch (fr) {\n case 'stop': return 'end_turn';\n case 'length': return 'max_tokens';\n case 'tool_calls': return 'tool_use';\n case 'content_filter': return 'end_turn';\n default: return 'end_turn';\n }\n}\n\nfunction openaiJsonToAnthropic(jsonStr: string): string {\n try {\n const o = JSON.parse(jsonStr);\n // Pass-through des erreurs upstream (OpenAI/ZAI renvoient {\"error\":{...}})\n // sous forme d'erreur Anthropic, au lieu d'un message vide trompeur.\n if (o && typeof o === 'object' && o.error) {\n const e = o.error;\n return JSON.stringify({\n type: 'error',\n error: {\n type: e.type || 'api_error',\n message: e.message || (typeof e === 'string' ? e : 'Upstream error')\n }\n });\n }\n const choice = o.choices && o.choices[0];\n const msg = choice && choice.message;\n const content: any[] = [];\n if (msg && typeof msg.content === 'string' && msg.content) {\n content.push({ type: 'text', text: msg.content });\n }\n if (msg && Array.isArray(msg.tool_calls)) {\n for (const tc of msg.tool_calls) {\n let input: any = {};\n try { input = tc.function && tc.function.arguments ? JSON.parse(tc.function.arguments) : {}; } catch { input = {}; }\n content.push({\n type: 'tool_use',\n id: tc.id || `toolu_${Date.now()}`,\n name: tc.function && tc.function.name,\n input\n });\n }\n }\n // A reasoning model can burn its whole max_tokens budget \"thinking\" and\n // return no visible content at all (finish_reason stays e.g. \"length\" —\n // reproduced live on forge/bonsai-27b with a tight budget). Surfacing the\n // reasoning as a thinking block is opt-in (LLM_ENDPOINT_PASSTHROUGH_THINKING)\n // since it's raw model reasoning, not a normal response — a caller that\n // doesn't expect it should keep seeing today's empty-content message.\n if (content.length === 0 && msg && typeof msg.reasoning_content === 'string' && msg.reasoning_content && passthroughThinking()) {\n content.push({ type: 'thinking', thinking: msg.reasoning_content, signature: '' });\n }\n const usage = o.usage || {};\n const out = {\n id: o.id || `msg_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n model: o.model || 'groq',\n content,\n stop_reason: openaiFinishToAnthropicStop(choice && choice.finish_reason),\n stop_sequence: null,\n usage: {\n input_tokens: usage.prompt_tokens || 0,\n output_tokens: usage.completion_tokens || 0\n }\n };\n return JSON.stringify(out);\n } catch {\n return jsonStr;\n }\n}\n\n// Convertit un flux SSE OpenAI (chat.completion.chunk) en flux SSE Anthropic.\n// Séquence Anthropic émise :\n// message_start → content_block_start(text) → content_block_delta(text_delta)*\n// → content_block_stop → (tool_use blocks si tool_calls) → message_delta(stop) → message_stop\nclass OpenAIToAnthropicStreamConverter {\n private msgId = `msg_${Date.now()}`;\n private sentStart = false;\n private textBlockOpen = false;\n private toolBlockIdx = -1;\n private buffer = '';\n private accUsage: { prompt_tokens?: number; completion_tokens?: number } = {};\n private finished = false;\n\n push(chunk: string): string[] {\n this.buffer += chunk;\n const out: string[] = [];\n const parts = this.buffer.split(/\\r?\\n\\r?\\n/);\n this.buffer = parts.pop() ?? '';\n for (const part of parts) {\n const transformed = this.transformChunk(part);\n if (transformed) out.push(...transformed);\n }\n return out;\n }\n\n flush(): string[] {\n if (this.buffer.trim()) {\n const transformed = this.transformChunk(this.buffer);\n this.buffer = '';\n return transformed || [];\n }\n return [];\n }\n\n private sse(event: string, data: any): string {\n return `event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`;\n }\n\n private transformChunk(rawEvent: string): string[] | null {\n const lines = rawEvent.split(/\\r?\\n/);\n const dataLines: string[] = [];\n for (const line of lines) {\n if (line.startsWith('data:')) dataLines.push(line.slice(5).trim());\n }\n if (!dataLines.length) return null;\n\n const out: string[] = [];\n for (const dl of dataLines) {\n if (dl === '[DONE]') {\n if (this.finished) continue;\n if (this.textBlockOpen) { out.push(this.sse('content_block_stop', { type: 'content_block_stop', index: 0 })); this.textBlockOpen = false; }\n out.push(this.sse('message_delta', { type: 'message_delta', delta: { stop_reason: 'end_turn', stop_sequence: null }, usage: { input_tokens: this.accUsage.prompt_tokens || 0, output_tokens: this.accUsage.completion_tokens || 0 } }));\n out.push(this.sse('message_stop', { type: 'message_stop' }));\n this.finished = true;\n continue;\n }\n let data: any;\n try { data = JSON.parse(dl); } catch { continue; }\n\n const choice = data.choices && data.choices[0];\n const delta = choice && choice.delta;\n const content = delta && delta.content;\n\n // message_start au premier chunk utile\n if (!this.sentStart && (content !== undefined || (delta && delta.role))) {\n out.push(this.sse('message_start', {\n type: 'message_start',\n message: {\n id: this.msgId, type: 'message', role: 'assistant',\n model: data.model || 'groq', content: [],\n stop_reason: null, stop_sequence: null,\n usage: { input_tokens: 0, output_tokens: 0 }\n }\n }));\n this.sentStart = true;\n }\n\n // Contenu texte\n if (typeof content === 'string' && content) {\n if (!this.textBlockOpen) {\n out.push(this.sse('content_block_start', { type: 'content_block_start', index: 0, content_block: { type: 'text', text: '' } }));\n this.textBlockOpen = true;\n }\n out.push(this.sse('content_block_delta', { type: 'content_block_delta', index: 0, delta: { type: 'text_delta', text: content } }));\n }\n\n // tool_calls (streaming) — ouverture d'un bloc tool_use par appel\n if (delta && Array.isArray(delta.tool_calls)) {\n if (this.textBlockOpen) { out.push(this.sse('content_block_stop', { type: 'content_block_stop', index: 0 })); this.textBlockOpen = false; }\n for (const tc of delta.tool_calls) {\n if (tc.function && tc.function.name && tc.index !== undefined) {\n this.toolBlockIdx = tc.index + 1;\n out.push(this.sse('content_block_start', {\n type: 'content_block_start', index: this.toolBlockIdx,\n content_block: { type: 'tool_use', id: tc.id || `toolu_${Date.now()}`, name: tc.function.name, input: {} }\n }));\n }\n if (tc.function && tc.function.arguments) {\n out.push(this.sse('content_block_delta', {\n type: 'content_block_delta', index: this.toolBlockIdx,\n delta: { type: 'input_json_delta', partial_json: tc.function.arguments }\n }));\n }\n }\n }\n\n // usage (x_groq ou usage direct)\n const u = data.x_groq && data.x_groq.usage ? data.x_groq.usage : data.usage;\n if (u) { if (u.prompt_tokens != null) this.accUsage.prompt_tokens = u.prompt_tokens; if (u.completion_tokens != null) this.accUsage.completion_tokens = u.completion_tokens; }\n\n // finish_reason → fermeture\n const fr = choice && choice.finish_reason;\n if (fr && !this.finished) {\n if (this.textBlockOpen) { out.push(this.sse('content_block_stop', { type: 'content_block_stop', index: 0 })); this.textBlockOpen = false; }\n if (this.toolBlockIdx >= 0) { out.push(this.sse('content_block_stop', { type: 'content_block_stop', index: this.toolBlockIdx })); this.toolBlockIdx = -1; }\n out.push(this.sse('message_delta', { type: 'message_delta', delta: { stop_reason: openaiFinishToAnthropicStop(fr), stop_sequence: null }, usage: { input_tokens: this.accUsage.prompt_tokens || 0, output_tokens: this.accUsage.completion_tokens || 0 } }));\n out.push(this.sse('message_stop', { type: 'message_stop' }));\n this.finished = true;\n }\n }\n return out.length ? out : null;\n }\n}\n\n// ── Inbound access gate ─────────────────────────────────────────────────────\n// Optional CLIENT→proxy authentication, independent of the upstream provider\n// keys (proxy→provider), which are always server-side and never the client's.\n// Enabled by setting LLM_ENDPOINT_ACCESS_TOKENS to a comma-separated allow-list;\n// unset/empty leaves the proxy open (prior behaviour). Read once at boot like\n// the provider keys — changing it requires a restart.\n\n/** Parse a comma-separated token allow-list into a Set (trimmed, non-empty). */\nexport function parseAccessTokens(raw: string | undefined): Set<string> {\n return new Set((raw ?? '').split(',').map((t) => t.trim()).filter(Boolean));\n}\n\nlet _accessTokens: Set<string> | null = null;\n/** Cached allow-list from LLM_ENDPOINT_ACCESS_TOKENS (empty Set = gate off). */\nfunction accessTokens(): Set<string> {\n if (_accessTokens === null) _accessTokens = parseAccessTokens(process.env.LLM_ENDPOINT_ACCESS_TOKENS);\n return _accessTokens;\n}\n\n/**\n * Extract a presented access token from `Authorization: Bearer <t>` or the\n * `X-Proxy-Access: <t>` header (so a client that reserves Authorization for\n * something else can still pass one). Returns null when neither is present.\n */\nexport function extractInboundToken(headers: IncomingMessage['headers']): string | null {\n const auth = headers['authorization'];\n const a = Array.isArray(auth) ? auth[0] : auth;\n if (a) {\n const m = /^Bearer\\s+(.+)$/i.exec(a.trim());\n if (m && m[1]!.trim()) return m[1]!.trim();\n }\n const xp = headers['x-proxy-access'];\n const x = Array.isArray(xp) ? xp[0] : xp;\n if (x && x.trim()) return x.trim();\n return null;\n}\n\n/**\n * True when the request may proceed: gate disabled (empty allow-list), or the\n * presented token is in the allow-list. A high-entropy random token makes the\n * Set membership check's non-constant time immaterial.\n */\nexport function isAuthorized(headers: IncomingMessage['headers'], tokens: Set<string>): boolean {\n if (tokens.size === 0) return true;\n const presented = extractInboundToken(headers);\n return presented !== null && tokens.has(presented);\n}\n\n// ── Edge/WAF token gate ─────────────────────────────────────────────────────\n// A SECOND, independent client→proxy auth layer meant to be checked by an\n// edge/WAF rule (Cloudflare custom rule) in front of the proxy, not just by\n// this process — see buildWafRuleExpression below. Deliberately separate from\n// the inbound access gate above: the two can be rotated/enabled independently\n// (e.g. a WAF-only token in front of a publicly reachable deployment, plus an\n// app-level token for direct callers). Unset/empty leaves this layer off.\n\nlet _edgeTokens: Set<string> | null = null;\n/** Cached allow-list from LLM_ENDPOINT_EDGE_TOKENS (empty Set = layer off). */\nfunction edgeTokens(): Set<string> {\n if (_edgeTokens === null) _edgeTokens = parseAccessTokens(process.env.LLM_ENDPOINT_EDGE_TOKENS);\n return _edgeTokens;\n}\n\n/**\n * Extract a presented edge token from the `X-Edge-Auth: <t>` header. Returns\n * null when absent or blank.\n */\nexport function extractEdgeToken(headers: IncomingMessage['headers']): string | null {\n const raw = headers['x-edge-auth'];\n const v = Array.isArray(raw) ? raw[0] : raw;\n if (v && v.trim()) return v.trim();\n return null;\n}\n\n/**\n * True when the request may proceed through the edge/WAF layer: layer\n * disabled (empty allow-list), or the presented `X-Edge-Auth` token is in the\n * allow-list.\n */\nexport function isEdgeAuthorized(headers: IncomingMessage['headers'], edgeTokensSet: Set<string>): boolean {\n if (edgeTokensSet.size === 0) return true;\n const presented = extractEdgeToken(headers);\n return presented !== null && edgeTokensSet.has(presented);\n}\n\n/**\n * Builds a Cloudflare custom-rule (wirefilter) expression that BLOCKS any\n * request lacking a valid token, for the header (`authorization` or\n * `x-edge-auth`) matching the layer being enforced at the edge. Intended to\n * be pasted into a Cloudflare custom rule so the token check happens before\n * traffic ever reaches this process — the `edgeTokens()`/`isEdgeAuthorized`\n * pair above is the same policy enforced in-process as a fallback.\n *\n * CORS preflight (`OPTIONS`) is always allowed through so the browser's\n * preflight — which cannot carry the token — isn't blocked.\n */\nexport function buildWafRuleExpression(opts: {\n host?: string;\n tokens: string[];\n header: 'authorization' | 'x-edge-auth';\n}): string {\n if (opts.tokens.length === 0) {\n throw new Error('buildWafRuleExpression requires at least one token');\n }\n const headerName = opts.header.toLowerCase();\n const values = opts.tokens.map((t) => (opts.header === 'authorization' ? `Bearer ${t}` : t));\n const memberships = values.map((v) => `any(http.request.headers[\"${headerName}\"][*] eq \"${v}\")`);\n const notValid = memberships.length === 1 ? `not ${memberships[0]}` : `not (${memberships.join(' or ')})`;\n const hostPrefix = opts.host ? `http.host eq \"${opts.host}\" and ` : '';\n return `(${hostPrefix}http.request.method ne \"OPTIONS\" and ${notValid})`;\n}\n\n/**\n * Normalise an incoming request path so a redundant `/v1` an Anthropic client\n * appends to a base URL that already ends in `/v1` (optionally with a pack\n * segment) doesn't break routing.\n *\n * /v1/v1/messages → /v1/messages\n * /v1/stealth-requesty/v1/messages → /v1/stealth-requesty/messages\n * /v1/stealth-requesty/v1/models → /v1/stealth-requesty/models\n *\n * Without the pack-segment case the extra `/v1` breaks the `/v1/<pack>/<verb>`\n * match, the pack is silently lost, and the request falls back to the default\n * pack — the \"no usable models\" / \"Unable to resolve model\" failure a client\n * configured with `base_url = .../v1/<pack>` hits.\n */\nexport function normalizeProxyPath(pathname: string): string {\n return pathname\n .replace(/\\/+$/, '')\n .replace(/^\\/v1\\/v1(\\/|$)/, '/v1$1')\n .replace(/^(\\/v1\\/[^/]+)\\/v1(\\/|$)/, '$1$2');\n}\n\nlet _publicModels: boolean | null = null;\n/** Whether the default model-list path may be read unauthenticated (LLM_ENDPOINT_PUBLIC_MODELS truthy). */\nfunction publicModels(): boolean {\n if (_publicModels === null) {\n const v = (process.env.LLM_ENDPOINT_PUBLIC_MODELS ?? '').trim().toLowerCase();\n _publicModels = v === '1' || v === 'true' || v === 'yes' || v === 'on';\n }\n return _publicModels;\n}\n\nlet _passthroughThinking: boolean | null = null;\n/**\n * Whether a reasoning-only OpenAI response (`message.reasoning_content` set,\n * `message.content` empty) is surfaced to the client as an Anthropic\n * `thinking` block instead of an empty message (LLM_ENDPOINT_PASSTHROUGH_THINKING\n * truthy). Reasoning models on a tight `max_tokens` budget (Qwen3.6-based —\n * Bonsai 27B reproduced this live) can spend the whole budget \"thinking\" and\n * return no visible content at all; surfacing the reasoning at least shows\n * the caller what happened instead of a silent empty reply.\n */\nfunction passthroughThinking(): boolean {\n if (_passthroughThinking === null) {\n const v = (process.env.LLM_ENDPOINT_PASSTHROUGH_THINKING ?? '').trim().toLowerCase();\n _passthroughThinking = v === '1' || v === 'true' || v === 'yes' || v === 'on';\n }\n return _passthroughThinking;\n}\n\n/**\n * True only for the DEFAULT model-discovery path — `/v1/models` or `/models`,\n * never a pack-scoped list (`/v1/<pack>/models`). Lets opt-in public discovery\n * expose the default codename list without disclosing pack names.\n */\nexport function isPublicModelListPath(pathname: string): boolean {\n const p = normalizeProxyPath(pathname);\n return p === '/v1/models' || p === '/models';\n}\n\nconst server = createServer((req, res) => {\n // CORS & Options\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, x-api-key, Authorization, anthropic-version, X-Proxy-Access, X-Proxy-Pack, X-Proxy-Format, X-Edge-Auth');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n const rawUrl = req.url || '';\n const parsedUrl = new URL(rawUrl, `http://localhost:${PORT}`);\n // Le binary `claude` ajoute lui-même `/v1/messages` à ANTHROPIC_BASE_URL —\n // si celle-ci se termine déjà par `/v1` (config normale du proxy), la requête\n // arrive en `/v1/v1/messages`. `endsWith('/messages')` la route déjà\n // correctement plus bas, mais laisser le chemin brut dans les logs noie le\n // vrai souci (config base_url mal formée). Normalisé ici une fois pour\n // toutes — un `/v1/v1/...` redevient `/v1/...` pour le matching ET les logs.\n const urlPath = normalizeProxyPath(parsedUrl.pathname);\n\n // Discovery exemption — the DEFAULT model-list path may be read without a\n // token when LLM_ENDPOINT_PUBLIC_MODELS is set, so OpenAI-compatible clients\n // (e.g. Claude Desktop's launch-time model discovery) can populate their\n // selector. Only `/v1/models` (`/models`) — pack lists stay gated.\n const gateExempt = publicModels() && isPublicModelListPath(urlPath);\n\n // Loopback bypass — the local-queue batch emulation calls this proxy's own\n // /v1/messages over loopback and authenticates with a process-local token\n // instead of a normal access/edge token (see batches.ts).\n const internalLoopback = isInternalLoopbackRequest(req.headers);\n\n // Inbound access gate — 401 any non-preflight request without a valid token\n // when LLM_ENDPOINT_ACCESS_TOKENS is set. Gates discovery too (unless exempt\n // above), so pack config isn't readable unauthenticated.\n if (!gateExempt && !internalLoopback && !isAuthorized(req.headers, accessTokens())) {\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'authentication_error', message: 'Missing or invalid proxy access token.' } }));\n return;\n }\n\n // Edge/WAF token gate — independent of the inbound access gate above. Off\n // by default (unset LLM_ENDPOINT_EDGE_TOKENS); see buildWafRuleExpression\n // for enforcing the same policy at the edge instead of in-process.\n if (!gateExempt && !internalLoopback && !isEdgeAuthorized(req.headers, edgeTokens())) {\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'authentication_error', message: 'Missing or invalid edge token.' } }));\n return;\n }\n\n // ── Pack resolution ──────────────────────────────────────────────────────\n // Priority: header X-Proxy-Pack > URL path /v1/{pack}/messages > query param ?pack= > default\n let packId: string | null = null;\n\n // 1. Header personnalisé (Claude Desktop \"Custom inference headers\")\n const proxyPackHeader = req.headers['x-proxy-pack'];\n const proxyPackValue: string | null = (Array.isArray(proxyPackHeader) ? proxyPackHeader[0] : proxyPackHeader) || null;\n if (proxyPackValue) {\n if (getMergedPackIds().includes(proxyPackValue)) {\n packId = proxyPackValue;\n } else {\n console.warn(`[Proxy] Unknown pack \"${proxyPackValue}\" via X-Proxy-Pack header — returning 400.`);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: `Unknown pack \"${proxyPackValue}\" via X-Proxy-Pack. Available: ${getMergedPackIds().join(', ')}` } }));\n return;\n }\n }\n\n // 2. URL path /v1/{pack}/...\n if (!packId) {\n const packPathMatch = urlPath.match(/^\\/v1\\/([^\\/]+)(?:\\/messages(?:\\/batches(?:\\/[^/]+)?(?:\\/(?:results|cancel))?)?|\\/models|\\/chat\\/completions|\\/responses)?$/);\n if (packPathMatch) {\n const potentialPack = packPathMatch[1];\n const RESERVED_SEGMENTS = new Set(['v1', 'messages', 'models', 'packs', 'chat', 'responses', 'upstreams', 'endpoints']);\n if (potentialPack && !RESERVED_SEGMENTS.has(potentialPack)) {\n if (getMergedPackIds().includes(potentialPack)) {\n packId = potentialPack;\n } else {\n console.warn(`[Proxy] Unknown pack \"${potentialPack}\" via URL path — returning 400.`);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: `Unknown pack \"${potentialPack}\" in URL path. Available: ${getMergedPackIds().join(', ')}` } }));\n return;\n }\n }\n }\n }\n\n // 3. Query param ?pack=\n if (!packId) {\n const queryPack = parsedUrl.searchParams.get('pack');\n if (queryPack) {\n if (getMergedPackIds().includes(queryPack)) {\n packId = queryPack;\n } else {\n console.warn(`[Proxy] Unknown pack \"${queryPack}\" — returning 400.`);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: `Unknown pack \"${queryPack}\". Available: ${getMergedPackIds().join(', ')}` } }));\n return;\n }\n }\n }\n\n const { queryProvider, queryModelCode, queryTools, queryNoTools, headerTools, headerNoTools, headerExcludeTools, forcedAliasCode, anthropicFormat } =\n readQueryAndToolOptions(parsedUrl, req);\n\n // Anthropic-style format: relabel the resolved pack's routes with opaque\n // `claude-<family>-<sha>` ids for THIS request only. Every downstream\n // consumer (model listing + message routing) then sees the transformed pack.\n const resolvedPack = resolvePackMerged(packId);\n const activePack = anthropicFormat ? toAnthropicStyle(resolvedPack) : resolvedPack;\n\n console.log(\n `[Proxy] Incoming request: ${req.method} ${rawUrl}` +\n (urlPath !== parsedUrl.pathname.replace(/\\/+$/, '') ? ` (normalized: ${urlPath})` : '') +\n ` [pack: ${activePack.id}]`\n );\n\n // 0b. OpenAI Responses API facade for Codex custom providers\n if (req.method === 'POST' && urlPath.endsWith('/responses')) {\n handleResponsesRequest(req, res, {\n activePack,\n queryModelCode,\n queryProvider,\n queryTools,\n queryNoTools,\n headerTools,\n headerNoTools,\n headerExcludeTools,\n forcedAliasCode,\n });\n return;\n }\n\n // 0c. OpenAI chat/completions surface\n if (req.method === 'POST' && urlPath.endsWith('/chat/completions')) {\n handleChatCompletionsRequest(req, res, {\n activePack,\n queryProvider,\n queryTools,\n queryNoTools,\n headerTools,\n headerNoTools,\n headerExcludeTools,\n });\n return;\n }\n\n // 0. Endpoint /v1/packs pour la découverte des packs disponibles\n if (req.method === 'GET' && (urlPath === '/v1/packs' || urlPath === '/packs')) {\n const mergedRegistry = { ...PACK_REGISTRY, ...getLocalPacks() };\n const packsResponse = {\n object: 'list',\n data: Object.values(mergedRegistry).map((pack: ModelPack) => ({\n id: pack.id,\n label: pack.label,\n description: pack.description,\n model_count: Object.keys(pack.models).length,\n models: Object.entries(pack.models).map(([code, target]) => ({\n code,\n provider: target.provider,\n model: target.model,\n equivalent_claude_name: target.equivalentClaudeName,\n })),\n })),\n };\n console.log(`[Proxy] Returning pack list (${packsResponse.data.length} packs).`);\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(packsResponse));\n return;\n }\n\n // 0a. Hot-reload local packs from packs.local.json (POST). Gated by the same\n // access token as every other route (checked above). Re-reads + validates the\n // local envelope; unlike the fail-soft load path, an EXPLICIT reload gets a\n // hard 400 with the field-scoped errors so a bad edit is legible instead of\n // silently ignored. On success the cache is dropped and repopulated, and the\n // reloaded pack ids + count are returned.\n if (req.method === 'POST' && (urlPath === '/v1/packs/reload' || urlPath === '/packs/reload')) {\n const load = readLocalPacksFromDisk();\n if (load.errors.length > 0) {\n // Leave the previously-cached packs in place — a rejected reload must not\n // wipe a working config.\n console.warn(`[Proxy] Pack reload rejected — ${load.errors.length} validation error(s).`);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: 'Invalid packs.local.json', errors: load.errors } }));\n return;\n }\n resetLocalPacksCache();\n const localPacks = getLocalPacks(); // repopulate the cache from the now-validated file\n const packIds = getMergedPackIds();\n console.log(`[Proxy] Reloaded packs from ${load.path ?? '(no local file)'} — ${packIds.length} packs (${Object.keys(localPacks).length} local).`);\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({\n object: 'packs.reload',\n reloaded: true,\n source: load.path,\n local_pack_ids: Object.keys(localPacks),\n pack_ids: packIds,\n count: packIds.length,\n }));\n return;\n }\n\n // 0d. Per-upstream credential status (GET /v1/upstreams). Reports, for each\n // canonical upstream, how a credential WOULD resolve (linked profile / env /\n // none + method) WITHOUT returning a secret. `?probe=1` adds the profile-\n // source `present` boolean at the cost of a keychain read; the default view\n // stays mapping-only. Gated by the same access token as every route (checked\n // above) — NOT covered by the /v1/models public exemption.\n if (req.method === 'GET' && (urlPath === '/v1/upstreams' || urlPath === '/upstreams')) {\n const probe = parsedUrl.searchParams.get('probe') === '1';\n void handleUpstreamsStatus(res, { probe });\n return;\n }\n\n // 0e. Optional per-upstream live test (POST /v1/upstreams/:provider/test).\n // The cheapest authenticated call to the upstream; {ok, status, detail} or\n // {ok:null, reason:\"no-probe\"}. Gated like every other route.\n const upstreamTestMatch = urlPath.match(/^\\/(?:v1\\/)?upstreams\\/([^/]+)\\/test$/);\n if (req.method === 'POST' && upstreamTestMatch) {\n void handleUpstreamTest(res, upstreamTestMatch[1]!);\n return;\n }\n\n // 0f. Named-endpoint health (GET /v1/endpoints, /endpoints). Per endpoint:\n // {id, baseUrl (no credential), reachable, models, latencyMs} — forge (if\n // FORGE_BASE_URL is set) plus every valid entry from the endpoints file.\n // nebius is deliberately excluded (a hosted provider with a well-known\n // static catalog, not a local/LAN model server). A live check every call —\n // no cache — since a health endpoint reporting a 30s-stale \"reachable\" would\n // defeat its own purpose. Gated by the same access token as /v1/upstreams\n // (NOT covered by the /v1/models public exemption).\n if (req.method === 'GET' && (urlPath === '/v1/endpoints' || urlPath === '/endpoints')) {\n void handleEndpointsStatus(res);\n return;\n }\n\n // 1. Endpoint /v1/models pour la découverte des modèles\n // Supporte aussi /v1/{pack}/models pour la sélection de pack via URL path\n if (req.method === 'GET' && (urlPath === '/v1/models' || urlPath === '/models' || urlPath.endsWith('/models'))) {\n void (async () => {\n const isAnthropicStyle = req.headers['anthropic-version'] !== undefined || req.headers['x-api-key'] !== undefined;\n const mapping = buildMappingFromPack(activePack);\n const isLocalPack = Boolean(getLocalPacks()[activePack.id]);\n // Alias-bearing: a local pack, or an official pack transformed to Anthropic\n // style for this request — either exposes equivalentClaudeName as the id.\n const isAliasPack = isLocalPack || anthropicFormat;\n\n // forge's LoRA adapters (and every file-configured named endpoint's\n // models) live on the upstream server itself, not in any committed pack —\n // merge them live into the default pack's listing only, so a curated pack\n // (xai, coding, ...) still returns exactly its own models. No-op (empty\n // list) when FORGE_BASE_URL is unset / no endpoints are configured. An\n // unreachable endpoint is skipped with a warning already logged by its\n // probe — never a 500 for the whole listing.\n if (activePack.id === DEFAULT_PACK_ID) {\n const forgeIds = await fetchForgeModelIds();\n for (const id of forgeIds) {\n mapping[`forge/${id}`] = { provider: 'forge', model: id };\n }\n for (const endpoint of getConfiguredEndpoints()) {\n const { ids } = await probeFileEndpointModels(endpoint);\n for (const id of ids) {\n mapping[`${endpoint.id}/${id}`] = { provider: endpoint.id, model: id };\n }\n }\n }\n\n if (isAnthropicStyle) {\n // Format 100% Natif d'Anthropic Claude\n const anthropicModelsResponse = {\n data: Object.entries(mapping).map(([code, target]) => {\n const id = (isAliasPack && target.equivalentClaudeName) ? target.equivalentClaudeName : code;\n return {\n id,\n display_name: code,\n created_at: '2026-02-04T00:00:00Z',\n type: 'model',\n capabilities: {},\n // Champs officiels du schéma Anthropic ModelInfo (docs\n // /en/api/models-list) : max_input_tokens = fenêtre de contexte,\n // max_tokens = budget de sortie max. Absents si non vérifiés.\n ...(target.contextWindow !== undefined ? { max_input_tokens: target.contextWindow } : {}),\n ...(target.maxOutputTokens !== undefined ? { max_tokens: target.maxOutputTokens } : {}),\n };\n }),\n has_more: false,\n first_id: null,\n last_id: null\n };\n console.log(`[Proxy] Returning native Anthropic-formatted model list.`);\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(anthropicModelsResponse));\n return;\n } else {\n // Format OpenAI standardisé\n const openaiModelsResponse = {\n object: 'list',\n data: Object.entries(mapping).map(([code, target]) => ({\n id: code,\n object: 'model',\n created: 1718841600,\n owned_by: target.provider,\n // Verified per-route limits only — fields are absent when unknown.\n ...(target.contextWindow !== undefined ? { context_length: target.contextWindow } : {}),\n ...(target.maxOutputTokens !== undefined ? { max_completion_tokens: target.maxOutputTokens } : {}),\n }))\n };\n console.log(`[Proxy] Returning standard OpenAI-formatted model list.`);\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(openaiModelsResponse));\n return;\n }\n })();\n return;\n }\n\n // 1b. /v1/messages/batches* — matched before the generic '/messages' check\n // below, since a batches path never ends in exactly '/messages'.\n if (\n handleBatchesRequest(\n req,\n res,\n {\n activePack,\n parsedUrl,\n queryModelCode,\n queryProvider,\n forcedAliasCode,\n anthropicFormat,\n queryTools,\n queryNoTools,\n headerTools,\n headerNoTools,\n headerExcludeTools,\n },\n urlPath,\n )\n ) {\n return;\n }\n\n // 2. Traitement des messages\n if (req.method !== 'POST' || !urlPath.endsWith('/messages')) {\n res.writeHead(404, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'not_found', message: `Route not found` } }));\n return;\n }\n\n let body = '';\n req.on('data', chunk => {\n body += chunk;\n });\n\n req.on('end', async () => {\n try {\n const payload = JSON.parse(body);\n\n // Trouver la destination (Provider & Model)\n let resolvedTarget: { provider: string; model: string };\n try {\n resolvedTarget = resolveModelRoute(payload, {\n activePack,\n queryModelCode,\n queryProvider,\n forcedAliasCode,\n allowAliases: true,\n anthropicFormat,\n });\n } catch (e: any) {\n console.warn(`[Proxy] ${e.message}`);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: e.message } }));\n return;\n }\n\n // Détail de la requête : modèle résolu + budget de sortie demandé. Rend\n // visibles les tours \"warm-up\" (max_tokens:1) et les appels coûteux dans\n // les logs sans capture de corps.\n //\n // Short-circuit warm-up (LLM_ENDPOINT_SHORTCIRCUIT_WARMUP=1) : les clients\n // type Claude Desktop sondent chaque modèle du pack avec des pings\n // max_tokens<=1 non-streaming avant/autour du vrai message — chaque ping\n // paie un aller-retour upstream complet (1-6 s mesurés). Quand le flag est\n // actif, le proxy répond localement sans upstream : disponibilité du\n // modèle toujours \"OK\", rafale quasi gratuite.\n if (\n process.env.LLM_ENDPOINT_SHORTCIRCUIT_WARMUP === '1' &&\n payload.stream !== true &&\n typeof payload.max_tokens === 'number' && payload.max_tokens <= 1 &&\n Array.isArray(payload.messages) && payload.messages.length <= 2\n ) {\n console.log(`[Proxy] warm-up short-circuit: model=${resolvedTarget.provider}:${resolvedTarget.model} max_tokens=${payload.max_tokens} (no upstream call)`);\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({\n id: `msg_warmup_${Date.now().toString(36)}`,\n type: 'message',\n role: 'assistant',\n model: payload.model,\n content: [{ type: 'text', text: 'ok' }],\n stop_reason: 'end_turn',\n stop_sequence: null,\n usage: { input_tokens: 1, output_tokens: 1 },\n }));\n return;\n }\n {\n const mt = payload.max_tokens;\n const mtNote = (typeof mt === 'number' && mt <= 4) ? ' <== warm-up/1-token' : '';\n console.log(\n `[Proxy] req: model=${resolvedTarget.provider}:${resolvedTarget.model}` +\n ` max_tokens=${typeof mt === 'number' ? mt : 'unset'}` +\n ` stream=${payload.stream === true ? 'true' : 'false'}` +\n ` msgs=${Array.isArray(payload.messages) ? payload.messages.length : '?'}` +\n ` tools=${Array.isArray(payload.tools) ? payload.tools.length : 0}` +\n mtNote\n );\n }\n\n // Configuration de la requête sortante selon le provider résolu\n let hostname = '';\n let path = '';\n let port = 443;\n let protocol: 'http' | 'https' = 'https';\n let targetApiKey = '';\n let cred: UpstreamCredential | undefined;\n let headers: Record<string, string> = { 'Content-Type': 'application/json' };\n\n payload.model = resolvedTarget.model;\n\n // Trimme les outils AVANT la transformation de forme propre à chaque provider\n // (ZAI/Groq mappent input_schema → function.parameters ; le trim doit voir la forme Anthropic).\n trimTools(payload, {\n provider: resolvedTarget.provider,\n queryTools,\n queryNoTools,\n headerTools,\n headerNoTools,\n headerExcludeTools,\n packToolsExclude: activePack.toolsExclude,\n packToolsAllow: activePack.toolsAllow,\n });\n\n // Configurable providers (forge, nebius, and every named endpoint from\n // the JSON file) share ONE dispatch branch instead of a switch case per\n // id — adding a named endpoint never needs a code change here. Handled\n // BEFORE the switch so an unmatched provider still falls through to the\n // switch's `default: moonshot` fallback exactly as before.\n const messagesConfigurableSpec = getConfigurableProviderSpec(resolvedTarget.provider);\n if (messagesConfigurableSpec) {\n const upstream = messagesConfigurableSpec.resolveUpstream();\n if (!upstream) {\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: messagesConfigurableSpec.unavailableMessage() } }));\n return;\n }\n hostname = upstream.hostname;\n port = upstream.port;\n protocol = upstream.protocol;\n path = `${upstream.pathPrefix}/chat/completions`;\n cred = await resolveUpstreamCredential(resolvedTarget.provider);\n targetApiKey = cred?.value ?? '';\n // A keyless-capable provider (forge, every file endpoint) must never\n // send a bare \"Bearer \" header; a required-key one (nebius) 401s below\n // before this matters if the value is empty.\n if (cred && cred.value) Object.assign(headers, buildUpstreamAuthHeaders(resolvedTarget.provider, cred));\n // adaptAnthropicToOpenAI drops `thinking` outright (OpenAI has no such\n // field) — capture it first so an explicit client `thinking:\n // {type:\"enabled\"}` can withhold a default `reasoning_effort` (e.g.\n // LM Studio's \"none\", which would otherwise cut reasoning to 0 tokens\n // even when the client asked for it).\n const clientThinkingEnabled = isRecord(payload.thinking) && payload.thinking.type === 'enabled';\n adaptAnthropicToOpenAI(payload);\n applyDefaultRequestFields(\n payload,\n messagesConfigurableSpec.defaultRequestFields,\n clientThinkingEnabled ? new Set(['reasoning_effort']) : undefined,\n );\n\n // Transformation des tools Anthropic (format OpenAI function) — même forme pour\n // tout upstream OpenAI-compatible configurable (forge/vLLM, nebius, endpoints file).\n if (payload.tools && Array.isArray(payload.tools)) {\n payload.tools = payload.tools.map((t: any) => {\n if (t.input_schema) {\n return {\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema\n }\n };\n }\n return t;\n });\n }\n } else {\n switch (resolvedTarget.provider) {\n case 'anthropic':\n // Anthropic natif — pas de transformation de forme requise.\n hostname = 'api.anthropic.com';\n path = '/v1/messages';\n cred = await resolveUpstreamCredential('anthropic');\n targetApiKey = cred?.value ?? '';\n if (cred) Object.assign(headers, buildUpstreamAuthHeaders('anthropic', cred));\n break;\n\n case 'openrouter':\n // OpenRouter expose un endpoint Anthropic NATIF (/api/v1/messages) qui renvoie le\n // format Anthropic (content/stop_reason) tel quel — indispensable pour le CLI `claude`\n // qui ne parse PAS le format OpenAI (sinon : \"malformed response HTTP 200\").\n // Aucune adaptation request/response : tools (input_schema), system, thinking,\n // tool_choice, stop_sequences passent en natif Anthropic côté OpenRouter.\n hostname = 'openrouter.ai';\n path = '/api/v1/messages';\n cred = await resolveUpstreamCredential('openrouter');\n targetApiKey = cred?.value ?? '';\n if (cred) Object.assign(headers, buildUpstreamAuthHeaders('openrouter', cred));\n headers['anthropic-version'] = '2023-06-01';\n break;\n\n case 'requesty':\n // Requesty expose aussi un endpoint Anthropic NATIF — servi à\n // /v1/messages (et NON /anthropic/v1/messages comme l'annonce leur\n // doc, qui 404). Même traitement qu'OpenRouter : aucune adaptation\n // request/response, tools/system/thinking passent en natif.\n hostname = 'router.requesty.ai';\n path = '/v1/messages';\n cred = await resolveUpstreamCredential('requesty');\n targetApiKey = cred?.value ?? '';\n if (cred) Object.assign(headers, buildUpstreamAuthHeaders('requesty', cred));\n headers['anthropic-version'] = '2023-06-01';\n break;\n\n case 'zai':\n hostname = 'open.bigmodel.cn';\n path = '/api/paas/v4/chat/completions'; // Zhipu AI standard path\n cred = await resolveUpstreamCredential('zai');\n targetApiKey = cred?.value ?? '';\n if (cred) Object.assign(headers, buildUpstreamAuthHeaders('zai', cred));\n adaptAnthropicToOpenAI(payload);\n\n // Transformation des tools Anthropic pour ZAI\n if (payload.tools && Array.isArray(payload.tools)) {\n payload.tools = payload.tools.map((t: any) => {\n if (t.input_schema) {\n return {\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema\n }\n };\n }\n return t;\n });\n }\n break;\n\n case 'groq':\n hostname = 'api.groq.com';\n path = '/openai/v1/chat/completions'; // Groq utilise l'API OpenAI standard\n cred = await resolveUpstreamCredential('groq');\n targetApiKey = cred?.value ?? '';\n if (cred) Object.assign(headers, buildUpstreamAuthHeaders('groq', cred));\n adaptAnthropicToOpenAI(payload);\n // Raisonnement modèle-aware — Groq a 3 familles aux APIs incompatibles :\n // - qwen/qwen3.6-27b : reasoning_effort:\"none\" coupe le raisonnement à la source\n // (sinon leak <think> + finish:length). Ne supporte PAS reasoning_format.\n // - gpt-oss-* : reasoning inclus par défaut (leak <think>). Pas de reasoning_format ;\n // include_reasoning:false supprime le raisonnement du output.\n // - llama-3.3-70b et modèles non-reasoning : AUCUN param reasoning (sinon 400).\n delete payload.reasoning_format;\n delete payload.reasoning_effort;\n delete payload.include_reasoning;\n if (resolvedTarget.model === 'qwen/qwen3.6-27b') {\n payload.reasoning_effort = 'none';\n } else if (resolvedTarget.model.startsWith('openai/gpt-oss')) {\n payload.include_reasoning = false;\n }\n\n // Transformation des tools Anthropic pour Groq\n if (payload.tools && Array.isArray(payload.tools)) {\n payload.tools = payload.tools.map((t: any) => {\n if (t.input_schema) {\n return {\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema\n }\n };\n }\n return t;\n });\n }\n break;\n\n case 'xai':\n hostname = 'api.x.ai';\n path = '/v1/chat/completions'; // xAI uses OpenAI-compatible API\n cred = await resolveUpstreamCredential('xai');\n targetApiKey = cred?.value ?? '';\n if (cred) Object.assign(headers, buildUpstreamAuthHeaders('xai', cred));\n adaptAnthropicToOpenAI(payload);\n\n // Transformation des tools Anthropic pour xAI (format OpenAI)\n if (payload.tools && Array.isArray(payload.tools)) {\n payload.tools = payload.tools.map((t: any) => {\n if (t.input_schema) {\n return {\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema\n }\n };\n }\n return t;\n });\n }\n break;\n\n case 'openai':\n hostname = 'api.openai.com';\n path = '/v1/chat/completions';\n cred = await resolveUpstreamCredential('openai');\n targetApiKey = cred?.value ?? '';\n if (cred) Object.assign(headers, buildUpstreamAuthHeaders('openai', cred));\n adaptAnthropicToOpenAI(payload);\n\n // Transformation des tools Anthropic pour OpenAI (format function)\n if (payload.tools && Array.isArray(payload.tools)) {\n payload.tools = payload.tools.map((t: any) => {\n if (t.input_schema) {\n return {\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema\n }\n };\n }\n return t;\n });\n }\n break;\n\n case 'moonshot':\n default:\n hostname = 'api.moonshot.ai';\n path = '/anthropic/v1/messages'; // Mode d'émulation Anthropic natif (Pas besoin de changer les tools)\n cred = await resolveUpstreamCredential('moonshot');\n targetApiKey = cred?.value ?? '';\n if (cred) Object.assign(headers, buildUpstreamAuthHeaders('moonshot', cred));\n headers['Accept'] = 'text/event-stream';\n\n if (!payload.max_tokens) {\n payload.max_tokens = 4096;\n }\n if (resolvedTarget.model === 'kimi-k2.7-code' && !payload.thinking) {\n payload.thinking = { type: 'enabled', budget_tokens: 4000 };\n }\n break;\n }\n }\n\n // Fail closed: buildUpstreamAuthHeaders returns null when a non-api-key\n // credential (e.g. a Claude subscription OAT) is resolved for a\n // non-anthropic upstream. The per-provider Object.assign above already\n // refused to emit it — but we must NOT fall through to an unauthenticated\n // https.request either. 401 before any request is sent.\n if (cred && buildUpstreamAuthHeaders(resolvedTarget.provider, cred) === null) {\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'authentication_error', message: `The resolved credential for provider \"${resolvedTarget.provider}\" cannot be used on this upstream (subscription/oauth credentials are only valid for the anthropic upstream).` } }));\n return;\n }\n\n // A configurable provider may declare its key optional (forge — a\n // private/self-hosted server); every other provider (including nebius)\n // requires one and 401s when absent, exactly as before.\n if (!targetApiKey && !isUpstreamKeyOptional(resolvedTarget.provider)) {\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'authentication_error', message: `No API key for provider \"${resolvedTarget.provider}\"` } }));\n return;\n }\n\n console.log(`[Proxy Sortant] Redirection vers ${resolvedTarget.provider} (${hostname}${path}) avec le modèle \"${payload.model}\"`);\n\n const options: RequestOptions = {\n hostname,\n port,\n path,\n method: 'POST',\n headers\n };\n\n // Budget de rejeu sur tour vide — voir isEmptyAnthropicTurn. Réservé aux\n // providers needsStrip ; décrémenté à chaque rejeu, jamais réarmé.\n let emptyTurnRetriesLeft =\n (resolvedTarget.provider === 'openrouter' || resolvedTarget.provider === 'requesty')\n ? resolveEmptyTurnRetries()\n : 0;\n\n const sendUpstream = (): void => {\n // Chronométrage du tour upstream : ttfb = premier octet de réponse,\n // total = fin du corps. Gate LLM_ENDPOINT_DEBUG_TIMING=1 — diagnostic,\n // pas du bruit de production.\n const upstreamStart = Date.now();\n let upstreamTtfbMs: number | null = null;\n const proxyReq = sendUpstreamRequest(protocol, options, (proxyRes) => {\n const status = proxyRes.statusCode || 200;\n if (upstreamTtfbMs === null) upstreamTtfbMs = Date.now() - upstreamStart;\n proxyRes.on('end', () => {\n if (process.env.LLM_ENDPOINT_DEBUG_TIMING === '1') {\n console.log(\n `[Proxy] upstream done: ${resolvedTarget.provider}:${resolvedTarget.model}` +\n ` status=${status} ttfb=${upstreamTtfbMs}ms total=${Date.now() - upstreamStart}ms` +\n ` stream=${payload.stream === true ? 'true' : 'false'}`\n );\n }\n });\n const contentType = proxyRes.headers['content-type'] as string || '';\n const isStreaming = (payload.stream === true) && /text\\/event-stream/i.test(contentType);\n /** Rejoue le tour. Retourne false si le budget est épuisé. */\n const retryEmptyTurn = (): boolean => {\n if (status !== 200 || emptyTurnRetriesLeft <= 0) return false;\n emptyTurnRetriesLeft--;\n console.warn(\n `\\x1b[33m[Proxy] tour vide (end_turn sans texte ni tool_use) de ` +\n `${resolvedTarget.provider}:${resolvedTarget.model} — rejeu ` +\n `(${emptyTurnRetriesLeft} restant(s))\\x1b[0m`\n );\n proxyRes.resume(); // libère le socket avant de renvoyer\n sendUpstream();\n return true;\n };\n // OpenRouter renvoie des blocs thinking/redacted_thinking (signature vide) que le\n // CLI `claude` rejette pour les modèles courants → on les strip côté proxy.\n // Requesty a le même défaut (vérifié live : sference/* renvoie\n // {\"type\":\"thinking\",…,\"signature\":\"\"}), et c'est précisément par le pack local —\n // où le modèle porte un nom Claude — que le CLI applique ce rejet.\n const needsStrip =\n resolvedTarget.provider === 'openrouter' || resolvedTarget.provider === 'requesty';\n // Groq/ZAI/xAI/OpenAI/forge/nebius parlent OpenAI : convertir la réponse (JSON ou SSE) en Anthropic.\n const needsConvert = resolvedTarget.provider === 'groq' || resolvedTarget.provider === 'zai' || resolvedTarget.provider === 'xai' || resolvedTarget.provider === 'openai' || Boolean(getConfigurableProviderSpec(resolvedTarget.provider));\n\n if (needsConvert && !isStreaming) {\n const respHeaders = { ...proxyRes.headers };\n delete respHeaders['content-length'];\n delete respHeaders['transfer-encoding'];\n respHeaders['content-type'] = 'application/json';\n res.writeHead(status, respHeaders);\n let body = '';\n proxyRes.setEncoding('utf8');\n proxyRes.on('data', (c: string) => { body += c; });\n proxyRes.on('end', () => {\n res.end(openaiJsonToAnthropic(body || '{}'));\n });\n } else if (needsConvert && isStreaming) {\n const respHeaders = { ...proxyRes.headers };\n delete respHeaders['content-length'];\n respHeaders['content-type'] = 'text/event-stream';\n res.writeHead(status, respHeaders);\n const converter = new OpenAIToAnthropicStreamConverter();\n proxyRes.setEncoding('utf8');\n proxyRes.on('data', (c: string) => {\n for (const out of converter.push(c)) res.write(out);\n });\n proxyRes.on('end', () => {\n for (const out of converter.flush()) res.write(out);\n res.end();\n });\n } else if (needsStrip && !isStreaming) {\n // Non-streaming : bufferiser le body JSON, strip les blocs thinking, renvoyer.\n // writeHead est différé jusqu'après la décision de rejeu : une fois les\n // en-têtes envoyés, la réponse est engagée et le rejeu impossible.\n let body = '';\n proxyRes.setEncoding('utf8');\n proxyRes.on('data', (c: string) => { body += c; });\n proxyRes.on('end', () => {\n if (isEmptyAnthropicTurn(body) && retryEmptyTurn()) return;\n const respHeaders = { ...proxyRes.headers };\n delete respHeaders['content-length']; // on va reformer le body\n delete respHeaders['transfer-encoding'];\n res.writeHead(status, respHeaders);\n res.end(stripThinkingFromAnthropicJson(body || '{}'));\n });\n } else if (needsStrip && isStreaming) {\n // Streaming SSE : filtrer les events thinking en flux (indices contigus).\n //\n // Les events sont retenus jusqu'au PREMIER bloc réellement visible\n // (text/tool_use). Coût nul : les blocs thinking étant strippés, rien\n // ne partait vers le client pendant la phase de raisonnement de toute\n // façon — cette fenêtre est exactement celle où le tour vide se joue.\n // Passé ce point on est engagé et on repasse en flux direct.\n const stripper = new AnthropicThinkingStripper();\n const pending: string[] = [];\n let committed = false;\n const commit = (): void => {\n if (committed) return;\n committed = true;\n const respHeaders = { ...proxyRes.headers };\n delete respHeaders['content-length'];\n res.writeHead(status, respHeaders);\n for (const out of pending) res.write(out);\n pending.length = 0;\n };\n proxyRes.setEncoding('utf8');\n proxyRes.on('data', (c: string) => {\n for (const out of stripper.push(c)) {\n if (committed) res.write(out);\n else pending.push(out);\n }\n if (!committed && stripper.hasMeaningfulContent) commit();\n });\n proxyRes.on('end', () => {\n for (const out of stripper.flush()) {\n if (committed) res.write(out);\n else pending.push(out);\n }\n if (!committed && stripper.hasMeaningfulContent) commit();\n if (!committed) {\n // Rien de visible n'a été produit. Rejouer si c'est la signature\n // du tour vide ; sinon livrer le flux tel quel (message bien formé,\n // fût-il vide) plutôt que de laisser le client pendre.\n const emptyTurn = stripper.stopReason === 'end_turn';\n if (emptyTurn && retryEmptyTurn()) return;\n commit();\n }\n res.end();\n });\n } else {\n // Moonshot (Anthropic natif) : pipe brut inchangé.\n res.writeHead(status, proxyRes.headers);\n proxyRes.pipe(res);\n }\n });\n\n proxyReq.on('error', (err) => {\n console.error('[Proxy SORTANT error]', err);\n // Un rejeu peut échouer après qu'un essai précédent a engagé la réponse —\n // n'écrire l'erreur que si rien n'est encore parti.\n if (res.headersSent) { res.end(); return; }\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'api_error', message: err.message } }));\n });\n\n proxyReq.write(JSON.stringify(payload));\n proxyReq.end();\n };\n\n sendUpstream();\n\n } catch (e: any) {\n console.error('[Payload Error]', e);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: e.message } }));\n }\n });\n});\n\n/** Le serveur HTTP du proxy (non démarré). Importable pour test/embed. */\nexport { server };\n\n/** Exporté pour les tests — voir la note sur le rejeu de tour vide. */\nexport { isEmptyAnthropicTurn, resolveEmptyTurnRetries };\n\n/** Exported for tests — reasoning_content passthrough (see passthroughThinking). */\nexport { openaiJsonToAnthropic };\n\n/** Re-exported for the endpoints file config — see endpoints.ts. */\nexport {\n getConfiguredEndpoints,\n resetConfiguredEndpointsCache,\n resolveEndpointsFilePath,\n readEndpointsFromDisk,\n parseEndpointsConfig,\n type EndpointConfig,\n type EndpointDefaultRequestFields,\n type EndpointsFileLoad,\n} from './endpoints.js';\n\n/** Démarre le proxy sur `port` (défaut : {@link PORT}). Renvoie le serveur en écoute. */\nexport function start(port: number = PORT) {\n void resumeIncompleteLocalQueueBatches().catch((err: unknown) => {\n console.error('[Proxy][batches] boot reconciliation failed', err);\n });\n return server.listen(port, () => {\n console.log(`[Proxy Server] Live on http://localhost:${port}`);\n console.log(`[Proxy Server] Anthropic Messages, OpenAI Chat Completions, and OpenAI Responses surfaces configured.`);\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/packs.ts","../src/responses.ts","../src/batches.ts","../src/connectors.ts","../src/endpoints.ts","../src/index.ts"],"names":["httpRequest","resolvePath","homedir","path","readFileSync","httpsRequest","start","body"],"mappings":"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","file":"index.mjs","sourcesContent":["import { createHash } from 'crypto';\n\n/**\n * Capability tier of a route, coarse enough to map onto the four Claude\n * families. Used by {@link toAnthropicStyle} to pick a family prefix for the\n * generated Anthropic-shaped id (see {@link TIER_TO_FAMILY}).\n */\nexport type ModelTier = 'extra-high' | 'high' | 'medium' | 'small';\n\nexport interface ModelRoute {\n provider: string;\n model: string;\n /**\n * Optional Claude-shaped compatibility alias. Committed packs never hardcode\n * this — it is populated either by a local pack (loaded from\n * `packs.local.json`) or on demand by {@link toAnthropicStyle} when a request\n * opts into the Anthropic-style format. Committed packs use\n * provider-transparent model IDs and never pretend to be real Claude models.\n */\n equivalentClaudeName?: string;\n /**\n * Coarse capability tier. Only consumed by {@link toAnthropicStyle} to select\n * a Claude family for the generated alias; ignored on every routing path.\n */\n tier?: ModelTier;\n /**\n * Verified context window of the upstream route, in tokens. Surfaced in the\n * /v1/models metadata when present; never guessed — leave absent when the\n * limit for this specific route is not verified.\n */\n contextWindow?: number;\n /**\n * Verified max output tokens for the upstream route, in tokens. Same\n * honesty rule as {@link ModelRoute.contextWindow}.\n */\n maxOutputTokens?: number;\n}\n\n/**\n * A pack is a curated set of model routes. Packs solve the collision problem\n * when multiple providers share the same display name, and they let users opt\n * into local compatibility aliases for clients that only speak the Anthropic\n * model namespace.\n *\n * Selection methods:\n * - URL path: /v1/{packId}/messages → pack = {packId}\n * - Query param: /v1/messages?pack={packId}\n * - Header: X-Proxy-Pack: {packId}\n * - Default: no pack specified → uses 'default' pack\n */\n\nexport interface ModelPack {\n id: string;\n label: string;\n description: string;\n models: Record<string, ModelRoute>;\n /**\n * Exclude-list of tool-name patterns applied to every request routed through\n * this pack (wildcards allowed, e.g. \"mcp__*\"). Cuts upstream prefill cost\n * when a client (e.g. Claude Desktop) sends hundreds of tool definitions.\n * Applied after per-request header/query trims so an explicit client\n * X-Proxy-Tools allow-list still wins.\n */\n toolsExclude?: string[];\n /**\n * Allow-list of tool-name patterns applied to every request routed through\n * this pack (wildcards allowed). Kept only when no toolsAllow is set on the\n * request itself; a request-level ?tools=/X-Proxy-Tools always wins.\n */\n toolsAllow?: string[];\n}\n\n// ── Official packs (committed) ─────────────────────────────────────────────\n// These are public, provider-transparent model routes. They never contain\n// private codenames or bare Claude aliases mapping to non-Anthropic targets.\n// For Claude compatibility aliases, use a local pack (packs.local.json).\n\nexport const defaultPack: ModelPack = {\n id: 'default',\n label: 'Default transparent routes',\n description: 'Provider-transparent model IDs routed directly to each backend',\n models: {\n 'kimi-k3': { provider: 'moonshot', model: 'kimi-k3' },\n 'kimi-k2.7-code': { provider: 'moonshot', model: 'kimi-k2.7-code' },\n 'kimi-k2.6': { provider: 'moonshot', model: 'kimi-k2.6' },\n 'llama-3.3-70b-versatile': { provider: 'groq', model: 'llama-3.3-70b-versatile' },\n 'qwen/qwen3.6-27b': { provider: 'groq', model: 'qwen/qwen3.6-27b' },\n 'glm-5.2': { provider: 'zai', model: 'glm-5.2' },\n 'gpt-4.1': { provider: 'openai', model: 'gpt-4.1' },\n 'gpt-4o': { provider: 'openai', model: 'gpt-4o' },\n 'gpt-4o-mini': { provider: 'openai', model: 'gpt-4o-mini' },\n // OpenRouter-hosted GLM. Also reachable via the transparent\n // \"openrouter/z-ai/glm-5.3-flash\" reference, but a plain code is needed\n // for the `@llm-endpoint` daemon route, which forwards a bare\n // \"<vendor>/<model>\" string (one slash only) as the model field.\n 'z-ai/glm-5.3-flash': { provider: 'openrouter', model: 'z-ai/glm-5.3-flash' },\n },\n};\n\nexport const xaiPack: ModelPack = {\n id: 'xai',\n label: 'xAI (Grok)',\n description: 'xAI Grok models via the OpenAI-compatible API',\n models: {\n 'grok-4.5': { provider: 'xai', model: 'grok-4.5' },\n 'grok-4.3': { provider: 'xai', model: 'grok-4.3' },\n 'grok-4.20': { provider: 'xai', model: 'grok-4.20' },\n 'grok-build-0.1': { provider: 'xai', model: 'grok-build-0.1' },\n },\n};\n\n// Source: OpenRouter /api/v1/models (fetched 2026-07-16), filtered to openai/*\nexport const openaiPack: ModelPack = {\n id: 'openai',\n label: 'OpenAI',\n description: 'OpenAI models via the OpenAI-compatible API — synced from OpenRouter catalog',\n models: {\n // ── GPT-5.6 series ──\n 'gpt-5.6-luna': { provider: 'openai', model: 'gpt-5.6-luna' },\n 'gpt-5.6-luna-pro': { provider: 'openai', model: 'gpt-5.6-luna-pro' },\n 'gpt-5.6-terra': { provider: 'openai', model: 'gpt-5.6-terra' },\n 'gpt-5.6-terra-pro': { provider: 'openai', model: 'gpt-5.6-terra-pro' },\n 'gpt-5.6-sol': { provider: 'openai', model: 'gpt-5.6-sol' },\n 'gpt-5.6-sol-pro': { provider: 'openai', model: 'gpt-5.6-sol-pro' },\n // ── GPT-5.5 ──\n 'gpt-5.5': { provider: 'openai', model: 'gpt-5.5' },\n 'gpt-5.5-pro': { provider: 'openai', model: 'gpt-5.5-pro' },\n // ── GPT-5.4 ──\n 'gpt-5.4': { provider: 'openai', model: 'gpt-5.4' },\n 'gpt-5.4-mini': { provider: 'openai', model: 'gpt-5.4-mini' },\n 'gpt-5.4-nano': { provider: 'openai', model: 'gpt-5.4-nano' },\n 'gpt-5.4-pro': { provider: 'openai', model: 'gpt-5.4-pro' },\n 'gpt-5.4-image-2': { provider: 'openai', model: 'gpt-5.4-image-2' },\n // ── GPT-5.3 ──\n 'gpt-5.3-chat': { provider: 'openai', model: 'gpt-5.3-chat' },\n 'gpt-5.3-codex': { provider: 'openai', model: 'gpt-5.3-codex' },\n // ── GPT-5.2 ──\n 'gpt-5.2': { provider: 'openai', model: 'gpt-5.2' },\n 'gpt-5.2-pro': { provider: 'openai', model: 'gpt-5.2-pro' },\n 'gpt-5.2-chat': { provider: 'openai', model: 'gpt-5.2-chat' },\n 'gpt-5.2-codex': { provider: 'openai', model: 'gpt-5.2-codex' },\n // ── GPT-5.1 ──\n 'gpt-5.1': { provider: 'openai', model: 'gpt-5.1' },\n 'gpt-5.1-chat': { provider: 'openai', model: 'gpt-5.1-chat' },\n 'gpt-5.1-codex': { provider: 'openai', model: 'gpt-5.1-codex' },\n 'gpt-5.1-codex-mini': { provider: 'openai', model: 'gpt-5.1-codex-mini' },\n 'gpt-5.1-codex-max': { provider: 'openai', model: 'gpt-5.1-codex-max' },\n // ── GPT-5 ──\n 'gpt-5': { provider: 'openai', model: 'gpt-5' },\n 'gpt-5-pro': { provider: 'openai', model: 'gpt-5-pro' },\n 'gpt-5-mini': { provider: 'openai', model: 'gpt-5-mini' },\n 'gpt-5-nano': { provider: 'openai', model: 'gpt-5-nano' },\n 'gpt-5-chat': { provider: 'openai', model: 'gpt-5-chat' },\n 'gpt-5-codex': { provider: 'openai', model: 'gpt-5-codex' },\n 'gpt-chat-latest': { provider: 'openai', model: 'gpt-chat-latest' },\n // ── GPT-5 image ──\n 'gpt-5-image': { provider: 'openai', model: 'gpt-5-image' },\n 'gpt-5-image-mini': { provider: 'openai', model: 'gpt-5-image-mini' },\n // ── GPT-4.x ──\n 'gpt-4.1': { provider: 'openai', model: 'gpt-4.1' },\n 'gpt-4.1-mini': { provider: 'openai', model: 'gpt-4.1-mini' },\n 'gpt-4.1-nano': { provider: 'openai', model: 'gpt-4.1-nano' },\n 'gpt-4o': { provider: 'openai', model: 'gpt-4o' },\n 'gpt-4o-mini': { provider: 'openai', model: 'gpt-4o-mini' },\n 'gpt-4o-2024-05-13': { provider: 'openai', model: 'gpt-4o-2024-05-13' },\n 'gpt-4o-2024-08-06': { provider: 'openai', model: 'gpt-4o-2024-08-06' },\n 'gpt-4o-2024-11-20': { provider: 'openai', model: 'gpt-4o-2024-11-20' },\n 'gpt-4o-mini-2024-07-18': { provider: 'openai', model: 'gpt-4o-mini-2024-07-18' },\n 'gpt-4o-mini-search-preview': { provider: 'openai', model: 'gpt-4o-mini-search-preview' },\n 'gpt-4o-search-preview': { provider: 'openai', model: 'gpt-4o-search-preview' },\n 'gpt-4': { provider: 'openai', model: 'gpt-4' },\n 'gpt-4-turbo': { provider: 'openai', model: 'gpt-4-turbo' },\n 'gpt-4-turbo-preview': { provider: 'openai', model: 'gpt-4-turbo-preview' },\n // ── GPT-3.5 (legacy) ──\n 'gpt-3.5-turbo': { provider: 'openai', model: 'gpt-3.5-turbo' },\n 'gpt-3.5-turbo-16k': { provider: 'openai', model: 'gpt-3.5-turbo-16k' },\n 'gpt-3.5-turbo-0613': { provider: 'openai', model: 'gpt-3.5-turbo-0613' },\n 'gpt-3.5-turbo-instruct': { provider: 'openai', model: 'gpt-3.5-turbo-instruct' },\n // ── Audio ──\n 'gpt-audio': { provider: 'openai', model: 'gpt-audio' },\n 'gpt-audio-mini': { provider: 'openai', model: 'gpt-audio-mini' },\n // ── o-series (reasoning) ──\n o1: { provider: 'openai', model: 'o1' },\n 'o1-pro': { provider: 'openai', model: 'o1-pro' },\n o3: { provider: 'openai', model: 'o3' },\n 'o3-pro': { provider: 'openai', model: 'o3-pro' },\n 'o3-mini': { provider: 'openai', model: 'o3-mini' },\n 'o3-mini-high': { provider: 'openai', model: 'o3-mini-high' },\n 'o3-deep-research': { provider: 'openai', model: 'o3-deep-research' },\n 'o4-mini': { provider: 'openai', model: 'o4-mini' },\n 'o4-mini-high': { provider: 'openai', model: 'o4-mini-high' },\n 'o4-mini-deep-research': { provider: 'openai', model: 'o4-mini-deep-research' },\n // ── OSS ──\n 'gpt-oss-20b': { provider: 'openai', model: 'gpt-oss-20b' },\n 'gpt-oss-20b:free': { provider: 'openai', model: 'gpt-oss-20b:free' },\n 'gpt-oss-120b': { provider: 'openai', model: 'gpt-oss-120b' },\n 'gpt-oss-safeguard-20b': { provider: 'openai', model: 'gpt-oss-safeguard-20b' },\n },\n};\n\nexport const anthropicPack: ModelPack = {\n id: 'anthropic',\n label: 'Anthropic (direct)',\n description: 'Claude models routed directly to api.anthropic.com via ANTHROPIC_API_KEY',\n models: {\n 'claude-opus-4-8': { provider: 'anthropic', model: 'claude-opus-4-8' },\n 'claude-sonnet-5': { provider: 'anthropic', model: 'claude-sonnet-5' },\n // Unlike the other entries here, Anthropic's live /v1/models does not\n // expose a bare \"claude-haiku-4-5\" id — only the datestamped one\n // resolves (verified against a live models-list fetch; see\n // packages/model-catalog/src/llm/context-windows.generated.ts). Do not\n // \"fix\" this to match the other entries — that would 404 upstream.\n 'claude-haiku-4-5': { provider: 'anthropic', model: 'claude-haiku-4-5-20251001' },\n // claude-fable-5 is registered in the model catalog (catalog.ts) and\n // context-windows.generated.ts with confirmed pricing. The model ID is\n // used as-is because Anthropic exposes it without a datestamp alias.\n 'claude-fable-5': { provider: 'anthropic', model: 'claude-fable-5' },\n },\n};\n\nexport const openrouterPack: ModelPack = {\n id: 'openrouter',\n label: 'OpenRouter',\n description: 'Source-backed models available through OpenRouter',\n models: {\n 'anthropic/claude-3-5-sonnet-20241022': {\n provider: 'openrouter',\n model: 'anthropic/claude-3-5-sonnet-20241022',\n equivalentClaudeName: 'claude-3-5-sonnet-20241022',\n },\n 'anthropic/claude-3-opus-20240229': {\n provider: 'openrouter',\n model: 'anthropic/claude-3-opus-20240229',\n equivalentClaudeName: 'claude-3-opus-20240229',\n },\n 'openai/gpt-4o': { provider: 'openrouter', model: 'openai/gpt-4o' },\n 'openai/gpt-4o-mini': { provider: 'openrouter', model: 'openai/gpt-4o-mini' },\n },\n};\n\nexport const requestyPack: ModelPack = {\n id: 'requesty',\n label: 'Requesty',\n description: 'Source-backed models available through the Requesty router',\n models: {\n // Requesty ids are already vendor-prefixed, so the pack code IS the\n // upstream id — transparent, no aliasing. Claude-name compatibility for\n // this router belongs in a local pack (see packs.local.example.ts).\n 'sference/thinkingcap-qwen3.6-27b': {\n provider: 'requesty',\n model: 'sference/thinkingcap-qwen3.6-27b',\n },\n 'sference/glm-5.2': { provider: 'requesty', model: 'sference/glm-5.2' },\n 'openai/gpt-4.1': { provider: 'requesty', model: 'openai/gpt-4.1' },\n 'openai/gpt-4o': { provider: 'requesty', model: 'openai/gpt-4o' },\n },\n};\n\n// Curated production coding models, all routed through OpenRouter's native\n// Anthropic-compatible endpoint. Provider-transparent (code === upstream id);\n// no preview/free routes. Tiers feed toAnthropicStyle only. Cross-check the ids\n// against `GET https://openrouter.ai/api/v1/models?supported_parameters=tools`\n// when refreshing this list — availability and pricing drift.\nexport const codingPack: ModelPack = {\n id: 'coding',\n label: 'Coding (OpenRouter)',\n description: 'Curated production coding models routed through OpenRouter',\n models: {\n 'openai/gpt-5.5': { provider: 'openrouter', model: 'openai/gpt-5.5', tier: 'extra-high' },\n 'anthropic/claude-opus-4.8': { provider: 'openrouter', model: 'anthropic/claude-opus-4.8', tier: 'high' },\n 'deepseek/deepseek-v4-pro': { provider: 'openrouter', model: 'deepseek/deepseek-v4-pro', tier: 'high' },\n 'anthropic/claude-sonnet-5': { provider: 'openrouter', model: 'anthropic/claude-sonnet-5', tier: 'medium' },\n 'z-ai/glm-5.2': { provider: 'openrouter', model: 'z-ai/glm-5.2', tier: 'medium' },\n 'minimax/minimax-m3': { provider: 'openrouter', model: 'minimax/minimax-m3', tier: 'small' },\n },\n};\n\n// ── Registry ──────────────────────────────────────────────────────────────\n// Start with official packs. Local packs are merged at runtime if present.\nexport const PACK_REGISTRY: Record<string, ModelPack> = {\n [defaultPack.id]: defaultPack,\n [xaiPack.id]: xaiPack,\n [openaiPack.id]: openaiPack,\n [openrouterPack.id]: openrouterPack,\n [requestyPack.id]: requestyPack,\n [anthropicPack.id]: anthropicPack,\n [codingPack.id]: codingPack,\n};\n\n// Default pack used when no pack is specified.\nexport const DEFAULT_PACK_ID = 'default';\n\n/**\n * Resolve a pack by ID from the official registry.\n * Returns the default pack when packId is null/undefined.\n * Throws a RangeError for non-null IDs that are not in the registry —\n * callers that need silent fallback should check `PACK_REGISTRY[id]` first.\n */\nexport function resolvePack(packId: string | null | undefined): ModelPack {\n if (!packId) return PACK_REGISTRY[DEFAULT_PACK_ID]!;\n const pack = PACK_REGISTRY[packId];\n if (!pack) throw new RangeError(`Unknown pack id: \"${packId}\". Available: ${Object.keys(PACK_REGISTRY).join(', ')}`);\n return pack;\n}\n\n/**\n * Build a flat route mapping from a pack.\n */\nexport function buildMappingFromPack(pack: ModelPack): Record<string, ModelRoute> {\n return { ...pack.models };\n}\n\n/**\n * List all available pack IDs for discovery.\n */\nexport function listPackIds(): string[] {\n return Object.keys(PACK_REGISTRY);\n}\n\n// ── Local-pack schema validation ────────────────────────────────────────────\n// Local packs come from a hand-edited, gitignored packs.local.json, so they are\n// untrusted input. The repo ships no schema library, so these are hand-written\n// typed guards over the ModelPack/ModelRoute shape. Each error names the\n// offending pack + field so a fail-soft load can warn precisely and the reload\n// endpoint (POST /v1/packs/reload) can return a legible 400.\n\n/** Narrow an unknown to a plain object (records, not arrays/null). */\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** The four legal ModelRoute tiers, as a guard so `tier` narrows to ModelTier. */\nfunction isModelTier(value: string): value is ModelTier {\n return value === 'extra-high' || value === 'high' || value === 'medium' || value === 'small';\n}\n\n/**\n * Validate a single ModelRoute, appending `<where>.<field>`-scoped messages to\n * `errors`. Returns the rebuilt, typed route on success, else null — the route\n * is reconstructed from the validated primitives rather than cast, so the\n * caller gets a real ModelRoute without an `as`.\n */\nfunction validateModelRoute(route: unknown, where: string, errors: string[]): ModelRoute | null {\n if (!isRecord(route)) {\n errors.push(`${where}: expected an object, got ${route === null ? 'null' : typeof route}`);\n return null;\n }\n const { provider, model, equivalentClaudeName, tier, contextWindow, maxOutputTokens } = route;\n let ok = true;\n if (typeof provider !== 'string' || provider.length === 0) {\n errors.push(`${where}.provider: required non-empty string`);\n ok = false;\n }\n if (typeof model !== 'string' || model.length === 0) {\n errors.push(`${where}.model: required non-empty string`);\n ok = false;\n }\n if (equivalentClaudeName !== undefined && typeof equivalentClaudeName !== 'string') {\n errors.push(`${where}.equivalentClaudeName: must be a string when present`);\n ok = false;\n }\n if (tier !== undefined && !(typeof tier === 'string' && isModelTier(tier))) {\n errors.push(`${where}.tier: must be one of extra-high|high|medium|small when present`);\n ok = false;\n }\n if (contextWindow !== undefined && !(typeof contextWindow === 'number' && Number.isFinite(contextWindow) && contextWindow > 0)) {\n errors.push(`${where}.contextWindow: must be a positive finite number when present`);\n ok = false;\n }\n if (maxOutputTokens !== undefined && !(typeof maxOutputTokens === 'number' && Number.isFinite(maxOutputTokens) && maxOutputTokens > 0)) {\n errors.push(`${where}.maxOutputTokens: must be a positive finite number when present`);\n ok = false;\n }\n if (!ok || typeof provider !== 'string' || typeof model !== 'string') return null;\n const built: ModelRoute = { provider, model };\n if (typeof equivalentClaudeName === 'string') built.equivalentClaudeName = equivalentClaudeName;\n if (typeof tier === 'string' && isModelTier(tier)) built.tier = tier;\n if (typeof contextWindow === 'number' && Number.isFinite(contextWindow) && contextWindow > 0) {\n built.contextWindow = contextWindow;\n }\n if (typeof maxOutputTokens === 'number' && Number.isFinite(maxOutputTokens) && maxOutputTokens > 0) {\n built.maxOutputTokens = maxOutputTokens;\n }\n return built;\n}\n\n/** The outcome of validating one pack: the rebuilt typed pack, or its errors. */\nexport type ModelPackValidation =\n | { ok: true; pack: ModelPack }\n | { ok: false; errors: string[] };\n\n/**\n * Validate a single ModelPack shape. On success returns the rebuilt, typed\n * pack; on failure returns the collected, field-scoped errors. `label` scopes\n * the messages (e.g. the pack key from the envelope). Accepts a built-in pack\n * and rejects anything missing an id / a valid models map / a valid route.\n */\nexport function validateModelPack(pack: unknown, label = 'pack'): ModelPackValidation {\n const errors: string[] = [];\n if (!isRecord(pack)) {\n return { ok: false, errors: [`${label}: expected an object, got ${pack === null ? 'null' : typeof pack}`] };\n }\n const { id, label: packLabel, description, models, toolsExclude, toolsAllow } = pack;\n if (typeof id !== 'string' || id.length === 0) errors.push(`${label}.id: required non-empty string`);\n if (typeof packLabel !== 'string') errors.push(`${label}.label: required string`);\n if (typeof description !== 'string') errors.push(`${label}.description: required string`);\n /** Validates an optional string[] of non-empty tool-name patterns. */\n const validPatternList = (v: unknown): v is string[] =>\n Array.isArray(v) && v.every((p) => typeof p === 'string' && p.length > 0);\n if (toolsExclude !== undefined && !validPatternList(toolsExclude)) {\n errors.push(`${label}.toolsExclude: must be an array of non-empty strings when present`);\n }\n if (toolsAllow !== undefined && !validPatternList(toolsAllow)) {\n errors.push(`${label}.toolsAllow: must be an array of non-empty strings when present`);\n }\n const builtModels: Record<string, ModelRoute> = {};\n if (!isRecord(models)) {\n errors.push(`${label}.models: required object mapping code → route`);\n } else {\n for (const [code, route] of Object.entries(models)) {\n const built = validateModelRoute(route, `${label}.models.${code}`, errors);\n if (built) builtModels[code] = built;\n }\n }\n if (errors.length > 0) return { ok: false, errors };\n // Re-narrow the primitives (the imperative checks above don't flow through) to\n // rebuild a typed ModelPack with no cast. Unreachable else — errors would be set.\n if (typeof id === 'string' && typeof packLabel === 'string' && typeof description === 'string') {\n return {\n ok: true,\n pack: {\n id,\n label: packLabel,\n description,\n models: builtModels,\n ...(validPatternList(toolsExclude) ? { toolsExclude } : {}),\n ...(validPatternList(toolsAllow) ? { toolsAllow } : {}),\n },\n };\n }\n return { ok: false, errors: [`${label}: failed final type narrowing`] };\n}\n\n/** The outcome of validating a `{ packs: {...} }` envelope. */\nexport type LocalPacksValidation =\n | { ok: true; packs: Record<string, ModelPack> }\n | { ok: false; errors: string[] };\n\n/**\n * Validate the `{ packs: { <id>: ModelPack } }` envelope read from\n * packs.local.json. On success returns the typed pack map; on failure returns\n * the collected, field-scoped errors from every invalid pack.\n */\nexport function validateLocalPacks(envelope: unknown): LocalPacksValidation {\n if (!isRecord(envelope)) {\n return { ok: false, errors: [`root: expected an object with a \"packs\" key, got ${envelope === null ? 'null' : typeof envelope}`] };\n }\n if (!isRecord(envelope.packs)) {\n return { ok: false, errors: ['packs: expected an object mapping id → pack'] };\n }\n const errors: string[] = [];\n const packs: Record<string, ModelPack> = {};\n for (const [id, pack] of Object.entries(envelope.packs)) {\n const result = validateModelPack(pack, `packs.${id}`);\n if (result.ok) packs[id] = result.pack;\n else errors.push(...result.errors);\n }\n if (errors.length > 0) return { ok: false, errors };\n return { ok: true, packs };\n}\n\n/**\n * Providers that support transparent `provider/model` routing on the OpenAI\n * chat/completions and Responses surfaces. This is the allow-list for both\n * `?p=` overrides and model-id prefixes.\n */\nexport const KNOWN_TRANSPARENT_PROVIDERS = new Set([\n 'anthropic',\n 'moonshot',\n 'openrouter',\n 'requesty',\n 'zai',\n 'groq',\n 'xai',\n 'openai',\n // Self-hosted fine-tunes (vLLM --enable-lora) — see FORGE_BASE_URL in\n // src/index.ts. Absent from every committed pack: LoRA adapters are\n // registered on the forge server itself, not known ahead of time here.\n 'forge',\n // Nebius AI Studio — see NEBIUS_BASE_URL/NEBIUS_API_KEY in src/index.ts.\n // Same \"configurable OpenAI-compatible upstream\" mechanism as forge, but\n // with a working default host (api.studio.nebius.com) and a required key.\n 'nebius',\n]);\n\n/**\n * Parse a transparent model reference of the form `provider/model`.\n * Returns `{ provider, model }` when the prefix is a known provider, else null.\n * For `openrouter` and `requesty`, the remainder may contain additional slashes\n * (e.g. `openrouter/anthropic/claude-3-5-sonnet-20241022`,\n * `requesty/sference/thinkingcap-qwen3.6-27b`) — the split is on the FIRST\n * slash only, so the router's own vendor prefix survives intact.\n */\nexport function parseTransparentModel(model: string): { provider: string; model: string } | null {\n const slashIdx = model.indexOf('/');\n if (slashIdx <= 0 || slashIdx === model.length - 1) return null;\n const provider = model.slice(0, slashIdx);\n if (!KNOWN_TRANSPARENT_PROVIDERS.has(provider)) return null;\n return { provider, model: model.slice(slashIdx + 1) };\n}\n\n/**\n * Wildcard/pattern matching helper for tool names.\n * Supports exact match and trailing wildcard: \"agentproto_*\" matches \"agentproto_start\",\n * \"prefix*\" matches \"prefixFoo\", \"*\" matches everything.\n */\nexport function matchesPattern(name: string, pattern: string): boolean {\n return pattern.endsWith('*') ? name.startsWith(pattern.slice(0, -1)) : name === pattern;\n}\n\n// ── Anthropic-style format transform ────────────────────────────────────────\n// Relabels each route with an opaque, Claude-shaped id so Anthropic-only\n// clients get ids they'll accept, WITHOUT impersonating a real Claude model.\n// Applied on demand (never committed) when a request opts into the\n// Anthropic-style format — see the X-Proxy-Format handling in index.ts.\n\n/** Maps a coarse capability tier onto a Claude family used as the id prefix. */\nexport const TIER_TO_FAMILY: Record<ModelTier, string> = {\n 'extra-high': 'fable',\n high: 'opus',\n medium: 'sonnet',\n small: 'haiku',\n};\n\n// Family used when a route carries no tier — a neutral middle default.\nconst DEFAULT_FAMILY = 'sonnet';\n\nexport interface ToAnthropicStyleOptions {\n /** New pack id (defaults to the source pack's id). */\n id?: string;\n /** New label (defaults to the source pack's label). */\n label?: string;\n /** Number of decimal digits in the sha-derived suffix (default 7). */\n digits?: number;\n /** Alias prefix (default \"claude-\"). */\n idPrefix?: string;\n}\n\n/**\n * Derive a deterministic, fixed-length numeric string from a model id via\n * sha256. Distinct upstream ids yield distinct numbers (collision-resistant\n * within a pack); the same id always yields the same number, so ids are stable\n * across process restarts and unit-testable. No Math.random.\n */\nexport function shaNumericId(model: string, digits = 7): string {\n const hex = createHash('sha256').update(model).digest('hex');\n // 15 hex chars ≈ 60 bits — safely below Number/BigInt-from-hex limits and\n // more than enough entropy for the small pack sizes here.\n const n = BigInt('0x' + hex.slice(0, 15)) % (10n ** BigInt(digits));\n return n.toString().padStart(digits, '0');\n}\n\n/**\n * Convert a pack to \"Anthropic style\": every route keeps its transparent code\n * (the display name) and its real provider/model, and gains an\n * `equivalentClaudeName` of the form `claude-<family>-<sha>`. The family comes\n * from the route's {@link ModelTier} (fallback `sonnet`); the suffix is a\n * sha-derived number of the upstream model id. Pure and deterministic.\n */\nexport function toAnthropicStyle(pack: ModelPack, opts: ToAnthropicStyleOptions = {}): ModelPack {\n const { digits = 7, idPrefix = 'claude-' } = opts;\n const models: Record<string, ModelRoute> = {};\n for (const [code, route] of Object.entries(pack.models)) {\n const family = route.tier ? TIER_TO_FAMILY[route.tier] : DEFAULT_FAMILY;\n models[code] = {\n ...route,\n equivalentClaudeName: `${idPrefix}${family}-${shaNumericId(route.model, digits)}`,\n };\n }\n return {\n id: opts.id ?? pack.id,\n label: opts.label ?? pack.label,\n description: pack.description,\n models,\n };\n}\n","/**\n * OpenAI Responses API → OpenAI Chat Completions facade.\n *\n * Codex custom providers require `wire_api = \"responses\"` and POST to\n * `<base_url>/responses`. This module translates those requests into the\n * provider's OpenAI-compatible chat/completions endpoint and converts the\n * upstream response back into the Responses API contract.\n */\n\n// ── Request types ──────────────────────────────────────────────────────────\n\nexport interface ResponsesInputText {\n type: 'input_text';\n text: string;\n}\n\nexport interface ResponsesOutputText {\n type: 'output_text';\n text: string;\n}\n\nexport type ResponsesContentItem = ResponsesInputText | ResponsesOutputText;\n\nexport interface ResponsesMessageItem {\n type: 'message';\n role: 'user' | 'assistant' | 'system' | 'developer';\n content: string | ResponsesContentItem[];\n}\n\nexport interface ResponsesFunctionCallOutputItem {\n type: 'function_call_output';\n call_id: string;\n output: string;\n}\n\nexport type ResponsesInputItem =\n | ResponsesMessageItem\n | ResponsesFunctionCallOutputItem;\n\nexport interface ResponsesFunctionTool {\n type: 'function';\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n strict?: boolean;\n}\n\nexport interface ResponsesReasoning {\n effort?: 'low' | 'medium' | 'high';\n summary?: 'auto' | 'detailed' | 'concise' | 'auto_verbose';\n}\n\nexport interface ResponsesTextControls {\n verbosity?: 'low' | 'medium' | 'high';\n format?: unknown;\n}\n\nexport interface ResponsesRequestBody {\n model: string;\n input: string | ResponsesInputItem[];\n instructions?: string;\n tools?: ResponsesFunctionTool[];\n tool_choice?: 'auto' | 'none' | 'required' | { type: 'function'; name: string };\n stream?: boolean;\n parallel_tool_calls?: boolean;\n max_output_tokens?: number;\n max_tokens?: number;\n temperature?: number;\n top_p?: number;\n // Provider metadata that the facade accepts but cannot preserve across the\n // chat/completions translation; they are dropped after validation.\n store?: boolean;\n include?: string[];\n client_metadata?: Record<string, string>;\n service_tier?: string;\n prompt_cache_key?: string;\n stream_options?: unknown;\n reasoning?: ResponsesReasoning;\n text?: ResponsesTextControls;\n // Explicitly unsupported.\n previous_response_id?: string;\n}\n\n// ── Chat Completions types ─────────────────────────────────────────────────\n\nexport interface ChatCompletionsMessage {\n role: string;\n content?: string | null;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }>;\n tool_call_id?: string;\n name?: string;\n}\n\nexport interface ChatCompletionsTool {\n type: 'function';\n function: {\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n };\n strict?: boolean;\n}\n\nexport interface ChatCompletionsRequestBody {\n model: string;\n messages: ChatCompletionsMessage[];\n tools?: ChatCompletionsTool[];\n tool_choice?: unknown;\n stream?: boolean;\n parallel_tool_calls?: boolean;\n max_tokens?: number;\n temperature?: number;\n top_p?: number;\n reasoning_effort?: string;\n /** vLLM's OpenAI-compatible extension — see endpoints.ts's defaultRequestFields. */\n chat_template_kwargs?: Record<string, unknown>;\n}\n\n// ── Validation ─────────────────────────────────────────────────────────────\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction assertString(value: unknown, field: string): string {\n if (typeof value !== 'string') {\n throw new TypeError(`Expected ${field} to be a string`);\n }\n return value;\n}\n\nfunction assertOptionalString(value: unknown, field: string): string | undefined {\n if (value === undefined || value === null) return undefined;\n return assertString(value, field);\n}\n\nfunction assertOptionalNumber(value: unknown, field: string): number | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== 'number' || Number.isNaN(value)) {\n throw new TypeError(`Expected ${field} to be a number`);\n }\n return value;\n}\n\nfunction assertOptionalBoolean(value: unknown, field: string): boolean | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== 'boolean') {\n throw new TypeError(`Expected ${field} to be a boolean`);\n }\n return value;\n}\n\nfunction validateContentItem(item: unknown): ResponsesContentItem {\n if (!isPlainObject(item)) {\n throw new TypeError('Input message content items must be objects');\n }\n const type = item.type;\n if (type !== 'input_text' && type !== 'output_text') {\n throw new TypeError(\n `Unsupported input message content item type \"${String(type)}\"; only \"input_text\" and \"output_text\" are supported`\n );\n }\n return { type, text: assertString(item.text, 'content item text') };\n}\n\nfunction validateInputItem(item: unknown): ResponsesInputItem {\n if (!isPlainObject(item)) {\n throw new TypeError('Input items must be objects');\n }\n const type = item.type;\n if (type === 'message') {\n const role = assertString(item.role, 'input message role');\n if (role !== 'user' && role !== 'assistant' && role !== 'system' && role !== 'developer') {\n throw new TypeError(\n `Unsupported input message role \"${role}\"; only \"user\", \"assistant\", \"system\", and \"developer\" are supported`\n );\n }\n let content: string | ResponsesContentItem[];\n if (typeof item.content === 'string') {\n content = item.content;\n } else if (Array.isArray(item.content)) {\n content = item.content.map(validateContentItem);\n } else {\n throw new TypeError('Input message content must be a string or an array of content items');\n }\n return { type: 'message', role, content };\n }\n if (type === 'function_call_output') {\n return {\n type: 'function_call_output',\n call_id: assertString(item.call_id, 'function_call_output call_id'),\n output: typeof item.output === 'string'\n ? item.output\n : JSON.stringify(item.output ?? {}),\n };\n }\n throw new TypeError(\n `Unsupported input item type \"${String(type)}\"; only \"message\" and \"function_call_output\" are supported`\n );\n}\n\nfunction validateTool(tool: unknown): ResponsesFunctionTool {\n if (!isPlainObject(tool)) {\n throw new TypeError('Tools must be objects');\n }\n if (tool.type !== 'function') {\n throw new TypeError(\n `Unsupported tool type \"${String(tool.type)}\"; only \"function\" tools are supported`\n );\n }\n return {\n type: 'function',\n name: assertString(tool.name, 'tool name'),\n description: assertOptionalString(tool.description, 'tool description'),\n parameters: isPlainObject(tool.parameters) ? tool.parameters : undefined,\n strict: assertOptionalBoolean(tool.strict, 'tool strict'),\n };\n}\n\n/**\n * Validates and normalizes an incoming OpenAI Responses API request body.\n * Throws a descriptive TypeError for unsupported constructs before any\n * provider I/O occurs.\n */\nexport function validateResponsesRequest(body: unknown): ResponsesRequestBody {\n if (!isPlainObject(body)) {\n throw new TypeError('Request body must be a JSON object');\n }\n\n const model = assertString(body.model, 'model');\n\n let input: string | ResponsesInputItem[];\n if (typeof body.input === 'string') {\n input = body.input;\n } else if (Array.isArray(body.input)) {\n input = body.input.map(validateInputItem);\n } else {\n throw new TypeError('\"input\" must be a string or an array of input items');\n }\n\n const instructions = assertOptionalString(body.instructions, 'instructions');\n\n let tools: ResponsesFunctionTool[] | undefined;\n if (body.tools !== undefined && body.tools !== null) {\n if (!Array.isArray(body.tools)) {\n throw new TypeError('\"tools\" must be an array');\n }\n tools = body.tools.map(validateTool);\n }\n\n let toolChoice: ResponsesRequestBody['tool_choice'];\n if (body.tool_choice !== undefined && body.tool_choice !== null) {\n if (typeof body.tool_choice === 'string') {\n const tc = body.tool_choice;\n if (tc !== 'auto' && tc !== 'none' && tc !== 'required') {\n throw new TypeError(\n `Unsupported tool_choice \"${tc}\"; must be \"auto\", \"none\", \"required\", or a function object`\n );\n }\n toolChoice = tc;\n } else if (isPlainObject(body.tool_choice)) {\n const tc = body.tool_choice;\n if (tc.type !== 'function') {\n throw new TypeError(\n `Unsupported tool_choice type \"${String(tc.type)}\"; only \"function\" is supported`\n );\n }\n toolChoice = {\n type: 'function',\n name: assertString(tc.name, 'tool_choice function name'),\n };\n } else {\n throw new TypeError('\"tool_choice\" must be a string or an object');\n }\n }\n\n // Unsupported constructs that cannot be preserved across the translation.\n if (body.previous_response_id !== undefined && body.previous_response_id !== null) {\n throw new TypeError(\n '\"previous_response_id\" is not supported; the facade translates each request independently'\n );\n }\n if (\n body.text !== undefined &&\n body.text !== null &&\n isPlainObject(body.text) &&\n body.text.format !== undefined &&\n body.text.format !== null\n ) {\n throw new TypeError(\n '\"text.format\" / structured output is not supported by this facade'\n );\n }\n\n const result: ResponsesRequestBody = {\n model,\n input,\n instructions,\n tools,\n tool_choice: toolChoice,\n stream: assertOptionalBoolean(body.stream, 'stream'),\n parallel_tool_calls: assertOptionalBoolean(body.parallel_tool_calls, 'parallel_tool_calls'),\n max_output_tokens: assertOptionalNumber(body.max_output_tokens, 'max_output_tokens'),\n max_tokens: assertOptionalNumber(body.max_tokens, 'max_tokens'),\n temperature: assertOptionalNumber(body.temperature, 'temperature'),\n top_p: assertOptionalNumber(body.top_p, 'top_p'),\n // Harmless provider metadata: accepted to keep Codex happy, but dropped\n // before the upstream call because chat/completions does not preserve them.\n store: assertOptionalBoolean(body.store, 'store'),\n include: Array.isArray(body.include) ? body.include.map((v) => assertString(v, 'include')) : undefined,\n client_metadata: isPlainObject(body.client_metadata) ? body.client_metadata as Record<string, string> : undefined,\n service_tier: assertOptionalString(body.service_tier, 'service_tier'),\n prompt_cache_key: assertOptionalString(body.prompt_cache_key, 'prompt_cache_key'),\n stream_options: body.stream_options,\n reasoning: body.reasoning !== undefined && body.reasoning !== null\n ? {\n effort: ['low', 'medium', 'high'].includes(String((body.reasoning as any).effort))\n ? (String((body.reasoning as any).effort) as 'low' | 'medium' | 'high')\n : undefined,\n summary: ['auto', 'detailed', 'concise', 'auto_verbose'].includes(\n String((body.reasoning as any).summary)\n )\n ? (String((body.reasoning as any).summary) as 'auto' | 'detailed' | 'concise' | 'auto_verbose')\n : undefined,\n }\n : undefined,\n text: body.text !== undefined && body.text !== null\n ? { verbosity: ['low', 'medium', 'high'].includes(String((body.text as any).verbosity))\n ? (String((body.text as any).verbosity) as 'low' | 'medium' | 'high')\n : undefined }\n : undefined,\n };\n\n return result;\n}\n\n// ── Request translation: Responses → Chat Completions ──────────────────────\n\nfunction flattenContent(content: string | ResponsesContentItem[]): string {\n if (typeof content === 'string') return content;\n return content.map((c) => c.text).join('');\n}\n\n/** Exported for tests — system/developer merge into one leading message. */\nexport function translateInputToMessages(\n input: string | ResponsesInputItem[],\n instructions: string | undefined\n): ChatCompletionsMessage[] {\n // `instructions` and every `system`/`developer` message item are merged into\n // ONE leading system message — a system message anywhere else in the array\n // breaks strict chat templates (\"System message must be at the beginning\").\n const sysParts: string[] = [];\n if (instructions) sysParts.push(instructions);\n\n const rest: ChatCompletionsMessage[] = [];\n if (typeof input === 'string') {\n rest.push({ role: 'user', content: input });\n } else {\n for (const item of input) {\n if (item.type === 'message') {\n if (item.role === 'developer' || item.role === 'system') {\n const text = flattenContent(item.content);\n if (text) sysParts.push(text);\n continue;\n }\n rest.push({ role: item.role, content: flattenContent(item.content) });\n } else if (item.type === 'function_call_output') {\n rest.push({ role: 'tool', tool_call_id: item.call_id, content: item.output });\n }\n }\n }\n\n const messages: ChatCompletionsMessage[] = [];\n if (sysParts.length) messages.push({ role: 'system', content: sysParts.join('\\n\\n') });\n messages.push(...rest);\n return messages;\n}\n\nfunction translateToolToChatCompletions(tool: ResponsesFunctionTool): ChatCompletionsTool {\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n strict: tool.strict,\n };\n}\n\nfunction translateToolChoice(toolChoice: ResponsesRequestBody['tool_choice']): unknown {\n if (!toolChoice) return undefined;\n if (typeof toolChoice === 'string') return toolChoice;\n return {\n type: 'function',\n function: { name: toolChoice.name },\n };\n}\n\n/**\n * Converts a validated Responses API request into an OpenAI Chat Completions\n * request that the existing provider infrastructure can forward.\n */\nexport function responsesToChatCompletionsRequest(\n body: ResponsesRequestBody,\n _resolvedTarget: { provider: string; model: string }\n): ChatCompletionsRequestBody {\n const messages = translateInputToMessages(body.input, body.instructions);\n\n const result: ChatCompletionsRequestBody = {\n model: _resolvedTarget.model,\n messages,\n stream: body.stream,\n parallel_tool_calls: body.parallel_tool_calls,\n max_tokens: body.max_output_tokens ?? body.max_tokens,\n temperature: body.temperature,\n top_p: body.top_p,\n };\n\n if (body.tools && body.tools.length > 0) {\n result.tools = body.tools.map(translateToolToChatCompletions);\n }\n\n if (body.tool_choice) {\n result.tool_choice = translateToolChoice(body.tool_choice);\n }\n\n // Map Responses reasoning.effort to the OpenAI chat/completions parameter.\n // Reasoning summary is Responses-API-specific and is dropped.\n if (body.reasoning?.effort) {\n result.reasoning_effort = body.reasoning.effort;\n }\n\n return result;\n}\n\n// ── Response translation: Chat Completions → Responses API ─────────────────\n\nfunction generateResponseId(): string {\n return `resp_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction generateOutputItemId(prefix: string): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction chatChoiceToOutputItems(choice: any): any[] {\n const output: any[] = [];\n const msg = choice && choice.message;\n if (!msg) return output;\n\n const text = typeof msg.content === 'string' ? msg.content : '';\n if (text) {\n output.push({\n type: 'message',\n id: generateOutputItemId('msg'),\n role: 'assistant',\n content: [\n { type: 'output_text', text, annotations: [] },\n ],\n });\n }\n\n if (Array.isArray(msg.tool_calls)) {\n for (const tc of msg.tool_calls) {\n const fn = tc.function || {};\n output.push({\n type: 'function_call',\n id: tc.id || generateOutputItemId('fc'),\n call_id: tc.id || generateOutputItemId('call'),\n name: fn.name || '',\n arguments: typeof fn.arguments === 'string' ? fn.arguments : JSON.stringify(fn.arguments ?? {}),\n });\n }\n }\n\n return output;\n}\n\nfunction chatUsageToResponsesUsage(usage: any): any {\n const prompt = usage?.prompt_tokens ?? 0;\n const completion = usage?.completion_tokens ?? 0;\n const cached = usage?.prompt_tokens_details?.cached_tokens ?? 0;\n const reasoning = usage?.completion_tokens_details?.reasoning_tokens ?? 0;\n return {\n input_tokens: prompt,\n input_tokens_details: { cached_tokens: cached },\n output_tokens: completion,\n output_tokens_details: { reasoning_tokens: reasoning },\n total_tokens: usage?.total_tokens ?? prompt + completion,\n };\n}\n\n/**\n * Converts a non-streaming OpenAI Chat Completions JSON response into an\n * OpenAI Responses API JSON response.\n */\nexport function chatCompletionsJsonToResponses(\n jsonStr: string,\n opts: { requestedModel: string; responseId?: string }\n): string {\n try {\n const upstream = JSON.parse(jsonStr);\n if (upstream && typeof upstream === 'object' && upstream.error) {\n return JSON.stringify({\n error: upstream.error,\n });\n }\n\n const choice = upstream.choices && upstream.choices[0];\n const responseId = opts.responseId || upstream.id || generateResponseId();\n const now = Math.floor(Date.now() / 1000);\n\n const response = {\n id: responseId,\n object: 'response',\n created_at: now,\n status: 'completed',\n error: null,\n incomplete_details: null,\n instructions: null,\n max_output_tokens: null,\n model: opts.requestedModel,\n output: chatChoiceToOutputItems(choice),\n parallel_tool_calls: upstream.parallel_tool_calls ?? false,\n tool_choice: 'auto',\n tools: [],\n usage: chatUsageToResponsesUsage(upstream.usage),\n };\n\n return JSON.stringify(response);\n } catch {\n return jsonStr;\n }\n}\n\n// ── Streaming translation ──────────────────────────────────────────────────\n\ninterface StreamState {\n responseId: string;\n requestedModel: string;\n textItemId: string | null;\n textStarted: boolean;\n toolItems: Map<number, { id: string; callId: string; name: string; index: number }>;\n accUsage: { prompt_tokens?: number; completion_tokens?: number };\n finished: boolean;\n sentCreated: boolean;\n}\n\nfunction sse(event: string, data: any): string {\n return `event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`;\n}\n\nfunction createInitialResponse(responseId: string, model: string): any {\n return {\n id: responseId,\n object: 'response',\n created_at: Math.floor(Date.now() / 1000),\n status: 'in_progress',\n error: null,\n incomplete_details: null,\n instructions: null,\n max_output_tokens: null,\n model,\n output: [],\n parallel_tool_calls: false,\n tool_choice: 'auto',\n tools: [],\n usage: { input_tokens: 0, output_tokens: 0, total_tokens: 0 },\n };\n}\n\n/**\n * Converts an upstream OpenAI Chat Completions SSE stream into an OpenAI\n * Responses API SSE stream. Emits the events Codex needs:\n * response.created\n * response.output_item.added\n * response.output_text.delta\n * response.output_item.done\n * response.custom_tool_call_input.delta\n * response.completed\n */\nexport class OpenAIChatToResponsesStreamConverter {\n private state: StreamState;\n private buffer = '';\n\n constructor(opts: { requestedModel: string; responseId?: string }) {\n this.state = {\n responseId: opts.responseId || generateResponseId(),\n requestedModel: opts.requestedModel,\n textItemId: null,\n textStarted: false,\n toolItems: new Map(),\n accUsage: {},\n finished: false,\n sentCreated: false,\n };\n }\n\n push(chunk: string): string[] {\n this.buffer += chunk;\n const out: string[] = [];\n const parts = this.buffer.split(/\\r?\\n\\r?\\n/);\n this.buffer = parts.pop() ?? '';\n for (const part of parts) {\n const transformed = this.transformEvent(part);\n if (transformed) out.push(...transformed);\n }\n return out;\n }\n\n flush(): string[] {\n if (this.buffer.trim()) {\n const transformed = this.transformEvent(this.buffer);\n this.buffer = '';\n return transformed || [];\n }\n return [];\n }\n\n private ensureCreated(): string[] {\n if (this.state.sentCreated) return [];\n this.state.sentCreated = true;\n return [sse('response.created', {\n type: 'response.created',\n response: createInitialResponse(this.state.responseId, this.state.requestedModel),\n })];\n }\n\n private transformEvent(rawEvent: string): string[] | null {\n const lines = rawEvent.split(/\\r?\\n/);\n const dataLines: string[] = [];\n for (const line of lines) {\n if (line.startsWith('data:')) dataLines.push(line.slice(5).trim());\n }\n if (!dataLines.length) return null;\n\n const out: string[] = [];\n for (const dl of dataLines) {\n if (dl === '[DONE]') {\n if (this.state.finished) continue;\n out.push(...this.finalize());\n this.state.finished = true;\n continue;\n }\n\n let data: any;\n try { data = JSON.parse(dl); } catch { continue; }\n\n const choice = data.choices && data.choices[0];\n const delta = choice && choice.delta;\n const content = delta && delta.content;\n const toolCalls = delta && delta.tool_calls;\n\n out.push(...this.ensureCreated());\n\n // Text streaming.\n if (typeof content === 'string') {\n if (!this.state.textItemId) {\n this.state.textItemId = generateOutputItemId('msg');\n out.push(sse('response.output_item.added', {\n type: 'response.output_item.added',\n item: {\n type: 'message',\n id: this.state.textItemId,\n role: 'assistant',\n content: [],\n },\n output_index: 0,\n }));\n }\n if (content) {\n if (!this.state.textStarted) {\n out.push(sse('response.content_part.added', {\n type: 'response.content_part.added',\n item_id: this.state.textItemId,\n output_index: 0,\n content_index: 0,\n part: { type: 'output_text', text: '' },\n }));\n this.state.textStarted = true;\n }\n out.push(sse('response.output_text.delta', {\n type: 'response.output_text.delta',\n item_id: this.state.textItemId,\n output_index: 0,\n content_index: 0,\n delta: content,\n }));\n }\n }\n\n // Tool call streaming.\n if (Array.isArray(toolCalls)) {\n for (const tc of toolCalls) {\n const idx = typeof tc.index === 'number' ? tc.index : 0;\n let tool = this.state.toolItems.get(idx);\n if (tc.function && tc.function.name && !tool) {\n tool = {\n id: tc.id || generateOutputItemId('fc'),\n callId: tc.id || generateOutputItemId('call'),\n name: tc.function.name,\n index: idx,\n };\n this.state.toolItems.set(idx, tool);\n out.push(sse('response.output_item.added', {\n type: 'response.output_item.added',\n item: {\n type: 'function_call',\n id: tool.id,\n call_id: tool.callId,\n name: tool.name,\n arguments: '',\n },\n output_index: this.state.textItemId ? 1 : 0,\n }));\n }\n if (tool && tc.function && tc.function.arguments) {\n out.push(sse('response.custom_tool_call_input.delta', {\n type: 'response.custom_tool_call_input.delta',\n item_id: tool.id,\n call_id: tool.callId,\n delta: tc.function.arguments,\n }));\n }\n }\n }\n\n // Usage accumulation.\n const u = data.x_groq && data.x_groq.usage ? data.x_groq.usage : data.usage;\n if (u) {\n if (u.prompt_tokens != null) this.state.accUsage.prompt_tokens = u.prompt_tokens;\n if (u.completion_tokens != null) this.state.accUsage.completion_tokens = u.completion_tokens;\n }\n\n // Finish reason handling.\n const fr = choice && choice.finish_reason;\n if (fr && !this.state.finished) {\n out.push(...this.finalize());\n this.state.finished = true;\n }\n }\n\n return out.length ? out : null;\n }\n\n private finalize(): string[] {\n const out: string[] = [];\n\n if (this.state.textItemId) {\n if (this.state.textStarted) {\n out.push(sse('response.content_part.done', {\n type: 'response.content_part.done',\n item_id: this.state.textItemId,\n output_index: 0,\n content_index: 0,\n part: { type: 'output_text', text: '' },\n }));\n }\n out.push(sse('response.output_item.done', {\n type: 'response.output_item.done',\n item: {\n type: 'message',\n id: this.state.textItemId,\n role: 'assistant',\n content: [{ type: 'output_text', text: '' }],\n },\n output_index: 0,\n }));\n }\n\n this.state.toolItems.forEach((tool, idx) => {\n out.push(sse('response.output_item.done', {\n type: 'response.output_item.done',\n item: {\n type: 'function_call',\n id: tool.id,\n call_id: tool.callId,\n name: tool.name,\n arguments: '',\n },\n output_index: this.state.textItemId ? 1 + idx : idx,\n }));\n });\n\n const usage = {\n input_tokens: this.state.accUsage.prompt_tokens || 0,\n input_tokens_details: { cached_tokens: 0 },\n output_tokens: this.state.accUsage.completion_tokens || 0,\n output_tokens_details: { reasoning_tokens: 0 },\n total_tokens: (this.state.accUsage.prompt_tokens || 0) + (this.state.accUsage.completion_tokens || 0),\n };\n\n out.push(sse('response.completed', {\n type: 'response.completed',\n response: {\n id: this.state.responseId,\n object: 'response',\n status: 'completed',\n output: [],\n usage,\n },\n }));\n\n return out;\n }\n}\n","/**\n * `/v1/messages/batches*` — an Anthropic-shaped Batches surface on top of\n * `@agentproto/batch`. Batch is a delivery mode, not a model: each item's\n * `params` is the same Messages body the sync `/v1/messages` route already\n * understands, so per-item routing/tool-trimming is reused verbatim from\n * `index.ts` (hence the circular import — both sides only touch the other's\n * exports from inside a function body, never at module top level, so ESM's\n * circular-resolution rules leave it safe).\n *\n * Per resolved provider:\n * - anthropic → native Anthropic Message Batches (50%, 24h window).\n * - openrouter → native OpenRouter Batch API (50%, one provider batch per model).\n * - everything else → localQueueDriver emulation: items are run through the\n * proxy's OWN sync /v1/messages path over loopback, full price.\n * A batch spanning several providers is split into sub-batches keyed by\n * `custom_id` and re-aggregated on every read.\n */\n\nimport { randomBytes } from 'node:crypto';\nimport { mkdir, readFile, readdir, rename, rm, writeFile } from 'node:fs/promises';\nimport { request as httpRequest } from 'node:http';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport {\n anthropicBatchDriver,\n anthropicMessageSchema,\n assertUniqueCustomIds,\n batchHandleSchema,\n BatchStore,\n BatchUnsupportedError,\n BatchValidationError,\n localQueueDriver,\n messagesBodySchema,\n newBatchId,\n openrouterBatchDriver,\n RetryableCompletionError,\n ulid,\n validateForBatch,\n type AnthropicMessage,\n type BatchCounts,\n type BatchDriver,\n type BatchHandle,\n type BatchOutcome,\n type BatchRequest,\n type BatchResultError,\n type LocalQueueDriver,\n type MessagesBody,\n} from '@agentproto/batch';\nimport { resolveModelRoute, resolveUpstreamCredential, stripThinkingFromAnthropicJson, trimTools } from './index.js';\nimport type { ModelRouteContext, UpstreamCredential } from './index.js';\nimport type { ModelPack } from './packs.js';\n\n// ── Process-local loopback bypass token ─────────────────────────────────────\n// Generated once per process, kept in memory only (never persisted, never\n// logged). The local-queue transport attaches it as `X-Proxy-Internal` on its\n// loopback call to this proxy's own `/v1/messages`; the gate in index.ts\n// accepts it as an alternative to a normal access token so the internal call\n// isn't itself blocked by LLM_ENDPOINT_ACCESS_TOKENS/LLM_ENDPOINT_EDGE_TOKENS.\nconst INTERNAL_TOKEN = randomBytes(32).toString('hex');\n\n/** The process-local loopback bypass token. Exported for tests; treat as a secret. */\nexport function getInternalProxyToken(): string {\n return INTERNAL_TOKEN;\n}\n\n/** True when `headers` carry the correct `X-Proxy-Internal` token. */\nexport function isInternalLoopbackRequest(headers: IncomingMessage['headers']): boolean {\n const raw = headers['x-proxy-internal'];\n const value = Array.isArray(raw) ? raw[0] : raw;\n return value !== undefined && value === INTERNAL_TOKEN;\n}\n\n// ── Config ───────────────────────────────────────────────────────────────\n\nconst BATCH_TTL_MS = 24 * 60 * 60 * 1000;\nconst PRUNE_AFTER_MS = 29 * 24 * 60 * 60 * 1000;\nconst DEFAULT_LOCAL_QUEUE_CONCURRENCY = 4;\n\nfunction stateDir(): string {\n return process.env.LLM_ENDPOINT_STATE_DIR || path.join(homedir(), '.agentproto', 'llm-endpoint');\n}\n\nfunction batchConcurrency(): number {\n const raw = process.env.LLM_ENDPOINT_BATCH_CONCURRENCY;\n const n = raw ? Number.parseInt(raw, 10) : NaN;\n return Number.isFinite(n) && n > 0 ? n : DEFAULT_LOCAL_QUEUE_CONCURRENCY;\n}\n\nfunction defaultLoopbackPort(): number {\n const raw = process.env.LLM_ENDPOINT_PORT ?? process.env.PORT;\n const n = raw ? Number.parseInt(raw, 10) : NaN;\n return Number.isFinite(n) ? n : 18090;\n}\n\n// ── Durable proxy-level batch record ────────────────────────────────────────\n// A composite record over one or more @agentproto/batch sub-batches, stored\n// as its own small JSON file under `<stateDir>/proxy-batches/<id>.json` — a\n// distinct namespace from `@agentproto/batch`'s own `<stateDir>/batches/<id>/`\n// layout (used below for the local-queue driver's per-item store), so the two\n// never collide even though they share a state root.\n\nconst proxySubBatchSchema = z.object({\n provider: z.enum(['anthropic', 'openrouter', 'local-queue']),\n handle: batchHandleSchema,\n customIds: z.array(z.string()),\n cancelError: z.string().nullable(),\n});\n\ntype ProxySubBatch = z.infer<typeof proxySubBatchSchema>;\ntype BatchDriverKind = ProxySubBatch['provider'];\n\nconst batchResultErrorShapeSchema = z.object({ type: z.string(), message: z.string() });\n\nconst resultLineOutcomeSchema = z.union([\n z.object({ type: z.literal('succeeded'), message: anthropicMessageSchema }),\n z.object({ type: z.literal('errored'), error: batchResultErrorShapeSchema }),\n z.object({ type: z.literal('canceled') }),\n z.object({ type: z.literal('expired') }),\n]);\n\nconst cachedResultLineSchema = z.object({\n customId: z.string(),\n result: resultLineOutcomeSchema,\n});\n\ntype CachedResultLine = z.infer<typeof cachedResultLineSchema>;\n\nconst proxyBatchRecordSchema = z.object({\n id: z.string(),\n createdAt: z.string(),\n expiresAt: z.string(),\n cancelInitiatedAt: z.string().nullable(),\n endedAt: z.string().nullable(),\n subBatches: z.array(proxySubBatchSchema),\n cachedResults: z.array(cachedResultLineSchema).nullable(),\n});\n\ntype ProxyBatchRecord = z.infer<typeof proxyBatchRecordSchema>;\n\nfunction newProxyBatchId(): string {\n return `msgbatch_${ulid()}`;\n}\n\nclass ProxyBatchFileStore {\n constructor(private readonly dir: string) {}\n\n private file(id: string): string {\n return path.join(this.dir, `${id}.json`);\n }\n\n async save(record: ProxyBatchRecord): Promise<void> {\n await mkdir(this.dir, { recursive: true });\n const target = this.file(record.id);\n const tmp = `${target}.tmp-${randomBytes(8).toString('hex')}`;\n await writeFile(tmp, JSON.stringify(record, null, 2), 'utf8');\n await rename(tmp, target);\n }\n\n async remove(id: string): Promise<void> {\n await rm(this.file(id), { force: true });\n }\n\n /** Loads a record, pruning (and returning `undefined` for) one older than 29 days. */\n async load(id: string): Promise<ProxyBatchRecord | undefined> {\n const raw = await readFile(this.file(id), 'utf8').catch(() => undefined);\n if (raw === undefined) return undefined;\n const record = proxyBatchRecordSchema.parse(JSON.parse(raw));\n if (Date.now() - Date.parse(record.createdAt) > PRUNE_AFTER_MS) {\n await this.remove(id);\n return undefined;\n }\n return record;\n }\n\n async list(): Promise<ProxyBatchRecord[]> {\n const entries = await readdir(this.dir).catch((): string[] => []);\n const records: ProxyBatchRecord[] = [];\n for (const entry of entries) {\n if (!entry.endsWith('.json') || entry.includes('.tmp-')) continue;\n const record = await this.load(entry.slice(0, -'.json'.length));\n if (record) records.push(record);\n }\n return records;\n }\n}\n\nlet _proxyStore: ProxyBatchFileStore | undefined;\nfunction proxyStore(): ProxyBatchFileStore {\n if (!_proxyStore) _proxyStore = new ProxyBatchFileStore(path.join(stateDir(), 'proxy-batches'));\n return _proxyStore;\n}\n\nlet _localQueueStore: BatchStore | undefined;\nfunction localQueueStore(): BatchStore {\n if (!_localQueueStore) _localQueueStore = new BatchStore({ stateDir: stateDir() });\n return _localQueueStore;\n}\n\n// ── Test seam ────────────────────────────────────────────────────────────\n\nexport interface BatchDriverFactories {\n anthropic?: (opts: { apiKey: string }) => BatchDriver;\n openrouter?: (opts: { apiKey: string }) => BatchDriver;\n localQueue?: (opts: { store: BatchStore; concurrency: number }) => LocalQueueDriver;\n}\n\nlet driverOverrides: BatchDriverFactories = {};\n\n/** Test seam: inject fake drivers keyed by provider. See `resetBatchState`. */\nexport function configureBatchDrivers(factories: BatchDriverFactories): void {\n driverOverrides = factories;\n}\n\n/** Resets driver overrides and cached store handles — call between tests. */\nexport function resetBatchState(): void {\n driverOverrides = {};\n _proxyStore = undefined;\n _localQueueStore = undefined;\n}\n\n// ── Loopback transport for local-queue emulation ────────────────────────────\n\nfunction makeLoopbackComplete(port: number): (body: MessagesBody) => Promise<AnthropicMessage> {\n return (body: MessagesBody) =>\n new Promise<AnthropicMessage>((resolve, reject) => {\n const payload = JSON.stringify(body);\n const outgoing = httpRequest(\n {\n hostname: '127.0.0.1',\n port,\n path: '/v1/messages',\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Content-Length': Buffer.byteLength(payload),\n 'X-Proxy-Internal': INTERNAL_TOKEN,\n },\n },\n (loopbackRes) => {\n let data = '';\n loopbackRes.setEncoding('utf8');\n loopbackRes.on('data', (chunk: string) => {\n data += chunk;\n });\n loopbackRes.on('end', () => {\n const status = loopbackRes.statusCode ?? 0;\n if (status === 429 || status >= 500) {\n reject(new RetryableCompletionError(`loopback /v1/messages returned ${status}`, status));\n return;\n }\n if (status >= 400) {\n reject(new Error(`loopback /v1/messages returned ${status}: ${data.slice(0, 200)}`));\n return;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n reject(new Error('loopback /v1/messages returned invalid JSON'));\n return;\n }\n const result = anthropicMessageSchema.safeParse(parsed);\n if (!result.success) {\n reject(new Error('loopback /v1/messages returned an unexpected message shape'));\n return;\n }\n resolve(result.data);\n });\n },\n );\n outgoing.on('error', reject);\n outgoing.write(payload);\n outgoing.end();\n });\n}\n\nfunction defaultLocalQueueDriver(opts: { store: BatchStore; concurrency: number }, port: number): LocalQueueDriver {\n return localQueueDriver({ store: opts.store, concurrency: opts.concurrency, complete: makeLoopbackComplete(port) });\n}\n\nfunction localQueueDriverInstance(port: number): LocalQueueDriver {\n const factory = driverOverrides.localQueue ?? ((o: { store: BatchStore; concurrency: number }) => defaultLocalQueueDriver(o, port));\n return factory({ store: localQueueStore(), concurrency: batchConcurrency() });\n}\n\n/** Thrown when a resolved credential can't be used for batch operations — mapped to a 401. */\nclass BatchCredentialError extends Error {}\n\nasync function getDriverForSubBatch(sub: ProxySubBatch, port: number): Promise<BatchDriver> {\n if (sub.provider === 'anthropic') {\n const cred = await resolveUpstreamCredential('anthropic');\n if (!cred || !cred.value) throw new BatchCredentialError('No API key for provider \"anthropic\"');\n if (cred.method !== 'api-key') {\n throw new BatchCredentialError(\n 'Anthropic batches require an API key credential; the resolved credential is a subscription OAuth token, which cannot be used with the Batches API.',\n );\n }\n return (driverOverrides.anthropic ?? ((o: { apiKey: string }) => anthropicBatchDriver(o)))({ apiKey: cred.value });\n }\n if (sub.provider === 'openrouter') {\n const cred = await resolveUpstreamCredential('openrouter');\n if (!cred || !cred.value) throw new BatchCredentialError('No API key for provider \"openrouter\"');\n return (driverOverrides.openrouter ?? ((o: { apiKey: string }) => openrouterBatchDriver(o)))({ apiKey: cred.value });\n }\n return localQueueDriverInstance(port);\n}\n\nfunction batchDriverKind(provider: string): BatchDriverKind {\n if (provider === 'anthropic') return 'anthropic';\n if (provider === 'openrouter') return 'openrouter';\n return 'local-queue';\n}\n\n// ── Aggregate status across sub-batches ─────────────────────────────────────\n\ninterface AggregateStatus {\n state: 'in_progress' | 'canceling' | 'ended';\n counts: BatchCounts;\n endedAt: string | null;\n}\n\nasync function computeAggregateStatus(record: ProxyBatchRecord, port: number): Promise<AggregateStatus> {\n const counts: BatchCounts = { processing: 0, succeeded: 0, errored: 0, canceled: 0, expired: 0 };\n let allTerminal = true;\n for (const sub of record.subBatches) {\n const driver = await getDriverForSubBatch(sub, port);\n const status = await driver.status(sub.handle);\n counts.processing += status.counts.processing;\n counts.succeeded += status.counts.succeeded;\n counts.errored += status.counts.errored;\n counts.canceled += status.counts.canceled;\n counts.expired += status.counts.expired;\n if (status.state !== 'ended' && status.state !== 'failed') allTerminal = false;\n }\n if (!allTerminal) {\n return { state: record.cancelInitiatedAt ? 'canceling' : 'in_progress', counts, endedAt: null };\n }\n return { state: 'ended', counts, endedAt: record.endedAt ?? new Date().toISOString() };\n}\n\nasync function getStatusAndPersist(record: ProxyBatchRecord, port: number): Promise<AggregateStatus> {\n const status = await computeAggregateStatus(record, port);\n if (status.endedAt && !record.endedAt) {\n record.endedAt = status.endedAt;\n await proxyStore().save(record);\n }\n return status;\n}\n\nfunction toBatchObject(record: ProxyBatchRecord, status: AggregateStatus) {\n return {\n id: record.id,\n type: 'message_batch' as const,\n processing_status: status.state,\n request_counts: status.counts,\n ended_at: status.endedAt,\n created_at: record.createdAt,\n expires_at: record.expiresAt,\n cancel_initiated_at: record.cancelInitiatedAt,\n results_url: status.state === 'ended' ? `/v1/messages/batches/${record.id}/results` : null,\n archived_at: null,\n };\n}\n\nfunction toResultShape(\n outcome: BatchOutcome,\n message: AnthropicMessage | undefined,\n error: BatchResultError | undefined,\n): CachedResultLine['result'] {\n switch (outcome) {\n case 'succeeded':\n if (!message) return { type: 'errored', error: { type: 'api_error', message: 'succeeded result missing a message' } };\n return { type: 'succeeded', message };\n case 'errored':\n return { type: 'errored', error: error ?? { type: 'api_error', message: 'unknown error' } };\n case 'canceled':\n return { type: 'canceled' };\n case 'expired':\n return { type: 'expired' };\n }\n}\n\n// ── Inbound validation ───────────────────────────────────────────────────\n\nconst batchCreateItemSchema = z.object({\n custom_id: z.string().min(1),\n params: messagesBodySchema,\n});\n\nconst batchCreateBodySchema = z.object({\n requests: z.array(batchCreateItemSchema).min(1),\n});\n\nfunction describeZodError(error: z.ZodError): string {\n return error.issues.map((issue) => `${issue.path.join('.') || '(root)'}: ${issue.message}`).join('; ');\n}\n\n// ── HTTP plumbing ──────────────────────────────────────────────────────────\n\nfunction respondJson(res: ServerResponse, status: number, body: unknown): void {\n res.writeHead(status, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(body));\n}\n\nfunction invalidRequest(message: string) {\n return { error: { type: 'invalid_request_error', message } };\n}\n\nfunction notFoundBatch(id: string) {\n return { error: { type: 'not_found_error', message: `Batch \"${id}\" not found.` } };\n}\n\nfunction readRequestBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n let data = '';\n req.on('data', (chunk: Buffer) => {\n data += chunk.toString('utf8');\n });\n req.on('end', () => resolve(data));\n req.on('error', reject);\n });\n}\n\nexport interface BatchesRequestContext {\n activePack: ModelPack;\n parsedUrl: URL;\n queryModelCode: string | null;\n queryProvider: string | null;\n forcedAliasCode: string | null;\n anthropicFormat: boolean;\n queryTools: string | null;\n queryNoTools: string | null;\n headerTools: string | null;\n headerNoTools: string | null;\n headerExcludeTools: string | null;\n}\n\ntype BatchesRouteMatch =\n | { kind: 'collection' }\n | { kind: 'item'; id: string }\n | { kind: 'results'; id: string }\n | { kind: 'cancel'; id: string };\n\nconst BATCHES_PATH_MARKER = '/messages/batches';\n\nfunction matchBatchesPath(urlPath: string): BatchesRouteMatch | null {\n const idx = urlPath.indexOf(BATCHES_PATH_MARKER);\n if (idx === -1) return null;\n const rest = urlPath.slice(idx + BATCHES_PATH_MARKER.length);\n if (rest === '') return { kind: 'collection' };\n const segments = rest.split('/').filter((s) => s.length > 0);\n const id = segments[0];\n if (id === undefined) return null;\n if (segments.length === 1) return { kind: 'item', id };\n const sub = segments[1];\n if (segments.length === 2 && sub === 'results') return { kind: 'results', id };\n if (segments.length === 2 && sub === 'cancel') return { kind: 'cancel', id };\n return null;\n}\n\n/**\n * Entry point wired from `index.ts`'s dispatch. Returns `true` (and takes\n * over the response, asynchronously) when `ctx`'s path is a batches route;\n * `false` lets the caller fall through to the rest of the dispatch.\n */\nexport function handleBatchesRequest(req: IncomingMessage, res: ServerResponse, ctx: BatchesRequestContext, urlPath: string): boolean {\n const match = matchBatchesPath(urlPath);\n if (!match) return false;\n void dispatchBatchesRequest(req, res, ctx, match).catch((err: unknown) => {\n if (err instanceof BatchCredentialError) {\n respondJson(res, 401, { error: { type: 'authentication_error', message: err.message } });\n return;\n }\n console.error('[Proxy][batches] unhandled error', err);\n if (res.headersSent) {\n res.end();\n return;\n }\n respondJson(res, 500, { error: { type: 'api_error', message: err instanceof Error ? err.message : 'internal error' } });\n });\n return true;\n}\n\nasync function dispatchBatchesRequest(\n req: IncomingMessage,\n res: ServerResponse,\n ctx: BatchesRequestContext,\n match: BatchesRouteMatch,\n): Promise<void> {\n const method = req.method ?? 'GET';\n const port = req.socket.localPort ?? defaultLoopbackPort();\n\n if (match.kind === 'collection') {\n if (method === 'POST') return handleCreate(req, res, ctx, port);\n if (method === 'GET') return handleList(res, ctx.parsedUrl, port);\n return respondJson(res, 404, { error: { type: 'not_found', message: 'Route not found' } });\n }\n if (match.kind === 'item') {\n if (method === 'GET') return handleRetrieve(res, match.id, port);\n if (method === 'DELETE') return handleDeleteBatch(res, match.id, port);\n return respondJson(res, 404, { error: { type: 'not_found', message: 'Route not found' } });\n }\n if (match.kind === 'results') {\n if (method === 'GET') return handleResults(res, match.id, port);\n return respondJson(res, 404, { error: { type: 'not_found', message: 'Route not found' } });\n }\n if (method === 'POST') return handleCancel(res, match.id, port);\n return respondJson(res, 404, { error: { type: 'not_found', message: 'Route not found' } });\n}\n\n// ── Create ───────────────────────────────────────────────────────────────\n\nasync function handleCreate(req: IncomingMessage, res: ServerResponse, ctx: BatchesRequestContext, port: number): Promise<void> {\n const raw = await readRequestBody(req);\n let json: unknown;\n try {\n json = JSON.parse(raw);\n } catch {\n respondJson(res, 400, invalidRequest('Invalid JSON body'));\n return;\n }\n\n const parsedBody = batchCreateBodySchema.safeParse(json);\n if (!parsedBody.success) {\n respondJson(res, 400, invalidRequest(describeZodError(parsedBody.error)));\n return;\n }\n const items = parsedBody.data.requests;\n\n try {\n assertUniqueCustomIds(items.map((item) => ({ customId: item.custom_id, body: item.params })));\n } catch (err) {\n if (!(err instanceof BatchValidationError)) throw err;\n respondJson(res, 400, invalidRequest(err.message));\n return;\n }\n\n const problems: string[] = [];\n for (const item of items) {\n try {\n validateForBatch({ customId: item.custom_id, body: item.params });\n } catch (err) {\n if (!(err instanceof BatchValidationError)) throw err;\n problems.push(err.message);\n }\n }\n if (problems.length > 0) {\n respondJson(res, 400, invalidRequest(problems.join('; ')));\n return;\n }\n\n const routeCtx: ModelRouteContext = {\n activePack: ctx.activePack,\n queryModelCode: ctx.queryModelCode,\n queryProvider: ctx.queryProvider,\n forcedAliasCode: ctx.forcedAliasCode,\n allowAliases: true,\n anthropicFormat: ctx.anthropicFormat,\n };\n\n interface ResolvedItem {\n customId: string;\n provider: string;\n body: MessagesBody;\n }\n const resolved: ResolvedItem[] = [];\n for (const item of items) {\n let target: { provider: string; model: string };\n try {\n target = resolveModelRoute(item.params, routeCtx);\n } catch (err) {\n problems.push(`\"${item.custom_id}\": ${err instanceof Error ? err.message : String(err)}`);\n continue;\n }\n const body: MessagesBody = { ...item.params, model: target.model };\n trimTools(body, {\n provider: target.provider,\n queryTools: ctx.queryTools,\n queryNoTools: ctx.queryNoTools,\n headerTools: ctx.headerTools,\n headerNoTools: ctx.headerNoTools,\n headerExcludeTools: ctx.headerExcludeTools,\n });\n resolved.push({ customId: item.custom_id, provider: target.provider, body });\n }\n if (problems.length > 0) {\n respondJson(res, 400, invalidRequest(problems.join('; ')));\n return;\n }\n\n const groups = new Map<BatchDriverKind, BatchRequest[]>();\n for (const item of resolved) {\n const kind = batchDriverKind(item.provider);\n const body = kind === 'local-queue' ? { ...item.body, model: `${item.provider}/${item.body.model}` } : item.body;\n const list = groups.get(kind);\n if (list) list.push({ customId: item.customId, body });\n else groups.set(kind, [{ customId: item.customId, body }]);\n }\n\n // Resolve+validate every needed credential BEFORE submitting anything, so a\n // missing credential for one provider doesn't leave another already submitted.\n const credentials = new Map<'anthropic' | 'openrouter', UpstreamCredential>();\n for (const kind of groups.keys()) {\n if (kind !== 'anthropic' && kind !== 'openrouter') continue;\n const cred = await resolveUpstreamCredential(kind);\n if (!cred || !cred.value) {\n respondJson(res, 401, { error: { type: 'authentication_error', message: `No API key for provider \"${kind}\"` } });\n return;\n }\n if (kind === 'anthropic' && cred.method !== 'api-key') {\n respondJson(res, 401, {\n error: {\n type: 'authentication_error',\n message:\n 'Anthropic batches require an API key credential; the resolved credential is a subscription OAuth token, which cannot be used with the Batches API.',\n },\n });\n return;\n }\n credentials.set(kind, cred);\n }\n\n const subBatches: ProxySubBatch[] = [];\n for (const [kind, requests] of groups) {\n if (kind === 'anthropic') {\n const cred = credentials.get('anthropic');\n if (!cred) throw new Error('anthropic credential resolved but missing from cache');\n const driver = (driverOverrides.anthropic ?? ((o: { apiKey: string }) => anthropicBatchDriver(o)))({ apiKey: cred.value });\n const handle = await driver.submit(requests);\n subBatches.push({ provider: 'anthropic', handle, customIds: requests.map((r) => r.customId), cancelError: null });\n } else if (kind === 'openrouter') {\n const cred = credentials.get('openrouter');\n if (!cred) throw new Error('openrouter credential resolved but missing from cache');\n const driver = (driverOverrides.openrouter ?? ((o: { apiKey: string }) => openrouterBatchDriver(o)))({ apiKey: cred.value });\n const handle = await driver.submit(requests);\n subBatches.push({ provider: 'openrouter', handle, customIds: requests.map((r) => r.customId), cancelError: null });\n } else {\n const handle: BatchHandle = {\n id: newBatchId(),\n driver: 'local-queue',\n provider: { batchIds: [] },\n createdAt: new Date().toISOString(),\n requestCount: requests.length,\n models: Array.from(new Set(requests.map((r) => r.body.model))),\n };\n await localQueueStore().create(handle, requests);\n const driver = localQueueDriverInstance(port);\n void driver.resume(handle).catch((err: unknown) => {\n console.error(`[Proxy][batches] local-queue batch \"${handle.id}\" failed`, err);\n });\n subBatches.push({ provider: 'local-queue', handle, customIds: requests.map((r) => r.customId), cancelError: null });\n }\n }\n\n const now = new Date();\n const record: ProxyBatchRecord = {\n id: newProxyBatchId(),\n createdAt: now.toISOString(),\n expiresAt: new Date(now.getTime() + BATCH_TTL_MS).toISOString(),\n cancelInitiatedAt: null,\n endedAt: null,\n subBatches,\n cachedResults: null,\n };\n await proxyStore().save(record);\n const status = await getStatusAndPersist(record, port);\n respondJson(res, 200, toBatchObject(record, status));\n}\n\n// ── Retrieve / list ──────────────────────────────────────────────────────\n\nasync function handleRetrieve(res: ServerResponse, id: string, port: number): Promise<void> {\n const record = await proxyStore().load(id);\n if (!record) {\n respondJson(res, 404, notFoundBatch(id));\n return;\n }\n const status = await getStatusAndPersist(record, port);\n respondJson(res, 200, toBatchObject(record, status));\n}\n\nasync function handleList(res: ServerResponse, parsedUrl: URL, port: number): Promise<void> {\n const records = await proxyStore().list();\n records.sort((a, b) => b.createdAt.localeCompare(a.createdAt));\n\n const limitParam = parsedUrl.searchParams.get('limit');\n const parsedLimit = limitParam ? Number.parseInt(limitParam, 10) : NaN;\n const limit = Number.isFinite(parsedLimit) && parsedLimit > 0 ? parsedLimit : records.length;\n const page = records.slice(0, limit);\n\n const data = [];\n for (const record of page) {\n const status = await getStatusAndPersist(record, port);\n data.push(toBatchObject(record, status));\n }\n respondJson(res, 200, {\n data,\n has_more: false,\n first_id: data.length > 0 ? data[0]!.id : null,\n last_id: data.length > 0 ? data[data.length - 1]!.id : null,\n });\n}\n\n// ── Results ──────────────────────────────────────────────────────────────\n\nasync function handleResults(res: ServerResponse, id: string, port: number): Promise<void> {\n const record = await proxyStore().load(id);\n if (!record) {\n respondJson(res, 404, notFoundBatch(id));\n return;\n }\n const status = await getStatusAndPersist(record, port);\n if (status.state !== 'ended') {\n respondJson(res, 404, {\n error: { type: 'not_found_error', message: `Batch \"${id}\" results are not available until processing_status is \"ended\".` },\n });\n return;\n }\n\n let lines = record.cachedResults;\n if (!lines) {\n lines = [];\n for (const sub of record.subBatches) {\n const driver = await getDriverForSubBatch(sub, port);\n for await (const r of driver.results(sub.handle)) {\n let message = r.message;\n if (sub.provider === 'openrouter' && message) {\n const stripped: unknown = JSON.parse(stripThinkingFromAnthropicJson(JSON.stringify(message)));\n const strippedResult = anthropicMessageSchema.safeParse(stripped);\n if (strippedResult.success) message = strippedResult.data;\n }\n lines.push({ customId: r.customId, result: toResultShape(r.outcome, message, r.error) });\n }\n }\n record.cachedResults = lines;\n await proxyStore().save(record);\n }\n\n res.writeHead(200, { 'Content-Type': 'application/x-jsonl; charset=utf-8' });\n for (const line of lines) {\n res.write(`${JSON.stringify({ custom_id: line.customId, result: line.result })}\\n`);\n }\n res.end();\n}\n\n// ── Cancel / delete ──────────────────────────────────────────────────────\n\nasync function handleCancel(res: ServerResponse, id: string, port: number): Promise<void> {\n const record = await proxyStore().load(id);\n if (!record) {\n respondJson(res, 404, notFoundBatch(id));\n return;\n }\n if (!record.cancelInitiatedAt) record.cancelInitiatedAt = new Date().toISOString();\n\n for (const sub of record.subBatches) {\n const driver = await getDriverForSubBatch(sub, port);\n try {\n await driver.cancel(sub.handle);\n } catch (err) {\n if (!(err instanceof BatchUnsupportedError)) throw err;\n sub.cancelError = err.message;\n }\n }\n await proxyStore().save(record);\n\n const status = await getStatusAndPersist(record, port);\n const forced: AggregateStatus = status.state === 'ended' ? status : { ...status, state: 'canceling' };\n respondJson(res, 200, toBatchObject(record, forced));\n}\n\nasync function bestEffortDeleteAnthropicBatch(sub: ProxySubBatch): Promise<void> {\n const cred = await resolveUpstreamCredential('anthropic');\n if (!cred || !cred.value || cred.method !== 'api-key') return;\n const providerId = sub.handle.provider.batchIds[0];\n if (!providerId) return;\n await fetch(`https://api.anthropic.com/v1/messages/batches/${providerId}`, {\n method: 'DELETE',\n headers: { 'x-api-key': cred.value, 'anthropic-version': '2023-06-01' },\n }).catch(() => undefined);\n}\n\nasync function handleDeleteBatch(res: ServerResponse, id: string, port: number): Promise<void> {\n const record = await proxyStore().load(id);\n if (!record) {\n respondJson(res, 404, notFoundBatch(id));\n return;\n }\n const status = await getStatusAndPersist(record, port);\n if (status.state !== 'ended') {\n respondJson(res, 409, invalidRequest(`Batch \"${id}\" cannot be deleted before it has ended.`));\n return;\n }\n for (const sub of record.subBatches) {\n if (sub.provider === 'anthropic') await bestEffortDeleteAnthropicBatch(sub);\n }\n await proxyStore().remove(id);\n respondJson(res, 200, { id, type: 'message_batch_deleted' });\n}\n\n// ── Boot-time reconciliation ─────────────────────────────────────────────\n\n/**\n * Resumes local-queue sub-batches left unfinished by a prior process's crash.\n * Native sub-batches need no boot action — their status/results are re-polled\n * from the provider on demand using the persisted handle.\n */\nexport async function resumeIncompleteLocalQueueBatches(): Promise<void> {\n const port = defaultLoopbackPort();\n const records = await proxyStore().list();\n for (const record of records) {\n for (const sub of record.subBatches) {\n if (sub.provider !== 'local-queue') continue;\n const driver = localQueueDriverInstance(port);\n void driver.resume(sub.handle).catch((err: unknown) => {\n console.error(`[Proxy][batches] failed to resume local-queue batch \"${sub.handle.id}\" on boot`, err);\n });\n }\n }\n}\n","/**\n * Connectors — small, declarative probes for the local/LAN inference\n * runtimes a named endpoint (`endpoints.ts`) commonly points at: LM Studio,\n * Ollama, vLLM, llama-server, plus a generic OpenAI-compatible fallback for\n * anything else. A connector answers three questions about a `baseUrl`: is\n * this runtime actually running there (`probe`), what models does it have\n * ({@link listModels}), and does it need special request handling\n * ({@link ConnectorQuirks}).\n *\n * Used by `agentproto llm endpoints add/detect/test` and `doctor`'s\n * inference-endpoints check — never by the proxy's own request routing\n * (`index.ts`). In particular, LM Studio's GGUF Qwen builds reject a\n * non-leading system message once tool defs are present; the generic fix\n * for that lives in the adapter layer (a separate PR) — `quirks` is only a\n * hook so callers can find out which connector needs it, not a duplicate of\n * that fix.\n *\n * Deliberately dependency-free and side-effect-free at import time, like\n * `endpoints.ts` and `packs.ts`.\n */\n\nimport { isRecord } from './packs.js';\n\nexport type ConnectorId = 'lmstudio' | 'ollama' | 'vllm' | 'llama-server' | 'openai-compatible';\n\nexport const CONNECTOR_IDS: readonly ConnectorId[] = ['lmstudio', 'ollama', 'vllm', 'llama-server', 'openai-compatible'];\n\nexport function isConnectorId(value: unknown): value is ConnectorId {\n return typeof value === 'string' && (CONNECTOR_IDS as readonly string[]).includes(value);\n}\n\nexport type ConnectorModelState = 'loaded' | 'not-loaded' | 'unknown';\n\n/** One model as reported by a connector's `listModels`. `loadedCtx`/`maxCtx`\n * are omitted (not `undefined`-filled) when the runtime's API doesn't\n * expose them — e.g. Ollama's `/api/tags`/`/api/ps` carry no context size. */\nexport interface ConnectorModel {\n id: string;\n loadedCtx?: number;\n maxCtx?: number;\n device?: string;\n state: ConnectorModelState;\n}\n\nexport interface ConnectorQuirks {\n /** This runtime's chat template can reject a system message that isn't\n * the first message once tool definitions are present (observed on LM\n * Studio GGUF Qwen builds) — callers that build the outbound message\n * array should keep a single leading system message for it. */\n requiresLeadingSystemMessage?: boolean;\n}\n\nexport interface Connector {\n id: ConnectorId;\n label: string;\n /** Default local port this runtime listens on; `null` for the\n * OpenAI-compatible fallback, which has no default port of its own and\n * is never probed by default-port detection. */\n defaultPort: number | null;\n quirks: ConnectorQuirks;\n /** Is this runtime actually answering at `baseUrl`? Never throws — a\n * network error, timeout, or unexpected shape resolves `false`. */\n probe(baseUrl: string, fetchImpl?: typeof fetch): Promise<boolean>;\n /** Best-effort model listing. Never throws — a failed call resolves `[]`. */\n listModels(baseUrl: string, fetchImpl?: typeof fetch): Promise<ConnectorModel[]>;\n}\n\nconst PROBE_TIMEOUT_MS = 2500;\n\ntype JsonFetchResult = { ok: true; body: unknown } | { ok: false };\n\n/** GET `url`, time-boxed, tolerating any failure. Never throws. */\nasync function fetchJsonSafe(url: string, fetchImpl: typeof fetch, timeoutMs: number = PROBE_TIMEOUT_MS): Promise<JsonFetchResult> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetchImpl(url, { signal: controller.signal });\n if (!res.ok) return { ok: false };\n const body: unknown = await res.json().catch(() => null);\n return { ok: true, body };\n } catch {\n return { ok: false };\n } finally {\n clearTimeout(timer);\n }\n}\n\n/** Strip a trailing `/v1` (as stored on `EndpointConfig.baseUrl`) to reach a\n * runtime's own root, where its native (non-OpenAI-compatible) endpoints\n * live — e.g. LM Studio's `/api/v0/models`, Ollama's `/api/tags`. A baseUrl\n * that doesn't end in `/v1` is assumed to already be the root. */\nfunction runtimeRoot(baseUrl: string): string {\n return baseUrl.replace(/\\/v1\\/?$/, '');\n}\n\nfunction stripTrailingSlash(url: string): string {\n return url.replace(/\\/+$/, '');\n}\n\nconst lmstudio: Connector = {\n id: 'lmstudio',\n label: 'LM Studio',\n defaultPort: 1234,\n quirks: { requiresLeadingSystemMessage: true },\n async probe(baseUrl, fetchImpl = fetch) {\n const result = await fetchJsonSafe(`${runtimeRoot(baseUrl)}/api/v0/models`, fetchImpl);\n return result.ok && isRecord(result.body) && Array.isArray(result.body.data);\n },\n async listModels(baseUrl, fetchImpl = fetch) {\n const result = await fetchJsonSafe(`${runtimeRoot(baseUrl)}/api/v0/models`, fetchImpl);\n if (!result.ok || !isRecord(result.body) || !Array.isArray(result.body.data)) return [];\n return result.body.data\n .filter(isRecord)\n .filter((m): m is Record<string, unknown> & { id: string } => typeof m.id === 'string')\n .map((m) => ({\n id: m.id,\n ...(typeof m.loaded_context_length === 'number' ? { loadedCtx: m.loaded_context_length } : {}),\n ...(typeof m.max_context_length === 'number' ? { maxCtx: m.max_context_length } : {}),\n state: m.state === 'loaded' ? 'loaded' : m.state === 'not-loaded' ? 'not-loaded' : 'unknown',\n }));\n },\n};\n\nconst ollama: Connector = {\n id: 'ollama',\n label: 'Ollama',\n defaultPort: 11434,\n quirks: {},\n async probe(baseUrl, fetchImpl = fetch) {\n const result = await fetchJsonSafe(`${runtimeRoot(baseUrl)}/api/tags`, fetchImpl);\n return result.ok && isRecord(result.body) && Array.isArray(result.body.models);\n },\n async listModels(baseUrl, fetchImpl = fetch) {\n const root = runtimeRoot(baseUrl);\n const [tags, ps] = await Promise.all([fetchJsonSafe(`${root}/api/tags`, fetchImpl), fetchJsonSafe(`${root}/api/ps`, fetchImpl)]);\n const loadedNames = new Set<string>();\n if (ps.ok && isRecord(ps.body) && Array.isArray(ps.body.models)) {\n for (const m of ps.body.models) {\n if (isRecord(m) && typeof m.name === 'string') loadedNames.add(m.name);\n }\n }\n if (!tags.ok || !isRecord(tags.body) || !Array.isArray(tags.body.models)) return [];\n return tags.body.models\n .filter(isRecord)\n .filter((m): m is Record<string, unknown> & { name: string } => typeof m.name === 'string')\n .map((m) => ({ id: m.name, state: loadedNames.has(m.name) ? ('loaded' as const) : ('not-loaded' as const) }));\n },\n};\n\nconst llamaServer: Connector = {\n id: 'llama-server',\n label: 'llama-server',\n defaultPort: 8080,\n quirks: {},\n async probe(baseUrl, fetchImpl = fetch) {\n const result = await fetchJsonSafe(`${runtimeRoot(baseUrl)}/props`, fetchImpl);\n return result.ok && isRecord(result.body) && ('default_generation_settings' in result.body || 'model_path' in result.body);\n },\n async listModels(baseUrl, fetchImpl = fetch) {\n const [props, models] = await Promise.all([\n fetchJsonSafe(`${runtimeRoot(baseUrl)}/props`, fetchImpl),\n fetchJsonSafe(`${stripTrailingSlash(baseUrl)}/models`, fetchImpl),\n ]);\n let ctx: number | undefined;\n if (props.ok && isRecord(props.body)) {\n const gen = props.body.default_generation_settings;\n if (isRecord(gen) && typeof gen.n_ctx === 'number') ctx = gen.n_ctx;\n else if (typeof props.body.n_ctx === 'number') ctx = props.body.n_ctx;\n }\n if (!models.ok || !isRecord(models.body) || !Array.isArray(models.body.data)) return [];\n return models.body.data\n .filter(isRecord)\n .filter((m): m is Record<string, unknown> & { id: string } => typeof m.id === 'string')\n .map((m) => ({ id: m.id, ...(ctx !== undefined ? { loadedCtx: ctx, maxCtx: ctx } : {}), state: 'loaded' as const }));\n },\n};\n\nconst vllm: Connector = {\n id: 'vllm',\n label: 'vLLM',\n defaultPort: 8000,\n quirks: {},\n async probe(baseUrl, fetchImpl = fetch) {\n const result = await fetchJsonSafe(`${stripTrailingSlash(baseUrl)}/models`, fetchImpl);\n // vLLM speaks the same OpenAI-compatible /v1/models shape as everything\n // else here; the one distinguishing signal without a vLLM-only endpoint\n // is that its model entries carry `max_model_len` (LM Studio, Ollama, and\n // llama-server's OpenAI-compat listings never set it).\n if (!result.ok || !isRecord(result.body) || !Array.isArray(result.body.data)) return false;\n return result.body.data.some((m) => isRecord(m) && typeof m.max_model_len === 'number');\n },\n async listModels(baseUrl, fetchImpl = fetch) {\n const result = await fetchJsonSafe(`${stripTrailingSlash(baseUrl)}/models`, fetchImpl);\n if (!result.ok || !isRecord(result.body) || !Array.isArray(result.body.data)) return [];\n return result.body.data\n .filter(isRecord)\n .filter((m): m is Record<string, unknown> & { id: string } => typeof m.id === 'string')\n .map((m) => ({\n id: m.id,\n ...(typeof m.max_model_len === 'number' ? { loadedCtx: m.max_model_len, maxCtx: m.max_model_len } : {}),\n state: 'loaded' as const,\n }));\n },\n};\n\nconst openaiCompatible: Connector = {\n id: 'openai-compatible',\n label: 'OpenAI-compatible',\n defaultPort: null,\n quirks: {},\n async probe(baseUrl, fetchImpl = fetch) {\n const result = await fetchJsonSafe(`${stripTrailingSlash(baseUrl)}/models`, fetchImpl);\n return result.ok && isRecord(result.body) && Array.isArray(result.body.data);\n },\n async listModels(baseUrl, fetchImpl = fetch) {\n const result = await fetchJsonSafe(`${stripTrailingSlash(baseUrl)}/models`, fetchImpl);\n if (!result.ok || !isRecord(result.body) || !Array.isArray(result.body.data)) return [];\n return result.body.data\n .filter(isRecord)\n .filter((m): m is Record<string, unknown> & { id: string } => typeof m.id === 'string')\n .map((m) => ({ id: m.id, state: 'unknown' as const }));\n },\n};\n\nexport const CONNECTORS: Record<ConnectorId, Connector> = {\n lmstudio,\n ollama,\n vllm,\n 'llama-server': llamaServer,\n 'openai-compatible': openaiCompatible,\n};\n\nexport function connectorById(id: string): Connector | undefined {\n return isConnectorId(id) ? CONNECTORS[id] : undefined;\n}\n\n/** Probed most-specific first — `openai-compatible` claims any reachable\n * OpenAI-compat `/models`, so it must run last, as the catch-all. */\nconst DETECTION_ORDER: readonly ConnectorId[] = ['lmstudio', 'ollama', 'llama-server', 'vllm', 'openai-compatible'];\n\n/** Identify which connector is serving `baseUrl`, trying the most specific\n * probes first and falling back to the generic OpenAI-compatible one.\n * Returns `null` only if even the fallback probe fails (nothing OpenAI-\n * compatible is reachable there at all). */\nexport async function detectConnector(baseUrl: string, fetchImpl: typeof fetch = fetch): Promise<ConnectorId | null> {\n for (const id of DETECTION_ORDER) {\n if (await CONNECTORS[id].probe(baseUrl, fetchImpl)) return id;\n }\n return null;\n}\n\n/** Default local ports probed by `agentproto llm endpoints detect`, one per\n * runtime that has a real default port (`openai-compatible` doesn't — it's\n * only ever selected explicitly, or as the fallback identity for a\n * positive probe at some other port/runtime). */\nexport const DEFAULT_LOCAL_PORTS: Readonly<Partial<Record<ConnectorId, number>>> = {\n lmstudio: 1234,\n ollama: 11434,\n 'llama-server': 8080,\n vllm: 8000,\n};\n","/**\n * Named OpenAI-compatible endpoints — N local/LAN model servers (Ollama,\n * llama-server, vLLM, …) configured from a JSON file instead of one-off env\n * vars. Mirrors the field names of `openagentik/router`'s `providers[]`\n * schema (`kind`, `baseUrl`, `apiKeyEnv`, `defaultRequestFields`, `timeoutMs`)\n * so a config is portable between the two — see\n * `projects/openagentik/router/router.example.yaml` and\n * `packages/core/src/config/schema.ts` in that repo.\n *\n * Deliberately dependency-free (no zod, no fs writes) and side-effect-free at\n * import time, like packs.ts — this module is imported by both the proxy\n * (src/index.ts) and the CLI (`agentproto llm endpoints …`), which must NOT\n * pull in an HTTP server just to read/validate the config file.\n */\n\nimport { readFileSync } from 'fs';\nimport { homedir } from 'os';\nimport { resolve as resolvePath } from 'path';\nimport { isRecord } from './packs.js';\nimport { CONNECTOR_IDS, isConnectorId, type ConnectorId } from './connectors.js';\n\n/** A JSON value — what `JSON.parse` can ever produce. */\nexport type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\n\n/** Keys that would let a config override routing or auth on the outbound\n * request instead of merely defaulting a model parameter — rejected at\n * parse time regardless of value. */\nconst FORBIDDEN_DEFAULT_REQUEST_FIELD_KEYS = new Set(['model', 'messages', 'stream', 'tools', 'input']);\n\n/** Arbitrary top-level OpenAI-compatible request fields, merged UNDER the\n * client's own request (see index.ts's applyDefaultRequestFields) —\n * everything from vLLM's `chat_template_kwargs` extension to a plain field\n * like LM Studio's `reasoning_effort`. See README's \"Adding an\n * OpenAI-compatible upstream provider\" section. */\nexport type EndpointDefaultRequestFields = Record<string, JsonValue>;\n\nexport interface EndpointTimeoutConfig {\n /** Applied as the outbound socket timeout (time-to-first-byte). */\n firstTokenMs?: number;\n}\n\n/**\n * One configured endpoint. `kind` is carried (mirroring the router schema)\n * but only `\"openai\"` is meaningful here — every routable endpoint in\n * llm-endpoint speaks the OpenAI chat/completions wire shape, same as forge.\n */\nexport interface EndpointConfig {\n id: string;\n kind: 'openai';\n baseUrl: string;\n /** Which local/LAN runtime this points at (`lmstudio`, `ollama`, `vllm`,\n * `llama-server`) or the generic `openai-compatible` fallback — see\n * `connectors.ts`. Absent on entries written before connectors existed;\n * callers that need one (`endpoints test`, `doctor`) treat a missing\n * value as `openai-compatible`. Never affects request routing — only\n * which connector's `listModels`/`quirks` apply. */\n connector?: ConnectorId;\n /** Name of the env var holding the key — never the key itself. Absent ⇒\n * the endpoint is always keyless (a private/LAN server with no auth). */\n apiKeyEnv?: string;\n defaultRequestFields?: EndpointDefaultRequestFields;\n timeoutMs?: EndpointTimeoutConfig;\n}\n\n/** `forge` is always the implicit `FORGE_BASE_URL`/`FORGE_API_KEY` endpoint\n * (see index.ts) — a file entry may not reuse its id. */\nconst RESERVED_ENDPOINT_IDS = new Set(['forge']);\n\nexport interface ParsedEndpointsResult {\n endpoints: EndpointConfig[];\n errors: string[];\n}\n\n/**\n * Validate one `endpoints[]` entry, appending `<where>.<field>`-scoped\n * messages to `errors`. Returns the rebuilt, typed config on success, else\n * null — mirrors packs.ts's validateModelRoute shape.\n */\nfunction validateEndpointConfig(raw: unknown, where: string, errors: string[]): EndpointConfig | null {\n if (!isRecord(raw)) {\n errors.push(`${where}: expected an object, got ${raw === null ? 'null' : typeof raw}`);\n return null;\n }\n const { id, kind, baseUrl, connector, apiKeyEnv, defaultRequestFields, timeoutMs } = raw;\n let ok = true;\n\n if (typeof id !== 'string' || id.length === 0) {\n errors.push(`${where}.id: required non-empty string`);\n ok = false;\n }\n if (kind !== 'openai') {\n errors.push(`${where}.kind: must be \"openai\" (got ${JSON.stringify(kind)})`);\n ok = false;\n }\n\n let validUrl = false;\n if (typeof baseUrl !== 'string' || baseUrl.length === 0) {\n errors.push(`${where}.baseUrl: required non-empty string`);\n ok = false;\n } else {\n try {\n const parsed = new URL(baseUrl);\n if (parsed.protocol === 'http:' || parsed.protocol === 'https:') {\n validUrl = true;\n } else {\n errors.push(`${where}.baseUrl: must use http:// or https:// (got \"${baseUrl}\")`);\n ok = false;\n }\n } catch {\n errors.push(`${where}.baseUrl: \"${baseUrl}\" is not a valid URL`);\n ok = false;\n }\n }\n\n if (connector !== undefined && !isConnectorId(connector)) {\n errors.push(`${where}.connector: must be one of ${CONNECTOR_IDS.join(', ')} when present (got ${JSON.stringify(connector)})`);\n ok = false;\n }\n\n if (apiKeyEnv !== undefined && (typeof apiKeyEnv !== 'string' || apiKeyEnv.length === 0)) {\n errors.push(`${where}.apiKeyEnv: must be a non-empty string when present`);\n ok = false;\n }\n\n let builtFields: EndpointDefaultRequestFields | undefined;\n if (defaultRequestFields !== undefined) {\n if (!isRecord(defaultRequestFields)) {\n errors.push(`${where}.defaultRequestFields: must be an object when present`);\n ok = false;\n } else {\n const forbiddenKeys = Object.keys(defaultRequestFields).filter((k) => FORBIDDEN_DEFAULT_REQUEST_FIELD_KEYS.has(k));\n if (forbiddenKeys.length > 0) {\n errors.push(`${where}.defaultRequestFields: cannot set routing/auth field(s): ${forbiddenKeys.join(', ')}`);\n ok = false;\n } else if (defaultRequestFields.chat_template_kwargs !== undefined && !isRecord(defaultRequestFields.chat_template_kwargs)) {\n errors.push(`${where}.defaultRequestFields.chat_template_kwargs: must be an object when present`);\n ok = false;\n } else {\n // Parsed from JSON (readEndpointsFromDisk) or an equivalent literal in\n // tests — every value is already JSON-shaped, so this is a type\n // narrowing, not an unchecked assertion.\n builtFields = defaultRequestFields as EndpointDefaultRequestFields;\n }\n }\n }\n\n let builtTimeout: EndpointTimeoutConfig | undefined;\n if (timeoutMs !== undefined) {\n if (!isRecord(timeoutMs)) {\n errors.push(`${where}.timeoutMs: must be an object when present`);\n ok = false;\n } else if (\n timeoutMs.firstTokenMs !== undefined &&\n !(typeof timeoutMs.firstTokenMs === 'number' && Number.isFinite(timeoutMs.firstTokenMs) && timeoutMs.firstTokenMs > 0)\n ) {\n errors.push(`${where}.timeoutMs.firstTokenMs: must be a positive finite number when present`);\n ok = false;\n } else if (typeof timeoutMs.firstTokenMs === 'number') {\n builtTimeout = { firstTokenMs: timeoutMs.firstTokenMs };\n }\n }\n\n if (!ok || typeof id !== 'string' || typeof baseUrl !== 'string' || !validUrl) return null;\n\n const built: EndpointConfig = { id, kind: 'openai', baseUrl };\n if (isConnectorId(connector)) built.connector = connector;\n if (typeof apiKeyEnv === 'string') built.apiKeyEnv = apiKeyEnv;\n if (builtFields) built.defaultRequestFields = builtFields;\n if (builtTimeout) built.timeoutMs = builtTimeout;\n return built;\n}\n\n/**\n * Validate the `{ endpoints: [...] }` envelope. Checks each entry's shape,\n * plus duplicate ids — including against the implicit `forge` id, which a\n * file entry may never reuse.\n */\nexport function parseEndpointsConfig(parsed: unknown): ParsedEndpointsResult {\n if (!isRecord(parsed) || !Array.isArray(parsed.endpoints)) {\n return { endpoints: [], errors: ['root: expected an object with an \"endpoints\" array'] };\n }\n const errors: string[] = [];\n const endpoints: EndpointConfig[] = [];\n const seenIds = new Set<string>(RESERVED_ENDPOINT_IDS);\n for (const [i, raw] of parsed.endpoints.entries()) {\n const built = validateEndpointConfig(raw, `endpoints[${i}]`, errors);\n if (!built) continue;\n if (seenIds.has(built.id)) {\n errors.push(\n `endpoints[${i}].id: duplicate endpoint id \"${built.id}\"` +\n (RESERVED_ENDPOINT_IDS.has(built.id) ? ' (reserved — \"forge\" is always the implicit FORGE_BASE_URL endpoint)' : ''),\n );\n continue;\n }\n seenIds.add(built.id);\n endpoints.push(built);\n }\n if (errors.length > 0) return { endpoints: [], errors };\n return { endpoints, errors: [] };\n}\n\n/** `~/.agentproto/llm-endpoints.json`, overridable via `LLM_ENDPOINT_ENDPOINTS_FILE`. */\nexport function resolveEndpointsFilePath(): string {\n const override = process.env.LLM_ENDPOINT_ENDPOINTS_FILE?.trim();\n if (override) return override;\n return resolvePath(homedir(), '.agentproto', 'llm-endpoints.json');\n}\n\nexport interface EndpointsFileLoad extends ParsedEndpointsResult {\n path: string;\n}\n\n/**\n * Read + validate the endpoints file from disk. A missing file is NOT an\n * error (fail-soft, like packs.local.json) — it means \"no named endpoints\n * configured\", which is the normal case. Malformed JSON or a shape error IS\n * an error, and yields an empty endpoint list (fail closed on that file\n * rather than partially trusting it).\n */\nexport function readEndpointsFromDisk(path: string = resolveEndpointsFilePath()): EndpointsFileLoad {\n let raw: string;\n try {\n raw = readFileSync(path, 'utf-8');\n } catch {\n return { endpoints: [], errors: [], path };\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n return { endpoints: [], errors: [`${path}: invalid JSON — ${err instanceof Error ? err.message : String(err)}`], path };\n }\n const result = parseEndpointsConfig(parsed);\n return { ...result, path };\n}\n\nlet _endpointsCache: EndpointConfig[] | null = null;\n\n/** Cached, validated endpoint list — re-read from disk on first call after\n * boot or after {@link resetConfiguredEndpointsCache}. A file-load error is\n * logged once and treated as \"no endpoints configured\" (fail-soft), mirroring\n * index.ts's getLocalPacks(). */\nexport function getConfiguredEndpoints(): EndpointConfig[] {\n if (_endpointsCache !== null) return _endpointsCache;\n const { endpoints, errors, path } = readEndpointsFromDisk();\n for (const e of errors) {\n console.warn(`[llm-endpoint] Skipping invalid endpoints file ${path} — ${e}`);\n }\n _endpointsCache = endpoints;\n return _endpointsCache;\n}\n\n/** Drop the cached endpoint list so the next call re-reads the file. */\nexport function resetConfiguredEndpointsCache(): void {\n _endpointsCache = null;\n}\n\n/** A resolved OpenAI-compatible upstream — host/port/protocol/path-prefix\n * parsed from a base URL. Shared shape for forge, nebius, and every\n * file-configured endpoint (see index.ts's ConfigurableProviderSpec). */\nexport interface ConfigurableUpstream {\n hostname: string;\n port: number;\n protocol: 'http' | 'https';\n /** URL pathname with any trailing slash stripped, e.g. \"/v1\" or \"\" for root. */\n pathPrefix: string;\n}\n\n/**\n * Parse an already-validated base URL into a routable upstream. Pure (no\n * warning side effect) — callers that need one-time-warn-on-invalid behavior\n * (forge/nebius, whose base URL comes from an env var that can go bad at any\n * time) wrap this themselves; a file-configured endpoint's baseUrl is\n * guaranteed valid by {@link parseEndpointsConfig} at load time, so this\n * never returns null for one.\n */\nexport function parseUpstreamUrl(value: string): ConfigurableUpstream | null {\n let parsed: URL;\n try {\n parsed = new URL(value);\n } catch {\n return null;\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return null;\n const protocol: 'http' | 'https' = parsed.protocol === 'http:' ? 'http' : 'https';\n const port = parsed.port ? Number(parsed.port) : (protocol === 'https' ? 443 : 80);\n const pathPrefix = parsed.pathname.replace(/\\/+$/, '');\n return { hostname: parsed.hostname, port, protocol, pathPrefix };\n}\n","import { createServer, IncomingMessage, ServerResponse, request as httpRequest } from 'http';\nimport { request as httpsRequest, RequestOptions } from 'https';\nimport { readFileSync } from 'fs';\nimport { resolve as resolvePath } from 'path';\nimport { fileURLToPath } from 'url';\nimport {\n ModelPack,\n ModelRoute,\n PACK_REGISTRY,\n resolvePack,\n buildMappingFromPack,\n listPackIds,\n matchesPattern,\n DEFAULT_PACK_ID,\n parseTransparentModel,\n KNOWN_TRANSPARENT_PROVIDERS,\n toAnthropicStyle,\n validateLocalPacks,\n isRecord,\n} from './packs.js';\nimport {\n validateResponsesRequest,\n responsesToChatCompletionsRequest,\n chatCompletionsJsonToResponses,\n OpenAIChatToResponsesStreamConverter,\n} from './responses.js';\nimport { getAuthProfile, KeychainStore } from '@agentproto/auth';\nimport { handleBatchesRequest, isInternalLoopbackRequest, resumeIncompleteLocalQueueBatches } from './batches.js';\nimport {\n getConfiguredEndpoints,\n parseUpstreamUrl,\n type ConfigurableUpstream,\n type EndpointConfig,\n type EndpointDefaultRequestFields,\n} from './endpoints.js';\n\n// Port local du proxy — surchargeable via env (LLM_ENDPOINT_PORT | PORT).\n// NOTE: evaluated once at module-load time. Set the env variable *before*\n// importing this module if you need a non-default port without passing it\n// explicitly to start(port).\nconst PORT = Number(process.env.LLM_ENDPOINT_PORT ?? process.env.PORT ?? 18090);\n\n// Helper: merged pack IDs (official + local). Cached after first call — the\n// list is effectively static once getLocalPacks() has populated its cache.\nlet _mergedPackIdsCache: string[] | null = null;\nfunction getMergedPackIds(): string[] {\n if (_mergedPackIdsCache !== null) return _mergedPackIdsCache;\n _mergedPackIdsCache = [...new Set([...listPackIds(), ...Object.keys(getLocalPacks())])];\n return _mergedPackIdsCache;\n}\n\nfunction resolvePackMerged(packId: string | null | undefined): ModelPack {\n if (!packId) packId = DEFAULT_PACK_ID;\n const local = getLocalPacks()[packId];\n if (local) return local;\n // resolvePack throws RangeError on unknown IDs; callers validate first via getMergedPackIds().\n return resolvePack(packId);\n}\n\nlet _localPacksCache: Record<string, ModelPack> | null = null;\n\n/** Outcome of reading packs.local.json from disk: the validated local packs,\n * any field-scoped validation errors, and which candidate file was used. */\ninterface LocalPacksLoad {\n packs: Record<string, ModelPack>;\n errors: string[];\n path: string | null;\n}\n\n// Read + validate local pack overrides from gitignored JSON (ESM-safe; uses\n// fileURLToPath). Searches: CWD/packs.local.json, then src/packs.local.json\n// (dev), then the directory of this module file. Returns the FIRST candidate\n// carrying a `{ packs: {...} }` envelope, validated against the ModelPack shape;\n// `errors` names each offending pack/field. Does NOT touch the cache — callers\n// decide fail-soft (load time) vs hard-fail (the reload endpoint).\nfunction readLocalPacksFromDisk(): LocalPacksLoad {\n const moduleDir = fileURLToPath(new URL('.', import.meta.url));\n const candidates = [\n resolvePath(process.cwd(), 'packs.local.json'),\n resolvePath(process.cwd(), 'src', 'packs.local.json'),\n resolvePath(moduleDir, 'packs.local.json'),\n ];\n for (const localPath of candidates) {\n let raw: string;\n try {\n raw = readFileSync(localPath, 'utf-8');\n } catch {\n // file doesn't exist — try next candidate\n continue;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n return { packs: {}, errors: [`${localPath}: invalid JSON — ${err instanceof Error ? err.message : String(err)}`], path: localPath };\n }\n // A file without a truthy `packs` envelope isn't a local-packs source —\n // ignore it and try the next candidate (unchanged from prior behaviour).\n if (!isRecord(parsed) || !('packs' in parsed) || !parsed.packs) {\n continue;\n }\n const result = validateLocalPacks(parsed);\n if (!result.ok) {\n return { packs: {}, errors: result.errors.map((e) => `${localPath}: ${e}`), path: localPath };\n }\n // validateLocalPacks (packs.ts) only checks shape — it doesn't know the\n // set of routable providers (that's runtime config: forge/nebius/the\n // endpoints file), so cross-checking each route's provider happens here,\n // at load, instead. A local pack may target a named endpoint id as its\n // provider (e.g. \"bonsai\") — anything else is a clear load-time error\n // rather than a confusing 400 the first time a client hits that code.\n const providerErrors = validateLocalPackProviders(result.packs);\n if (providerErrors.length > 0) {\n return { packs: {}, errors: providerErrors.map((e) => `${localPath}: ${e}`), path: localPath };\n }\n return { packs: result.packs, errors: [], path: localPath };\n }\n return { packs: {}, errors: [], path: null };\n}\n\n/**\n * Every route's `provider` must resolve somewhere: a canonical upstream\n * (anthropic, groq, …), forge, nebius, or a named endpoint from the\n * endpoints file. Returns one `<packId>.models.<code>.provider`-scoped\n * message per unresolvable provider — see the caller in readLocalPacksFromDisk.\n */\nfunction validateLocalPackProviders(packs: Record<string, ModelPack>): string[] {\n const errors: string[] = [];\n for (const [packId, pack] of Object.entries(packs)) {\n for (const [code, route] of Object.entries(pack.models)) {\n if (!isKnownProvider(route.provider)) {\n errors.push(\n `packs.${packId}.models.${code}.provider: unknown provider \"${route.provider}\" ` +\n `(known: ${[...KNOWN_PROVIDERS, ...getConfiguredEndpoints().map((e) => e.id)].join(', ')})`,\n );\n }\n }\n }\n return errors;\n}\n\n// Load (and cache) local pack overrides. Fail-soft at load time: an invalid\n// packs.local.json is skipped so the proxy keeps serving the built-in registry,\n// but every offending pack/field is named in the warning — the reload endpoint\n// turns the same errors into a hard 400.\nfunction getLocalPacks(): Record<string, ModelPack> {\n if (_localPacksCache !== null) return _localPacksCache;\n const { packs, errors } = readLocalPacksFromDisk();\n for (const e of errors) {\n console.warn(`[llm-endpoint] Skipping invalid packs.local.json — ${e}`);\n }\n _localPacksCache = packs;\n return _localPacksCache;\n}\n\n/**\n * Drop the cached local packs (and the derived merged-id cache) so the next\n * getLocalPacks()/getMergedPackIds() re-reads packs.local.json from disk. The\n * clear lives here rather than in the reload handler so the handler never\n * reaches into the module cache vars directly.\n */\nfunction resetLocalPacksCache(): void {\n _localPacksCache = null;\n _mergedPackIdsCache = null;\n}\n\n// Limite max d'outils par provider (au-delà, Groq renvoie 400 \"maximum number of items is 128\").\n// Les providers non listés sont illimités. Le CLI `claude` charge sa config MCP globale\n// (~/.claude + .mcp.json + skills) → dépasse souvent 128 outils → on tronque côté proxy.\nconst PROVIDER_MAX_TOOLS: Record<string, number> = {\n groq: 128,\n xai: 200\n};\n\n// Providers routables — sert d'allow-list pour l'override `?p=` et les préfixes\n// transparents `provider/model`. Un `?p=<inconnu>` laisserait sinon hostname\n// vide et échouerait plus loin avec une erreur opaque.\nconst KNOWN_PROVIDERS = new Set([...KNOWN_TRANSPARENT_PROVIDERS]);\n\n// Options bag for trimTools — avoids tracking 7 ordered positional arguments.\nexport interface ToolTrimOptions {\n provider: string;\n queryTools: string | null;\n queryNoTools: string | null;\n headerTools: string | null;\n headerNoTools: string | null;\n headerExcludeTools: string | null;\n /** Pack-level exclude patterns (pack.toolsExclude) — applied last. */\n packToolsExclude?: string[];\n /** Pack-level allow patterns (pack.toolsAllow) — applied last. */\n packToolsAllow?: string[];\n}\n\n// Trimme/strip les outils du payload selon :\n// - queryTools (\"a,b,c\") : allow-list explicite (garde uniquement ces outils, par nom).\n// - queryNoTools (\"1\") : strip TOUS les outils (+ tool_choice) → mode \"lean\".\n// - headers X-Proxy-Tools (allow-list) et X-Proxy-No-Tools (strip total)\n// - sinon : tronque au cap du provider si dépassé.\n// `toolName` extrait le nom d'un outil quelle que soit sa forme (Anthropic: .name ;\n// OpenAI function: .function.name). Doit tourner AVANT la transformation de forme\n// propre à chaque provider (ZAI/Groq mappent input_schema → function.parameters).\nexport function trimTools(payload: any, opts: ToolTrimOptions): void {\n const { provider, queryTools, queryNoTools, headerTools, headerNoTools, headerExcludeTools, packToolsExclude, packToolsAllow } = opts;\n if (!payload || !Array.isArray(payload.tools) || payload.tools.length === 0) return;\n\n // 1. Strip total demandé explicite (?notools=1 ou ?tools=none ou header X-Proxy-No-Tools: 1)\n if (queryNoTools === '1' || queryTools === 'none' || headerNoTools === '1') {\n console.log(`[Proxy][tools] strip total (${payload.tools.length} outils supprimés)`);\n delete payload.tools;\n delete payload.tool_choice;\n return;\n }\n\n // 2. Allow-list explicite (?tools=Bash,Read,Write ou header X-Proxy-Tools: Bash,Read,Write)\n // Supporte les wildcards : \"agentproto_*\" garde tous les outils dont le nom commence par \"agentproto_\".\n const allowList = headerTools || queryTools;\n if (allowList) {\n const patterns = allowList.split(',').map(s => s.trim()).filter(Boolean);\n const before = payload.tools.length;\n payload.tools = payload.tools.filter((t: any) => {\n const name = (t && (t.name || (t.function && t.function.name))) || '';\n return patterns.some(p => matchesPattern(name, p));\n });\n console.log(`[Proxy][tools] allow-list {${patterns.join(',')}} → ${before}→${payload.tools.length}`);\n if (payload.tools.length === 0) { delete payload.tools; delete payload.tool_choice; }\n return;\n }\n\n // 2b. Exclude-list via header X-Proxy-Exclude-Tools (strip certains outils, garde le reste)\n if (headerExcludeTools) {\n const patterns = headerExcludeTools.split(',').map((s: string) => s.trim()).filter(Boolean);\n const before = payload.tools.length;\n payload.tools = payload.tools.filter((t: any) => {\n const name = (t && (t.name || (t.function && t.function.name))) || '';\n return !patterns.some((p: string) => matchesPattern(name, p));\n });\n console.log(`[Proxy][tools] exclude-list {${patterns.join(',')}} → ${before}→${payload.tools.length}`);\n if (payload.tools.length === 0) { delete payload.tools; delete payload.tool_choice; }\n return;\n }\n\n // 2c. Filtres déclarés au niveau du pack (toolsExclude / toolsAllow dans le\n // pack, typically packs.local.json) — s'appliquent à TOUTE requête routée via\n // ce pack, après les overrides explicites du client (headers/query ci-dessus).\n // Cas d'usage : un client type Claude Desktop envoie des centaines de\n // définitions d'outils que le prefill upstream paie à chaque tour ; le pack\n // rogne sans que le client ait à changer.\n if (packToolsExclude && packToolsExclude.length > 0) {\n const before = payload.tools.length;\n payload.tools = payload.tools.filter((t: any) => {\n const name = (t && (t.name || (t.function && t.function.name))) || '';\n return !packToolsExclude!.some((p) => matchesPattern(name, p));\n });\n console.log(`[Proxy][tools] pack exclude-list {${packToolsExclude.join(',')}} → ${before}→${payload.tools.length}`);\n } else if (packToolsAllow && packToolsAllow.length > 0) {\n const before = payload.tools.length;\n payload.tools = payload.tools.filter((t: any) => {\n const name = (t && (t.name || (t.function && t.function.name))) || '';\n return packToolsAllow.some((p) => matchesPattern(name, p));\n });\n console.log(`[Proxy][tools] pack allow-list {${packToolsAllow.join(',')}} → ${before}→${payload.tools.length}`);\n }\n if (payload.tools.length === 0) { delete payload.tools; delete payload.tool_choice; }\n\n // 3. Troncation au cap du provider (?tools absent)\n const cap = PROVIDER_MAX_TOOLS[provider];\n if (cap && payload.tools.length > cap) {\n const before = payload.tools.length;\n payload.tools = payload.tools.slice(0, cap);\n console.log(`[Proxy][tools] troncation cap ${cap} pour ${provider} → ${before}→${payload.tools.length}`);\n }\n}\n\n// Clés API par provider — forme fixe (accès `.openrouter` etc. typé `string`,\n// pas soumis à noUncheckedIndexedAccess comme le serait un Record indexé).\ninterface ProviderKeys {\n anthropic: string;\n moonshot: string;\n openrouter: string;\n requesty: string;\n zai: string;\n groq: string;\n xai: string;\n openai: string;\n}\n\n// Résolution des clés API d'hôtes depuis les variables d'environnement.\n// Place un fichier .env à la racine du workspace ou exporte les variables\n// d'environnement avant de démarrer le serveur.\nfunction resolveSecretKeys(): ProviderKeys {\n return {\n anthropic: process.env.ANTHROPIC_API_KEY || '',\n moonshot: process.env.MOONSHOT_API_KEY || '',\n openrouter: process.env.OPENROUTER_API_KEY || '',\n requesty: process.env.REQUESTY_API_KEY || '',\n zai: process.env.ZHIPUAI_API_KEY || process.env.ZAI_API_KEY || '',\n groq: process.env.GROQ_API_KEY || '',\n xai: process.env.XAI_API_KEY || '',\n openai: process.env.OPENAI_API_KEY || '',\n };\n}\n\nfunction getResolvedKeys(): ProviderKeys {\n return resolveSecretKeys();\n}\n\n/** Re-exported for back-compat — see {@link ConfigurableUpstream} in endpoints.ts. */\nexport type { ConfigurableUpstream };\n\n/** Back-compat name — see {@link ConfigurableUpstream}. */\nexport type ForgeUpstream = ConfigurableUpstream;\n\n/**\n * A \"configurable\" provider is any OpenAI-compatible upstream wired up purely\n * from two env vars: `<PROVIDER>_BASE_URL` (scheme/host/port/path prefix) and\n * `<PROVIDER>_API_KEY` (sent as `Authorization: Bearer`, the same header shape\n * every non-anthropic/moonshot provider already gets by default). `forge`\n * (self-hosted, no default host — only exists once its base URL is set, key\n * optional) and `nebius` (hosted, has a default host, key required like every\n * fixed-hostname provider) are both instances of this — see the README's\n * \"Adding an OpenAI-compatible upstream provider\" section.\n */\ninterface ConfigurableProviderSpec {\n baseUrlEnv: string;\n apiKeyEnv: string;\n /**\n * Present ⇒ the base-URL env var is an override, not a switch — the\n * provider works out of the box against this default host (nebius).\n * Absent ⇒ the provider only exists once its base-URL env var is set\n * (forge — no sensible default for a self-hosted server).\n */\n defaultBaseUrl?: string;\n /**\n * false (forge) ⇒ a request proceeds with no `Authorization` header when\n * the key is unset, instead of the usual 401. true (nebius, and implicitly\n * every fixed-hostname provider) ⇒ a missing key 401s exactly like today.\n */\n keyRequired: boolean;\n}\n\nconst CONFIGURABLE_PROVIDERS: Record<string, ConfigurableProviderSpec> = {\n forge: { baseUrlEnv: 'FORGE_BASE_URL', apiKeyEnv: 'FORGE_API_KEY', keyRequired: false },\n nebius: {\n baseUrlEnv: 'NEBIUS_BASE_URL',\n apiKeyEnv: 'NEBIUS_API_KEY',\n defaultBaseUrl: 'https://api.studio.nebius.com/v1',\n keyRequired: true,\n },\n};\n\n/** false for every fixed-hostname provider and nebius; true for forge and every\n * file-configured named endpoint — a private/LAN server may be keyless. */\nfunction isUpstreamKeyOptional(provider: string): boolean {\n return getConfigurableProviderSpec(provider)?.keyRequired === false;\n}\n\n/**\n * Human-readable reason a configurable provider's `<model>` request can't be\n * routed: unset (forge — no default host) or malformed (either provider,\n * including a bad override on one that does have a default).\n */\nfunction configurableProviderUnavailableMessage(provider: string): string {\n const spec = CONFIGURABLE_PROVIDERS[provider];\n if (!spec) return `Provider \"${provider}\" is not configured.`;\n if (spec.defaultBaseUrl) {\n return `\"${provider}\" upstream is misconfigured — ${spec.baseUrlEnv} is set but invalid (must be a valid http:// or https:// URL).`;\n }\n return `${provider} provider not configured — set ${spec.baseUrlEnv} to enable \"${provider}/<model>\" routing.`;\n}\n\n/**\n * Parse one base-URL value into a routable upstream; shared by every\n * env-configured provider (forge, nebius). Wraps the pure\n * {@link parseUpstreamUrl} with a one-time warning on failure — a file-\n * configured endpoint doesn't need this wrapper since its baseUrl is already\n * validated at load time (see endpoints.ts's parseEndpointsConfig).\n */\nfunction parseConfigurableUpstreamUrl(value: string, provider: string): ConfigurableUpstream | null {\n let parsed: URL;\n try {\n parsed = new URL(value);\n } catch {\n warnUpstreamOnce(`${provider}:bad-url`, `[Proxy][${provider}] \"${value}\" is not a valid URL; ${provider} provider disabled.`);\n return null;\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n warnUpstreamOnce(`${provider}:bad-scheme`, `[Proxy][${provider}] \"${value}\" must use http:// or https://; ${provider} provider disabled.`);\n return null;\n }\n return parseUpstreamUrl(value);\n}\n\n/**\n * Parse `FORGE_BASE_URL` into a routable upstream. Unlike every other\n * provider here (fixed https hostname, implicit :443), forge points at a\n * private, self-hosted OpenAI-compatible server (vLLM `--enable-lora`) so the\n * scheme, host, port, and path prefix are all env-configured — e.g.\n * `http://10.0.10.20:8000/v1`. Returns null when unset or malformed, which\n * callers treat as \"forge provider not configured\" (a 400, never a crash).\n */\nexport function resolveForgeBaseUrl(raw: string | undefined = process.env.FORGE_BASE_URL): ConfigurableUpstream | null {\n const value = raw?.trim();\n if (!value) return null;\n return parseConfigurableUpstreamUrl(value, 'forge');\n}\n\n/**\n * Resolve the Nebius AI Studio upstream. Defaults to the public\n * `https://api.studio.nebius.com/v1` endpoint — nebius works with just\n * `NEBIUS_API_KEY` set. `NEBIUS_BASE_URL` overrides it, e.g. to point at a\n * Nebius *dedicated* endpoint on a different host, with no code change.\n * Returns null only when the override is set but malformed — an unset\n * `NEBIUS_BASE_URL` is the normal case and resolves to the default.\n */\nexport function resolveNebiusBaseUrl(raw: string | undefined = process.env.NEBIUS_BASE_URL): ConfigurableUpstream | null {\n const value = raw?.trim() || CONFIGURABLE_PROVIDERS.nebius!.defaultBaseUrl!;\n return parseConfigurableUpstreamUrl(value, 'nebius');\n}\n\n/**\n * A configurable provider's routing info, resolved uniformly regardless of\n * whether it's one of the two static env-configured providers (forge,\n * nebius) or a file-configured named endpoint. This is the \"ONE code path\"\n * every dispatch site (the /v1/messages switch, /v1/chat/completions,\n * /v1/responses, GET /v1/models merging, GET /v1/endpoints) goes through —\n * adding a new named endpoint to the JSON file never needs a new case\n * anywhere in this file.\n */\ninterface ResolvedConfigurableProvider {\n /** false ⇒ a request proceeds with no Authorization header when the key is\n * unset (forge, every file endpoint — a private/LAN server may be\n * keyless). true ⇒ a missing key 401s (nebius only). */\n keyRequired: boolean;\n /** Env var the key is read from. Undefined ⇒ this endpoint never sends a key. */\n apiKeyEnv?: string;\n defaultRequestFields?: EndpointDefaultRequestFields;\n resolveUpstream(): ConfigurableUpstream | null;\n unavailableMessage(): string;\n}\n\n/**\n * Look up `provider` as a configurable provider — forge/nebius (env-\n * configured, unchanged from before) or a named endpoint from the JSON file\n * (see endpoints.ts). Returns undefined for every fixed-hostname provider\n * (anthropic, groq, …), which callers fall through to their existing switch\n * for.\n */\n/**\n * A paired HOST's own inference endpoint, addressed transparently as\n * `<endpointId>@<device>` (DEVICES-PLAN item 2) — e.g. `ollama@work-mac`,\n * where `work-mac` is whatever `agentproto devices list` shows for that\n * host (fingerprint or friendly name) and `ollama` is an endpoint id on the\n * far side's OWN llm-endpoint gateway, not this one. `device` excludes `@`\n * and `/` so the split is unambiguous against a bare `<id>/<model>`\n * reference (no file-configured endpoint id may contain `@` either, since\n * `parseEndpointsConfig` never validates that — this pattern is what makes\n * it safe not to).\n */\nconst DEVICE_PROVIDER_RE = /^(.+)@([^@/]+)$/;\n\nfunction parseDeviceProvider(provider: string): { endpointId: string; device: string } | null {\n const m = DEVICE_PROVIDER_RE.exec(provider);\n return m ? { endpointId: m[1]!, device: m[2]! } : null;\n}\n\n/**\n * Resolve a `<endpointId>@<device>` provider to the LOCAL agentproto\n * daemon's own device-inference forward route (DEVICES-PLAN item 2) —\n * `packages/runtime/src/http-server.ts`'s `POST\n * /devices/:id/exec-stream/<subpath>`, which relays through the daemon's\n * `HostRegistry` to the OTHER daemon's `/device-inference/*` (gated there to\n * a host-scoped pairing only). `LLM_ENDPOINT_DAEMON_URL` /\n * `LLM_ENDPOINT_DAEMON_TOKEN` are injected by\n * `packages/runtime/src/llm-endpoint-registry.ts` when THIS sidecar was\n * spawned by an agentproto daemon — absent (e.g. llm-endpoint run\n * standalone) makes every `@device` reference \"not configured\", never a\n * crash. `keyRequired: true` so a missing/wrong token 401s instead of\n * silently forwarding with no `Authorization` — the daemon's\n * `/devices/:id/exec-stream` bearer gate has no loopback bypass, unlike most\n * of its other routes (see `HOST_SCOPE_HEADER`'s doc comment for why).\n */\nfunction resolveDeviceProviderSpec(device: string): ResolvedConfigurableProvider {\n const unavailableMessage = () =>\n `\"@${device}\" device-inference routing requires this llm-endpoint sidecar to be started by an ` +\n 'agentproto daemon (LLM_ENDPOINT_DAEMON_URL is unset) — run it via `agentproto serve` with ' +\n 'features.llmEndpoint on, not as a bare standalone process.';\n return {\n keyRequired: true,\n apiKeyEnv: 'LLM_ENDPOINT_DAEMON_TOKEN',\n resolveUpstream: () => {\n const daemonUrl = process.env.LLM_ENDPOINT_DAEMON_URL?.trim();\n if (!daemonUrl) return null;\n const base = parseUpstreamUrl(daemonUrl);\n if (!base) return null;\n return {\n ...base,\n pathPrefix: `${base.pathPrefix}/devices/${encodeURIComponent(device)}/exec-stream/device-inference/v1`,\n };\n },\n unavailableMessage,\n };\n}\n\nfunction getConfigurableProviderSpec(provider: string): ResolvedConfigurableProvider | undefined {\n const staticSpec = CONFIGURABLE_PROVIDERS[provider];\n if (staticSpec) {\n return {\n keyRequired: staticSpec.keyRequired,\n apiKeyEnv: staticSpec.apiKeyEnv,\n resolveUpstream: () => (provider === 'forge' ? resolveForgeBaseUrl() : resolveNebiusBaseUrl()),\n unavailableMessage: () => configurableProviderUnavailableMessage(provider),\n };\n }\n const fileEndpoint = getConfiguredEndpoints().find((e) => e.id === provider);\n if (fileEndpoint) {\n // Validated (a syntactically valid http(s) URL) at config-load time —\n // parseUpstreamUrl cannot fail here, but a defensive null-safe caller is\n // cheaper than a non-null assertion that a future load-path change could\n // silently invalidate.\n const upstream = parseUpstreamUrl(fileEndpoint.baseUrl);\n return {\n keyRequired: false,\n apiKeyEnv: fileEndpoint.apiKeyEnv,\n defaultRequestFields: fileEndpoint.defaultRequestFields,\n resolveUpstream: () => upstream,\n unavailableMessage: () => `\"${provider}\" endpoint is misconfigured (invalid baseUrl).`,\n };\n }\n const deviceRoute = parseDeviceProvider(provider);\n if (deviceRoute) return resolveDeviceProviderSpec(deviceRoute.device);\n return undefined;\n}\n\n/**\n * Merges an endpoint's `defaultRequestFields` UNDER the client's own request\n * — openai-kind dispatch only, mirrors openagentik/router's\n * `defaultRequestFields` (see endpoints.ts). Arbitrary top-level fields: the\n * client wins per top-level key; for an object-valued key (e.g. vLLM's\n * `chat_template_kwargs`) present on both sides, they merge one level deep\n * with the client's sub-keys winning.\n *\n * `skipKeys` lets a caller withhold specific default keys for reasons the\n * generic client-wins rule can't see on its own — e.g. the Anthropic\n * `/v1/messages` path, where a client's `thinking: {type:\"enabled\"}` is\n * consumed (and discarded) by `adaptAnthropicToOpenAI` before this runs, so\n * there is no `reasoning_effort` on `payload` for \"client wins\" to protect.\n */\nfunction applyDefaultRequestFields(\n payload: Record<string, unknown>,\n defaults: EndpointDefaultRequestFields | undefined,\n skipKeys?: ReadonlySet<string>,\n): void {\n if (!defaults) return;\n for (const [key, value] of Object.entries(defaults)) {\n if (skipKeys?.has(key)) continue;\n const existing = payload[key];\n if (existing === undefined) {\n payload[key] = value;\n } else if (isRecord(existing) && isRecord(value)) {\n payload[key] = { ...value, ...existing };\n }\n // else: client already sent a non-mergeable value for this key — client wins, leave as-is.\n }\n}\n\n/**\n * Dispatch an outbound upstream request over plain http or tls, chosen by\n * `protocol`. Every fixed-hostname provider is https, so this only matters\n * for a configurable provider like forge (private upstream, http OR https,\n * non-443 port).\n */\nfunction sendUpstreamRequest(\n protocol: 'http' | 'https',\n options: RequestOptions,\n callback: (res: IncomingMessage) => void,\n) {\n return protocol === 'http' ? httpRequest(options, callback) : httpsRequest(options, callback);\n}\n\n// OpenAI-compatible chat/completions endpoint for the OpenAI surface and the\n// Responses API facade. Returns null for providers that only speak the\n// Anthropic Messages shape (anthropic itself has no /chat/completions\n// endpoint) so callers can fail loud with a 400 instead of misrouting. `port`/\n// `protocol` default to 443/https when absent (every fixed-hostname provider).\nfunction getChatCompletionsEndpoint(provider: string): { hostname: string; path: string; port?: number; protocol?: 'http' | 'https' } | null {\n const configurableSpec = getConfigurableProviderSpec(provider);\n if (configurableSpec) {\n const upstream = configurableSpec.resolveUpstream();\n if (!upstream) return null;\n return { hostname: upstream.hostname, path: `${upstream.pathPrefix}/chat/completions`, port: upstream.port, protocol: upstream.protocol };\n }\n switch (provider) {\n case 'anthropic':\n return null;\n case 'openrouter':\n return { hostname: 'openrouter.ai', path: '/api/v1/chat/completions' };\n case 'requesty':\n return { hostname: 'router.requesty.ai', path: '/v1/chat/completions' };\n case 'zai':\n return { hostname: 'open.bigmodel.cn', path: '/api/paas/v4/chat/completions' };\n case 'groq':\n return { hostname: 'api.groq.com', path: '/openai/v1/chat/completions' };\n case 'xai':\n return { hostname: 'api.x.ai', path: '/v1/chat/completions' };\n case 'openai':\n return { hostname: 'api.openai.com', path: '/v1/chat/completions' };\n case 'moonshot':\n default:\n return { hostname: 'api.moonshot.ai', path: '/v1/chat/completions' };\n }\n}\n\n/** Outcome of an OpenAI-compatible `/models` probe: `ok` distinguishes \"asked\n * and it answered\" (even with zero models) from \"unreachable / malformed\n * response\" — used by GET /v1/endpoints' `reachable` field. */\ninterface ModelProbeResult {\n ok: boolean;\n ids: string[];\n}\n\n/**\n * GET `<pathPrefix>/models` against a resolved upstream and parse the\n * OpenAI-shaped `{data:[{id}]}` list. Best-effort: any failure (network\n * error, non-JSON body, timeout) resolves `{ok:false, ids:[]}` rather than\n * rejecting — the caller decides whether that's fatal.\n */\nfunction probeOpenAiModels(upstream: ConfigurableUpstream, cred: UpstreamCredential | undefined, timeoutMs: number): Promise<ModelProbeResult> {\n const headers: Record<string, string> = {};\n if (cred?.value) headers['Authorization'] = `Bearer ${cred.value}`;\n return new Promise((resolvePromise) => {\n const options: RequestOptions = {\n hostname: upstream.hostname,\n port: upstream.port,\n path: `${upstream.pathPrefix}/models`,\n method: 'GET',\n headers,\n };\n const req = sendUpstreamRequest(upstream.protocol, options, (res) => {\n let body = '';\n res.setEncoding('utf8');\n res.on('data', (chunk) => { body += chunk; });\n res.on('end', () => {\n try {\n const parsed: unknown = JSON.parse(body);\n const data = isRecord(parsed) && Array.isArray(parsed.data) ? parsed.data : [];\n const ids: string[] = data\n .map((m: unknown) => (isRecord(m) && typeof m.id === 'string' ? m.id : null))\n .filter((id: string | null): id is string => id !== null);\n resolvePromise({ ok: true, ids });\n } catch {\n resolvePromise({ ok: false, ids: [] });\n }\n });\n });\n req.on('error', () => resolvePromise({ ok: false, ids: [] }));\n req.setTimeout(timeoutMs, () => {\n req.destroy();\n resolvePromise({ ok: false, ids: [] });\n });\n req.end();\n });\n}\n\n/**\n * Live GET `${FORGE_BASE_URL}/models`, for merging into GET /v1/models.\n * Unlike every other provider here (a fixed, committed pack of model ids),\n * forge's LoRA adapters are registered on the vLLM server itself and unknown\n * ahead of time — so the id list can only come from asking it. Best-effort:\n * any failure (unset/invalid URL, network error, bad JSON, timeout) resolves\n * to an empty list rather than failing the whole /v1/models response.\n * nebius is not merged this way — its catalog is a well-known, static id\n * list a client already knows, unlike forge's dynamically-registered LoRAs.\n * Uncached — forge's base URL/key can change (env) between requests within\n * the same process, unlike a file-configured endpoint (see\n * fetchFileEndpointModelIds's 30s cache below).\n */\nasync function fetchForgeModelIds(): Promise<string[]> {\n const forge = resolveForgeBaseUrl();\n if (!forge) return [];\n const cred = await resolveUpstreamCredential('forge');\n return (await probeOpenAiModels(forge, cred, 4000)).ids;\n}\n\nconst ENDPOINT_MODEL_PROBE_TIMEOUT_MS = 4000;\nconst ENDPOINT_MODEL_CACHE_TTL_MS = 30_000;\nconst _endpointProbeCache = new Map<string, { expiresAt: number; result: ModelProbeResult }>();\n\n/**\n * Live GET `<baseUrl>/models` for one file-configured endpoint, for merging\n * into GET /v1/models as `<id>/<model>` (same idea as fetchForgeModelIds,\n * generalized to N endpoints). Cached for 30s per endpoint id — unlike forge,\n * a client may probe several named endpoints in quick succession (each model\n * listed under its own endpoint), so an uncached fan-out would multiply\n * upstream round-trips on every /v1/models call.\n */\nasync function probeFileEndpointModels(endpoint: EndpointConfig): Promise<ModelProbeResult> {\n const now = Date.now();\n const cached = _endpointProbeCache.get(endpoint.id);\n if (cached && cached.expiresAt > now) return cached.result;\n const upstream = parseUpstreamUrl(endpoint.baseUrl);\n if (!upstream) return { ok: false, ids: [] };\n const cred = await resolveUpstreamCredential(endpoint.id);\n const result = await probeOpenAiModels(upstream, cred, ENDPOINT_MODEL_PROBE_TIMEOUT_MS);\n _endpointProbeCache.set(endpoint.id, { expiresAt: now + ENDPOINT_MODEL_CACHE_TTL_MS, result });\n return result;\n}\n\nexport interface ModelRouteContext {\n activePack: ModelPack;\n queryModelCode: string | null;\n queryProvider: string | null;\n forcedAliasCode: string | null;\n /**\n * When true, the Messages path is allowed to match local-pack\n * `equivalentClaudeName` aliases. The OpenAI chat/completions and Responses\n * surfaces are always transparent and never resolve default alias packs.\n */\n allowAliases: boolean;\n /**\n * When true, the active pack has been run through {@link toAnthropicStyle}\n * for this request, so its `equivalentClaudeName` aliases are resolvable even\n * though it is an official (non-local) pack.\n */\n anthropicFormat?: boolean;\n}\n\n/** KNOWN_PROVIDERS plus every id from the endpoints file — the file's ids are\n * runtime-configured (unlike KNOWN_TRANSPARENT_PROVIDERS' static set), so\n * they're checked separately rather than folded into that Set at import time. */\nfunction isKnownProvider(provider: string): boolean {\n return (\n KNOWN_PROVIDERS.has(provider) ||\n getConfiguredEndpoints().some((e) => e.id === provider) ||\n DEVICE_PROVIDER_RE.test(provider)\n );\n}\n\nfunction applyProviderOverride(\n target: { provider: string; model: string; equivalentClaudeName?: string },\n providerOverride: string | null\n): { provider: string; model: string } {\n const route = { provider: target.provider, model: target.model };\n if (!providerOverride) return route;\n if (!isKnownProvider(providerOverride)) {\n const allowed = [...KNOWN_PROVIDERS, ...getConfiguredEndpoints().map((e) => e.id)];\n throw new Error(`Unknown provider \"${providerOverride}\" in ?p= (allowed: ${allowed.join(', ')})`);\n }\n return { provider: providerOverride, model: route.model };\n}\n\n/**\n * Parse a transparent `provider/model` reference against BOTH the static\n * KNOWN_TRANSPARENT_PROVIDERS set (packs.ts) and the runtime-configured\n * endpoints file — so `bonsai/bonsai-27b` routes the same way `forge/my-lora`\n * always has. packs.ts stays dependency-free (no fs); this extension lives\n * here, where the endpoints file is already read.\n */\nfunction parseAnyTransparentModel(model: string): { provider: string; model: string } | null {\n const known = parseTransparentModel(model);\n if (known) return known;\n const slashIdx = model.indexOf('/');\n if (slashIdx <= 0 || slashIdx === model.length - 1) return null;\n const provider = model.slice(0, slashIdx);\n if (!getConfiguredEndpoints().some((e) => e.id === provider) && !DEVICE_PROVIDER_RE.test(provider)) return null;\n return { provider, model: model.slice(slashIdx + 1) };\n}\n\n/**\n * Resolves the upstream provider/model for a request.\n *\n * Messages path (`allowAliases: true`):\n * - X-Proxy-Model-Alias header / PROXY_MODEL_ALIAS env forces a pack code.\n * - Explicit ?m=<code> selects a pack code.\n * - Local packs may define `equivalentClaudeName` aliases.\n * - Public pack codes match transparent model IDs.\n * - `provider/model` references are parsed transparently.\n * - `?p=<provider>` with a bare model id routes to that provider.\n *\n * Chat/Responses paths (`allowAliases: false`):\n * - Only `provider/model` references or `?p=<provider>` with a bare model id.\n * - Pack aliases and regex fallbacks are intentionally not used.\n *\n * Throws a plain Error for unknown explicit codes/providers.\n */\nexport function resolveModelRoute(\n payload: { model?: string },\n ctx: ModelRouteContext,\n localPacks: Record<string, ModelPack> = getLocalPacks()\n): { provider: string; model: string } {\n const mapping = buildMappingFromPack(ctx.activePack);\n const isLocalPack = Boolean(localPacks[ctx.activePack.id]);\n // Alias-bearing when the pack is local OR has been transformed to Anthropic\n // style for this request. Either way its equivalentClaudeName ids resolve.\n const isAliasPack = isLocalPack || Boolean(ctx.anthropicFormat);\n\n if (ctx.forcedAliasCode) {\n const forcedCode = ctx.forcedAliasCode.toLowerCase();\n const target = Object.entries(mapping).find(([code]) => code.toLowerCase() === forcedCode)?.[1];\n if (!target) {\n throw new Error(`Unknown model alias \"${ctx.forcedAliasCode}\" in active pack \"${ctx.activePack.id}\"`);\n }\n console.log(`[Proxy] Forced model alias \"${ctx.forcedAliasCode}\" -> ${target.provider}:${target.model}`);\n return applyProviderOverride(target, ctx.queryProvider);\n }\n\n if (ctx.queryModelCode) {\n const queryCode = ctx.queryModelCode.toLowerCase();\n const target = Object.entries(mapping).find(([code]) => code.toLowerCase() === queryCode)?.[1];\n if (!target) {\n throw new Error(`Unknown model code \"${ctx.queryModelCode}\" in active pack \"${ctx.activePack.id}\"`);\n }\n console.log(`[Proxy] Detected URL model parameter code \"${ctx.queryModelCode}\" -> ${target.provider}:${target.model}`);\n return applyProviderOverride(target, ctx.queryProvider);\n }\n\n const incomingModel = (payload.model || '').trim();\n if (!incomingModel) {\n throw new Error('Missing \"model\" field in request body');\n }\n const incomingLower = incomingModel.toLowerCase();\n\n if (ctx.allowAliases && isAliasPack) {\n const aliasEntry = Object.entries(mapping).find(\n ([code, target]) =>\n target.equivalentClaudeName?.toLowerCase() === incomingLower ||\n code.toLowerCase() === incomingLower\n );\n if (aliasEntry) {\n const target = aliasEntry[1];\n console.log(`[Proxy] Matched alias \"${incomingModel}\" -> ${target.provider}:${target.model}`);\n return applyProviderOverride(target, ctx.queryProvider);\n }\n }\n\n if (ctx.allowAliases) {\n const codeEntry = Object.entries(mapping).find(([code]) => code.toLowerCase() === incomingLower);\n if (codeEntry) {\n const target = codeEntry[1];\n console.log(`[Proxy] Matched pack code \"${incomingModel}\" -> ${target.provider}:${target.model}`);\n return applyProviderOverride(target, ctx.queryProvider);\n }\n }\n\n const transparent = parseAnyTransparentModel(incomingModel);\n if (transparent) {\n console.log(`[Proxy] Transparent model reference \"${incomingModel}\" -> ${transparent.provider}:${transparent.model}`);\n return applyProviderOverride(transparent, ctx.queryProvider);\n }\n\n if (ctx.queryProvider) {\n return applyProviderOverride({ provider: ctx.queryProvider, model: incomingModel }, ctx.queryProvider);\n }\n\n throw new Error(\n `Unable to resolve model \"${incomingModel}\". Use a transparent \"provider/model\" reference (e.g. \"moonshot/kimi-k2.7-code\"), select a pack, or provide ?p=<provider>.`\n );\n}\n\nfunction readQueryAndToolOptions(parsedUrl: URL, req: IncomingMessage) {\n const queryProvider = parsedUrl.searchParams.get('p');\n const queryModelCode = parsedUrl.searchParams.get('m');\n const queryTools = parsedUrl.searchParams.get('tools');\n const queryNoTools = parsedUrl.searchParams.get('notools');\n\n const rawHeaderTools = req.headers['x-proxy-tools'];\n const headerTools: string | null = (Array.isArray(rawHeaderTools) ? rawHeaderTools[0] : rawHeaderTools) || null;\n const rawHeaderNoTools = req.headers['x-proxy-no-tools'];\n const headerNoTools: string | null = (Array.isArray(rawHeaderNoTools) ? rawHeaderNoTools[0] : rawHeaderNoTools) || null;\n const rawHeaderExcludeTools = req.headers['x-proxy-exclude-tools'];\n const headerExcludeTools: string | null = (Array.isArray(rawHeaderExcludeTools) ? rawHeaderExcludeTools[0] : rawHeaderExcludeTools) || null;\n\n const rawHeaderAlias = req.headers['x-proxy-model-alias'];\n const headerAlias = (Array.isArray(rawHeaderAlias) ? rawHeaderAlias[0] : rawHeaderAlias)?.toLowerCase().trim();\n const envAlias = process.env.PROXY_MODEL_ALIAS?.toLowerCase().trim();\n const forcedAliasCode = headerAlias || envAlias || null;\n\n // Anthropic-style format toggle — relabels the active pack's routes with\n // opaque `claude-<family>-<sha>` ids (see toAnthropicStyle). Header\n // `X-Proxy-Format: anthropic` or `?format=anthropic`.\n const rawHeaderFormat = req.headers['x-proxy-format'];\n const headerFormat = (Array.isArray(rawHeaderFormat) ? rawHeaderFormat[0] : rawHeaderFormat)?.toLowerCase().trim();\n const queryFormat = parsedUrl.searchParams.get('format')?.toLowerCase().trim();\n const anthropicFormat = headerFormat === 'anthropic' || queryFormat === 'anthropic';\n\n return {\n queryProvider,\n queryModelCode,\n queryTools,\n queryNoTools,\n headerTools,\n headerNoTools,\n headerExcludeTools,\n forcedAliasCode,\n anthropicFormat,\n };\n}\n\nfunction getApiKey(provider: string): string {\n // Configurable providers (forge, nebius, and every named endpoint from the\n // JSON file) sit outside the fixed 8-provider ProviderKeys/CANONICAL_UPSTREAMS\n // shape (env-configured URL, an optional key) — resolved separately via\n // their own apiKeyEnv rather than widening that shape for providers that\n // don't fit its \"always-on, fixed hostname\" assumptions.\n const configurable = getConfigurableProviderSpec(provider);\n if (configurable) return configurable.apiKeyEnv ? (process.env[configurable.apiKeyEnv] || '') : '';\n return getResolvedKeys()[provider as keyof ProviderKeys] || '';\n}\n\n// ── Named-auth-profile credential resolution ──────────────────────────────\n// An upstream can be authenticated from a NAMED auth-profile\n// (`@agentproto/auth`) instead of only per-provider env vars. Map a provider\n// to a profile id via `LLM_ENDPOINT_PROFILE_<PROVIDER_UPPER>`\n// (e.g. LLM_ENDPOINT_PROFILE_ANTHROPIC=claude-subs-agentik). Absent → the\n// existing env-key path is used, byte-identical to before.\n\n// Anthropic OAuth wire constants — re-declared locally as string literals\n// (mirrors remaining-quota.ts:179-181) so this package never imports\n// @agentproto/runtime.\nconst ANTHROPIC_VERSION = '2023-06-01';\nconst ANTHROPIC_OAUTH_BETA = 'oauth-2025-04-20';\n\ntype UpstreamAuthMethod = 'api-key' | 'oauth-bearer';\n\n/** A resolved upstream credential: the secret plus the header shape to use. */\nexport interface UpstreamCredential {\n value: string;\n method: UpstreamAuthMethod;\n}\n\nfunction upstreamProfileEnvVar(provider: string): string {\n return `LLM_ENDPOINT_PROFILE_${provider.toUpperCase()}`;\n}\n\n// Anthropic OAuth Access Tokens (subscription OATs) are shape-identifiable —\n// `sk-ant-oat…` — and require `Authorization: Bearer`, never `x-api-key`.\n// Mirrors the same prefix check adapters/mastra-agent and the pi CLI's own\n// SDK use; re-declared locally (not imported) for the same reason as the\n// ANTHROPIC_VERSION/ANTHROPIC_OAUTH_BETA constants above — this package\n// never imports @agentproto/runtime.\nfunction isAnthropicOAuthToken(provider: string, value: string): boolean {\n return provider === 'anthropic' && value.startsWith('sk-ant-oat');\n}\n\n// Log-once dedupe so a persistent misconfig (e.g. non-darwin keychain) doesn't\n// spam a warning on every single request.\nconst _warnedUpstream = new Set<string>();\nfunction warnUpstreamOnce(key: string, message: string): void {\n if (_warnedUpstream.has(key)) return;\n _warnedUpstream.add(key);\n console.warn(message);\n}\n\n/**\n * Resolve the outbound credential for `provider`. Mirrors getApiKey()'s\n * provider-string contract but returns the credential AND the header method.\n *\n * - `LLM_ENDPOINT_PROFILE_<P>` set → resolve the named profile:\n * • missing / disabled → undefined (caller 401s, as today)\n * • source-backed (no credRef) → undefined + a clear follow-up log\n * (self-refresh not supported here yet)\n * • credentialRef-backed → { value, method: profile.method }\n * • keychain read returns null (credential absent / present-but-unreadable\n * on a supported host, e.g. a locked Keychain) → undefined (fail-closed;\n * caller 401s — we do NOT silently downgrade a mapped profile to the env\n * key)\n * • keychain read throws (platform-unsupported backend, e.g. non-darwin\n * host) → env-key fallback + a one-time log; never crashes the request\n * - no mapping → env-key path: method is derived from the credential's own\n * shape, not hardcoded — an anthropic env key that is actually a\n * subscription OAT (`sk-ant-oat…`, e.g. injected by the runtime's\n * billing-auth resolver for a modelDerivedApiKey adapter with no\n * `authSubscription`, such as pi) resolves to \"oauth-bearer\" so\n * {@link buildUpstreamAuthHeaders} sends it as `Authorization: Bearer`\n * instead of `x-api-key` — Anthropic hard-401s an OAT presented as\n * `x-api-key` (\"invalid x-api-key\"). Any other anthropic key, and every\n * other provider, keeps \"api-key\" exactly as before.\n */\nexport async function resolveUpstreamCredential(\n provider: string,\n): Promise<UpstreamCredential | undefined> {\n const profileId = process.env[upstreamProfileEnvVar(provider)]?.trim();\n if (profileId) {\n const profile = await getAuthProfile(profileId);\n if (!profile || profile.disabled) {\n warnUpstreamOnce(\n `profile:${provider}:${profileId}`,\n `[Proxy][auth] profile \"${profileId}\" mapped for provider \"${provider}\" is ${profile ? 'disabled' : 'missing'}; request will 401. Enable/create it or unset ${upstreamProfileEnvVar(provider)}.`,\n );\n return undefined;\n }\n if (!profile.credentialRef) {\n // Source-backed profile (e.g. source:\"claude-code-oauth\"). Self-refresh\n // would require re-homing a runtime helper — out of scope for the proxy.\n warnUpstreamOnce(\n `source:${provider}:${profileId}`,\n `[Proxy][auth] profile \"${profileId}\" is source-backed (source=\"${profile.source ?? '?'}\"); source-backed profiles are not yet supported by the proxy — use a credentialRef profile or a per-provider API-key env var instead. Request will 401.`,\n );\n return undefined;\n }\n try {\n const stored = await new KeychainStore().read({ path: profile.credentialRef });\n if (!stored) {\n // Read succeeded but the credential is absent / unreadable (e.g. a\n // locked or emptied Keychain entry on a supported host). Fail closed —\n // do NOT fall back to the env key, which could silently swap in a\n // different credential for a deliberately-mapped profile.\n warnUpstreamOnce(\n `noref:${provider}:${profileId}`,\n `[Proxy][auth] profile \"${profileId}\" credentialRef resolved no stored credential; failing closed — request will 401 (no env-key fallback for a mapped profile).`,\n );\n return undefined;\n }\n return { value: stored.value, method: profile.method };\n } catch (err) {\n // Keychain backend unusable on this host (platform-unsupported, e.g. a\n // non-darwin host with no Keychain) → fall back to the env key rather than\n // failing the request. This is the ONLY keychain path that degrades to the\n // env key; a null read above fails closed instead.\n warnUpstreamOnce(\n `keychain:${provider}:${profileId}`,\n `[Proxy][auth] keychain backend unavailable for profile \"${profileId}\" (${(err as Error).message}); platform-unsupported — falling back to the ${provider} env key.`,\n );\n // fall through to the env-key path below\n }\n }\n // No mapping (or keychain fallback): existing env-key path, method now\n // shape-derived instead of hardcoded (see doc comment above).\n const value = getApiKey(provider);\n return { value, method: isAnthropicOAuthToken(provider, value) ? 'oauth-bearer' : 'api-key' };\n}\n\n/**\n * Single source of truth for the outbound upstream-auth header shape. Given a\n * resolved credential, returns the auth-related headers to merge into the\n * request. For an `api-key` credential each provider keeps its existing header\n * exactly; for `oauth-bearer` (only meaningful on the anthropic upstream) it\n * emits the Bearer + anthropic-version + anthropic-beta triple.\n *\n * Fail-closed: an `oauth-bearer` credential (e.g. a Claude subscription OAT)\n * resolved for a NON-anthropic provider returns `null` — the token is never\n * emitted to a third-party upstream. Callers MUST treat `null` as a hard 401\n * and send no request.\n */\nexport function buildUpstreamAuthHeaders(\n provider: string,\n cred: UpstreamCredential,\n): Record<string, string> | null {\n const { value, method } = cred;\n\n if (method === 'oauth-bearer') {\n if (provider !== 'anthropic') {\n // oauth-bearer is only meaningful for the anthropic upstream. Sending a\n // Claude subscription OAT to any other host would leak the token to a\n // third party — reject rather than forward it.\n warnUpstreamOnce(\n `oauth-misconfig:${provider}`,\n `[Proxy][auth] oauth-bearer credential resolved for non-anthropic provider \"${provider}\"; refusing to forward it (subscription/oauth credentials are only valid for the anthropic upstream). Request will 401.`,\n );\n return null;\n }\n return {\n 'Authorization': `Bearer ${value}`,\n 'anthropic-version': ANTHROPIC_VERSION,\n 'anthropic-beta': ANTHROPIC_OAUTH_BETA,\n };\n }\n\n // api-key — preserve each provider's existing header shape verbatim.\n switch (provider) {\n case 'anthropic':\n return { 'x-api-key': value, 'anthropic-version': ANTHROPIC_VERSION };\n case 'moonshot':\n return { 'X-API-Key': value };\n // openrouter/requesty also set `anthropic-version` at their call sites\n // (left inline — it is a request-shape header, not an auth header).\n default:\n return { 'Authorization': `Bearer ${value}` };\n }\n}\n\n/**\n * Fail-closed guard for the OpenAI-compatible surfaces (/v1/responses,\n * /v1/chat/completions). Those surfaces are ALWAYS non-anthropic\n * (getChatCompletionsEndpoint returns null for anthropic) and forward the\n * resolved credential as `Authorization: Bearer <value>` — so only an\n * `api-key` credential may be used. A subscription/oauth credential (e.g. a\n * Claude OAT) must be rejected, never leaked to a third-party host.\n *\n * Returns true when the credential may proceed on this surface. An absent\n * credential returns true here (the caller's missing-key check 401s it).\n */\nexport function isCredentialAllowedOnOpenAiSurface(\n cred: UpstreamCredential | undefined,\n): boolean {\n return !cred || cred.method === 'api-key';\n}\n\n// ── Per-upstream credential status (GET /v1/upstreams) ────────────────────────\n// A read-only view of HOW a credential would resolve for each canonical\n// upstream — the profile/env/none precedence resolveUpstreamCredential itself\n// applies — WITHOUT ever returning the secret. Powers the vscode Upstreams\n// subtree + the optional live test below.\n\n// The 8 canonical upstreams. Built from a `Record<keyof ProviderKeys, …>` so\n// the compiler forces this list to stay exactly in sync with ProviderKeys\n// (every key required, no extras) — no drift, no runtime cost.\nconst CANONICAL_UPSTREAM_ORDER: Record<keyof ProviderKeys, true> = {\n anthropic: true,\n moonshot: true,\n openrouter: true,\n requesty: true,\n zai: true,\n groq: true,\n xai: true,\n openai: true,\n};\nexport const CANONICAL_UPSTREAMS = Object.keys(CANONICAL_UPSTREAM_ORDER) as (keyof ProviderKeys)[];\n\n/** Narrow an arbitrary provider string to one of the canonical upstreams. */\nexport function isCanonicalUpstream(provider: string): provider is keyof ProviderKeys {\n return (CANONICAL_UPSTREAMS as readonly string[]).includes(provider);\n}\n\n/** How a credential WOULD resolve for an upstream (never leaks the value). */\nexport type UpstreamSource = 'profile' | 'env' | 'none';\n\n/**\n * Non-secret status of one upstream's outbound credential:\n * - `linkedProfile`: the `LLM_ENDPOINT_PROFILE_<P>` profile id, or null.\n * - `source`: how a credential would resolve — a mapped profile (\"profile\",\n * even if that profile is missing/disabled), else a non-empty per-provider\n * env key (\"env\"), else \"none\".\n * - `method`: the outbound auth shape — the mapped profile's method, or\n * \"api-key\" for the env path, or null when nothing is configured.\n * - `present`: whether a credential actually resolves. Known for free for the\n * env (\"env\" ⇒ true) and none (\"none\" ⇒ false) sources; for a profile source\n * it is `null` unless `?probe=1` was requested, because confirming it reads\n * the OS keychain (one read per mapped profile).\n */\nexport interface UpstreamStatus {\n provider: string;\n linkedProfile: string | null;\n source: UpstreamSource;\n method: UpstreamAuthMethod | null;\n present: boolean | null;\n}\n\n/**\n * Whether a credential actually resolves for `provider`, as a pure boolean —\n * reuses resolveUpstreamCredential's exact precedence (profile → keychain →\n * env fallback) and NEVER exposes the value. For a profile source this reads\n * the keychain, so it is only called on the `?probe=1` path.\n */\nasync function upstreamCredentialPresent(provider: string): Promise<boolean> {\n const cred = await resolveUpstreamCredential(provider);\n return Boolean(cred?.value);\n}\n\n/**\n * Describe one upstream's credential status without returning a secret. The\n * default (mapping-only) view is cheap — an env-var read plus, for a mapped\n * provider, one auth-profiles.json read for the method. `present` for a profile\n * source is filled only when `opts.probe` is set (it costs a keychain read).\n */\nexport async function describeUpstreamStatus(\n provider: string,\n opts: { probe: boolean },\n): Promise<UpstreamStatus> {\n const linkedProfile = process.env[upstreamProfileEnvVar(provider)]?.trim() || null;\n if (linkedProfile) {\n // Profile metadata only (no keychain, no secret) — `method` and whether the\n // mapped profile even exists. `source` stays \"profile\" regardless: a\n // missing/disabled profile still describes intent, and `present` (on probe)\n // tells the truth about whether it resolves.\n const profile = await getAuthProfile(linkedProfile);\n const present = opts.probe ? await upstreamCredentialPresent(provider) : null;\n return { provider, linkedProfile, source: 'profile', method: profile?.method ?? null, present };\n }\n // getApiKey returns the env secret — used ONLY as a boolean here, never\n // returned. A non-empty env key ⇒ present:true for free.\n if (getApiKey(provider)) {\n return { provider, linkedProfile: null, source: 'env', method: 'api-key', present: true };\n }\n return { provider, linkedProfile: null, source: 'none', method: null, present: false };\n}\n\n/** Status for all 8 canonical upstreams, in ProviderKeys order. */\nexport async function collectUpstreamStatuses(opts: { probe: boolean }): Promise<UpstreamStatus[]> {\n return Promise.all(CANONICAL_UPSTREAMS.map((provider) => describeUpstreamStatus(provider, opts)));\n}\n\n// ── Per-upstream live test (POST /v1/upstreams/:provider/test) ────────────────\n// Best-effort, time-boxed: the CHEAPEST authenticated call to an upstream (a\n// models-list GET / key-info GET — no token cost) using the resolved\n// credential, reporting only {ok, status, detail} — never a secret, never the\n// upstream body. Upstreams with no cheap safe probe return {ok:null,\n// reason:\"no-probe\"} rather than inventing a costly call.\n\nconst UPSTREAM_TEST_TIMEOUT_MS = 4000;\n\ninterface UpstreamProbe {\n hostname: string;\n path: string;\n}\n\n/**\n * The cheapest authenticated GET that verifies an upstream credential. Most\n * providers expose an OpenAI-style `/v1/models` that 401s without a valid key;\n * anthropic has its native Models API; openrouter's `/api/v1/key` returns the\n * key's own metadata. Returns null for a provider with no cheap safe probe\n * (caller responds {ok:null, reason:\"no-probe\"}).\n *\n * NOTE (honesty): the zai / requesty paths are best-effort and unverified live\n * — a wrong path surfaces honestly as a non-2xx `status` with a \"not found\"\n * detail, distinct from the 401/403 \"credential rejected\" verdict.\n */\nfunction getUpstreamProbe(provider: string): UpstreamProbe | null {\n switch (provider) {\n case 'anthropic':\n return { hostname: 'api.anthropic.com', path: '/v1/models?limit=1' };\n case 'moonshot':\n return { hostname: 'api.moonshot.ai', path: '/v1/models' };\n case 'openrouter':\n return { hostname: 'openrouter.ai', path: '/api/v1/key' };\n case 'requesty':\n return { hostname: 'router.requesty.ai', path: '/v1/models' };\n case 'zai':\n return { hostname: 'open.bigmodel.cn', path: '/api/paas/v4/models' };\n case 'groq':\n return { hostname: 'api.groq.com', path: '/openai/v1/models' };\n case 'xai':\n return { hostname: 'api.x.ai', path: '/v1/models' };\n case 'openai':\n return { hostname: 'api.openai.com', path: '/v1/models' };\n default:\n return null;\n }\n}\n\n/** The result of a per-upstream live test — a verdict, or \"no cheap probe\". */\nexport type UpstreamTestResult =\n | { ok: boolean; status: number; detail: string }\n | { ok: null; reason: 'no-probe' };\n\n/** Human-readable interpretation of a probe's HTTP status (no secret). */\nfunction describeProbeStatus(status: number): string {\n if (status >= 200 && status < 300) return 'authenticated ok';\n if (status === 401 || status === 403) return 'credential rejected';\n if (status === 404) return 'probe endpoint not found (best-effort path)';\n if (status === 429) return 'rate limited';\n return `unexpected status ${status}`;\n}\n\n/**\n * Issue the time-boxed authenticated GET and resolve to {ok, status, detail}.\n * The upstream body is drained and discarded — only the HTTP status shapes the\n * verdict, so no account identifiers or secrets can leak through. Network\n * errors / timeouts resolve (never reject) with ok:false and status 0.\n */\nfunction probeUpstreamHttp(\n probe: UpstreamProbe,\n headers: Record<string, string>,\n timeoutMs: number,\n): Promise<{ ok: boolean; status: number; detail: string }> {\n return new Promise((resolvePromise) => {\n const proxyReq = httpsRequest(\n { hostname: probe.hostname, port: 443, path: probe.path, method: 'GET', headers },\n (proxyRes) => {\n const status = proxyRes.statusCode ?? 0;\n proxyRes.on('data', () => {}); // drain + discard — never parsed/returned\n proxyRes.on('end', () =>\n resolvePromise({ ok: status >= 200 && status < 300, status, detail: describeProbeStatus(status) }),\n );\n },\n );\n proxyReq.on('error', (err) =>\n resolvePromise({ ok: false, status: 0, detail: `network error: ${err.message}` }),\n );\n proxyReq.setTimeout(timeoutMs, () => {\n proxyReq.destroy();\n resolvePromise({ ok: false, status: 0, detail: `timed out after ${timeoutMs}ms` });\n });\n proxyReq.end();\n });\n}\n\n/**\n * Run the cheapest authenticated call for `provider` and return a verdict.\n * Resolves the credential through the same precedence as a real request, then\n * uses buildUpstreamAuthHeaders for the exact per-provider header shape — so an\n * oauth-bearer credential mis-mapped to a non-anthropic upstream is refused\n * (never forwarded) rather than tested.\n */\nexport async function testUpstream(provider: string): Promise<UpstreamTestResult> {\n const probe = getUpstreamProbe(provider);\n if (!probe) return { ok: null, reason: 'no-probe' };\n const cred = await resolveUpstreamCredential(provider);\n if (!cred?.value) {\n return { ok: false, status: 401, detail: 'no credential resolved for this upstream' };\n }\n const authHeaders = buildUpstreamAuthHeaders(provider, cred);\n if (!authHeaders) {\n return { ok: false, status: 401, detail: 'resolved credential is not forwardable to this upstream' };\n }\n return probeUpstreamHttp(probe, authHeaders, UPSTREAM_TEST_TIMEOUT_MS);\n}\n\n/**\n * GET /v1/upstreams — write the per-upstream credential status list. Async\n * (profile/keychain reads) so it's invoked fire-and-forget from the sync\n * server callback; a resolution failure returns a 500 rather than hanging.\n */\nasync function handleUpstreamsStatus(res: ServerResponse, opts: { probe: boolean }): Promise<void> {\n try {\n const data = await collectUpstreamStatuses(opts);\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ object: 'list', probe: opts.probe, data }));\n } catch (e) {\n console.error('[Proxy][upstreams] status error', e);\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'api_error', message: e instanceof Error ? e.message : String(e) } }));\n }\n}\n\n/**\n * POST /v1/upstreams/:provider/test — write the per-upstream live-test verdict.\n * A non-canonical provider is a 404; everything else returns {provider, ...}\n * with the {ok, status, detail} or {ok:null, reason} shape.\n */\nasync function handleUpstreamTest(res: ServerResponse, provider: string): Promise<void> {\n try {\n if (!isCanonicalUpstream(provider)) {\n res.writeHead(404, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: `Unknown upstream \"${provider}\". Known: ${CANONICAL_UPSTREAMS.join(', ')}` } }));\n return;\n }\n const result = await testUpstream(provider);\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ provider, ...result }));\n } catch (e) {\n console.error('[Proxy][upstreams] test error', e);\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'api_error', message: e instanceof Error ? e.message : String(e) } }));\n }\n}\n\n/** One GET /v1/endpoints entry — never a credential, only whether one resolved. */\ninterface EndpointHealth {\n id: string;\n baseUrl: string;\n reachable: boolean;\n models: string[];\n latencyMs: number;\n}\n\nasync function describeEndpointHealth(id: string, upstream: ConfigurableUpstream): Promise<EndpointHealth> {\n const baseUrl = `${upstream.protocol}://${upstream.hostname}:${upstream.port}${upstream.pathPrefix}`;\n const cred = await resolveUpstreamCredential(id);\n const start = Date.now();\n const { ok, ids } = await probeOpenAiModels(upstream, cred, ENDPOINT_MODEL_PROBE_TIMEOUT_MS);\n return { id, baseUrl, reachable: ok, models: ids, latencyMs: Date.now() - start };\n}\n\n/**\n * GET /v1/endpoints — write the health of forge (if configured) plus every\n * file-configured named endpoint. Best-effort per entry: one endpoint being\n * unreachable never fails the whole response (each probe already resolves\n * `{ok:false}` rather than throwing).\n */\nasync function handleEndpointsStatus(res: ServerResponse): Promise<void> {\n try {\n const entries: EndpointHealth[] = [];\n const forge = resolveForgeBaseUrl();\n if (forge) entries.push(await describeEndpointHealth('forge', forge));\n for (const endpoint of getConfiguredEndpoints()) {\n const upstream = parseUpstreamUrl(endpoint.baseUrl);\n if (!upstream) continue; // guaranteed valid at config-load time; defensive only\n entries.push(await describeEndpointHealth(endpoint.id, upstream));\n }\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ object: 'list', data: entries }));\n } catch (e) {\n console.error('[Proxy][endpoints] status error', e);\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'api_error', message: e instanceof Error ? e.message : String(e) } }));\n }\n}\n\n/**\n * Handles POST /v1/responses (and /v1/{pack}/responses).\n *\n * Validates the Responses API request, translates it to an OpenAI Chat\n * Completions request, forwards it to the provider's OpenAI-compatible\n * endpoint, and converts the upstream response back to the Responses API\n * format (JSON or SSE).\n */\nfunction handleResponsesRequest(\n req: IncomingMessage,\n res: ServerResponse,\n opts: {\n activePack: ModelPack;\n queryModelCode: string | null;\n queryProvider: string | null;\n queryTools: string | null;\n queryNoTools: string | null;\n headerTools: string | null;\n headerNoTools: string | null;\n headerExcludeTools: string | null;\n forcedAliasCode: string | null;\n }\n): void {\n let body = '';\n req.on('data', chunk => {\n body += chunk;\n });\n\n req.on('end', async () => {\n try {\n const payload = JSON.parse(body);\n const validated = validateResponsesRequest(payload);\n\n let resolvedTarget: { provider: string; model: string };\n try {\n resolvedTarget = resolveModelRoute(validated, {\n activePack: opts.activePack,\n queryModelCode: null, // Responses facade uses transparent routing only\n queryProvider: opts.queryProvider,\n forcedAliasCode: null,\n allowAliases: false,\n });\n } catch (e: any) {\n console.warn(`[Proxy][responses] ${e.message}`);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: e.message } }));\n return;\n }\n\n const chatPayload = responsesToChatCompletionsRequest(validated, resolvedTarget);\n\n trimTools(chatPayload, {\n provider: resolvedTarget.provider,\n queryTools: opts.queryTools,\n queryNoTools: opts.queryNoTools,\n headerTools: opts.headerTools,\n headerNoTools: opts.headerNoTools,\n headerExcludeTools: opts.headerExcludeTools,\n });\n\n const responsesConfigurableSpec = getConfigurableProviderSpec(resolvedTarget.provider);\n const endpoint = getChatCompletionsEndpoint(resolvedTarget.provider);\n if (!endpoint) {\n const message = responsesConfigurableSpec\n ? responsesConfigurableSpec.unavailableMessage()\n : `Provider \"${resolvedTarget.provider}\" does not support the OpenAI-compatible /v1/responses surface.`;\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message } }));\n return;\n }\n // chatPayload is the strongly-typed ChatCompletionsRequestBody (no index\n // signature); defaultRequestFields may carry arbitrary vendor fields\n // (e.g. LM Studio's reasoning_effort) that aren't part of that type but\n // still belong on the outbound wire payload.\n if (responsesConfigurableSpec) applyDefaultRequestFields(chatPayload as unknown as Record<string, unknown>, responsesConfigurableSpec.defaultRequestFields);\n const { hostname, path, port = 443, protocol = 'https' } = endpoint;\n const cred = await resolveUpstreamCredential(resolvedTarget.provider);\n const targetApiKey = cred?.value ?? '';\n // Fail closed: this OpenAI-compatible surface is ALWAYS non-anthropic\n // (getChatCompletionsEndpoint returns null for anthropic). A non-api-key\n // credential (e.g. a Claude subscription OAT) must never be forwarded as a\n // Bearer token to a third-party host — reject before sending the request.\n if (!isCredentialAllowedOnOpenAiSurface(cred)) {\n console.warn(`[Proxy][responses] refusing to forward a ${cred!.method} credential to non-anthropic provider \"${resolvedTarget.provider}\"; returning 401.`);\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'authentication_error', message: `Subscription/oauth credentials cannot be used on this OpenAI-compatible surface for provider \"${resolvedTarget.provider}\".` } }));\n return;\n }\n // A configurable provider may declare its key optional (forge — a\n // private/self-hosted server); every other provider (including nebius)\n // requires one and 401s when absent, exactly as before.\n if (!targetApiKey && !isUpstreamKeyOptional(resolvedTarget.provider)) {\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'authentication_error', message: `No API key for provider \"${resolvedTarget.provider}\"` } }));\n return;\n }\n\n console.log(`[Proxy Sortant][responses] Redirection vers ${resolvedTarget.provider} (${hostname}${path}) avec le modèle \"${chatPayload.model}\"`);\n\n // OpenAI-compatible surface — always Authorization: Bearer (never a\n // provider's Anthropic-surface header). buildUpstreamAuthHeaders is\n // keyed on provider, not surface, so it is NOT used here; only the\n // resolved credential value is (credentialRef-backed profiles included).\n const options: RequestOptions = {\n hostname,\n port,\n path,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(targetApiKey ? { 'Authorization': `Bearer ${targetApiKey}` } : {}),\n },\n };\n\n const proxyReq = sendUpstreamRequest(protocol, options, (proxyRes) => {\n const status = proxyRes.statusCode || 200;\n const contentType = proxyRes.headers['content-type'] as string || '';\n const isStreaming = validated.stream === true && /text\\/event-stream/i.test(contentType);\n\n if (isStreaming) {\n const respHeaders: Record<string, string | string[] | undefined> = { ...proxyRes.headers };\n delete respHeaders['content-length'];\n delete respHeaders['transfer-encoding'];\n respHeaders['content-type'] = 'text/event-stream';\n res.writeHead(status, respHeaders);\n const converter = new OpenAIChatToResponsesStreamConverter({ requestedModel: validated.model });\n proxyRes.setEncoding('utf8');\n proxyRes.on('data', (c: string) => {\n for (const out of converter.push(c)) res.write(out);\n });\n proxyRes.on('end', () => {\n for (const out of converter.flush()) res.write(out);\n res.end();\n });\n } else {\n const respHeaders: Record<string, string | string[] | undefined> = { ...proxyRes.headers };\n delete respHeaders['content-length'];\n delete respHeaders['transfer-encoding'];\n respHeaders['content-type'] = 'application/json';\n res.writeHead(status, respHeaders);\n let upstreamBody = '';\n proxyRes.setEncoding('utf8');\n proxyRes.on('data', (c: string) => { upstreamBody += c; });\n proxyRes.on('end', () => {\n res.end(chatCompletionsJsonToResponses(upstreamBody || '{}', { requestedModel: validated.model }));\n });\n }\n });\n\n proxyReq.on('error', (err) => {\n console.error('[Proxy SORTANT error]', err);\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'api_error', message: err.message } }));\n });\n\n proxyReq.write(JSON.stringify(chatPayload));\n proxyReq.end();\n\n } catch (e: any) {\n console.error('[Payload Error]', e);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: e.message } }));\n }\n });\n}\n\n/**\n * Handles POST /v1/chat/completions (and /v1/{pack}/chat/completions).\n *\n * This is the normal OpenAI-compatible surface. It does not perform Anthropic\n * schema adaptation; it resolves a transparent `provider/model` reference and\n * forwards the request to the matching provider chat/completions endpoint.\n */\nfunction handleChatCompletionsRequest(\n req: IncomingMessage,\n res: ServerResponse,\n opts: {\n activePack: ModelPack;\n queryProvider: string | null;\n queryTools: string | null;\n queryNoTools: string | null;\n headerTools: string | null;\n headerNoTools: string | null;\n headerExcludeTools: string | null;\n }\n): void {\n let body = '';\n req.on('data', chunk => {\n body += chunk;\n });\n\n req.on('end', async () => {\n try {\n const payload = JSON.parse(body);\n\n let resolvedTarget: { provider: string; model: string };\n try {\n resolvedTarget = resolveModelRoute(payload, {\n activePack: opts.activePack,\n queryModelCode: null,\n queryProvider: opts.queryProvider,\n forcedAliasCode: null,\n allowAliases: false,\n });\n } catch (e: any) {\n console.warn(`[Proxy][chat/completions] ${e.message}`);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: e.message } }));\n return;\n }\n\n payload.model = resolvedTarget.model;\n // `<endpointId>@<device>` (DEVICES-PLAN item 2) — see the /v1/messages\n // handler's identical rewrite for why.\n const deviceRoute = parseDeviceProvider(resolvedTarget.provider);\n if (deviceRoute) payload.model = `${deviceRoute.endpointId}/${resolvedTarget.model}`;\n\n trimTools(payload, {\n provider: resolvedTarget.provider,\n queryTools: opts.queryTools,\n queryNoTools: opts.queryNoTools,\n headerTools: opts.headerTools,\n headerNoTools: opts.headerNoTools,\n headerExcludeTools: opts.headerExcludeTools,\n });\n\n const chatConfigurableSpec = getConfigurableProviderSpec(resolvedTarget.provider);\n const endpoint = getChatCompletionsEndpoint(resolvedTarget.provider);\n if (!endpoint) {\n const message = chatConfigurableSpec\n ? chatConfigurableSpec.unavailableMessage()\n : `Provider \"${resolvedTarget.provider}\" does not support the OpenAI-compatible /v1/chat/completions surface.`;\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message } }));\n return;\n }\n if (chatConfigurableSpec) applyDefaultRequestFields(payload, chatConfigurableSpec.defaultRequestFields);\n const { hostname, path, port = 443, protocol = 'https' } = endpoint;\n const cred = await resolveUpstreamCredential(resolvedTarget.provider);\n const targetApiKey = cred?.value ?? '';\n // Fail closed: this OpenAI-compatible surface is ALWAYS non-anthropic\n // (getChatCompletionsEndpoint returns null for anthropic). A non-api-key\n // credential (e.g. a Claude subscription OAT) must never be forwarded as a\n // Bearer token to a third-party host — reject before sending the request.\n if (!isCredentialAllowedOnOpenAiSurface(cred)) {\n console.warn(`[Proxy][chat/completions] refusing to forward a ${cred!.method} credential to non-anthropic provider \"${resolvedTarget.provider}\"; returning 401.`);\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'authentication_error', message: `Subscription/oauth credentials cannot be used on this OpenAI-compatible surface for provider \"${resolvedTarget.provider}\".` } }));\n return;\n }\n // A configurable provider may declare its key optional (forge — a\n // private/self-hosted server); every other provider (including nebius)\n // requires one and 401s when absent, exactly as before.\n if (!targetApiKey && !isUpstreamKeyOptional(resolvedTarget.provider)) {\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'authentication_error', message: `No API key for provider \"${resolvedTarget.provider}\"` } }));\n return;\n }\n\n console.log(`[Proxy Sortant][chat/completions] Redirection vers ${resolvedTarget.provider} (${hostname}${path}) avec le modèle \"${payload.model}\"`);\n\n // OpenAI-compatible surface — always Authorization: Bearer (see the\n // /v1/responses handler above for why buildUpstreamAuthHeaders, which is\n // keyed on provider not surface, is deliberately not used here).\n const options: RequestOptions = {\n hostname,\n port,\n path,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(targetApiKey ? { 'Authorization': `Bearer ${targetApiKey}` } : {}),\n // See the /v1/messages handler's identical header — the daemon's\n // /devices/:id/exec-stream 400s without it, always POST outer verb\n // notwithstanding.\n ...(deviceRoute ? { 'x-agentproto-forward-method': 'POST' } : {}),\n },\n };\n\n const proxyReq = sendUpstreamRequest(protocol, options, (proxyRes) => {\n const status = proxyRes.statusCode || 200;\n const respHeaders: Record<string, string | string[] | undefined> = { ...proxyRes.headers };\n delete respHeaders['content-length'];\n delete respHeaders['transfer-encoding'];\n res.writeHead(status, respHeaders);\n proxyRes.pipe(res);\n });\n\n proxyReq.on('error', (err) => {\n console.error('[Proxy SORTANT error]', err);\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'api_error', message: err.message } }));\n });\n\n proxyReq.write(JSON.stringify(payload));\n proxyReq.end();\n\n } catch (e: any) {\n console.error('[Payload Error]', e);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: e.message } }));\n }\n });\n}\n\n// Adapte un payload Anthropic Messages vers le schéma OpenAI Chat Completions\n// (Groq / OpenRouter / ZAI / xAI / OpenAI). Moonshot expose un endpoint /anthropic\n// natif et n'a PAS besoin de cette adaptation. Renvoie les champs problématiques\n// supprimés et les champs sémantiquement équivalents convertis (system,\n// tool_choice, stop).\nfunction adaptAnthropicToOpenAI(payload: any) {\n // 1. Fusionne le `system` top-level ET toute entrée messages[] de role\n // system/developer — où qu'elle soit dans le tableau — en UN seul\n // message role:system, en tête. Un system non-tête casse les templates\n // de chat stricts (llama.cpp/LM Studio sur un GGUF Qwen : \"System\n // message must be at the beginning\"). claude-code 2.x envoie justement\n // son bloc \"# Environment\" comme message role:system APRÈS le tour\n // user plutôt que dans le champ `system` — sans ce merge il survivait\n // tel quel jusqu'à l'upstream (l'ancien code ne regardait que\n // messages[0]).\n const sysParts: string[] = [];\n if (payload.system != null) {\n if (typeof payload.system === 'string') {\n if (payload.system) sysParts.push(payload.system);\n } else if (Array.isArray(payload.system)) {\n const text = payload.system\n .map((b: any) => (typeof b === 'string' ? b : b?.text ?? ''))\n .filter(Boolean)\n .join('\\n\\n');\n if (text) sysParts.push(text);\n }\n delete payload.system;\n }\n if (Array.isArray(payload.messages)) {\n payload.messages = payload.messages.filter((m: any) => {\n if (m?.role !== 'system' && m?.role !== 'developer') return true;\n const text = typeof m.content === 'string'\n ? m.content\n : Array.isArray(m.content)\n ? m.content.map((b: any) => (typeof b === 'string' ? b : b?.text ?? '')).filter(Boolean).join('\\n\\n')\n : '';\n if (text) sysParts.push(text);\n return false;\n });\n }\n if (sysParts.length) {\n if (!Array.isArray(payload.messages)) payload.messages = [];\n payload.messages.unshift({ role: 'system', content: sysParts.join('\\n\\n') });\n }\n\n // 2. tool_choice : {type:auto|any|tool|none, name?} -> schéma OpenAI.\n // Groq n'accepte QUE \"auto\"/\"none\"/function — pas \"required\" — donc on\n // mappe any -> \"auto\" (perte sémantique mineure, mais accepté partout).\n if (payload.tool_choice && typeof payload.tool_choice === 'object') {\n const tc = payload.tool_choice;\n if (tc.type === 'any') {\n payload.tool_choice = 'auto';\n } else if (tc.type === 'tool' && tc.name) {\n payload.tool_choice = { type: 'function', function: { name: tc.name } };\n }\n // 'auto' et 'none' passent tels quels côté OpenAI.\n }\n\n // 3. stop_sequences -> stop\n if (Array.isArray(payload.stop_sequences) && payload.stop_sequences.length) {\n payload.stop = payload.stop_sequences;\n }\n\n // 3b. Conversion des blocs de contenu Anthropic -> format OpenAI.\n // Anthropic: content: [{type:\"text\"}, {type:\"tool_use\",id,name,input},\n // {type:\"tool_result\",tool_use_id,content}, {type:\"thinking\"}]\n // OpenAI: content \"string\" | null + tool_calls[] ;\n // tool_result -> messages role:\"tool\" séparés.\n // SANS cette conversion, Groq/ZAI renvoient 400 :\n // - assistant content[0].type != \"text\" (tool_use non converti en tool_calls)\n // - \"Failed to call a function\" (historique tool_use illisible par le modèle)\n //\n // Cas particulier « orphaned tool call » : si le tools array a été\n // tronqué (ex. Groq limité à 128), l'historique peut contenir des\n // tool_use pour des outils non déclarés. Groq valide strictement et\n // rejette (« attempted to call tool 'X' which was not in request.tools »).\n // -> on convertit ces tool_use orphelins (et leur tool_result) en texte.\n if (Array.isArray(payload.messages)) {\n const declaredTools = new Set<string>(\n Array.isArray(payload.tools) ? payload.tools.map((t: any) => t?.name).filter(Boolean) : []\n );\n const orphanedToolUseIds = new Set<string>();\n if (process.env.PROXY_DEBUG) {\n console.error(`[adapt] declaredTools=${declaredTools.size} names=${JSON.stringify([...declaredTools].slice(0, 20))}`);\n }\n\n const newMessages: any[] = [];\n for (const msg of payload.messages) {\n if (msg.content == null || typeof msg.content === 'string') {\n newMessages.push(msg);\n continue;\n }\n if (!Array.isArray(msg.content)) {\n newMessages.push(msg);\n continue;\n }\n const blocks = msg.content;\n\n // Cas 1 : message user contenant des tool_result -> messages role:\"tool\" OpenAI\n // (ou texte si le tool_use correspondant est orphelin)\n if (msg.role === 'user' && blocks.some((b: any) => b && b.type === 'tool_result')) {\n const userTextParts: string[] = [];\n for (const b of blocks) {\n if (!b) continue;\n if (b.type === 'tool_result') {\n let trContent = '';\n if (typeof b.content === 'string') trContent = b.content;\n else if (Array.isArray(b.content)) {\n trContent = b.content.map((c: any) => typeof c === 'string' ? c : (c?.text ?? '')).join('\\n');\n }\n if (orphanedToolUseIds.has(b.tool_use_id)) {\n // tool_use orphelin : on garde le résultat comme contexte texte user\n if (trContent) userTextParts.push(`[Tool result: ${trContent}]`);\n } else {\n newMessages.push({ role: 'tool', tool_call_id: b.tool_use_id, content: trContent || '' });\n }\n } else if (b.type === 'text' && b.text) {\n userTextParts.push(b.text);\n }\n }\n if (userTextParts.length) {\n newMessages.push({ role: 'user', content: userTextParts.join('\\n') });\n }\n continue;\n }\n\n // Cas 2 : assistant/user avec blocs text + tool_use (thinking ignoré)\n const textParts: string[] = [];\n const toolCalls: any[] = [];\n for (const b of blocks) {\n if (!b) continue;\n if (b.type === 'text' && b.text) {\n textParts.push(b.text);\n } else if (b.type === 'tool_use') {\n // Orphelin si l'outil n'est PAS déclaré, OU si aucun outil n'est déclaré\n // (ex. turn \"lean\" sans tools, ?notools=1, follow-up sans tools array).\n // Si on ne convertit pas, Groq rejette : « tool X not in request.tools »\n // car les tool_use passent en tool_calls OpenAI contre un tools array vide.\n const isOrphan = !declaredTools.has(b.name);\n if (process.env.PROXY_DEBUG) {\n console.error(`[adapt] tool_use name=${b.name} isOrphan=${isOrphan} declaredHas=${declaredTools.has(b.name)} declaredSize=${declaredTools.size}`);\n }\n if (isOrphan) {\n // Outil non déclaré (tools tronqué) : convertir en note texte\n const argStr = typeof b.input === 'string' ? b.input : JSON.stringify(b.input ?? {});\n textParts.push(`[Used tool ${b.name} with args ${argStr}]`);\n if (b.id) orphanedToolUseIds.add(b.id);\n } else {\n toolCalls.push({\n id: b.id || `call_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,\n type: 'function',\n function: {\n name: b.name,\n arguments: typeof b.input === 'string' ? b.input : JSON.stringify(b.input ?? {})\n }\n });\n }\n }\n // thinking / redacted_thinking : ignorés (raisonnement interne, pas envoyé à OpenAI)\n }\n const newMsg: any = { role: msg.role };\n newMsg.content = textParts.length ? textParts.join('\\n') : (toolCalls.length ? null : '');\n if (toolCalls.length) newMsg.tool_calls = toolCalls;\n if (msg.name) newMsg.name = msg.name;\n newMessages.push(newMsg);\n }\n payload.messages = newMessages;\n }\n\n // 4. Champs spécifiques Anthropic non reconnus par OpenAI -> suppression.\n // (Le CLI `claude` 2.x peut envoyer output_config, context_management, etc.\n // que Groq/ZAI/OpenRouter rejettent en 400 \"unsupported\".)\n delete payload.thinking;\n delete payload.context_management;\n delete payload.top_k;\n delete payload.metadata;\n delete payload.betas;\n delete payload.anthropic_beta;\n delete payload.stop_sequences;\n delete payload.cache_control;\n delete payload.output_config;\n delete payload.service_tier;\n delete payload.mcp_servers;\n}\n\n// --- OpenRouter : strip des blocs thinking/redacted_thinking ---\n// Le CLI `claude` (Claude Code) VÉRIFIE la signature des blocs thinking pour les\n// modèles courants (claude-sonnet-5, opus-4-8, fable-5, haiku-4-5). OpenRouter\n// renvoie ces blocs avec signature:\"\" (invalide) → le CLI laisse tomber TOUT le\n// contenu et n'affiche rien. On retire donc thinking/redacted_thinking côté proxy\n// pour ne garder que les blocs text/tool_use que le CLI sait afficher.\n\nexport function stripThinkingFromAnthropicJson(jsonStr: string): string {\n try {\n const obj = JSON.parse(jsonStr);\n if (Array.isArray(obj.content)) {\n obj.content = obj.content.filter(\n (b: any) => b && b.type !== 'thinking' && b.type !== 'redacted_thinking'\n );\n }\n return JSON.stringify(obj);\n } catch {\n return jsonStr;\n }\n}\n\n// --- Empty-turn retry ---------------------------------------------------\n// Certains modèles \"reasoning\" servis derrière un routeur (vérifié : Requesty\n// sur sference/thinkingcap-qwen3.6-27b, ~12% des tours) raisonnent puis\n// n'émettent RIEN : que des blocs thinking, aucun text, aucun tool_use, et\n// stop_reason \"end_turn\". Le tour est un no-op silencieux — et comme on strip\n// justement les blocs thinking, le client reçoit un message vide.\n//\n// Le tour vide est un défaut MODÈLE, pas un défaut de traduction : mesuré\n// identique (12%) sur les deux surfaces de Requesty (Anthropic et OpenAI).\n// On rejoue donc une fois, ce qui ramène ~12% à ~1.4%.\n//\n// Portée volontairement étroite :\n// - seulement les providers `needsStrip` (ceux qui présentent le défaut) ;\n// - seulement sur HTTP 200 — une 429/500 n'est pas un tour vide ;\n// - seulement sur stop_reason \"end_turn\" — un \"max_tokens\" signifie que le\n// modèle a brûlé son budget dans le thinking, et rejouer à budget\n// identique reproduirait le même résultat en facturant deux fois ;\n// - 1 essai par défaut (`LLM_ENDPOINT_EMPTY_TURN_RETRY=0` désactive).\n// Chaque rejeu est loggé : un retry silencieux masquerait un vrai tour vide,\n// que @agentproto/runtime remonte justement comme `empty: true`.\nconst DEFAULT_EMPTY_TURN_RETRIES = 1;\n\nfunction resolveEmptyTurnRetries(): number {\n const raw = process.env.LLM_ENDPOINT_EMPTY_TURN_RETRY;\n if (raw === undefined) return DEFAULT_EMPTY_TURN_RETRIES;\n const n = Number.parseInt(raw, 10);\n return Number.isFinite(n) && n >= 0 ? n : DEFAULT_EMPTY_TURN_RETRIES;\n}\n\n/**\n * True when an Anthropic Messages JSON body is a \"tour vide\": ended normally\n * (`end_turn`) but carries no client-visible content once thinking is stripped.\n */\nfunction isEmptyAnthropicTurn(jsonStr: string): boolean {\n try {\n const obj = JSON.parse(jsonStr);\n if (!obj || obj.type === 'error' || !Array.isArray(obj.content)) return false;\n if (obj.stop_reason !== 'end_turn') return false;\n return !obj.content.some(\n (b: any) => b && b.type !== 'thinking' && b.type !== 'redacted_thinking'\n );\n } catch {\n return false;\n }\n}\n\n// Transformeur SSE en flux : filtre les content_block_start/delta/stop des blocs\n// thinking/redacted_thinking et réindexe les blocs conservés (0,1,2…) pour que le\n// CLI voie des indices contigus. Garde message_start/message_delta/message_stop/ping.\nclass AnthropicThinkingStripper {\n private skipIndices = new Set<number>();\n private indexMap = new Map<number, number>();\n private nextOut = 0;\n private buffer = '';\n /**\n * True once a NON-thinking content block has started — i.e. the turn is\n * producing something the client will actually see (text or tool_use).\n * Read by the empty-turn retry: a turn that ends without this produced\n * nothing but stripped thinking, so nothing has been written downstream yet\n * and the attempt is still safely discardable.\n */\n hasMeaningfulContent = false;\n /** stop_reason seen on message_delta, if any. */\n stopReason: string | null = null;\n\n push(chunk: string): string[] {\n this.buffer += chunk;\n const out: string[] = [];\n const parts = this.buffer.split(/\\r?\\n\\r?\\n/);\n this.buffer = parts.pop() ?? '';\n for (const part of parts) {\n const transformed = this.transformEvent(part);\n if (transformed) out.push(transformed);\n }\n return out;\n }\n\n flush(): string[] {\n if (this.buffer.trim()) {\n const transformed = this.transformEvent(this.buffer);\n this.buffer = '';\n return transformed ? [transformed] : [];\n }\n return [];\n }\n\n private transformEvent(rawEvent: string): string | null {\n const lines = rawEvent.split(/\\r?\\n/);\n let eventLine: string | null = null;\n const dataLines: string[] = [];\n for (const line of lines) {\n if (line.startsWith('event:')) eventLine = line.slice(6).trim();\n else if (line.startsWith('data:')) dataLines.push(line.slice(5).trim());\n }\n if (!dataLines.length) return rawEvent ? rawEvent + '\\n\\n' : null;\n\n let data: any;\n try {\n data = JSON.parse(dataLines.join('\\n'));\n } catch {\n return rawEvent + '\\n\\n';\n }\n\n const type = data.type;\n if (type === 'content_block_start') {\n const ct = data.content_block && data.content_block.type;\n if (ct === 'thinking' || ct === 'redacted_thinking') {\n this.skipIndices.add(data.index);\n return null;\n }\n const outIdx = this.nextOut++;\n this.indexMap.set(data.index, outIdx);\n data.index = outIdx;\n this.hasMeaningfulContent = true;\n } else if (type === 'message_delta') {\n const sr = data.delta && data.delta.stop_reason;\n if (typeof sr === 'string') this.stopReason = sr;\n } else if (type === 'content_block_delta') {\n if (this.skipIndices.has(data.index)) return null;\n const dt = data.delta && data.delta.type;\n if (dt === 'thinking_delta' || dt === 'signature_delta' || dt === 'redacted_thinking_delta') return null;\n data.index = this.indexMap.get(data.index) ?? data.index;\n } else if (type === 'content_block_stop') {\n if (this.skipIndices.has(data.index)) return null;\n data.index = this.indexMap.get(data.index) ?? data.index;\n }\n\n const ev = eventLine ? `event: ${eventLine}\\n` : '';\n return ev + `data: ${JSON.stringify(data)}\\n\\n`;\n }\n}\n\n// --- Groq/ZAI/xAI/OpenAI : conversion OpenAI → Anthropic ---\n// Ces providers ne parlent que l'API OpenAI (chat/completions). Le CLI `claude`\n// ne parse QUE le format Anthropic. On convertit donc la réponse OpenAI (JSON\n// ou SSE) en Anthropic côté proxy.\n\nfunction openaiFinishToAnthropicStop(fr: string | null | undefined): string {\n switch (fr) {\n case 'stop': return 'end_turn';\n case 'length': return 'max_tokens';\n case 'tool_calls': return 'tool_use';\n case 'content_filter': return 'end_turn';\n default: return 'end_turn';\n }\n}\n\nfunction openaiJsonToAnthropic(jsonStr: string): string {\n try {\n const o = JSON.parse(jsonStr);\n // Pass-through des erreurs upstream (OpenAI/ZAI renvoient {\"error\":{...}})\n // sous forme d'erreur Anthropic, au lieu d'un message vide trompeur.\n if (o && typeof o === 'object' && o.error) {\n const e = o.error;\n return JSON.stringify({\n type: 'error',\n error: {\n type: e.type || 'api_error',\n message: e.message || (typeof e === 'string' ? e : 'Upstream error')\n }\n });\n }\n const choice = o.choices && o.choices[0];\n const msg = choice && choice.message;\n const content: any[] = [];\n if (msg && typeof msg.content === 'string' && msg.content) {\n content.push({ type: 'text', text: msg.content });\n }\n if (msg && Array.isArray(msg.tool_calls)) {\n for (const tc of msg.tool_calls) {\n let input: any = {};\n try { input = tc.function && tc.function.arguments ? JSON.parse(tc.function.arguments) : {}; } catch { input = {}; }\n content.push({\n type: 'tool_use',\n id: tc.id || `toolu_${Date.now()}`,\n name: tc.function && tc.function.name,\n input\n });\n }\n }\n // A reasoning model can burn its whole max_tokens budget \"thinking\" and\n // return no visible content at all (finish_reason stays e.g. \"length\" —\n // reproduced live on forge/bonsai-27b with a tight budget). Surfacing the\n // reasoning as a thinking block is opt-in (LLM_ENDPOINT_PASSTHROUGH_THINKING)\n // since it's raw model reasoning, not a normal response — a caller that\n // doesn't expect it should keep seeing today's empty-content message.\n if (content.length === 0 && msg && typeof msg.reasoning_content === 'string' && msg.reasoning_content && passthroughThinking()) {\n content.push({ type: 'thinking', thinking: msg.reasoning_content, signature: '' });\n }\n const usage = o.usage || {};\n const out = {\n id: o.id || `msg_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n model: o.model || 'groq',\n content,\n stop_reason: openaiFinishToAnthropicStop(choice && choice.finish_reason),\n stop_sequence: null,\n usage: {\n input_tokens: usage.prompt_tokens || 0,\n output_tokens: usage.completion_tokens || 0\n }\n };\n return JSON.stringify(out);\n } catch {\n return jsonStr;\n }\n}\n\n// Convertit un flux SSE OpenAI (chat.completion.chunk) en flux SSE Anthropic.\n// Séquence Anthropic émise :\n// message_start → content_block_start(text) → content_block_delta(text_delta)*\n// → content_block_stop → (tool_use blocks si tool_calls) → message_delta(stop) → message_stop\nclass OpenAIToAnthropicStreamConverter {\n private msgId = `msg_${Date.now()}`;\n private sentStart = false;\n private textBlockOpen = false;\n private toolBlockIdx = -1;\n private buffer = '';\n private accUsage: { prompt_tokens?: number; completion_tokens?: number } = {};\n private finished = false;\n\n push(chunk: string): string[] {\n this.buffer += chunk;\n const out: string[] = [];\n const parts = this.buffer.split(/\\r?\\n\\r?\\n/);\n this.buffer = parts.pop() ?? '';\n for (const part of parts) {\n const transformed = this.transformChunk(part);\n if (transformed) out.push(...transformed);\n }\n return out;\n }\n\n flush(): string[] {\n if (this.buffer.trim()) {\n const transformed = this.transformChunk(this.buffer);\n this.buffer = '';\n return transformed || [];\n }\n return [];\n }\n\n private sse(event: string, data: any): string {\n return `event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`;\n }\n\n private transformChunk(rawEvent: string): string[] | null {\n const lines = rawEvent.split(/\\r?\\n/);\n const dataLines: string[] = [];\n for (const line of lines) {\n if (line.startsWith('data:')) dataLines.push(line.slice(5).trim());\n }\n if (!dataLines.length) return null;\n\n const out: string[] = [];\n for (const dl of dataLines) {\n if (dl === '[DONE]') {\n if (this.finished) continue;\n if (this.textBlockOpen) { out.push(this.sse('content_block_stop', { type: 'content_block_stop', index: 0 })); this.textBlockOpen = false; }\n out.push(this.sse('message_delta', { type: 'message_delta', delta: { stop_reason: 'end_turn', stop_sequence: null }, usage: { input_tokens: this.accUsage.prompt_tokens || 0, output_tokens: this.accUsage.completion_tokens || 0 } }));\n out.push(this.sse('message_stop', { type: 'message_stop' }));\n this.finished = true;\n continue;\n }\n let data: any;\n try { data = JSON.parse(dl); } catch { continue; }\n\n const choice = data.choices && data.choices[0];\n const delta = choice && choice.delta;\n const content = delta && delta.content;\n\n // message_start au premier chunk utile\n if (!this.sentStart && (content !== undefined || (delta && delta.role))) {\n out.push(this.sse('message_start', {\n type: 'message_start',\n message: {\n id: this.msgId, type: 'message', role: 'assistant',\n model: data.model || 'groq', content: [],\n stop_reason: null, stop_sequence: null,\n usage: { input_tokens: 0, output_tokens: 0 }\n }\n }));\n this.sentStart = true;\n }\n\n // Contenu texte\n if (typeof content === 'string' && content) {\n if (!this.textBlockOpen) {\n out.push(this.sse('content_block_start', { type: 'content_block_start', index: 0, content_block: { type: 'text', text: '' } }));\n this.textBlockOpen = true;\n }\n out.push(this.sse('content_block_delta', { type: 'content_block_delta', index: 0, delta: { type: 'text_delta', text: content } }));\n }\n\n // tool_calls (streaming) — ouverture d'un bloc tool_use par appel\n if (delta && Array.isArray(delta.tool_calls)) {\n if (this.textBlockOpen) { out.push(this.sse('content_block_stop', { type: 'content_block_stop', index: 0 })); this.textBlockOpen = false; }\n for (const tc of delta.tool_calls) {\n if (tc.function && tc.function.name && tc.index !== undefined) {\n this.toolBlockIdx = tc.index + 1;\n out.push(this.sse('content_block_start', {\n type: 'content_block_start', index: this.toolBlockIdx,\n content_block: { type: 'tool_use', id: tc.id || `toolu_${Date.now()}`, name: tc.function.name, input: {} }\n }));\n }\n if (tc.function && tc.function.arguments) {\n out.push(this.sse('content_block_delta', {\n type: 'content_block_delta', index: this.toolBlockIdx,\n delta: { type: 'input_json_delta', partial_json: tc.function.arguments }\n }));\n }\n }\n }\n\n // usage (x_groq ou usage direct)\n const u = data.x_groq && data.x_groq.usage ? data.x_groq.usage : data.usage;\n if (u) { if (u.prompt_tokens != null) this.accUsage.prompt_tokens = u.prompt_tokens; if (u.completion_tokens != null) this.accUsage.completion_tokens = u.completion_tokens; }\n\n // finish_reason → fermeture\n const fr = choice && choice.finish_reason;\n if (fr && !this.finished) {\n if (this.textBlockOpen) { out.push(this.sse('content_block_stop', { type: 'content_block_stop', index: 0 })); this.textBlockOpen = false; }\n if (this.toolBlockIdx >= 0) { out.push(this.sse('content_block_stop', { type: 'content_block_stop', index: this.toolBlockIdx })); this.toolBlockIdx = -1; }\n out.push(this.sse('message_delta', { type: 'message_delta', delta: { stop_reason: openaiFinishToAnthropicStop(fr), stop_sequence: null }, usage: { input_tokens: this.accUsage.prompt_tokens || 0, output_tokens: this.accUsage.completion_tokens || 0 } }));\n out.push(this.sse('message_stop', { type: 'message_stop' }));\n this.finished = true;\n }\n }\n return out.length ? out : null;\n }\n}\n\n// ── Inbound access gate ─────────────────────────────────────────────────────\n// Optional CLIENT→proxy authentication, independent of the upstream provider\n// keys (proxy→provider), which are always server-side and never the client's.\n// Enabled by setting LLM_ENDPOINT_ACCESS_TOKENS to a comma-separated allow-list;\n// unset/empty leaves the proxy open (prior behaviour). Read once at boot like\n// the provider keys — changing it requires a restart.\n\n/** Parse a comma-separated token allow-list into a Set (trimmed, non-empty). */\nexport function parseAccessTokens(raw: string | undefined): Set<string> {\n return new Set((raw ?? '').split(',').map((t) => t.trim()).filter(Boolean));\n}\n\nlet _accessTokens: Set<string> | null = null;\n/** Cached allow-list from LLM_ENDPOINT_ACCESS_TOKENS (empty Set = gate off). */\nfunction accessTokens(): Set<string> {\n if (_accessTokens === null) _accessTokens = parseAccessTokens(process.env.LLM_ENDPOINT_ACCESS_TOKENS);\n return _accessTokens;\n}\n\n/**\n * Extract a presented access token from `Authorization: Bearer <t>` or the\n * `X-Proxy-Access: <t>` header (so a client that reserves Authorization for\n * something else can still pass one). Returns null when neither is present.\n */\nexport function extractInboundToken(headers: IncomingMessage['headers']): string | null {\n const auth = headers['authorization'];\n const a = Array.isArray(auth) ? auth[0] : auth;\n if (a) {\n const m = /^Bearer\\s+(.+)$/i.exec(a.trim());\n if (m && m[1]!.trim()) return m[1]!.trim();\n }\n const xp = headers['x-proxy-access'];\n const x = Array.isArray(xp) ? xp[0] : xp;\n if (x && x.trim()) return x.trim();\n return null;\n}\n\n/**\n * True when the request may proceed: gate disabled (empty allow-list), or the\n * presented token is in the allow-list. A high-entropy random token makes the\n * Set membership check's non-constant time immaterial.\n */\nexport function isAuthorized(headers: IncomingMessage['headers'], tokens: Set<string>): boolean {\n if (tokens.size === 0) return true;\n const presented = extractInboundToken(headers);\n return presented !== null && tokens.has(presented);\n}\n\n// ── Edge/WAF token gate ─────────────────────────────────────────────────────\n// A SECOND, independent client→proxy auth layer meant to be checked by an\n// edge/WAF rule (Cloudflare custom rule) in front of the proxy, not just by\n// this process — see buildWafRuleExpression below. Deliberately separate from\n// the inbound access gate above: the two can be rotated/enabled independently\n// (e.g. a WAF-only token in front of a publicly reachable deployment, plus an\n// app-level token for direct callers). Unset/empty leaves this layer off.\n\nlet _edgeTokens: Set<string> | null = null;\n/** Cached allow-list from LLM_ENDPOINT_EDGE_TOKENS (empty Set = layer off). */\nfunction edgeTokens(): Set<string> {\n if (_edgeTokens === null) _edgeTokens = parseAccessTokens(process.env.LLM_ENDPOINT_EDGE_TOKENS);\n return _edgeTokens;\n}\n\n/**\n * Extract a presented edge token from the `X-Edge-Auth: <t>` header. Returns\n * null when absent or blank.\n */\nexport function extractEdgeToken(headers: IncomingMessage['headers']): string | null {\n const raw = headers['x-edge-auth'];\n const v = Array.isArray(raw) ? raw[0] : raw;\n if (v && v.trim()) return v.trim();\n return null;\n}\n\n/**\n * True when the request may proceed through the edge/WAF layer: layer\n * disabled (empty allow-list), or the presented `X-Edge-Auth` token is in the\n * allow-list.\n */\nexport function isEdgeAuthorized(headers: IncomingMessage['headers'], edgeTokensSet: Set<string>): boolean {\n if (edgeTokensSet.size === 0) return true;\n const presented = extractEdgeToken(headers);\n return presented !== null && edgeTokensSet.has(presented);\n}\n\n/**\n * Builds a Cloudflare custom-rule (wirefilter) expression that BLOCKS any\n * request lacking a valid token, for the header (`authorization` or\n * `x-edge-auth`) matching the layer being enforced at the edge. Intended to\n * be pasted into a Cloudflare custom rule so the token check happens before\n * traffic ever reaches this process — the `edgeTokens()`/`isEdgeAuthorized`\n * pair above is the same policy enforced in-process as a fallback.\n *\n * CORS preflight (`OPTIONS`) is always allowed through so the browser's\n * preflight — which cannot carry the token — isn't blocked.\n */\nexport function buildWafRuleExpression(opts: {\n host?: string;\n tokens: string[];\n header: 'authorization' | 'x-edge-auth';\n}): string {\n if (opts.tokens.length === 0) {\n throw new Error('buildWafRuleExpression requires at least one token');\n }\n const headerName = opts.header.toLowerCase();\n const values = opts.tokens.map((t) => (opts.header === 'authorization' ? `Bearer ${t}` : t));\n const memberships = values.map((v) => `any(http.request.headers[\"${headerName}\"][*] eq \"${v}\")`);\n const notValid = memberships.length === 1 ? `not ${memberships[0]}` : `not (${memberships.join(' or ')})`;\n const hostPrefix = opts.host ? `http.host eq \"${opts.host}\" and ` : '';\n return `(${hostPrefix}http.request.method ne \"OPTIONS\" and ${notValid})`;\n}\n\n/**\n * Normalise an incoming request path so a redundant `/v1` an Anthropic client\n * appends to a base URL that already ends in `/v1` (optionally with a pack\n * segment) doesn't break routing.\n *\n * /v1/v1/messages → /v1/messages\n * /v1/stealth-requesty/v1/messages → /v1/stealth-requesty/messages\n * /v1/stealth-requesty/v1/models → /v1/stealth-requesty/models\n *\n * Without the pack-segment case the extra `/v1` breaks the `/v1/<pack>/<verb>`\n * match, the pack is silently lost, and the request falls back to the default\n * pack — the \"no usable models\" / \"Unable to resolve model\" failure a client\n * configured with `base_url = .../v1/<pack>` hits.\n */\nexport function normalizeProxyPath(pathname: string): string {\n return pathname\n .replace(/\\/+$/, '')\n .replace(/^\\/v1\\/v1(\\/|$)/, '/v1$1')\n .replace(/^(\\/v1\\/[^/]+)\\/v1(\\/|$)/, '$1$2');\n}\n\nlet _publicModels: boolean | null = null;\n/** Whether the default model-list path may be read unauthenticated (LLM_ENDPOINT_PUBLIC_MODELS truthy). */\nfunction publicModels(): boolean {\n if (_publicModels === null) {\n const v = (process.env.LLM_ENDPOINT_PUBLIC_MODELS ?? '').trim().toLowerCase();\n _publicModels = v === '1' || v === 'true' || v === 'yes' || v === 'on';\n }\n return _publicModels;\n}\n\nlet _passthroughThinking: boolean | null = null;\n/**\n * Whether a reasoning-only OpenAI response (`message.reasoning_content` set,\n * `message.content` empty) is surfaced to the client as an Anthropic\n * `thinking` block instead of an empty message (LLM_ENDPOINT_PASSTHROUGH_THINKING\n * truthy). Reasoning models on a tight `max_tokens` budget (Qwen3.6-based —\n * Bonsai 27B reproduced this live) can spend the whole budget \"thinking\" and\n * return no visible content at all; surfacing the reasoning at least shows\n * the caller what happened instead of a silent empty reply.\n */\nfunction passthroughThinking(): boolean {\n if (_passthroughThinking === null) {\n const v = (process.env.LLM_ENDPOINT_PASSTHROUGH_THINKING ?? '').trim().toLowerCase();\n _passthroughThinking = v === '1' || v === 'true' || v === 'yes' || v === 'on';\n }\n return _passthroughThinking;\n}\n\n/**\n * True only for the DEFAULT model-discovery path — `/v1/models` or `/models`,\n * never a pack-scoped list (`/v1/<pack>/models`). Lets opt-in public discovery\n * expose the default codename list without disclosing pack names.\n */\nexport function isPublicModelListPath(pathname: string): boolean {\n const p = normalizeProxyPath(pathname);\n return p === '/v1/models' || p === '/models';\n}\n\nconst server = createServer((req, res) => {\n // CORS & Options\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, x-api-key, Authorization, anthropic-version, X-Proxy-Access, X-Proxy-Pack, X-Proxy-Format, X-Edge-Auth');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n const rawUrl = req.url || '';\n const parsedUrl = new URL(rawUrl, `http://localhost:${PORT}`);\n // Le binary `claude` ajoute lui-même `/v1/messages` à ANTHROPIC_BASE_URL —\n // si celle-ci se termine déjà par `/v1` (config normale du proxy), la requête\n // arrive en `/v1/v1/messages`. `endsWith('/messages')` la route déjà\n // correctement plus bas, mais laisser le chemin brut dans les logs noie le\n // vrai souci (config base_url mal formée). Normalisé ici une fois pour\n // toutes — un `/v1/v1/...` redevient `/v1/...` pour le matching ET les logs.\n const urlPath = normalizeProxyPath(parsedUrl.pathname);\n\n // Discovery exemption — the DEFAULT model-list path may be read without a\n // token when LLM_ENDPOINT_PUBLIC_MODELS is set, so OpenAI-compatible clients\n // (e.g. Claude Desktop's launch-time model discovery) can populate their\n // selector. Only `/v1/models` (`/models`) — pack lists stay gated.\n const gateExempt = publicModels() && isPublicModelListPath(urlPath);\n\n // Loopback bypass — the local-queue batch emulation calls this proxy's own\n // /v1/messages over loopback and authenticates with a process-local token\n // instead of a normal access/edge token (see batches.ts).\n const internalLoopback = isInternalLoopbackRequest(req.headers);\n\n // Inbound access gate — 401 any non-preflight request without a valid token\n // when LLM_ENDPOINT_ACCESS_TOKENS is set. Gates discovery too (unless exempt\n // above), so pack config isn't readable unauthenticated.\n if (!gateExempt && !internalLoopback && !isAuthorized(req.headers, accessTokens())) {\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'authentication_error', message: 'Missing or invalid proxy access token.' } }));\n return;\n }\n\n // Edge/WAF token gate — independent of the inbound access gate above. Off\n // by default (unset LLM_ENDPOINT_EDGE_TOKENS); see buildWafRuleExpression\n // for enforcing the same policy at the edge instead of in-process.\n if (!gateExempt && !internalLoopback && !isEdgeAuthorized(req.headers, edgeTokens())) {\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'authentication_error', message: 'Missing or invalid edge token.' } }));\n return;\n }\n\n // ── Pack resolution ──────────────────────────────────────────────────────\n // Priority: header X-Proxy-Pack > URL path /v1/{pack}/messages > query param ?pack= > default\n let packId: string | null = null;\n\n // 1. Header personnalisé (Claude Desktop \"Custom inference headers\")\n const proxyPackHeader = req.headers['x-proxy-pack'];\n const proxyPackValue: string | null = (Array.isArray(proxyPackHeader) ? proxyPackHeader[0] : proxyPackHeader) || null;\n if (proxyPackValue) {\n if (getMergedPackIds().includes(proxyPackValue)) {\n packId = proxyPackValue;\n } else {\n console.warn(`[Proxy] Unknown pack \"${proxyPackValue}\" via X-Proxy-Pack header — returning 400.`);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: `Unknown pack \"${proxyPackValue}\" via X-Proxy-Pack. Available: ${getMergedPackIds().join(', ')}` } }));\n return;\n }\n }\n\n // 2. URL path /v1/{pack}/...\n if (!packId) {\n const packPathMatch = urlPath.match(/^\\/v1\\/([^\\/]+)(?:\\/messages(?:\\/batches(?:\\/[^/]+)?(?:\\/(?:results|cancel))?)?|\\/models|\\/chat\\/completions|\\/responses)?$/);\n if (packPathMatch) {\n const potentialPack = packPathMatch[1];\n const RESERVED_SEGMENTS = new Set(['v1', 'messages', 'models', 'packs', 'chat', 'responses', 'upstreams', 'endpoints']);\n if (potentialPack && !RESERVED_SEGMENTS.has(potentialPack)) {\n if (getMergedPackIds().includes(potentialPack)) {\n packId = potentialPack;\n } else {\n console.warn(`[Proxy] Unknown pack \"${potentialPack}\" via URL path — returning 400.`);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: `Unknown pack \"${potentialPack}\" in URL path. Available: ${getMergedPackIds().join(', ')}` } }));\n return;\n }\n }\n }\n }\n\n // 3. Query param ?pack=\n if (!packId) {\n const queryPack = parsedUrl.searchParams.get('pack');\n if (queryPack) {\n if (getMergedPackIds().includes(queryPack)) {\n packId = queryPack;\n } else {\n console.warn(`[Proxy] Unknown pack \"${queryPack}\" — returning 400.`);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: `Unknown pack \"${queryPack}\". Available: ${getMergedPackIds().join(', ')}` } }));\n return;\n }\n }\n }\n\n const { queryProvider, queryModelCode, queryTools, queryNoTools, headerTools, headerNoTools, headerExcludeTools, forcedAliasCode, anthropicFormat } =\n readQueryAndToolOptions(parsedUrl, req);\n\n // Anthropic-style format: relabel the resolved pack's routes with opaque\n // `claude-<family>-<sha>` ids for THIS request only. Every downstream\n // consumer (model listing + message routing) then sees the transformed pack.\n const resolvedPack = resolvePackMerged(packId);\n const activePack = anthropicFormat ? toAnthropicStyle(resolvedPack) : resolvedPack;\n\n console.log(\n `[Proxy] Incoming request: ${req.method} ${rawUrl}` +\n (urlPath !== parsedUrl.pathname.replace(/\\/+$/, '') ? ` (normalized: ${urlPath})` : '') +\n ` [pack: ${activePack.id}]`\n );\n\n // 0b. OpenAI Responses API facade for Codex custom providers\n if (req.method === 'POST' && urlPath.endsWith('/responses')) {\n handleResponsesRequest(req, res, {\n activePack,\n queryModelCode,\n queryProvider,\n queryTools,\n queryNoTools,\n headerTools,\n headerNoTools,\n headerExcludeTools,\n forcedAliasCode,\n });\n return;\n }\n\n // 0c. OpenAI chat/completions surface\n if (req.method === 'POST' && urlPath.endsWith('/chat/completions')) {\n handleChatCompletionsRequest(req, res, {\n activePack,\n queryProvider,\n queryTools,\n queryNoTools,\n headerTools,\n headerNoTools,\n headerExcludeTools,\n });\n return;\n }\n\n // 0. Endpoint /v1/packs pour la découverte des packs disponibles\n if (req.method === 'GET' && (urlPath === '/v1/packs' || urlPath === '/packs')) {\n const mergedRegistry = { ...PACK_REGISTRY, ...getLocalPacks() };\n const packsResponse = {\n object: 'list',\n data: Object.values(mergedRegistry).map((pack: ModelPack) => ({\n id: pack.id,\n label: pack.label,\n description: pack.description,\n model_count: Object.keys(pack.models).length,\n models: Object.entries(pack.models).map(([code, target]) => ({\n code,\n provider: target.provider,\n model: target.model,\n equivalent_claude_name: target.equivalentClaudeName,\n })),\n })),\n };\n console.log(`[Proxy] Returning pack list (${packsResponse.data.length} packs).`);\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(packsResponse));\n return;\n }\n\n // 0a. Hot-reload local packs from packs.local.json (POST). Gated by the same\n // access token as every other route (checked above). Re-reads + validates the\n // local envelope; unlike the fail-soft load path, an EXPLICIT reload gets a\n // hard 400 with the field-scoped errors so a bad edit is legible instead of\n // silently ignored. On success the cache is dropped and repopulated, and the\n // reloaded pack ids + count are returned.\n if (req.method === 'POST' && (urlPath === '/v1/packs/reload' || urlPath === '/packs/reload')) {\n const load = readLocalPacksFromDisk();\n if (load.errors.length > 0) {\n // Leave the previously-cached packs in place — a rejected reload must not\n // wipe a working config.\n console.warn(`[Proxy] Pack reload rejected — ${load.errors.length} validation error(s).`);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: 'Invalid packs.local.json', errors: load.errors } }));\n return;\n }\n resetLocalPacksCache();\n const localPacks = getLocalPacks(); // repopulate the cache from the now-validated file\n const packIds = getMergedPackIds();\n console.log(`[Proxy] Reloaded packs from ${load.path ?? '(no local file)'} — ${packIds.length} packs (${Object.keys(localPacks).length} local).`);\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({\n object: 'packs.reload',\n reloaded: true,\n source: load.path,\n local_pack_ids: Object.keys(localPacks),\n pack_ids: packIds,\n count: packIds.length,\n }));\n return;\n }\n\n // 0d. Per-upstream credential status (GET /v1/upstreams). Reports, for each\n // canonical upstream, how a credential WOULD resolve (linked profile / env /\n // none + method) WITHOUT returning a secret. `?probe=1` adds the profile-\n // source `present` boolean at the cost of a keychain read; the default view\n // stays mapping-only. Gated by the same access token as every route (checked\n // above) — NOT covered by the /v1/models public exemption.\n if (req.method === 'GET' && (urlPath === '/v1/upstreams' || urlPath === '/upstreams')) {\n const probe = parsedUrl.searchParams.get('probe') === '1';\n void handleUpstreamsStatus(res, { probe });\n return;\n }\n\n // 0e. Optional per-upstream live test (POST /v1/upstreams/:provider/test).\n // The cheapest authenticated call to the upstream; {ok, status, detail} or\n // {ok:null, reason:\"no-probe\"}. Gated like every other route.\n const upstreamTestMatch = urlPath.match(/^\\/(?:v1\\/)?upstreams\\/([^/]+)\\/test$/);\n if (req.method === 'POST' && upstreamTestMatch) {\n void handleUpstreamTest(res, upstreamTestMatch[1]!);\n return;\n }\n\n // 0f. Named-endpoint health (GET /v1/endpoints, /endpoints). Per endpoint:\n // {id, baseUrl (no credential), reachable, models, latencyMs} — forge (if\n // FORGE_BASE_URL is set) plus every valid entry from the endpoints file.\n // nebius is deliberately excluded (a hosted provider with a well-known\n // static catalog, not a local/LAN model server). A live check every call —\n // no cache — since a health endpoint reporting a 30s-stale \"reachable\" would\n // defeat its own purpose. Gated by the same access token as /v1/upstreams\n // (NOT covered by the /v1/models public exemption).\n if (req.method === 'GET' && (urlPath === '/v1/endpoints' || urlPath === '/endpoints')) {\n void handleEndpointsStatus(res);\n return;\n }\n\n // 1. Endpoint /v1/models pour la découverte des modèles\n // Supporte aussi /v1/{pack}/models pour la sélection de pack via URL path\n if (req.method === 'GET' && (urlPath === '/v1/models' || urlPath === '/models' || urlPath.endsWith('/models'))) {\n void (async () => {\n const isAnthropicStyle = req.headers['anthropic-version'] !== undefined || req.headers['x-api-key'] !== undefined;\n const mapping = buildMappingFromPack(activePack);\n const isLocalPack = Boolean(getLocalPacks()[activePack.id]);\n // Alias-bearing: a local pack, or an official pack transformed to Anthropic\n // style for this request — either exposes equivalentClaudeName as the id.\n const isAliasPack = isLocalPack || anthropicFormat;\n\n // forge's LoRA adapters (and every file-configured named endpoint's\n // models) live on the upstream server itself, not in any committed pack —\n // merge them live into the default pack's listing only, so a curated pack\n // (xai, coding, ...) still returns exactly its own models. No-op (empty\n // list) when FORGE_BASE_URL is unset / no endpoints are configured. An\n // unreachable endpoint is skipped with a warning already logged by its\n // probe — never a 500 for the whole listing.\n if (activePack.id === DEFAULT_PACK_ID) {\n const forgeIds = await fetchForgeModelIds();\n for (const id of forgeIds) {\n mapping[`forge/${id}`] = { provider: 'forge', model: id };\n }\n for (const endpoint of getConfiguredEndpoints()) {\n const { ids } = await probeFileEndpointModels(endpoint);\n for (const id of ids) {\n mapping[`${endpoint.id}/${id}`] = { provider: endpoint.id, model: id };\n }\n }\n }\n\n if (isAnthropicStyle) {\n // Format 100% Natif d'Anthropic Claude\n const anthropicModelsResponse = {\n data: Object.entries(mapping).map(([code, target]) => {\n const id = (isAliasPack && target.equivalentClaudeName) ? target.equivalentClaudeName : code;\n return {\n id,\n display_name: code,\n created_at: '2026-02-04T00:00:00Z',\n type: 'model',\n capabilities: {},\n // Champs officiels du schéma Anthropic ModelInfo (docs\n // /en/api/models-list) : max_input_tokens = fenêtre de contexte,\n // max_tokens = budget de sortie max. Absents si non vérifiés.\n ...(target.contextWindow !== undefined ? { max_input_tokens: target.contextWindow } : {}),\n ...(target.maxOutputTokens !== undefined ? { max_tokens: target.maxOutputTokens } : {}),\n };\n }),\n has_more: false,\n first_id: null,\n last_id: null\n };\n console.log(`[Proxy] Returning native Anthropic-formatted model list.`);\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(anthropicModelsResponse));\n return;\n } else {\n // Format OpenAI standardisé\n const openaiModelsResponse = {\n object: 'list',\n data: Object.entries(mapping).map(([code, target]) => ({\n id: code,\n object: 'model',\n created: 1718841600,\n owned_by: target.provider,\n // Verified per-route limits only — fields are absent when unknown.\n ...(target.contextWindow !== undefined ? { context_length: target.contextWindow } : {}),\n ...(target.maxOutputTokens !== undefined ? { max_completion_tokens: target.maxOutputTokens } : {}),\n }))\n };\n console.log(`[Proxy] Returning standard OpenAI-formatted model list.`);\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(openaiModelsResponse));\n return;\n }\n })();\n return;\n }\n\n // 1b. /v1/messages/batches* — matched before the generic '/messages' check\n // below, since a batches path never ends in exactly '/messages'.\n if (\n handleBatchesRequest(\n req,\n res,\n {\n activePack,\n parsedUrl,\n queryModelCode,\n queryProvider,\n forcedAliasCode,\n anthropicFormat,\n queryTools,\n queryNoTools,\n headerTools,\n headerNoTools,\n headerExcludeTools,\n },\n urlPath,\n )\n ) {\n return;\n }\n\n // 2. Traitement des messages\n if (req.method !== 'POST' || !urlPath.endsWith('/messages')) {\n res.writeHead(404, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'not_found', message: `Route not found` } }));\n return;\n }\n\n let body = '';\n req.on('data', chunk => {\n body += chunk;\n });\n\n req.on('end', async () => {\n try {\n const payload = JSON.parse(body);\n\n // Trouver la destination (Provider & Model)\n let resolvedTarget: { provider: string; model: string };\n try {\n resolvedTarget = resolveModelRoute(payload, {\n activePack,\n queryModelCode,\n queryProvider,\n forcedAliasCode,\n allowAliases: true,\n anthropicFormat,\n });\n } catch (e: any) {\n console.warn(`[Proxy] ${e.message}`);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: e.message } }));\n return;\n }\n\n // Détail de la requête : modèle résolu + budget de sortie demandé. Rend\n // visibles les tours \"warm-up\" (max_tokens:1) et les appels coûteux dans\n // les logs sans capture de corps.\n //\n // Short-circuit warm-up (LLM_ENDPOINT_SHORTCIRCUIT_WARMUP=1) : les clients\n // type Claude Desktop sondent chaque modèle du pack avec des pings\n // max_tokens<=1 non-streaming avant/autour du vrai message — chaque ping\n // paie un aller-retour upstream complet (1-6 s mesurés). Quand le flag est\n // actif, le proxy répond localement sans upstream : disponibilité du\n // modèle toujours \"OK\", rafale quasi gratuite.\n if (\n process.env.LLM_ENDPOINT_SHORTCIRCUIT_WARMUP === '1' &&\n payload.stream !== true &&\n typeof payload.max_tokens === 'number' && payload.max_tokens <= 1 &&\n Array.isArray(payload.messages) && payload.messages.length <= 2\n ) {\n console.log(`[Proxy] warm-up short-circuit: model=${resolvedTarget.provider}:${resolvedTarget.model} max_tokens=${payload.max_tokens} (no upstream call)`);\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({\n id: `msg_warmup_${Date.now().toString(36)}`,\n type: 'message',\n role: 'assistant',\n model: payload.model,\n content: [{ type: 'text', text: 'ok' }],\n stop_reason: 'end_turn',\n stop_sequence: null,\n usage: { input_tokens: 1, output_tokens: 1 },\n }));\n return;\n }\n {\n const mt = payload.max_tokens;\n const mtNote = (typeof mt === 'number' && mt <= 4) ? ' <== warm-up/1-token' : '';\n console.log(\n `[Proxy] req: model=${resolvedTarget.provider}:${resolvedTarget.model}` +\n ` max_tokens=${typeof mt === 'number' ? mt : 'unset'}` +\n ` stream=${payload.stream === true ? 'true' : 'false'}` +\n ` msgs=${Array.isArray(payload.messages) ? payload.messages.length : '?'}` +\n ` tools=${Array.isArray(payload.tools) ? payload.tools.length : 0}` +\n mtNote\n );\n }\n\n // Configuration de la requête sortante selon le provider résolu\n let hostname = '';\n let path = '';\n let port = 443;\n let protocol: 'http' | 'https' = 'https';\n let targetApiKey = '';\n let cred: UpstreamCredential | undefined;\n let headers: Record<string, string> = { 'Content-Type': 'application/json' };\n\n payload.model = resolvedTarget.model;\n // `<endpointId>@<device>` (DEVICES-PLAN item 2): the OTHER daemon's own\n // gateway resolves models against ITS endpoint id, with no `@device`\n // suffix — rewrite before it ever reaches `applyProviderOverride`'s\n // caller-visible model, same as the OpenAI chat/completions handler\n // below.\n const deviceRoute = parseDeviceProvider(resolvedTarget.provider);\n if (deviceRoute) payload.model = `${deviceRoute.endpointId}/${resolvedTarget.model}`;\n\n // Trimme les outils AVANT la transformation de forme propre à chaque provider\n // (ZAI/Groq mappent input_schema → function.parameters ; le trim doit voir la forme Anthropic).\n trimTools(payload, {\n provider: resolvedTarget.provider,\n queryTools,\n queryNoTools,\n headerTools,\n headerNoTools,\n headerExcludeTools,\n packToolsExclude: activePack.toolsExclude,\n packToolsAllow: activePack.toolsAllow,\n });\n\n // Configurable providers (forge, nebius, and every named endpoint from\n // the JSON file) share ONE dispatch branch instead of a switch case per\n // id — adding a named endpoint never needs a code change here. Handled\n // BEFORE the switch so an unmatched provider still falls through to the\n // switch's `default: moonshot` fallback exactly as before.\n const messagesConfigurableSpec = getConfigurableProviderSpec(resolvedTarget.provider);\n if (messagesConfigurableSpec) {\n const upstream = messagesConfigurableSpec.resolveUpstream();\n if (!upstream) {\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: messagesConfigurableSpec.unavailableMessage() } }));\n return;\n }\n hostname = upstream.hostname;\n port = upstream.port;\n protocol = upstream.protocol;\n path = `${upstream.pathPrefix}/chat/completions`;\n cred = await resolveUpstreamCredential(resolvedTarget.provider);\n targetApiKey = cred?.value ?? '';\n // A keyless-capable provider (forge, every file endpoint) must never\n // send a bare \"Bearer \" header; a required-key one (nebius) 401s below\n // before this matters if the value is empty.\n if (cred && cred.value) Object.assign(headers, buildUpstreamAuthHeaders(resolvedTarget.provider, cred));\n // The daemon's `/devices/:id/exec-stream` ALWAYS takes an outer POST\n // regardless of the real forwarded method — see that route's doc\n // comment in http-server.ts. This surface only ever reaches it via\n // chat/completions, so the real method is always POST too, but the\n // header is still required (the route 400s without it).\n if (deviceRoute) headers['x-agentproto-forward-method'] = 'POST';\n // adaptAnthropicToOpenAI drops `thinking` outright (OpenAI has no such\n // field) — capture it first so an explicit client `thinking:\n // {type:\"enabled\"}` can withhold a default `reasoning_effort` (e.g.\n // LM Studio's \"none\", which would otherwise cut reasoning to 0 tokens\n // even when the client asked for it).\n const clientThinkingEnabled = isRecord(payload.thinking) && payload.thinking.type === 'enabled';\n adaptAnthropicToOpenAI(payload);\n applyDefaultRequestFields(\n payload,\n messagesConfigurableSpec.defaultRequestFields,\n clientThinkingEnabled ? new Set(['reasoning_effort']) : undefined,\n );\n\n // Transformation des tools Anthropic (format OpenAI function) — même forme pour\n // tout upstream OpenAI-compatible configurable (forge/vLLM, nebius, endpoints file).\n if (payload.tools && Array.isArray(payload.tools)) {\n payload.tools = payload.tools.map((t: any) => {\n if (t.input_schema) {\n return {\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema\n }\n };\n }\n return t;\n });\n }\n } else {\n switch (resolvedTarget.provider) {\n case 'anthropic':\n // Anthropic natif — pas de transformation de forme requise.\n hostname = 'api.anthropic.com';\n path = '/v1/messages';\n cred = await resolveUpstreamCredential('anthropic');\n targetApiKey = cred?.value ?? '';\n if (cred) Object.assign(headers, buildUpstreamAuthHeaders('anthropic', cred));\n break;\n\n case 'openrouter':\n // OpenRouter expose un endpoint Anthropic NATIF (/api/v1/messages) qui renvoie le\n // format Anthropic (content/stop_reason) tel quel — indispensable pour le CLI `claude`\n // qui ne parse PAS le format OpenAI (sinon : \"malformed response HTTP 200\").\n // Aucune adaptation request/response : tools (input_schema), system, thinking,\n // tool_choice, stop_sequences passent en natif Anthropic côté OpenRouter.\n hostname = 'openrouter.ai';\n path = '/api/v1/messages';\n cred = await resolveUpstreamCredential('openrouter');\n targetApiKey = cred?.value ?? '';\n if (cred) Object.assign(headers, buildUpstreamAuthHeaders('openrouter', cred));\n headers['anthropic-version'] = '2023-06-01';\n break;\n\n case 'requesty':\n // Requesty expose aussi un endpoint Anthropic NATIF — servi à\n // /v1/messages (et NON /anthropic/v1/messages comme l'annonce leur\n // doc, qui 404). Même traitement qu'OpenRouter : aucune adaptation\n // request/response, tools/system/thinking passent en natif.\n hostname = 'router.requesty.ai';\n path = '/v1/messages';\n cred = await resolveUpstreamCredential('requesty');\n targetApiKey = cred?.value ?? '';\n if (cred) Object.assign(headers, buildUpstreamAuthHeaders('requesty', cred));\n headers['anthropic-version'] = '2023-06-01';\n break;\n\n case 'zai':\n hostname = 'open.bigmodel.cn';\n path = '/api/paas/v4/chat/completions'; // Zhipu AI standard path\n cred = await resolveUpstreamCredential('zai');\n targetApiKey = cred?.value ?? '';\n if (cred) Object.assign(headers, buildUpstreamAuthHeaders('zai', cred));\n adaptAnthropicToOpenAI(payload);\n\n // Transformation des tools Anthropic pour ZAI\n if (payload.tools && Array.isArray(payload.tools)) {\n payload.tools = payload.tools.map((t: any) => {\n if (t.input_schema) {\n return {\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema\n }\n };\n }\n return t;\n });\n }\n break;\n\n case 'groq':\n hostname = 'api.groq.com';\n path = '/openai/v1/chat/completions'; // Groq utilise l'API OpenAI standard\n cred = await resolveUpstreamCredential('groq');\n targetApiKey = cred?.value ?? '';\n if (cred) Object.assign(headers, buildUpstreamAuthHeaders('groq', cred));\n adaptAnthropicToOpenAI(payload);\n // Raisonnement modèle-aware — Groq a 3 familles aux APIs incompatibles :\n // - qwen/qwen3.6-27b : reasoning_effort:\"none\" coupe le raisonnement à la source\n // (sinon leak <think> + finish:length). Ne supporte PAS reasoning_format.\n // - gpt-oss-* : reasoning inclus par défaut (leak <think>). Pas de reasoning_format ;\n // include_reasoning:false supprime le raisonnement du output.\n // - llama-3.3-70b et modèles non-reasoning : AUCUN param reasoning (sinon 400).\n delete payload.reasoning_format;\n delete payload.reasoning_effort;\n delete payload.include_reasoning;\n if (resolvedTarget.model === 'qwen/qwen3.6-27b') {\n payload.reasoning_effort = 'none';\n } else if (resolvedTarget.model.startsWith('openai/gpt-oss')) {\n payload.include_reasoning = false;\n }\n\n // Transformation des tools Anthropic pour Groq\n if (payload.tools && Array.isArray(payload.tools)) {\n payload.tools = payload.tools.map((t: any) => {\n if (t.input_schema) {\n return {\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema\n }\n };\n }\n return t;\n });\n }\n break;\n\n case 'xai':\n hostname = 'api.x.ai';\n path = '/v1/chat/completions'; // xAI uses OpenAI-compatible API\n cred = await resolveUpstreamCredential('xai');\n targetApiKey = cred?.value ?? '';\n if (cred) Object.assign(headers, buildUpstreamAuthHeaders('xai', cred));\n adaptAnthropicToOpenAI(payload);\n\n // Transformation des tools Anthropic pour xAI (format OpenAI)\n if (payload.tools && Array.isArray(payload.tools)) {\n payload.tools = payload.tools.map((t: any) => {\n if (t.input_schema) {\n return {\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema\n }\n };\n }\n return t;\n });\n }\n break;\n\n case 'openai':\n hostname = 'api.openai.com';\n path = '/v1/chat/completions';\n cred = await resolveUpstreamCredential('openai');\n targetApiKey = cred?.value ?? '';\n if (cred) Object.assign(headers, buildUpstreamAuthHeaders('openai', cred));\n adaptAnthropicToOpenAI(payload);\n\n // Transformation des tools Anthropic pour OpenAI (format function)\n if (payload.tools && Array.isArray(payload.tools)) {\n payload.tools = payload.tools.map((t: any) => {\n if (t.input_schema) {\n return {\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema\n }\n };\n }\n return t;\n });\n }\n break;\n\n case 'moonshot':\n default:\n hostname = 'api.moonshot.ai';\n path = '/anthropic/v1/messages'; // Mode d'émulation Anthropic natif (Pas besoin de changer les tools)\n cred = await resolveUpstreamCredential('moonshot');\n targetApiKey = cred?.value ?? '';\n if (cred) Object.assign(headers, buildUpstreamAuthHeaders('moonshot', cred));\n headers['Accept'] = 'text/event-stream';\n\n if (!payload.max_tokens) {\n payload.max_tokens = 4096;\n }\n if (resolvedTarget.model === 'kimi-k2.7-code' && !payload.thinking) {\n payload.thinking = { type: 'enabled', budget_tokens: 4000 };\n }\n break;\n }\n }\n\n // Fail closed: buildUpstreamAuthHeaders returns null when a non-api-key\n // credential (e.g. a Claude subscription OAT) is resolved for a\n // non-anthropic upstream. The per-provider Object.assign above already\n // refused to emit it — but we must NOT fall through to an unauthenticated\n // https.request either. 401 before any request is sent.\n if (cred && buildUpstreamAuthHeaders(resolvedTarget.provider, cred) === null) {\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'authentication_error', message: `The resolved credential for provider \"${resolvedTarget.provider}\" cannot be used on this upstream (subscription/oauth credentials are only valid for the anthropic upstream).` } }));\n return;\n }\n\n // A configurable provider may declare its key optional (forge — a\n // private/self-hosted server); every other provider (including nebius)\n // requires one and 401s when absent, exactly as before.\n if (!targetApiKey && !isUpstreamKeyOptional(resolvedTarget.provider)) {\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'authentication_error', message: `No API key for provider \"${resolvedTarget.provider}\"` } }));\n return;\n }\n\n console.log(`[Proxy Sortant] Redirection vers ${resolvedTarget.provider} (${hostname}${path}) avec le modèle \"${payload.model}\"`);\n\n const options: RequestOptions = {\n hostname,\n port,\n path,\n method: 'POST',\n headers\n };\n\n // Budget de rejeu sur tour vide — voir isEmptyAnthropicTurn. Réservé aux\n // providers needsStrip ; décrémenté à chaque rejeu, jamais réarmé.\n let emptyTurnRetriesLeft =\n (resolvedTarget.provider === 'openrouter' || resolvedTarget.provider === 'requesty')\n ? resolveEmptyTurnRetries()\n : 0;\n\n const sendUpstream = (): void => {\n // Chronométrage du tour upstream : ttfb = premier octet de réponse,\n // total = fin du corps. Gate LLM_ENDPOINT_DEBUG_TIMING=1 — diagnostic,\n // pas du bruit de production.\n const upstreamStart = Date.now();\n let upstreamTtfbMs: number | null = null;\n const proxyReq = sendUpstreamRequest(protocol, options, (proxyRes) => {\n const status = proxyRes.statusCode || 200;\n if (upstreamTtfbMs === null) upstreamTtfbMs = Date.now() - upstreamStart;\n proxyRes.on('end', () => {\n if (process.env.LLM_ENDPOINT_DEBUG_TIMING === '1') {\n console.log(\n `[Proxy] upstream done: ${resolvedTarget.provider}:${resolvedTarget.model}` +\n ` status=${status} ttfb=${upstreamTtfbMs}ms total=${Date.now() - upstreamStart}ms` +\n ` stream=${payload.stream === true ? 'true' : 'false'}`\n );\n }\n });\n // Un statut d'erreur upstream était jusqu'ici invisible dans le log\n // (le body n'est jamais tracé) — un second listener 'data' n'interfère\n // pas avec la consommation du flux faite plus bas (pipe/buffer selon\n // le provider), Node délivre les mêmes chunks à chaque listener.\n if (status < 200 || status >= 300) {\n let errBody = '';\n proxyRes.on('data', (c: Buffer | string) => {\n if (errBody.length < 300) errBody += c.toString('utf8');\n });\n proxyRes.on('end', () => {\n console.error(\n `[Proxy] upstream error: ${resolvedTarget.provider}:${resolvedTarget.model}` +\n ` status=${status} body=${JSON.stringify(errBody.slice(0, 300))}`\n );\n });\n }\n const contentType = proxyRes.headers['content-type'] as string || '';\n const isStreaming = (payload.stream === true) && /text\\/event-stream/i.test(contentType);\n /** Rejoue le tour. Retourne false si le budget est épuisé. */\n const retryEmptyTurn = (): boolean => {\n if (status !== 200 || emptyTurnRetriesLeft <= 0) return false;\n emptyTurnRetriesLeft--;\n console.warn(\n `\\x1b[33m[Proxy] tour vide (end_turn sans texte ni tool_use) de ` +\n `${resolvedTarget.provider}:${resolvedTarget.model} — rejeu ` +\n `(${emptyTurnRetriesLeft} restant(s))\\x1b[0m`\n );\n proxyRes.resume(); // libère le socket avant de renvoyer\n sendUpstream();\n return true;\n };\n // OpenRouter renvoie des blocs thinking/redacted_thinking (signature vide) que le\n // CLI `claude` rejette pour les modèles courants → on les strip côté proxy.\n // Requesty a le même défaut (vérifié live : sference/* renvoie\n // {\"type\":\"thinking\",…,\"signature\":\"\"}), et c'est précisément par le pack local —\n // où le modèle porte un nom Claude — que le CLI applique ce rejet.\n const needsStrip =\n resolvedTarget.provider === 'openrouter' || resolvedTarget.provider === 'requesty';\n // Groq/ZAI/xAI/OpenAI/forge/nebius parlent OpenAI : convertir la réponse (JSON ou SSE) en Anthropic.\n const needsConvert = resolvedTarget.provider === 'groq' || resolvedTarget.provider === 'zai' || resolvedTarget.provider === 'xai' || resolvedTarget.provider === 'openai' || Boolean(getConfigurableProviderSpec(resolvedTarget.provider));\n\n if (needsConvert && !isStreaming) {\n const respHeaders = { ...proxyRes.headers };\n delete respHeaders['content-length'];\n delete respHeaders['transfer-encoding'];\n respHeaders['content-type'] = 'application/json';\n res.writeHead(status, respHeaders);\n let body = '';\n proxyRes.setEncoding('utf8');\n proxyRes.on('data', (c: string) => { body += c; });\n proxyRes.on('end', () => {\n res.end(openaiJsonToAnthropic(body || '{}'));\n });\n } else if (needsConvert && isStreaming) {\n const respHeaders = { ...proxyRes.headers };\n delete respHeaders['content-length'];\n respHeaders['content-type'] = 'text/event-stream';\n res.writeHead(status, respHeaders);\n const converter = new OpenAIToAnthropicStreamConverter();\n proxyRes.setEncoding('utf8');\n proxyRes.on('data', (c: string) => {\n for (const out of converter.push(c)) res.write(out);\n });\n proxyRes.on('end', () => {\n for (const out of converter.flush()) res.write(out);\n res.end();\n });\n } else if (needsStrip && !isStreaming) {\n // Non-streaming : bufferiser le body JSON, strip les blocs thinking, renvoyer.\n // writeHead est différé jusqu'après la décision de rejeu : une fois les\n // en-têtes envoyés, la réponse est engagée et le rejeu impossible.\n let body = '';\n proxyRes.setEncoding('utf8');\n proxyRes.on('data', (c: string) => { body += c; });\n proxyRes.on('end', () => {\n if (isEmptyAnthropicTurn(body) && retryEmptyTurn()) return;\n const respHeaders = { ...proxyRes.headers };\n delete respHeaders['content-length']; // on va reformer le body\n delete respHeaders['transfer-encoding'];\n res.writeHead(status, respHeaders);\n res.end(stripThinkingFromAnthropicJson(body || '{}'));\n });\n } else if (needsStrip && isStreaming) {\n // Streaming SSE : filtrer les events thinking en flux (indices contigus).\n //\n // Les events sont retenus jusqu'au PREMIER bloc réellement visible\n // (text/tool_use). Coût nul : les blocs thinking étant strippés, rien\n // ne partait vers le client pendant la phase de raisonnement de toute\n // façon — cette fenêtre est exactement celle où le tour vide se joue.\n // Passé ce point on est engagé et on repasse en flux direct.\n const stripper = new AnthropicThinkingStripper();\n const pending: string[] = [];\n let committed = false;\n const commit = (): void => {\n if (committed) return;\n committed = true;\n const respHeaders = { ...proxyRes.headers };\n delete respHeaders['content-length'];\n res.writeHead(status, respHeaders);\n for (const out of pending) res.write(out);\n pending.length = 0;\n };\n proxyRes.setEncoding('utf8');\n proxyRes.on('data', (c: string) => {\n for (const out of stripper.push(c)) {\n if (committed) res.write(out);\n else pending.push(out);\n }\n if (!committed && stripper.hasMeaningfulContent) commit();\n });\n proxyRes.on('end', () => {\n for (const out of stripper.flush()) {\n if (committed) res.write(out);\n else pending.push(out);\n }\n if (!committed && stripper.hasMeaningfulContent) commit();\n if (!committed) {\n // Rien de visible n'a été produit. Rejouer si c'est la signature\n // du tour vide ; sinon livrer le flux tel quel (message bien formé,\n // fût-il vide) plutôt que de laisser le client pendre.\n const emptyTurn = stripper.stopReason === 'end_turn';\n if (emptyTurn && retryEmptyTurn()) return;\n commit();\n }\n res.end();\n });\n } else {\n // Moonshot (Anthropic natif) : pipe brut inchangé.\n res.writeHead(status, proxyRes.headers);\n proxyRes.pipe(res);\n }\n });\n\n proxyReq.on('error', (err) => {\n console.error('[Proxy SORTANT error]', err);\n // Un rejeu peut échouer après qu'un essai précédent a engagé la réponse —\n // n'écrire l'erreur que si rien n'est encore parti.\n if (res.headersSent) { res.end(); return; }\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'api_error', message: err.message } }));\n });\n\n proxyReq.write(JSON.stringify(payload));\n proxyReq.end();\n };\n\n sendUpstream();\n\n } catch (e: any) {\n console.error('[Payload Error]', e);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: { type: 'invalid_request_error', message: e.message } }));\n }\n });\n});\n\n/** Le serveur HTTP du proxy (non démarré). Importable pour test/embed. */\nexport { server };\n\n/** Exporté pour les tests — voir la note sur le rejeu de tour vide. */\nexport { isEmptyAnthropicTurn, resolveEmptyTurnRetries };\n\n/** Exported for tests — reasoning_content passthrough (see passthroughThinking). */\nexport { openaiJsonToAnthropic };\n\n/** Exporté pour les tests — normalisation system/developer -> un seul message en tête. */\nexport { adaptAnthropicToOpenAI };\n\n/** Re-exported for the endpoints file config — see endpoints.ts. */\nexport {\n getConfiguredEndpoints,\n resetConfiguredEndpointsCache,\n resolveEndpointsFilePath,\n readEndpointsFromDisk,\n parseEndpointsConfig,\n type EndpointConfig,\n type EndpointDefaultRequestFields,\n type EndpointsFileLoad,\n} from './endpoints.js';\n\n/** Re-exported for local/LAN runtime connectors — see connectors.ts. */\nexport {\n CONNECTORS,\n CONNECTOR_IDS,\n DEFAULT_LOCAL_PORTS,\n connectorById,\n detectConnector,\n isConnectorId,\n type Connector,\n type ConnectorId,\n type ConnectorModel,\n type ConnectorModelState,\n type ConnectorQuirks,\n} from './connectors.js';\n\n/** Démarre le proxy sur `port` (défaut : {@link PORT}). Renvoie le serveur en écoute. */\nexport function start(port: number = PORT) {\n void resumeIncompleteLocalQueueBatches().catch((err: unknown) => {\n console.error('[Proxy][batches] boot reconciliation failed', err);\n });\n return server.listen(port, () => {\n console.log(`[Proxy Server] Live on http://localhost:${port}`);\n console.log(`[Proxy Server] Anthropic Messages, OpenAI Chat Completions, and OpenAI Responses surfaces configured.`);\n });\n}\n"]}
|