@amux.ai/llm-bridge 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +909 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1328 -0
- package/dist/index.d.ts +1328 -0
- package/dist/index.js +886 -0
- package/dist/index.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapter/registry.ts","../src/utils/sse-parser.ts","../src/errors/index.ts","../src/bridge/http-client.ts","../src/bridge/bridge.ts","../src/bridge/factory.ts","../src/utils/error-parser.ts","../src/utils/content-helpers.ts","../src/utils/usage-parser.ts"],"names":["headers"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { LLMAdapter } from './base'\nimport type { AdapterInfo } from './capabilities'\n\n/**\n * Adapter registry for managing adapters\n */\nexport class AdapterRegistry {\n private adapters = new Map<string, LLMAdapter>()\n\n /**\n * Register an adapter\n */\n register(adapter: LLMAdapter): void {\n if (this.adapters.has(adapter.name)) {\n throw new Error(`Adapter \"${adapter.name}\" is already registered`)\n }\n this.adapters.set(adapter.name, adapter)\n }\n\n /**\n * Unregister an adapter\n */\n unregister(name: string): boolean {\n return this.adapters.delete(name)\n }\n\n /**\n * Get an adapter by name\n */\n get(name: string): LLMAdapter | undefined {\n return this.adapters.get(name)\n }\n\n /**\n * Check if an adapter is registered\n */\n has(name: string): boolean {\n return this.adapters.has(name)\n }\n\n /**\n * List all registered adapters\n */\n list(): AdapterInfo[] {\n return Array.from(this.adapters.values()).map((adapter) =>\n adapter.getInfo()\n )\n }\n\n /**\n * Clear all adapters\n */\n clear(): void {\n this.adapters.clear()\n }\n}\n\n/**\n * Global adapter registry instance\n */\nexport const globalRegistry = new AdapterRegistry()\n","/**\n * Efficient SSE (Server-Sent Events) line parser\n * Handles incomplete chunks and extracts complete lines efficiently\n */\nexport class SSELineParser {\n private buffer: string = ''\n\n /**\n * Process a chunk of SSE data and extract complete lines\n * @param chunk - The data chunk to process\n * @returns Array of complete lines\n */\n processChunk(chunk: string): string[] {\n this.buffer += chunk\n return this.extractLines()\n }\n\n /**\n * Extract all complete lines from the buffer\n * Incomplete lines remain in the buffer\n * @private\n */\n private extractLines(): string[] {\n const lines: string[] = []\n let position = 0\n\n while (position < this.buffer.length) {\n const newlineIndex = this.buffer.indexOf('\\n', position)\n\n if (newlineIndex === -1) {\n // No complete line found, keep remainder in buffer\n this.buffer = this.buffer.slice(position)\n break\n }\n\n // Extract line (excluding newline)\n const line = this.buffer.slice(position, newlineIndex)\n lines.push(line)\n position = newlineIndex + 1\n }\n\n // If we processed all lines, clear buffer\n if (position >= this.buffer.length) {\n this.buffer = ''\n }\n\n return lines\n }\n\n /**\n * Get any remaining data in the buffer and clear it\n * Call this when the stream ends to get the last incomplete line\n */\n flush(): string[] {\n if (this.buffer.length === 0) {\n return []\n }\n\n const lines = this.buffer.split('\\n').filter((line) => line.length > 0)\n this.buffer = ''\n return lines\n }\n\n /**\n * Check if buffer has any remaining data\n */\n hasRemaining(): boolean {\n return this.buffer.length > 0\n }\n\n /**\n * Clear the buffer\n */\n clear(): void {\n this.buffer = ''\n }\n}\n","/**\n * Base error class for all Amux errors\n */\nexport class LLMBridgeError extends Error {\n public code: string\n public retryable: boolean\n public details?: unknown\n\n constructor(\n message: string,\n code: string,\n retryable: boolean = false,\n details?: unknown\n ) {\n super(message)\n this.name = 'LLMBridgeError'\n this.code = code\n this.retryable = retryable\n this.details = details\n Error.captureStackTrace(this, this.constructor)\n }\n}\n\n/**\n * Error from provider API calls\n */\nexport class APIError extends LLMBridgeError {\n public status: number\n public provider: string\n public data?: unknown\n public response?: { headers?: Record<string, string> }\n\n constructor(\n message: string,\n status: number,\n provider: string,\n data?: unknown,\n response?: { headers?: Record<string, string> }\n ) {\n super(message, 'API_ERROR', status >= 500, data)\n this.name = 'APIError'\n this.status = status\n this.provider = provider\n this.data = data\n this.response = response\n }\n}\n\n/**\n * Network-related errors (connection failures, timeouts, etc.)\n */\nexport class NetworkError extends LLMBridgeError {\n public override cause?: unknown\n\n constructor(message: string, cause?: unknown) {\n super(message, 'NETWORK_ERROR', true, cause)\n this.name = 'NetworkError'\n this.cause = cause\n }\n}\n\n/**\n * Request timeout errors\n */\nexport class TimeoutError extends LLMBridgeError {\n public timeout: number\n\n constructor(message: string, timeout: number) {\n super(message, 'TIMEOUT_ERROR', true, { timeout })\n this.name = 'TimeoutError'\n this.timeout = timeout\n }\n}\n\n/**\n * Validation errors (invalid request format, missing required fields, etc.)\n */\nexport class ValidationError extends LLMBridgeError {\n public errors: string[]\n\n constructor(message: string, errors: string[]) {\n super(message, 'VALIDATION_ERROR', false, { errors })\n this.name = 'ValidationError'\n this.errors = errors\n }\n}\n\n/**\n * Adapter-related errors (conversion failures, unsupported features, etc.)\n */\nexport class AdapterError extends LLMBridgeError {\n public adapterName: string\n\n constructor(\n message: string,\n adapterName: string,\n details?: unknown\n ) {\n super(message, 'ADAPTER_ERROR', false, details)\n this.name = 'AdapterError'\n this.adapterName = adapterName\n }\n}\n\n/**\n * Bridge orchestration errors\n */\nexport class BridgeError extends LLMBridgeError {\n constructor(message: string, details?: unknown) {\n super(message, 'BRIDGE_ERROR', false, details)\n this.name = 'BridgeError'\n }\n}\n","import { APIError, NetworkError, TimeoutError } from '../errors'\n\nimport type { HTTPRequestOptions, HTTPResponse } from './types'\n\n/**\n * Simple HTTP client for making requests to LLM APIs\n */\nexport class HTTPClient {\n private defaultHeaders: Record<string, string>\n private defaultTimeout: number\n private maxRetries: number\n private provider: string\n private maxResponseSize: number\n\n constructor(options?: {\n headers?: Record<string, string>\n timeout?: number\n maxRetries?: number\n provider?: string\n maxResponseSize?: number\n }) {\n this.defaultHeaders = options?.headers ?? {}\n this.defaultTimeout = options?.timeout ?? 60000 // 60 seconds\n this.maxRetries = options?.maxRetries ?? 3\n this.provider = options?.provider ?? 'unknown'\n this.maxResponseSize = options?.maxResponseSize ?? 100 * 1024 * 1024 // 100MB default\n }\n\n /**\n * Determine if a status code should be retried\n * @private\n */\n private shouldRetry(status: number): boolean {\n // Retry on: timeout, rate limit, and server errors\n const retryableStatuses = [408, 429, 500, 502, 503, 504]\n return retryableStatuses.includes(status)\n }\n\n /**\n * Calculate backoff delay with jitter\n * @private\n */\n private getBackoffDelay(attempt: number, retryAfter?: number): number {\n // If server provides Retry-After header, use it\n if (retryAfter !== undefined && retryAfter > 0) {\n return retryAfter * 1000 // Convert to milliseconds\n }\n\n // Exponential backoff with jitter\n const baseDelay = Math.pow(2, attempt) * 1000\n const jitter = Math.random() * baseDelay * 0.1\n return baseDelay + jitter\n }\n\n /**\n * Make an HTTP request with retry logic\n */\n async request<T = unknown>(\n options: HTTPRequestOptions,\n retries: number = 0\n ): Promise<HTTPResponse<T>> {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => {\n controller.abort()\n }, options.timeout ?? this.defaultTimeout)\n\n try {\n const response = await fetch(options.url, {\n method: options.method,\n headers: {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders,\n ...options.headers,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: options.signal ?? controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n // Check response size limit\n const contentLength = response.headers.get('content-length')\n if (contentLength) {\n const size = parseInt(contentLength, 10)\n if (size > this.maxResponseSize) {\n throw new NetworkError(\n `Response size (${size} bytes) exceeds maximum allowed size (${this.maxResponseSize} bytes)`\n )\n }\n }\n\n // Check HTTP status\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n const headers = Object.fromEntries(response.headers.entries())\n throw new APIError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n this.provider,\n errorData,\n { headers }\n )\n }\n\n const data = (await response.json()) as T\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n data,\n }\n } catch (error) {\n clearTimeout(timeoutId)\n\n // Return APIError as-is\n if (error instanceof APIError) {\n // Retry on retryable status codes\n if (this.shouldRetry(error.status) && retries < this.maxRetries) {\n // Check for Retry-After header\n const retryAfter = error.response?.headers?.['retry-after']\n const retryAfterSeconds = retryAfter\n ? parseInt(retryAfter, 10)\n : undefined\n const delay = this.getBackoffDelay(retries, retryAfterSeconds)\n await new Promise((resolve) => setTimeout(resolve, delay))\n return this.request(options, retries + 1)\n }\n throw error\n }\n\n // Handle abort/timeout errors\n if (error instanceof Error && error.name === 'AbortError') {\n const timeoutError = new TimeoutError(\n 'Request timeout',\n options.timeout ?? this.defaultTimeout\n )\n // Retry on timeout\n if (retries < this.maxRetries) {\n const delay = this.getBackoffDelay(retries)\n await new Promise((resolve) => setTimeout(resolve, delay))\n return this.request(options, retries + 1)\n }\n throw timeoutError\n }\n\n // Wrap other errors as NetworkError\n const networkError = new NetworkError('Network request failed', error)\n // Retry on network errors\n if (retries < this.maxRetries) {\n const delay = this.getBackoffDelay(retries)\n await new Promise((resolve) => setTimeout(resolve, delay))\n return this.request(options, retries + 1)\n }\n throw networkError\n }\n }\n\n /**\n * Make a streaming HTTP request\n */\n async *requestStream(\n options: HTTPRequestOptions\n ): AsyncIterable<string> {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => {\n controller.abort()\n }, options.timeout ?? this.defaultTimeout)\n\n try {\n const headers = {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n ...this.defaultHeaders,\n ...options.headers,\n }\n \n const response = await fetch(options.url, {\n method: options.method,\n headers,\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: options.signal ?? controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n const headers = Object.fromEntries(response.headers.entries())\n throw new APIError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n this.provider,\n errorData,\n { headers }\n )\n }\n\n if (!response.body) {\n throw new NetworkError('Response body is null')\n }\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n\n let totalBytes = 0\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n // Check total received bytes\n totalBytes += value.length\n if (totalBytes > this.maxResponseSize) {\n throw new NetworkError(\n `Streaming response size (${totalBytes} bytes) exceeds maximum allowed size (${this.maxResponseSize} bytes)`\n )\n }\n\n const chunk = decoder.decode(value, { stream: true })\n yield chunk\n }\n } finally {\n reader.releaseLock()\n }\n } catch (error) {\n clearTimeout(timeoutId)\n\n // Return APIError as-is\n if (error instanceof APIError) {\n throw error\n }\n\n // Handle abort/timeout errors\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutError(\n 'Request timeout',\n options.timeout ?? this.defaultTimeout\n )\n }\n\n // Wrap other errors as NetworkError\n if (error instanceof NetworkError) {\n throw error\n }\n throw new NetworkError('Network request failed', error)\n }\n }\n}\n","import type { LLMAdapter } from '../adapter'\nimport type { LLMRequestIR } from '../ir/request'\nimport type { LLMResponseIR } from '../ir/response'\nimport type { LLMStreamEvent, SSEEvent } from '../ir/stream'\nimport type { Message, ContentPart } from '../types/message'\nimport { SSELineParser } from '../utils/sse-parser'\n\nimport { HTTPClient } from './http-client'\nimport type {\n BridgeConfig,\n BridgeHooks,\n BridgeOptions,\n CompatibilityReport,\n LLMBridge,\n} from './types'\n\n/**\n * Bridge implementation\n */\nexport class Bridge implements LLMBridge {\n private inboundAdapter: LLMAdapter\n private outboundAdapter: LLMAdapter\n private config: BridgeConfig\n private httpClient: HTTPClient\n\n // Lifecycle hooks\n private hooks?: BridgeHooks\n\n // Model mapping configuration\n private targetModel?: string\n private modelMapper?: (model: string) => string\n private modelMapping?: { [key: string]: string }\n\n constructor(options: BridgeOptions) {\n this.inboundAdapter = options.inbound\n this.outboundAdapter = options.outbound\n this.config = options.config\n this.hooks = options.hooks\n\n // Save model mapping configuration\n this.targetModel = options.targetModel\n this.modelMapper = options.modelMapper\n this.modelMapping = options.modelMapping\n\n // Build authentication header\n const authHeaderName = this.config.authHeaderName ?? 'Authorization'\n const authHeaderPrefix = this.config.authHeaderPrefix ?? 'Bearer'\n const authHeaderValue = authHeaderPrefix\n ? `${authHeaderPrefix} ${this.config.apiKey}`\n : this.config.apiKey\n\n // Initialize HTTP client with config\n this.httpClient = new HTTPClient({\n headers: {\n [authHeaderName]: authHeaderValue,\n ...this.config.headers,\n },\n timeout: this.config.timeout,\n maxRetries: this.config.maxRetries,\n provider: this.outboundAdapter.name,\n })\n }\n\n /**\n * Map model name from inbound to outbound\n * Priority: targetModel > modelMapper > modelMapping > original model\n */\n private mapModel(inboundModel?: string): string | undefined {\n // If no inbound model, return undefined\n if (!inboundModel) return undefined\n\n // 1. If targetModel is configured, use it directly (highest priority)\n if (this.targetModel) {\n return this.targetModel\n }\n\n // 2. If modelMapper function is configured, use it (second priority)\n if (this.modelMapper) {\n return this.modelMapper(inboundModel)\n }\n\n // 3. If modelMapping object is configured, look up the mapping (third priority)\n if (this.modelMapping && this.modelMapping[inboundModel]) {\n return this.modelMapping[inboundModel]\n }\n\n // 4. No mapping configured, return original model\n return inboundModel\n }\n\n /**\n * Validate that the IR request features are supported by outbound adapter\n * @private\n */\n private validateCapabilities(ir: LLMRequestIR): void {\n const cap = this.outboundAdapter.capabilities\n\n // Check tools capability\n if (ir.tools && ir.tools.length > 0 && !cap.tools) {\n throw new Error(\n `Outbound adapter '${this.outboundAdapter.name}' does not support tools`\n )\n }\n\n // Check vision capability (check for image content in messages)\n if (!cap.vision) {\n const hasVisionContent = ir.messages.some((msg: Message) => {\n if (typeof msg.content === 'string') return false\n return msg.content.some((part: ContentPart) => part.type === 'image')\n })\n if (hasVisionContent) {\n throw new Error(\n `Outbound adapter '${this.outboundAdapter.name}' does not support vision`\n )\n }\n }\n\n // Check reasoning capability\n if (ir.generation?.thinking && !cap.reasoning) {\n throw new Error(\n `Outbound adapter '${this.outboundAdapter.name}' does not support reasoning/thinking`\n )\n }\n }\n\n /**\n * Send a chat request\n */\n async chat(request: unknown): Promise<unknown> {\n try {\n // Step 1: Inbound adapter parses request → IR\n const ir = this.inboundAdapter.inbound.parseRequest(request)\n\n // Step 2: Map model if configured\n if (ir.model) {\n ir.model = this.mapModel(ir.model)\n }\n\n // Step 3: Trigger onRequest hook\n if (this.hooks?.onRequest) {\n await this.hooks.onRequest(ir)\n }\n\n // Step 4: Validate IR (optional)\n if (this.inboundAdapter.validateRequest) {\n const validation = this.inboundAdapter.validateRequest(ir)\n if (!validation.valid) {\n throw new Error(\n `Invalid request: ${validation.errors?.join(', ') ?? 'Unknown error'}`\n )\n }\n }\n\n // Step 4.5: Validate capabilities match\n this.validateCapabilities(ir)\n\n // Step 5: Outbound adapter builds provider request from IR\n const providerRequest = this.outboundAdapter.outbound.buildRequest(ir)\n\n // Step 6: Send HTTP request to provider API\n const baseURL = this.config.baseURL ?? this.getDefaultBaseURL()\n const endpoint = this.getEndpoint(ir.model)\n\n const response = await this.httpClient.request({\n method: 'POST',\n url: `${baseURL}${endpoint}`,\n body: providerRequest,\n })\n\n // Step 7: Outbound adapter parses response → IR\n const responseIR = this.outboundAdapter.inbound.parseResponse?.(\n response.data\n )\n\n if (!responseIR) {\n throw new Error('Outbound adapter does not support response parsing')\n }\n\n // Step 8: Trigger onResponse hook (before building final response)\n if (this.hooks?.onResponse) {\n await this.hooks.onResponse(responseIR)\n }\n\n // Step 9: Inbound adapter builds response from IR\n const finalResponse =\n this.inboundAdapter.outbound.buildResponse?.(responseIR)\n\n if (!finalResponse) {\n // If inbound adapter doesn't support response building, return IR\n return responseIR\n }\n\n return finalResponse\n } catch (error) {\n // Trigger onError hook (ensure hook errors don't mask the original error)\n if (this.hooks?.onError && error instanceof Error) {\n try {\n const errorIR = this.outboundAdapter.inbound.parseError?.(error) ?? {\n message: error.message,\n code: 'UNKNOWN_ERROR',\n type: 'unknown' as const,\n }\n await this.hooks.onError(errorIR)\n } catch (hookError) {\n // Log hook error but don't let it mask the original error\n console.warn('Error in onError hook:', hookError)\n }\n }\n throw error\n }\n }\n\n /**\n * Send a chat request (raw IR response)\n * Returns raw IR response for custom processing\n */\n async chatRaw(request: unknown): Promise<LLMResponseIR> {\n // Step 1: Inbound adapter parses request → IR\n const ir = this.inboundAdapter.inbound.parseRequest(request)\n\n // Step 2: Map model if configured\n if (ir.model) {\n ir.model = this.mapModel(ir.model)\n }\n\n // Step 3: Validate IR (optional)\n if (this.inboundAdapter.validateRequest) {\n const validation = this.inboundAdapter.validateRequest(ir)\n if (!validation.valid) {\n throw new Error(\n `Invalid request: ${validation.errors?.join(', ') ?? 'Unknown error'}`\n )\n }\n }\n\n // Step 4: Outbound adapter builds provider request from IR\n const providerRequest = this.outboundAdapter.outbound.buildRequest(ir)\n\n // Step 5: Send HTTP request to provider API\n const baseURL = this.config.baseURL ?? this.getDefaultBaseURL()\n const endpoint = this.getEndpoint(ir.model)\n\n const response = await this.httpClient.request({\n method: 'POST',\n url: `${baseURL}${endpoint}`,\n body: providerRequest,\n })\n\n // Step 6: Outbound adapter parses response → IR\n const responseIR = this.outboundAdapter.inbound.parseResponse?.(\n response.data\n )\n\n if (!responseIR) {\n throw new Error('Outbound adapter does not support response parsing')\n }\n\n return responseIR\n }\n\n /**\n * Send a streaming chat request\n * Returns SSE events in inbound adapter's format\n */\n async *chatStream(request: unknown): AsyncIterable<SSEEvent> {\n // Get stream builder from inbound adapter\n const streamBuilder = this.inboundAdapter.outbound.createStreamBuilder?.()\n\n if (!streamBuilder) {\n // Fallback: wrap raw events in simple SSE format\n for await (const event of this.chatStreamRaw(request)) {\n yield { event: 'data', data: event }\n }\n return\n }\n\n // Process raw events through the stream builder\n for await (const event of this.chatStreamRaw(request)) {\n const sseEvents = streamBuilder.process(event)\n for (const sse of sseEvents) {\n yield sse\n }\n }\n\n // Emit any final events (filter out protocol-level markers like [DONE])\n if (streamBuilder.finalize) {\n const finalEvents = streamBuilder.finalize()\n for (const sse of finalEvents) {\n // Skip protocol-level markers that are not valid JSON data\n // These should be handled by the user's HTTP layer\n if (sse.data === '[DONE]') {\n continue\n }\n yield sse\n }\n }\n }\n\n /**\n * Send a streaming chat request (raw IR events)\n * Returns raw IR stream events for custom processing\n */\n async *chatStreamRaw(request: unknown): AsyncIterable<LLMStreamEvent> {\n try {\n // Step 1: Inbound adapter parses request → IR\n const ir = this.inboundAdapter.inbound.parseRequest(request)\n\n // Step 2: Map model if configured\n if (ir.model) {\n ir.model = this.mapModel(ir.model)\n }\n\n // Ensure streaming is enabled\n ir.stream = true\n\n // Step 3: Trigger onRequest hook\n if (this.hooks?.onRequest) {\n await this.hooks.onRequest(ir)\n }\n\n // Step 3.5: Validate streaming capability\n if (!this.outboundAdapter.capabilities.streaming) {\n throw new Error(\n `Outbound adapter '${this.outboundAdapter.name}' does not support streaming`\n )\n }\n\n // Step 3.6: Validate capabilities match\n this.validateCapabilities(ir)\n\n // Step 4: Outbound adapter builds provider request from IR\n const providerRequest = this.outboundAdapter.outbound.buildRequest(ir)\n\n // Step 5: Send streaming HTTP request\n const baseURL = this.config.baseURL ?? this.getDefaultBaseURL()\n const endpoint = this.getEndpoint(ir.model)\n\n const streamHandler = this.outboundAdapter.inbound.parseStream\n if (!streamHandler) {\n throw new Error('Outbound adapter does not support streaming')\n }\n\n // SSE line parser for efficient line extraction\n const sseParser = new SSELineParser()\n\n // Step 6: Process stream chunks\n for await (const chunk of this.httpClient.requestStream({\n method: 'POST',\n url: `${baseURL}${endpoint}`,\n body: providerRequest,\n })) {\n // Extract complete lines from chunk\n const lines = sseParser.processChunk(chunk)\n\n // Process complete lines\n for await (const event of this.processSSELines(lines, streamHandler)) {\n yield event\n }\n }\n\n // Process any remaining buffered data\n if (sseParser.hasRemaining()) {\n const lines = sseParser.flush()\n for await (const event of this.processSSELines(lines, streamHandler)) {\n yield event\n }\n }\n } catch (error) {\n // Trigger onError hook (ensure hook errors don't mask the original error)\n if (this.hooks?.onError && error instanceof Error) {\n try {\n const errorIR = this.outboundAdapter.inbound.parseError?.(error) ?? {\n message: error.message,\n code: 'UNKNOWN_ERROR',\n type: 'unknown' as const,\n }\n await this.hooks.onError(errorIR)\n } catch (hookError) {\n // Log hook error but don't let it mask the original error\n console.warn('Error in onError hook:', hookError)\n }\n }\n throw error\n }\n }\n\n /**\n * Process SSE lines and yield stream events\n * @private\n */\n private async *processSSELines(\n lines: string[],\n streamHandler: (chunk: unknown) => LLMStreamEvent | LLMStreamEvent[] | null\n ): AsyncIterable<LLMStreamEvent> {\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6).trim()\n if (data === '[DONE]') continue\n\n try {\n const parsed = JSON.parse(data) as unknown\n const events = streamHandler(parsed)\n\n if (events) {\n const eventArray = Array.isArray(events) ? events : [events]\n for (const event of eventArray) {\n // Trigger onStreamEvent hook\n if (this.hooks?.onStreamEvent) {\n await this.hooks.onStreamEvent(event)\n }\n yield event\n }\n }\n } catch {\n // Skip invalid JSON\n continue\n }\n }\n }\n }\n\n /**\n * List available models from the provider\n */\n async listModels(): Promise<unknown> {\n const baseURL = this.config.baseURL ?? this.getDefaultBaseURL()\n const modelsPath = this.getModelsPath()\n\n const response = await this.httpClient.request({\n method: 'GET',\n url: `${baseURL}${modelsPath}`,\n })\n\n return response.data\n }\n\n /**\n * Check compatibility between adapters\n */\n checkCompatibility(): CompatibilityReport {\n const issues: string[] = []\n const warnings: string[] = []\n\n const inCap = this.inboundAdapter.capabilities\n const outCap = this.outboundAdapter.capabilities\n\n // Check critical capabilities\n if (inCap.tools && !outCap.tools) {\n issues.push(\n 'Inbound adapter supports tools but outbound adapter does not'\n )\n }\n\n if (inCap.vision && !outCap.vision) {\n warnings.push(\n 'Inbound adapter supports vision but outbound adapter does not'\n )\n }\n\n if (inCap.streaming && !outCap.streaming) {\n warnings.push(\n 'Inbound adapter supports streaming but outbound adapter does not'\n )\n }\n\n // Check reasoning capability\n if (inCap.reasoning && !outCap.reasoning) {\n warnings.push(\n 'Inbound adapter supports reasoning but outbound adapter does not - reasoning content may be lost'\n )\n }\n\n return {\n compatible: issues.length === 0,\n issues: issues.length > 0 ? issues : undefined,\n warnings: warnings.length > 0 ? warnings : undefined,\n }\n }\n\n /**\n * Get adapter information\n */\n getAdapters() {\n return {\n inbound: {\n name: this.inboundAdapter.name,\n version: this.inboundAdapter.version,\n },\n outbound: {\n name: this.outboundAdapter.name,\n version: this.outboundAdapter.version,\n },\n }\n }\n\n /**\n * Get default base URL from outbound adapter\n * Note: config.baseURL is checked before calling this method\n */\n private getDefaultBaseURL(): string {\n const endpoint = this.outboundAdapter.getInfo().endpoint\n return endpoint?.baseUrl ?? ''\n }\n\n /**\n * Get chat endpoint path\n * Supports dynamic model replacement for endpoints like /v1beta/models/{model}:generateContent\n * Priority: config.chatPath > adapter.endpoint.chatPath\n */\n private getEndpoint(model?: string): string {\n const endpoint = this.outboundAdapter.getInfo().endpoint\n \n // Priority 1: Use config.chatPath if provided\n // Priority 2: Use adapter's default chatPath\n let chatPath = (this.config as any).chatPath ?? endpoint?.chatPath\n \n if (!chatPath) {\n throw new Error(\n `No chatPath configured. Either provide chatPath in config or ensure adapter '${this.outboundAdapter.name}' defines endpoint.chatPath`\n )\n }\n \n // Replace {model} placeholder if present and model is provided\n if (model && chatPath.includes('{model}')) {\n chatPath = chatPath.replace('{model}', model)\n }\n \n return chatPath\n }\n\n /**\n * Get models endpoint path\n * Priority: config.modelsPath > adapter.endpoint.modelsPath\n */\n private getModelsPath(): string {\n const endpoint = this.outboundAdapter.getInfo().endpoint\n \n // Priority 1: Use config.modelsPath if provided\n // Priority 2: Use adapter's default modelsPath\n const modelsPath = (this.config as any).modelsPath ?? endpoint?.modelsPath\n \n if (!modelsPath) {\n throw new Error(\n `No modelsPath configured. Either provide modelsPath in config or ensure adapter '${this.outboundAdapter.name}' defines endpoint.modelsPath`\n )\n }\n \n return modelsPath\n }\n}\n","import { Bridge } from './bridge'\nimport type { BridgeOptions, LLMBridge } from './types'\n\n/**\n * Create a new Amux Bridge instance\n *\n * @example\n * ```typescript\n * import { createBridge } from '@amux.ai/llm-bridge'\n * import { openaiAdapter } from '@amux.ai/adapter-openai'\n * import { anthropicAdapter } from '@amux.ai/adapter-anthropic'\n *\n * const bridge = createBridge({\n * inbound: openaiAdapter,\n * outbound: anthropicAdapter,\n * config: {\n * apiKey: process.env.ANTHROPIC_API_KEY,\n * }\n * })\n *\n * const response = await bridge.chat({\n * model: 'gpt-4',\n * messages: [{ role: 'user', content: 'Hello!' }]\n * })\n * ```\n */\nexport function createBridge(options: BridgeOptions): LLMBridge {\n return new Bridge(options)\n}\n","import type { LLMErrorIR, ErrorType } from '../ir/error'\nimport type { FinishReason } from '../ir/response'\n\n/**\n * Standard error type mappings used by OpenAI-compatible APIs\n */\nconst STANDARD_ERROR_TYPE_MAP: Record<string, ErrorType> = {\n invalid_request_error: 'validation',\n authentication_error: 'authentication',\n permission_error: 'permission',\n not_found_error: 'not_found',\n rate_limit_error: 'rate_limit',\n api_error: 'api',\n server_error: 'server',\n insufficient_quota: 'rate_limit', // Common in some providers\n invalid_api_key: 'authentication', // Zhipu-specific\n}\n\n/**\n * Standard error code mappings (used by some providers like Qwen)\n */\nconst STANDARD_ERROR_CODE_MAP: Record<string, ErrorType> = {\n InvalidParameter: 'validation',\n InvalidApiKey: 'authentication',\n AccessDenied: 'permission',\n ModelNotFound: 'not_found',\n Throttling: 'rate_limit',\n InternalError: 'server',\n}\n\n/**\n * Standard finish reason mappings used by OpenAI-compatible APIs\n */\nconst STANDARD_FINISH_REASON_MAP: Record<string, FinishReason> = {\n stop: 'stop',\n length: 'length',\n tool_calls: 'tool_calls',\n content_filter: 'content_filter',\n function_call: 'tool_calls', // Legacy OpenAI\n insufficient_system_resource: 'error', // DeepSeek-specific\n sensitive: 'content_filter', // Zhipu-specific\n}\n\n/**\n * Map finish reason string to IR finish reason\n * @param reason - The finish reason string from the provider\n * @param customMappings - Optional custom mappings to extend/override standard mappings\n * @param defaultReason - Default reason if not found (default: 'stop')\n */\nexport function mapFinishReason(\n reason?: string,\n customMappings?: Record<string, FinishReason>,\n defaultReason: FinishReason = 'stop'\n): FinishReason {\n if (!reason) return defaultReason\n\n const reasonMap = customMappings\n ? { ...STANDARD_FINISH_REASON_MAP, ...customMappings }\n : STANDARD_FINISH_REASON_MAP\n\n return reasonMap[reason] ?? defaultReason\n}\n\n/**\n * Map error type or code string to IR error type\n * @param type - The error type string from the provider\n * @param code - The error code string from the provider (optional)\n * @param customTypeMappings - Optional custom type mappings to extend/override standard mappings\n * @param customCodeMappings - Optional custom code mappings to extend/override standard mappings\n */\nexport function mapErrorType(\n type?: string,\n code?: string,\n customTypeMappings?: Record<string, ErrorType>,\n customCodeMappings?: Record<string, ErrorType>\n): ErrorType {\n // Try code first (more specific)\n if (code) {\n const codeMap = customCodeMappings\n ? { ...STANDARD_ERROR_CODE_MAP, ...customCodeMappings }\n : STANDARD_ERROR_CODE_MAP\n\n if (codeMap[code]) return codeMap[code]\n }\n\n // Fall back to type\n if (type) {\n const typeMap = customTypeMappings\n ? { ...STANDARD_ERROR_TYPE_MAP, ...customTypeMappings }\n : STANDARD_ERROR_TYPE_MAP\n\n return typeMap[type] ?? 'unknown'\n }\n\n return 'unknown'\n}\n\n/**\n * Parse OpenAI-compatible error response to IR\n * Works for OpenAI, DeepSeek, Moonshot, Qwen, Zhipu, and other compatible APIs\n *\n * @param error - The error object from the provider\n * @param customTypeMappings - Optional custom error type mappings\n * @param customCodeMappings - Optional custom error code mappings\n */\nexport function parseOpenAICompatibleError(\n error: unknown,\n customTypeMappings?: Record<string, ErrorType>,\n customCodeMappings?: Record<string, ErrorType>\n): LLMErrorIR {\n // Check for standard OpenAI error format: { error: { message, type, code } }\n if (error && typeof error === 'object' && 'error' in error) {\n const err = (error as { error: { message: string; type?: string; code?: string } })\n .error\n\n return {\n type: mapErrorType(err.type, err.code, customTypeMappings, customCodeMappings),\n message: err.message,\n code: err.code,\n raw: error,\n }\n }\n\n // Fallback for non-standard error format\n return {\n type: 'unknown',\n message: String(error),\n raw: error,\n }\n}\n","import type { MessageContent } from '../types/message'\n\n/**\n * Convert message content to string\n * Used by response builders to convert IR content to provider format\n *\n * @param content - Message content (string or ContentPart array)\n * @returns String content or null if empty\n */\nexport function contentToString(content: MessageContent): string | null {\n if (typeof content === 'string') {\n return content || null\n }\n\n if (!content || content.length === 0) {\n return null\n }\n\n // Concatenate text parts only\n return content\n .filter((part) => part.type === 'text')\n .map((part) => (part.type === 'text' ? part.text : ''))\n .join('') || null\n}\n\n/**\n * Check if content contains only text\n * @param content - Message content\n * @returns True if content is string or contains only text parts\n */\nexport function isTextOnlyContent(content: MessageContent): boolean {\n if (typeof content === 'string') {\n return true\n }\n\n return content.every((part) => part.type === 'text')\n}\n\n/**\n * Extract text from content\n * @param content - Message content\n * @returns Array of text strings\n */\nexport function extractTextFromContent(content: MessageContent): string[] {\n if (typeof content === 'string') {\n return [content]\n }\n\n return content\n .filter((part) => part.type === 'text')\n .map((part) => (part.type === 'text' ? part.text : ''))\n}\n\n/**\n * Check if content has images\n * @param content - Message content\n * @returns True if content contains image parts\n */\nexport function hasImageContent(content: MessageContent): boolean {\n if (typeof content === 'string') {\n return false\n }\n\n return content.some((part) => part.type === 'image')\n}\n","import type { Usage } from '../ir/response'\n\n/**\n * Standard OpenAI-compatible usage object structure\n */\nexport interface StandardUsage {\n prompt_tokens: number\n completion_tokens: number\n total_tokens: number\n completion_tokens_details?: {\n reasoning_tokens?: number\n }\n prompt_cache_hit_tokens?: number // DeepSeek\n prompt_cache_miss_tokens?: number // DeepSeek\n}\n\n/**\n * Parse OpenAI-compatible usage to IR usage\n * @param usage - Usage object from provider response\n * @returns IR usage object or undefined\n */\nexport function parseOpenAIUsage(usage?: StandardUsage): Usage | undefined {\n if (!usage) return undefined\n\n return {\n promptTokens: usage.prompt_tokens,\n completionTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n details:\n usage.completion_tokens_details?.reasoning_tokens ||\n usage.prompt_cache_hit_tokens\n ? {\n reasoningTokens: usage.completion_tokens_details?.reasoning_tokens,\n cachedTokens: usage.prompt_cache_hit_tokens,\n }\n : undefined,\n }\n}\n\n/**\n * Build OpenAI-compatible usage from IR usage\n * @param usage - IR usage object\n * @param includeReasoningTokens - Whether to include reasoning tokens (default: true)\n * @param includeCacheTokens - Whether to include cache tokens (default: false)\n * @returns OpenAI-compatible usage object or undefined\n */\nexport function buildOpenAIUsage(\n usage?: Usage,\n includeReasoningTokens: boolean = true,\n includeCacheTokens: boolean = false\n): StandardUsage | undefined {\n if (!usage) return undefined\n\n const result: StandardUsage = {\n prompt_tokens: usage.promptTokens,\n completion_tokens: usage.completionTokens,\n total_tokens: usage.totalTokens,\n }\n\n // Add reasoning tokens if requested and available\n if (includeReasoningTokens && usage.details?.reasoningTokens) {\n result.completion_tokens_details = {\n reasoning_tokens: usage.details.reasoningTokens,\n }\n }\n\n // Add cache tokens if requested and available (DeepSeek-specific)\n if (includeCacheTokens && usage.details?.cachedTokens) {\n result.prompt_cache_hit_tokens = usage.details.cachedTokens\n }\n\n return result\n}\n"]}
|