@catgirls/openrouter
Version:
Nyaa~! A TypeScript client for OpenRouter that's both kawaii and powerful! 😻
1 lines • 219 kB
Source Map (JSON)
{"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_cal