UNPKG

@catgirls/openrouter

Version:

Nyaa~! A TypeScript client for OpenRouter that's both kawaii and powerful! 😻

1 lines • 197 kB
{"version":3,"sources":["../src/lib/utils.ts","../src/lib/agent.ts","../src/lib/error-adapter.ts","../src/lib/http-client.ts","../src/lib/stream-handler.ts","../src/lib/client.ts","../src/models.ts"],"names":["normalizeMarker","marker","Agent","EventEmitter","client","options","defaultMarkers","markers","messages","lastMessage","finalAnswerMarker","thinkingMarker","actionMarker","observationMarker","query","iterations","finalAnswer","assistantMessage","regex","match","toolCall","name","args","parsedArgs","tool","t","result","error","safeArgs","string","eventEmitter","isDone","forceExtraIteration","processedToolCallIds","processIteration","hasFinalAnswer","stream","accumulatedContent","currentToolCalls","lastMarkerType","markerContent","content","type","normalizedMarker","open","close","markerIndex","markerStartIndex","markerEndIndex","toolCalls","id","hasToolMessages","msg","OpenRouterErrorAdapter","status","data","code","message","metadata","baseMessage","HttpClient","baseURL","headers","axios","url","config","StreamHandler","buffer","chunk","lines","line","parsed","choice","role","tool_calls","OpenRouterClient","apiKey","defaultConfig","httpClient","streamHandler","response","generationId","toolCallingModels"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Normalizes a marker to ensure it has open and close properties\n * @param marker String marker or object with open/close properties\n * @returns Object with open and close properties\n */\nexport const normalizeMarker = (\n marker: string | { open: string; close: string } | undefined,\n): { open: string; close: string } | null => {\n if (!marker) return null;\n\n if (typeof marker === \"string\") {\n return { open: marker, close: marker };\n }\n\n return marker;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any -- Allow any type for tool calls */\nimport { EventEmitter } from \"events\";\nimport { OpenRouterClient } from \"./client\";\nimport { AgentMarkers, AgentOptions, Message } from \"../types\";\nimport { RouterModel } from \"../models\";\nimport { normalizeMarker } from \"./utils\";\n\n/**\n * Agent class for performing chain-of-thought reasoning with LLMs\n */\nexport class Agent extends EventEmitter {\n private client: OpenRouterClient;\n private options: Required<AgentOptions>;\n private messages: Message[] = [];\n private normalizedMarkers: {\n thinking: { open: string; close: string } | null;\n action: { open: string; close: string } | null;\n observation: { open: string; close: string } | null;\n finalAnswer: { open: string; close: string } | null;\n };\n\n constructor(client: OpenRouterClient, options: AgentOptions = {}) {\n super();\n this.client = client;\n\n // Default markers for UI rendering\n const defaultMarkers: AgentMarkers = {\n thinking: \"<thinking>\",\n action: \"<action>\",\n observation: \"<observation>\",\n finalAnswer: \"<answer>\",\n };\n\n const markers = options.markers ?? defaultMarkers;\n\n // Normalize markers for easier handling\n this.normalizedMarkers = {\n thinking: normalizeMarker(markers.thinking),\n action: normalizeMarker(markers.action),\n observation: normalizeMarker(markers.observation),\n finalAnswer: normalizeMarker(markers.finalAnswer),\n };\n\n this.options = {\n maxIterations: options.maxIterations ?? 5,\n model: options.model ?? (\"anthropic/claude-3.7-sonnet\" as RouterModel),\n prependDefaultPrompt: options.prependDefaultPrompt ?? false,\n systemPrompt: options.prependDefaultPrompt\n ? this.getDefaultSystemPrompt(markers) + \"\\n\\n\" + options.systemPrompt\n : (options.systemPrompt ?? this.getDefaultSystemPrompt(markers)),\n tools: options.tools ?? [],\n verbose: options.verbose ?? false,\n markers: markers,\n stopCondition:\n options.stopCondition ?? this.defaultStopCondition.bind(this),\n };\n\n // Initialize with system message\n this.messages.push({\n role: \"system\",\n content: this.options.systemPrompt,\n });\n }\n\n /**\n * Default stop condition - checks if the message contains the final answer marker\n */\n private defaultStopCondition(messages: Message[]): boolean {\n const lastMessage = messages[messages.length - 1];\n const finalAnswerMarker = this.normalizedMarkers.finalAnswer;\n\n if (!finalAnswerMarker) return false;\n\n return (\n lastMessage.role === \"assistant\" &&\n typeof lastMessage.content === \"string\" &&\n lastMessage.content.includes(finalAnswerMarker.open)\n );\n }\n\n /**\n * Gets the default system prompt with markers\n */\n private getDefaultSystemPrompt(markers: AgentMarkers): string {\n const thinkingMarker = normalizeMarker(markers.thinking);\n const actionMarker = normalizeMarker(markers.action);\n const observationMarker = normalizeMarker(markers.observation);\n const finalAnswerMarker = normalizeMarker(markers.finalAnswer);\n\n return `You are a helpful assistant that solves tasks step by step.\n\n${\n thinkingMarker\n ? `When you're analyzing a problem or thinking about it, wrap your thoughts in ${thinkingMarker.open} and ${thinkingMarker.close} tags.\nExample: ${thinkingMarker.open}I need to break this problem into parts: first calculate X, then Y${thinkingMarker.close}`\n : \"\"\n}\n\n${\n actionMarker\n ? `When you decide to use a tool, wrap your reasoning in ${actionMarker.open} and ${actionMarker.close} tags.\nExample: ${actionMarker.open}I'll search for information about climate change${actionMarker.close}`\n : \"\"\n}\n\n${\n observationMarker\n ? `After getting information, wrap your observations in ${observationMarker.open} and ${observationMarker.close} tags.\nExample: ${observationMarker.open}The search revealed that global temperatures have risen by 1.1°C${observationMarker.close}`\n : \"\"\n}\n\n${\n finalAnswerMarker\n ? `When you have a final answer, wrap it in ${finalAnswerMarker.open} and ${finalAnswerMarker.close} tags.\nExample: ${finalAnswerMarker.open}Based on my analysis, the answer is 42${finalAnswerMarker.close}`\n : \"\"\n}\n\nUse ONLY these markers for structuring your responses. Only use ${finalAnswerMarker?.open} when you're completely done with the task.`;\n }\n\n /**\n * Run the agent on a query (non-streaming)\n */\n async run(query: string): Promise<string> {\n // Add the user query\n this.messages.push({ role: \"user\", content: query });\n\n let iterations = 0;\n let finalAnswer: string | null = null;\n\n while (iterations < this.options.maxIterations && finalAnswer === null) {\n iterations++;\n\n if (this.options.verbose) {\n this.emit(\"iteration\", {\n iteration: iterations,\n messages: this.messages,\n });\n }\n\n // Think: Ask the LLM\n const response = await this.client.chatCompletion({\n messages: this.messages,\n model: this.options.model,\n tools: this.formatTools(),\n });\n\n // Get the assistant's response\n const assistantMessage = response.choices[0].message as Message & {\n tool_calls?: any[];\n };\n this.messages.push(assistantMessage as Message);\n\n // Emit the response\n this.emit(\"response\", assistantMessage);\n\n // Check if the stop condition is met\n if (this.options.stopCondition(this.messages)) {\n const lastMessage = this.messages[this.messages.length - 1];\n if (typeof lastMessage.content === \"string\") {\n // Extract the final answer from within the markers\n const finalAnswerMarker = this.normalizedMarkers.finalAnswer;\n\n if (finalAnswerMarker) {\n const regex = new RegExp(\n `${this.escapeRegExp(finalAnswerMarker.open)}(.*?)${this.escapeRegExp(finalAnswerMarker.close)}`,\n \"s\",\n );\n const match = lastMessage.content.match(regex);\n\n finalAnswer = match ? match[1].trim() : lastMessage.content;\n this.emit(\"final_answer\", finalAnswer);\n } else {\n finalAnswer = lastMessage.content;\n }\n } else {\n finalAnswer = \"RECEIVED_NON_STRING_FINAL_ANSWER\";\n }\n\n break;\n }\n\n // Check if there are tool calls\n if (\n assistantMessage.tool_calls &&\n assistantMessage.tool_calls.length > 0\n ) {\n for (const toolCall of assistantMessage.tool_calls) {\n if (toolCall.type === \"function\") {\n const { name, arguments: args } = toolCall.function;\n const parsedArgs = args && args.trim() ? JSON.parse(args) : {};\n\n // Find the tool\n const tool = this.options.tools.find((t) => t.name === name);\n\n if (tool) {\n try {\n // Emit tool call event\n this.emit(\"tool_call\", { name, args: parsedArgs });\n\n // Act: Execute the tool\n const result = await tool.execute(parsedArgs);\n\n // Observe: Add the result back to messages\n this.messages.push({\n role: \"tool\",\n tool_call_id: toolCall.id,\n content: JSON.stringify(result),\n });\n\n this.emit(\"tool_result\", {\n tool: name,\n args: parsedArgs,\n result,\n });\n } catch (error) {\n // Handle tool execution error\n this.messages.push({\n role: \"tool\",\n tool_call_id: toolCall.id,\n content: JSON.stringify({ error: String(error) }),\n });\n\n // Safely parse args or use empty object if parsing fails\n let safeArgs = {};\n try {\n if (args && args.trim()) {\n safeArgs = JSON.parse(args);\n }\n } catch {\n // If JSON parsing fails, keep empty object\n }\n\n this.emit(\"tool_error\", {\n tool: name,\n args: safeArgs,\n error,\n });\n }\n }\n }\n }\n }\n }\n\n if (finalAnswer === null) {\n finalAnswer = \"MAX_ITERATIONS_REACHED_WITHOUT_FINAL_ANSWER\";\n }\n\n // Check if the last message was from a tool and no final answer was given\n const lastMessage = this.messages[this.messages.length - 1];\n const isLastMessageTool = lastMessage?.role === \"tool\";\n\n if (\n isLastMessageTool &&\n finalAnswer === \"MAX_ITERATIONS_REACHED_WITHOUT_FINAL_ANSWER\"\n ) {\n finalAnswer = \"ANSWER_AFTER_TOOL_NOT_GIVEN\";\n }\n\n this.emit(\"complete\");\n return finalAnswer;\n }\n\n /**\n * Helper method to escape special regex characters\n */\n private escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n\n /**\n * Run the agent on a query with streaming support\n */\n async runStream(query: string): Promise<EventEmitter> {\n const eventEmitter = new EventEmitter();\n\n // Add the user query\n this.messages.push({ role: \"user\", content: query });\n\n let iterations = 0;\n let isDone = false;\n let forceExtraIteration = false;\n // Track processed tool calls to avoid duplicates\n const processedToolCallIds = new Set<string>();\n\n const processIteration = async () => {\n if (iterations >= this.options.maxIterations || isDone) {\n if (iterations >= this.options.maxIterations && !isDone) {\n // We reached max iterations without a final answer\n const finalAnswerMarker = this.normalizedMarkers.finalAnswer;\n let hasFinalAnswer = false;\n\n // Check if we have already emitted a final answer\n if (\n finalAnswerMarker &&\n this.messages.length > 0 &&\n typeof this.messages[this.messages.length - 1].content === \"string\"\n ) {\n const lastContent = this.messages[this.messages.length - 1]\n .content as string;\n hasFinalAnswer = lastContent.includes(finalAnswerMarker.open);\n }\n\n if (!hasFinalAnswer) {\n eventEmitter.emit(\n \"final_answer\",\n \"MAX_ITERATIONS_REACHED_WITHOUT_FINAL_ANSWER\",\n );\n }\n }\n\n eventEmitter.emit(\"complete\");\n return;\n }\n\n iterations++;\n\n if (this.options.verbose) {\n eventEmitter.emit(\"iteration\", {\n iteration: iterations,\n messages: this.messages,\n });\n }\n\n try {\n // Think: Ask the LLM with streaming enabled\n const stream = await this.client.chatCompletion({\n messages: this.messages,\n model: this.options.model,\n tools: this.formatTools(),\n stream: true,\n });\n\n let accumulatedContent = \"\";\n let currentToolCalls: any[] = [];\n let lastMarkerType: string | null = null;\n let markerContent = \"\";\n\n // Handle streaming tokens\n stream.on(\"content\", (content: string) => {\n accumulatedContent += content;\n eventEmitter.emit(\"token\", content);\n\n // Look for markers in the accumulated content\n for (const [type, normalizedMarker] of Object.entries(\n this.normalizedMarkers,\n )) {\n if (!normalizedMarker) continue;\n const { open, close } = normalizedMarker;\n\n // Check for opening marker\n if (accumulatedContent.includes(open) && !lastMarkerType) {\n const markerIndex = accumulatedContent.lastIndexOf(open);\n if (\n markerIndex !== -1 &&\n markerIndex + open.length <= accumulatedContent.length\n ) {\n lastMarkerType = type;\n markerContent = \"\";\n\n // Emit marker start event\n eventEmitter.emit(\"marker\", {\n type,\n content: \"\",\n });\n }\n }\n\n // Check for closing marker (only if we're in a marker section)\n if (lastMarkerType === type && accumulatedContent.includes(close)) {\n const markerStartIndex = accumulatedContent.indexOf(open);\n const markerEndIndex = accumulatedContent.lastIndexOf(close);\n\n // If we have both opening and closing markers\n if (\n markerStartIndex !== -1 &&\n markerEndIndex > markerStartIndex\n ) {\n // Extract the content between markers\n markerContent = accumulatedContent.substring(\n markerStartIndex + open.length,\n markerEndIndex,\n );\n\n // Emit the complete marker content\n eventEmitter.emit(\"marker\", {\n type,\n content: markerContent,\n });\n\n lastMarkerType = null;\n markerContent = \"\";\n }\n }\n }\n });\n\n // Handle tool calls from streaming\n stream.on(\"tool_calls\", (toolCalls: any) => {\n currentToolCalls = currentToolCalls.concat(toolCalls);\n // Emit the stream_tool_calls event for UI updates\n eventEmitter.emit(\"stream_tool_calls\", toolCalls);\n });\n\n // Handle errors during streaming\n stream.on(\"error\", (error: Error) => {\n eventEmitter.emit(\"error\", error);\n\n // Emit a synthetic final answer when an error occurs\n if (!isDone) {\n const finalAnswerMarker = this.normalizedMarkers.finalAnswer;\n let hasFinalAnswer = false;\n\n // Check if we have already emitted a final answer\n if (\n finalAnswerMarker &&\n this.messages.length > 0 &&\n typeof this.messages[this.messages.length - 1].content ===\n \"string\"\n ) {\n const lastContent = this.messages[this.messages.length - 1]\n .content as string;\n hasFinalAnswer = lastContent.includes(finalAnswerMarker.open);\n }\n\n if (!hasFinalAnswer) {\n eventEmitter.emit(\n \"final_answer\",\n \"Encountered an error while processing the request.\",\n );\n }\n\n eventEmitter.emit(\"complete\");\n }\n\n isDone = true;\n });\n\n // When streaming is complete\n stream.on(\"done\", async () => {\n // Create the assistant message\n const assistantMessage: Message = {\n role: \"assistant\",\n content: accumulatedContent,\n };\n\n // If we have tool calls, add them to the message\n if (currentToolCalls.length > 0) {\n (assistantMessage as any).tool_calls = currentToolCalls;\n }\n\n this.messages.push(assistantMessage);\n eventEmitter.emit(\"response\", assistantMessage);\n\n // Check if the stop condition is met\n if (this.options.stopCondition(this.messages)) {\n isDone = true;\n\n // Extract final answer if present\n const finalAnswerMarker = this.normalizedMarkers.finalAnswer;\n if (\n finalAnswerMarker &&\n typeof assistantMessage.content === \"string\"\n ) {\n const regex = new RegExp(\n `${this.escapeRegExp(finalAnswerMarker.open)}(.*?)${this.escapeRegExp(finalAnswerMarker.close)}`,\n \"s\",\n );\n const match = assistantMessage.content.match(regex);\n\n const finalAnswer = match\n ? match[1].trim()\n : assistantMessage.content;\n eventEmitter.emit(\"final_answer\", finalAnswer);\n }\n\n eventEmitter.emit(\"complete\");\n return;\n }\n\n // Process tool calls if any\n if (currentToolCalls.length > 0) {\n for (const toolCall of currentToolCalls) {\n if (toolCall.type === \"function\") {\n const {\n id,\n function: { name, arguments: args },\n } = toolCall;\n\n // Skip if we've already processed this tool call\n if (processedToolCallIds.has(id)) continue;\n processedToolCallIds.add(id);\n\n try {\n const parsedArgs =\n args && args.trim() ? JSON.parse(args) : {};\n\n // Find the tool\n const tool = this.options.tools.find((t) => t.name === name);\n\n if (tool) {\n // Emit tool_call event for each executed tool\n eventEmitter.emit(\"tool_call\", { name, args: parsedArgs });\n\n // Act: Execute the tool\n const result = await tool.execute(parsedArgs);\n\n // Observe: Add the result back to messages\n this.messages.push({\n role: \"tool\",\n tool_call_id: id,\n content: JSON.stringify(result),\n });\n\n eventEmitter.emit(\"tool_result\", {\n tool: name,\n args: parsedArgs,\n result,\n });\n }\n } catch (error) {\n // Handle tool execution error\n this.messages.push({\n role: \"tool\",\n tool_call_id: id,\n content: JSON.stringify({ error: String(error) }),\n });\n\n // Safely parse args or use empty object if parsing fails\n let safeArgs = {};\n try {\n if (args && args.trim()) {\n safeArgs = JSON.parse(args);\n }\n } catch {\n // If JSON parsing fails, keep empty object\n }\n\n eventEmitter.emit(\"tool_error\", {\n tool: name,\n args: safeArgs,\n error,\n });\n\n // Set the force extra iteration flag to ensure one more pass\n // even when a tool errors out\n forceExtraIteration = true;\n }\n }\n }\n\n // Reset for next iteration\n currentToolCalls = [];\n\n forceExtraIteration = true; // Always do one more iteration after tool calls\n // Continue with next iteration\n setTimeout(processIteration, 0);\n } else {\n // No tool calls, check if we need to continue\n if (!isDone && forceExtraIteration) {\n forceExtraIteration = false;\n setTimeout(processIteration, 0);\n } else if (!isDone) {\n // Before we complete, check if we've emitted a final answer\n let hasFinalAnswer = false;\n\n // Check last message for final answer marker\n const finalAnswerMarker = this.normalizedMarkers.finalAnswer;\n if (\n finalAnswerMarker &&\n this.messages.length > 0 &&\n typeof this.messages[this.messages.length - 1].content ===\n \"string\"\n ) {\n const lastContent = this.messages[this.messages.length - 1]\n .content as string;\n hasFinalAnswer = lastContent.includes(finalAnswerMarker.open);\n }\n\n // Check if any tool calls were made during the conversation\n const hasToolMessages = this.messages.some(\n (msg) => msg.role === \"tool\",\n );\n\n // If no final answer found after last iteration, emit a synthetic one\n if (!hasFinalAnswer && !isDone) {\n if (hasToolMessages) {\n // Only emit this specific message if tools were actually used\n eventEmitter.emit(\n \"final_answer\",\n \"ANSWER_AFTER_TOOL_NOT_GIVEN\",\n );\n } else {\n // Otherwise emit a more generic message\n eventEmitter.emit(\n \"final_answer\",\n \"MAX_ITERATIONS_REACHED_WITHOUT_FINAL_ANSWER\",\n );\n }\n }\n\n isDone = true;\n eventEmitter.emit(\"complete\");\n }\n }\n });\n } catch (error) {\n eventEmitter.emit(\"error\", error);\n isDone = true;\n }\n };\n\n // Start the first iteration\n processIteration();\n\n return eventEmitter;\n }\n\n /**\n * Format tools for the LLM API\n */\n private formatTools(): any[] {\n return this.options.tools.map((tool) => ({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n }));\n }\n}\n","import { AxiosError } from \"axios\";\n\nexport interface ErrorResponse {\n error: {\n code: number;\n message: string;\n metadata?: ModerationErrorMetadata | ProviderErrorMetadata;\n };\n}\n\ninterface ModerationErrorMetadata {\n reasons: string[];\n flagged_input: string;\n provider_name: string;\n model_slug: string;\n}\n\ninterface ProviderErrorMetadata {\n provider_name: string;\n raw: unknown;\n}\n\nexport class OpenRouterErrorAdapter {\n private static readonly ERROR_MESSAGES = {\n 400: \"Bad Request: Invalid or missing parameters, or CORS issue\",\n 401: \"Invalid credentials: OAuth session expired or disabled/invalid API key\",\n 402: \"Insufficient credits: Add more credits and retry the request\",\n 403: \"Content moderation: Your input was flagged\",\n 408: \"Request timeout: Your request took too long to process\",\n 429: \"Rate limited: You are sending too many requests\",\n 502: \"Provider error: Model is down or invalid response received\",\n 503: \"No provider: No available model provider meets your routing requirements\",\n } as const;\n\n static handleError(error: unknown): never {\n if (this.isAxiosError(error)) {\n throw this.handleAxiosError(error);\n }\n\n throw new Error(\n `Unexpected error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n private static isAxiosError(\n error: unknown,\n ): error is AxiosError<ErrorResponse> {\n return error instanceof Error && \"isAxiosError\" in error;\n }\n\n private static handleAxiosError(error: AxiosError<ErrorResponse>): Error {\n if (error.response) {\n const { status, data } = error.response;\n\n if (this.isOpenRouterError(data)) {\n return this.createDetailedError(data.error);\n }\n\n return new Error(\n `HTTP ${status}: ${this.ERROR_MESSAGES[status as keyof typeof this.ERROR_MESSAGES] || \"Unknown error\"}`,\n );\n }\n\n if (error.request) {\n return new Error(\"No response received from OpenRouter API\");\n }\n\n return new Error(`Failed to make request: ${error.message}`);\n }\n\n private static isOpenRouterError(data: unknown): data is ErrorResponse {\n return (\n typeof data === \"object\" &&\n data !== null &&\n \"error\" in data &&\n typeof (data as ErrorResponse).error.code === \"number\" &&\n typeof (data as ErrorResponse).error.message === \"string\"\n );\n }\n\n private static createDetailedError({\n code,\n message,\n metadata,\n }: ErrorResponse[\"error\"]): Error {\n const baseMessage = `${this.ERROR_MESSAGES[code as keyof typeof this.ERROR_MESSAGES] || \"Unknown error\"}: ${message}`;\n\n if (!metadata) {\n return new Error(baseMessage);\n }\n\n if (this.isModerationError(metadata)) {\n return new Error(\n `${baseMessage}\\nFlagged by ${metadata.provider_name} for: ${metadata.reasons.join(\", \")}\\n` +\n `Flagged content: \"${metadata.flagged_input}\"`,\n );\n }\n\n if (this.isProviderError(metadata)) {\n return new Error(\n `${baseMessage}\\nProvider ${metadata.provider_name} error: ${JSON.stringify(metadata.raw)}`,\n );\n }\n\n return new Error(baseMessage);\n }\n\n private static isModerationError(\n metadata: unknown,\n ): metadata is ModerationErrorMetadata {\n return (\n typeof metadata === \"object\" &&\n metadata !== null &&\n \"reasons\" in metadata &&\n \"flagged_input\" in metadata &&\n \"provider_name\" in metadata &&\n \"model_slug\" in metadata\n );\n }\n\n private static isProviderError(\n metadata: unknown,\n ): metadata is ProviderErrorMetadata {\n return (\n typeof metadata === \"object\" &&\n metadata !== null &&\n \"provider_name\" in metadata &&\n \"raw\" in metadata\n );\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport axios, { AxiosInstance } from \"axios\";\nimport { IHttpClient } from \"../types\";\n\nexport class HttpClient implements IHttpClient {\n private client: AxiosInstance;\n\n constructor(baseURL: string, headers: Record<string, string>) {\n this.client = axios.create({\n baseURL,\n headers,\n });\n }\n\n async post(url: string, data: any, config?: any) {\n return this.client.post(url, data, config);\n }\n\n async get(url: string) {\n return this.client.get(url);\n }\n}\n","import { EventEmitter } from \"events\";\nimport type * as Event from \"events\";\nimport { IStreamHandler } from \"../types\";\nimport { OpenRouterErrorAdapter } from \"./error-adapter\";\n\nexport class StreamHandler implements IStreamHandler {\n handleStream(stream: Event): EventEmitter {\n const eventEmitter = new EventEmitter();\n let buffer = \"\";\n\n stream.on(\"data\", (chunk: Buffer) => {\n buffer += chunk.toString();\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.trim() === \"\" || line.startsWith(\":\")) {\n // Handle SSE comments (OpenRouter processing messages)\n if (line.includes(\"OPENROUTER PROCESSING\")) {\n eventEmitter.emit(\"processing\");\n }\n continue;\n }\n\n try {\n const message = line.replace(/^data: /, \"\");\n if (message === \"[DONE]\") {\n eventEmitter.emit(\"done\");\n continue;\n }\n\n const parsed = JSON.parse(message);\n\n // Emit the full chunk for raw access\n eventEmitter.emit(\"chunk\", parsed);\n\n // Handle the standardized response format\n if (parsed.choices?.[0]) {\n const choice = parsed.choices[0];\n\n // For streaming responses, we'll get delta updates\n if (choice.delta) {\n // Extract the delta components\n const { content, role, tool_calls } = choice.delta;\n\n // Emit specific events for different delta types\n if (content) {\n // Emit both for backwards compatibility\n eventEmitter.emit(\"token\", content);\n eventEmitter.emit(\"content\", content);\n }\n if (role) {\n eventEmitter.emit(\"role\", role);\n }\n if (tool_calls) {\n eventEmitter.emit(\"tool_calls\", tool_calls);\n }\n }\n\n // Handle finish reason if present\n if (choice.finish_reason) {\n eventEmitter.emit(\"finish\", choice.finish_reason);\n }\n }\n\n // Handle usage statistics in the final message\n if (parsed.usage) {\n eventEmitter.emit(\"us