@probeo/anymodel 0.5.1 → 0.5.3

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/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts","../src/types.ts","../src/providers/registry.ts","../src/utils/model-parser.ts","../src/utils/validate.ts","../src/utils/retry.ts","../src/utils/rate-limiter.ts","../src/utils/transforms.ts","../src/router.ts","../src/utils/fetch-with-timeout.ts","../src/providers/openai.ts","../src/utils/id.ts","../src/providers/anthropic.ts","../src/providers/google.ts","../src/providers/perplexity.ts","../src/providers/custom.ts","../src/config.ts","../src/utils/generation-stats.ts","../src/utils/fs-io.ts","../src/batch/store.ts","../src/batch/manager.ts","../src/utils/token-estimate.ts","../src/providers/openai-batch.ts","../src/providers/anthropic-batch.ts","../src/providers/google-batch.ts","../src/client.ts","../src/cli.ts"],"sourcesContent":["import { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport { AnyModel } from './client.js';\nimport type { AnyModelConfig, ChatCompletionRequest, ChatCompletionChunk } from './types.js';\n\nexport interface ServerOptions {\n port?: number;\n host?: string;\n config?: AnyModelConfig;\n}\n\nfunction parseBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on('data', (chunk) => chunks.push(chunk));\n req.on('end', () => resolve(Buffer.concat(chunks).toString()));\n req.on('error', reject);\n });\n}\n\nfunction sendJSON(res: ServerResponse, status: number, body: unknown): void {\n res.writeHead(status, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(body));\n}\n\nfunction sendError(res: ServerResponse, status: number, message: string): void {\n sendJSON(res, status, { error: { code: status, message, metadata: {} } });\n}\n\nasync function sendSSE(res: ServerResponse, stream: AsyncIterable<ChatCompletionChunk>): Promise<void> {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n });\n\n for await (const chunk of stream) {\n res.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n }\n\n res.write('data: [DONE]\\n\\n');\n res.end();\n}\n\nexport function createAnyModelServer(options: ServerOptions = {}): ReturnType<typeof createServer> {\n const client = new AnyModel(options.config);\n const basePath = '/api/v1';\n\n const server = createServer(async (req, res) => {\n const url = new URL(req.url || '/', `http://${req.headers.host}`);\n const path = url.pathname;\n\n // CORS headers\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n try {\n // Health check\n if (path === '/health' && req.method === 'GET') {\n sendJSON(res, 200, { status: 'ok' });\n return;\n }\n\n // Chat completions\n if (path === `${basePath}/chat/completions` && req.method === 'POST') {\n const body = JSON.parse(await parseBody(req)) as ChatCompletionRequest;\n\n if (body.stream) {\n const stream = await client.chat.completions.create(body) as AsyncIterable<ChatCompletionChunk>;\n await sendSSE(res, stream);\n } else {\n const response = await client.chat.completions.create(body);\n sendJSON(res, 200, response);\n }\n return;\n }\n\n // Models list\n if (path === `${basePath}/models` && req.method === 'GET') {\n const provider = url.searchParams.get('provider') || undefined;\n const models = await client.models.list({ provider });\n sendJSON(res, 200, { object: 'list', data: models });\n return;\n }\n\n // Generation stats\n if (path.startsWith(`${basePath}/generation/`) && req.method === 'GET') {\n const id = path.substring(`${basePath}/generation/`.length);\n const stats = client.generation.get(id);\n if (!stats) {\n sendError(res, 404, `Generation ${id} not found`);\n return;\n }\n sendJSON(res, 200, stats);\n return;\n }\n\n // Batch endpoints\n if (path === `${basePath}/batches` && req.method === 'POST') {\n const body = JSON.parse(await parseBody(req));\n const batch = await client.batches.create(body);\n sendJSON(res, 201, batch);\n return;\n }\n\n if (path === `${basePath}/batches` && req.method === 'GET') {\n const batches = await client.batches.list();\n sendJSON(res, 200, { object: 'list', data: batches });\n return;\n }\n\n if (path.startsWith(`${basePath}/batches/`) && req.method === 'GET') {\n const parts = path.substring(`${basePath}/batches/`.length).split('/');\n const id = parts[0];\n\n if (parts[1] === 'results') {\n const results = await client.batches.results(id);\n sendJSON(res, 200, results);\n return;\n }\n\n const batch = await client.batches.get(id);\n if (!batch) {\n sendError(res, 404, `Batch ${id} not found`);\n return;\n }\n sendJSON(res, 200, batch);\n return;\n }\n\n if (path.startsWith(`${basePath}/batches/`) && req.method === 'POST') {\n const parts = path.substring(`${basePath}/batches/`.length).split('/');\n const id = parts[0];\n\n if (parts[1] === 'cancel') {\n const batch = await client.batches.cancel(id);\n sendJSON(res, 200, batch);\n return;\n }\n }\n\n sendError(res, 404, `Not found: ${path}`);\n } catch (err: any) {\n const code = err?.code || 500;\n const message = err?.message || 'Internal server error';\n sendError(res, code, message);\n }\n });\n\n return server;\n}\n\nexport function startServer(options: ServerOptions = {}): void {\n const port = options.port ?? 4141;\n const host = options.host ?? '0.0.0.0';\n\n const server = createAnyModelServer(options);\n\n server.listen(port, host, () => {\n console.log(`@probeo/anymodel server running at http://${host}:${port}`);\n console.log(`API base: http://${host}:${port}/api/v1`);\n console.log('');\n console.log('Endpoints:');\n console.log(' POST /api/v1/chat/completions');\n console.log(' GET /api/v1/models');\n console.log(' GET /api/v1/generation/:id');\n console.log(' POST /api/v1/batches');\n console.log(' GET /api/v1/batches');\n console.log(' GET /api/v1/batches/:id');\n console.log(' GET /api/v1/batches/:id/results');\n console.log(' POST /api/v1/batches/:id/cancel');\n console.log(' GET /health');\n });\n}\n","// ─── Messages ────────────────────────────────────────────────────────────────\n\nexport type Role = 'system' | 'user' | 'assistant' | 'tool';\n\nexport interface Message {\n role: Role;\n content: string | ContentPart[];\n name?: string;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n}\n\nexport interface ContentPart {\n type: 'text' | 'image_url';\n text?: string;\n image_url?: { url: string; detail?: 'auto' | 'low' | 'high' };\n}\n\n// ─── Tools ───────────────────────────────────────────────────────────────────\n\nexport interface Tool {\n type: 'function';\n function: {\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n };\n}\n\nexport type ToolChoice =\n | 'none'\n | 'auto'\n | 'required'\n | { type: 'function'; function: { name: string } };\n\nexport interface ToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\n// ─── Response Format ─────────────────────────────────────────────────────────\n\nexport type ResponseFormat =\n | { type: 'text' }\n | { type: 'json_object' }\n | { type: 'json_schema'; json_schema: { name: string; schema: Record<string, unknown>; strict?: boolean } };\n\n// ─── Chat Completion Request ─────────────────────────────────────────────────\n\nexport interface ProviderPreferences {\n order?: string[];\n only?: string[];\n ignore?: string[];\n allow_fallbacks?: boolean;\n require_parameters?: boolean;\n sort?: 'price' | 'throughput' | 'latency';\n}\n\nexport interface ChatCompletionRequest {\n // Required\n model: string;\n messages: Message[];\n\n // Standard optional\n max_tokens?: number;\n temperature?: number;\n top_p?: number;\n top_k?: number;\n frequency_penalty?: number;\n presence_penalty?: number;\n repetition_penalty?: number;\n seed?: number;\n stop?: string | string[];\n stream?: boolean;\n logprobs?: boolean;\n top_logprobs?: number;\n response_format?: ResponseFormat;\n tools?: Tool[];\n tool_choice?: ToolChoice;\n user?: string;\n service_tier?: 'auto' | 'flex';\n\n // Anymodel-specific (mirrors OpenRouter)\n models?: string[];\n route?: 'fallback';\n transforms?: string[];\n provider?: ProviderPreferences;\n}\n\n// ─── Chat Completion Response ────────────────────────────────────────────────\n\nexport type FinishReason = 'stop' | 'length' | 'tool_calls' | 'content_filter' | 'error';\n\nexport interface Usage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n}\n\nexport interface ChatCompletionChoice {\n index: number;\n message: Message;\n finish_reason: FinishReason;\n logprobs?: unknown;\n}\n\nexport interface ChatCompletion {\n id: string;\n object: 'chat.completion';\n created: number;\n model: string;\n choices: ChatCompletionChoice[];\n usage: Usage;\n}\n\n// ─── Streaming ───────────────────────────────────────────────────────────────\n\nexport interface ChunkDelta {\n role?: Role;\n content?: string;\n tool_calls?: Partial<ToolCall>[];\n}\n\nexport interface ChunkChoice {\n index: number;\n delta: ChunkDelta;\n finish_reason: FinishReason | null;\n logprobs?: unknown;\n}\n\nexport interface ChatCompletionChunk {\n id: string;\n object: 'chat.completion.chunk';\n created: number;\n model: string;\n choices: ChunkChoice[];\n usage?: Usage;\n}\n\n// ─── Models ──────────────────────────────────────────────────────────────────\n\nexport interface ModelPricing {\n prompt: string;\n completion: string;\n}\n\nexport interface ModelArchitecture {\n modality: string;\n input_modalities: string[];\n output_modalities: string[];\n tokenizer: string;\n}\n\nexport interface ModelTopProvider {\n context_length: number;\n max_completion_tokens: number;\n is_moderated: boolean;\n}\n\nexport interface ModelInfo {\n id: string;\n name: string;\n created: number;\n description: string;\n context_length: number;\n pricing: ModelPricing;\n architecture: ModelArchitecture;\n top_provider: ModelTopProvider;\n supported_parameters: string[];\n}\n\n// ─── Generation Stats ────────────────────────────────────────────────────────\n\nexport interface GenerationStats {\n id: string;\n model: string;\n provider_name: string;\n total_cost: number;\n tokens_prompt: number;\n tokens_completion: number;\n latency: number;\n generation_time: number;\n created_at: string;\n finish_reason: FinishReason;\n streamed: boolean;\n}\n\n// ─── Errors ──────────────────────────────────────────────────────────────────\n\nexport interface AnyModelErrorMetadata {\n provider_name?: string;\n raw?: unknown;\n}\n\nexport class AnyModelError extends Error {\n readonly code: number;\n readonly metadata: AnyModelErrorMetadata;\n\n constructor(code: number, message: string, metadata: AnyModelErrorMetadata = {}) {\n super(message);\n this.name = 'AnyModelError';\n this.code = code;\n this.metadata = metadata;\n }\n\n toJSON() {\n return {\n error: {\n code: this.code,\n message: this.message,\n metadata: this.metadata,\n },\n };\n }\n}\n\n// ─── Batch ───────────────────────────────────────────────────────────────────\n\nexport type BatchStatus = 'pending' | 'processing' | 'completed' | 'failed' | 'cancelled';\nexport type BatchMode = 'native' | 'concurrent';\n\nexport interface BatchRequestItem {\n custom_id: string;\n messages: Message[];\n max_tokens?: number;\n temperature?: number;\n top_p?: number;\n top_k?: number;\n stop?: string | string[];\n response_format?: ResponseFormat;\n tools?: Tool[];\n tool_choice?: ToolChoice;\n}\n\nexport interface BatchCreateRequest {\n model: string;\n requests: BatchRequestItem[];\n options?: {\n temperature?: number;\n max_tokens?: number;\n top_p?: number;\n top_k?: number;\n stop?: string | string[];\n response_format?: ResponseFormat;\n tools?: Tool[];\n tool_choice?: ToolChoice;\n };\n webhook?: string;\n}\n\nexport interface BatchObject {\n id: string;\n object: 'batch';\n status: BatchStatus;\n model: string;\n provider_name: string;\n batch_mode: BatchMode;\n total: number;\n completed: number;\n failed: number;\n created_at: string;\n completed_at: string | null;\n expires_at: string | null;\n}\n\nexport interface BatchResultItem {\n custom_id: string;\n status: 'success' | 'error';\n response: ChatCompletion | null;\n error: { code: number; message: string } | null;\n}\n\nexport interface BatchUsageSummary {\n total_prompt_tokens: number;\n total_completion_tokens: number;\n estimated_cost: number;\n}\n\nexport interface BatchResults {\n id: string;\n status: BatchStatus;\n results: BatchResultItem[];\n usage_summary: BatchUsageSummary;\n}\n\n// ─── Config ──────────────────────────────────────────────────────────────────\n\nexport interface ProviderConfig {\n apiKey?: string;\n defaultModel?: string;\n}\n\nexport interface CustomProviderConfig {\n baseURL: string;\n apiKey?: string;\n models?: string[];\n}\n\nexport interface AnyModelConfig {\n anthropic?: ProviderConfig;\n openai?: ProviderConfig;\n google?: ProviderConfig;\n mistral?: ProviderConfig;\n groq?: ProviderConfig;\n deepseek?: ProviderConfig;\n xai?: ProviderConfig;\n together?: ProviderConfig;\n fireworks?: ProviderConfig;\n perplexity?: ProviderConfig;\n ollama?: ProviderConfig & { baseURL?: string };\n custom?: Record<string, CustomProviderConfig>;\n aliases?: Record<string, string>;\n defaults?: {\n temperature?: number;\n max_tokens?: number;\n retries?: number;\n timeout?: number;\n transforms?: string[];\n };\n routing?: {\n fallback_order?: string[];\n allow_fallbacks?: boolean;\n };\n batch?: {\n dir?: string;\n pollInterval?: number;\n concurrencyFallback?: number;\n retentionDays?: number;\n };\n io?: {\n readConcurrency?: number;\n writeConcurrency?: number;\n };\n}\n","import type { ProviderAdapter } from './adapter.js';\nimport { AnyModelError } from '../types.js';\n\nexport class ProviderRegistry {\n private adapters = new Map<string, ProviderAdapter>();\n\n register(slug: string, adapter: ProviderAdapter): void {\n if (this.adapters.has(slug)) {\n throw new AnyModelError(500, `Provider '${slug}' is already registered`);\n }\n this.adapters.set(slug, adapter);\n }\n\n get(slug: string): ProviderAdapter {\n const adapter = this.adapters.get(slug);\n if (!adapter) {\n throw new AnyModelError(400, `Provider '${slug}' not configured`);\n }\n return adapter;\n }\n\n has(slug: string): boolean {\n return this.adapters.has(slug);\n }\n\n list(): string[] {\n return Array.from(this.adapters.keys());\n }\n\n all(): ProviderAdapter[] {\n return Array.from(this.adapters.values());\n }\n}\n","import { AnyModelError } from '../types.js';\n\nexport interface ParsedModel {\n provider: string;\n model: string;\n}\n\nexport function parseModelString(model: string, aliases?: Record<string, string>): ParsedModel {\n // Check aliases first\n if (aliases && model in aliases) {\n model = aliases[model];\n }\n\n const slashIndex = model.indexOf('/');\n if (slashIndex === -1) {\n throw new AnyModelError(\n 400,\n `Model must be in provider/model format or be a valid alias. Got: '${model}'`\n );\n }\n\n const provider = model.substring(0, slashIndex);\n const modelId = model.substring(slashIndex + 1);\n\n if (!provider) {\n throw new AnyModelError(400, `Invalid model string: missing provider in '${model}'`);\n }\n if (!modelId) {\n throw new AnyModelError(400, `Invalid model string: missing model ID in '${model}'`);\n }\n\n return { provider, model: modelId };\n}\n","import { AnyModelError } from '../types.js';\nimport type { ChatCompletionRequest } from '../types.js';\n\nexport function validateRequest(request: ChatCompletionRequest): void {\n if (!request.model && !request.models?.length) {\n throw new AnyModelError(400, 'Missing required field: model');\n }\n\n if (!request.messages || !Array.isArray(request.messages) || request.messages.length === 0) {\n throw new AnyModelError(400, 'Missing or empty required field: messages');\n }\n\n if (request.temperature !== undefined && (request.temperature < 0 || request.temperature > 2)) {\n throw new AnyModelError(400, 'temperature must be between 0.0 and 2.0');\n }\n\n if (request.top_p !== undefined && (request.top_p < 0 || request.top_p > 1)) {\n throw new AnyModelError(400, 'top_p must be between 0.0 and 1.0');\n }\n\n if (request.top_logprobs !== undefined && !request.logprobs) {\n throw new AnyModelError(400, 'top_logprobs requires logprobs: true');\n }\n\n if (request.top_logprobs !== undefined && (request.top_logprobs < 0 || request.top_logprobs > 20)) {\n throw new AnyModelError(400, 'top_logprobs must be between 0 and 20');\n }\n\n if (request.stop !== undefined) {\n const stops = Array.isArray(request.stop) ? request.stop : [request.stop];\n if (stops.length > 4) {\n throw new AnyModelError(400, 'stop may have at most 4 sequences');\n }\n }\n\n if (request.models && request.models.length > 0 && request.route && request.route !== 'fallback') {\n throw new AnyModelError(400, `Invalid route: '${request.route}'. Only 'fallback' is supported.`);\n }\n}\n","import { AnyModelError } from '../types.js';\n\nexport interface RetryOptions {\n maxRetries: number;\n baseDelay: number; // ms\n maxDelay: number; // ms\n}\n\nconst DEFAULT_RETRY: RetryOptions = {\n maxRetries: 2,\n baseDelay: 500,\n maxDelay: 10000,\n};\n\n// Retryable status codes\nconst RETRYABLE_CODES = new Set([429, 502, 503, 529]);\n\nfunction isRetryable(error: unknown): boolean {\n if (error instanceof AnyModelError) {\n return RETRYABLE_CODES.has(error.code);\n }\n return false;\n}\n\nfunction getRetryAfter(error: unknown): number | null {\n if (error instanceof AnyModelError && error.metadata.raw) {\n const raw = error.metadata.raw as any;\n // Check for retry-after header value stored in metadata\n if (raw?.retry_after) return Number(raw.retry_after) * 1000;\n if (raw?.headers?.['retry-after']) return Number(raw.headers['retry-after']) * 1000;\n }\n return null;\n}\n\nfunction computeDelay(attempt: number, options: RetryOptions, error: unknown): number {\n const retryAfter = getRetryAfter(error);\n if (retryAfter && retryAfter > 0) {\n return Math.min(retryAfter, options.maxDelay);\n }\n // Exponential backoff with jitter\n const exponential = options.baseDelay * Math.pow(2, attempt);\n const jitter = exponential * 0.2 * Math.random();\n return Math.min(exponential + jitter, options.maxDelay);\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: Partial<RetryOptions> = {},\n): Promise<T> {\n const opts = { ...DEFAULT_RETRY, ...options };\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n if (attempt >= opts.maxRetries || !isRetryable(error)) {\n throw error;\n }\n\n const delay = computeDelay(attempt, opts, error);\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}\n","/**\n * Per-provider rate limit tracker.\n * Tracks rate limit state from provider response headers and 429 errors.\n */\nexport interface RateLimitState {\n provider: string;\n remaining: number | null;\n resetAt: number | null; // epoch ms\n retryAfter: number | null; // ms\n lastUpdated: number;\n}\n\nexport class RateLimitTracker {\n private state = new Map<string, RateLimitState>();\n\n /**\n * Update rate limit state from response headers.\n */\n updateFromHeaders(provider: string, headers: Record<string, string>): void {\n const state = this.getOrCreate(provider);\n\n const remaining = headers['x-ratelimit-remaining'] || headers['x-ratelimit-remaining-requests'];\n if (remaining !== undefined) {\n state.remaining = parseInt(remaining, 10);\n }\n\n const reset = headers['x-ratelimit-reset'] || headers['x-ratelimit-reset-requests'];\n if (reset !== undefined) {\n // Could be epoch seconds or ISO date\n const parsed = Number(reset);\n state.resetAt = parsed > 1e12 ? parsed : parsed * 1000;\n }\n\n const retryAfter = headers['retry-after'];\n if (retryAfter !== undefined) {\n state.retryAfter = Number(retryAfter) * 1000;\n }\n\n state.lastUpdated = Date.now();\n }\n\n /**\n * Record a 429 for a provider.\n */\n recordRateLimit(provider: string, retryAfterMs?: number): void {\n const state = this.getOrCreate(provider);\n state.remaining = 0;\n if (retryAfterMs) {\n state.retryAfter = retryAfterMs;\n state.resetAt = Date.now() + retryAfterMs;\n }\n state.lastUpdated = Date.now();\n }\n\n /**\n * Check if a provider is currently rate-limited.\n */\n isRateLimited(provider: string): boolean {\n const state = this.state.get(provider);\n if (!state) return false;\n\n // Check remaining count\n if (state.remaining === 0 && state.resetAt) {\n return Date.now() < state.resetAt;\n }\n\n return false;\n }\n\n /**\n * Get ms until rate limit resets for a provider.\n */\n getWaitTime(provider: string): number {\n const state = this.state.get(provider);\n if (!state?.resetAt) return 0;\n\n const wait = state.resetAt - Date.now();\n return Math.max(0, wait);\n }\n\n /**\n * Get state for a provider.\n */\n getState(provider: string): RateLimitState | undefined {\n return this.state.get(provider);\n }\n\n private getOrCreate(provider: string): RateLimitState {\n let state = this.state.get(provider);\n if (!state) {\n state = {\n provider,\n remaining: null,\n resetAt: null,\n retryAfter: null,\n lastUpdated: Date.now(),\n };\n this.state.set(provider, state);\n }\n return state;\n }\n}\n","import type { Message } from '../types.js';\n\n/**\n * Middle-out transform: when messages exceed a token budget,\n * remove messages from the middle of the conversation, preserving\n * the system prompt (first) and most recent messages (last).\n *\n * This is a character-based approximation (4 chars ≈ 1 token).\n */\nconst CHARS_PER_TOKEN = 4;\n\nexport function middleOut(messages: Message[], maxTokens: number): Message[] {\n if (messages.length <= 2) return messages;\n\n const maxChars = maxTokens * CHARS_PER_TOKEN;\n\n // Calculate total content length\n function messageLength(msg: Message): number {\n const content = typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content);\n return content.length + 20; // overhead for role, etc.\n }\n\n const totalChars = messages.reduce((sum, m) => sum + messageLength(m), 0);\n if (totalChars <= maxChars) return messages;\n\n // Separate system messages from conversation\n const systemMessages = messages.filter(m => m.role === 'system');\n const conversationMessages = messages.filter(m => m.role !== 'system');\n\n if (conversationMessages.length <= 2) return messages;\n\n const systemChars = systemMessages.reduce((sum, m) => sum + messageLength(m), 0);\n const budgetForConversation = maxChars - systemChars;\n\n if (budgetForConversation <= 0) return [...systemMessages, conversationMessages[conversationMessages.length - 1]];\n\n // Keep messages from both ends, removing from the middle\n const kept: Message[] = [];\n let usedChars = 0;\n\n // Always keep the last few messages (recency is most important)\n const tail: Message[] = [];\n let tailChars = 0;\n for (let i = conversationMessages.length - 1; i >= 0; i--) {\n const len = messageLength(conversationMessages[i]);\n if (tailChars + len > budgetForConversation * 0.7) break;\n tail.unshift(conversationMessages[i]);\n tailChars += len;\n }\n\n // Fill from the head with remaining budget\n const headBudget = budgetForConversation - tailChars;\n const headEnd = conversationMessages.length - tail.length;\n for (let i = 0; i < headEnd; i++) {\n const len = messageLength(conversationMessages[i]);\n if (usedChars + len > headBudget) break;\n kept.push(conversationMessages[i]);\n usedChars += len;\n }\n\n return [...systemMessages, ...kept, ...tail];\n}\n\n/**\n * Apply a named transform to the request messages.\n */\nexport function applyTransform(\n name: string,\n messages: Message[],\n contextLength: number,\n): Message[] {\n if (name === 'middle-out') {\n return middleOut(messages, contextLength);\n }\n return messages;\n}\n","import type {\n ChatCompletionRequest,\n ChatCompletion,\n ChatCompletionChunk,\n AnyModelConfig,\n ProviderPreferences,\n} from './types.js';\nimport { AnyModelError } from './types.js';\nimport type { ProviderRegistry } from './providers/registry.js';\nimport type { ProviderAdapter } from './providers/adapter.js';\nimport { parseModelString } from './utils/model-parser.js';\nimport { validateRequest } from './utils/validate.js';\nimport { withRetry } from './utils/retry.js';\nimport { RateLimitTracker } from './utils/rate-limiter.js';\nimport { applyTransform } from './utils/transforms.js';\n\n// Parameters that can be stripped if unsupported by a provider\nconst STRIPPABLE_PARAMS = [\n 'temperature', 'max_tokens', 'top_p', 'top_k',\n 'frequency_penalty', 'presence_penalty', 'repetition_penalty',\n 'seed', 'stop', 'logprobs', 'top_logprobs', 'response_format',\n 'tools', 'tool_choice', 'user',\n] as const;\n\nexport class Router {\n private rateLimiter = new RateLimitTracker();\n\n constructor(\n private registry: ProviderRegistry,\n private aliases?: Record<string, string>,\n private config?: AnyModelConfig,\n ) {}\n\n /**\n * Strip parameters that the target provider doesn't support.\n */\n private stripUnsupported(request: ChatCompletionRequest, adapter: ProviderAdapter): ChatCompletionRequest {\n const cleaned = { ...request };\n for (const param of STRIPPABLE_PARAMS) {\n if ((cleaned as any)[param] !== undefined && !adapter.supportsParameter(param)) {\n delete (cleaned as any)[param];\n }\n }\n return cleaned;\n }\n\n /**\n * Apply transforms (e.g., middle-out) to the request messages.\n */\n private applyTransforms(request: ChatCompletionRequest): ChatCompletionRequest {\n const transforms = request.transforms || this.config?.defaults?.transforms;\n if (!transforms || transforms.length === 0) return request;\n\n let messages = [...request.messages];\n // Default context length for transform budget\n const contextLength = 128000;\n\n for (const transform of transforms) {\n messages = applyTransform(transform, messages, contextLength);\n }\n\n return { ...request, messages };\n }\n\n /**\n * Order models based on provider preferences.\n */\n private applyProviderPreferences(\n models: string[],\n prefs?: ProviderPreferences,\n ): string[] {\n if (!prefs) return models;\n\n let filtered = [...models];\n\n // Apply 'only' filter — restrict to these providers\n if (prefs.only && prefs.only.length > 0) {\n const onlySet = new Set(prefs.only);\n filtered = filtered.filter(m => {\n const { provider } = parseModelString(m, this.aliases);\n return onlySet.has(provider);\n });\n }\n\n // Apply 'ignore' filter — exclude these providers\n if (prefs.ignore && prefs.ignore.length > 0) {\n const ignoreSet = new Set(prefs.ignore);\n filtered = filtered.filter(m => {\n const { provider } = parseModelString(m, this.aliases);\n return !ignoreSet.has(provider);\n });\n }\n\n // Apply 'order' — reorder to prefer specified providers first\n if (prefs.order && prefs.order.length > 0) {\n const orderMap = new Map(prefs.order.map((p, i) => [p, i]));\n filtered.sort((a, b) => {\n const aProvider = parseModelString(a, this.aliases).provider;\n const bProvider = parseModelString(b, this.aliases).provider;\n const aOrder = orderMap.get(aProvider) ?? Infinity;\n const bOrder = orderMap.get(bProvider) ?? Infinity;\n return aOrder - bOrder;\n });\n }\n\n // Apply 'require_parameters' — skip providers that don't support all used params\n if (prefs.require_parameters) {\n filtered = filtered.filter(m => {\n try {\n const { provider } = parseModelString(m, this.aliases);\n const adapter = this.registry.get(provider);\n // No way to know which params will be used without looking at the request,\n // so this is handled at dispatch time by stripUnsupported\n return adapter !== undefined;\n } catch {\n return false;\n }\n });\n }\n\n // Skip rate-limited providers\n filtered = filtered.filter(m => {\n const { provider } = parseModelString(m, this.aliases);\n return !this.rateLimiter.isRateLimited(provider);\n });\n\n return filtered;\n }\n\n private getRetryOptions(): { maxRetries: number } {\n return {\n maxRetries: this.config?.defaults?.retries ?? 2,\n };\n }\n\n async complete(request: ChatCompletionRequest): Promise<ChatCompletion> {\n validateRequest(request);\n\n // Apply transforms\n const transformed = this.applyTransforms(request);\n\n // Fallback routing\n if (transformed.models && transformed.models.length > 0 && transformed.route === 'fallback') {\n return this.completeWithFallback(transformed);\n }\n\n const { provider, model } = parseModelString(transformed.model, this.aliases);\n const adapter = this.registry.get(provider);\n const resolvedRequest = this.stripUnsupported({ ...transformed, model }, adapter);\n\n return withRetry(\n () => adapter.sendRequest(resolvedRequest),\n this.getRetryOptions(),\n );\n }\n\n async stream(request: ChatCompletionRequest): Promise<AsyncIterable<ChatCompletionChunk>> {\n validateRequest(request);\n\n const transformed = this.applyTransforms(request);\n\n if (transformed.models && transformed.models.length > 0 && transformed.route === 'fallback') {\n return this.streamWithFallback(transformed);\n }\n\n const { provider, model } = parseModelString(transformed.model, this.aliases);\n const adapter = this.registry.get(provider);\n const resolvedRequest = this.stripUnsupported({ ...transformed, model, stream: true }, adapter);\n\n return withRetry(\n () => adapter.sendStreamingRequest(resolvedRequest),\n this.getRetryOptions(),\n );\n }\n\n private async completeWithFallback(request: ChatCompletionRequest): Promise<ChatCompletion> {\n let models = request.models!;\n const errors: Array<{ model: string; error: AnyModelError }> = [];\n\n // Apply provider preferences to order/filter models\n models = this.applyProviderPreferences(models, request.provider);\n\n for (const modelStr of models) {\n try {\n const { provider, model } = parseModelString(modelStr, this.aliases);\n const adapter = this.registry.get(provider);\n const resolvedRequest = this.stripUnsupported(\n { ...request, model, models: undefined, route: undefined },\n adapter,\n );\n\n const response = await withRetry(\n () => adapter.sendRequest(resolvedRequest),\n this.getRetryOptions(),\n );\n\n response.model = modelStr;\n return response;\n } catch (err) {\n const error = err instanceof AnyModelError\n ? err\n : new AnyModelError(500, String(err));\n\n // Track rate limits\n if (error.code === 429) {\n const { provider } = parseModelString(modelStr, this.aliases);\n this.rateLimiter.recordRateLimit(provider);\n }\n\n errors.push({ model: modelStr, error });\n }\n }\n\n const lastError = errors[errors.length - 1];\n throw new AnyModelError(lastError.error.code, lastError.error.message, {\n ...lastError.error.metadata,\n raw: {\n attempts: errors.map(e => ({\n model: e.model,\n code: e.error.code,\n message: e.error.message,\n })),\n },\n });\n }\n\n private async streamWithFallback(request: ChatCompletionRequest): Promise<AsyncIterable<ChatCompletionChunk>> {\n let models = request.models!;\n const errors: Array<{ model: string; error: AnyModelError }> = [];\n\n models = this.applyProviderPreferences(models, request.provider);\n\n for (const modelStr of models) {\n try {\n const { provider, model } = parseModelString(modelStr, this.aliases);\n const adapter = this.registry.get(provider);\n const resolvedRequest = this.stripUnsupported(\n { ...request, model, models: undefined, route: undefined, stream: true },\n adapter,\n );\n\n return await withRetry(\n () => adapter.sendStreamingRequest(resolvedRequest),\n this.getRetryOptions(),\n );\n } catch (err) {\n const error = err instanceof AnyModelError\n ? err\n : new AnyModelError(500, String(err));\n\n if (error.code === 429) {\n const { provider } = parseModelString(modelStr, this.aliases);\n this.rateLimiter.recordRateLimit(provider);\n }\n\n errors.push({ model: modelStr, error });\n }\n }\n\n const lastError = errors[errors.length - 1];\n throw new AnyModelError(lastError.error.code, lastError.error.message, {\n ...lastError.error.metadata,\n raw: {\n attempts: errors.map(e => ({\n model: e.model,\n code: e.error.code,\n message: e.error.message,\n })),\n },\n });\n }\n\n getRateLimiter(): RateLimitTracker {\n return this.rateLimiter;\n }\n}\n","let _defaultTimeout = 120_000; // 2 minutes\nlet _flexTimeout = 600_000; // 10 minutes\n\nexport function setDefaultTimeout(ms: number): void {\n _defaultTimeout = ms;\n}\n\nexport function getDefaultTimeout(): number {\n return _defaultTimeout;\n}\n\nexport function setFlexTimeout(ms: number): void {\n _flexTimeout = ms;\n}\n\nexport function getFlexTimeout(): number {\n return _flexTimeout;\n}\n\nexport function fetchWithTimeout(url: string, init?: RequestInit, timeoutMs?: number): Promise<Response> {\n const ms = timeoutMs ?? _defaultTimeout;\n const signal = AbortSignal.timeout(ms);\n if (init?.signal) {\n const combined = AbortSignal.any([signal, init.signal]);\n return fetch(url, { ...init, signal: combined });\n }\n return fetch(url, { ...init, signal });\n}\n","import type { ProviderAdapter } from './adapter.js';\nimport type {\n ChatCompletionRequest,\n ChatCompletion,\n ChatCompletionChunk,\n AnyModelErrorMetadata,\n ModelInfo,\n} from '../types.js';\nimport { AnyModelError } from '../types.js';\nimport { generateId } from '../utils/id.js';\nimport { fetchWithTimeout, getFlexTimeout } from '../utils/fetch-with-timeout.js';\n\nconst OPENAI_API_BASE = 'https://api.openai.com/v1';\n\nconst SUPPORTED_PARAMS = new Set([\n 'temperature', 'max_tokens', 'top_p', 'frequency_penalty', 'presence_penalty',\n 'seed', 'stop', 'stream', 'logprobs', 'top_logprobs', 'response_format',\n 'tools', 'tool_choice', 'user', 'logit_bias', 'service_tier',\n]);\n\nexport function createOpenAIAdapter(apiKey: string, baseURL?: string): ProviderAdapter {\n const base = baseURL || OPENAI_API_BASE;\n\n async function makeRequest(path: string, body?: unknown, method = 'POST', timeoutMs?: number): Promise<Response> {\n const res = await fetchWithTimeout(`${base}${path}`, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n }, timeoutMs);\n\n if (!res.ok) {\n let errorBody: any;\n try {\n errorBody = await res.json();\n } catch {\n errorBody = { message: res.statusText };\n }\n const msg = errorBody?.error?.message || errorBody?.message || res.statusText;\n throw new AnyModelError(mapErrorCode(res.status), msg, {\n provider_name: 'openai',\n raw: errorBody,\n });\n }\n\n return res;\n }\n\n function mapErrorCode(status: number): number {\n if (status === 401 || status === 403) return 401;\n if (status === 429) return 429;\n if (status === 400 || status === 422) return 400;\n if (status >= 500) return 502;\n return status;\n }\n\n function rePrefixId(id: string): string {\n if (id && id.startsWith('chatcmpl-')) {\n return `gen-${id.substring(9)}`;\n }\n return id.startsWith('gen-') ? id : `gen-${id}`;\n }\n\n function buildRequestBody(request: ChatCompletionRequest): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model: request.model,\n messages: request.messages,\n };\n\n // Copy over optional params\n if (request.temperature !== undefined) body.temperature = request.temperature;\n if (request.max_tokens !== undefined) body.max_tokens = request.max_tokens;\n if (request.top_p !== undefined) body.top_p = request.top_p;\n if (request.frequency_penalty !== undefined) body.frequency_penalty = request.frequency_penalty;\n if (request.presence_penalty !== undefined) body.presence_penalty = request.presence_penalty;\n if (request.seed !== undefined) body.seed = request.seed;\n if (request.stop !== undefined) body.stop = request.stop;\n if (request.stream !== undefined) body.stream = request.stream;\n if (request.logprobs !== undefined) body.logprobs = request.logprobs;\n if (request.top_logprobs !== undefined) body.top_logprobs = request.top_logprobs;\n if (request.response_format !== undefined) body.response_format = request.response_format;\n if (request.tools !== undefined) body.tools = request.tools;\n if (request.tool_choice !== undefined) body.tool_choice = request.tool_choice;\n if (request.user !== undefined) body.user = request.user;\n if (request.service_tier !== undefined) body.service_tier = request.service_tier;\n\n return body;\n }\n\n const adapter: ProviderAdapter = {\n name: 'openai',\n\n translateRequest(request: ChatCompletionRequest): unknown {\n return buildRequestBody(request);\n },\n\n translateResponse(response: unknown): ChatCompletion {\n const r = response as any;\n return {\n id: rePrefixId(r.id),\n object: 'chat.completion',\n created: r.created,\n model: `openai/${r.model}`,\n choices: r.choices,\n usage: r.usage,\n };\n },\n\n async *translateStream(stream: ReadableStream<Uint8Array>): AsyncIterable<ChatCompletionChunk> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n if (trimmed === 'data: [DONE]') return;\n if (trimmed.startsWith('data: ')) {\n const json = JSON.parse(trimmed.substring(6));\n json.id = rePrefixId(json.id);\n json.model = `openai/${json.model}`;\n yield json as ChatCompletionChunk;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n },\n\n translateError(error: unknown): { code: number; message: string; metadata: AnyModelErrorMetadata } {\n if (error instanceof AnyModelError) {\n return { code: error.code, message: error.message, metadata: error.metadata };\n }\n const err = error as any;\n const status = err?.status || err?.code || 500;\n return {\n code: mapErrorCode(status),\n message: err?.message || 'Unknown OpenAI error',\n metadata: { provider_name: 'openai', raw: error },\n };\n },\n\n async listModels(): Promise<ModelInfo[]> {\n const res = await makeRequest('/models', undefined, 'GET');\n const data = await res.json() as any;\n return (data.data || [])\n .filter((m: any) => {\n const id = m.id as string;\n // Exclude non-chat models\n if (id.includes('embedding')) return false;\n if (id.includes('whisper')) return false;\n if (id.includes('tts')) return false;\n if (id.includes('dall-e')) return false;\n if (id.includes('davinci')) return false;\n if (id.includes('babbage')) return false;\n if (id.includes('moderation')) return false;\n if (id.includes('realtime')) return false;\n if (id.startsWith('ft:')) return false;\n // Include known chat model prefixes\n return id.startsWith('gpt-') || id.startsWith('o1') || id.startsWith('o3') || id.startsWith('o4') || id.startsWith('chatgpt-');\n })\n .map((m: any) => ({\n id: `openai/${m.id}`,\n name: m.id,\n created: m.created,\n description: '',\n context_length: 128000,\n pricing: { prompt: '0', completion: '0' },\n architecture: {\n modality: 'text+image->text',\n input_modalities: ['text', 'image'],\n output_modalities: ['text'],\n tokenizer: 'o200k_base',\n },\n top_provider: {\n context_length: 128000,\n max_completion_tokens: 16384,\n is_moderated: true,\n },\n supported_parameters: Array.from(SUPPORTED_PARAMS),\n }));\n },\n\n supportsParameter(param: string): boolean {\n return SUPPORTED_PARAMS.has(param);\n },\n\n supportsBatch(): boolean {\n return true;\n },\n\n async sendRequest(request: ChatCompletionRequest): Promise<ChatCompletion> {\n const body = buildRequestBody(request);\n const timeout = request.service_tier === 'flex' ? getFlexTimeout() : undefined;\n const res = await makeRequest('/chat/completions', body, 'POST', timeout);\n const json = await res.json();\n return adapter.translateResponse(json);\n },\n\n async sendStreamingRequest(request: ChatCompletionRequest): Promise<AsyncIterable<ChatCompletionChunk>> {\n const body = buildRequestBody({ ...request, stream: true });\n const timeout = request.service_tier === 'flex' ? getFlexTimeout() : undefined;\n const res = await makeRequest('/chat/completions', body, 'POST', timeout);\n if (!res.body) {\n throw new AnyModelError(502, 'No response body for streaming request', {\n provider_name: 'openai',\n });\n }\n return adapter.translateStream(res.body);\n },\n };\n\n return adapter;\n}\n","import { randomBytes } from 'node:crypto';\n\nexport function generateId(prefix: string = 'gen'): string {\n const random = randomBytes(12).toString('base64url');\n return `${prefix}-${random}`;\n}\n","import type { ProviderAdapter } from './adapter.js';\nimport type {\n ChatCompletionRequest,\n ChatCompletion,\n ChatCompletionChunk,\n AnyModelErrorMetadata,\n ModelInfo,\n Message,\n ToolCall,\n} from '../types.js';\nimport { AnyModelError } from '../types.js';\nimport { generateId } from '../utils/id.js';\nimport { fetchWithTimeout } from '../utils/fetch-with-timeout.js';\n\nconst ANTHROPIC_API_BASE = 'https://api.anthropic.com/v1';\nconst ANTHROPIC_VERSION = '2023-06-01';\nconst DEFAULT_MAX_TOKENS = 4096;\n\nconst SUPPORTED_PARAMS = new Set([\n 'temperature', 'max_tokens', 'top_p', 'top_k', 'stop', 'stream',\n 'tools', 'tool_choice', 'response_format',\n]);\n\n// Fallback if API listing fails — kept current as of March 2026\nconst FALLBACK_MODELS: ModelInfo[] = [\n // Claude 4.6\n { id: 'anthropic/claude-opus-4-6', name: 'Claude Opus 4.6', created: 0, description: 'Most capable model', context_length: 200000, pricing: { prompt: '0.000015', completion: '0.000075' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image'], output_modalities: ['text'], tokenizer: 'claude' }, top_provider: { context_length: 200000, max_completion_tokens: 32768, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n { id: 'anthropic/claude-sonnet-4-6', name: 'Claude Sonnet 4.6', created: 0, description: 'Best balance of speed and capability', context_length: 200000, pricing: { prompt: '0.000003', completion: '0.000015' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image'], output_modalities: ['text'], tokenizer: 'claude' }, top_provider: { context_length: 200000, max_completion_tokens: 16384, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n // Claude 4.5\n { id: 'anthropic/claude-sonnet-4-5-20251022', name: 'Claude Sonnet 4.5', created: 0, description: 'Previous generation balanced model', context_length: 200000, pricing: { prompt: '0.000003', completion: '0.000015' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image'], output_modalities: ['text'], tokenizer: 'claude' }, top_provider: { context_length: 200000, max_completion_tokens: 16384, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n { id: 'anthropic/claude-haiku-4-5', name: 'Claude Haiku 4.5', created: 0, description: 'Fast and compact', context_length: 200000, pricing: { prompt: '0.000001', completion: '0.000005' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image'], output_modalities: ['text'], tokenizer: 'claude' }, top_provider: { context_length: 200000, max_completion_tokens: 8192, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n // Claude 3.5\n { id: 'anthropic/claude-3-5-sonnet-20241022', name: 'Claude 3.5 Sonnet', created: 0, description: 'Legacy balanced model', context_length: 200000, pricing: { prompt: '0.000003', completion: '0.000015' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image'], output_modalities: ['text'], tokenizer: 'claude' }, top_provider: { context_length: 200000, max_completion_tokens: 8192, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n { id: 'anthropic/claude-3-5-haiku-20241022', name: 'Claude 3.5 Haiku', created: 0, description: 'Legacy fast model', context_length: 200000, pricing: { prompt: '0.0000008', completion: '0.000004' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image'], output_modalities: ['text'], tokenizer: 'claude' }, top_provider: { context_length: 200000, max_completion_tokens: 8192, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n];\n\nexport function createAnthropicAdapter(apiKey: string): ProviderAdapter {\n async function makeRequest(path: string, body: unknown, stream = false): Promise<Response> {\n const res = await fetchWithTimeout(`${ANTHROPIC_API_BASE}${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': ANTHROPIC_VERSION,\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n let errorBody: any;\n try {\n errorBody = await res.json();\n } catch {\n errorBody = { message: res.statusText };\n }\n const msg = errorBody?.error?.message || errorBody?.message || res.statusText;\n throw new AnyModelError(mapErrorCode(res.status), msg, {\n provider_name: 'anthropic',\n raw: errorBody,\n });\n }\n\n return res;\n }\n\n function mapErrorCode(status: number): number {\n if (status === 401 || status === 403) return 401;\n if (status === 429) return 429;\n if (status === 400 || status === 422) return 400;\n if (status === 529) return 502;\n if (status >= 500) return 502;\n return status;\n }\n\n function translateRequest(request: ChatCompletionRequest): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model: request.model,\n max_tokens: request.max_tokens || DEFAULT_MAX_TOKENS,\n };\n\n // Extract system messages\n const systemMessages = request.messages.filter(m => m.role === 'system');\n const nonSystemMessages = request.messages.filter(m => m.role !== 'system');\n\n if (systemMessages.length > 0) {\n body.system = systemMessages\n .map(m => typeof m.content === 'string' ? m.content : '')\n .join('\\n');\n }\n\n // Map messages\n body.messages = nonSystemMessages.map(m => ({\n role: m.role === 'tool' ? 'user' : m.role,\n content: m.tool_call_id\n ? [{ type: 'tool_result', tool_use_id: m.tool_call_id, content: typeof m.content === 'string' ? m.content : '' }]\n : m.content,\n }));\n\n // Map optional params\n if (request.temperature !== undefined) body.temperature = request.temperature;\n if (request.top_p !== undefined) body.top_p = request.top_p;\n if (request.top_k !== undefined) body.top_k = request.top_k;\n if (request.stop !== undefined) body.stop_sequences = Array.isArray(request.stop) ? request.stop : [request.stop];\n if (request.stream) body.stream = true;\n\n // Map tools\n if (request.tools && request.tools.length > 0) {\n body.tools = request.tools.map(t => ({\n name: t.function.name,\n description: t.function.description || '',\n input_schema: t.function.parameters || { type: 'object', properties: {} },\n }));\n\n if (request.tool_choice) {\n if (request.tool_choice === 'auto') {\n body.tool_choice = { type: 'auto' };\n } else if (request.tool_choice === 'required') {\n body.tool_choice = { type: 'any' };\n } else if (request.tool_choice === 'none') {\n // Omit tool_choice, don't send tools\n delete body.tools;\n } else if (typeof request.tool_choice === 'object') {\n body.tool_choice = { type: 'tool', name: request.tool_choice.function.name };\n }\n }\n }\n\n // Handle response_format\n if (request.response_format) {\n if (request.response_format.type === 'json_object' || request.response_format.type === 'json_schema') {\n // Prepend JSON instruction to system\n const jsonInstruction = 'Respond with valid JSON only. Do not include any text outside the JSON object.';\n body.system = body.system ? `${jsonInstruction}\\n\\n${body.system}` : jsonInstruction;\n }\n }\n\n return body;\n }\n\n function mapStopReason(reason: string): 'stop' | 'length' | 'tool_calls' | 'content_filter' | 'error' {\n switch (reason) {\n case 'end_turn': return 'stop';\n case 'max_tokens': return 'length';\n case 'tool_use': return 'tool_calls';\n case 'stop_sequence': return 'stop';\n default: return 'stop';\n }\n }\n\n function translateResponse(response: unknown): ChatCompletion {\n const r = response as any;\n\n // Extract text content\n let content = '';\n const toolCalls: ToolCall[] = [];\n\n for (const block of r.content || []) {\n if (block.type === 'text') {\n content += block.text;\n } else if (block.type === 'tool_use') {\n toolCalls.push({\n id: block.id,\n type: 'function',\n function: {\n name: block.name,\n arguments: JSON.stringify(block.input),\n },\n });\n }\n }\n\n const message: Message = {\n role: 'assistant',\n content,\n };\n\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n\n return {\n id: generateId(),\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: `anthropic/${r.model}`,\n choices: [{\n index: 0,\n message,\n finish_reason: mapStopReason(r.stop_reason),\n }],\n usage: {\n prompt_tokens: r.usage?.input_tokens || 0,\n completion_tokens: r.usage?.output_tokens || 0,\n total_tokens: (r.usage?.input_tokens || 0) + (r.usage?.output_tokens || 0),\n },\n };\n }\n\n const adapter: ProviderAdapter = {\n name: 'anthropic',\n\n translateRequest,\n translateResponse,\n\n async *translateStream(stream: ReadableStream<Uint8Array>): AsyncIterable<ChatCompletionChunk> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n const id = generateId();\n const created = Math.floor(Date.now() / 1000);\n let model = '';\n let usage: any = null;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n\n if (trimmed.startsWith('data: ')) {\n const data = JSON.parse(trimmed.substring(6));\n\n if (data.type === 'message_start') {\n model = `anthropic/${data.message.model}`;\n usage = data.message.usage;\n // Emit initial chunk with role\n yield {\n id, object: 'chat.completion.chunk', created, model,\n choices: [{ index: 0, delta: { role: 'assistant' }, finish_reason: null }],\n };\n } else if (data.type === 'content_block_delta') {\n if (data.delta?.type === 'text_delta') {\n yield {\n id, object: 'chat.completion.chunk', created, model,\n choices: [{ index: 0, delta: { content: data.delta.text }, finish_reason: null }],\n };\n } else if (data.delta?.type === 'input_json_delta') {\n // Tool use streaming — emit as tool_calls delta\n yield {\n id, object: 'chat.completion.chunk', created, model,\n choices: [{\n index: 0,\n delta: {\n tool_calls: [{\n id: data.content_block?.id || '',\n type: 'function',\n function: { name: '', arguments: data.delta.partial_json },\n }],\n },\n finish_reason: null,\n }],\n };\n }\n } else if (data.type === 'content_block_start') {\n if (data.content_block?.type === 'tool_use') {\n yield {\n id, object: 'chat.completion.chunk', created, model,\n choices: [{\n index: 0,\n delta: {\n tool_calls: [{\n id: data.content_block.id,\n type: 'function',\n function: { name: data.content_block.name, arguments: '' },\n }],\n },\n finish_reason: null,\n }],\n };\n }\n } else if (data.type === 'message_delta') {\n const finalUsage = usage ? {\n prompt_tokens: usage.input_tokens || 0,\n completion_tokens: data.usage?.output_tokens || 0,\n total_tokens: (usage.input_tokens || 0) + (data.usage?.output_tokens || 0),\n } : undefined;\n\n yield {\n id, object: 'chat.completion.chunk', created, model,\n choices: [{\n index: 0,\n delta: {},\n finish_reason: mapStopReason(data.delta?.stop_reason || 'end_turn'),\n }],\n usage: finalUsage,\n };\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n },\n\n translateError(error: unknown) {\n if (error instanceof AnyModelError) {\n return { code: error.code, message: error.message, metadata: error.metadata };\n }\n const err = error as any;\n const status = err?.status || err?.code || 500;\n return {\n code: mapErrorCode(status),\n message: err?.message || 'Unknown Anthropic error',\n metadata: { provider_name: 'anthropic', raw: error } as AnyModelErrorMetadata,\n };\n },\n\n async listModels(): Promise<ModelInfo[]> {\n try {\n const res = await fetchWithTimeout(`${ANTHROPIC_API_BASE}/models`, {\n method: 'GET',\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': ANTHROPIC_VERSION,\n },\n });\n\n if (!res.ok) return FALLBACK_MODELS;\n\n const data = await res.json() as any;\n const models = (data.data || []) as any[];\n\n return models\n .filter((m: any) => m.type === 'model')\n .map((m: any) => ({\n id: `anthropic/${m.id}`,\n name: m.display_name || m.id,\n created: m.created_at ? new Date(m.created_at).getTime() / 1000 : 0,\n description: m.display_name || '',\n context_length: 200000,\n pricing: { prompt: '0', completion: '0' },\n architecture: {\n modality: 'text+image->text',\n input_modalities: ['text', 'image'],\n output_modalities: ['text'],\n tokenizer: 'claude',\n },\n top_provider: {\n context_length: 200000,\n max_completion_tokens: 16384,\n is_moderated: false,\n },\n supported_parameters: Array.from(SUPPORTED_PARAMS),\n }));\n } catch {\n return FALLBACK_MODELS;\n }\n },\n\n supportsParameter(param: string): boolean {\n return SUPPORTED_PARAMS.has(param);\n },\n\n supportsBatch(): boolean {\n return true;\n },\n\n async sendRequest(request: ChatCompletionRequest): Promise<ChatCompletion> {\n const body = translateRequest(request);\n const res = await makeRequest('/messages', body);\n const json = await res.json();\n return translateResponse(json);\n },\n\n async sendStreamingRequest(request: ChatCompletionRequest): Promise<AsyncIterable<ChatCompletionChunk>> {\n const body = translateRequest({ ...request, stream: true });\n const res = await makeRequest('/messages', body, true);\n if (!res.body) {\n throw new AnyModelError(502, 'No response body for streaming request', {\n provider_name: 'anthropic',\n });\n }\n return adapter.translateStream(res.body);\n },\n };\n\n return adapter;\n}\n","import type { ProviderAdapter } from './adapter.js';\nimport type {\n ChatCompletionRequest,\n ChatCompletion,\n ChatCompletionChunk,\n AnyModelErrorMetadata,\n ModelInfo,\n Message,\n ToolCall,\n} from '../types.js';\nimport { AnyModelError } from '../types.js';\nimport { generateId } from '../utils/id.js';\nimport { fetchWithTimeout } from '../utils/fetch-with-timeout.js';\n\nconst GEMINI_API_BASE = 'https://generativelanguage.googleapis.com/v1beta';\n\nconst SUPPORTED_PARAMS = new Set([\n 'temperature', 'max_tokens', 'top_p', 'top_k', 'stop', 'stream',\n 'tools', 'tool_choice', 'response_format',\n]);\n\n// Fallback if API listing fails — kept current as of March 2026\nconst FALLBACK_MODELS: ModelInfo[] = [\n // Gemini 2.5\n { id: 'google/gemini-2.5-pro', name: 'Gemini 2.5 Pro', created: 0, description: 'Most capable Gemini model', context_length: 1048576, pricing: { prompt: '0.00000125', completion: '0.000005' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image', 'video', 'audio'], output_modalities: ['text'], tokenizer: 'gemini' }, top_provider: { context_length: 1048576, max_completion_tokens: 65536, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n { id: 'google/gemini-2.5-flash', name: 'Gemini 2.5 Flash', created: 0, description: 'Fast and efficient', context_length: 1048576, pricing: { prompt: '0.00000015', completion: '0.0000006' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image', 'video', 'audio'], output_modalities: ['text'], tokenizer: 'gemini' }, top_provider: { context_length: 1048576, max_completion_tokens: 65536, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n // Gemini 2.0\n { id: 'google/gemini-2.0-flash', name: 'Gemini 2.0 Flash', created: 0, description: 'Fast multimodal model', context_length: 1048576, pricing: { prompt: '0.0000001', completion: '0.0000004' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image', 'video', 'audio'], output_modalities: ['text'], tokenizer: 'gemini' }, top_provider: { context_length: 1048576, max_completion_tokens: 65536, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n { id: 'google/gemini-2.0-flash-lite', name: 'Gemini 2.0 Flash Lite', created: 0, description: 'Lightweight and fast', context_length: 1048576, pricing: { prompt: '0.00000005', completion: '0.0000002' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image', 'video', 'audio'], output_modalities: ['text'], tokenizer: 'gemini' }, top_provider: { context_length: 1048576, max_completion_tokens: 65536, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n // Gemini 1.5\n { id: 'google/gemini-1.5-pro', name: 'Gemini 1.5 Pro', created: 0, description: 'Previous generation pro model', context_length: 2097152, pricing: { prompt: '0.00000125', completion: '0.000005' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image', 'video', 'audio'], output_modalities: ['text'], tokenizer: 'gemini' }, top_provider: { context_length: 2097152, max_completion_tokens: 8192, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n { id: 'google/gemini-1.5-flash', name: 'Gemini 1.5 Flash', created: 0, description: 'Previous generation flash model', context_length: 1048576, pricing: { prompt: '0.000000075', completion: '0.0000003' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image', 'video', 'audio'], output_modalities: ['text'], tokenizer: 'gemini' }, top_provider: { context_length: 1048576, max_completion_tokens: 8192, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n];\n\nexport function createGoogleAdapter(apiKey: string): ProviderAdapter {\n function getModelEndpoint(model: string, stream: boolean): string {\n const action = stream ? 'streamGenerateContent' : 'generateContent';\n return `${GEMINI_API_BASE}/models/${model}:${action}?key=${apiKey}${stream ? '&alt=sse' : ''}`;\n }\n\n function mapErrorCode(status: number): number {\n if (status === 401 || status === 403) return 401;\n if (status === 429) return 429;\n if (status === 400) return 400;\n if (status >= 500) return 502;\n return status;\n }\n\n function translateRequest(request: ChatCompletionRequest): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n\n // Extract system instruction\n const systemMessages = request.messages.filter(m => m.role === 'system');\n const nonSystemMessages = request.messages.filter(m => m.role !== 'system');\n\n if (systemMessages.length > 0) {\n body.systemInstruction = {\n parts: [{ text: systemMessages.map(m => typeof m.content === 'string' ? m.content : '').join('\\n') }],\n };\n }\n\n // Map messages to contents\n body.contents = nonSystemMessages.map(m => ({\n role: m.role === 'assistant' ? 'model' : 'user',\n parts: typeof m.content === 'string'\n ? [{ text: m.content }]\n : Array.isArray(m.content)\n ? m.content.map(p => p.type === 'text' ? { text: p.text } : { text: '' })\n : [{ text: '' }],\n }));\n\n // Generation config\n const generationConfig: Record<string, unknown> = {};\n if (request.temperature !== undefined) generationConfig.temperature = request.temperature;\n if (request.max_tokens !== undefined) generationConfig.maxOutputTokens = request.max_tokens;\n if (request.top_p !== undefined) generationConfig.topP = request.top_p;\n if (request.top_k !== undefined) generationConfig.topK = request.top_k;\n if (request.stop !== undefined) {\n generationConfig.stopSequences = Array.isArray(request.stop) ? request.stop : [request.stop];\n }\n\n // Response format\n if (request.response_format) {\n if (request.response_format.type === 'json_object') {\n generationConfig.responseMimeType = 'application/json';\n } else if (request.response_format.type === 'json_schema') {\n generationConfig.responseMimeType = 'application/json';\n generationConfig.responseSchema = request.response_format.json_schema.schema;\n }\n }\n\n if (Object.keys(generationConfig).length > 0) {\n body.generationConfig = generationConfig;\n }\n\n // Map tools\n if (request.tools && request.tools.length > 0) {\n body.tools = [{\n functionDeclarations: request.tools.map(t => ({\n name: t.function.name,\n description: t.function.description || '',\n parameters: t.function.parameters || {},\n })),\n }];\n\n if (request.tool_choice) {\n if (request.tool_choice === 'auto') {\n body.toolConfig = { functionCallingConfig: { mode: 'AUTO' } };\n } else if (request.tool_choice === 'required') {\n body.toolConfig = { functionCallingConfig: { mode: 'ANY' } };\n } else if (request.tool_choice === 'none') {\n body.toolConfig = { functionCallingConfig: { mode: 'NONE' } };\n } else if (typeof request.tool_choice === 'object') {\n body.toolConfig = {\n functionCallingConfig: {\n mode: 'ANY',\n allowedFunctionNames: [request.tool_choice.function.name],\n },\n };\n }\n }\n }\n\n return body;\n }\n\n function mapFinishReason(reason: string): 'stop' | 'length' | 'tool_calls' | 'content_filter' | 'error' {\n switch (reason) {\n case 'STOP': return 'stop';\n case 'MAX_TOKENS': return 'length';\n case 'SAFETY': return 'content_filter';\n case 'RECITATION': return 'content_filter';\n default: return 'stop';\n }\n }\n\n function translateResponse(response: unknown): ChatCompletion {\n const r = response as any;\n const candidate = r.candidates?.[0];\n\n let content = '';\n const toolCalls: ToolCall[] = [];\n\n for (const part of candidate?.content?.parts || []) {\n if (part.text) {\n content += part.text;\n } else if (part.functionCall) {\n toolCalls.push({\n id: generateId('call'),\n type: 'function',\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args || {}),\n },\n });\n }\n }\n\n const message: Message = { role: 'assistant', content };\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n\n const finishReason = toolCalls.length > 0\n ? 'tool_calls' as const\n : mapFinishReason(candidate?.finishReason || 'STOP');\n\n return {\n id: generateId(),\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: `google/${r.modelVersion || 'unknown'}`,\n choices: [{ index: 0, message, finish_reason: finishReason }],\n usage: {\n prompt_tokens: r.usageMetadata?.promptTokenCount || 0,\n completion_tokens: r.usageMetadata?.candidatesTokenCount || 0,\n total_tokens: r.usageMetadata?.totalTokenCount || 0,\n },\n };\n }\n\n const adapter: ProviderAdapter = {\n name: 'google',\n\n translateRequest,\n translateResponse,\n\n async *translateStream(stream: ReadableStream<Uint8Array>): AsyncIterable<ChatCompletionChunk> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n const id = generateId();\n const created = Math.floor(Date.now() / 1000);\n let emittedRole = false;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n if (trimmed === 'data: [DONE]') return;\n\n if (trimmed.startsWith('data: ')) {\n const data = JSON.parse(trimmed.substring(6));\n const candidate = data.candidates?.[0];\n\n if (!candidate) continue;\n\n const parts = candidate.content?.parts || [];\n for (const part of parts) {\n if (part.text !== undefined) {\n const chunk: ChatCompletionChunk = {\n id, object: 'chat.completion.chunk', created, model: `google/${data.modelVersion || 'unknown'}`,\n choices: [{\n index: 0,\n delta: emittedRole ? { content: part.text } : { role: 'assistant', content: part.text },\n finish_reason: null,\n }],\n };\n emittedRole = true;\n yield chunk;\n }\n }\n\n if (candidate.finishReason) {\n yield {\n id, object: 'chat.completion.chunk', created, model: `google/${data.modelVersion || 'unknown'}`,\n choices: [{ index: 0, delta: {}, finish_reason: mapFinishReason(candidate.finishReason) }],\n usage: data.usageMetadata ? {\n prompt_tokens: data.usageMetadata.promptTokenCount || 0,\n completion_tokens: data.usageMetadata.candidatesTokenCount || 0,\n total_tokens: data.usageMetadata.totalTokenCount || 0,\n } : undefined,\n };\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n },\n\n translateError(error: unknown) {\n if (error instanceof AnyModelError) {\n return { code: error.code, message: error.message, metadata: error.metadata };\n }\n const err = error as any;\n const status = err?.status || err?.code || 500;\n return {\n code: mapErrorCode(status),\n message: err?.message || 'Unknown Google error',\n metadata: { provider_name: 'google', raw: error } as AnyModelErrorMetadata,\n };\n },\n\n async listModels(): Promise<ModelInfo[]> {\n try {\n const res = await fetchWithTimeout(`${GEMINI_API_BASE}/models?key=${apiKey}`);\n\n if (!res.ok) return FALLBACK_MODELS;\n\n const data = await res.json() as any;\n const models = (data.models || []) as any[];\n\n return models\n .filter((m: any) => m.name?.startsWith('models/gemini-') && m.supportedGenerationMethods?.includes('generateContent'))\n .map((m: any) => {\n const modelId = m.name.replace('models/', '');\n return {\n id: `google/${modelId}`,\n name: m.displayName || modelId,\n created: 0,\n description: m.description || '',\n context_length: m.inputTokenLimit || 1048576,\n pricing: { prompt: '0', completion: '0' },\n architecture: {\n modality: 'text+image->text',\n input_modalities: ['text', 'image', 'video', 'audio'],\n output_modalities: ['text'],\n tokenizer: 'gemini',\n },\n top_provider: {\n context_length: m.inputTokenLimit || 1048576,\n max_completion_tokens: m.outputTokenLimit || 65536,\n is_moderated: false,\n },\n supported_parameters: Array.from(SUPPORTED_PARAMS),\n };\n });\n } catch {\n return FALLBACK_MODELS;\n }\n },\n\n supportsParameter(param: string): boolean {\n return SUPPORTED_PARAMS.has(param);\n },\n\n supportsBatch(): boolean {\n return true;\n },\n\n async sendRequest(request: ChatCompletionRequest): Promise<ChatCompletion> {\n const body = translateRequest(request);\n const url = getModelEndpoint(request.model, false);\n const res = await fetchWithTimeout(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n if (!res.ok) {\n let errorBody: any;\n try { errorBody = await res.json(); } catch { errorBody = { message: res.statusText }; }\n throw new AnyModelError(mapErrorCode(res.status), errorBody?.error?.message || res.statusText, {\n provider_name: 'google', raw: errorBody,\n });\n }\n const json = await res.json();\n return translateResponse(json);\n },\n\n async sendStreamingRequest(request: ChatCompletionRequest): Promise<AsyncIterable<ChatCompletionChunk>> {\n const body = translateRequest(request);\n const url = getModelEndpoint(request.model, true);\n const res = await fetchWithTimeout(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n if (!res.ok) {\n let errorBody: any;\n try { errorBody = await res.json(); } catch { errorBody = { message: res.statusText }; }\n throw new AnyModelError(mapErrorCode(res.status), errorBody?.error?.message || res.statusText, {\n provider_name: 'google', raw: errorBody,\n });\n }\n if (!res.body) {\n throw new AnyModelError(502, 'No response body for streaming request', { provider_name: 'google' });\n }\n return adapter.translateStream(res.body);\n },\n };\n\n return adapter;\n}\n","import type { ProviderAdapter } from './adapter.js';\nimport type {\n ChatCompletionRequest,\n ChatCompletion,\n ChatCompletionChunk,\n AnyModelErrorMetadata,\n ModelInfo,\n} from '../types.js';\nimport { AnyModelError } from '../types.js';\nimport { generateId } from '../utils/id.js';\nimport { fetchWithTimeout } from '../utils/fetch-with-timeout.js';\n\nconst PERPLEXITY_API_BASE = 'https://api.perplexity.ai';\n\nconst SUPPORTED_PARAMS = new Set([\n 'temperature', 'max_tokens', 'top_p', 'frequency_penalty', 'presence_penalty',\n 'stream', 'stop', 'response_format', 'tools', 'tool_choice',\n]);\n\n// Perplexity models — static list since there is no /models endpoint\nconst MODELS: Array<{\n id: string;\n name: string;\n context: number;\n maxOutput: number;\n modality: string;\n inputModalities: string[];\n}> = [\n { id: 'sonar', name: 'Sonar', context: 128000, maxOutput: 4096, modality: 'text->text', inputModalities: ['text'] },\n { id: 'sonar-pro', name: 'Sonar Pro', context: 200000, maxOutput: 8192, modality: 'text->text', inputModalities: ['text'] },\n { id: 'sonar-reasoning', name: 'Sonar Reasoning', context: 128000, maxOutput: 8192, modality: 'text->text', inputModalities: ['text'] },\n { id: 'sonar-reasoning-pro', name: 'Sonar Reasoning Pro', context: 128000, maxOutput: 16384, modality: 'text->text', inputModalities: ['text'] },\n { id: 'sonar-deep-research', name: 'Sonar Deep Research', context: 128000, maxOutput: 16384, modality: 'text->text', inputModalities: ['text'] },\n { id: 'r1-1776', name: 'R1 1776', context: 128000, maxOutput: 16384, modality: 'text->text', inputModalities: ['text'] },\n];\n\nexport function createPerplexityAdapter(apiKey: string): ProviderAdapter {\n async function makeRequest(path: string, body?: unknown, method = 'POST'): Promise<Response> {\n const res = await fetchWithTimeout(`${PERPLEXITY_API_BASE}${path}`, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n let errorBody: any;\n try {\n errorBody = await res.json();\n } catch {\n errorBody = { message: res.statusText };\n }\n const msg = errorBody?.error?.message || errorBody?.message || res.statusText;\n throw new AnyModelError(mapErrorCode(res.status), msg, {\n provider_name: 'perplexity',\n raw: errorBody,\n });\n }\n\n return res;\n }\n\n function mapErrorCode(status: number): number {\n if (status === 401 || status === 403) return 401;\n if (status === 429) return 429;\n if (status === 400 || status === 422) return 400;\n if (status >= 500) return 502;\n return status;\n }\n\n function rePrefixId(id: string): string {\n if (id && id.startsWith('chatcmpl-')) {\n return `gen-${id.substring(9)}`;\n }\n return id.startsWith('gen-') ? id : `gen-${id}`;\n }\n\n function buildRequestBody(request: ChatCompletionRequest): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model: request.model,\n messages: request.messages,\n };\n\n if (request.temperature !== undefined) body.temperature = request.temperature;\n if (request.max_tokens !== undefined) body.max_tokens = request.max_tokens;\n if (request.top_p !== undefined) body.top_p = request.top_p;\n if (request.frequency_penalty !== undefined) body.frequency_penalty = request.frequency_penalty;\n if (request.presence_penalty !== undefined) body.presence_penalty = request.presence_penalty;\n if (request.stop !== undefined) body.stop = request.stop;\n if (request.stream !== undefined) body.stream = request.stream;\n if (request.response_format !== undefined) body.response_format = request.response_format;\n if (request.tools !== undefined) body.tools = request.tools;\n if (request.tool_choice !== undefined) body.tool_choice = request.tool_choice;\n\n return body;\n }\n\n const adapter: ProviderAdapter = {\n name: 'perplexity',\n\n translateRequest(request: ChatCompletionRequest): unknown {\n return buildRequestBody(request);\n },\n\n translateResponse(response: unknown): ChatCompletion {\n const r = response as any;\n const result: ChatCompletion = {\n id: rePrefixId(r.id),\n object: 'chat.completion',\n created: r.created,\n model: `perplexity/${r.model}`,\n choices: r.choices,\n usage: r.usage,\n };\n\n // Preserve citations in metadata if present\n if (r.citations && result.choices?.[0]?.message) {\n (result as any).citations = r.citations;\n }\n\n return result;\n },\n\n async *translateStream(stream: ReadableStream<Uint8Array>): AsyncIterable<ChatCompletionChunk> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n if (trimmed === 'data: [DONE]') return;\n if (trimmed.startsWith('data: ')) {\n const json = JSON.parse(trimmed.substring(6));\n json.id = rePrefixId(json.id);\n json.model = `perplexity/${json.model}`;\n yield json as ChatCompletionChunk;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n },\n\n translateError(error: unknown): { code: number; message: string; metadata: AnyModelErrorMetadata } {\n if (error instanceof AnyModelError) {\n return { code: error.code, message: error.message, metadata: error.metadata };\n }\n const err = error as any;\n const status = err?.status || err?.code || 500;\n return {\n code: mapErrorCode(status),\n message: err?.message || 'Unknown Perplexity error',\n metadata: { provider_name: 'perplexity', raw: error },\n };\n },\n\n async listModels(): Promise<ModelInfo[]> {\n return MODELS.map((m) => ({\n id: `perplexity/${m.id}`,\n name: m.name,\n created: 0,\n description: '',\n context_length: m.context,\n pricing: { prompt: '0', completion: '0' },\n architecture: {\n modality: m.modality,\n input_modalities: m.inputModalities,\n output_modalities: ['text'],\n tokenizer: 'unknown',\n },\n top_provider: {\n context_length: m.context,\n max_completion_tokens: m.maxOutput,\n is_moderated: false,\n },\n supported_parameters: Array.from(SUPPORTED_PARAMS),\n }));\n },\n\n supportsParameter(param: string): boolean {\n return SUPPORTED_PARAMS.has(param);\n },\n\n supportsBatch(): boolean {\n return false;\n },\n\n async sendRequest(request: ChatCompletionRequest): Promise<ChatCompletion> {\n const body = buildRequestBody(request);\n const res = await makeRequest('/chat/completions', body);\n const json = await res.json();\n return adapter.translateResponse(json);\n },\n\n async sendStreamingRequest(request: ChatCompletionRequest): Promise<AsyncIterable<ChatCompletionChunk>> {\n const body = buildRequestBody({ ...request, stream: true });\n const res = await makeRequest('/chat/completions', body);\n if (!res.body) {\n throw new AnyModelError(502, 'No response body for streaming request', {\n provider_name: 'perplexity',\n });\n }\n return adapter.translateStream(res.body);\n },\n };\n\n return adapter;\n}\n","import type { CustomProviderConfig } from '../types.js';\nimport type { ProviderAdapter } from './adapter.js';\nimport { createOpenAIAdapter } from './openai.js';\n\n/**\n * Create a custom provider adapter that uses an OpenAI-compatible API.\n * This wraps the OpenAI adapter with a custom base URL and provider name.\n */\nexport function createCustomAdapter(\n name: string,\n config: CustomProviderConfig,\n): ProviderAdapter {\n const openaiAdapter = createOpenAIAdapter(config.apiKey || '', config.baseURL);\n\n return {\n ...openaiAdapter,\n name,\n\n supportsBatch(): boolean {\n return false;\n },\n\n async listModels() {\n // If static model list is provided in config, use that\n if (config.models && config.models.length > 0) {\n return config.models.map(modelId => ({\n id: `${name}/${modelId}`,\n name: modelId,\n created: 0,\n description: `Custom model via ${name}`,\n context_length: 128000,\n pricing: { prompt: '0', completion: '0' },\n architecture: {\n modality: 'text->text',\n input_modalities: ['text'],\n output_modalities: ['text'],\n tokenizer: 'unknown',\n },\n top_provider: {\n context_length: 128000,\n max_completion_tokens: 16384,\n is_moderated: false,\n },\n supported_parameters: ['temperature', 'max_tokens', 'top_p', 'stop', 'stream', 'tools', 'tool_choice'],\n }));\n }\n\n // Otherwise try to fetch from the /models endpoint\n try {\n const models = await openaiAdapter.listModels();\n // Re-prefix with custom provider name\n return models.map(m => ({\n ...m,\n id: `${name}/${m.name}`,\n }));\n } catch {\n return [];\n }\n },\n\n translateResponse(response: unknown) {\n const translated = openaiAdapter.translateResponse(response);\n // Re-prefix the model with our custom provider name\n if (translated.model.startsWith('openai/')) {\n translated.model = `${name}/${translated.model.substring(7)}`;\n }\n return translated;\n },\n };\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { AnyModelConfig } from './types.js';\n\nconst LOCAL_CONFIG_NAMES = ['anymodel.config.json'];\nconst GLOBAL_CONFIG_DIR = join(homedir(), '.anymodel');\nconst GLOBAL_CONFIG_FILE = join(GLOBAL_CONFIG_DIR, 'config.json');\n\n/**\n * Interpolate ${ENV_VAR} references in string values.\n */\nfunction interpolateEnvVars(value: string): string {\n return value.replace(/\\$\\{([^}]+)\\}/g, (_, name) => process.env[name] || '');\n}\n\n/**\n * Recursively walk an object and interpolate string values.\n */\nfunction interpolateDeep(obj: unknown): unknown {\n if (typeof obj === 'string') return interpolateEnvVars(obj);\n if (Array.isArray(obj)) return obj.map(interpolateDeep);\n if (obj !== null && typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(obj as Record<string, unknown>)) {\n result[key] = interpolateDeep(val);\n }\n return result;\n }\n return obj;\n}\n\n/**\n * Load a JSON config file, returning null if not found.\n */\nfunction loadJsonFile(path: string): AnyModelConfig | null {\n if (!existsSync(path)) return null;\n try {\n const raw = readFileSync(path, 'utf-8');\n const parsed = JSON.parse(raw);\n return interpolateDeep(parsed) as AnyModelConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * Find local config file in the working directory.\n */\nfunction findLocalConfig(cwd?: string): AnyModelConfig | null {\n const dir = cwd || process.cwd();\n for (const name of LOCAL_CONFIG_NAMES) {\n const config = loadJsonFile(resolve(dir, name));\n if (config) return config;\n }\n return null;\n}\n\n/**\n * Load global config from ~/.anymodel/config.json\n */\nfunction findGlobalConfig(): AnyModelConfig | null {\n return loadJsonFile(GLOBAL_CONFIG_FILE);\n}\n\n/**\n * Deep merge two config objects. Source values override target values.\n * Provider-level objects are merged, not replaced.\n */\nfunction deepMerge(target: AnyModelConfig, source: AnyModelConfig): AnyModelConfig {\n const result: Record<string, unknown> = { ...target };\n\n for (const [key, value] of Object.entries(source)) {\n if (value === undefined) continue;\n\n const existing = (target as Record<string, unknown>)[key];\n if (\n existing !== null && typeof existing === 'object' && !Array.isArray(existing) &&\n value !== null && typeof value === 'object' && !Array.isArray(value)\n ) {\n result[key] = deepMerge(existing as AnyModelConfig, value as AnyModelConfig);\n } else {\n result[key] = value;\n }\n }\n\n return result as AnyModelConfig;\n}\n\n/**\n * Build config from env vars only (auto-detected API keys).\n */\nfunction envConfig(): AnyModelConfig {\n const config: AnyModelConfig = {};\n\n const envMap: Array<[keyof AnyModelConfig, string]> = [\n ['openai', 'OPENAI_API_KEY'],\n ['anthropic', 'ANTHROPIC_API_KEY'],\n ['google', 'GOOGLE_API_KEY'],\n ['mistral', 'MISTRAL_API_KEY'],\n ['groq', 'GROQ_API_KEY'],\n ['deepseek', 'DEEPSEEK_API_KEY'],\n ['xai', 'XAI_API_KEY'],\n ['together', 'TOGETHER_API_KEY'],\n ['fireworks', 'FIREWORKS_API_KEY'],\n ['perplexity', 'PERPLEXITY_API_KEY'],\n ];\n\n for (const [key, envVar] of envMap) {\n if (process.env[envVar]) {\n (config as any)[key] = { apiKey: process.env[envVar] };\n }\n }\n\n return config;\n}\n\n/**\n * Resolve config with precedence: programmatic → local → global → env vars.\n */\nexport function resolveConfig(programmatic: AnyModelConfig = {}, cwd?: string): AnyModelConfig {\n const env = envConfig();\n const global = findGlobalConfig() || {};\n const local = findLocalConfig(cwd) || {};\n\n // Lowest priority first, each layer overrides the previous\n let config = deepMerge(env, global);\n config = deepMerge(config, local);\n config = deepMerge(config, programmatic);\n\n return config;\n}\n","import type { GenerationStats, FinishReason } from '../types.js';\n\nexport interface GenerationRecord {\n id: string;\n model: string;\n providerName: string;\n promptTokens: number;\n completionTokens: number;\n startTime: number; // epoch ms\n endTime: number; // epoch ms\n finishReason: FinishReason;\n streamed: boolean;\n}\n\n/**\n * In-memory generation stats store.\n * Tracks recent completions for the generation stats endpoint.\n */\nexport class GenerationStatsStore {\n private records = new Map<string, GenerationRecord>();\n private maxRecords: number;\n\n constructor(maxRecords = 1000) {\n this.maxRecords = maxRecords;\n }\n\n record(entry: GenerationRecord): void {\n // Evict oldest if at capacity\n if (this.records.size >= this.maxRecords) {\n const oldest = this.records.keys().next().value;\n if (oldest) this.records.delete(oldest);\n }\n this.records.set(entry.id, entry);\n }\n\n get(id: string): GenerationStats | undefined {\n const rec = this.records.get(id);\n if (!rec) return undefined;\n\n const latency = rec.endTime - rec.startTime;\n return {\n id: rec.id,\n model: rec.model,\n provider_name: rec.providerName,\n total_cost: 0, // Cost calculation requires pricing data\n tokens_prompt: rec.promptTokens,\n tokens_completion: rec.completionTokens,\n latency,\n generation_time: latency,\n created_at: new Date(rec.startTime).toISOString(),\n finish_reason: rec.finishReason,\n streamed: rec.streamed,\n };\n }\n\n list(limit = 50): GenerationStats[] {\n const entries = Array.from(this.records.values())\n .slice(-limit)\n .reverse();\n\n return entries.map(rec => this.get(rec.id)!);\n }\n}\n","/**\n * Concurrency-limited filesystem helpers for high-volume file operations.\n *\n * Based on probeo-core/common/fs-io. Provides queued reads/writes,\n * atomic durable writes, directory caching, and path memoization.\n */\n\nimport { mkdir, open, readFile as fsReadFile, rename, writeFile as fsWriteFile, readdir as fsReaddir, stat as fsStat } from 'node:fs/promises';\nimport type { Dirent, Stats } from 'node:fs';\nimport { createWriteStream } from 'node:fs';\nimport path from 'node:path';\nimport PQueue from 'p-queue';\n\n// Concurrency-limited queues to prevent resource exhaustion.\nlet writeQueue = new PQueue({ concurrency: 10 });\nlet readQueue = new PQueue({ concurrency: 20 });\n\n/**\n * Configure the filesystem IO concurrency limits.\n * Call before any IO operations to adjust defaults.\n */\nexport function configureFsIO(options: { readConcurrency?: number; writeConcurrency?: number }): void {\n if (options.readConcurrency !== undefined) {\n readQueue.concurrency = options.readConcurrency;\n }\n if (options.writeConcurrency !== undefined) {\n writeQueue.concurrency = options.writeConcurrency;\n }\n}\n\n// In-memory cache of directories we've already ensured exist.\nconst ensuredDirs = new Set<string>();\n\n// Memoization caches for path operations.\nconst joinPathCache = new Map<string, string>();\nconst dirnameCache = new Map<string, string>();\nconst resolvePathCache = new Map<string, string>();\n\n// ─── Directory Operations ───────────────────────────────────────────────────\n\nexport async function ensureDir(dir: string): Promise<void> {\n if (!dir) return;\n if (ensuredDirs.has(dir)) return;\n await mkdir(dir, { recursive: true });\n ensuredDirs.add(dir);\n}\n\n// ─── Queued Read Operations ─────────────────────────────────────────────────\n\nexport async function readFileQueued(\n filePath: string,\n encoding: BufferEncoding | null = 'utf8',\n): Promise<string | Buffer> {\n return readQueue.add(async () => {\n return fsReadFile(filePath, encoding as any);\n });\n}\n\nexport async function readJsonQueued<T = unknown>(filePath: string): Promise<T> {\n const raw = (await readFileQueued(filePath, 'utf8')) as string;\n return JSON.parse(raw) as T;\n}\n\nexport async function readDirQueued(dirPath: string): Promise<Dirent[]> {\n return readQueue.add(async () => {\n return fsReaddir(dirPath, { withFileTypes: true });\n });\n}\n\nexport async function statQueued(filePath: string): Promise<Stats> {\n return readQueue.add(async () => {\n return fsStat(filePath);\n });\n}\n\nexport async function pathExistsQueued(p: string): Promise<boolean> {\n return readQueue.add(async () => {\n try {\n await fsStat(p);\n return true;\n } catch {\n return false;\n }\n });\n}\n\nexport async function fileExistsQueued(filePath: string): Promise<boolean> {\n return readQueue.add(async () => {\n try {\n const s = await fsStat(filePath);\n return s.isFile();\n } catch {\n return false;\n }\n });\n}\n\n// ─── Queued Write Operations ────────────────────────────────────────────────\n\nexport async function writeFileQueued(filePath: string, data: string | Buffer): Promise<void> {\n await writeQueue.add(async () => {\n const dir = dirnameOf(filePath);\n await ensureDir(dir);\n await fsWriteFile(filePath, data);\n });\n}\n\nexport async function appendFileQueued(filePath: string, data: string | Buffer): Promise<void> {\n await writeQueue.add(async () => {\n const dir = dirnameOf(filePath);\n await ensureDir(dir);\n await fsWriteFile(filePath, data, { flag: 'a' } as any);\n });\n}\n\n/**\n * Atomically write a file with fsync to ensure data hits disk.\n * Uses temp file + rename + directory fsync.\n */\nexport async function writeFileFlushedQueued(filePath: string, data: string | Buffer): Promise<void> {\n await writeQueue.add(async () => {\n const dir = dirnameOf(filePath);\n await ensureDir(dir);\n\n const tmpPath = joinPath(\n dir,\n `.${path.basename(filePath)}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`,\n );\n\n const fh = await open(tmpPath, 'w');\n try {\n await fh.writeFile(data);\n await fh.sync();\n } finally {\n await fh.close();\n }\n\n await rename(tmpPath, filePath);\n\n try {\n const dh = await open(dir, 'r');\n try { await dh.sync(); } finally { await dh.close(); }\n } catch {\n // ignore directory fsync errors\n }\n });\n}\n\n/**\n * Streamed write with durability: temp file → stream → fsync → atomic rename.\n */\nexport async function writeStreamFlushedQueued(\n filePath: string,\n producer: (stream: NodeJS.WritableStream) => Promise<void> | void,\n): Promise<void> {\n await writeQueue.add(async () => {\n const dir = dirnameOf(filePath);\n await ensureDir(dir);\n\n const tmpPath = joinPath(\n dir,\n `.${path.basename(filePath)}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`,\n );\n\n const ws = createWriteStream(tmpPath);\n\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const onError = (err: any) => { if (settled) return; settled = true; reject(err); };\n const onFinish = () => { if (settled) return; settled = true; resolve(); };\n ws.once('error', onError);\n ws.once('finish', onFinish);\n\n Promise.resolve()\n .then(async () => {\n await producer(ws);\n if (!(ws as any).destroyed && !(ws as any).writableEnded) {\n (ws as any).end();\n }\n })\n .catch(onError);\n });\n\n const fh = await open(tmpPath, 'r+');\n try { await fh.sync(); } finally { await fh.close(); }\n\n await rename(tmpPath, filePath);\n\n try {\n const dh = await open(dir, 'r');\n try { await dh.sync(); } finally { await dh.close(); }\n } catch {\n // ignore directory fsync errors\n }\n });\n}\n\n// ─── Path Utilities (Memoized) ──────────────────────────────────────────────\n\nexport function joinPath(...segments: string[]): string {\n const key = segments.join('\\u0000');\n const cached = joinPathCache.get(key);\n if (cached !== undefined) return cached;\n const out = path.join(...segments);\n joinPathCache.set(key, out);\n return out;\n}\n\nexport function dirnameOf(p: string): string {\n const cached = dirnameCache.get(p);\n if (cached !== undefined) return cached;\n const out = path.dirname(p);\n dirnameCache.set(p, out);\n return out;\n}\n\nexport function resolvePath(...segments: string[]): string {\n const key = segments.join('\\u0000');\n const cached = resolvePathCache.get(key);\n if (cached !== undefined) return cached;\n const out = path.resolve(...segments);\n resolvePathCache.set(key, out);\n return out;\n}\n\n// ─── Queue Status ───────────────────────────────────────────────────────────\n\nexport function getFsQueueStatus() {\n return {\n read: { size: readQueue.size, pending: readQueue.pending },\n write: { size: writeQueue.size, pending: writeQueue.pending },\n };\n}\n\nexport async function waitForFsQueuesIdle(): Promise<void> {\n await Promise.all([writeQueue.onIdle(), readQueue.onIdle()]);\n}\n","import type { BatchObject, BatchResultItem } from '../types.js';\nimport {\n ensureDir,\n readFileQueued,\n readJsonQueued,\n readDirQueued,\n writeFileQueued,\n writeFileFlushedQueued,\n appendFileQueued,\n pathExistsQueued,\n fileExistsQueued,\n joinPath,\n resolvePath,\n} from '../utils/fs-io.js';\n\nconst DEFAULT_BATCH_DIR = joinPath(process.cwd(), '.anymodel', 'batches');\n\n/**\n * Disk-based batch persistence store.\n * Uses queued, concurrency-limited IO for high-volume operations.\n * Structure: {dir}/{batchId}/meta.json, requests.jsonl, results.jsonl, provider.json\n */\nexport class BatchStore {\n private dir: string;\n private initialized = false;\n\n constructor(dir?: string) {\n this.dir = resolvePath(dir || DEFAULT_BATCH_DIR);\n }\n\n private async init(): Promise<void> {\n if (this.initialized) return;\n await ensureDir(this.dir);\n this.initialized = true;\n }\n\n private batchDir(id: string): string {\n return joinPath(this.dir, id);\n }\n\n /**\n * Create a new batch directory and save initial metadata.\n */\n async create(batch: BatchObject): Promise<void> {\n await this.init();\n const dir = this.batchDir(batch.id);\n await ensureDir(dir);\n await writeFileFlushedQueued(joinPath(dir, 'meta.json'), JSON.stringify(batch, null, 2));\n }\n\n /**\n * Update batch metadata (atomic write).\n */\n async updateMeta(batch: BatchObject): Promise<void> {\n await writeFileFlushedQueued(\n joinPath(this.batchDir(batch.id), 'meta.json'),\n JSON.stringify(batch, null, 2),\n );\n }\n\n /**\n * Save requests as JSONL.\n */\n async saveRequests(id: string, requests: unknown[]): Promise<void> {\n const lines = requests.map(r => JSON.stringify(r)).join('\\n') + '\\n';\n await writeFileQueued(joinPath(this.batchDir(id), 'requests.jsonl'), lines);\n }\n\n /**\n * Append a result to results.jsonl.\n */\n async appendResult(id: string, result: BatchResultItem): Promise<void> {\n await appendFileQueued(\n joinPath(this.batchDir(id), 'results.jsonl'),\n JSON.stringify(result) + '\\n',\n );\n }\n\n /**\n * Save provider-specific state (e.g., provider batch ID).\n */\n async saveProviderState(id: string, state: Record<string, unknown>): Promise<void> {\n await writeFileFlushedQueued(\n joinPath(this.batchDir(id), 'provider.json'),\n JSON.stringify(state, null, 2),\n );\n }\n\n /**\n * Load provider state.\n */\n async loadProviderState(id: string): Promise<Record<string, unknown> | null> {\n const p = joinPath(this.batchDir(id), 'provider.json');\n if (!(await fileExistsQueued(p))) return null;\n return readJsonQueued<Record<string, unknown>>(p);\n }\n\n /**\n * Get batch metadata.\n */\n async getMeta(id: string): Promise<BatchObject | null> {\n const p = joinPath(this.batchDir(id), 'meta.json');\n if (!(await fileExistsQueued(p))) return null;\n return readJsonQueued<BatchObject>(p);\n }\n\n /**\n * Get all results for a batch.\n */\n async getResults(id: string): Promise<BatchResultItem[]> {\n const p = joinPath(this.batchDir(id), 'results.jsonl');\n if (!(await fileExistsQueued(p))) return [];\n const raw = (await readFileQueued(p, 'utf8')) as string;\n return raw\n .trim()\n .split('\\n')\n .filter(Boolean)\n .map(line => JSON.parse(line));\n }\n\n /**\n * List all batch IDs.\n */\n async listBatches(): Promise<string[]> {\n await this.init();\n if (!(await pathExistsQueued(this.dir))) return [];\n const entries = await readDirQueued(this.dir);\n return entries\n .filter(d => d.isDirectory())\n .map(d => d.name)\n .sort();\n }\n\n /**\n * Stream requests from JSONL one line at a time (memory-efficient).\n */\n async *streamRequests(id: string): AsyncGenerator<unknown> {\n const p = joinPath(this.batchDir(id), 'requests.jsonl');\n if (!(await fileExistsQueued(p))) return;\n const raw = (await readFileQueued(p, 'utf8')) as string;\n for (const line of raw.split('\\n')) {\n if (line.trim()) yield JSON.parse(line);\n }\n }\n\n /**\n * Check if a batch exists.\n */\n async exists(id: string): Promise<boolean> {\n return fileExistsQueued(joinPath(this.batchDir(id), 'meta.json'));\n }\n}\n","import type {\n BatchCreateRequest,\n BatchObject,\n BatchResults,\n BatchResultItem,\n ChatCompletionRequest,\n BatchUsageSummary,\n} from '../types.js';\nimport { AnyModelError } from '../types.js';\nimport { generateId } from '../utils/id.js';\nimport { BatchStore } from './store.js';\nimport type { Router } from '../router.js';\nimport type { BatchAdapter } from '../providers/adapter.js';\n\nexport interface BatchPollOptions {\n /** Poll interval in ms. Default: 5000 */\n interval?: number;\n /** Timeout in ms. 0 = indefinite. Default: 0 */\n timeout?: number;\n /** Progress callback */\n onProgress?: (batch: BatchObject) => void;\n}\n\nexport class BatchManager {\n private store: BatchStore;\n private router: Router;\n private concurrencyLimit: number;\n private defaultPollInterval: number;\n private batchAdapters = new Map<string, BatchAdapter>();\n\n constructor(router: Router, options?: { dir?: string; concurrency?: number; pollInterval?: number }) {\n this.store = new BatchStore(options?.dir);\n this.router = router;\n this.concurrencyLimit = options?.concurrency ?? 5;\n this.defaultPollInterval = options?.pollInterval ?? 5000;\n }\n\n /**\n * Register a native batch adapter for a provider.\n */\n registerBatchAdapter(providerName: string, adapter: BatchAdapter): void {\n this.batchAdapters.set(providerName, adapter);\n }\n\n /**\n * Check if a provider has native batch support.\n */\n private getNativeBatchAdapter(model: string): { adapter: BatchAdapter; providerName: string } | null {\n const providerName = model.split('/')[0];\n const adapter = this.batchAdapters.get(providerName);\n return adapter ? { adapter, providerName } : null;\n }\n\n /**\n * Create a batch and return immediately (no polling).\n */\n async create(request: BatchCreateRequest): Promise<BatchObject> {\n const id = generateId('batch');\n const now = new Date().toISOString();\n const providerName = request.model.split('/')[0] || 'unknown';\n const native = this.getNativeBatchAdapter(request.model);\n const batchMode = native ? 'native' as const : 'concurrent' as const;\n\n const batch: BatchObject = {\n id,\n object: 'batch',\n status: 'pending',\n model: request.model,\n provider_name: providerName,\n batch_mode: batchMode,\n total: request.requests.length,\n completed: 0,\n failed: 0,\n created_at: now,\n completed_at: null,\n expires_at: null,\n };\n\n await this.store.create(batch);\n await this.store.saveRequests(id, request.requests);\n\n if (native) {\n this.processNativeBatch(id, request, native.adapter).catch(() => {});\n } else {\n this.processConcurrentBatch(id, request.model, request.options as Record<string, unknown> | undefined).catch(() => {});\n }\n\n return batch;\n }\n\n /**\n * Create a batch and poll until completion.\n */\n async createAndPoll(\n request: BatchCreateRequest,\n options: BatchPollOptions = {},\n ): Promise<BatchResults> {\n const batch = await this.create(request);\n return this.poll(batch.id, options);\n }\n\n /**\n * Poll an existing batch until completion.\n */\n async poll(id: string, options: BatchPollOptions = {}): Promise<BatchResults> {\n const interval = options.interval ?? this.defaultPollInterval;\n const timeout = options.timeout ?? 0;\n const startTime = Date.now();\n\n while (true) {\n let batch = await this.store.getMeta(id);\n if (!batch) {\n throw new AnyModelError(404, `Batch ${id} not found`);\n }\n\n // For native batches, sync status from provider\n if (batch.batch_mode === 'native' && batch.status === 'processing') {\n await this.syncNativeBatchStatus(id);\n batch = await this.store.getMeta(id);\n if (!batch) throw new AnyModelError(404, `Batch ${id} not found`);\n }\n\n if (options.onProgress) {\n options.onProgress(batch);\n }\n\n if (batch.status === 'completed' || batch.status === 'failed' || batch.status === 'cancelled') {\n return this.getResults(id);\n }\n\n if (timeout > 0 && Date.now() - startTime > timeout) {\n throw new AnyModelError(408, `Batch ${id} timed out after ${timeout}ms`);\n }\n\n await new Promise(resolve => setTimeout(resolve, interval));\n }\n }\n\n /**\n * Get the current status of a batch.\n */\n async get(id: string): Promise<BatchObject | null> {\n return this.store.getMeta(id);\n }\n\n /**\n * Get results for a completed batch.\n */\n async getResults(id: string): Promise<BatchResults> {\n const batch = await this.store.getMeta(id);\n if (!batch) {\n throw new AnyModelError(404, `Batch ${id} not found`);\n }\n\n const results = await this.store.getResults(id);\n\n const usage: BatchUsageSummary = {\n total_prompt_tokens: 0,\n total_completion_tokens: 0,\n estimated_cost: 0,\n };\n\n for (const result of results) {\n if (result.response) {\n usage.total_prompt_tokens += result.response.usage.prompt_tokens;\n usage.total_completion_tokens += result.response.usage.completion_tokens;\n }\n }\n\n return {\n id: batch.id,\n status: batch.status,\n results,\n usage_summary: usage,\n };\n }\n\n /**\n * List all batches.\n */\n async list(): Promise<BatchObject[]> {\n const ids = await this.store.listBatches();\n const batches: BatchObject[] = [];\n for (const id of ids) {\n const meta = await this.store.getMeta(id);\n if (meta) batches.push(meta);\n }\n return batches;\n }\n\n /**\n * Cancel a batch.\n */\n async cancel(id: string): Promise<BatchObject> {\n const batch = await this.store.getMeta(id);\n if (!batch) {\n throw new AnyModelError(404, `Batch ${id} not found`);\n }\n if (batch.status === 'completed' || batch.status === 'cancelled') {\n return batch;\n }\n\n // If native batch, cancel at provider too\n if (batch.batch_mode === 'native') {\n const providerState = await this.store.loadProviderState(id);\n const adapter = this.batchAdapters.get(batch.provider_name);\n if (adapter && providerState?.providerBatchId) {\n try {\n await adapter.cancelBatch(providerState.providerBatchId as string);\n } catch {\n // Best-effort cancellation\n }\n }\n }\n\n batch.status = 'cancelled';\n batch.completed_at = new Date().toISOString();\n await this.store.updateMeta(batch);\n return batch;\n }\n\n /**\n * Process batch via native provider batch API.\n */\n private async processNativeBatch(\n batchId: string,\n request: BatchCreateRequest,\n adapter: BatchAdapter,\n ): Promise<void> {\n const batch = await this.store.getMeta(batchId);\n if (!batch) return;\n\n try {\n const model = request.model.includes('/')\n ? request.model.split('/').slice(1).join('/')\n : request.model;\n\n const { providerBatchId, metadata } = await adapter.createBatch(\n model,\n request.requests,\n request.options as Record<string, unknown> | undefined,\n );\n\n await this.store.saveProviderState(batchId, {\n providerBatchId,\n providerName: batch.provider_name,\n ...metadata,\n });\n\n batch.status = 'processing';\n await this.store.updateMeta(batch);\n } catch (err) {\n batch.status = 'failed';\n batch.completed_at = new Date().toISOString();\n await this.store.updateMeta(batch);\n throw err;\n }\n }\n\n /**\n * Sync native batch status from provider.\n */\n private async syncNativeBatchStatus(batchId: string): Promise<void> {\n const batch = await this.store.getMeta(batchId);\n if (!batch) return;\n\n const providerState = await this.store.loadProviderState(batchId);\n if (!providerState?.providerBatchId) return;\n\n const adapter = this.batchAdapters.get(batch.provider_name);\n if (!adapter) return;\n\n try {\n const status = await adapter.pollBatch(providerState.providerBatchId as string);\n\n batch.total = status.total || batch.total;\n batch.completed = status.completed;\n batch.failed = status.failed;\n\n if (status.status === 'completed' || status.status === 'failed' || status.status === 'cancelled') {\n batch.status = status.status;\n batch.completed_at = new Date().toISOString();\n\n if (status.status === 'completed' || status.status === 'failed') {\n try {\n const results = await adapter.getBatchResults(providerState.providerBatchId as string);\n for (const result of results) {\n await this.store.appendResult(batchId, result);\n }\n batch.completed = results.filter(r => r.status === 'success').length;\n batch.failed = results.filter(r => r.status === 'error').length;\n } catch {\n if (batch.status !== 'failed') {\n batch.status = 'failed';\n }\n }\n }\n } else {\n batch.status = 'processing';\n }\n\n await this.store.updateMeta(batch);\n } catch {\n // Provider API error during poll — don't change status\n }\n }\n\n /**\n * Process batch requests concurrently (fallback path).\n * Streams requests from disk to avoid holding them all in memory.\n */\n private async processConcurrentBatch(batchId: string, model: string, options?: Record<string, unknown>): Promise<void> {\n const batch = await this.store.getMeta(batchId);\n if (!batch) return;\n batch.status = 'processing';\n await this.store.updateMeta(batch);\n\n const active = new Set<Promise<void>>();\n\n const processItem = async (item: any): Promise<void> => {\n const current = await this.store.getMeta(batchId);\n if (current?.status === 'cancelled') return;\n\n const chatRequest: ChatCompletionRequest = {\n model,\n messages: item.messages,\n max_tokens: item.max_tokens ?? (options as any)?.max_tokens,\n temperature: item.temperature ?? (options as any)?.temperature,\n top_p: item.top_p ?? (options as any)?.top_p,\n top_k: item.top_k ?? (options as any)?.top_k,\n stop: item.stop ?? (options as any)?.stop,\n response_format: item.response_format ?? (options as any)?.response_format,\n tools: item.tools ?? (options as any)?.tools,\n tool_choice: item.tool_choice ?? (options as any)?.tool_choice,\n };\n\n let result: BatchResultItem;\n try {\n const response = await this.router.complete(chatRequest);\n result = {\n custom_id: item.custom_id,\n status: 'success',\n response,\n error: null,\n };\n } catch (err) {\n const error = err instanceof AnyModelError ? err : new AnyModelError(500, String(err));\n result = {\n custom_id: item.custom_id,\n status: 'error',\n response: null,\n error: { code: error.code, message: error.message },\n };\n }\n\n await this.store.appendResult(batchId, result);\n\n const meta = await this.store.getMeta(batchId);\n if (meta) {\n if (result.status === 'success') {\n meta.completed++;\n } else {\n meta.failed++;\n }\n await this.store.updateMeta(meta);\n }\n };\n\n // Stream requests from disk instead of holding all in memory\n for await (const item of this.store.streamRequests(batchId)) {\n const current = await this.store.getMeta(batchId);\n if (current?.status === 'cancelled') break;\n\n if (active.size >= this.concurrencyLimit) {\n await Promise.race(active);\n }\n\n const promise = processItem(item).then(() => {\n active.delete(promise);\n });\n active.add(promise);\n }\n\n await Promise.all(active);\n\n const finalMeta = await this.store.getMeta(batchId);\n if (finalMeta && finalMeta.status !== 'cancelled') {\n finalMeta.status = finalMeta.failed === finalMeta.total ? 'failed' : 'completed';\n finalMeta.completed_at = new Date().toISOString();\n await this.store.updateMeta(finalMeta);\n }\n }\n}\n","/**\n * Rough token estimation and model-limit lookups for automatic max_tokens calculation.\n */\n\nconst CHARS_PER_TOKEN = 4;\n\n/** Estimate the number of tokens in a string (~4 chars per token). */\nexport function estimateTokenCount(text: string): number {\n return Math.ceil(text.length / CHARS_PER_TOKEN);\n}\n\ninterface ModelLimit {\n contextLength: number;\n maxCompletionTokens: number;\n}\n\nconst MODEL_LIMITS: Array<{ pattern: string; limit: ModelLimit }> = [\n // OpenAI\n { pattern: 'gpt-4o-mini', limit: { contextLength: 128_000, maxCompletionTokens: 16_384 } },\n { pattern: 'gpt-4o', limit: { contextLength: 128_000, maxCompletionTokens: 16_384 } },\n { pattern: 'gpt-4-turbo', limit: { contextLength: 128_000, maxCompletionTokens: 4_096 } },\n { pattern: 'gpt-3.5-turbo', limit: { contextLength: 16_385, maxCompletionTokens: 4_096 } },\n { pattern: 'o1', limit: { contextLength: 200_000, maxCompletionTokens: 100_000 } },\n { pattern: 'o3', limit: { contextLength: 200_000, maxCompletionTokens: 100_000 } },\n { pattern: 'o4-mini', limit: { contextLength: 200_000, maxCompletionTokens: 100_000 } },\n\n // Anthropic\n { pattern: 'claude-opus-4', limit: { contextLength: 200_000, maxCompletionTokens: 32_768 } },\n { pattern: 'claude-sonnet-4', limit: { contextLength: 200_000, maxCompletionTokens: 16_384 } },\n { pattern: 'claude-haiku-4', limit: { contextLength: 200_000, maxCompletionTokens: 8_192 } },\n { pattern: 'claude-3.5-sonnet', limit: { contextLength: 200_000, maxCompletionTokens: 8_192 } },\n { pattern: 'claude-3-opus', limit: { contextLength: 200_000, maxCompletionTokens: 4_096 } },\n\n // Google\n { pattern: 'gemini-2.5-pro', limit: { contextLength: 1_048_576, maxCompletionTokens: 65_536 } },\n { pattern: 'gemini-2.5-flash', limit: { contextLength: 1_048_576, maxCompletionTokens: 65_536 } },\n { pattern: 'gemini-2.0-flash', limit: { contextLength: 1_048_576, maxCompletionTokens: 65_536 } },\n { pattern: 'gemini-1.5-pro', limit: { contextLength: 2_097_152, maxCompletionTokens: 8_192 } },\n { pattern: 'gemini-1.5-flash', limit: { contextLength: 1_048_576, maxCompletionTokens: 8_192 } },\n];\n\nconst DEFAULT_LIMIT: ModelLimit = { contextLength: 128_000, maxCompletionTokens: 4_096 };\n\n/**\n * Look up context-window and max-completion-token limits for a model.\n * Strips any \"provider/\" prefix before matching.\n */\nfunction getModelLimits(model: string): ModelLimit {\n // Strip provider prefix (e.g. \"openai/gpt-4o\" -> \"gpt-4o\")\n const bare = model.includes('/') ? model.slice(model.indexOf('/') + 1) : model;\n\n for (const entry of MODEL_LIMITS) {\n if (bare.startsWith(entry.pattern) || bare.includes(entry.pattern)) {\n return entry.limit;\n }\n }\n return DEFAULT_LIMIT;\n}\n\n/**\n * Determine the best max_tokens value for a request.\n *\n * - If the caller already supplied a value, return it unchanged.\n * - Otherwise estimate input tokens, apply a 5 % safety margin, then\n * return min(maxCompletionTokens, contextLength - estimatedInput).\n * - The result is clamped to at least 1.\n */\nexport function resolveMaxTokens(\n model: string,\n messages: unknown[],\n userMaxTokens?: number,\n): number {\n if (userMaxTokens !== undefined) return userMaxTokens;\n\n const inputChars = JSON.stringify(messages).length;\n const estimatedInput = Math.ceil(inputChars / CHARS_PER_TOKEN);\n const estimatedWithMargin = Math.ceil(estimatedInput * 1.05);\n\n const limits = getModelLimits(model);\n const available = limits.contextLength - estimatedWithMargin;\n const result = Math.min(limits.maxCompletionTokens, available);\n\n return Math.max(1, result);\n}\n","import type { BatchAdapter, NativeBatchStatus } from './adapter.js';\nimport type { BatchRequestItem, BatchResultItem, ChatCompletion } from '../types.js';\nimport { AnyModelError } from '../types.js';\nimport { generateId } from '../utils/id.js';\nimport { resolveMaxTokens } from '../utils/token-estimate.js';\nimport { fetchWithTimeout } from '../utils/fetch-with-timeout.js';\n\nconst OPENAI_API_BASE = 'https://api.openai.com/v1';\n\nexport function createOpenAIBatchAdapter(apiKey: string): BatchAdapter {\n async function apiRequest(path: string, options: {\n method?: string;\n body?: unknown;\n formData?: FormData;\n } = {}): Promise<any> {\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${apiKey}`,\n };\n\n let fetchBody: BodyInit | undefined;\n if (options.formData) {\n fetchBody = options.formData;\n } else if (options.body) {\n headers['Content-Type'] = 'application/json';\n fetchBody = JSON.stringify(options.body);\n }\n\n const res = await fetchWithTimeout(`${OPENAI_API_BASE}${path}`, {\n method: options.method || 'GET',\n headers,\n body: fetchBody,\n });\n\n if (!res.ok) {\n let errorBody: any;\n try { errorBody = await res.json(); } catch { errorBody = { message: res.statusText }; }\n const msg = errorBody?.error?.message || errorBody?.message || res.statusText;\n throw new AnyModelError(res.status >= 500 ? 502 : res.status, msg, {\n provider_name: 'openai',\n raw: errorBody,\n });\n }\n\n return res;\n }\n\n function buildJSONL(model: string, requests: BatchRequestItem[]): string {\n return requests.map(req => {\n const body: Record<string, unknown> = {\n model,\n messages: req.messages,\n };\n body.max_tokens = req.max_tokens !== undefined\n ? req.max_tokens\n : resolveMaxTokens(model, req.messages);\n if (req.temperature !== undefined) body.temperature = req.temperature;\n if (req.top_p !== undefined) body.top_p = req.top_p;\n if (req.stop !== undefined) body.stop = req.stop;\n if (req.response_format !== undefined) body.response_format = req.response_format;\n if (req.tools !== undefined) body.tools = req.tools;\n if (req.tool_choice !== undefined) body.tool_choice = req.tool_choice;\n\n return JSON.stringify({\n custom_id: req.custom_id,\n method: 'POST',\n url: '/v1/chat/completions',\n body,\n });\n }).join('\\n');\n }\n\n function rePrefixId(id: string): string {\n if (id && id.startsWith('chatcmpl-')) {\n return `gen-${id.substring(9)}`;\n }\n return id.startsWith('gen-') ? id : `gen-${id}`;\n }\n\n function translateOpenAIResponse(body: any): ChatCompletion {\n return {\n id: rePrefixId(body.id || generateId()),\n object: 'chat.completion',\n created: body.created || Math.floor(Date.now() / 1000),\n model: `openai/${body.model}`,\n choices: body.choices,\n usage: body.usage,\n };\n }\n\n function mapStatus(openaiStatus: string): NativeBatchStatus['status'] {\n switch (openaiStatus) {\n case 'validating':\n case 'finalizing':\n return 'processing';\n case 'in_progress':\n return 'processing';\n case 'completed':\n return 'completed';\n case 'failed':\n return 'failed';\n case 'expired':\n return 'failed';\n case 'cancelled':\n case 'cancelling':\n return 'cancelled';\n default:\n return 'pending';\n }\n }\n\n return {\n async createBatch(model, requests, options) {\n // 1. Build JSONL content\n const jsonlContent = buildJSONL(model, requests);\n const blob = new Blob([jsonlContent], { type: 'application/jsonl' });\n\n // 2. Upload file\n const formData = new FormData();\n formData.append('purpose', 'batch');\n formData.append('file', blob, 'batch_input.jsonl');\n\n const uploadRes = await apiRequest('/files', { method: 'POST', formData });\n const fileData = await uploadRes.json();\n const inputFileId = fileData.id;\n\n // 3. Create batch\n const batchRes = await apiRequest('/batches', {\n method: 'POST',\n body: {\n input_file_id: inputFileId,\n endpoint: '/v1/chat/completions',\n completion_window: '24h',\n metadata: options?.metadata as Record<string, string> | undefined,\n },\n });\n const batchData = await batchRes.json();\n\n return {\n providerBatchId: batchData.id,\n metadata: {\n input_file_id: inputFileId,\n openai_status: batchData.status,\n },\n };\n },\n\n async pollBatch(providerBatchId) {\n const res = await apiRequest(`/batches/${providerBatchId}`);\n const data = await res.json();\n\n const requestCounts = data.request_counts || {};\n\n return {\n status: mapStatus(data.status),\n total: requestCounts.total || 0,\n completed: requestCounts.completed || 0,\n failed: requestCounts.failed || 0,\n };\n },\n\n async getBatchResults(providerBatchId) {\n // Get batch to find output file\n const batchRes = await apiRequest(`/batches/${providerBatchId}`);\n const batchData = await batchRes.json();\n\n const results: BatchResultItem[] = [];\n\n // Download output file\n if (batchData.output_file_id) {\n const outputRes = await apiRequest(`/files/${batchData.output_file_id}/content`);\n const outputText = await outputRes.text();\n\n for (const line of outputText.trim().split('\\n')) {\n if (!line) continue;\n const item = JSON.parse(line);\n\n if (item.response?.status_code === 200) {\n results.push({\n custom_id: item.custom_id,\n status: 'success',\n response: translateOpenAIResponse(item.response.body),\n error: null,\n });\n } else {\n results.push({\n custom_id: item.custom_id,\n status: 'error',\n response: null,\n error: {\n code: item.response?.status_code || 500,\n message: item.error?.message || item.response?.body?.error?.message || 'Unknown error',\n },\n });\n }\n }\n }\n\n // Download error file\n if (batchData.error_file_id) {\n const errorRes = await apiRequest(`/files/${batchData.error_file_id}/content`);\n const errorText = await errorRes.text();\n\n for (const line of errorText.trim().split('\\n')) {\n if (!line) continue;\n const item = JSON.parse(line);\n // Only add if not already in results\n const existing = results.find(r => r.custom_id === item.custom_id);\n if (!existing) {\n results.push({\n custom_id: item.custom_id,\n status: 'error',\n response: null,\n error: {\n code: item.response?.status_code || 500,\n message: item.error?.message || 'Batch item error',\n },\n });\n }\n }\n }\n\n return results;\n },\n\n async cancelBatch(providerBatchId) {\n await apiRequest(`/batches/${providerBatchId}/cancel`, { method: 'POST' });\n },\n };\n}\n","import type { BatchAdapter, NativeBatchStatus } from './adapter.js';\nimport type { BatchRequestItem, BatchResultItem, ChatCompletion, Message, ToolCall } from '../types.js';\nimport { AnyModelError } from '../types.js';\nimport { generateId } from '../utils/id.js';\nimport { resolveMaxTokens } from '../utils/token-estimate.js';\nimport { fetchWithTimeout } from '../utils/fetch-with-timeout.js';\n\nconst ANTHROPIC_API_BASE = 'https://api.anthropic.com/v1';\nconst ANTHROPIC_VERSION = '2023-06-01';\nconst DEFAULT_MAX_TOKENS = 4096;\n\nexport function createAnthropicBatchAdapter(apiKey: string): BatchAdapter {\n async function apiRequest(path: string, options: {\n method?: string;\n body?: unknown;\n } = {}): Promise<Response> {\n const headers: Record<string, string> = {\n 'x-api-key': apiKey,\n 'anthropic-version': ANTHROPIC_VERSION,\n 'Content-Type': 'application/json',\n };\n\n const res = await fetchWithTimeout(`${ANTHROPIC_API_BASE}${path}`, {\n method: options.method || 'GET',\n headers,\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (!res.ok) {\n let errorBody: any;\n try { errorBody = await res.json(); } catch { errorBody = { message: res.statusText }; }\n const msg = errorBody?.error?.message || errorBody?.message || res.statusText;\n throw new AnyModelError(res.status >= 500 ? 502 : res.status, msg, {\n provider_name: 'anthropic',\n raw: errorBody,\n });\n }\n\n return res;\n }\n\n function translateToAnthropicParams(model: string, req: BatchRequestItem): Record<string, unknown> {\n const params: Record<string, unknown> = {\n model,\n max_tokens: resolveMaxTokens(model, req.messages, req.max_tokens || DEFAULT_MAX_TOKENS),\n };\n\n // Extract system messages\n const systemMessages = req.messages.filter(m => m.role === 'system');\n const nonSystemMessages = req.messages.filter(m => m.role !== 'system');\n\n if (systemMessages.length > 0) {\n params.system = systemMessages\n .map(m => typeof m.content === 'string' ? m.content : '')\n .join('\\n');\n }\n\n // Map messages\n params.messages = nonSystemMessages.map(m => ({\n role: m.role === 'tool' ? 'user' : m.role,\n content: m.tool_call_id\n ? [{ type: 'tool_result', tool_use_id: m.tool_call_id, content: typeof m.content === 'string' ? m.content : '' }]\n : m.content,\n }));\n\n if (req.temperature !== undefined) params.temperature = req.temperature;\n if (req.top_p !== undefined) params.top_p = req.top_p;\n if (req.top_k !== undefined) params.top_k = req.top_k;\n if (req.stop !== undefined) params.stop_sequences = Array.isArray(req.stop) ? req.stop : [req.stop];\n\n // Map tools\n if (req.tools && req.tools.length > 0) {\n params.tools = req.tools.map(t => ({\n name: t.function.name,\n description: t.function.description || '',\n input_schema: t.function.parameters || { type: 'object', properties: {} },\n }));\n\n if (req.tool_choice) {\n if (req.tool_choice === 'auto') {\n params.tool_choice = { type: 'auto' };\n } else if (req.tool_choice === 'required') {\n params.tool_choice = { type: 'any' };\n } else if (req.tool_choice === 'none') {\n delete params.tools;\n } else if (typeof req.tool_choice === 'object') {\n params.tool_choice = { type: 'tool', name: req.tool_choice.function.name };\n }\n }\n }\n\n // Handle response_format\n if (req.response_format) {\n if (req.response_format.type === 'json_object' || req.response_format.type === 'json_schema') {\n const jsonInstruction = 'Respond with valid JSON only. Do not include any text outside the JSON object.';\n params.system = params.system ? `${jsonInstruction}\\n\\n${params.system}` : jsonInstruction;\n }\n }\n\n return params;\n }\n\n function mapStopReason(reason: string): 'stop' | 'length' | 'tool_calls' | 'content_filter' | 'error' {\n switch (reason) {\n case 'end_turn': return 'stop';\n case 'max_tokens': return 'length';\n case 'tool_use': return 'tool_calls';\n case 'stop_sequence': return 'stop';\n default: return 'stop';\n }\n }\n\n function translateAnthropicMessage(msg: any): ChatCompletion {\n let content = '';\n const toolCalls: ToolCall[] = [];\n\n for (const block of msg.content || []) {\n if (block.type === 'text') {\n content += block.text;\n } else if (block.type === 'tool_use') {\n toolCalls.push({\n id: block.id,\n type: 'function',\n function: {\n name: block.name,\n arguments: JSON.stringify(block.input),\n },\n });\n }\n }\n\n const message: Message = { role: 'assistant', content };\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n\n return {\n id: generateId(),\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: `anthropic/${msg.model}`,\n choices: [{\n index: 0,\n message,\n finish_reason: mapStopReason(msg.stop_reason),\n }],\n usage: {\n prompt_tokens: msg.usage?.input_tokens || 0,\n completion_tokens: msg.usage?.output_tokens || 0,\n total_tokens: (msg.usage?.input_tokens || 0) + (msg.usage?.output_tokens || 0),\n },\n };\n }\n\n return {\n async createBatch(model, requests, _options) {\n // Build Anthropic batch request format\n const batchRequests = requests.map(req => ({\n custom_id: req.custom_id,\n params: translateToAnthropicParams(model, req),\n }));\n\n const res = await apiRequest('/messages/batches', {\n method: 'POST',\n body: { requests: batchRequests },\n });\n const data = await res.json();\n\n return {\n providerBatchId: data.id,\n metadata: {\n anthropic_type: data.type,\n created_at: data.created_at,\n },\n };\n },\n\n async pollBatch(providerBatchId) {\n const res = await apiRequest(`/messages/batches/${providerBatchId}`);\n const data = await res.json();\n\n const counts = data.request_counts || {};\n const total = (counts.processing || 0) + (counts.succeeded || 0) +\n (counts.errored || 0) + (counts.canceled || 0) + (counts.expired || 0);\n\n let status: NativeBatchStatus['status'];\n if (data.processing_status === 'ended') {\n // Check if all failed\n if (counts.succeeded === 0 && (counts.errored > 0 || counts.expired > 0 || counts.canceled > 0)) {\n status = 'failed';\n } else if (data.cancel_initiated_at) {\n status = 'cancelled';\n } else {\n status = 'completed';\n }\n } else {\n status = 'processing';\n }\n\n return {\n status,\n total,\n completed: counts.succeeded || 0,\n failed: (counts.errored || 0) + (counts.expired || 0) + (counts.canceled || 0),\n };\n },\n\n async getBatchResults(providerBatchId) {\n const res = await apiRequest(`/messages/batches/${providerBatchId}/results`);\n const text = await res.text();\n const results: BatchResultItem[] = [];\n\n for (const line of text.trim().split('\\n')) {\n if (!line) continue;\n const item = JSON.parse(line);\n\n if (item.result?.type === 'succeeded') {\n results.push({\n custom_id: item.custom_id,\n status: 'success',\n response: translateAnthropicMessage(item.result.message),\n error: null,\n });\n } else {\n // errored, expired, or canceled\n const errorType = item.result?.type || 'unknown';\n const errorMsg = item.result?.error?.message || `Batch item ${errorType}`;\n results.push({\n custom_id: item.custom_id,\n status: 'error',\n response: null,\n error: {\n code: errorType === 'expired' ? 408 : 500,\n message: errorMsg,\n },\n });\n }\n }\n\n return results;\n },\n\n async cancelBatch(providerBatchId) {\n await apiRequest(`/messages/batches/${providerBatchId}/cancel`, { method: 'POST' });\n },\n };\n}\n","import type { BatchAdapter, NativeBatchStatus } from './adapter.js';\nimport type { BatchRequestItem, BatchResultItem, ChatCompletion, Message, ToolCall } from '../types.js';\nimport { AnyModelError } from '../types.js';\nimport { generateId } from '../utils/id.js';\nimport { resolveMaxTokens } from '../utils/token-estimate.js';\nimport { fetchWithTimeout } from '../utils/fetch-with-timeout.js';\n\nconst GEMINI_API_BASE = 'https://generativelanguage.googleapis.com/v1beta';\n\nexport function createGoogleBatchAdapter(apiKey: string): BatchAdapter {\n async function apiRequest(path: string, options: {\n method?: string;\n body?: unknown;\n } = {}): Promise<Response> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-goog-api-key': apiKey,\n };\n\n const res = await fetchWithTimeout(`${GEMINI_API_BASE}${path}`, {\n method: options.method || 'GET',\n headers,\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (!res.ok) {\n let errorBody: any;\n try { errorBody = await res.json(); } catch { errorBody = { message: res.statusText }; }\n const msg = errorBody?.error?.message || errorBody?.message || res.statusText;\n throw new AnyModelError(res.status >= 500 ? 502 : res.status, msg, {\n provider_name: 'google',\n raw: errorBody,\n });\n }\n\n return res;\n }\n\n function translateRequestToGemini(model: string, req: BatchRequestItem): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n\n // Extract system messages\n const systemMessages = req.messages.filter(m => m.role === 'system');\n const nonSystemMessages = req.messages.filter(m => m.role !== 'system');\n\n if (systemMessages.length > 0) {\n body.systemInstruction = {\n parts: [{ text: systemMessages.map(m => typeof m.content === 'string' ? m.content : '').join('\\n') }],\n };\n }\n\n // Map messages to contents\n body.contents = nonSystemMessages.map(m => ({\n role: m.role === 'assistant' ? 'model' : 'user',\n parts: typeof m.content === 'string'\n ? [{ text: m.content }]\n : Array.isArray(m.content)\n ? m.content.map((p: any) => p.type === 'text' ? { text: p.text } : { text: '' })\n : [{ text: '' }],\n }));\n\n // Generation config\n const generationConfig: Record<string, unknown> = {};\n if (req.temperature !== undefined) generationConfig.temperature = req.temperature;\n generationConfig.maxOutputTokens = req.max_tokens !== undefined\n ? req.max_tokens\n : resolveMaxTokens(model, req.messages);\n if (req.top_p !== undefined) generationConfig.topP = req.top_p;\n if (req.top_k !== undefined) generationConfig.topK = req.top_k;\n if (req.stop !== undefined) {\n generationConfig.stopSequences = Array.isArray(req.stop) ? req.stop : [req.stop];\n }\n\n if (req.response_format) {\n if (req.response_format.type === 'json_object') {\n generationConfig.responseMimeType = 'application/json';\n } else if (req.response_format.type === 'json_schema') {\n generationConfig.responseMimeType = 'application/json';\n generationConfig.responseSchema = req.response_format.json_schema?.schema;\n }\n }\n\n if (Object.keys(generationConfig).length > 0) {\n body.generationConfig = generationConfig;\n }\n\n // Map tools\n if (req.tools && req.tools.length > 0) {\n body.tools = [{\n functionDeclarations: req.tools.map(t => ({\n name: t.function.name,\n description: t.function.description || '',\n parameters: t.function.parameters || {},\n })),\n }];\n\n if (req.tool_choice) {\n if (req.tool_choice === 'auto') {\n body.toolConfig = { functionCallingConfig: { mode: 'AUTO' } };\n } else if (req.tool_choice === 'required') {\n body.toolConfig = { functionCallingConfig: { mode: 'ANY' } };\n } else if (req.tool_choice === 'none') {\n body.toolConfig = { functionCallingConfig: { mode: 'NONE' } };\n } else if (typeof req.tool_choice === 'object') {\n body.toolConfig = {\n functionCallingConfig: {\n mode: 'ANY',\n allowedFunctionNames: [req.tool_choice.function.name],\n },\n };\n }\n }\n }\n\n return body;\n }\n\n function mapFinishReason(reason: string): 'stop' | 'length' | 'tool_calls' | 'content_filter' | 'error' {\n switch (reason) {\n case 'STOP': return 'stop';\n case 'MAX_TOKENS': return 'length';\n case 'SAFETY': return 'content_filter';\n case 'RECITATION': return 'content_filter';\n default: return 'stop';\n }\n }\n\n function translateGeminiResponse(response: any, model: string): ChatCompletion {\n const candidate = response.candidates?.[0];\n\n let content = '';\n const toolCalls: ToolCall[] = [];\n\n for (const part of candidate?.content?.parts || []) {\n if (part.text) {\n content += part.text;\n } else if (part.functionCall) {\n toolCalls.push({\n id: generateId('call'),\n type: 'function',\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args || {}),\n },\n });\n }\n }\n\n const message: Message = { role: 'assistant', content };\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n\n const finishReason = toolCalls.length > 0\n ? 'tool_calls' as const\n : mapFinishReason(candidate?.finishReason || 'STOP');\n\n return {\n id: generateId(),\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: `google/${model}`,\n choices: [{ index: 0, message, finish_reason: finishReason }],\n usage: {\n prompt_tokens: response.usageMetadata?.promptTokenCount || 0,\n completion_tokens: response.usageMetadata?.candidatesTokenCount || 0,\n total_tokens: response.usageMetadata?.totalTokenCount || 0,\n },\n };\n }\n\n function mapBatchState(state: string): NativeBatchStatus['status'] {\n switch (state) {\n case 'JOB_STATE_PENDING':\n return 'pending';\n case 'JOB_STATE_RUNNING':\n return 'processing';\n case 'JOB_STATE_SUCCEEDED':\n return 'completed';\n case 'JOB_STATE_FAILED':\n return 'failed';\n case 'JOB_STATE_CANCELLED':\n return 'cancelled';\n case 'JOB_STATE_EXPIRED':\n return 'failed';\n default:\n return 'pending';\n }\n }\n\n return {\n async createBatch(model, requests, _options) {\n // Build inline batch requests\n const batchRequests = requests.map(req => ({\n request: translateRequestToGemini(model, req),\n metadata: { key: req.custom_id },\n }));\n\n const res = await apiRequest(`/models/${model}:batchGenerateContent`, {\n method: 'POST',\n body: {\n batch: {\n display_name: `anymodel-batch-${Date.now()}`,\n input_config: {\n requests: {\n requests: batchRequests,\n },\n },\n },\n },\n });\n const data = await res.json();\n\n // The response contains a batch name like \"batches/123456789\"\n const batchName = data.name || data.batch?.name;\n if (!batchName) {\n throw new AnyModelError(502, 'No batch name in Google response', {\n provider_name: 'google',\n raw: data,\n });\n }\n\n return {\n providerBatchId: batchName,\n metadata: {\n model,\n total_requests: requests.length,\n },\n };\n },\n\n async pollBatch(providerBatchId) {\n const res = await apiRequest(`/${providerBatchId}`);\n const data = await res.json();\n\n const state = data.state || 'JOB_STATE_PENDING';\n const status = mapBatchState(state);\n\n // Google doesn't provide granular counts during processing\n const totalCount = data.totalCount || data.metadata?.total_requests || 0;\n const successCount = data.succeededCount || 0;\n const failedCount = data.failedCount || 0;\n\n return {\n status,\n total: totalCount || successCount + failedCount,\n completed: successCount,\n failed: failedCount,\n };\n },\n\n async getBatchResults(providerBatchId) {\n // First get the batch to check for inline results or file reference\n const batchRes = await apiRequest(`/${providerBatchId}`);\n const batchData = await batchRes.json();\n\n const results: BatchResultItem[] = [];\n const model = batchData.metadata?.model || 'unknown';\n\n // Check for inline responses\n if (batchData.response?.inlinedResponses) {\n for (const item of batchData.response.inlinedResponses) {\n const customId = item.metadata?.key || `request-${results.length}`;\n\n if (item.response) {\n results.push({\n custom_id: customId,\n status: 'success',\n response: translateGeminiResponse(item.response, model),\n error: null,\n });\n } else if (item.error) {\n results.push({\n custom_id: customId,\n status: 'error',\n response: null,\n error: {\n code: item.error.code || 500,\n message: item.error.message || 'Batch item failed',\n },\n });\n }\n }\n return results;\n }\n\n // Check for file-based results\n const responsesFile = batchData.response?.responsesFileName ||\n batchData.outputConfig?.file_name;\n\n if (responsesFile) {\n const downloadUrl = `${GEMINI_API_BASE}/${responsesFile}:download?alt=media`;\n const fileRes = await fetchWithTimeout(downloadUrl, {\n headers: { 'x-goog-api-key': apiKey },\n });\n\n if (!fileRes.ok) {\n throw new AnyModelError(502, 'Failed to download batch results file', {\n provider_name: 'google',\n });\n }\n\n const text = await fileRes.text();\n for (const line of text.trim().split('\\n')) {\n if (!line) continue;\n const item = JSON.parse(line);\n const customId = item.key || item.metadata?.key || `request-${results.length}`;\n\n if (item.response) {\n results.push({\n custom_id: customId,\n status: 'success',\n response: translateGeminiResponse(item.response, model),\n error: null,\n });\n } else if (item.error) {\n results.push({\n custom_id: customId,\n status: 'error',\n response: null,\n error: {\n code: item.error.code || 500,\n message: item.error.message || 'Batch item failed',\n },\n });\n }\n }\n }\n\n return results;\n },\n\n async cancelBatch(providerBatchId) {\n await apiRequest(`/${providerBatchId}:cancel`, { method: 'POST' });\n },\n };\n}\n","import type {\n AnyModelConfig,\n ChatCompletionRequest,\n ChatCompletion,\n ChatCompletionChunk,\n ModelInfo,\n GenerationStats,\n BatchCreateRequest,\n BatchObject,\n BatchResults,\n} from './types.js';\nimport { ProviderRegistry } from './providers/registry.js';\nimport { Router } from './router.js';\nimport { createOpenAIAdapter } from './providers/openai.js';\nimport { createAnthropicAdapter } from './providers/anthropic.js';\nimport { createGoogleAdapter } from './providers/google.js';\nimport { createPerplexityAdapter } from './providers/perplexity.js';\nimport { createCustomAdapter } from './providers/custom.js';\nimport { resolveConfig } from './config.js';\nimport { GenerationStatsStore } from './utils/generation-stats.js';\nimport { BatchManager, type BatchPollOptions } from './batch/manager.js';\nimport { createOpenAIBatchAdapter } from './providers/openai-batch.js';\nimport { createAnthropicBatchAdapter } from './providers/anthropic-batch.js';\nimport { createGoogleBatchAdapter } from './providers/google-batch.js';\nimport { configureFsIO } from './utils/fs-io.js';\nimport { setDefaultTimeout } from './utils/fetch-with-timeout.js';\n\nexport class AnyModel {\n private registry: ProviderRegistry;\n private router: Router;\n private config: AnyModelConfig;\n private modelCache: ModelInfo[] | null = null;\n private statsStore = new GenerationStatsStore();\n private batchManager!: BatchManager;\n\n public readonly chat: {\n completions: {\n create: (request: ChatCompletionRequest) => Promise<ChatCompletion | AsyncIterable<ChatCompletionChunk>>;\n };\n };\n\n public readonly models: {\n list: (opts?: { provider?: string }) => Promise<ModelInfo[]>;\n refresh: () => Promise<ModelInfo[]>;\n };\n\n public readonly generation: {\n get: (id: string) => GenerationStats | undefined;\n list: (limit?: number) => GenerationStats[];\n };\n\n public readonly batches: {\n create: (request: BatchCreateRequest) => Promise<BatchObject>;\n createAndPoll: (request: BatchCreateRequest, options?: BatchPollOptions) => Promise<BatchResults>;\n poll: (id: string, options?: BatchPollOptions) => Promise<BatchResults>;\n get: (id: string) => Promise<BatchObject | null>;\n list: () => Promise<BatchObject[]>;\n cancel: (id: string) => Promise<BatchObject>;\n results: (id: string) => Promise<BatchResults>;\n };\n\n constructor(config: AnyModelConfig = {}) {\n this.config = resolveConfig(config);\n this.registry = new ProviderRegistry();\n\n // Configure HTTP request timeout (config is in seconds, convert to ms)\n setDefaultTimeout((this.config.defaults?.timeout ?? 120) * 1000);\n\n // Configure filesystem IO concurrency\n if (this.config.io) {\n configureFsIO(this.config.io);\n }\n\n this.registerProviders();\n\n this.router = new Router(this.registry, this.config.aliases, this.config);\n\n // Namespace: chat.completions\n this.chat = {\n completions: {\n create: async (request: ChatCompletionRequest) => {\n const merged = this.applyDefaults(request);\n\n if (merged.stream) {\n return this.router.stream(merged);\n }\n\n const startTime = Date.now();\n const response = await this.router.complete(merged);\n const endTime = Date.now();\n\n // Record generation stats\n const providerName = response.model.includes('/')\n ? response.model.split('/')[0]\n : 'unknown';\n\n this.statsStore.record({\n id: response.id,\n model: response.model,\n providerName,\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n startTime,\n endTime,\n finishReason: response.choices[0]?.finish_reason || 'stop',\n streamed: false,\n });\n\n return response;\n },\n },\n };\n\n // Namespace: models\n this.models = {\n list: async (opts?: { provider?: string }) => {\n if (!this.modelCache) {\n this.modelCache = await this.fetchModels();\n }\n if (opts?.provider) {\n return this.modelCache.filter(m => m.id.startsWith(`${opts.provider}/`));\n }\n return this.modelCache;\n },\n refresh: async () => {\n this.modelCache = null;\n return this.models.list();\n },\n };\n\n // Namespace: generation\n this.generation = {\n get: (id: string) => this.statsStore.get(id),\n list: (limit?: number) => this.statsStore.list(limit),\n };\n\n // Namespace: batches\n this.batchManager = new BatchManager(this.router, {\n dir: this.config.batch?.dir,\n concurrency: this.config.batch?.concurrencyFallback,\n pollInterval: this.config.batch?.pollInterval,\n });\n\n this.registerBatchAdapters();\n\n this.batches = {\n create: (request) => this.batchManager.create(request),\n createAndPoll: (request, options) => this.batchManager.createAndPoll(request, options),\n poll: (id, options) => this.batchManager.poll(id, options),\n get: (id) => this.batchManager.get(id),\n list: () => this.batchManager.list(),\n cancel: (id) => this.batchManager.cancel(id),\n results: (id) => this.batchManager.getResults(id),\n };\n }\n\n private registerProviders(): void {\n const config = this.config;\n\n // OpenAI — native adapter\n const openaiKey = config.openai?.apiKey || process.env.OPENAI_API_KEY;\n if (openaiKey) {\n this.registry.register('openai', createOpenAIAdapter(openaiKey));\n }\n\n // Anthropic — native adapter\n const anthropicKey = config.anthropic?.apiKey || process.env.ANTHROPIC_API_KEY;\n if (anthropicKey) {\n this.registry.register('anthropic', createAnthropicAdapter(anthropicKey));\n }\n\n // Google — native adapter\n const googleKey = config.google?.apiKey || process.env.GOOGLE_API_KEY;\n if (googleKey) {\n this.registry.register('google', createGoogleAdapter(googleKey));\n }\n\n // Perplexity — native adapter\n const perplexityKey = config.perplexity?.apiKey || process.env.PERPLEXITY_API_KEY;\n if (perplexityKey) {\n this.registry.register('perplexity', createPerplexityAdapter(perplexityKey));\n }\n\n // Built-in OpenAI-compatible providers\n const builtinProviders: Array<{\n name: string;\n baseURL: string;\n configKey: keyof typeof config;\n envVar: string;\n }> = [\n { name: 'mistral', baseURL: 'https://api.mistral.ai/v1', configKey: 'mistral', envVar: 'MISTRAL_API_KEY' },\n { name: 'groq', baseURL: 'https://api.groq.com/openai/v1', configKey: 'groq', envVar: 'GROQ_API_KEY' },\n { name: 'deepseek', baseURL: 'https://api.deepseek.com', configKey: 'deepseek', envVar: 'DEEPSEEK_API_KEY' },\n { name: 'xai', baseURL: 'https://api.x.ai/v1', configKey: 'xai', envVar: 'XAI_API_KEY' },\n { name: 'together', baseURL: 'https://api.together.xyz/v1', configKey: 'together', envVar: 'TOGETHER_API_KEY' },\n { name: 'fireworks', baseURL: 'https://api.fireworks.ai/inference/v1', configKey: 'fireworks', envVar: 'FIREWORKS_API_KEY' },\n ];\n\n for (const { name, baseURL, configKey, envVar } of builtinProviders) {\n const providerConfig = config[configKey] as { apiKey?: string } | undefined;\n const key = providerConfig?.apiKey || process.env[envVar];\n if (key) {\n this.registry.register(name, createCustomAdapter(name, { baseURL, apiKey: key }));\n }\n }\n\n // Ollama — local, no API key needed\n const ollamaConfig = config.ollama;\n const ollamaURL = ollamaConfig?.baseURL || process.env.OLLAMA_BASE_URL || 'http://localhost:11434/v1';\n if (ollamaConfig || process.env.OLLAMA_BASE_URL) {\n this.registry.register('ollama', createCustomAdapter('ollama', { baseURL: ollamaURL }));\n }\n\n // Custom providers\n if (config.custom) {\n for (const [name, customConfig] of Object.entries(config.custom)) {\n this.registry.register(name, createCustomAdapter(name, customConfig));\n }\n }\n }\n\n private registerBatchAdapters(): void {\n const config = this.config;\n\n const openaiKey = config.openai?.apiKey || process.env.OPENAI_API_KEY;\n if (openaiKey) {\n this.batchManager.registerBatchAdapter('openai', createOpenAIBatchAdapter(openaiKey));\n }\n\n const anthropicKey = config.anthropic?.apiKey || process.env.ANTHROPIC_API_KEY;\n if (anthropicKey) {\n this.batchManager.registerBatchAdapter('anthropic', createAnthropicBatchAdapter(anthropicKey));\n }\n\n const googleKey = config.google?.apiKey || process.env.GOOGLE_API_KEY;\n if (googleKey) {\n this.batchManager.registerBatchAdapter('google', createGoogleBatchAdapter(googleKey));\n }\n }\n\n private applyDefaults(request: ChatCompletionRequest): ChatCompletionRequest {\n const defaults = this.config.defaults;\n if (!defaults) return request;\n\n return {\n ...request,\n temperature: request.temperature ?? defaults.temperature,\n max_tokens: request.max_tokens ?? defaults.max_tokens,\n };\n }\n\n private async fetchModels(): Promise<ModelInfo[]> {\n const all: ModelInfo[] = [];\n for (const adapter of this.registry.all()) {\n try {\n const models = await adapter.listModels();\n all.push(...models);\n } catch {\n // Skip providers that fail model listing\n }\n }\n return all.sort((a, b) => a.id.localeCompare(b.id));\n }\n\n getRegistry(): ProviderRegistry {\n return this.registry;\n }\n}\n","#!/usr/bin/env node\n\nimport { startServer } from './server.js';\n\nconst args = process.argv.slice(2);\n\nif (args[0] === 'serve') {\n const port = getArg(args, '--port', '4141');\n const host = getArg(args, '--host', '0.0.0.0');\n\n startServer({\n port: parseInt(port, 10),\n host,\n });\n} else {\n console.log('@probeo/anymodel v0.1.0');\n console.log('');\n console.log('Usage:');\n console.log(' anymodel serve [--port 4141] [--host 0.0.0.0]');\n console.log('');\n console.log('SDK usage:');\n console.log(' import { AnyModel } from \"@probeo/anymodel\";');\n console.log(' const client = new AnyModel();');\n console.log(' const res = await client.chat.completions.create({');\n console.log(' model: \"anthropic/claude-sonnet-4-6\",');\n console.log(' messages: [{ role: \"user\", content: \"Hello\" }]');\n console.log(' });');\n}\n\nfunction getArg(args: string[], flag: string, defaultValue: string): string {\n const idx = args.indexOf(flag);\n if (idx >= 0 && idx + 1 < args.length) {\n return args[idx + 1];\n }\n return defaultValue;\n}\n"],"mappings":"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","names":["resolve","path","SUPPORTED_PARAMS","path","SUPPORTED_PARAMS","FALLBACK_MODELS","SUPPORTED_PARAMS","path","path","resolve","CHARS_PER_TOKEN","CHARS_PER_TOKEN","OPENAI_API_BASE","path","ANTHROPIC_API_BASE","ANTHROPIC_VERSION","DEFAULT_MAX_TOKENS","path","GEMINI_API_BASE","path","resolve","path","args"]}
1
+ {"version":3,"sources":["../src/server.ts","../src/types.ts","../src/providers/registry.ts","../src/utils/model-parser.ts","../src/utils/validate.ts","../src/utils/retry.ts","../src/utils/rate-limiter.ts","../src/utils/transforms.ts","../src/router.ts","../src/utils/fetch-with-timeout.ts","../src/providers/openai.ts","../src/utils/id.ts","../src/providers/anthropic.ts","../src/providers/google.ts","../src/providers/perplexity.ts","../src/providers/custom.ts","../src/config.ts","../src/utils/generation-stats.ts","../src/utils/fs-io.ts","../src/batch/store.ts","../src/batch/manager.ts","../src/utils/token-estimate.ts","../src/providers/openai-batch.ts","../src/providers/anthropic-batch.ts","../src/providers/google-batch.ts","../src/client.ts","../src/cli.ts"],"sourcesContent":["import { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport { AnyModel } from './client.js';\nimport type { AnyModelConfig, ChatCompletionRequest, ChatCompletionChunk } from './types.js';\n\nexport interface ServerOptions {\n port?: number;\n host?: string;\n config?: AnyModelConfig;\n}\n\nfunction parseBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on('data', (chunk) => chunks.push(chunk));\n req.on('end', () => resolve(Buffer.concat(chunks).toString()));\n req.on('error', reject);\n });\n}\n\nfunction sendJSON(res: ServerResponse, status: number, body: unknown): void {\n res.writeHead(status, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(body));\n}\n\nfunction sendError(res: ServerResponse, status: number, message: string): void {\n sendJSON(res, status, { error: { code: status, message, metadata: {} } });\n}\n\nasync function sendSSE(res: ServerResponse, stream: AsyncIterable<ChatCompletionChunk>): Promise<void> {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n });\n\n for await (const chunk of stream) {\n res.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n }\n\n res.write('data: [DONE]\\n\\n');\n res.end();\n}\n\nexport function createAnyModelServer(options: ServerOptions = {}): ReturnType<typeof createServer> {\n const client = new AnyModel(options.config);\n const basePath = '/api/v1';\n\n const server = createServer(async (req, res) => {\n const url = new URL(req.url || '/', `http://${req.headers.host}`);\n const path = url.pathname;\n\n // CORS headers\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n try {\n // Health check\n if (path === '/health' && req.method === 'GET') {\n sendJSON(res, 200, { status: 'ok' });\n return;\n }\n\n // Chat completions\n if (path === `${basePath}/chat/completions` && req.method === 'POST') {\n const body = JSON.parse(await parseBody(req)) as ChatCompletionRequest;\n\n if (body.stream) {\n const stream = await client.chat.completions.create(body) as AsyncIterable<ChatCompletionChunk>;\n await sendSSE(res, stream);\n } else {\n const response = await client.chat.completions.create(body);\n sendJSON(res, 200, response);\n }\n return;\n }\n\n // Models list\n if (path === `${basePath}/models` && req.method === 'GET') {\n const provider = url.searchParams.get('provider') || undefined;\n const models = await client.models.list({ provider });\n sendJSON(res, 200, { object: 'list', data: models });\n return;\n }\n\n // Generation stats\n if (path.startsWith(`${basePath}/generation/`) && req.method === 'GET') {\n const id = path.substring(`${basePath}/generation/`.length);\n const stats = client.generation.get(id);\n if (!stats) {\n sendError(res, 404, `Generation ${id} not found`);\n return;\n }\n sendJSON(res, 200, stats);\n return;\n }\n\n // Batch endpoints\n if (path === `${basePath}/batches` && req.method === 'POST') {\n const body = JSON.parse(await parseBody(req));\n const batch = await client.batches.create(body);\n sendJSON(res, 201, batch);\n return;\n }\n\n if (path === `${basePath}/batches` && req.method === 'GET') {\n const batches = await client.batches.list();\n sendJSON(res, 200, { object: 'list', data: batches });\n return;\n }\n\n if (path.startsWith(`${basePath}/batches/`) && req.method === 'GET') {\n const parts = path.substring(`${basePath}/batches/`.length).split('/');\n const id = parts[0];\n\n if (parts[1] === 'results') {\n const results = await client.batches.results(id);\n sendJSON(res, 200, results);\n return;\n }\n\n const batch = await client.batches.get(id);\n if (!batch) {\n sendError(res, 404, `Batch ${id} not found`);\n return;\n }\n sendJSON(res, 200, batch);\n return;\n }\n\n if (path.startsWith(`${basePath}/batches/`) && req.method === 'POST') {\n const parts = path.substring(`${basePath}/batches/`.length).split('/');\n const id = parts[0];\n\n if (parts[1] === 'cancel') {\n const batch = await client.batches.cancel(id);\n sendJSON(res, 200, batch);\n return;\n }\n }\n\n sendError(res, 404, `Not found: ${path}`);\n } catch (err: any) {\n const code = err?.code || 500;\n const message = err?.message || 'Internal server error';\n sendError(res, code, message);\n }\n });\n\n return server;\n}\n\nexport function startServer(options: ServerOptions = {}): void {\n const port = options.port ?? 4141;\n const host = options.host ?? '0.0.0.0';\n\n const server = createAnyModelServer(options);\n\n server.listen(port, host, () => {\n console.log(`@probeo/anymodel server running at http://${host}:${port}`);\n console.log(`API base: http://${host}:${port}/api/v1`);\n console.log('');\n console.log('Endpoints:');\n console.log(' POST /api/v1/chat/completions');\n console.log(' GET /api/v1/models');\n console.log(' GET /api/v1/generation/:id');\n console.log(' POST /api/v1/batches');\n console.log(' GET /api/v1/batches');\n console.log(' GET /api/v1/batches/:id');\n console.log(' GET /api/v1/batches/:id/results');\n console.log(' POST /api/v1/batches/:id/cancel');\n console.log(' GET /health');\n });\n}\n","// ─── Messages ────────────────────────────────────────────────────────────────\n\nexport type Role = 'system' | 'user' | 'assistant' | 'tool';\n\nexport interface Message {\n role: Role;\n content: string | ContentPart[];\n name?: string;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n}\n\nexport interface ContentPart {\n type: 'text' | 'image_url';\n text?: string;\n image_url?: { url: string; detail?: 'auto' | 'low' | 'high' };\n}\n\n// ─── Tools ───────────────────────────────────────────────────────────────────\n\nexport interface Tool {\n type: 'function';\n function: {\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n };\n}\n\nexport type ToolChoice =\n | 'none'\n | 'auto'\n | 'required'\n | { type: 'function'; function: { name: string } };\n\nexport interface ToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\n// ─── Response Format ─────────────────────────────────────────────────────────\n\nexport type ResponseFormat =\n | { type: 'text' }\n | { type: 'json_object' }\n | { type: 'json_schema'; json_schema: { name: string; schema: Record<string, unknown>; strict?: boolean } };\n\n// ─── Chat Completion Request ─────────────────────────────────────────────────\n\nexport interface ProviderPreferences {\n order?: string[];\n only?: string[];\n ignore?: string[];\n allow_fallbacks?: boolean;\n require_parameters?: boolean;\n sort?: 'price' | 'throughput' | 'latency';\n}\n\nexport interface ChatCompletionRequest {\n // Required\n model: string;\n messages: Message[];\n\n // Standard optional\n max_tokens?: number;\n temperature?: number;\n top_p?: number;\n top_k?: number;\n frequency_penalty?: number;\n presence_penalty?: number;\n repetition_penalty?: number;\n seed?: number;\n stop?: string | string[];\n stream?: boolean;\n logprobs?: boolean;\n top_logprobs?: number;\n response_format?: ResponseFormat;\n tools?: Tool[];\n tool_choice?: ToolChoice;\n user?: string;\n service_tier?: 'auto' | 'flex';\n\n // Anymodel-specific (mirrors OpenRouter)\n models?: string[];\n route?: 'fallback';\n transforms?: string[];\n provider?: ProviderPreferences;\n}\n\n// ─── Chat Completion Response ────────────────────────────────────────────────\n\nexport type FinishReason = 'stop' | 'length' | 'tool_calls' | 'content_filter' | 'error';\n\nexport interface Usage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n}\n\nexport interface ChatCompletionChoice {\n index: number;\n message: Message;\n finish_reason: FinishReason;\n logprobs?: unknown;\n}\n\nexport interface ChatCompletion {\n id: string;\n object: 'chat.completion';\n created: number;\n model: string;\n choices: ChatCompletionChoice[];\n usage: Usage;\n}\n\n// ─── Streaming ───────────────────────────────────────────────────────────────\n\nexport interface ChunkDelta {\n role?: Role;\n content?: string;\n tool_calls?: Partial<ToolCall>[];\n}\n\nexport interface ChunkChoice {\n index: number;\n delta: ChunkDelta;\n finish_reason: FinishReason | null;\n logprobs?: unknown;\n}\n\nexport interface ChatCompletionChunk {\n id: string;\n object: 'chat.completion.chunk';\n created: number;\n model: string;\n choices: ChunkChoice[];\n usage?: Usage;\n}\n\n// ─── Models ──────────────────────────────────────────────────────────────────\n\nexport interface ModelPricing {\n prompt: string;\n completion: string;\n}\n\nexport interface ModelArchitecture {\n modality: string;\n input_modalities: string[];\n output_modalities: string[];\n tokenizer: string;\n}\n\nexport interface ModelTopProvider {\n context_length: number;\n max_completion_tokens: number;\n is_moderated: boolean;\n}\n\nexport interface ModelInfo {\n id: string;\n name: string;\n created: number;\n description: string;\n context_length: number;\n pricing: ModelPricing;\n architecture: ModelArchitecture;\n top_provider: ModelTopProvider;\n supported_parameters: string[];\n}\n\n// ─── Generation Stats ────────────────────────────────────────────────────────\n\nexport interface GenerationStats {\n id: string;\n model: string;\n provider_name: string;\n total_cost: number;\n tokens_prompt: number;\n tokens_completion: number;\n latency: number;\n generation_time: number;\n created_at: string;\n finish_reason: FinishReason;\n streamed: boolean;\n}\n\n// ─── Errors ──────────────────────────────────────────────────────────────────\n\nexport interface AnyModelErrorMetadata {\n provider_name?: string;\n raw?: unknown;\n}\n\nexport class AnyModelError extends Error {\n readonly code: number;\n readonly metadata: AnyModelErrorMetadata;\n\n constructor(code: number, message: string, metadata: AnyModelErrorMetadata = {}) {\n super(message);\n this.name = 'AnyModelError';\n this.code = code;\n this.metadata = metadata;\n }\n\n toJSON() {\n return {\n error: {\n code: this.code,\n message: this.message,\n metadata: this.metadata,\n },\n };\n }\n}\n\n// ─── Batch ───────────────────────────────────────────────────────────────────\n\nexport type BatchStatus = 'pending' | 'processing' | 'completed' | 'failed' | 'cancelled';\nexport type BatchMode = 'native' | 'concurrent';\n\nexport interface BatchRequestItem {\n custom_id: string;\n messages: Message[];\n max_tokens?: number;\n temperature?: number;\n top_p?: number;\n top_k?: number;\n stop?: string | string[];\n response_format?: ResponseFormat;\n tools?: Tool[];\n tool_choice?: ToolChoice;\n service_tier?: 'auto' | 'flex';\n}\n\nexport interface BatchCreateRequest {\n model: string;\n requests: BatchRequestItem[];\n /** Force batch mode: 'native' uses provider batch API, 'concurrent' sends individual requests. Auto-detected if omitted. */\n batch_mode?: 'native' | 'concurrent';\n options?: {\n temperature?: number;\n max_tokens?: number;\n top_p?: number;\n top_k?: number;\n stop?: string | string[];\n response_format?: ResponseFormat;\n tools?: Tool[];\n tool_choice?: ToolChoice;\n service_tier?: 'auto' | 'flex';\n };\n webhook?: string;\n}\n\nexport interface BatchObject {\n id: string;\n object: 'batch';\n status: BatchStatus;\n model: string;\n provider_name: string;\n batch_mode: BatchMode;\n total: number;\n completed: number;\n failed: number;\n created_at: string;\n completed_at: string | null;\n expires_at: string | null;\n}\n\nexport interface BatchResultItem {\n custom_id: string;\n status: 'success' | 'error';\n response: ChatCompletion | null;\n error: { code: number; message: string } | null;\n}\n\nexport interface BatchUsageSummary {\n total_prompt_tokens: number;\n total_completion_tokens: number;\n estimated_cost: number;\n}\n\nexport interface BatchResults {\n id: string;\n status: BatchStatus;\n results: BatchResultItem[];\n usage_summary: BatchUsageSummary;\n}\n\n// ─── Config ──────────────────────────────────────────────────────────────────\n\nexport interface ProviderConfig {\n apiKey?: string;\n defaultModel?: string;\n}\n\nexport interface CustomProviderConfig {\n baseURL: string;\n apiKey?: string;\n models?: string[];\n}\n\nexport interface AnyModelConfig {\n anthropic?: ProviderConfig;\n openai?: ProviderConfig;\n google?: ProviderConfig;\n mistral?: ProviderConfig;\n groq?: ProviderConfig;\n deepseek?: ProviderConfig;\n xai?: ProviderConfig;\n together?: ProviderConfig;\n fireworks?: ProviderConfig;\n perplexity?: ProviderConfig;\n ollama?: ProviderConfig & { baseURL?: string };\n custom?: Record<string, CustomProviderConfig>;\n aliases?: Record<string, string>;\n defaults?: {\n temperature?: number;\n max_tokens?: number;\n retries?: number;\n timeout?: number;\n transforms?: string[];\n };\n routing?: {\n fallback_order?: string[];\n allow_fallbacks?: boolean;\n };\n batch?: {\n dir?: string;\n pollInterval?: number;\n concurrencyFallback?: number;\n retentionDays?: number;\n };\n io?: {\n readConcurrency?: number;\n writeConcurrency?: number;\n };\n}\n","import type { ProviderAdapter } from './adapter.js';\nimport { AnyModelError } from '../types.js';\n\nexport class ProviderRegistry {\n private adapters = new Map<string, ProviderAdapter>();\n\n register(slug: string, adapter: ProviderAdapter): void {\n if (this.adapters.has(slug)) {\n throw new AnyModelError(500, `Provider '${slug}' is already registered`);\n }\n this.adapters.set(slug, adapter);\n }\n\n get(slug: string): ProviderAdapter {\n const adapter = this.adapters.get(slug);\n if (!adapter) {\n throw new AnyModelError(400, `Provider '${slug}' not configured`);\n }\n return adapter;\n }\n\n has(slug: string): boolean {\n return this.adapters.has(slug);\n }\n\n list(): string[] {\n return Array.from(this.adapters.keys());\n }\n\n all(): ProviderAdapter[] {\n return Array.from(this.adapters.values());\n }\n}\n","import { AnyModelError } from '../types.js';\n\nexport interface ParsedModel {\n provider: string;\n model: string;\n}\n\nexport function parseModelString(model: string, aliases?: Record<string, string>): ParsedModel {\n // Check aliases first\n if (aliases && model in aliases) {\n model = aliases[model];\n }\n\n const slashIndex = model.indexOf('/');\n if (slashIndex === -1) {\n throw new AnyModelError(\n 400,\n `Model must be in provider/model format or be a valid alias. Got: '${model}'`\n );\n }\n\n const provider = model.substring(0, slashIndex);\n const modelId = model.substring(slashIndex + 1);\n\n if (!provider) {\n throw new AnyModelError(400, `Invalid model string: missing provider in '${model}'`);\n }\n if (!modelId) {\n throw new AnyModelError(400, `Invalid model string: missing model ID in '${model}'`);\n }\n\n return { provider, model: modelId };\n}\n","import { AnyModelError } from '../types.js';\nimport type { ChatCompletionRequest } from '../types.js';\n\nexport function validateRequest(request: ChatCompletionRequest): void {\n if (!request.model && !request.models?.length) {\n throw new AnyModelError(400, 'Missing required field: model');\n }\n\n if (!request.messages || !Array.isArray(request.messages) || request.messages.length === 0) {\n throw new AnyModelError(400, 'Missing or empty required field: messages');\n }\n\n if (request.temperature !== undefined && (request.temperature < 0 || request.temperature > 2)) {\n throw new AnyModelError(400, 'temperature must be between 0.0 and 2.0');\n }\n\n if (request.top_p !== undefined && (request.top_p < 0 || request.top_p > 1)) {\n throw new AnyModelError(400, 'top_p must be between 0.0 and 1.0');\n }\n\n if (request.top_logprobs !== undefined && !request.logprobs) {\n throw new AnyModelError(400, 'top_logprobs requires logprobs: true');\n }\n\n if (request.top_logprobs !== undefined && (request.top_logprobs < 0 || request.top_logprobs > 20)) {\n throw new AnyModelError(400, 'top_logprobs must be between 0 and 20');\n }\n\n if (request.stop !== undefined) {\n const stops = Array.isArray(request.stop) ? request.stop : [request.stop];\n if (stops.length > 4) {\n throw new AnyModelError(400, 'stop may have at most 4 sequences');\n }\n }\n\n if (request.models && request.models.length > 0 && request.route && request.route !== 'fallback') {\n throw new AnyModelError(400, `Invalid route: '${request.route}'. Only 'fallback' is supported.`);\n }\n}\n","import { AnyModelError } from '../types.js';\n\nexport interface RetryOptions {\n maxRetries: number;\n baseDelay: number; // ms\n maxDelay: number; // ms\n}\n\nconst DEFAULT_RETRY: RetryOptions = {\n maxRetries: 2,\n baseDelay: 500,\n maxDelay: 10000,\n};\n\n// Retryable status codes\nconst RETRYABLE_CODES = new Set([429, 502, 503, 529]);\n\nfunction isRetryable(error: unknown): boolean {\n if (error instanceof AnyModelError) {\n return RETRYABLE_CODES.has(error.code);\n }\n return false;\n}\n\nfunction getRetryAfter(error: unknown): number | null {\n if (error instanceof AnyModelError && error.metadata.raw) {\n const raw = error.metadata.raw as any;\n // Check for retry-after header value stored in metadata\n if (raw?.retry_after) return Number(raw.retry_after) * 1000;\n if (raw?.headers?.['retry-after']) return Number(raw.headers['retry-after']) * 1000;\n }\n return null;\n}\n\nfunction computeDelay(attempt: number, options: RetryOptions, error: unknown): number {\n const retryAfter = getRetryAfter(error);\n if (retryAfter && retryAfter > 0) {\n return Math.min(retryAfter, options.maxDelay);\n }\n // Exponential backoff with jitter\n const exponential = options.baseDelay * Math.pow(2, attempt);\n const jitter = exponential * 0.2 * Math.random();\n return Math.min(exponential + jitter, options.maxDelay);\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: Partial<RetryOptions> = {},\n): Promise<T> {\n const opts = { ...DEFAULT_RETRY, ...options };\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n if (attempt >= opts.maxRetries || !isRetryable(error)) {\n throw error;\n }\n\n const delay = computeDelay(attempt, opts, error);\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}\n","/**\n * Per-provider rate limit tracker.\n * Tracks rate limit state from provider response headers and 429 errors.\n */\nexport interface RateLimitState {\n provider: string;\n remaining: number | null;\n resetAt: number | null; // epoch ms\n retryAfter: number | null; // ms\n lastUpdated: number;\n}\n\nexport class RateLimitTracker {\n private state = new Map<string, RateLimitState>();\n\n /**\n * Update rate limit state from response headers.\n */\n updateFromHeaders(provider: string, headers: Record<string, string>): void {\n const state = this.getOrCreate(provider);\n\n const remaining = headers['x-ratelimit-remaining'] || headers['x-ratelimit-remaining-requests'];\n if (remaining !== undefined) {\n state.remaining = parseInt(remaining, 10);\n }\n\n const reset = headers['x-ratelimit-reset'] || headers['x-ratelimit-reset-requests'];\n if (reset !== undefined) {\n // Could be epoch seconds or ISO date\n const parsed = Number(reset);\n state.resetAt = parsed > 1e12 ? parsed : parsed * 1000;\n }\n\n const retryAfter = headers['retry-after'];\n if (retryAfter !== undefined) {\n state.retryAfter = Number(retryAfter) * 1000;\n }\n\n state.lastUpdated = Date.now();\n }\n\n /**\n * Record a 429 for a provider.\n */\n recordRateLimit(provider: string, retryAfterMs?: number): void {\n const state = this.getOrCreate(provider);\n state.remaining = 0;\n if (retryAfterMs) {\n state.retryAfter = retryAfterMs;\n state.resetAt = Date.now() + retryAfterMs;\n }\n state.lastUpdated = Date.now();\n }\n\n /**\n * Check if a provider is currently rate-limited.\n */\n isRateLimited(provider: string): boolean {\n const state = this.state.get(provider);\n if (!state) return false;\n\n // Check remaining count\n if (state.remaining === 0 && state.resetAt) {\n return Date.now() < state.resetAt;\n }\n\n return false;\n }\n\n /**\n * Get ms until rate limit resets for a provider.\n */\n getWaitTime(provider: string): number {\n const state = this.state.get(provider);\n if (!state?.resetAt) return 0;\n\n const wait = state.resetAt - Date.now();\n return Math.max(0, wait);\n }\n\n /**\n * Get state for a provider.\n */\n getState(provider: string): RateLimitState | undefined {\n return this.state.get(provider);\n }\n\n private getOrCreate(provider: string): RateLimitState {\n let state = this.state.get(provider);\n if (!state) {\n state = {\n provider,\n remaining: null,\n resetAt: null,\n retryAfter: null,\n lastUpdated: Date.now(),\n };\n this.state.set(provider, state);\n }\n return state;\n }\n}\n","import type { Message } from '../types.js';\n\n/**\n * Middle-out transform: when messages exceed a token budget,\n * remove messages from the middle of the conversation, preserving\n * the system prompt (first) and most recent messages (last).\n *\n * This is a character-based approximation (4 chars ≈ 1 token).\n */\nconst CHARS_PER_TOKEN = 4;\n\nexport function middleOut(messages: Message[], maxTokens: number): Message[] {\n if (messages.length <= 2) return messages;\n\n const maxChars = maxTokens * CHARS_PER_TOKEN;\n\n // Calculate total content length\n function messageLength(msg: Message): number {\n const content = typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content);\n return content.length + 20; // overhead for role, etc.\n }\n\n const totalChars = messages.reduce((sum, m) => sum + messageLength(m), 0);\n if (totalChars <= maxChars) return messages;\n\n // Separate system messages from conversation\n const systemMessages = messages.filter(m => m.role === 'system');\n const conversationMessages = messages.filter(m => m.role !== 'system');\n\n if (conversationMessages.length <= 2) return messages;\n\n const systemChars = systemMessages.reduce((sum, m) => sum + messageLength(m), 0);\n const budgetForConversation = maxChars - systemChars;\n\n if (budgetForConversation <= 0) return [...systemMessages, conversationMessages[conversationMessages.length - 1]];\n\n // Keep messages from both ends, removing from the middle\n const kept: Message[] = [];\n let usedChars = 0;\n\n // Always keep the last few messages (recency is most important)\n const tail: Message[] = [];\n let tailChars = 0;\n for (let i = conversationMessages.length - 1; i >= 0; i--) {\n const len = messageLength(conversationMessages[i]);\n if (tailChars + len > budgetForConversation * 0.7) break;\n tail.unshift(conversationMessages[i]);\n tailChars += len;\n }\n\n // Fill from the head with remaining budget\n const headBudget = budgetForConversation - tailChars;\n const headEnd = conversationMessages.length - tail.length;\n for (let i = 0; i < headEnd; i++) {\n const len = messageLength(conversationMessages[i]);\n if (usedChars + len > headBudget) break;\n kept.push(conversationMessages[i]);\n usedChars += len;\n }\n\n return [...systemMessages, ...kept, ...tail];\n}\n\n/**\n * Apply a named transform to the request messages.\n */\nexport function applyTransform(\n name: string,\n messages: Message[],\n contextLength: number,\n): Message[] {\n if (name === 'middle-out') {\n return middleOut(messages, contextLength);\n }\n return messages;\n}\n","import type {\n ChatCompletionRequest,\n ChatCompletion,\n ChatCompletionChunk,\n AnyModelConfig,\n ProviderPreferences,\n} from './types.js';\nimport { AnyModelError } from './types.js';\nimport type { ProviderRegistry } from './providers/registry.js';\nimport type { ProviderAdapter } from './providers/adapter.js';\nimport { parseModelString } from './utils/model-parser.js';\nimport { validateRequest } from './utils/validate.js';\nimport { withRetry } from './utils/retry.js';\nimport { RateLimitTracker } from './utils/rate-limiter.js';\nimport { applyTransform } from './utils/transforms.js';\n\n// Parameters that can be stripped if unsupported by a provider\nconst STRIPPABLE_PARAMS = [\n 'temperature', 'max_tokens', 'top_p', 'top_k',\n 'frequency_penalty', 'presence_penalty', 'repetition_penalty',\n 'seed', 'stop', 'logprobs', 'top_logprobs', 'response_format',\n 'tools', 'tool_choice', 'user',\n] as const;\n\nexport class Router {\n private rateLimiter = new RateLimitTracker();\n\n constructor(\n private registry: ProviderRegistry,\n private aliases?: Record<string, string>,\n private config?: AnyModelConfig,\n ) {}\n\n /**\n * Strip parameters that the target provider doesn't support.\n */\n private stripUnsupported(request: ChatCompletionRequest, adapter: ProviderAdapter): ChatCompletionRequest {\n const cleaned = { ...request };\n for (const param of STRIPPABLE_PARAMS) {\n if ((cleaned as any)[param] !== undefined && !adapter.supportsParameter(param)) {\n delete (cleaned as any)[param];\n }\n }\n return cleaned;\n }\n\n /**\n * Apply transforms (e.g., middle-out) to the request messages.\n */\n private applyTransforms(request: ChatCompletionRequest): ChatCompletionRequest {\n const transforms = request.transforms || this.config?.defaults?.transforms;\n if (!transforms || transforms.length === 0) return request;\n\n let messages = [...request.messages];\n // Default context length for transform budget\n const contextLength = 128000;\n\n for (const transform of transforms) {\n messages = applyTransform(transform, messages, contextLength);\n }\n\n return { ...request, messages };\n }\n\n /**\n * Order models based on provider preferences.\n */\n private applyProviderPreferences(\n models: string[],\n prefs?: ProviderPreferences,\n ): string[] {\n if (!prefs) return models;\n\n let filtered = [...models];\n\n // Apply 'only' filter — restrict to these providers\n if (prefs.only && prefs.only.length > 0) {\n const onlySet = new Set(prefs.only);\n filtered = filtered.filter(m => {\n const { provider } = parseModelString(m, this.aliases);\n return onlySet.has(provider);\n });\n }\n\n // Apply 'ignore' filter — exclude these providers\n if (prefs.ignore && prefs.ignore.length > 0) {\n const ignoreSet = new Set(prefs.ignore);\n filtered = filtered.filter(m => {\n const { provider } = parseModelString(m, this.aliases);\n return !ignoreSet.has(provider);\n });\n }\n\n // Apply 'order' — reorder to prefer specified providers first\n if (prefs.order && prefs.order.length > 0) {\n const orderMap = new Map(prefs.order.map((p, i) => [p, i]));\n filtered.sort((a, b) => {\n const aProvider = parseModelString(a, this.aliases).provider;\n const bProvider = parseModelString(b, this.aliases).provider;\n const aOrder = orderMap.get(aProvider) ?? Infinity;\n const bOrder = orderMap.get(bProvider) ?? Infinity;\n return aOrder - bOrder;\n });\n }\n\n // Apply 'require_parameters' — skip providers that don't support all used params\n if (prefs.require_parameters) {\n filtered = filtered.filter(m => {\n try {\n const { provider } = parseModelString(m, this.aliases);\n const adapter = this.registry.get(provider);\n // No way to know which params will be used without looking at the request,\n // so this is handled at dispatch time by stripUnsupported\n return adapter !== undefined;\n } catch {\n return false;\n }\n });\n }\n\n // Skip rate-limited providers\n filtered = filtered.filter(m => {\n const { provider } = parseModelString(m, this.aliases);\n return !this.rateLimiter.isRateLimited(provider);\n });\n\n return filtered;\n }\n\n private getRetryOptions(): { maxRetries: number } {\n return {\n maxRetries: this.config?.defaults?.retries ?? 2,\n };\n }\n\n async complete(request: ChatCompletionRequest): Promise<ChatCompletion> {\n validateRequest(request);\n\n // Apply transforms\n const transformed = this.applyTransforms(request);\n\n // Fallback routing\n if (transformed.models && transformed.models.length > 0 && transformed.route === 'fallback') {\n return this.completeWithFallback(transformed);\n }\n\n const { provider, model } = parseModelString(transformed.model, this.aliases);\n const adapter = this.registry.get(provider);\n const resolvedRequest = this.stripUnsupported({ ...transformed, model }, adapter);\n\n return withRetry(\n () => adapter.sendRequest(resolvedRequest),\n this.getRetryOptions(),\n );\n }\n\n async stream(request: ChatCompletionRequest): Promise<AsyncIterable<ChatCompletionChunk>> {\n validateRequest(request);\n\n const transformed = this.applyTransforms(request);\n\n if (transformed.models && transformed.models.length > 0 && transformed.route === 'fallback') {\n return this.streamWithFallback(transformed);\n }\n\n const { provider, model } = parseModelString(transformed.model, this.aliases);\n const adapter = this.registry.get(provider);\n const resolvedRequest = this.stripUnsupported({ ...transformed, model, stream: true }, adapter);\n\n return withRetry(\n () => adapter.sendStreamingRequest(resolvedRequest),\n this.getRetryOptions(),\n );\n }\n\n private async completeWithFallback(request: ChatCompletionRequest): Promise<ChatCompletion> {\n let models = request.models!;\n const errors: Array<{ model: string; error: AnyModelError }> = [];\n\n // Apply provider preferences to order/filter models\n models = this.applyProviderPreferences(models, request.provider);\n\n for (const modelStr of models) {\n try {\n const { provider, model } = parseModelString(modelStr, this.aliases);\n const adapter = this.registry.get(provider);\n const resolvedRequest = this.stripUnsupported(\n { ...request, model, models: undefined, route: undefined },\n adapter,\n );\n\n const response = await withRetry(\n () => adapter.sendRequest(resolvedRequest),\n this.getRetryOptions(),\n );\n\n response.model = modelStr;\n return response;\n } catch (err) {\n const error = err instanceof AnyModelError\n ? err\n : new AnyModelError(500, String(err));\n\n // Track rate limits\n if (error.code === 429) {\n const { provider } = parseModelString(modelStr, this.aliases);\n this.rateLimiter.recordRateLimit(provider);\n }\n\n errors.push({ model: modelStr, error });\n }\n }\n\n const lastError = errors[errors.length - 1];\n throw new AnyModelError(lastError.error.code, lastError.error.message, {\n ...lastError.error.metadata,\n raw: {\n attempts: errors.map(e => ({\n model: e.model,\n code: e.error.code,\n message: e.error.message,\n })),\n },\n });\n }\n\n private async streamWithFallback(request: ChatCompletionRequest): Promise<AsyncIterable<ChatCompletionChunk>> {\n let models = request.models!;\n const errors: Array<{ model: string; error: AnyModelError }> = [];\n\n models = this.applyProviderPreferences(models, request.provider);\n\n for (const modelStr of models) {\n try {\n const { provider, model } = parseModelString(modelStr, this.aliases);\n const adapter = this.registry.get(provider);\n const resolvedRequest = this.stripUnsupported(\n { ...request, model, models: undefined, route: undefined, stream: true },\n adapter,\n );\n\n return await withRetry(\n () => adapter.sendStreamingRequest(resolvedRequest),\n this.getRetryOptions(),\n );\n } catch (err) {\n const error = err instanceof AnyModelError\n ? err\n : new AnyModelError(500, String(err));\n\n if (error.code === 429) {\n const { provider } = parseModelString(modelStr, this.aliases);\n this.rateLimiter.recordRateLimit(provider);\n }\n\n errors.push({ model: modelStr, error });\n }\n }\n\n const lastError = errors[errors.length - 1];\n throw new AnyModelError(lastError.error.code, lastError.error.message, {\n ...lastError.error.metadata,\n raw: {\n attempts: errors.map(e => ({\n model: e.model,\n code: e.error.code,\n message: e.error.message,\n })),\n },\n });\n }\n\n getRateLimiter(): RateLimitTracker {\n return this.rateLimiter;\n }\n}\n","let _defaultTimeout = 120_000; // 2 minutes\nlet _flexTimeout = 600_000; // 10 minutes\n\nexport function setDefaultTimeout(ms: number): void {\n _defaultTimeout = ms;\n}\n\nexport function getDefaultTimeout(): number {\n return _defaultTimeout;\n}\n\nexport function setFlexTimeout(ms: number): void {\n _flexTimeout = ms;\n}\n\nexport function getFlexTimeout(): number {\n return _flexTimeout;\n}\n\nexport function fetchWithTimeout(url: string, init?: RequestInit, timeoutMs?: number): Promise<Response> {\n const ms = timeoutMs ?? _defaultTimeout;\n const signal = AbortSignal.timeout(ms);\n if (init?.signal) {\n const combined = AbortSignal.any([signal, init.signal]);\n return fetch(url, { ...init, signal: combined });\n }\n return fetch(url, { ...init, signal });\n}\n","import type { ProviderAdapter } from './adapter.js';\nimport type {\n ChatCompletionRequest,\n ChatCompletion,\n ChatCompletionChunk,\n AnyModelErrorMetadata,\n ModelInfo,\n} from '../types.js';\nimport { AnyModelError } from '../types.js';\nimport { generateId } from '../utils/id.js';\nimport { fetchWithTimeout, getFlexTimeout } from '../utils/fetch-with-timeout.js';\n\nconst OPENAI_API_BASE = 'https://api.openai.com/v1';\n\nconst SUPPORTED_PARAMS = new Set([\n 'temperature', 'max_tokens', 'top_p', 'frequency_penalty', 'presence_penalty',\n 'seed', 'stop', 'stream', 'logprobs', 'top_logprobs', 'response_format',\n 'tools', 'tool_choice', 'user', 'logit_bias', 'service_tier',\n]);\n\nexport function createOpenAIAdapter(apiKey: string, baseURL?: string): ProviderAdapter {\n const base = baseURL || OPENAI_API_BASE;\n\n async function makeRequest(path: string, body?: unknown, method = 'POST', timeoutMs?: number): Promise<Response> {\n const res = await fetchWithTimeout(`${base}${path}`, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n }, timeoutMs);\n\n if (!res.ok) {\n let errorBody: any;\n try {\n errorBody = await res.json();\n } catch {\n errorBody = { message: res.statusText };\n }\n const msg = errorBody?.error?.message || errorBody?.message || res.statusText;\n throw new AnyModelError(mapErrorCode(res.status), msg, {\n provider_name: 'openai',\n raw: errorBody,\n });\n }\n\n return res;\n }\n\n function mapErrorCode(status: number): number {\n if (status === 401 || status === 403) return 401;\n if (status === 429) return 429;\n if (status === 400 || status === 422) return 400;\n if (status >= 500) return 502;\n return status;\n }\n\n function rePrefixId(id: string): string {\n if (id && id.startsWith('chatcmpl-')) {\n return `gen-${id.substring(9)}`;\n }\n return id.startsWith('gen-') ? id : `gen-${id}`;\n }\n\n function buildRequestBody(request: ChatCompletionRequest): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model: request.model,\n messages: request.messages,\n };\n\n // Copy over optional params\n if (request.temperature !== undefined) body.temperature = request.temperature;\n if (request.max_tokens !== undefined) body.max_tokens = request.max_tokens;\n if (request.top_p !== undefined) body.top_p = request.top_p;\n if (request.frequency_penalty !== undefined) body.frequency_penalty = request.frequency_penalty;\n if (request.presence_penalty !== undefined) body.presence_penalty = request.presence_penalty;\n if (request.seed !== undefined) body.seed = request.seed;\n if (request.stop !== undefined) body.stop = request.stop;\n if (request.stream !== undefined) body.stream = request.stream;\n if (request.logprobs !== undefined) body.logprobs = request.logprobs;\n if (request.top_logprobs !== undefined) body.top_logprobs = request.top_logprobs;\n if (request.response_format !== undefined) body.response_format = request.response_format;\n if (request.tools !== undefined) body.tools = request.tools;\n if (request.tool_choice !== undefined) body.tool_choice = request.tool_choice;\n if (request.user !== undefined) body.user = request.user;\n if (request.service_tier !== undefined) body.service_tier = request.service_tier;\n\n return body;\n }\n\n const adapter: ProviderAdapter = {\n name: 'openai',\n\n translateRequest(request: ChatCompletionRequest): unknown {\n return buildRequestBody(request);\n },\n\n translateResponse(response: unknown): ChatCompletion {\n const r = response as any;\n return {\n id: rePrefixId(r.id),\n object: 'chat.completion',\n created: r.created,\n model: `openai/${r.model}`,\n choices: r.choices,\n usage: r.usage,\n };\n },\n\n async *translateStream(stream: ReadableStream<Uint8Array>): AsyncIterable<ChatCompletionChunk> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n if (trimmed === 'data: [DONE]') return;\n if (trimmed.startsWith('data: ')) {\n const json = JSON.parse(trimmed.substring(6));\n json.id = rePrefixId(json.id);\n json.model = `openai/${json.model}`;\n yield json as ChatCompletionChunk;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n },\n\n translateError(error: unknown): { code: number; message: string; metadata: AnyModelErrorMetadata } {\n if (error instanceof AnyModelError) {\n return { code: error.code, message: error.message, metadata: error.metadata };\n }\n const err = error as any;\n const status = err?.status || err?.code || 500;\n return {\n code: mapErrorCode(status),\n message: err?.message || 'Unknown OpenAI error',\n metadata: { provider_name: 'openai', raw: error },\n };\n },\n\n async listModels(): Promise<ModelInfo[]> {\n const res = await makeRequest('/models', undefined, 'GET');\n const data = await res.json() as any;\n return (data.data || [])\n .filter((m: any) => {\n const id = m.id as string;\n // Exclude non-chat models\n if (id.includes('embedding')) return false;\n if (id.includes('whisper')) return false;\n if (id.includes('tts')) return false;\n if (id.includes('dall-e')) return false;\n if (id.includes('davinci')) return false;\n if (id.includes('babbage')) return false;\n if (id.includes('moderation')) return false;\n if (id.includes('realtime')) return false;\n if (id.startsWith('ft:')) return false;\n // Include known chat model prefixes\n return id.startsWith('gpt-') || id.startsWith('o1') || id.startsWith('o3') || id.startsWith('o4') || id.startsWith('chatgpt-');\n })\n .map((m: any) => ({\n id: `openai/${m.id}`,\n name: m.id,\n created: m.created,\n description: '',\n context_length: 128000,\n pricing: { prompt: '0', completion: '0' },\n architecture: {\n modality: 'text+image->text',\n input_modalities: ['text', 'image'],\n output_modalities: ['text'],\n tokenizer: 'o200k_base',\n },\n top_provider: {\n context_length: 128000,\n max_completion_tokens: 16384,\n is_moderated: true,\n },\n supported_parameters: Array.from(SUPPORTED_PARAMS),\n }));\n },\n\n supportsParameter(param: string): boolean {\n return SUPPORTED_PARAMS.has(param);\n },\n\n supportsBatch(): boolean {\n return true;\n },\n\n async sendRequest(request: ChatCompletionRequest): Promise<ChatCompletion> {\n const body = buildRequestBody(request);\n const timeout = request.service_tier === 'flex' ? getFlexTimeout() : undefined;\n const res = await makeRequest('/chat/completions', body, 'POST', timeout);\n const json = await res.json();\n return adapter.translateResponse(json);\n },\n\n async sendStreamingRequest(request: ChatCompletionRequest): Promise<AsyncIterable<ChatCompletionChunk>> {\n const body = buildRequestBody({ ...request, stream: true });\n const timeout = request.service_tier === 'flex' ? getFlexTimeout() : undefined;\n const res = await makeRequest('/chat/completions', body, 'POST', timeout);\n if (!res.body) {\n throw new AnyModelError(502, 'No response body for streaming request', {\n provider_name: 'openai',\n });\n }\n return adapter.translateStream(res.body);\n },\n };\n\n return adapter;\n}\n","import { randomBytes } from 'node:crypto';\n\nexport function generateId(prefix: string = 'gen'): string {\n const random = randomBytes(12).toString('base64url');\n return `${prefix}-${random}`;\n}\n","import type { ProviderAdapter } from './adapter.js';\nimport type {\n ChatCompletionRequest,\n ChatCompletion,\n ChatCompletionChunk,\n AnyModelErrorMetadata,\n ModelInfo,\n Message,\n ToolCall,\n} from '../types.js';\nimport { AnyModelError } from '../types.js';\nimport { generateId } from '../utils/id.js';\nimport { fetchWithTimeout } from '../utils/fetch-with-timeout.js';\n\nconst ANTHROPIC_API_BASE = 'https://api.anthropic.com/v1';\nconst ANTHROPIC_VERSION = '2023-06-01';\nconst DEFAULT_MAX_TOKENS = 4096;\n\nconst SUPPORTED_PARAMS = new Set([\n 'temperature', 'max_tokens', 'top_p', 'top_k', 'stop', 'stream',\n 'tools', 'tool_choice', 'response_format',\n]);\n\n// Fallback if API listing fails — kept current as of March 2026\nconst FALLBACK_MODELS: ModelInfo[] = [\n // Claude 4.6\n { id: 'anthropic/claude-opus-4-6', name: 'Claude Opus 4.6', created: 0, description: 'Most capable model', context_length: 200000, pricing: { prompt: '0.000015', completion: '0.000075' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image'], output_modalities: ['text'], tokenizer: 'claude' }, top_provider: { context_length: 200000, max_completion_tokens: 32768, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n { id: 'anthropic/claude-sonnet-4-6', name: 'Claude Sonnet 4.6', created: 0, description: 'Best balance of speed and capability', context_length: 200000, pricing: { prompt: '0.000003', completion: '0.000015' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image'], output_modalities: ['text'], tokenizer: 'claude' }, top_provider: { context_length: 200000, max_completion_tokens: 16384, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n // Claude 4.5\n { id: 'anthropic/claude-sonnet-4-5-20251022', name: 'Claude Sonnet 4.5', created: 0, description: 'Previous generation balanced model', context_length: 200000, pricing: { prompt: '0.000003', completion: '0.000015' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image'], output_modalities: ['text'], tokenizer: 'claude' }, top_provider: { context_length: 200000, max_completion_tokens: 16384, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n { id: 'anthropic/claude-haiku-4-5', name: 'Claude Haiku 4.5', created: 0, description: 'Fast and compact', context_length: 200000, pricing: { prompt: '0.000001', completion: '0.000005' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image'], output_modalities: ['text'], tokenizer: 'claude' }, top_provider: { context_length: 200000, max_completion_tokens: 8192, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n // Claude 3.5\n { id: 'anthropic/claude-3-5-sonnet-20241022', name: 'Claude 3.5 Sonnet', created: 0, description: 'Legacy balanced model', context_length: 200000, pricing: { prompt: '0.000003', completion: '0.000015' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image'], output_modalities: ['text'], tokenizer: 'claude' }, top_provider: { context_length: 200000, max_completion_tokens: 8192, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n { id: 'anthropic/claude-3-5-haiku-20241022', name: 'Claude 3.5 Haiku', created: 0, description: 'Legacy fast model', context_length: 200000, pricing: { prompt: '0.0000008', completion: '0.000004' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image'], output_modalities: ['text'], tokenizer: 'claude' }, top_provider: { context_length: 200000, max_completion_tokens: 8192, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n];\n\nexport function createAnthropicAdapter(apiKey: string): ProviderAdapter {\n async function makeRequest(path: string, body: unknown, stream = false): Promise<Response> {\n const res = await fetchWithTimeout(`${ANTHROPIC_API_BASE}${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': ANTHROPIC_VERSION,\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n let errorBody: any;\n try {\n errorBody = await res.json();\n } catch {\n errorBody = { message: res.statusText };\n }\n const msg = errorBody?.error?.message || errorBody?.message || res.statusText;\n throw new AnyModelError(mapErrorCode(res.status), msg, {\n provider_name: 'anthropic',\n raw: errorBody,\n });\n }\n\n return res;\n }\n\n function mapErrorCode(status: number): number {\n if (status === 401 || status === 403) return 401;\n if (status === 429) return 429;\n if (status === 400 || status === 422) return 400;\n if (status === 529) return 502;\n if (status >= 500) return 502;\n return status;\n }\n\n function translateRequest(request: ChatCompletionRequest): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model: request.model,\n max_tokens: request.max_tokens || DEFAULT_MAX_TOKENS,\n };\n\n // Extract system messages\n const systemMessages = request.messages.filter(m => m.role === 'system');\n const nonSystemMessages = request.messages.filter(m => m.role !== 'system');\n\n if (systemMessages.length > 0) {\n body.system = systemMessages\n .map(m => typeof m.content === 'string' ? m.content : '')\n .join('\\n');\n }\n\n // Map messages\n body.messages = nonSystemMessages.map(m => ({\n role: m.role === 'tool' ? 'user' : m.role,\n content: m.tool_call_id\n ? [{ type: 'tool_result', tool_use_id: m.tool_call_id, content: typeof m.content === 'string' ? m.content : '' }]\n : m.content,\n }));\n\n // Map optional params\n if (request.temperature !== undefined) body.temperature = request.temperature;\n if (request.top_p !== undefined) body.top_p = request.top_p;\n if (request.top_k !== undefined) body.top_k = request.top_k;\n if (request.stop !== undefined) body.stop_sequences = Array.isArray(request.stop) ? request.stop : [request.stop];\n if (request.stream) body.stream = true;\n\n // Map tools\n if (request.tools && request.tools.length > 0) {\n body.tools = request.tools.map(t => ({\n name: t.function.name,\n description: t.function.description || '',\n input_schema: t.function.parameters || { type: 'object', properties: {} },\n }));\n\n if (request.tool_choice) {\n if (request.tool_choice === 'auto') {\n body.tool_choice = { type: 'auto' };\n } else if (request.tool_choice === 'required') {\n body.tool_choice = { type: 'any' };\n } else if (request.tool_choice === 'none') {\n // Omit tool_choice, don't send tools\n delete body.tools;\n } else if (typeof request.tool_choice === 'object') {\n body.tool_choice = { type: 'tool', name: request.tool_choice.function.name };\n }\n }\n }\n\n // Handle response_format\n if (request.response_format) {\n if (request.response_format.type === 'json_object' || request.response_format.type === 'json_schema') {\n // Prepend JSON instruction to system\n const jsonInstruction = 'Respond with valid JSON only. Do not include any text outside the JSON object.';\n body.system = body.system ? `${jsonInstruction}\\n\\n${body.system}` : jsonInstruction;\n }\n }\n\n return body;\n }\n\n function mapStopReason(reason: string): 'stop' | 'length' | 'tool_calls' | 'content_filter' | 'error' {\n switch (reason) {\n case 'end_turn': return 'stop';\n case 'max_tokens': return 'length';\n case 'tool_use': return 'tool_calls';\n case 'stop_sequence': return 'stop';\n default: return 'stop';\n }\n }\n\n function translateResponse(response: unknown): ChatCompletion {\n const r = response as any;\n\n // Extract text content\n let content = '';\n const toolCalls: ToolCall[] = [];\n\n for (const block of r.content || []) {\n if (block.type === 'text') {\n content += block.text;\n } else if (block.type === 'tool_use') {\n toolCalls.push({\n id: block.id,\n type: 'function',\n function: {\n name: block.name,\n arguments: JSON.stringify(block.input),\n },\n });\n }\n }\n\n const message: Message = {\n role: 'assistant',\n content,\n };\n\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n\n return {\n id: generateId(),\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: `anthropic/${r.model}`,\n choices: [{\n index: 0,\n message,\n finish_reason: mapStopReason(r.stop_reason),\n }],\n usage: {\n prompt_tokens: r.usage?.input_tokens || 0,\n completion_tokens: r.usage?.output_tokens || 0,\n total_tokens: (r.usage?.input_tokens || 0) + (r.usage?.output_tokens || 0),\n },\n };\n }\n\n const adapter: ProviderAdapter = {\n name: 'anthropic',\n\n translateRequest,\n translateResponse,\n\n async *translateStream(stream: ReadableStream<Uint8Array>): AsyncIterable<ChatCompletionChunk> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n const id = generateId();\n const created = Math.floor(Date.now() / 1000);\n let model = '';\n let usage: any = null;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n\n if (trimmed.startsWith('data: ')) {\n const data = JSON.parse(trimmed.substring(6));\n\n if (data.type === 'message_start') {\n model = `anthropic/${data.message.model}`;\n usage = data.message.usage;\n // Emit initial chunk with role\n yield {\n id, object: 'chat.completion.chunk', created, model,\n choices: [{ index: 0, delta: { role: 'assistant' }, finish_reason: null }],\n };\n } else if (data.type === 'content_block_delta') {\n if (data.delta?.type === 'text_delta') {\n yield {\n id, object: 'chat.completion.chunk', created, model,\n choices: [{ index: 0, delta: { content: data.delta.text }, finish_reason: null }],\n };\n } else if (data.delta?.type === 'input_json_delta') {\n // Tool use streaming — emit as tool_calls delta\n yield {\n id, object: 'chat.completion.chunk', created, model,\n choices: [{\n index: 0,\n delta: {\n tool_calls: [{\n id: data.content_block?.id || '',\n type: 'function',\n function: { name: '', arguments: data.delta.partial_json },\n }],\n },\n finish_reason: null,\n }],\n };\n }\n } else if (data.type === 'content_block_start') {\n if (data.content_block?.type === 'tool_use') {\n yield {\n id, object: 'chat.completion.chunk', created, model,\n choices: [{\n index: 0,\n delta: {\n tool_calls: [{\n id: data.content_block.id,\n type: 'function',\n function: { name: data.content_block.name, arguments: '' },\n }],\n },\n finish_reason: null,\n }],\n };\n }\n } else if (data.type === 'message_delta') {\n const finalUsage = usage ? {\n prompt_tokens: usage.input_tokens || 0,\n completion_tokens: data.usage?.output_tokens || 0,\n total_tokens: (usage.input_tokens || 0) + (data.usage?.output_tokens || 0),\n } : undefined;\n\n yield {\n id, object: 'chat.completion.chunk', created, model,\n choices: [{\n index: 0,\n delta: {},\n finish_reason: mapStopReason(data.delta?.stop_reason || 'end_turn'),\n }],\n usage: finalUsage,\n };\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n },\n\n translateError(error: unknown) {\n if (error instanceof AnyModelError) {\n return { code: error.code, message: error.message, metadata: error.metadata };\n }\n const err = error as any;\n const status = err?.status || err?.code || 500;\n return {\n code: mapErrorCode(status),\n message: err?.message || 'Unknown Anthropic error',\n metadata: { provider_name: 'anthropic', raw: error } as AnyModelErrorMetadata,\n };\n },\n\n async listModels(): Promise<ModelInfo[]> {\n try {\n const res = await fetchWithTimeout(`${ANTHROPIC_API_BASE}/models`, {\n method: 'GET',\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': ANTHROPIC_VERSION,\n },\n });\n\n if (!res.ok) return FALLBACK_MODELS;\n\n const data = await res.json() as any;\n const models = (data.data || []) as any[];\n\n return models\n .filter((m: any) => m.type === 'model')\n .map((m: any) => ({\n id: `anthropic/${m.id}`,\n name: m.display_name || m.id,\n created: m.created_at ? new Date(m.created_at).getTime() / 1000 : 0,\n description: m.display_name || '',\n context_length: 200000,\n pricing: { prompt: '0', completion: '0' },\n architecture: {\n modality: 'text+image->text',\n input_modalities: ['text', 'image'],\n output_modalities: ['text'],\n tokenizer: 'claude',\n },\n top_provider: {\n context_length: 200000,\n max_completion_tokens: 16384,\n is_moderated: false,\n },\n supported_parameters: Array.from(SUPPORTED_PARAMS),\n }));\n } catch {\n return FALLBACK_MODELS;\n }\n },\n\n supportsParameter(param: string): boolean {\n return SUPPORTED_PARAMS.has(param);\n },\n\n supportsBatch(): boolean {\n return true;\n },\n\n async sendRequest(request: ChatCompletionRequest): Promise<ChatCompletion> {\n const body = translateRequest(request);\n const res = await makeRequest('/messages', body);\n const json = await res.json();\n return translateResponse(json);\n },\n\n async sendStreamingRequest(request: ChatCompletionRequest): Promise<AsyncIterable<ChatCompletionChunk>> {\n const body = translateRequest({ ...request, stream: true });\n const res = await makeRequest('/messages', body, true);\n if (!res.body) {\n throw new AnyModelError(502, 'No response body for streaming request', {\n provider_name: 'anthropic',\n });\n }\n return adapter.translateStream(res.body);\n },\n };\n\n return adapter;\n}\n","import type { ProviderAdapter } from './adapter.js';\nimport type {\n ChatCompletionRequest,\n ChatCompletion,\n ChatCompletionChunk,\n AnyModelErrorMetadata,\n ModelInfo,\n Message,\n ToolCall,\n} from '../types.js';\nimport { AnyModelError } from '../types.js';\nimport { generateId } from '../utils/id.js';\nimport { fetchWithTimeout } from '../utils/fetch-with-timeout.js';\n\nconst GEMINI_API_BASE = 'https://generativelanguage.googleapis.com/v1beta';\n\nconst SUPPORTED_PARAMS = new Set([\n 'temperature', 'max_tokens', 'top_p', 'top_k', 'stop', 'stream',\n 'tools', 'tool_choice', 'response_format',\n]);\n\n// Fallback if API listing fails — kept current as of March 2026\nconst FALLBACK_MODELS: ModelInfo[] = [\n // Gemini 2.5\n { id: 'google/gemini-2.5-pro', name: 'Gemini 2.5 Pro', created: 0, description: 'Most capable Gemini model', context_length: 1048576, pricing: { prompt: '0.00000125', completion: '0.000005' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image', 'video', 'audio'], output_modalities: ['text'], tokenizer: 'gemini' }, top_provider: { context_length: 1048576, max_completion_tokens: 65536, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n { id: 'google/gemini-2.5-flash', name: 'Gemini 2.5 Flash', created: 0, description: 'Fast and efficient', context_length: 1048576, pricing: { prompt: '0.00000015', completion: '0.0000006' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image', 'video', 'audio'], output_modalities: ['text'], tokenizer: 'gemini' }, top_provider: { context_length: 1048576, max_completion_tokens: 65536, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n // Gemini 2.0\n { id: 'google/gemini-2.0-flash', name: 'Gemini 2.0 Flash', created: 0, description: 'Fast multimodal model', context_length: 1048576, pricing: { prompt: '0.0000001', completion: '0.0000004' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image', 'video', 'audio'], output_modalities: ['text'], tokenizer: 'gemini' }, top_provider: { context_length: 1048576, max_completion_tokens: 65536, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n { id: 'google/gemini-2.0-flash-lite', name: 'Gemini 2.0 Flash Lite', created: 0, description: 'Lightweight and fast', context_length: 1048576, pricing: { prompt: '0.00000005', completion: '0.0000002' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image', 'video', 'audio'], output_modalities: ['text'], tokenizer: 'gemini' }, top_provider: { context_length: 1048576, max_completion_tokens: 65536, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n // Gemini 1.5\n { id: 'google/gemini-1.5-pro', name: 'Gemini 1.5 Pro', created: 0, description: 'Previous generation pro model', context_length: 2097152, pricing: { prompt: '0.00000125', completion: '0.000005' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image', 'video', 'audio'], output_modalities: ['text'], tokenizer: 'gemini' }, top_provider: { context_length: 2097152, max_completion_tokens: 8192, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n { id: 'google/gemini-1.5-flash', name: 'Gemini 1.5 Flash', created: 0, description: 'Previous generation flash model', context_length: 1048576, pricing: { prompt: '0.000000075', completion: '0.0000003' }, architecture: { modality: 'text+image->text', input_modalities: ['text', 'image', 'video', 'audio'], output_modalities: ['text'], tokenizer: 'gemini' }, top_provider: { context_length: 1048576, max_completion_tokens: 8192, is_moderated: false }, supported_parameters: Array.from(SUPPORTED_PARAMS) },\n];\n\nexport function createGoogleAdapter(apiKey: string): ProviderAdapter {\n function getModelEndpoint(model: string, stream: boolean): string {\n const action = stream ? 'streamGenerateContent' : 'generateContent';\n return `${GEMINI_API_BASE}/models/${model}:${action}?key=${apiKey}${stream ? '&alt=sse' : ''}`;\n }\n\n function mapErrorCode(status: number): number {\n if (status === 401 || status === 403) return 401;\n if (status === 429) return 429;\n if (status === 400) return 400;\n if (status >= 500) return 502;\n return status;\n }\n\n function translateRequest(request: ChatCompletionRequest): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n\n // Extract system instruction\n const systemMessages = request.messages.filter(m => m.role === 'system');\n const nonSystemMessages = request.messages.filter(m => m.role !== 'system');\n\n if (systemMessages.length > 0) {\n body.systemInstruction = {\n parts: [{ text: systemMessages.map(m => typeof m.content === 'string' ? m.content : '').join('\\n') }],\n };\n }\n\n // Map messages to contents\n body.contents = nonSystemMessages.map(m => ({\n role: m.role === 'assistant' ? 'model' : 'user',\n parts: typeof m.content === 'string'\n ? [{ text: m.content }]\n : Array.isArray(m.content)\n ? m.content.map(p => p.type === 'text' ? { text: p.text } : { text: '' })\n : [{ text: '' }],\n }));\n\n // Generation config\n const generationConfig: Record<string, unknown> = {};\n if (request.temperature !== undefined) generationConfig.temperature = request.temperature;\n if (request.max_tokens !== undefined) generationConfig.maxOutputTokens = request.max_tokens;\n if (request.top_p !== undefined) generationConfig.topP = request.top_p;\n if (request.top_k !== undefined) generationConfig.topK = request.top_k;\n if (request.stop !== undefined) {\n generationConfig.stopSequences = Array.isArray(request.stop) ? request.stop : [request.stop];\n }\n\n // Response format\n if (request.response_format) {\n if (request.response_format.type === 'json_object') {\n generationConfig.responseMimeType = 'application/json';\n } else if (request.response_format.type === 'json_schema') {\n generationConfig.responseMimeType = 'application/json';\n generationConfig.responseSchema = request.response_format.json_schema.schema;\n }\n }\n\n if (Object.keys(generationConfig).length > 0) {\n body.generationConfig = generationConfig;\n }\n\n // Map tools\n if (request.tools && request.tools.length > 0) {\n body.tools = [{\n functionDeclarations: request.tools.map(t => ({\n name: t.function.name,\n description: t.function.description || '',\n parameters: t.function.parameters || {},\n })),\n }];\n\n if (request.tool_choice) {\n if (request.tool_choice === 'auto') {\n body.toolConfig = { functionCallingConfig: { mode: 'AUTO' } };\n } else if (request.tool_choice === 'required') {\n body.toolConfig = { functionCallingConfig: { mode: 'ANY' } };\n } else if (request.tool_choice === 'none') {\n body.toolConfig = { functionCallingConfig: { mode: 'NONE' } };\n } else if (typeof request.tool_choice === 'object') {\n body.toolConfig = {\n functionCallingConfig: {\n mode: 'ANY',\n allowedFunctionNames: [request.tool_choice.function.name],\n },\n };\n }\n }\n }\n\n return body;\n }\n\n function mapFinishReason(reason: string): 'stop' | 'length' | 'tool_calls' | 'content_filter' | 'error' {\n switch (reason) {\n case 'STOP': return 'stop';\n case 'MAX_TOKENS': return 'length';\n case 'SAFETY': return 'content_filter';\n case 'RECITATION': return 'content_filter';\n default: return 'stop';\n }\n }\n\n function translateResponse(response: unknown): ChatCompletion {\n const r = response as any;\n const candidate = r.candidates?.[0];\n\n let content = '';\n const toolCalls: ToolCall[] = [];\n\n for (const part of candidate?.content?.parts || []) {\n if (part.text) {\n content += part.text;\n } else if (part.functionCall) {\n toolCalls.push({\n id: generateId('call'),\n type: 'function',\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args || {}),\n },\n });\n }\n }\n\n const message: Message = { role: 'assistant', content };\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n\n const finishReason = toolCalls.length > 0\n ? 'tool_calls' as const\n : mapFinishReason(candidate?.finishReason || 'STOP');\n\n return {\n id: generateId(),\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: `google/${r.modelVersion || 'unknown'}`,\n choices: [{ index: 0, message, finish_reason: finishReason }],\n usage: {\n prompt_tokens: r.usageMetadata?.promptTokenCount || 0,\n completion_tokens: r.usageMetadata?.candidatesTokenCount || 0,\n total_tokens: r.usageMetadata?.totalTokenCount || 0,\n },\n };\n }\n\n const adapter: ProviderAdapter = {\n name: 'google',\n\n translateRequest,\n translateResponse,\n\n async *translateStream(stream: ReadableStream<Uint8Array>): AsyncIterable<ChatCompletionChunk> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n const id = generateId();\n const created = Math.floor(Date.now() / 1000);\n let emittedRole = false;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n if (trimmed === 'data: [DONE]') return;\n\n if (trimmed.startsWith('data: ')) {\n const data = JSON.parse(trimmed.substring(6));\n const candidate = data.candidates?.[0];\n\n if (!candidate) continue;\n\n const parts = candidate.content?.parts || [];\n for (const part of parts) {\n if (part.text !== undefined) {\n const chunk: ChatCompletionChunk = {\n id, object: 'chat.completion.chunk', created, model: `google/${data.modelVersion || 'unknown'}`,\n choices: [{\n index: 0,\n delta: emittedRole ? { content: part.text } : { role: 'assistant', content: part.text },\n finish_reason: null,\n }],\n };\n emittedRole = true;\n yield chunk;\n }\n }\n\n if (candidate.finishReason) {\n yield {\n id, object: 'chat.completion.chunk', created, model: `google/${data.modelVersion || 'unknown'}`,\n choices: [{ index: 0, delta: {}, finish_reason: mapFinishReason(candidate.finishReason) }],\n usage: data.usageMetadata ? {\n prompt_tokens: data.usageMetadata.promptTokenCount || 0,\n completion_tokens: data.usageMetadata.candidatesTokenCount || 0,\n total_tokens: data.usageMetadata.totalTokenCount || 0,\n } : undefined,\n };\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n },\n\n translateError(error: unknown) {\n if (error instanceof AnyModelError) {\n return { code: error.code, message: error.message, metadata: error.metadata };\n }\n const err = error as any;\n const status = err?.status || err?.code || 500;\n return {\n code: mapErrorCode(status),\n message: err?.message || 'Unknown Google error',\n metadata: { provider_name: 'google', raw: error } as AnyModelErrorMetadata,\n };\n },\n\n async listModels(): Promise<ModelInfo[]> {\n try {\n const res = await fetchWithTimeout(`${GEMINI_API_BASE}/models?key=${apiKey}`);\n\n if (!res.ok) return FALLBACK_MODELS;\n\n const data = await res.json() as any;\n const models = (data.models || []) as any[];\n\n return models\n .filter((m: any) => m.name?.startsWith('models/gemini-') && m.supportedGenerationMethods?.includes('generateContent'))\n .map((m: any) => {\n const modelId = m.name.replace('models/', '');\n return {\n id: `google/${modelId}`,\n name: m.displayName || modelId,\n created: 0,\n description: m.description || '',\n context_length: m.inputTokenLimit || 1048576,\n pricing: { prompt: '0', completion: '0' },\n architecture: {\n modality: 'text+image->text',\n input_modalities: ['text', 'image', 'video', 'audio'],\n output_modalities: ['text'],\n tokenizer: 'gemini',\n },\n top_provider: {\n context_length: m.inputTokenLimit || 1048576,\n max_completion_tokens: m.outputTokenLimit || 65536,\n is_moderated: false,\n },\n supported_parameters: Array.from(SUPPORTED_PARAMS),\n };\n });\n } catch {\n return FALLBACK_MODELS;\n }\n },\n\n supportsParameter(param: string): boolean {\n return SUPPORTED_PARAMS.has(param);\n },\n\n supportsBatch(): boolean {\n return true;\n },\n\n async sendRequest(request: ChatCompletionRequest): Promise<ChatCompletion> {\n const body = translateRequest(request);\n const url = getModelEndpoint(request.model, false);\n const res = await fetchWithTimeout(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n if (!res.ok) {\n let errorBody: any;\n try { errorBody = await res.json(); } catch { errorBody = { message: res.statusText }; }\n throw new AnyModelError(mapErrorCode(res.status), errorBody?.error?.message || res.statusText, {\n provider_name: 'google', raw: errorBody,\n });\n }\n const json = await res.json();\n return translateResponse(json);\n },\n\n async sendStreamingRequest(request: ChatCompletionRequest): Promise<AsyncIterable<ChatCompletionChunk>> {\n const body = translateRequest(request);\n const url = getModelEndpoint(request.model, true);\n const res = await fetchWithTimeout(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n if (!res.ok) {\n let errorBody: any;\n try { errorBody = await res.json(); } catch { errorBody = { message: res.statusText }; }\n throw new AnyModelError(mapErrorCode(res.status), errorBody?.error?.message || res.statusText, {\n provider_name: 'google', raw: errorBody,\n });\n }\n if (!res.body) {\n throw new AnyModelError(502, 'No response body for streaming request', { provider_name: 'google' });\n }\n return adapter.translateStream(res.body);\n },\n };\n\n return adapter;\n}\n","import type { ProviderAdapter } from './adapter.js';\nimport type {\n ChatCompletionRequest,\n ChatCompletion,\n ChatCompletionChunk,\n AnyModelErrorMetadata,\n ModelInfo,\n} from '../types.js';\nimport { AnyModelError } from '../types.js';\nimport { generateId } from '../utils/id.js';\nimport { fetchWithTimeout } from '../utils/fetch-with-timeout.js';\n\nconst PERPLEXITY_API_BASE = 'https://api.perplexity.ai';\n\nconst SUPPORTED_PARAMS = new Set([\n 'temperature', 'max_tokens', 'top_p', 'frequency_penalty', 'presence_penalty',\n 'stream', 'stop', 'response_format', 'tools', 'tool_choice',\n]);\n\n// Perplexity models — static list since there is no /models endpoint\nconst MODELS: Array<{\n id: string;\n name: string;\n context: number;\n maxOutput: number;\n modality: string;\n inputModalities: string[];\n}> = [\n { id: 'sonar', name: 'Sonar', context: 128000, maxOutput: 4096, modality: 'text->text', inputModalities: ['text'] },\n { id: 'sonar-pro', name: 'Sonar Pro', context: 200000, maxOutput: 8192, modality: 'text->text', inputModalities: ['text'] },\n { id: 'sonar-reasoning', name: 'Sonar Reasoning', context: 128000, maxOutput: 8192, modality: 'text->text', inputModalities: ['text'] },\n { id: 'sonar-reasoning-pro', name: 'Sonar Reasoning Pro', context: 128000, maxOutput: 16384, modality: 'text->text', inputModalities: ['text'] },\n { id: 'sonar-deep-research', name: 'Sonar Deep Research', context: 128000, maxOutput: 16384, modality: 'text->text', inputModalities: ['text'] },\n { id: 'r1-1776', name: 'R1 1776', context: 128000, maxOutput: 16384, modality: 'text->text', inputModalities: ['text'] },\n];\n\nexport function createPerplexityAdapter(apiKey: string): ProviderAdapter {\n async function makeRequest(path: string, body?: unknown, method = 'POST'): Promise<Response> {\n const res = await fetchWithTimeout(`${PERPLEXITY_API_BASE}${path}`, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n let errorBody: any;\n try {\n errorBody = await res.json();\n } catch {\n errorBody = { message: res.statusText };\n }\n const msg = errorBody?.error?.message || errorBody?.message || res.statusText;\n throw new AnyModelError(mapErrorCode(res.status), msg, {\n provider_name: 'perplexity',\n raw: errorBody,\n });\n }\n\n return res;\n }\n\n function mapErrorCode(status: number): number {\n if (status === 401 || status === 403) return 401;\n if (status === 429) return 429;\n if (status === 400 || status === 422) return 400;\n if (status >= 500) return 502;\n return status;\n }\n\n function rePrefixId(id: string): string {\n if (id && id.startsWith('chatcmpl-')) {\n return `gen-${id.substring(9)}`;\n }\n return id.startsWith('gen-') ? id : `gen-${id}`;\n }\n\n function buildRequestBody(request: ChatCompletionRequest): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model: request.model,\n messages: request.messages,\n };\n\n if (request.temperature !== undefined) body.temperature = request.temperature;\n if (request.max_tokens !== undefined) body.max_tokens = request.max_tokens;\n if (request.top_p !== undefined) body.top_p = request.top_p;\n if (request.frequency_penalty !== undefined) body.frequency_penalty = request.frequency_penalty;\n if (request.presence_penalty !== undefined) body.presence_penalty = request.presence_penalty;\n if (request.stop !== undefined) body.stop = request.stop;\n if (request.stream !== undefined) body.stream = request.stream;\n if (request.response_format !== undefined) body.response_format = request.response_format;\n if (request.tools !== undefined) body.tools = request.tools;\n if (request.tool_choice !== undefined) body.tool_choice = request.tool_choice;\n\n return body;\n }\n\n const adapter: ProviderAdapter = {\n name: 'perplexity',\n\n translateRequest(request: ChatCompletionRequest): unknown {\n return buildRequestBody(request);\n },\n\n translateResponse(response: unknown): ChatCompletion {\n const r = response as any;\n const result: ChatCompletion = {\n id: rePrefixId(r.id),\n object: 'chat.completion',\n created: r.created,\n model: `perplexity/${r.model}`,\n choices: r.choices,\n usage: r.usage,\n };\n\n // Preserve citations in metadata if present\n if (r.citations && result.choices?.[0]?.message) {\n (result as any).citations = r.citations;\n }\n\n return result;\n },\n\n async *translateStream(stream: ReadableStream<Uint8Array>): AsyncIterable<ChatCompletionChunk> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n if (trimmed === 'data: [DONE]') return;\n if (trimmed.startsWith('data: ')) {\n const json = JSON.parse(trimmed.substring(6));\n json.id = rePrefixId(json.id);\n json.model = `perplexity/${json.model}`;\n yield json as ChatCompletionChunk;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n },\n\n translateError(error: unknown): { code: number; message: string; metadata: AnyModelErrorMetadata } {\n if (error instanceof AnyModelError) {\n return { code: error.code, message: error.message, metadata: error.metadata };\n }\n const err = error as any;\n const status = err?.status || err?.code || 500;\n return {\n code: mapErrorCode(status),\n message: err?.message || 'Unknown Perplexity error',\n metadata: { provider_name: 'perplexity', raw: error },\n };\n },\n\n async listModels(): Promise<ModelInfo[]> {\n return MODELS.map((m) => ({\n id: `perplexity/${m.id}`,\n name: m.name,\n created: 0,\n description: '',\n context_length: m.context,\n pricing: { prompt: '0', completion: '0' },\n architecture: {\n modality: m.modality,\n input_modalities: m.inputModalities,\n output_modalities: ['text'],\n tokenizer: 'unknown',\n },\n top_provider: {\n context_length: m.context,\n max_completion_tokens: m.maxOutput,\n is_moderated: false,\n },\n supported_parameters: Array.from(SUPPORTED_PARAMS),\n }));\n },\n\n supportsParameter(param: string): boolean {\n return SUPPORTED_PARAMS.has(param);\n },\n\n supportsBatch(): boolean {\n return false;\n },\n\n async sendRequest(request: ChatCompletionRequest): Promise<ChatCompletion> {\n const body = buildRequestBody(request);\n const res = await makeRequest('/chat/completions', body);\n const json = await res.json();\n return adapter.translateResponse(json);\n },\n\n async sendStreamingRequest(request: ChatCompletionRequest): Promise<AsyncIterable<ChatCompletionChunk>> {\n const body = buildRequestBody({ ...request, stream: true });\n const res = await makeRequest('/chat/completions', body);\n if (!res.body) {\n throw new AnyModelError(502, 'No response body for streaming request', {\n provider_name: 'perplexity',\n });\n }\n return adapter.translateStream(res.body);\n },\n };\n\n return adapter;\n}\n","import type { CustomProviderConfig } from '../types.js';\nimport type { ProviderAdapter } from './adapter.js';\nimport { createOpenAIAdapter } from './openai.js';\n\n/**\n * Create a custom provider adapter that uses an OpenAI-compatible API.\n * This wraps the OpenAI adapter with a custom base URL and provider name.\n */\nexport function createCustomAdapter(\n name: string,\n config: CustomProviderConfig,\n): ProviderAdapter {\n const openaiAdapter = createOpenAIAdapter(config.apiKey || '', config.baseURL);\n\n return {\n ...openaiAdapter,\n name,\n\n supportsBatch(): boolean {\n return false;\n },\n\n async listModels() {\n // If static model list is provided in config, use that\n if (config.models && config.models.length > 0) {\n return config.models.map(modelId => ({\n id: `${name}/${modelId}`,\n name: modelId,\n created: 0,\n description: `Custom model via ${name}`,\n context_length: 128000,\n pricing: { prompt: '0', completion: '0' },\n architecture: {\n modality: 'text->text',\n input_modalities: ['text'],\n output_modalities: ['text'],\n tokenizer: 'unknown',\n },\n top_provider: {\n context_length: 128000,\n max_completion_tokens: 16384,\n is_moderated: false,\n },\n supported_parameters: ['temperature', 'max_tokens', 'top_p', 'stop', 'stream', 'tools', 'tool_choice'],\n }));\n }\n\n // Otherwise try to fetch from the /models endpoint\n try {\n const models = await openaiAdapter.listModels();\n // Re-prefix with custom provider name\n return models.map(m => ({\n ...m,\n id: `${name}/${m.name}`,\n }));\n } catch {\n return [];\n }\n },\n\n translateResponse(response: unknown) {\n const translated = openaiAdapter.translateResponse(response);\n // Re-prefix the model with our custom provider name\n if (translated.model.startsWith('openai/')) {\n translated.model = `${name}/${translated.model.substring(7)}`;\n }\n return translated;\n },\n };\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { AnyModelConfig } from './types.js';\n\nconst LOCAL_CONFIG_NAMES = ['anymodel.config.json'];\nconst GLOBAL_CONFIG_DIR = join(homedir(), '.anymodel');\nconst GLOBAL_CONFIG_FILE = join(GLOBAL_CONFIG_DIR, 'config.json');\n\n/**\n * Interpolate ${ENV_VAR} references in string values.\n */\nfunction interpolateEnvVars(value: string): string {\n return value.replace(/\\$\\{([^}]+)\\}/g, (_, name) => process.env[name] || '');\n}\n\n/**\n * Recursively walk an object and interpolate string values.\n */\nfunction interpolateDeep(obj: unknown): unknown {\n if (typeof obj === 'string') return interpolateEnvVars(obj);\n if (Array.isArray(obj)) return obj.map(interpolateDeep);\n if (obj !== null && typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(obj as Record<string, unknown>)) {\n result[key] = interpolateDeep(val);\n }\n return result;\n }\n return obj;\n}\n\n/**\n * Load a JSON config file, returning null if not found.\n */\nfunction loadJsonFile(path: string): AnyModelConfig | null {\n if (!existsSync(path)) return null;\n try {\n const raw = readFileSync(path, 'utf-8');\n const parsed = JSON.parse(raw);\n return interpolateDeep(parsed) as AnyModelConfig;\n } catch {\n return null;\n }\n}\n\n/**\n * Find local config file in the working directory.\n */\nfunction findLocalConfig(cwd?: string): AnyModelConfig | null {\n const dir = cwd || process.cwd();\n for (const name of LOCAL_CONFIG_NAMES) {\n const config = loadJsonFile(resolve(dir, name));\n if (config) return config;\n }\n return null;\n}\n\n/**\n * Load global config from ~/.anymodel/config.json\n */\nfunction findGlobalConfig(): AnyModelConfig | null {\n return loadJsonFile(GLOBAL_CONFIG_FILE);\n}\n\n/**\n * Deep merge two config objects. Source values override target values.\n * Provider-level objects are merged, not replaced.\n */\nfunction deepMerge(target: AnyModelConfig, source: AnyModelConfig): AnyModelConfig {\n const result: Record<string, unknown> = { ...target };\n\n for (const [key, value] of Object.entries(source)) {\n if (value === undefined) continue;\n\n const existing = (target as Record<string, unknown>)[key];\n if (\n existing !== null && typeof existing === 'object' && !Array.isArray(existing) &&\n value !== null && typeof value === 'object' && !Array.isArray(value)\n ) {\n result[key] = deepMerge(existing as AnyModelConfig, value as AnyModelConfig);\n } else {\n result[key] = value;\n }\n }\n\n return result as AnyModelConfig;\n}\n\n/**\n * Build config from env vars only (auto-detected API keys).\n */\nfunction envConfig(): AnyModelConfig {\n const config: AnyModelConfig = {};\n\n const envMap: Array<[keyof AnyModelConfig, string]> = [\n ['openai', 'OPENAI_API_KEY'],\n ['anthropic', 'ANTHROPIC_API_KEY'],\n ['google', 'GOOGLE_API_KEY'],\n ['mistral', 'MISTRAL_API_KEY'],\n ['groq', 'GROQ_API_KEY'],\n ['deepseek', 'DEEPSEEK_API_KEY'],\n ['xai', 'XAI_API_KEY'],\n ['together', 'TOGETHER_API_KEY'],\n ['fireworks', 'FIREWORKS_API_KEY'],\n ['perplexity', 'PERPLEXITY_API_KEY'],\n ];\n\n for (const [key, envVar] of envMap) {\n if (process.env[envVar]) {\n (config as any)[key] = { apiKey: process.env[envVar] };\n }\n }\n\n return config;\n}\n\n/**\n * Resolve config with precedence: programmatic → local → global → env vars.\n */\nexport function resolveConfig(programmatic: AnyModelConfig = {}, cwd?: string): AnyModelConfig {\n const env = envConfig();\n const global = findGlobalConfig() || {};\n const local = findLocalConfig(cwd) || {};\n\n // Lowest priority first, each layer overrides the previous\n let config = deepMerge(env, global);\n config = deepMerge(config, local);\n config = deepMerge(config, programmatic);\n\n return config;\n}\n","import type { GenerationStats, FinishReason } from '../types.js';\n\nexport interface GenerationRecord {\n id: string;\n model: string;\n providerName: string;\n promptTokens: number;\n completionTokens: number;\n startTime: number; // epoch ms\n endTime: number; // epoch ms\n finishReason: FinishReason;\n streamed: boolean;\n}\n\n/**\n * In-memory generation stats store.\n * Tracks recent completions for the generation stats endpoint.\n */\nexport class GenerationStatsStore {\n private records = new Map<string, GenerationRecord>();\n private maxRecords: number;\n\n constructor(maxRecords = 1000) {\n this.maxRecords = maxRecords;\n }\n\n record(entry: GenerationRecord): void {\n // Evict oldest if at capacity\n if (this.records.size >= this.maxRecords) {\n const oldest = this.records.keys().next().value;\n if (oldest) this.records.delete(oldest);\n }\n this.records.set(entry.id, entry);\n }\n\n get(id: string): GenerationStats | undefined {\n const rec = this.records.get(id);\n if (!rec) return undefined;\n\n const latency = rec.endTime - rec.startTime;\n return {\n id: rec.id,\n model: rec.model,\n provider_name: rec.providerName,\n total_cost: 0, // Cost calculation requires pricing data\n tokens_prompt: rec.promptTokens,\n tokens_completion: rec.completionTokens,\n latency,\n generation_time: latency,\n created_at: new Date(rec.startTime).toISOString(),\n finish_reason: rec.finishReason,\n streamed: rec.streamed,\n };\n }\n\n list(limit = 50): GenerationStats[] {\n const entries = Array.from(this.records.values())\n .slice(-limit)\n .reverse();\n\n return entries.map(rec => this.get(rec.id)!);\n }\n}\n","/**\n * Concurrency-limited filesystem helpers for high-volume file operations.\n *\n * Based on probeo-core/common/fs-io. Provides queued reads/writes,\n * atomic durable writes, directory caching, and path memoization.\n */\n\nimport { mkdir, open, readFile as fsReadFile, rename, writeFile as fsWriteFile, readdir as fsReaddir, stat as fsStat } from 'node:fs/promises';\nimport type { Dirent, Stats } from 'node:fs';\nimport { createWriteStream } from 'node:fs';\nimport path from 'node:path';\nimport PQueue from 'p-queue';\n\n// Concurrency-limited queues to prevent resource exhaustion.\nlet writeQueue = new PQueue({ concurrency: 10 });\nlet readQueue = new PQueue({ concurrency: 20 });\n\n/**\n * Configure the filesystem IO concurrency limits.\n * Call before any IO operations to adjust defaults.\n */\nexport function configureFsIO(options: { readConcurrency?: number; writeConcurrency?: number }): void {\n if (options.readConcurrency !== undefined) {\n readQueue.concurrency = options.readConcurrency;\n }\n if (options.writeConcurrency !== undefined) {\n writeQueue.concurrency = options.writeConcurrency;\n }\n}\n\n// In-memory cache of directories we've already ensured exist.\nconst ensuredDirs = new Set<string>();\n\n// Memoization caches for path operations.\nconst joinPathCache = new Map<string, string>();\nconst dirnameCache = new Map<string, string>();\nconst resolvePathCache = new Map<string, string>();\n\n// ─── Directory Operations ───────────────────────────────────────────────────\n\nexport async function ensureDir(dir: string): Promise<void> {\n if (!dir) return;\n if (ensuredDirs.has(dir)) return;\n await mkdir(dir, { recursive: true });\n ensuredDirs.add(dir);\n}\n\n// ─── Queued Read Operations ─────────────────────────────────────────────────\n\nexport async function readFileQueued(\n filePath: string,\n encoding: BufferEncoding | null = 'utf8',\n): Promise<string | Buffer> {\n return readQueue.add(async () => {\n return fsReadFile(filePath, encoding as any);\n });\n}\n\nexport async function readJsonQueued<T = unknown>(filePath: string): Promise<T> {\n const raw = (await readFileQueued(filePath, 'utf8')) as string;\n return JSON.parse(raw) as T;\n}\n\nexport async function readDirQueued(dirPath: string): Promise<Dirent[]> {\n return readQueue.add(async () => {\n return fsReaddir(dirPath, { withFileTypes: true });\n });\n}\n\nexport async function statQueued(filePath: string): Promise<Stats> {\n return readQueue.add(async () => {\n return fsStat(filePath);\n });\n}\n\nexport async function pathExistsQueued(p: string): Promise<boolean> {\n return readQueue.add(async () => {\n try {\n await fsStat(p);\n return true;\n } catch {\n return false;\n }\n });\n}\n\nexport async function fileExistsQueued(filePath: string): Promise<boolean> {\n return readQueue.add(async () => {\n try {\n const s = await fsStat(filePath);\n return s.isFile();\n } catch {\n return false;\n }\n });\n}\n\n// ─── Queued Write Operations ────────────────────────────────────────────────\n\nexport async function writeFileQueued(filePath: string, data: string | Buffer): Promise<void> {\n await writeQueue.add(async () => {\n const dir = dirnameOf(filePath);\n await ensureDir(dir);\n await fsWriteFile(filePath, data);\n });\n}\n\nexport async function appendFileQueued(filePath: string, data: string | Buffer): Promise<void> {\n await writeQueue.add(async () => {\n const dir = dirnameOf(filePath);\n await ensureDir(dir);\n await fsWriteFile(filePath, data, { flag: 'a' } as any);\n });\n}\n\n/**\n * Atomically write a file with fsync to ensure data hits disk.\n * Uses temp file + rename + directory fsync.\n */\nexport async function writeFileFlushedQueued(filePath: string, data: string | Buffer): Promise<void> {\n await writeQueue.add(async () => {\n const dir = dirnameOf(filePath);\n await ensureDir(dir);\n\n const tmpPath = joinPath(\n dir,\n `.${path.basename(filePath)}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`,\n );\n\n const fh = await open(tmpPath, 'w');\n try {\n await fh.writeFile(data);\n await fh.sync();\n } finally {\n await fh.close();\n }\n\n await rename(tmpPath, filePath);\n\n try {\n const dh = await open(dir, 'r');\n try { await dh.sync(); } finally { await dh.close(); }\n } catch {\n // ignore directory fsync errors\n }\n });\n}\n\n/**\n * Streamed write with durability: temp file → stream → fsync → atomic rename.\n */\nexport async function writeStreamFlushedQueued(\n filePath: string,\n producer: (stream: NodeJS.WritableStream) => Promise<void> | void,\n): Promise<void> {\n await writeQueue.add(async () => {\n const dir = dirnameOf(filePath);\n await ensureDir(dir);\n\n const tmpPath = joinPath(\n dir,\n `.${path.basename(filePath)}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`,\n );\n\n const ws = createWriteStream(tmpPath);\n\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const onError = (err: any) => { if (settled) return; settled = true; reject(err); };\n const onFinish = () => { if (settled) return; settled = true; resolve(); };\n ws.once('error', onError);\n ws.once('finish', onFinish);\n\n Promise.resolve()\n .then(async () => {\n await producer(ws);\n if (!(ws as any).destroyed && !(ws as any).writableEnded) {\n (ws as any).end();\n }\n })\n .catch(onError);\n });\n\n const fh = await open(tmpPath, 'r+');\n try { await fh.sync(); } finally { await fh.close(); }\n\n await rename(tmpPath, filePath);\n\n try {\n const dh = await open(dir, 'r');\n try { await dh.sync(); } finally { await dh.close(); }\n } catch {\n // ignore directory fsync errors\n }\n });\n}\n\n// ─── Path Utilities (Memoized) ──────────────────────────────────────────────\n\nexport function joinPath(...segments: string[]): string {\n const key = segments.join('\\u0000');\n const cached = joinPathCache.get(key);\n if (cached !== undefined) return cached;\n const out = path.join(...segments);\n joinPathCache.set(key, out);\n return out;\n}\n\nexport function dirnameOf(p: string): string {\n const cached = dirnameCache.get(p);\n if (cached !== undefined) return cached;\n const out = path.dirname(p);\n dirnameCache.set(p, out);\n return out;\n}\n\nexport function resolvePath(...segments: string[]): string {\n const key = segments.join('\\u0000');\n const cached = resolvePathCache.get(key);\n if (cached !== undefined) return cached;\n const out = path.resolve(...segments);\n resolvePathCache.set(key, out);\n return out;\n}\n\n// ─── Queue Status ───────────────────────────────────────────────────────────\n\nexport function getFsQueueStatus() {\n return {\n read: { size: readQueue.size, pending: readQueue.pending },\n write: { size: writeQueue.size, pending: writeQueue.pending },\n };\n}\n\nexport async function waitForFsQueuesIdle(): Promise<void> {\n await Promise.all([writeQueue.onIdle(), readQueue.onIdle()]);\n}\n","import type { BatchObject, BatchResultItem } from '../types.js';\nimport {\n ensureDir,\n readFileQueued,\n readJsonQueued,\n readDirQueued,\n writeFileQueued,\n writeFileFlushedQueued,\n appendFileQueued,\n pathExistsQueued,\n fileExistsQueued,\n joinPath,\n resolvePath,\n} from '../utils/fs-io.js';\n\nconst DEFAULT_BATCH_DIR = joinPath(process.cwd(), '.anymodel', 'batches');\n\n/**\n * Disk-based batch persistence store.\n * Uses queued, concurrency-limited IO for high-volume operations.\n * Structure: {dir}/{batchId}/meta.json, requests.jsonl, results.jsonl, provider.json\n */\nexport class BatchStore {\n private dir: string;\n private initialized = false;\n\n constructor(dir?: string) {\n this.dir = resolvePath(dir || DEFAULT_BATCH_DIR);\n }\n\n private async init(): Promise<void> {\n if (this.initialized) return;\n await ensureDir(this.dir);\n this.initialized = true;\n }\n\n private batchDir(id: string): string {\n return joinPath(this.dir, id);\n }\n\n /**\n * Create a new batch directory and save initial metadata.\n */\n async create(batch: BatchObject): Promise<void> {\n await this.init();\n const dir = this.batchDir(batch.id);\n await ensureDir(dir);\n await writeFileFlushedQueued(joinPath(dir, 'meta.json'), JSON.stringify(batch, null, 2));\n }\n\n /**\n * Update batch metadata (atomic write).\n */\n async updateMeta(batch: BatchObject): Promise<void> {\n await writeFileFlushedQueued(\n joinPath(this.batchDir(batch.id), 'meta.json'),\n JSON.stringify(batch, null, 2),\n );\n }\n\n /**\n * Save requests as JSONL.\n */\n async saveRequests(id: string, requests: unknown[]): Promise<void> {\n const lines = requests.map(r => JSON.stringify(r)).join('\\n') + '\\n';\n await writeFileQueued(joinPath(this.batchDir(id), 'requests.jsonl'), lines);\n }\n\n /**\n * Append a result to results.jsonl.\n */\n async appendResult(id: string, result: BatchResultItem): Promise<void> {\n await appendFileQueued(\n joinPath(this.batchDir(id), 'results.jsonl'),\n JSON.stringify(result) + '\\n',\n );\n }\n\n /**\n * Save provider-specific state (e.g., provider batch ID).\n */\n async saveProviderState(id: string, state: Record<string, unknown>): Promise<void> {\n await writeFileFlushedQueued(\n joinPath(this.batchDir(id), 'provider.json'),\n JSON.stringify(state, null, 2),\n );\n }\n\n /**\n * Load provider state.\n */\n async loadProviderState(id: string): Promise<Record<string, unknown> | null> {\n const p = joinPath(this.batchDir(id), 'provider.json');\n if (!(await fileExistsQueued(p))) return null;\n return readJsonQueued<Record<string, unknown>>(p);\n }\n\n /**\n * Get batch metadata.\n */\n async getMeta(id: string): Promise<BatchObject | null> {\n const p = joinPath(this.batchDir(id), 'meta.json');\n if (!(await fileExistsQueued(p))) return null;\n return readJsonQueued<BatchObject>(p);\n }\n\n /**\n * Get all results for a batch.\n */\n async getResults(id: string): Promise<BatchResultItem[]> {\n const p = joinPath(this.batchDir(id), 'results.jsonl');\n if (!(await fileExistsQueued(p))) return [];\n const raw = (await readFileQueued(p, 'utf8')) as string;\n return raw\n .trim()\n .split('\\n')\n .filter(Boolean)\n .map(line => JSON.parse(line));\n }\n\n /**\n * List all batch IDs.\n */\n async listBatches(): Promise<string[]> {\n await this.init();\n if (!(await pathExistsQueued(this.dir))) return [];\n const entries = await readDirQueued(this.dir);\n return entries\n .filter(d => d.isDirectory())\n .map(d => d.name)\n .sort();\n }\n\n /**\n * Stream requests from JSONL one line at a time (memory-efficient).\n */\n async *streamRequests(id: string): AsyncGenerator<unknown> {\n const p = joinPath(this.batchDir(id), 'requests.jsonl');\n if (!(await fileExistsQueued(p))) return;\n const raw = (await readFileQueued(p, 'utf8')) as string;\n for (const line of raw.split('\\n')) {\n if (line.trim()) yield JSON.parse(line);\n }\n }\n\n /**\n * Check if a batch exists.\n */\n async exists(id: string): Promise<boolean> {\n return fileExistsQueued(joinPath(this.batchDir(id), 'meta.json'));\n }\n}\n","import type {\n BatchCreateRequest,\n BatchObject,\n BatchResults,\n BatchResultItem,\n ChatCompletionRequest,\n BatchUsageSummary,\n} from '../types.js';\nimport { AnyModelError } from '../types.js';\nimport { generateId } from '../utils/id.js';\nimport { BatchStore } from './store.js';\nimport type { Router } from '../router.js';\nimport type { BatchAdapter } from '../providers/adapter.js';\n\nexport interface BatchPollOptions {\n /** Poll interval in ms. Default: 5000 */\n interval?: number;\n /** Timeout in ms. 0 = indefinite. Default: 0 */\n timeout?: number;\n /** Progress callback */\n onProgress?: (batch: BatchObject) => void;\n}\n\nexport class BatchManager {\n private store: BatchStore;\n private router: Router;\n private concurrencyLimit: number;\n private defaultPollInterval: number;\n private batchAdapters = new Map<string, BatchAdapter>();\n\n constructor(router: Router, options?: { dir?: string; concurrency?: number; pollInterval?: number }) {\n this.store = new BatchStore(options?.dir);\n this.router = router;\n this.concurrencyLimit = options?.concurrency ?? 5;\n this.defaultPollInterval = options?.pollInterval ?? 5000;\n }\n\n /**\n * Register a native batch adapter for a provider.\n */\n registerBatchAdapter(providerName: string, adapter: BatchAdapter): void {\n this.batchAdapters.set(providerName, adapter);\n }\n\n /**\n * Check if a provider has native batch support.\n */\n private getNativeBatchAdapter(model: string): { adapter: BatchAdapter; providerName: string } | null {\n const providerName = model.split('/')[0];\n const adapter = this.batchAdapters.get(providerName);\n return adapter ? { adapter, providerName } : null;\n }\n\n /**\n * Create a batch and return immediately (no polling).\n */\n async create(request: BatchCreateRequest): Promise<BatchObject> {\n const id = generateId('batch');\n const now = new Date().toISOString();\n const providerName = request.model.split('/')[0] || 'unknown';\n const native = request.batch_mode !== 'concurrent' ? this.getNativeBatchAdapter(request.model) : null;\n const batchMode = native ? 'native' as const : 'concurrent' as const;\n\n const batch: BatchObject = {\n id,\n object: 'batch',\n status: 'pending',\n model: request.model,\n provider_name: providerName,\n batch_mode: batchMode,\n total: request.requests.length,\n completed: 0,\n failed: 0,\n created_at: now,\n completed_at: null,\n expires_at: null,\n };\n\n await this.store.create(batch);\n await this.store.saveRequests(id, request.requests);\n\n if (native) {\n this.processNativeBatch(id, request, native.adapter).catch(() => {});\n } else {\n this.processConcurrentBatch(id, request.model, request.options as Record<string, unknown> | undefined).catch(() => {});\n }\n\n return batch;\n }\n\n /**\n * Create a batch and poll until completion.\n */\n async createAndPoll(\n request: BatchCreateRequest,\n options: BatchPollOptions = {},\n ): Promise<BatchResults> {\n const batch = await this.create(request);\n return this.poll(batch.id, options);\n }\n\n /**\n * Poll an existing batch until completion.\n */\n async poll(id: string, options: BatchPollOptions = {}): Promise<BatchResults> {\n const interval = options.interval ?? this.defaultPollInterval;\n const timeout = options.timeout ?? 0;\n const startTime = Date.now();\n\n while (true) {\n let batch = await this.store.getMeta(id);\n if (!batch) {\n throw new AnyModelError(404, `Batch ${id} not found`);\n }\n\n // For native batches, sync status from provider\n if (batch.batch_mode === 'native' && batch.status === 'processing') {\n await this.syncNativeBatchStatus(id);\n batch = await this.store.getMeta(id);\n if (!batch) throw new AnyModelError(404, `Batch ${id} not found`);\n }\n\n if (options.onProgress) {\n options.onProgress(batch);\n }\n\n if (batch.status === 'completed' || batch.status === 'failed' || batch.status === 'cancelled') {\n return this.getResults(id);\n }\n\n if (timeout > 0 && Date.now() - startTime > timeout) {\n throw new AnyModelError(408, `Batch ${id} timed out after ${timeout}ms`);\n }\n\n await new Promise(resolve => setTimeout(resolve, interval));\n }\n }\n\n /**\n * Get the current status of a batch.\n */\n async get(id: string): Promise<BatchObject | null> {\n return this.store.getMeta(id);\n }\n\n /**\n * Get results for a completed batch.\n */\n async getResults(id: string): Promise<BatchResults> {\n const batch = await this.store.getMeta(id);\n if (!batch) {\n throw new AnyModelError(404, `Batch ${id} not found`);\n }\n\n const results = await this.store.getResults(id);\n\n const usage: BatchUsageSummary = {\n total_prompt_tokens: 0,\n total_completion_tokens: 0,\n estimated_cost: 0,\n };\n\n for (const result of results) {\n if (result.response) {\n usage.total_prompt_tokens += result.response.usage.prompt_tokens;\n usage.total_completion_tokens += result.response.usage.completion_tokens;\n }\n }\n\n return {\n id: batch.id,\n status: batch.status,\n results,\n usage_summary: usage,\n };\n }\n\n /**\n * List all batches.\n */\n async list(): Promise<BatchObject[]> {\n const ids = await this.store.listBatches();\n const batches: BatchObject[] = [];\n for (const id of ids) {\n const meta = await this.store.getMeta(id);\n if (meta) batches.push(meta);\n }\n return batches;\n }\n\n /**\n * Cancel a batch.\n */\n async cancel(id: string): Promise<BatchObject> {\n const batch = await this.store.getMeta(id);\n if (!batch) {\n throw new AnyModelError(404, `Batch ${id} not found`);\n }\n if (batch.status === 'completed' || batch.status === 'cancelled') {\n return batch;\n }\n\n // If native batch, cancel at provider too\n if (batch.batch_mode === 'native') {\n const providerState = await this.store.loadProviderState(id);\n const adapter = this.batchAdapters.get(batch.provider_name);\n if (adapter && providerState?.providerBatchId) {\n try {\n await adapter.cancelBatch(providerState.providerBatchId as string);\n } catch {\n // Best-effort cancellation\n }\n }\n }\n\n batch.status = 'cancelled';\n batch.completed_at = new Date().toISOString();\n await this.store.updateMeta(batch);\n return batch;\n }\n\n /**\n * Process batch via native provider batch API.\n */\n private async processNativeBatch(\n batchId: string,\n request: BatchCreateRequest,\n adapter: BatchAdapter,\n ): Promise<void> {\n const batch = await this.store.getMeta(batchId);\n if (!batch) return;\n\n try {\n const model = request.model.includes('/')\n ? request.model.split('/').slice(1).join('/')\n : request.model;\n\n const { providerBatchId, metadata } = await adapter.createBatch(\n model,\n request.requests,\n request.options as Record<string, unknown> | undefined,\n );\n\n await this.store.saveProviderState(batchId, {\n providerBatchId,\n providerName: batch.provider_name,\n ...metadata,\n });\n\n batch.status = 'processing';\n await this.store.updateMeta(batch);\n } catch (err) {\n batch.status = 'failed';\n batch.completed_at = new Date().toISOString();\n await this.store.updateMeta(batch);\n throw err;\n }\n }\n\n /**\n * Sync native batch status from provider.\n */\n private async syncNativeBatchStatus(batchId: string): Promise<void> {\n const batch = await this.store.getMeta(batchId);\n if (!batch) return;\n\n const providerState = await this.store.loadProviderState(batchId);\n if (!providerState?.providerBatchId) return;\n\n const adapter = this.batchAdapters.get(batch.provider_name);\n if (!adapter) return;\n\n try {\n const status = await adapter.pollBatch(providerState.providerBatchId as string);\n\n batch.total = status.total || batch.total;\n batch.completed = status.completed;\n batch.failed = status.failed;\n\n if (status.status === 'completed' || status.status === 'failed' || status.status === 'cancelled') {\n batch.status = status.status;\n batch.completed_at = new Date().toISOString();\n\n if (status.status === 'completed' || status.status === 'failed') {\n try {\n const results = await adapter.getBatchResults(providerState.providerBatchId as string);\n for (const result of results) {\n await this.store.appendResult(batchId, result);\n }\n batch.completed = results.filter(r => r.status === 'success').length;\n batch.failed = results.filter(r => r.status === 'error').length;\n } catch {\n if (batch.status !== 'failed') {\n batch.status = 'failed';\n }\n }\n }\n } else {\n batch.status = 'processing';\n }\n\n await this.store.updateMeta(batch);\n } catch {\n // Provider API error during poll — don't change status\n }\n }\n\n /**\n * Process batch requests concurrently (fallback path).\n * Streams requests from disk to avoid holding them all in memory.\n */\n private async processConcurrentBatch(batchId: string, model: string, options?: Record<string, unknown>): Promise<void> {\n const batch = await this.store.getMeta(batchId);\n if (!batch) return;\n batch.status = 'processing';\n await this.store.updateMeta(batch);\n\n const active = new Set<Promise<void>>();\n\n const processItem = async (item: any): Promise<void> => {\n const current = await this.store.getMeta(batchId);\n if (current?.status === 'cancelled') return;\n\n const chatRequest: ChatCompletionRequest = {\n model,\n messages: item.messages,\n max_tokens: item.max_tokens ?? (options as any)?.max_tokens,\n temperature: item.temperature ?? (options as any)?.temperature,\n top_p: item.top_p ?? (options as any)?.top_p,\n top_k: item.top_k ?? (options as any)?.top_k,\n stop: item.stop ?? (options as any)?.stop,\n response_format: item.response_format ?? (options as any)?.response_format,\n tools: item.tools ?? (options as any)?.tools,\n tool_choice: item.tool_choice ?? (options as any)?.tool_choice,\n service_tier: item.service_tier ?? (options as any)?.service_tier,\n };\n\n let result: BatchResultItem;\n try {\n const response = await this.router.complete(chatRequest);\n result = {\n custom_id: item.custom_id,\n status: 'success',\n response,\n error: null,\n };\n } catch (err) {\n const error = err instanceof AnyModelError ? err : new AnyModelError(500, String(err));\n result = {\n custom_id: item.custom_id,\n status: 'error',\n response: null,\n error: { code: error.code, message: error.message },\n };\n }\n\n await this.store.appendResult(batchId, result);\n\n const meta = await this.store.getMeta(batchId);\n if (meta) {\n if (result.status === 'success') {\n meta.completed++;\n } else {\n meta.failed++;\n }\n await this.store.updateMeta(meta);\n }\n };\n\n // Stream requests from disk instead of holding all in memory\n for await (const item of this.store.streamRequests(batchId)) {\n const current = await this.store.getMeta(batchId);\n if (current?.status === 'cancelled') break;\n\n if (active.size >= this.concurrencyLimit) {\n await Promise.race(active);\n }\n\n const promise = processItem(item).then(() => {\n active.delete(promise);\n });\n active.add(promise);\n }\n\n await Promise.all(active);\n\n const finalMeta = await this.store.getMeta(batchId);\n if (finalMeta && finalMeta.status !== 'cancelled') {\n finalMeta.status = finalMeta.failed === finalMeta.total ? 'failed' : 'completed';\n finalMeta.completed_at = new Date().toISOString();\n await this.store.updateMeta(finalMeta);\n }\n }\n}\n","/**\n * Rough token estimation and model-limit lookups for automatic max_tokens calculation.\n */\n\nconst CHARS_PER_TOKEN = 4;\n\n/** Estimate the number of tokens in a string (~4 chars per token). */\nexport function estimateTokenCount(text: string): number {\n return Math.ceil(text.length / CHARS_PER_TOKEN);\n}\n\ninterface ModelLimit {\n contextLength: number;\n maxCompletionTokens: number;\n}\n\nconst MODEL_LIMITS: Array<{ pattern: string; limit: ModelLimit }> = [\n // OpenAI\n { pattern: 'gpt-4o-mini', limit: { contextLength: 128_000, maxCompletionTokens: 16_384 } },\n { pattern: 'gpt-4o', limit: { contextLength: 128_000, maxCompletionTokens: 16_384 } },\n { pattern: 'gpt-4-turbo', limit: { contextLength: 128_000, maxCompletionTokens: 4_096 } },\n { pattern: 'gpt-3.5-turbo', limit: { contextLength: 16_385, maxCompletionTokens: 4_096 } },\n { pattern: 'o1', limit: { contextLength: 200_000, maxCompletionTokens: 100_000 } },\n { pattern: 'o3', limit: { contextLength: 200_000, maxCompletionTokens: 100_000 } },\n { pattern: 'o4-mini', limit: { contextLength: 200_000, maxCompletionTokens: 100_000 } },\n\n // Anthropic\n { pattern: 'claude-opus-4', limit: { contextLength: 200_000, maxCompletionTokens: 32_768 } },\n { pattern: 'claude-sonnet-4', limit: { contextLength: 200_000, maxCompletionTokens: 16_384 } },\n { pattern: 'claude-haiku-4', limit: { contextLength: 200_000, maxCompletionTokens: 8_192 } },\n { pattern: 'claude-3.5-sonnet', limit: { contextLength: 200_000, maxCompletionTokens: 8_192 } },\n { pattern: 'claude-3-opus', limit: { contextLength: 200_000, maxCompletionTokens: 4_096 } },\n\n // Google\n { pattern: 'gemini-2.5-pro', limit: { contextLength: 1_048_576, maxCompletionTokens: 65_536 } },\n { pattern: 'gemini-2.5-flash', limit: { contextLength: 1_048_576, maxCompletionTokens: 65_536 } },\n { pattern: 'gemini-2.0-flash', limit: { contextLength: 1_048_576, maxCompletionTokens: 65_536 } },\n { pattern: 'gemini-1.5-pro', limit: { contextLength: 2_097_152, maxCompletionTokens: 8_192 } },\n { pattern: 'gemini-1.5-flash', limit: { contextLength: 1_048_576, maxCompletionTokens: 8_192 } },\n];\n\nconst DEFAULT_LIMIT: ModelLimit = { contextLength: 128_000, maxCompletionTokens: 4_096 };\n\n/**\n * Look up context-window and max-completion-token limits for a model.\n * Strips any \"provider/\" prefix before matching.\n */\nfunction getModelLimits(model: string): ModelLimit {\n // Strip provider prefix (e.g. \"openai/gpt-4o\" -> \"gpt-4o\")\n const bare = model.includes('/') ? model.slice(model.indexOf('/') + 1) : model;\n\n for (const entry of MODEL_LIMITS) {\n if (bare.startsWith(entry.pattern) || bare.includes(entry.pattern)) {\n return entry.limit;\n }\n }\n return DEFAULT_LIMIT;\n}\n\n/**\n * Determine the best max_tokens value for a request.\n *\n * - If the caller already supplied a value, return it unchanged.\n * - Otherwise estimate input tokens, apply a 5 % safety margin, then\n * return min(maxCompletionTokens, contextLength - estimatedInput).\n * - The result is clamped to at least 1.\n */\nexport function resolveMaxTokens(\n model: string,\n messages: unknown[],\n userMaxTokens?: number,\n): number {\n if (userMaxTokens !== undefined) return userMaxTokens;\n\n const inputChars = JSON.stringify(messages).length;\n const estimatedInput = Math.ceil(inputChars / CHARS_PER_TOKEN);\n const estimatedWithMargin = Math.ceil(estimatedInput * 1.05);\n\n const limits = getModelLimits(model);\n const available = limits.contextLength - estimatedWithMargin;\n const result = Math.min(limits.maxCompletionTokens, available);\n\n return Math.max(1, result);\n}\n","import type { BatchAdapter, NativeBatchStatus } from './adapter.js';\nimport type { BatchRequestItem, BatchResultItem, ChatCompletion } from '../types.js';\nimport { AnyModelError } from '../types.js';\nimport { generateId } from '../utils/id.js';\nimport { resolveMaxTokens } from '../utils/token-estimate.js';\nimport { fetchWithTimeout } from '../utils/fetch-with-timeout.js';\n\nconst OPENAI_API_BASE = 'https://api.openai.com/v1';\n\nexport function createOpenAIBatchAdapter(apiKey: string): BatchAdapter {\n async function apiRequest(path: string, options: {\n method?: string;\n body?: unknown;\n formData?: FormData;\n } = {}): Promise<any> {\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${apiKey}`,\n };\n\n let fetchBody: BodyInit | undefined;\n if (options.formData) {\n fetchBody = options.formData;\n } else if (options.body) {\n headers['Content-Type'] = 'application/json';\n fetchBody = JSON.stringify(options.body);\n }\n\n const res = await fetchWithTimeout(`${OPENAI_API_BASE}${path}`, {\n method: options.method || 'GET',\n headers,\n body: fetchBody,\n });\n\n if (!res.ok) {\n let errorBody: any;\n try { errorBody = await res.json(); } catch { errorBody = { message: res.statusText }; }\n const msg = errorBody?.error?.message || errorBody?.message || res.statusText;\n throw new AnyModelError(res.status >= 500 ? 502 : res.status, msg, {\n provider_name: 'openai',\n raw: errorBody,\n });\n }\n\n return res;\n }\n\n function buildJSONL(model: string, requests: BatchRequestItem[]): string {\n return requests.map(req => {\n const body: Record<string, unknown> = {\n model,\n messages: req.messages,\n };\n body.max_tokens = req.max_tokens !== undefined\n ? req.max_tokens\n : resolveMaxTokens(model, req.messages);\n if (req.temperature !== undefined) body.temperature = req.temperature;\n if (req.top_p !== undefined) body.top_p = req.top_p;\n if (req.stop !== undefined) body.stop = req.stop;\n if (req.response_format !== undefined) body.response_format = req.response_format;\n if (req.tools !== undefined) body.tools = req.tools;\n if (req.tool_choice !== undefined) body.tool_choice = req.tool_choice;\n // service_tier intentionally omitted — native batch already gets 50% off\n\n return JSON.stringify({\n custom_id: req.custom_id,\n method: 'POST',\n url: '/v1/chat/completions',\n body,\n });\n }).join('\\n');\n }\n\n function rePrefixId(id: string): string {\n if (id && id.startsWith('chatcmpl-')) {\n return `gen-${id.substring(9)}`;\n }\n return id.startsWith('gen-') ? id : `gen-${id}`;\n }\n\n function translateOpenAIResponse(body: any): ChatCompletion {\n return {\n id: rePrefixId(body.id || generateId()),\n object: 'chat.completion',\n created: body.created || Math.floor(Date.now() / 1000),\n model: `openai/${body.model}`,\n choices: body.choices,\n usage: body.usage,\n };\n }\n\n function mapStatus(openaiStatus: string): NativeBatchStatus['status'] {\n switch (openaiStatus) {\n case 'validating':\n case 'finalizing':\n return 'processing';\n case 'in_progress':\n return 'processing';\n case 'completed':\n return 'completed';\n case 'failed':\n return 'failed';\n case 'expired':\n return 'failed';\n case 'cancelled':\n case 'cancelling':\n return 'cancelled';\n default:\n return 'pending';\n }\n }\n\n return {\n async createBatch(model, requests, options) {\n // 1. Build JSONL content\n const jsonlContent = buildJSONL(model, requests);\n const blob = new Blob([jsonlContent], { type: 'application/jsonl' });\n\n // 2. Upload file\n const formData = new FormData();\n formData.append('purpose', 'batch');\n formData.append('file', blob, 'batch_input.jsonl');\n\n const uploadRes = await apiRequest('/files', { method: 'POST', formData });\n const fileData = await uploadRes.json();\n const inputFileId = fileData.id;\n\n // 3. Create batch\n const batchRes = await apiRequest('/batches', {\n method: 'POST',\n body: {\n input_file_id: inputFileId,\n endpoint: '/v1/chat/completions',\n completion_window: '24h',\n metadata: options?.metadata as Record<string, string> | undefined,\n },\n });\n const batchData = await batchRes.json();\n\n return {\n providerBatchId: batchData.id,\n metadata: {\n input_file_id: inputFileId,\n openai_status: batchData.status,\n },\n };\n },\n\n async pollBatch(providerBatchId) {\n const res = await apiRequest(`/batches/${providerBatchId}`);\n const data = await res.json();\n\n const requestCounts = data.request_counts || {};\n\n return {\n status: mapStatus(data.status),\n total: requestCounts.total || 0,\n completed: requestCounts.completed || 0,\n failed: requestCounts.failed || 0,\n };\n },\n\n async getBatchResults(providerBatchId) {\n // Get batch to find output file\n const batchRes = await apiRequest(`/batches/${providerBatchId}`);\n const batchData = await batchRes.json();\n\n const results: BatchResultItem[] = [];\n\n // Download output file\n if (batchData.output_file_id) {\n const outputRes = await apiRequest(`/files/${batchData.output_file_id}/content`);\n const outputText = await outputRes.text();\n\n for (const line of outputText.trim().split('\\n')) {\n if (!line) continue;\n const item = JSON.parse(line);\n\n if (item.response?.status_code === 200) {\n results.push({\n custom_id: item.custom_id,\n status: 'success',\n response: translateOpenAIResponse(item.response.body),\n error: null,\n });\n } else {\n results.push({\n custom_id: item.custom_id,\n status: 'error',\n response: null,\n error: {\n code: item.response?.status_code || 500,\n message: item.error?.message || item.response?.body?.error?.message || 'Unknown error',\n },\n });\n }\n }\n }\n\n // Download error file\n if (batchData.error_file_id) {\n const errorRes = await apiRequest(`/files/${batchData.error_file_id}/content`);\n const errorText = await errorRes.text();\n\n for (const line of errorText.trim().split('\\n')) {\n if (!line) continue;\n const item = JSON.parse(line);\n // Only add if not already in results\n const existing = results.find(r => r.custom_id === item.custom_id);\n if (!existing) {\n results.push({\n custom_id: item.custom_id,\n status: 'error',\n response: null,\n error: {\n code: item.response?.status_code || 500,\n message: item.error?.message || 'Batch item error',\n },\n });\n }\n }\n }\n\n return results;\n },\n\n async cancelBatch(providerBatchId) {\n await apiRequest(`/batches/${providerBatchId}/cancel`, { method: 'POST' });\n },\n };\n}\n","import type { BatchAdapter, NativeBatchStatus } from './adapter.js';\nimport type { BatchRequestItem, BatchResultItem, ChatCompletion, Message, ToolCall } from '../types.js';\nimport { AnyModelError } from '../types.js';\nimport { generateId } from '../utils/id.js';\nimport { resolveMaxTokens } from '../utils/token-estimate.js';\nimport { fetchWithTimeout } from '../utils/fetch-with-timeout.js';\n\nconst ANTHROPIC_API_BASE = 'https://api.anthropic.com/v1';\nconst ANTHROPIC_VERSION = '2023-06-01';\nconst DEFAULT_MAX_TOKENS = 4096;\n\nexport function createAnthropicBatchAdapter(apiKey: string): BatchAdapter {\n async function apiRequest(path: string, options: {\n method?: string;\n body?: unknown;\n } = {}): Promise<Response> {\n const headers: Record<string, string> = {\n 'x-api-key': apiKey,\n 'anthropic-version': ANTHROPIC_VERSION,\n 'Content-Type': 'application/json',\n };\n\n const res = await fetchWithTimeout(`${ANTHROPIC_API_BASE}${path}`, {\n method: options.method || 'GET',\n headers,\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (!res.ok) {\n let errorBody: any;\n try { errorBody = await res.json(); } catch { errorBody = { message: res.statusText }; }\n const msg = errorBody?.error?.message || errorBody?.message || res.statusText;\n throw new AnyModelError(res.status >= 500 ? 502 : res.status, msg, {\n provider_name: 'anthropic',\n raw: errorBody,\n });\n }\n\n return res;\n }\n\n function translateToAnthropicParams(model: string, req: BatchRequestItem): Record<string, unknown> {\n const params: Record<string, unknown> = {\n model,\n max_tokens: resolveMaxTokens(model, req.messages, req.max_tokens || DEFAULT_MAX_TOKENS),\n };\n\n // Extract system messages\n const systemMessages = req.messages.filter(m => m.role === 'system');\n const nonSystemMessages = req.messages.filter(m => m.role !== 'system');\n\n if (systemMessages.length > 0) {\n params.system = systemMessages\n .map(m => typeof m.content === 'string' ? m.content : '')\n .join('\\n');\n }\n\n // Map messages\n params.messages = nonSystemMessages.map(m => ({\n role: m.role === 'tool' ? 'user' : m.role,\n content: m.tool_call_id\n ? [{ type: 'tool_result', tool_use_id: m.tool_call_id, content: typeof m.content === 'string' ? m.content : '' }]\n : m.content,\n }));\n\n if (req.temperature !== undefined) params.temperature = req.temperature;\n if (req.top_p !== undefined) params.top_p = req.top_p;\n if (req.top_k !== undefined) params.top_k = req.top_k;\n if (req.stop !== undefined) params.stop_sequences = Array.isArray(req.stop) ? req.stop : [req.stop];\n\n // Map tools\n if (req.tools && req.tools.length > 0) {\n params.tools = req.tools.map(t => ({\n name: t.function.name,\n description: t.function.description || '',\n input_schema: t.function.parameters || { type: 'object', properties: {} },\n }));\n\n if (req.tool_choice) {\n if (req.tool_choice === 'auto') {\n params.tool_choice = { type: 'auto' };\n } else if (req.tool_choice === 'required') {\n params.tool_choice = { type: 'any' };\n } else if (req.tool_choice === 'none') {\n delete params.tools;\n } else if (typeof req.tool_choice === 'object') {\n params.tool_choice = { type: 'tool', name: req.tool_choice.function.name };\n }\n }\n }\n\n // Handle response_format\n if (req.response_format) {\n if (req.response_format.type === 'json_object' || req.response_format.type === 'json_schema') {\n const jsonInstruction = 'Respond with valid JSON only. Do not include any text outside the JSON object.';\n params.system = params.system ? `${jsonInstruction}\\n\\n${params.system}` : jsonInstruction;\n }\n }\n\n return params;\n }\n\n function mapStopReason(reason: string): 'stop' | 'length' | 'tool_calls' | 'content_filter' | 'error' {\n switch (reason) {\n case 'end_turn': return 'stop';\n case 'max_tokens': return 'length';\n case 'tool_use': return 'tool_calls';\n case 'stop_sequence': return 'stop';\n default: return 'stop';\n }\n }\n\n function translateAnthropicMessage(msg: any): ChatCompletion {\n let content = '';\n const toolCalls: ToolCall[] = [];\n\n for (const block of msg.content || []) {\n if (block.type === 'text') {\n content += block.text;\n } else if (block.type === 'tool_use') {\n toolCalls.push({\n id: block.id,\n type: 'function',\n function: {\n name: block.name,\n arguments: JSON.stringify(block.input),\n },\n });\n }\n }\n\n const message: Message = { role: 'assistant', content };\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n\n return {\n id: generateId(),\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: `anthropic/${msg.model}`,\n choices: [{\n index: 0,\n message,\n finish_reason: mapStopReason(msg.stop_reason),\n }],\n usage: {\n prompt_tokens: msg.usage?.input_tokens || 0,\n completion_tokens: msg.usage?.output_tokens || 0,\n total_tokens: (msg.usage?.input_tokens || 0) + (msg.usage?.output_tokens || 0),\n },\n };\n }\n\n return {\n async createBatch(model, requests, _options) {\n // Build Anthropic batch request format\n const batchRequests = requests.map(req => ({\n custom_id: req.custom_id,\n params: translateToAnthropicParams(model, req),\n }));\n\n const res = await apiRequest('/messages/batches', {\n method: 'POST',\n body: { requests: batchRequests },\n });\n const data = await res.json();\n\n return {\n providerBatchId: data.id,\n metadata: {\n anthropic_type: data.type,\n created_at: data.created_at,\n },\n };\n },\n\n async pollBatch(providerBatchId) {\n const res = await apiRequest(`/messages/batches/${providerBatchId}`);\n const data = await res.json();\n\n const counts = data.request_counts || {};\n const total = (counts.processing || 0) + (counts.succeeded || 0) +\n (counts.errored || 0) + (counts.canceled || 0) + (counts.expired || 0);\n\n let status: NativeBatchStatus['status'];\n if (data.processing_status === 'ended') {\n // Check if all failed\n if (counts.succeeded === 0 && (counts.errored > 0 || counts.expired > 0 || counts.canceled > 0)) {\n status = 'failed';\n } else if (data.cancel_initiated_at) {\n status = 'cancelled';\n } else {\n status = 'completed';\n }\n } else {\n status = 'processing';\n }\n\n return {\n status,\n total,\n completed: counts.succeeded || 0,\n failed: (counts.errored || 0) + (counts.expired || 0) + (counts.canceled || 0),\n };\n },\n\n async getBatchResults(providerBatchId) {\n const res = await apiRequest(`/messages/batches/${providerBatchId}/results`);\n const text = await res.text();\n const results: BatchResultItem[] = [];\n\n for (const line of text.trim().split('\\n')) {\n if (!line) continue;\n const item = JSON.parse(line);\n\n if (item.result?.type === 'succeeded') {\n results.push({\n custom_id: item.custom_id,\n status: 'success',\n response: translateAnthropicMessage(item.result.message),\n error: null,\n });\n } else {\n // errored, expired, or canceled\n const errorType = item.result?.type || 'unknown';\n const errorMsg = item.result?.error?.message || `Batch item ${errorType}`;\n results.push({\n custom_id: item.custom_id,\n status: 'error',\n response: null,\n error: {\n code: errorType === 'expired' ? 408 : 500,\n message: errorMsg,\n },\n });\n }\n }\n\n return results;\n },\n\n async cancelBatch(providerBatchId) {\n await apiRequest(`/messages/batches/${providerBatchId}/cancel`, { method: 'POST' });\n },\n };\n}\n","import type { BatchAdapter, NativeBatchStatus } from './adapter.js';\nimport type { BatchRequestItem, BatchResultItem, ChatCompletion, Message, ToolCall } from '../types.js';\nimport { AnyModelError } from '../types.js';\nimport { generateId } from '../utils/id.js';\nimport { resolveMaxTokens } from '../utils/token-estimate.js';\nimport { fetchWithTimeout } from '../utils/fetch-with-timeout.js';\n\nconst GEMINI_API_BASE = 'https://generativelanguage.googleapis.com/v1beta';\n\nexport function createGoogleBatchAdapter(apiKey: string): BatchAdapter {\n async function apiRequest(path: string, options: {\n method?: string;\n body?: unknown;\n } = {}): Promise<Response> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-goog-api-key': apiKey,\n };\n\n const res = await fetchWithTimeout(`${GEMINI_API_BASE}${path}`, {\n method: options.method || 'GET',\n headers,\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (!res.ok) {\n let errorBody: any;\n try { errorBody = await res.json(); } catch { errorBody = { message: res.statusText }; }\n const msg = errorBody?.error?.message || errorBody?.message || res.statusText;\n throw new AnyModelError(res.status >= 500 ? 502 : res.status, msg, {\n provider_name: 'google',\n raw: errorBody,\n });\n }\n\n return res;\n }\n\n function translateRequestToGemini(model: string, req: BatchRequestItem): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n\n // Extract system messages\n const systemMessages = req.messages.filter(m => m.role === 'system');\n const nonSystemMessages = req.messages.filter(m => m.role !== 'system');\n\n if (systemMessages.length > 0) {\n body.systemInstruction = {\n parts: [{ text: systemMessages.map(m => typeof m.content === 'string' ? m.content : '').join('\\n') }],\n };\n }\n\n // Map messages to contents\n body.contents = nonSystemMessages.map(m => ({\n role: m.role === 'assistant' ? 'model' : 'user',\n parts: typeof m.content === 'string'\n ? [{ text: m.content }]\n : Array.isArray(m.content)\n ? m.content.map((p: any) => p.type === 'text' ? { text: p.text } : { text: '' })\n : [{ text: '' }],\n }));\n\n // Generation config\n const generationConfig: Record<string, unknown> = {};\n if (req.temperature !== undefined) generationConfig.temperature = req.temperature;\n generationConfig.maxOutputTokens = req.max_tokens !== undefined\n ? req.max_tokens\n : resolveMaxTokens(model, req.messages);\n if (req.top_p !== undefined) generationConfig.topP = req.top_p;\n if (req.top_k !== undefined) generationConfig.topK = req.top_k;\n if (req.stop !== undefined) {\n generationConfig.stopSequences = Array.isArray(req.stop) ? req.stop : [req.stop];\n }\n\n if (req.response_format) {\n if (req.response_format.type === 'json_object') {\n generationConfig.responseMimeType = 'application/json';\n } else if (req.response_format.type === 'json_schema') {\n generationConfig.responseMimeType = 'application/json';\n generationConfig.responseSchema = req.response_format.json_schema?.schema;\n }\n }\n\n if (Object.keys(generationConfig).length > 0) {\n body.generationConfig = generationConfig;\n }\n\n // Map tools\n if (req.tools && req.tools.length > 0) {\n body.tools = [{\n functionDeclarations: req.tools.map(t => ({\n name: t.function.name,\n description: t.function.description || '',\n parameters: t.function.parameters || {},\n })),\n }];\n\n if (req.tool_choice) {\n if (req.tool_choice === 'auto') {\n body.toolConfig = { functionCallingConfig: { mode: 'AUTO' } };\n } else if (req.tool_choice === 'required') {\n body.toolConfig = { functionCallingConfig: { mode: 'ANY' } };\n } else if (req.tool_choice === 'none') {\n body.toolConfig = { functionCallingConfig: { mode: 'NONE' } };\n } else if (typeof req.tool_choice === 'object') {\n body.toolConfig = {\n functionCallingConfig: {\n mode: 'ANY',\n allowedFunctionNames: [req.tool_choice.function.name],\n },\n };\n }\n }\n }\n\n return body;\n }\n\n function mapFinishReason(reason: string): 'stop' | 'length' | 'tool_calls' | 'content_filter' | 'error' {\n switch (reason) {\n case 'STOP': return 'stop';\n case 'MAX_TOKENS': return 'length';\n case 'SAFETY': return 'content_filter';\n case 'RECITATION': return 'content_filter';\n default: return 'stop';\n }\n }\n\n function translateGeminiResponse(response: any, model: string): ChatCompletion {\n const candidate = response.candidates?.[0];\n\n let content = '';\n const toolCalls: ToolCall[] = [];\n\n for (const part of candidate?.content?.parts || []) {\n if (part.text) {\n content += part.text;\n } else if (part.functionCall) {\n toolCalls.push({\n id: generateId('call'),\n type: 'function',\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args || {}),\n },\n });\n }\n }\n\n const message: Message = { role: 'assistant', content };\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n\n const finishReason = toolCalls.length > 0\n ? 'tool_calls' as const\n : mapFinishReason(candidate?.finishReason || 'STOP');\n\n return {\n id: generateId(),\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: `google/${model}`,\n choices: [{ index: 0, message, finish_reason: finishReason }],\n usage: {\n prompt_tokens: response.usageMetadata?.promptTokenCount || 0,\n completion_tokens: response.usageMetadata?.candidatesTokenCount || 0,\n total_tokens: response.usageMetadata?.totalTokenCount || 0,\n },\n };\n }\n\n function mapBatchState(state: string): NativeBatchStatus['status'] {\n switch (state) {\n case 'JOB_STATE_PENDING':\n return 'pending';\n case 'JOB_STATE_RUNNING':\n return 'processing';\n case 'JOB_STATE_SUCCEEDED':\n return 'completed';\n case 'JOB_STATE_FAILED':\n return 'failed';\n case 'JOB_STATE_CANCELLED':\n return 'cancelled';\n case 'JOB_STATE_EXPIRED':\n return 'failed';\n default:\n return 'pending';\n }\n }\n\n return {\n async createBatch(model, requests, _options) {\n // Build inline batch requests\n const batchRequests = requests.map(req => ({\n request: translateRequestToGemini(model, req),\n metadata: { key: req.custom_id },\n }));\n\n const res = await apiRequest(`/models/${model}:batchGenerateContent`, {\n method: 'POST',\n body: {\n batch: {\n display_name: `anymodel-batch-${Date.now()}`,\n input_config: {\n requests: {\n requests: batchRequests,\n },\n },\n },\n },\n });\n const data = await res.json();\n\n // The response contains a batch name like \"batches/123456789\"\n const batchName = data.name || data.batch?.name;\n if (!batchName) {\n throw new AnyModelError(502, 'No batch name in Google response', {\n provider_name: 'google',\n raw: data,\n });\n }\n\n return {\n providerBatchId: batchName,\n metadata: {\n model,\n total_requests: requests.length,\n },\n };\n },\n\n async pollBatch(providerBatchId) {\n const res = await apiRequest(`/${providerBatchId}`);\n const data = await res.json();\n\n const state = data.state || 'JOB_STATE_PENDING';\n const status = mapBatchState(state);\n\n // Google doesn't provide granular counts during processing\n const totalCount = data.totalCount || data.metadata?.total_requests || 0;\n const successCount = data.succeededCount || 0;\n const failedCount = data.failedCount || 0;\n\n return {\n status,\n total: totalCount || successCount + failedCount,\n completed: successCount,\n failed: failedCount,\n };\n },\n\n async getBatchResults(providerBatchId) {\n // First get the batch to check for inline results or file reference\n const batchRes = await apiRequest(`/${providerBatchId}`);\n const batchData = await batchRes.json();\n\n const results: BatchResultItem[] = [];\n const model = batchData.metadata?.model || 'unknown';\n\n // Check for inline responses\n if (batchData.response?.inlinedResponses) {\n for (const item of batchData.response.inlinedResponses) {\n const customId = item.metadata?.key || `request-${results.length}`;\n\n if (item.response) {\n results.push({\n custom_id: customId,\n status: 'success',\n response: translateGeminiResponse(item.response, model),\n error: null,\n });\n } else if (item.error) {\n results.push({\n custom_id: customId,\n status: 'error',\n response: null,\n error: {\n code: item.error.code || 500,\n message: item.error.message || 'Batch item failed',\n },\n });\n }\n }\n return results;\n }\n\n // Check for file-based results\n const responsesFile = batchData.response?.responsesFileName ||\n batchData.outputConfig?.file_name;\n\n if (responsesFile) {\n const downloadUrl = `${GEMINI_API_BASE}/${responsesFile}:download?alt=media`;\n const fileRes = await fetchWithTimeout(downloadUrl, {\n headers: { 'x-goog-api-key': apiKey },\n });\n\n if (!fileRes.ok) {\n throw new AnyModelError(502, 'Failed to download batch results file', {\n provider_name: 'google',\n });\n }\n\n const text = await fileRes.text();\n for (const line of text.trim().split('\\n')) {\n if (!line) continue;\n const item = JSON.parse(line);\n const customId = item.key || item.metadata?.key || `request-${results.length}`;\n\n if (item.response) {\n results.push({\n custom_id: customId,\n status: 'success',\n response: translateGeminiResponse(item.response, model),\n error: null,\n });\n } else if (item.error) {\n results.push({\n custom_id: customId,\n status: 'error',\n response: null,\n error: {\n code: item.error.code || 500,\n message: item.error.message || 'Batch item failed',\n },\n });\n }\n }\n }\n\n return results;\n },\n\n async cancelBatch(providerBatchId) {\n await apiRequest(`/${providerBatchId}:cancel`, { method: 'POST' });\n },\n };\n}\n","import type {\n AnyModelConfig,\n ChatCompletionRequest,\n ChatCompletion,\n ChatCompletionChunk,\n ModelInfo,\n GenerationStats,\n BatchCreateRequest,\n BatchObject,\n BatchResults,\n} from './types.js';\nimport { ProviderRegistry } from './providers/registry.js';\nimport { Router } from './router.js';\nimport { createOpenAIAdapter } from './providers/openai.js';\nimport { createAnthropicAdapter } from './providers/anthropic.js';\nimport { createGoogleAdapter } from './providers/google.js';\nimport { createPerplexityAdapter } from './providers/perplexity.js';\nimport { createCustomAdapter } from './providers/custom.js';\nimport { resolveConfig } from './config.js';\nimport { GenerationStatsStore } from './utils/generation-stats.js';\nimport { BatchManager, type BatchPollOptions } from './batch/manager.js';\nimport { createOpenAIBatchAdapter } from './providers/openai-batch.js';\nimport { createAnthropicBatchAdapter } from './providers/anthropic-batch.js';\nimport { createGoogleBatchAdapter } from './providers/google-batch.js';\nimport { configureFsIO } from './utils/fs-io.js';\nimport { setDefaultTimeout } from './utils/fetch-with-timeout.js';\n\nexport class AnyModel {\n private registry: ProviderRegistry;\n private router: Router;\n private config: AnyModelConfig;\n private modelCache: ModelInfo[] | null = null;\n private statsStore = new GenerationStatsStore();\n private batchManager!: BatchManager;\n\n public readonly chat: {\n completions: {\n create: (request: ChatCompletionRequest) => Promise<ChatCompletion | AsyncIterable<ChatCompletionChunk>>;\n };\n };\n\n public readonly models: {\n list: (opts?: { provider?: string }) => Promise<ModelInfo[]>;\n refresh: () => Promise<ModelInfo[]>;\n };\n\n public readonly generation: {\n get: (id: string) => GenerationStats | undefined;\n list: (limit?: number) => GenerationStats[];\n };\n\n public readonly batches: {\n create: (request: BatchCreateRequest) => Promise<BatchObject>;\n createAndPoll: (request: BatchCreateRequest, options?: BatchPollOptions) => Promise<BatchResults>;\n poll: (id: string, options?: BatchPollOptions) => Promise<BatchResults>;\n get: (id: string) => Promise<BatchObject | null>;\n list: () => Promise<BatchObject[]>;\n cancel: (id: string) => Promise<BatchObject>;\n results: (id: string) => Promise<BatchResults>;\n };\n\n constructor(config: AnyModelConfig = {}) {\n this.config = resolveConfig(config);\n this.registry = new ProviderRegistry();\n\n // Configure HTTP request timeout (config is in seconds, convert to ms)\n setDefaultTimeout((this.config.defaults?.timeout ?? 120) * 1000);\n\n // Configure filesystem IO concurrency\n if (this.config.io) {\n configureFsIO(this.config.io);\n }\n\n this.registerProviders();\n\n this.router = new Router(this.registry, this.config.aliases, this.config);\n\n // Namespace: chat.completions\n this.chat = {\n completions: {\n create: async (request: ChatCompletionRequest) => {\n const merged = this.applyDefaults(request);\n\n if (merged.stream) {\n return this.router.stream(merged);\n }\n\n const startTime = Date.now();\n const response = await this.router.complete(merged);\n const endTime = Date.now();\n\n // Record generation stats\n const providerName = response.model.includes('/')\n ? response.model.split('/')[0]\n : 'unknown';\n\n this.statsStore.record({\n id: response.id,\n model: response.model,\n providerName,\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n startTime,\n endTime,\n finishReason: response.choices[0]?.finish_reason || 'stop',\n streamed: false,\n });\n\n return response;\n },\n },\n };\n\n // Namespace: models\n this.models = {\n list: async (opts?: { provider?: string }) => {\n if (!this.modelCache) {\n this.modelCache = await this.fetchModels();\n }\n if (opts?.provider) {\n return this.modelCache.filter(m => m.id.startsWith(`${opts.provider}/`));\n }\n return this.modelCache;\n },\n refresh: async () => {\n this.modelCache = null;\n return this.models.list();\n },\n };\n\n // Namespace: generation\n this.generation = {\n get: (id: string) => this.statsStore.get(id),\n list: (limit?: number) => this.statsStore.list(limit),\n };\n\n // Namespace: batches\n this.batchManager = new BatchManager(this.router, {\n dir: this.config.batch?.dir,\n concurrency: this.config.batch?.concurrencyFallback,\n pollInterval: this.config.batch?.pollInterval,\n });\n\n this.registerBatchAdapters();\n\n this.batches = {\n create: (request) => this.batchManager.create(request),\n createAndPoll: (request, options) => this.batchManager.createAndPoll(request, options),\n poll: (id, options) => this.batchManager.poll(id, options),\n get: (id) => this.batchManager.get(id),\n list: () => this.batchManager.list(),\n cancel: (id) => this.batchManager.cancel(id),\n results: (id) => this.batchManager.getResults(id),\n };\n }\n\n private registerProviders(): void {\n const config = this.config;\n\n // OpenAI — native adapter\n const openaiKey = config.openai?.apiKey || process.env.OPENAI_API_KEY;\n if (openaiKey) {\n this.registry.register('openai', createOpenAIAdapter(openaiKey));\n }\n\n // Anthropic — native adapter\n const anthropicKey = config.anthropic?.apiKey || process.env.ANTHROPIC_API_KEY;\n if (anthropicKey) {\n this.registry.register('anthropic', createAnthropicAdapter(anthropicKey));\n }\n\n // Google — native adapter\n const googleKey = config.google?.apiKey || process.env.GOOGLE_API_KEY;\n if (googleKey) {\n this.registry.register('google', createGoogleAdapter(googleKey));\n }\n\n // Perplexity — native adapter\n const perplexityKey = config.perplexity?.apiKey || process.env.PERPLEXITY_API_KEY;\n if (perplexityKey) {\n this.registry.register('perplexity', createPerplexityAdapter(perplexityKey));\n }\n\n // Built-in OpenAI-compatible providers\n const builtinProviders: Array<{\n name: string;\n baseURL: string;\n configKey: keyof typeof config;\n envVar: string;\n }> = [\n { name: 'mistral', baseURL: 'https://api.mistral.ai/v1', configKey: 'mistral', envVar: 'MISTRAL_API_KEY' },\n { name: 'groq', baseURL: 'https://api.groq.com/openai/v1', configKey: 'groq', envVar: 'GROQ_API_KEY' },\n { name: 'deepseek', baseURL: 'https://api.deepseek.com', configKey: 'deepseek', envVar: 'DEEPSEEK_API_KEY' },\n { name: 'xai', baseURL: 'https://api.x.ai/v1', configKey: 'xai', envVar: 'XAI_API_KEY' },\n { name: 'together', baseURL: 'https://api.together.xyz/v1', configKey: 'together', envVar: 'TOGETHER_API_KEY' },\n { name: 'fireworks', baseURL: 'https://api.fireworks.ai/inference/v1', configKey: 'fireworks', envVar: 'FIREWORKS_API_KEY' },\n ];\n\n for (const { name, baseURL, configKey, envVar } of builtinProviders) {\n const providerConfig = config[configKey] as { apiKey?: string } | undefined;\n const key = providerConfig?.apiKey || process.env[envVar];\n if (key) {\n this.registry.register(name, createCustomAdapter(name, { baseURL, apiKey: key }));\n }\n }\n\n // Ollama — local, no API key needed\n const ollamaConfig = config.ollama;\n const ollamaURL = ollamaConfig?.baseURL || process.env.OLLAMA_BASE_URL || 'http://localhost:11434/v1';\n if (ollamaConfig || process.env.OLLAMA_BASE_URL) {\n this.registry.register('ollama', createCustomAdapter('ollama', { baseURL: ollamaURL }));\n }\n\n // Custom providers\n if (config.custom) {\n for (const [name, customConfig] of Object.entries(config.custom)) {\n this.registry.register(name, createCustomAdapter(name, customConfig));\n }\n }\n }\n\n private registerBatchAdapters(): void {\n const config = this.config;\n\n const openaiKey = config.openai?.apiKey || process.env.OPENAI_API_KEY;\n if (openaiKey) {\n this.batchManager.registerBatchAdapter('openai', createOpenAIBatchAdapter(openaiKey));\n }\n\n const anthropicKey = config.anthropic?.apiKey || process.env.ANTHROPIC_API_KEY;\n if (anthropicKey) {\n this.batchManager.registerBatchAdapter('anthropic', createAnthropicBatchAdapter(anthropicKey));\n }\n\n const googleKey = config.google?.apiKey || process.env.GOOGLE_API_KEY;\n if (googleKey) {\n this.batchManager.registerBatchAdapter('google', createGoogleBatchAdapter(googleKey));\n }\n }\n\n private applyDefaults(request: ChatCompletionRequest): ChatCompletionRequest {\n const defaults = this.config.defaults;\n if (!defaults) return request;\n\n return {\n ...request,\n temperature: request.temperature ?? defaults.temperature,\n max_tokens: request.max_tokens ?? defaults.max_tokens,\n };\n }\n\n private async fetchModels(): Promise<ModelInfo[]> {\n const all: ModelInfo[] = [];\n for (const adapter of this.registry.all()) {\n try {\n const models = await adapter.listModels();\n all.push(...models);\n } catch {\n // Skip providers that fail model listing\n }\n }\n return all.sort((a, b) => a.id.localeCompare(b.id));\n }\n\n getRegistry(): ProviderRegistry {\n return this.registry;\n }\n}\n","#!/usr/bin/env node\n\nimport { startServer } from './server.js';\n\nconst args = process.argv.slice(2);\n\nif (args[0] === 'serve') {\n const port = getArg(args, '--port', '4141');\n const host = getArg(args, '--host', '0.0.0.0');\n\n startServer({\n port: parseInt(port, 10),\n host,\n });\n} else {\n console.log('@probeo/anymodel v0.1.0');\n console.log('');\n console.log('Usage:');\n console.log(' anymodel serve [--port 4141] [--host 0.0.0.0]');\n console.log('');\n console.log('SDK usage:');\n console.log(' import { AnyModel } from \"@probeo/anymodel\";');\n console.log(' const client = new AnyModel();');\n console.log(' const res = await client.chat.completions.create({');\n console.log(' model: \"anthropic/claude-sonnet-4-6\",');\n console.log(' messages: [{ role: \"user\", content: \"Hello\" }]');\n console.log(' });');\n}\n\nfunction getArg(args: string[], flag: string, defaultValue: string): string {\n const idx = args.indexOf(flag);\n if (idx >= 0 && idx + 1 < args.length) {\n return args[idx + 1];\n }\n return defaultValue;\n}\n"],"mappings":"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","names":["resolve","path","SUPPORTED_PARAMS","path","SUPPORTED_PARAMS","FALLBACK_MODELS","SUPPORTED_PARAMS","path","path","resolve","CHARS_PER_TOKEN","CHARS_PER_TOKEN","OPENAI_API_BASE","path","ANTHROPIC_API_BASE","ANTHROPIC_VERSION","DEFAULT_MAX_TOKENS","path","GEMINI_API_BASE","path","resolve","path","args"]}