@yourgpt/llm-sdk 2.1.0 → 2.1.2
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/adapters/index.d.mts +2 -2
- package/dist/adapters/index.d.ts +2 -2
- package/dist/adapters/index.js +34 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/index.mjs +34 -1
- package/dist/adapters/index.mjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +24 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +24 -2
- package/dist/index.mjs.map +1 -1
- package/dist/providers/anthropic/index.d.mts +1 -1
- package/dist/providers/anthropic/index.d.ts +1 -1
- package/dist/providers/anthropic/index.js +66 -31
- package/dist/providers/anthropic/index.js.map +1 -1
- package/dist/providers/anthropic/index.mjs +66 -31
- package/dist/providers/anthropic/index.mjs.map +1 -1
- package/dist/providers/azure/index.d.mts +1 -1
- package/dist/providers/azure/index.d.ts +1 -1
- package/dist/providers/google/index.d.mts +1 -1
- package/dist/providers/google/index.d.ts +1 -1
- package/dist/providers/ollama/index.d.mts +2 -2
- package/dist/providers/ollama/index.d.ts +2 -2
- package/dist/providers/openai/index.d.mts +1 -1
- package/dist/providers/openai/index.d.ts +1 -1
- package/dist/providers/openrouter/index.d.mts +1 -1
- package/dist/providers/openrouter/index.d.ts +1 -1
- package/dist/providers/xai/index.d.mts +1 -1
- package/dist/providers/xai/index.d.ts +1 -1
- package/dist/{types-C_f95PKp.d.mts → types-D20jKwJW.d.mts} +11 -0
- package/dist/{types-C_f95PKp.d.ts → types-D20jKwJW.d.ts} +11 -0
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/tool.ts","../src/core/generate-text.ts","../src/core/stream-text.ts","../src/core/types.ts","../src/core/stream-events.ts","../src/server/streaming.ts","../src/server/stream-result.ts","../src/server/generate-result.ts","../src/server/runtime.ts","../src/server/integrations.ts","../src/core/utils.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/gemini.ts","../src/providers/formatter-registry.ts","../src/server/agent-loop.ts"],"names":["result","buildMessages","formatToolsForProvider","tool","transformTools","parseToolCalls","extractTextContent","formatToolResults","isToolUseStop","isEndTurnStop","getStopReason","buildAssistantToolMessage","buildToolResultMessage"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Tool Helper\n *\n * Create type-safe tools with Zod schema validation.\n *\n * @example\n * ```ts\n * import { tool } from '@yourgpt/llm-sdk';\n * import { z } from 'zod';\n *\n * const weatherTool = tool({\n * description: 'Get current weather for a city',\n * parameters: z.object({\n * city: z.string().describe('City name'),\n * unit: z.enum(['celsius', 'fahrenheit']).optional(),\n * }),\n * execute: async ({ city, unit }) => {\n * const data = await fetchWeather(city);\n * return { temperature: data.temp, condition: data.condition };\n * },\n * });\n * ```\n */\n\nimport type { z } from \"zod\";\nimport type { Tool, ToolContext } from \"./types\";\n\n/**\n * Configuration for creating a tool\n */\nexport interface ToolConfig<TParams extends z.ZodType, TResult = unknown> {\n /** Description of what the tool does (shown to LLM) */\n description: string;\n\n /** Zod schema defining the tool's parameters */\n parameters: TParams;\n\n /** Function to execute when the tool is called */\n execute: (params: z.infer<TParams>, context: ToolContext) => Promise<TResult>;\n\n /**\n * Hide this tool's execution from the chat UI.\n * When true, tool calls and results won't be displayed to the user,\n * but the tool will still execute normally.\n * @default false\n */\n hidden?: boolean;\n}\n\n/**\n * Create a type-safe tool definition\n *\n * @param config - Tool configuration with description, parameters, and execute function\n * @returns A Tool object that can be passed to generateText/streamText\n *\n * @example\n * ```ts\n * const searchTool = tool({\n * description: 'Search for products in the database',\n * parameters: z.object({\n * query: z.string(),\n * maxResults: z.number().optional().default(10),\n * }),\n * execute: async ({ query, maxResults }) => {\n * return await db.products.search(query, maxResults);\n * },\n * });\n *\n * const result = await generateText({\n * model: openai('gpt-4o'),\n * prompt: 'Find me some headphones',\n * tools: { search: searchTool },\n * });\n * ```\n */\nexport function tool<TParams extends z.ZodType, TResult = unknown>(\n config: ToolConfig<TParams, TResult>,\n): Tool<z.infer<TParams>, TResult> {\n return {\n description: config.description,\n parameters: config.parameters,\n execute: config.execute,\n hidden: config.hidden,\n };\n}\n\n/**\n * Convert a Tool's Zod schema to JSON Schema format\n * Used internally when sending tools to LLM providers\n */\nexport function toolToJsonSchema(toolDef: Tool): {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n} {\n const schema = zodToJsonSchema(toolDef.parameters);\n return {\n type: \"object\",\n properties: schema.properties ?? {},\n required: schema.required,\n };\n}\n\n/**\n * Convert Zod schema to JSON Schema\n * Handles common Zod types used in tool definitions\n */\nfunction zodToJsonSchema(schema: z.ZodType): {\n type?: string;\n properties?: Record<string, unknown>;\n required?: string[];\n items?: unknown;\n enum?: unknown[];\n description?: string;\n} {\n const def = (schema as unknown as { _def: unknown })._def as Record<\n string,\n unknown\n >;\n const typeName = def.typeName as string;\n\n // Handle descriptions\n const description = def.description as string | undefined;\n\n switch (typeName) {\n case \"ZodString\":\n return { type: \"string\", description };\n\n case \"ZodNumber\":\n return { type: \"number\", description };\n\n case \"ZodBoolean\":\n return { type: \"boolean\", description };\n\n case \"ZodEnum\": {\n const values = def.values as unknown[];\n return { type: \"string\", enum: values, description };\n }\n\n case \"ZodArray\": {\n const innerType = def.type as z.ZodType;\n return {\n type: \"array\",\n items: zodToJsonSchema(innerType),\n description,\n };\n }\n\n case \"ZodObject\": {\n const shape = def.shape as () => Record<string, z.ZodType>;\n const shapeObj = shape();\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shapeObj)) {\n properties[key] = zodToJsonSchema(value);\n\n // Check if required (not optional, not nullable, not with default)\n const valueDef = (value as unknown as { _def: Record<string, unknown> })\n ._def;\n const isOptional =\n valueDef.typeName === \"ZodOptional\" ||\n valueDef.typeName === \"ZodNullable\" ||\n valueDef.typeName === \"ZodDefault\";\n\n if (!isOptional) {\n required.push(key);\n }\n }\n\n return {\n type: \"object\",\n properties,\n required: required.length > 0 ? required : undefined,\n description,\n };\n }\n\n case \"ZodOptional\":\n case \"ZodNullable\": {\n const innerType = def.innerType as z.ZodType;\n return zodToJsonSchema(innerType);\n }\n\n case \"ZodDefault\": {\n const innerType = def.innerType as z.ZodType;\n return zodToJsonSchema(innerType);\n }\n\n case \"ZodLiteral\": {\n const value = def.value;\n if (typeof value === \"string\") {\n return { type: \"string\", enum: [value], description };\n }\n if (typeof value === \"number\") {\n return { type: \"number\", enum: [value], description };\n }\n if (typeof value === \"boolean\") {\n return { type: \"boolean\", enum: [value], description };\n }\n return { description };\n }\n\n case \"ZodUnion\": {\n // For simple string unions, convert to enum\n const options = def.options as z.ZodType[];\n const stringLiterals: string[] = [];\n\n for (const option of options) {\n const optDef = (option as unknown as { _def: Record<string, unknown> })\n ._def;\n if (\n optDef.typeName === \"ZodLiteral\" &&\n typeof optDef.value === \"string\"\n ) {\n stringLiterals.push(optDef.value as string);\n }\n }\n\n if (stringLiterals.length === options.length) {\n return { type: \"string\", enum: stringLiterals, description };\n }\n\n // For complex unions, just return the first option's schema\n return zodToJsonSchema(options[0]);\n }\n\n default:\n // Fallback for unknown types\n return { type: \"string\", description };\n }\n}\n\n/**\n * Format tools for OpenAI API format\n */\nexport function formatToolsForOpenAI(tools: Record<string, Tool>): Array<{\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: object;\n };\n}> {\n return Object.entries(tools).map(([name, toolDef]) => ({\n type: \"function\" as const,\n function: {\n name,\n description: toolDef.description,\n parameters: toolToJsonSchema(toolDef),\n },\n }));\n}\n\n/**\n * Format tools for Anthropic API format\n */\nexport function formatToolsForAnthropic(tools: Record<string, Tool>): Array<{\n name: string;\n description: string;\n input_schema: object;\n}> {\n return Object.entries(tools).map(([name, toolDef]) => ({\n name,\n description: toolDef.description,\n input_schema: toolToJsonSchema(toolDef),\n }));\n}\n\n/**\n * Format tools for Google Gemini API format\n */\nexport function formatToolsForGoogle(tools: Record<string, Tool>): Array<{\n functionDeclarations: Array<{\n name: string;\n description: string;\n parameters?: object;\n }>;\n}> {\n return [\n {\n functionDeclarations: Object.entries(tools).map(([name, toolDef]) => ({\n name,\n description: toolDef.description,\n parameters: toolToJsonSchema(toolDef),\n })),\n },\n ];\n}\n","/**\n * generateText - Generate text using a language model\n *\n * @example\n * ```ts\n * import { generateText } from '@yourgpt/llm-sdk';\n * import { openai } from '@yourgpt/llm-sdk/openai';\n *\n * // Simple usage\n * const result = await generateText({\n * model: openai('gpt-4o'),\n * prompt: 'Explain quantum computing in simple terms.',\n * });\n * console.log(result.text);\n *\n * // With tools (agentic)\n * const result = await generateText({\n * model: openai('gpt-4o'),\n * prompt: 'What is the weather in Tokyo?',\n * tools: { weather: weatherTool },\n * maxSteps: 5,\n * });\n * ```\n */\n\nimport type {\n GenerateTextParams,\n GenerateTextResult,\n GenerateStep,\n CoreMessage,\n Tool,\n ToolCall,\n ToolResult,\n TokenUsage,\n FinishReason,\n} from \"./types\";\nimport { formatToolsForOpenAI, formatToolsForAnthropic } from \"./tool\";\n\n/**\n * Generate text using a language model\n *\n * @param params - Generation parameters\n * @returns Promise resolving to generation result with text, usage, and tool interactions\n */\nexport async function generateText(\n params: GenerateTextParams,\n): Promise<GenerateTextResult> {\n const { model, tools, maxSteps = 1, signal } = params;\n\n // Build initial messages\n let messages = buildMessages(params);\n const steps: GenerateStep[] = [];\n const allToolCalls: ToolCall[] = [];\n const allToolResults: ToolResult[] = [];\n\n // Agent loop - keep going until no more tool calls or max steps reached\n for (let step = 0; step < maxSteps; step++) {\n // Check for abort\n if (signal?.aborted) {\n throw new Error(\"Generation aborted\");\n }\n\n // Format tools for this model's provider\n const formattedTools = tools\n ? formatToolsForProvider(tools, model.provider)\n : undefined;\n\n // Call model\n const result = await model.doGenerate({\n messages,\n tools: formattedTools,\n temperature: params.temperature,\n maxTokens: params.maxTokens,\n signal,\n });\n\n // Record this step\n const stepToolResults: ToolResult[] = [];\n\n // If there are tool calls, execute them\n if (result.toolCalls && result.toolCalls.length > 0 && tools) {\n allToolCalls.push(...result.toolCalls);\n\n // Execute each tool\n for (const call of result.toolCalls) {\n const toolDef = tools[call.name];\n if (!toolDef) {\n const errorResult: ToolResult = {\n toolCallId: call.id,\n result: { error: `Tool not found: ${call.name}` },\n };\n stepToolResults.push(errorResult);\n allToolResults.push(errorResult);\n continue;\n }\n\n try {\n // Validate and execute\n const parsedArgs = toolDef.parameters.parse(call.args);\n const toolResult = await toolDef.execute(parsedArgs, {\n toolCallId: call.id,\n abortSignal: signal,\n messages,\n });\n\n const result: ToolResult = {\n toolCallId: call.id,\n result: toolResult,\n };\n stepToolResults.push(result);\n allToolResults.push(result);\n } catch (error) {\n const errorResult: ToolResult = {\n toolCallId: call.id,\n result: {\n error:\n error instanceof Error\n ? error.message\n : \"Tool execution failed\",\n },\n };\n stepToolResults.push(errorResult);\n allToolResults.push(errorResult);\n }\n }\n }\n\n // Record step\n steps.push({\n text: result.text,\n toolCalls: result.toolCalls,\n toolResults: stepToolResults,\n finishReason: result.finishReason,\n usage: result.usage,\n });\n\n // If no tool calls, we're done\n if (!result.toolCalls || result.toolCalls.length === 0) {\n break;\n }\n\n // Add assistant message with tool calls\n const assistantMessage: AssistantMessage = {\n role: \"assistant\",\n content: result.text || null,\n toolCalls: result.toolCalls,\n };\n messages = [...messages, assistantMessage];\n\n // Add tool result messages\n for (const tr of stepToolResults) {\n const toolMessage: ToolMessage = {\n role: \"tool\",\n toolCallId: tr.toolCallId,\n content: JSON.stringify(tr.result),\n };\n messages = [...messages, toolMessage];\n }\n }\n\n // Build final result\n const lastStep = steps[steps.length - 1];\n\n return {\n text: lastStep?.text ?? \"\",\n usage: sumUsage(steps),\n finishReason: lastStep?.finishReason ?? \"stop\",\n steps,\n toolCalls: allToolCalls,\n toolResults: allToolResults,\n response: {\n messages,\n },\n };\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\ninterface AssistantMessage {\n role: \"assistant\";\n content: string | null;\n toolCalls?: ToolCall[];\n}\n\ninterface ToolMessage {\n role: \"tool\";\n toolCallId: string;\n content: string;\n}\n\n/**\n * Build initial messages from params\n */\nfunction buildMessages(params: GenerateTextParams): CoreMessage[] {\n const messages: CoreMessage[] = [];\n\n // Add system prompt if provided\n if (params.system) {\n messages.push({ role: \"system\", content: params.system });\n }\n\n // Add existing messages\n if (params.messages) {\n messages.push(...params.messages);\n }\n\n // Add prompt as user message if provided\n if (params.prompt) {\n messages.push({ role: \"user\", content: params.prompt });\n }\n\n return messages;\n}\n\n/**\n * Format tools based on provider\n */\nfunction formatToolsForProvider(\n tools: Record<string, Tool>,\n provider: string,\n): unknown[] {\n switch (provider) {\n case \"anthropic\":\n return formatToolsForAnthropic(tools);\n case \"openai\":\n case \"xai\":\n case \"azure\":\n default:\n return formatToolsForOpenAI(tools);\n }\n}\n\n/**\n * Sum token usage across all steps\n */\nfunction sumUsage(steps: GenerateStep[]): TokenUsage {\n return steps.reduce(\n (acc, step) => ({\n promptTokens: acc.promptTokens + (step.usage?.promptTokens ?? 0),\n completionTokens:\n acc.completionTokens + (step.usage?.completionTokens ?? 0),\n totalTokens: acc.totalTokens + (step.usage?.totalTokens ?? 0),\n }),\n { promptTokens: 0, completionTokens: 0, totalTokens: 0 },\n );\n}\n","/**\n * streamText - Stream text from a language model\n *\n * @example\n * ```ts\n * import { streamText } from '@yourgpt/llm-sdk';\n * import { openai } from '@yourgpt/llm-sdk/openai';\n *\n * // Simple streaming\n * const result = await streamText({\n * model: openai('gpt-4o'),\n * prompt: 'Tell me a story.',\n * });\n *\n * // Option 1: Iterate text chunks\n * for await (const chunk of result.textStream) {\n * process.stdout.write(chunk);\n * }\n *\n * // Option 2: Get full text\n * const text = await result.text;\n *\n * // Option 3: Return as Response (for API routes)\n * return result.toTextStreamResponse();\n * ```\n */\n\nimport type {\n StreamTextParams,\n StreamTextResult,\n StreamPart,\n CoreMessage,\n Tool,\n ToolCall,\n TokenUsage,\n FinishReason,\n ResponseOptions,\n StreamChunk,\n} from \"./types\";\nimport { formatToolsForOpenAI, formatToolsForAnthropic } from \"./tool\";\n\n/**\n * Stream text from a language model\n *\n * @param params - Stream parameters\n * @returns Promise resolving to stream result with text stream and helpers\n */\nexport async function streamText(\n params: StreamTextParams,\n): Promise<StreamTextResult> {\n const { model, tools, maxSteps = 1, signal } = params;\n\n // State for collecting results\n let fullText = \"\";\n let finalUsage: TokenUsage = {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n let finalFinishReason: FinishReason = \"stop\";\n\n // Create the stream generator\n async function* createFullStream(): AsyncGenerator<StreamPart> {\n let messages = buildMessages(params);\n\n for (let step = 0; step < maxSteps; step++) {\n yield { type: \"step-start\", step };\n\n // Check for abort\n if (signal?.aborted) {\n yield { type: \"error\", error: new Error(\"Stream aborted\") };\n return;\n }\n\n // Format tools for this model's provider\n const formattedTools = tools\n ? formatToolsForProvider(tools, model.provider)\n : undefined;\n\n // Collect data from this step\n let stepText = \"\";\n const toolCalls: ToolCall[] = [];\n let currentToolCall: Partial<ToolCall> | null = null;\n let stepFinishReason: FinishReason = \"stop\";\n\n try {\n // Stream from model\n for await (const chunk of model.doStream({\n messages,\n tools: formattedTools,\n temperature: params.temperature,\n maxTokens: params.maxTokens,\n signal,\n })) {\n switch (chunk.type) {\n case \"text-delta\":\n stepText += chunk.text;\n fullText += chunk.text;\n yield { type: \"text-delta\", text: chunk.text };\n break;\n\n case \"tool-call\":\n toolCalls.push(chunk.toolCall);\n yield {\n type: \"tool-call-complete\",\n toolCall: chunk.toolCall,\n };\n break;\n\n case \"finish\":\n stepFinishReason = chunk.finishReason;\n finalFinishReason = chunk.finishReason;\n if (chunk.usage) {\n finalUsage = {\n promptTokens:\n finalUsage.promptTokens + chunk.usage.promptTokens,\n completionTokens:\n finalUsage.completionTokens + chunk.usage.completionTokens,\n totalTokens: finalUsage.totalTokens + chunk.usage.totalTokens,\n };\n }\n break;\n\n case \"error\":\n yield { type: \"error\", error: chunk.error };\n return;\n }\n }\n } catch (error) {\n yield {\n type: \"error\",\n error: error instanceof Error ? error : new Error(String(error)),\n };\n return;\n }\n\n yield { type: \"step-finish\", step, finishReason: stepFinishReason };\n\n // If no tool calls, we're done\n if (toolCalls.length === 0 || !tools) {\n break;\n }\n\n // Execute tools and continue\n const assistantMessage: CoreMessage = {\n role: \"assistant\",\n content: stepText || null,\n toolCalls,\n };\n messages = [...messages, assistantMessage];\n\n // Execute each tool\n for (const call of toolCalls) {\n const toolDef = tools[call.name];\n if (!toolDef) {\n const errorResult = { error: `Tool not found: ${call.name}` };\n yield {\n type: \"tool-result\",\n toolCallId: call.id,\n result: errorResult,\n };\n messages = [\n ...messages,\n {\n role: \"tool\",\n toolCallId: call.id,\n content: JSON.stringify(errorResult),\n },\n ];\n continue;\n }\n\n try {\n const parsedArgs = toolDef.parameters.parse(call.args);\n const result = await toolDef.execute(parsedArgs, {\n toolCallId: call.id,\n abortSignal: signal,\n messages,\n });\n\n yield { type: \"tool-result\", toolCallId: call.id, result };\n messages = [\n ...messages,\n {\n role: \"tool\",\n toolCallId: call.id,\n content: JSON.stringify(result),\n },\n ];\n } catch (error) {\n const errorResult = {\n error:\n error instanceof Error ? error.message : \"Tool execution failed\",\n };\n yield {\n type: \"tool-result\",\n toolCallId: call.id,\n result: errorResult,\n };\n messages = [\n ...messages,\n {\n role: \"tool\",\n toolCallId: call.id,\n content: JSON.stringify(errorResult),\n },\n ];\n }\n }\n }\n\n // Final finish event\n yield {\n type: \"finish\",\n finishReason: finalFinishReason,\n usage: finalUsage,\n };\n }\n\n // Create text-only stream\n async function* createTextStream(): AsyncIterable<string> {\n for await (const part of createFullStream()) {\n if (part.type === \"text-delta\") {\n yield part.text;\n }\n }\n }\n\n // Promises for lazy evaluation\n let textPromise: Promise<string> | undefined;\n let usagePromise: Promise<TokenUsage> | undefined;\n let finishReasonPromise: Promise<FinishReason> | undefined;\n\n // Consume stream to get final values\n async function consumeStream(): Promise<void> {\n for await (const _ of createFullStream()) {\n // Just consume to completion\n }\n }\n\n return {\n textStream: createTextStream(),\n fullStream: createFullStream(),\n\n get text(): Promise<string> {\n if (!textPromise) {\n textPromise = consumeStream().then(() => fullText);\n }\n return textPromise;\n },\n\n get usage(): Promise<TokenUsage> {\n if (!usagePromise) {\n usagePromise = consumeStream().then(() => finalUsage);\n }\n return usagePromise;\n },\n\n get finishReason(): Promise<FinishReason> {\n if (!finishReasonPromise) {\n finishReasonPromise = consumeStream().then(() => finalFinishReason);\n }\n return finishReasonPromise;\n },\n\n toTextStreamResponse(options?: ResponseOptions): Response {\n const stream = createTextStreamReadable(createTextStream());\n return new Response(stream, {\n status: options?.status ?? 200,\n headers: {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n ...options?.headers,\n },\n });\n },\n\n toDataStreamResponse(options?: ResponseOptions): Response {\n const stream = createDataStreamReadable(createFullStream());\n return new Response(stream, {\n status: options?.status ?? 200,\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n ...options?.headers,\n },\n });\n },\n };\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\n/**\n * Build initial messages from params\n */\nfunction buildMessages(params: StreamTextParams): CoreMessage[] {\n const messages: CoreMessage[] = [];\n\n if (params.system) {\n messages.push({ role: \"system\", content: params.system });\n }\n\n if (params.messages) {\n messages.push(...params.messages);\n }\n\n if (params.prompt) {\n messages.push({ role: \"user\", content: params.prompt });\n }\n\n return messages;\n}\n\n/**\n * Format tools based on provider\n */\nfunction formatToolsForProvider(\n tools: Record<string, Tool>,\n provider: string,\n): unknown[] {\n switch (provider) {\n case \"anthropic\":\n return formatToolsForAnthropic(tools);\n case \"openai\":\n case \"xai\":\n case \"azure\":\n default:\n return formatToolsForOpenAI(tools);\n }\n}\n\n/**\n * Create a ReadableStream from text async iterable\n */\nfunction createTextStreamReadable(\n textStream: AsyncIterable<string>,\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n\n return new ReadableStream({\n async start(controller) {\n try {\n for await (const text of textStream) {\n controller.enqueue(encoder.encode(text));\n }\n controller.close();\n } catch (error) {\n controller.error(error);\n }\n },\n });\n}\n\n/**\n * Create a ReadableStream for SSE data stream\n */\nfunction createDataStreamReadable(\n fullStream: AsyncIterable<StreamPart>,\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n\n return new ReadableStream({\n async start(controller) {\n try {\n for await (const part of fullStream) {\n const data = JSON.stringify(part);\n controller.enqueue(encoder.encode(`data: ${data}\\n\\n`));\n }\n controller.enqueue(encoder.encode(\"data: [DONE]\\n\\n\"));\n controller.close();\n } catch (error) {\n const errorData = JSON.stringify({\n type: \"error\",\n error: error instanceof Error ? error.message : String(error),\n });\n controller.enqueue(encoder.encode(`data: ${errorData}\\n\\n`));\n controller.close();\n }\n },\n });\n}\n","/**\n * Core Types for @yourgpt/llm-sdk\n *\n * Modern, instance-based types following Vercel AI SDK patterns.\n */\n\nimport type { z } from \"zod\";\n\n// ============================================\n// Language Model Types\n// ============================================\n\n/**\n * A language model instance that can generate text.\n * This is what provider functions like `openai('gpt-4o')` return.\n */\nexport interface LanguageModel {\n /** Provider identifier (e.g., 'openai', 'anthropic') */\n readonly provider: string;\n\n /** Model identifier (e.g., 'gpt-4o', 'claude-3-5-sonnet') */\n readonly modelId: string;\n\n /** Model capabilities for feature detection */\n readonly capabilities: ModelCapabilities;\n\n /**\n * Generate a complete response (non-streaming)\n * Used internally by generateText()\n */\n doGenerate(params: DoGenerateParams): Promise<DoGenerateResult>;\n\n /**\n * Stream a response\n * Used internally by streamText()\n */\n doStream(params: DoGenerateParams): AsyncGenerator<StreamChunk>;\n}\n\n/**\n * Model capabilities for UI feature flags\n */\nexport interface ModelCapabilities {\n /** Supports image inputs */\n supportsVision: boolean;\n /** Supports tool/function calling */\n supportsTools: boolean;\n /** Supports streaming responses */\n supportsStreaming: boolean;\n /** Supports JSON mode / structured output */\n supportsJsonMode: boolean;\n /** Supports extended thinking (Claude) */\n supportsThinking: boolean;\n /** Supports PDF document inputs */\n supportsPDF: boolean;\n /** Maximum context tokens */\n maxTokens: number;\n /** Supported image MIME types */\n supportedImageTypes: string[];\n}\n\n/**\n * Default capabilities for unknown models\n */\nexport const DEFAULT_CAPABILITIES: ModelCapabilities = {\n supportsVision: false,\n supportsTools: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n supportsThinking: false,\n supportsPDF: false,\n maxTokens: 8192,\n supportedImageTypes: [],\n};\n\n// ============================================\n// Message Types\n// ============================================\n\n/**\n * Core message types for LLM conversations\n */\nexport type CoreMessage =\n | SystemMessage\n | UserMessage\n | AssistantMessage\n | ToolMessage;\n\nexport interface SystemMessage {\n role: \"system\";\n content: string;\n}\n\nexport interface UserMessage {\n role: \"user\";\n content: string | UserContentPart[];\n}\n\nexport interface AssistantMessage {\n role: \"assistant\";\n content: string | null;\n toolCalls?: ToolCall[];\n}\n\nexport interface ToolMessage {\n role: \"tool\";\n toolCallId: string;\n content: string;\n}\n\n/**\n * Content parts for multimodal user messages\n */\nexport type UserContentPart = TextPart | ImagePart | FilePart;\n\nexport interface TextPart {\n type: \"text\";\n text: string;\n}\n\nexport interface ImagePart {\n type: \"image\";\n /** Base64 data or URL */\n image: string | Uint8Array;\n /** MIME type (e.g., 'image/png') */\n mimeType?: string;\n}\n\nexport interface FilePart {\n type: \"file\";\n /** Base64 data or URL */\n data: string;\n /** MIME type (e.g., 'application/pdf') */\n mimeType: string;\n}\n\n// ============================================\n// Tool Types\n// ============================================\n\n/**\n * Tool definition with Zod schema support\n */\nexport interface Tool<TParams = unknown, TResult = unknown> {\n /** Tool description for the LLM */\n description: string;\n /** Zod schema for parameters */\n parameters: z.ZodType<TParams>;\n /** Execute function */\n execute: (params: TParams, context: ToolContext) => Promise<TResult>;\n /**\n * Hide this tool's execution from the chat UI.\n * When true, tool calls and results won't be displayed to the user,\n * but the tool will still execute normally.\n * @default false\n */\n hidden?: boolean;\n}\n\n/**\n * Context passed to tool execute function\n */\nexport interface ToolContext {\n /** Abort signal for cancellation */\n abortSignal?: AbortSignal;\n /** Unique tool call ID */\n toolCallId: string;\n /** Optional: messages in conversation */\n messages?: CoreMessage[];\n}\n\n/**\n * Tool call from LLM response\n */\nexport interface ToolCall {\n /** Unique ID for this tool call */\n id: string;\n /** Tool name */\n name: string;\n /** Parsed arguments */\n args: Record<string, unknown>;\n}\n\n/**\n * Tool execution result\n */\nexport interface ToolResult {\n /** Tool call ID this result corresponds to */\n toolCallId: string;\n /** Result data (will be JSON stringified for LLM) */\n result: unknown;\n}\n\n// ============================================\n// Generation Types\n// ============================================\n\n/**\n * Parameters for model.doGenerate() and model.doStream()\n */\nexport interface DoGenerateParams {\n /** Messages to send to LLM */\n messages: CoreMessage[];\n /** Tools available to the LLM (already formatted for provider) */\n tools?: unknown[];\n /** Temperature (0-2) */\n temperature?: number;\n /** Maximum tokens to generate */\n maxTokens?: number;\n /** Abort signal */\n signal?: AbortSignal;\n}\n\n/**\n * Result from model.doGenerate()\n */\nexport interface DoGenerateResult {\n /** Generated text content */\n text: string;\n /** Tool calls requested by the LLM */\n toolCalls: ToolCall[];\n /** Why generation stopped */\n finishReason: FinishReason;\n /** Token usage */\n usage: TokenUsage;\n /** Raw provider response (for debugging) */\n rawResponse?: unknown;\n}\n\n/**\n * Finish reason for generation\n */\nexport type FinishReason =\n | \"stop\"\n | \"length\"\n | \"tool-calls\"\n | \"content-filter\"\n | \"error\"\n | \"unknown\";\n\n/**\n * Token usage statistics\n */\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\n// ============================================\n// Streaming Types\n// ============================================\n\n/**\n * Stream chunk from model.doStream()\n */\nexport type StreamChunk =\n | TextDeltaChunk\n | ToolCallChunk\n | ToolResultChunk\n | FinishChunk\n | ErrorChunk;\n\nexport interface TextDeltaChunk {\n type: \"text-delta\";\n text: string;\n}\n\nexport interface ToolCallChunk {\n type: \"tool-call\";\n toolCall: ToolCall;\n}\n\nexport interface ToolResultChunk {\n type: \"tool-result\";\n toolCallId: string;\n result: unknown;\n}\n\nexport interface FinishChunk {\n type: \"finish\";\n finishReason: FinishReason;\n usage?: TokenUsage;\n}\n\nexport interface ErrorChunk {\n type: \"error\";\n error: Error;\n}\n\n// ============================================\n// Generate Text Types\n// ============================================\n\n/**\n * Parameters for generateText()\n */\nexport interface GenerateTextParams {\n /** Language model to use */\n model: LanguageModel;\n /** Simple prompt (converted to user message) */\n prompt?: string;\n /** System prompt */\n system?: string;\n /** Full message history */\n messages?: CoreMessage[];\n /** Tools available to the LLM */\n tools?: Record<string, Tool>;\n /** Maximum agentic steps (tool call loops) */\n maxSteps?: number;\n /** Temperature (0-2) */\n temperature?: number;\n /** Maximum tokens to generate */\n maxTokens?: number;\n /** Abort signal */\n signal?: AbortSignal;\n}\n\n/**\n * Result from generateText()\n */\nexport interface GenerateTextResult {\n /** Final text output */\n text: string;\n /** Token usage */\n usage: TokenUsage;\n /** Why generation stopped */\n finishReason: FinishReason;\n /** All steps taken (for agentic workflows) */\n steps: GenerateStep[];\n /** All tool calls made across all steps */\n toolCalls: ToolCall[];\n /** All tool results across all steps */\n toolResults: ToolResult[];\n /** Final message list including tool interactions */\n response: {\n messages: CoreMessage[];\n };\n}\n\n/**\n * A single step in the generation process\n */\nexport interface GenerateStep {\n /** Text generated in this step */\n text: string;\n /** Tool calls made in this step */\n toolCalls: ToolCall[];\n /** Tool results from this step */\n toolResults: ToolResult[];\n /** Finish reason for this step */\n finishReason: FinishReason;\n /** Token usage for this step */\n usage: TokenUsage;\n}\n\n// ============================================\n// Stream Text Types\n// ============================================\n\n/**\n * Parameters for streamText() - same as generateText\n */\nexport type StreamTextParams = GenerateTextParams;\n\n/**\n * Result from streamText()\n */\nexport interface StreamTextResult {\n /** Async iterable of text chunks only */\n textStream: AsyncIterable<string>;\n\n /** Async iterable of all stream parts */\n fullStream: AsyncIterable<StreamPart>;\n\n /** Promise that resolves to full text when complete */\n readonly text: Promise<string>;\n\n /** Promise that resolves to usage when complete */\n readonly usage: Promise<TokenUsage>;\n\n /** Promise that resolves to finish reason when complete */\n readonly finishReason: Promise<FinishReason>;\n\n /** Convert to plain text streaming Response */\n toTextStreamResponse(options?: ResponseOptions): Response;\n\n /** Convert to data stream Response (SSE with tool calls) */\n toDataStreamResponse(options?: ResponseOptions): Response;\n}\n\n/**\n * Stream part for fullStream\n */\nexport type StreamPart =\n | { type: \"text-delta\"; text: string }\n | { type: \"tool-call-start\"; toolCallId: string; toolName: string }\n | { type: \"tool-call-delta\"; toolCallId: string; argsText: string }\n | { type: \"tool-call-complete\"; toolCall: ToolCall }\n | { type: \"tool-result\"; toolCallId: string; result: unknown }\n | { type: \"step-start\"; step: number }\n | { type: \"step-finish\"; step: number; finishReason: FinishReason }\n | { type: \"finish\"; finishReason: FinishReason; usage: TokenUsage }\n | { type: \"error\"; error: Error };\n\n/**\n * Options for Response helpers\n */\nexport interface ResponseOptions {\n /** Additional headers */\n headers?: Record<string, string>;\n /** Response status (default: 200) */\n status?: number;\n}\n","/**\n * Stream event types for llm-sdk\n * These types are used internally by the SDK for streaming responses\n */\n\n/**\n * Stream event types\n */\nexport type StreamEventType =\n | \"message:start\"\n | \"message:delta\"\n | \"message:end\"\n | \"thinking:start\"\n | \"thinking:delta\"\n | \"thinking:end\"\n | \"action:start\"\n | \"action:args\"\n | \"action:end\"\n | \"tool_calls\"\n | \"tool:result\"\n | \"citation\"\n | \"loop:iteration\"\n | \"loop:complete\"\n | \"error\"\n | \"done\";\n\n/**\n * Base event interface\n */\ninterface BaseEvent {\n type: StreamEventType;\n}\n\n/**\n * Message started streaming\n */\nexport interface MessageStartEvent extends BaseEvent {\n type: \"message:start\";\n id: string;\n}\n\n/**\n * Message content delta (incremental update)\n */\nexport interface MessageDeltaEvent extends BaseEvent {\n type: \"message:delta\";\n content: string;\n}\n\n/**\n * Message finished streaming\n */\nexport interface MessageEndEvent extends BaseEvent {\n type: \"message:end\";\n}\n\n/**\n * Thinking/reasoning started (for models like Claude, DeepSeek)\n */\nexport interface ThinkingStartEvent extends BaseEvent {\n type: \"thinking:start\";\n}\n\n/**\n * Thinking content delta\n */\nexport interface ThinkingDeltaEvent extends BaseEvent {\n type: \"thinking:delta\";\n content: string;\n}\n\n/**\n * Thinking finished\n */\nexport interface ThinkingEndEvent extends BaseEvent {\n type: \"thinking:end\";\n}\n\n/**\n * Action/tool execution started\n */\nexport interface ActionStartEvent extends BaseEvent {\n type: \"action:start\";\n id: string;\n name: string;\n}\n\n/**\n * Action arguments (streaming)\n */\nexport interface ActionArgsEvent extends BaseEvent {\n type: \"action:args\";\n id: string;\n args: string;\n}\n\n/**\n * Action execution completed\n */\nexport interface ActionEndEvent extends BaseEvent {\n type: \"action:end\";\n id: string;\n name?: string;\n result?: unknown;\n error?: string;\n}\n\n/**\n * Error event\n */\nexport interface ErrorEvent extends BaseEvent {\n type: \"error\";\n message: string;\n code?: string;\n}\n\n/**\n * Tool call information\n */\nexport interface ToolCallInfo {\n id: string;\n name: string;\n args: Record<string, unknown>;\n}\n\n/**\n * Assistant message with tool calls\n */\nexport interface AssistantToolMessage {\n role: \"assistant\";\n content: string | null;\n tool_calls: Array<{\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string;\n };\n }>;\n}\n\n/**\n * Tool calls event - client should execute and send results\n */\nexport interface ToolCallsEvent extends BaseEvent {\n type: \"tool_calls\";\n toolCalls: ToolCallInfo[];\n assistantMessage: AssistantToolMessage;\n}\n\n/**\n * Tool result event\n */\nexport interface ToolResultEvent extends BaseEvent {\n type: \"tool:result\";\n id: string;\n name: string;\n result: ToolResponse;\n}\n\n/**\n * Loop iteration event\n */\nexport interface LoopIterationEvent extends BaseEvent {\n type: \"loop:iteration\";\n iteration: number;\n maxIterations: number;\n}\n\n/**\n * Loop complete event\n */\nexport interface LoopCompleteEvent extends BaseEvent {\n type: \"loop:complete\";\n iterations: number;\n aborted?: boolean;\n maxIterationsReached?: boolean;\n}\n\n/**\n * Citation from web search (unified format for all providers)\n */\nexport interface Citation {\n /** Unique citation index (1-based) */\n index: number;\n /** Source URL */\n url: string;\n /** Page title */\n title: string;\n /** Cited text snippet (optional) */\n citedText?: string;\n /** Source domain (extracted from URL) */\n domain?: string;\n /** Favicon URL (generated from domain) */\n favicon?: string;\n}\n\n/**\n * Citation event - web search returned citations\n */\nexport interface CitationEvent extends BaseEvent {\n type: \"citation\";\n citations: Citation[];\n}\n\n/**\n * Message format for done event (API format with snake_case)\n */\nexport interface DoneEventMessage {\n role: \"assistant\" | \"tool\";\n content: string | null;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string;\n };\n }>;\n tool_call_id?: string;\n}\n\n/**\n * Token usage (snake_case for API compatibility)\n */\nexport interface TokenUsageRaw {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens?: number;\n}\n\n/**\n * Stream completed\n */\nexport interface DoneEvent extends BaseEvent {\n type: \"done\";\n requiresAction?: boolean;\n messages?: DoneEventMessage[];\n /** Token usage (server-side only, stripped before sending to client) */\n usage?: TokenUsageRaw;\n}\n\n/**\n * Union of all stream events\n */\nexport type StreamEvent =\n | MessageStartEvent\n | MessageDeltaEvent\n | MessageEndEvent\n | ThinkingStartEvent\n | ThinkingDeltaEvent\n | ThinkingEndEvent\n | ActionStartEvent\n | ActionArgsEvent\n | ActionEndEvent\n | ToolCallsEvent\n | ToolResultEvent\n | CitationEvent\n | LoopIterationEvent\n | LoopCompleteEvent\n | ErrorEvent\n | DoneEvent;\n\n/**\n * LLM configuration\n */\nexport interface LLMConfig {\n temperature?: number;\n maxTokens?: number;\n}\n\n/**\n * Tool call format (OpenAI style)\n */\nexport interface ToolCall {\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string;\n };\n}\n\n/**\n * Message role\n */\nexport type MessageRole = \"system\" | \"user\" | \"assistant\" | \"tool\";\n\n/**\n * Message attachment\n */\nexport interface MessageAttachment {\n type: \"image\" | \"file\" | \"audio\" | \"video\";\n data?: string;\n url?: string;\n mimeType: string;\n filename?: string;\n}\n\n/**\n * Message metadata\n */\nexport interface MessageMetadata {\n thinking?: string;\n attachments?: MessageAttachment[];\n toolName?: string;\n [key: string]: unknown;\n}\n\n/**\n * Message type (simplified for llm-sdk)\n */\nexport interface Message {\n id: string;\n thread_id?: string;\n role: MessageRole;\n content: string | null;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n metadata?: MessageMetadata;\n created_at?: Date;\n}\n\n/**\n * Action parameter definition\n */\nexport interface ActionParameter {\n type: string;\n description?: string;\n required?: boolean;\n enum?: string[];\n items?: ActionParameter;\n properties?: Record<string, ActionParameter>;\n}\n\n/**\n * Action definition for tool calling\n */\nexport interface ActionDefinition<TParams = Record<string, unknown>> {\n name: string;\n description: string;\n parameters?: Record<string, ActionParameter>;\n handler: (params: TParams) => unknown | Promise<unknown>;\n}\n\n/**\n * Tool location (server or client)\n */\nexport type ToolLocation = \"server\" | \"client\";\n\n/**\n * Tool execution status\n */\nexport type ToolExecutionStatus =\n | \"pending\"\n | \"executing\"\n | \"completed\"\n | \"error\";\n\n/**\n * Tool response\n */\nexport interface ToolResponse<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n /** Internal: AI response mode override */\n _aiResponseMode?: AIResponseMode;\n /** Internal: AI content for multimodal response (images, etc.) */\n _aiContent?: AIContent[];\n /** Internal: AI context string override */\n _aiContext?: string;\n}\n\n/**\n * Tool context passed to handlers\n */\nexport interface ToolContext {\n userId?: string;\n threadId?: string;\n [key: string]: unknown;\n}\n\n/**\n * AI response mode for tool results\n */\nexport type AIResponseMode = \"none\" | \"brief\" | \"full\";\n\n/**\n * AI content structure\n */\nexport interface AIContent {\n type?: \"text\" | \"image\";\n text?: string;\n mediaType?: string;\n data?: string;\n summary?: string;\n details?: string;\n}\n\n/**\n * JSON Schema for tool input\n */\nexport interface ToolInputSchema {\n type: \"object\";\n properties?: Record<string, unknown>;\n required?: string[];\n}\n\n/**\n * Tool AI context for result formatting\n */\nexport interface ToolAIContext {\n enabled?: boolean;\n mode?: AIResponseMode;\n content?: AIContent | ((result: unknown) => AIContent);\n}\n\n/**\n * Tool definition\n */\nexport interface ToolDefinition<TParams = Record<string, unknown>> {\n name: string;\n description: string;\n location: ToolLocation;\n title?: string | ((args: TParams) => string);\n inputSchema?: ToolInputSchema;\n handler?: (\n params: TParams,\n context?: ToolContext,\n ) => unknown | Promise<unknown>;\n render?: (props: unknown) => unknown;\n available?: boolean;\n needsApproval?: boolean;\n approvalMessage?: string | ((params: TParams) => string);\n /** AI response mode for this tool (none, brief, full) */\n aiResponseMode?: AIResponseMode;\n /** AI context string or function to generate context */\n aiContext?:\n | string\n | ((result: ToolResponse, args: Record<string, unknown>) => string);\n}\n\n/**\n * Agent loop configuration\n */\nexport interface AgentLoopConfig {\n maxIterations?: number;\n debug?: boolean;\n enabled?: boolean;\n}\n\n/**\n * Web search configuration for native provider search\n *\n * Enables native web search for supported providers:\n * - Anthropic: Uses Claude's built-in web search tool\n * - OpenAI: Uses GPT's web search preview\n * - Google: Uses Gemini's Google Search grounding\n *\n * @example\n * ```typescript\n * const runtime = createRuntime({\n * provider: createAnthropic({ apiKey: '...' }),\n * model: 'claude-sonnet-4-20250514',\n * webSearch: true, // Enable with defaults\n * });\n *\n * // Or with configuration\n * const runtime = createRuntime({\n * provider: createOpenAI({ apiKey: '...' }),\n * model: 'gpt-4o',\n * webSearch: {\n * maxUses: 5,\n * allowedDomains: ['docs.anthropic.com', 'openai.com'],\n * },\n * });\n * ```\n */\nexport interface WebSearchConfig {\n /** Maximum number of search uses per request (default: unlimited) */\n maxUses?: number;\n /** Only search these domains (provider-specific support) */\n allowedDomains?: string[];\n /** Exclude these domains from search (provider-specific support) */\n blockedDomains?: string[];\n /** User location for localized results (Anthropic only) */\n userLocation?: {\n type: \"approximate\";\n city?: string;\n region?: string;\n country?: string;\n timezone?: string;\n };\n}\n\n/**\n * Unified tool call format\n */\nexport interface UnifiedToolCall {\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\n/**\n * Unified tool result format\n */\nexport interface UnifiedToolResult {\n toolCallId: string;\n content: string;\n success: boolean;\n error?: string;\n}\n\n/**\n * Tool execution state\n */\nexport interface ToolExecution {\n id: string;\n name: string;\n args: Record<string, unknown>;\n status: ToolExecutionStatus;\n result?: ToolResponse;\n}\n\n/**\n * Knowledge base provider\n */\nexport type KnowledgeBaseProvider =\n | \"pinecone\"\n | \"qdrant\"\n | \"weaviate\"\n | \"custom\";\n\n/**\n * Knowledge base configuration\n */\nexport interface KnowledgeBaseConfig {\n id: string;\n name?: string;\n provider: KnowledgeBaseProvider;\n apiKey?: string;\n index?: string;\n}\n\n/**\n * Create a message helper\n */\nexport function createMessage(\n partial: Partial<Message> &\n Pick<Message, \"role\"> & { content?: string | null },\n): Message {\n return {\n id: `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,\n thread_id: partial.thread_id,\n role: partial.role,\n content: partial.content ?? null,\n tool_calls: partial.tool_calls,\n tool_call_id: partial.tool_call_id,\n metadata: partial.metadata,\n created_at: partial.created_at ?? new Date(),\n };\n}\n","import type { StreamEvent } from \"../core/stream-events\";\n\n/**\n * Node.js ServerResponse interface (minimal subset for type safety)\n * Note: Return types are `unknown` to support both Node.js (returns `this`)\n * and Express (returns `void`) response objects.\n */\ninterface NodeServerResponse {\n setHeader(name: string, value: string | number | readonly string[]): unknown;\n write(chunk: string | Buffer): boolean;\n end(): unknown;\n}\n\n/**\n * Create SSE response headers\n */\nexport function createSSEHeaders(): Record<string, string> {\n return {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n };\n}\n\n/**\n * Create text stream response headers\n */\nexport function createTextStreamHeaders(): Record<string, string> {\n return {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"Cache-Control\": \"no-cache\",\n };\n}\n\n/**\n * Format event as SSE data\n */\nexport function formatSSEData(event: StreamEvent): string {\n return `data: ${JSON.stringify(event)}\\n\\n`;\n}\n\n/**\n * Create a ReadableStream from an async generator of events\n */\nexport function createEventStream(\n generator: AsyncGenerator<StreamEvent>,\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n\n return new ReadableStream({\n async start(controller) {\n try {\n for await (const event of generator) {\n const data = formatSSEData(event);\n controller.enqueue(encoder.encode(data));\n }\n } catch (error) {\n // Send error event\n const errorEvent: StreamEvent = {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n };\n controller.enqueue(encoder.encode(formatSSEData(errorEvent)));\n } finally {\n // Send done event\n controller.enqueue(encoder.encode(\"data: [DONE]\\n\\n\"));\n controller.close();\n }\n },\n });\n}\n\n/**\n * Create SSE Response object\n */\nexport function createSSEResponse(\n generator: AsyncGenerator<StreamEvent>,\n options?: { headers?: Record<string, string> },\n): Response {\n return new Response(createEventStream(generator), {\n headers: {\n ...createSSEHeaders(),\n ...options?.headers,\n },\n });\n}\n\n/**\n * Create text-only stream Response (no SSE events, just text content)\n *\n * @example\n * ```typescript\n * const generator = runtime.processChatWithLoop(body);\n * return createTextStreamResponse(generator);\n * ```\n */\nexport function createTextStreamResponse(\n generator: AsyncGenerator<StreamEvent>,\n options?: { headers?: Record<string, string> },\n): Response {\n const encoder = new TextEncoder();\n\n const stream = new ReadableStream({\n async start(controller) {\n try {\n for await (const event of generator) {\n if (event.type === \"message:delta\") {\n controller.enqueue(encoder.encode(event.content));\n }\n }\n } catch (error) {\n console.error(\"[Streaming] Text stream error:\", error);\n } finally {\n controller.close();\n }\n },\n });\n\n return new Response(stream, {\n headers: {\n ...createTextStreamHeaders(),\n ...options?.headers,\n },\n });\n}\n\n/**\n * Pipe SSE stream to Node.js ServerResponse\n *\n * Standalone helper for piping streaming events directly to Express/Node.js responses.\n *\n * @example\n * ```typescript\n * // Express\n * app.post('/chat', async (req, res) => {\n * const generator = runtime.processChatWithLoop(req.body);\n * await pipeSSEToResponse(generator, res);\n * });\n * ```\n */\nexport async function pipeSSEToResponse(\n generator: AsyncGenerator<StreamEvent>,\n res: NodeServerResponse,\n options?: { headers?: Record<string, string> },\n): Promise<void> {\n // Set SSE headers\n res.setHeader(\"Content-Type\", \"text/event-stream\");\n res.setHeader(\"Cache-Control\", \"no-cache, no-transform\");\n res.setHeader(\"Connection\", \"keep-alive\");\n res.setHeader(\"X-Accel-Buffering\", \"no\");\n\n // Apply custom headers\n if (options?.headers) {\n for (const [key, value] of Object.entries(options.headers)) {\n res.setHeader(key, value);\n }\n }\n\n try {\n for await (const event of generator) {\n res.write(formatSSEData(event));\n }\n } catch (error) {\n // Send error event\n const errorEvent: StreamEvent = {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n };\n res.write(formatSSEData(errorEvent));\n } finally {\n res.write(\"data: [DONE]\\n\\n\");\n res.end();\n }\n}\n\n/**\n * Pipe text-only stream to Node.js ServerResponse\n *\n * Standalone helper for piping only text content to Express/Node.js responses.\n *\n * @example\n * ```typescript\n * // Express - text only\n * app.post('/chat', async (req, res) => {\n * const generator = runtime.processChatWithLoop(req.body);\n * await pipeTextToResponse(generator, res);\n * });\n * ```\n */\nexport async function pipeTextToResponse(\n generator: AsyncGenerator<StreamEvent>,\n res: NodeServerResponse,\n options?: { headers?: Record<string, string> },\n): Promise<void> {\n // Set text headers\n res.setHeader(\"Content-Type\", \"text/plain; charset=utf-8\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n\n // Apply custom headers\n if (options?.headers) {\n for (const [key, value] of Object.entries(options.headers)) {\n res.setHeader(key, value);\n }\n }\n\n try {\n for await (const event of generator) {\n if (event.type === \"message:delta\") {\n res.write(event.content);\n }\n }\n } finally {\n res.end();\n }\n}\n","/**\n * StreamResult - Industry-standard streaming result object\n *\n * Provides multiple ways to consume streaming responses:\n * - Web API: toResponse(), toTextResponse()\n * - Node.js/Express: pipeToResponse(), pipeTextToResponse()\n * - Collection: collect(), text()\n * - Iteration: for await...of\n *\n * @example\n * ```typescript\n * // Express - one-liner\n * app.post('/chat', async (req, res) => {\n * await runtime.stream(req.body).pipeToResponse(res);\n * });\n *\n * // Next.js\n * export async function POST(req: Request) {\n * const body = await req.json();\n * return runtime.stream(body).toResponse();\n * }\n *\n * // Collect full response\n * const { text, messages } = await runtime.stream(body).collect();\n * ```\n */\n\nimport type {\n StreamEvent,\n DoneEventMessage,\n ToolCallInfo,\n TokenUsageRaw,\n} from \"../core/stream-events\";\nimport {\n createSSEHeaders,\n formatSSEData,\n createEventStream,\n} from \"./streaming\";\n\n/**\n * Options for response methods\n */\nexport interface StreamResultOptions {\n /** Additional headers to include in response */\n headers?: Record<string, string>;\n /**\n * Include token usage in response (default: false)\n * Set to true for raw API access where you need usage data.\n * When false, usage is stripped from client-facing responses\n * but still available in onFinish callback for billing.\n */\n includeUsage?: boolean;\n}\n\n/**\n * Result passed to onFinish callback\n */\nexport interface OnFinishResult {\n /** All messages from the stream (for persistence) */\n messages: DoneEventMessage[];\n /** Token usage for billing/tracking (server-side only) */\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n}\n\n/**\n * Options for StreamResult constructor\n */\nexport interface StreamResultConstructorOptions {\n /**\n * Called after stream completes (for persistence, billing, etc.)\n * Usage data is only available server-side and is not exposed to clients.\n */\n onFinish?: (result: OnFinishResult) => Promise<void> | void;\n}\n\n/**\n * Collected result after consuming the stream\n */\nexport interface CollectedResult {\n /** Accumulated text content */\n text: string;\n /** All messages from the stream (for persistence) */\n messages: DoneEventMessage[];\n /** Tool calls that were made */\n toolCalls: ToolCallInfo[];\n /** Whether client action is required (client-side tools) */\n requiresAction: boolean;\n /** Token usage for billing/tracking */\n usage?: TokenUsageRaw;\n /** Raw events (for debugging) */\n events: StreamEvent[];\n}\n\n/**\n * Node.js ServerResponse interface (minimal subset)\n * Note: Return types are `unknown` to support both Node.js (returns `this`)\n * and Express (returns `void`) response objects.\n */\ninterface NodeServerResponse {\n setHeader(name: string, value: string | number | readonly string[]): unknown;\n write(chunk: string | Buffer): boolean;\n end(): unknown;\n}\n\n/**\n * Event handler types for the on() method\n */\ntype TextHandler = (text: string) => void;\ntype ToolCallHandler = (toolCall: ToolCallInfo) => void;\ntype DoneHandler = (result: CollectedResult) => void;\ntype ErrorHandler = (error: Error) => void;\n\n/**\n * StreamResult provides multiple ways to consume a streaming response.\n *\n * This follows the industry-standard pattern used by Vercel AI SDK,\n * OpenAI SDK, and Anthropic SDK.\n */\nexport class StreamResult {\n private generator: AsyncGenerator<StreamEvent>;\n private consumed = false;\n private eventHandlers = new Map<string, Function>();\n private onFinishCallback?: StreamResultConstructorOptions[\"onFinish\"];\n // Store usage from done event (before it's stripped for client)\n private capturedUsage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens?: number;\n };\n\n constructor(\n generator: AsyncGenerator<StreamEvent>,\n options?: StreamResultConstructorOptions,\n ) {\n this.generator = generator;\n this.onFinishCallback = options?.onFinish;\n }\n\n // ============================================\n // Async Iteration (base pattern)\n // ============================================\n\n /**\n * Iterate over stream events\n *\n * @example\n * ```typescript\n * const result = runtime.stream(body);\n * for await (const event of result) {\n * if (event.type === 'message:delta') {\n * console.log(event.content);\n * }\n * }\n * ```\n */\n [Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n this.ensureNotConsumed();\n return this.generator;\n }\n\n // ============================================\n // Web API Response Methods (Next.js, Cloudflare, Deno)\n // ============================================\n\n /**\n * Returns SSE Response for Web API frameworks\n *\n * @example\n * ```typescript\n * // Next.js App Router\n * export async function POST(req: Request) {\n * const body = await req.json();\n * return runtime.stream(body).toResponse();\n * }\n * ```\n */\n toResponse(options?: StreamResultOptions): Response {\n this.ensureNotConsumed();\n\n const headers = {\n ...createSSEHeaders(),\n ...options?.headers,\n };\n\n return new Response(createEventStream(this.generator), { headers });\n }\n\n /**\n * Alias for toResponse() - returns SSE Response\n */\n toSSEResponse(options?: StreamResultOptions): Response {\n return this.toResponse(options);\n }\n\n /**\n * Returns text-only Response (no SSE events, just text content)\n *\n * @example\n * ```typescript\n * // Simple text streaming\n * return runtime.stream(body).toTextResponse();\n * ```\n */\n toTextResponse(options?: StreamResultOptions): Response {\n this.ensureNotConsumed();\n\n const encoder = new TextEncoder();\n const generator = this.generator;\n\n const stream = new ReadableStream({\n async start(controller) {\n try {\n for await (const event of generator) {\n if (event.type === \"message:delta\") {\n controller.enqueue(encoder.encode(event.content));\n }\n }\n } catch (error) {\n console.error(\"[StreamResult] Text stream error:\", error);\n } finally {\n controller.close();\n }\n },\n });\n\n return new Response(stream, {\n headers: {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"Cache-Control\": \"no-cache\",\n ...options?.headers,\n },\n });\n }\n\n /**\n * Returns the underlying ReadableStream\n *\n * @example\n * ```typescript\n * const stream = runtime.stream(body).toReadableStream();\n * // Use with custom handling\n * ```\n */\n toReadableStream(): ReadableStream<Uint8Array> {\n this.ensureNotConsumed();\n return createEventStream(this.generator);\n }\n\n // ============================================\n // Node.js/Express Response Methods\n // ============================================\n\n /**\n * Pipe SSE stream to Node.js ServerResponse\n *\n * @example\n * ```typescript\n * // Express - one-liner\n * app.post('/chat', async (req, res) => {\n * await runtime.stream(req.body).pipeToResponse(res);\n * });\n * ```\n */\n async pipeToResponse(\n res: NodeServerResponse,\n options?: StreamResultOptions,\n ): Promise<CollectedResult> {\n this.ensureNotConsumed();\n\n // Set SSE headers\n res.setHeader(\"Content-Type\", \"text/event-stream\");\n res.setHeader(\"Cache-Control\", \"no-cache, no-transform\");\n res.setHeader(\"Connection\", \"keep-alive\");\n res.setHeader(\"X-Accel-Buffering\", \"no\");\n\n // Apply custom headers\n if (options?.headers) {\n for (const [key, value] of Object.entries(options.headers)) {\n res.setHeader(key, value);\n }\n }\n\n // Collect result while streaming\n const collected = this.createCollector();\n\n const includeUsage = options?.includeUsage ?? false;\n\n try {\n for await (const event of this.generator) {\n // Collect event (captures usage for onFinish)\n this.collectEvent(event, collected);\n\n // Call event handlers\n this.callEventHandlers(event, collected);\n\n // Write to response (conditionally strip usage from done event)\n if (!includeUsage && event.type === \"done\" && \"usage\" in event) {\n const { usage: _usage, ...clientEvent } = event;\n res.write(formatSSEData(clientEvent as StreamEvent));\n } else {\n res.write(formatSSEData(event));\n }\n }\n } catch (error) {\n // Send error event\n const errorEvent: StreamEvent = {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n };\n res.write(formatSSEData(errorEvent));\n\n // Call error handler\n const errorHandler = this.eventHandlers.get(\"error\") as ErrorHandler;\n if (errorHandler) {\n errorHandler(error instanceof Error ? error : new Error(String(error)));\n }\n } finally {\n res.write(\"data: [DONE]\\n\\n\");\n res.end();\n }\n\n // Call done handler\n const doneHandler = this.eventHandlers.get(\"done\") as DoneHandler;\n if (doneHandler) {\n doneHandler(collected);\n }\n\n // Call onFinish callback (has access to usage)\n await this.callOnFinish(collected);\n\n // Return result (strip usage unless includeUsage is true)\n return includeUsage ? collected : this.stripUsageFromResult(collected);\n }\n\n /**\n * Pipe text-only stream to Node.js ServerResponse\n *\n * @example\n * ```typescript\n * // Express - text-only streaming\n * app.post('/chat', async (req, res) => {\n * await runtime.stream(req.body).pipeTextToResponse(res);\n * });\n * ```\n */\n async pipeTextToResponse(\n res: NodeServerResponse,\n options?: StreamResultOptions,\n ): Promise<CollectedResult> {\n this.ensureNotConsumed();\n\n // Set text headers\n res.setHeader(\"Content-Type\", \"text/plain; charset=utf-8\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n\n // Apply custom headers\n if (options?.headers) {\n for (const [key, value] of Object.entries(options.headers)) {\n res.setHeader(key, value);\n }\n }\n\n // Collect result while streaming\n const collected = this.createCollector();\n\n try {\n for await (const event of this.generator) {\n // Collect event\n this.collectEvent(event, collected);\n\n // Call event handlers\n this.callEventHandlers(event, collected);\n\n // Write text content only\n if (event.type === \"message:delta\") {\n res.write(event.content);\n }\n }\n } catch (error) {\n const errorHandler = this.eventHandlers.get(\"error\") as ErrorHandler;\n if (errorHandler) {\n errorHandler(error instanceof Error ? error : new Error(String(error)));\n }\n } finally {\n res.end();\n }\n\n // Call done handler\n const doneHandler = this.eventHandlers.get(\"done\") as DoneHandler;\n if (doneHandler) {\n doneHandler(collected);\n }\n\n // Call onFinish callback (has access to usage)\n await this.callOnFinish(collected);\n\n // Return result (strip usage unless includeUsage is true)\n const includeUsage = options?.includeUsage ?? false;\n return includeUsage ? collected : this.stripUsageFromResult(collected);\n }\n\n // ============================================\n // Collection Methods\n // ============================================\n\n /**\n * Collect all events and return final result\n *\n * @example\n * ```typescript\n * // Default: usage stripped for client-facing responses\n * const { text, messages, toolCalls } = await runtime.stream(body).collect();\n *\n * // Raw: include usage for server-side processing\n * const { text, usage } = await runtime.stream(body).collect({ includeUsage: true });\n * ```\n */\n async collect(options?: StreamResultOptions): Promise<CollectedResult> {\n this.ensureNotConsumed();\n\n const collected = this.createCollector();\n\n for await (const event of this.generator) {\n this.collectEvent(event, collected);\n this.callEventHandlers(event, collected);\n }\n\n // Call done handler\n const doneHandler = this.eventHandlers.get(\"done\") as DoneHandler;\n if (doneHandler) {\n doneHandler(collected);\n }\n\n // Call onFinish callback (has access to usage)\n await this.callOnFinish(collected);\n\n // Return result (strip usage unless includeUsage is true)\n const includeUsage = options?.includeUsage ?? false;\n return includeUsage ? collected : this.stripUsageFromResult(collected);\n }\n\n /**\n * Get final text (convenience method)\n *\n * @example\n * ```typescript\n * const text = await runtime.stream(body).text();\n * ```\n */\n async text(): Promise<string> {\n const result = await this.collect();\n return result.text;\n }\n\n // ============================================\n // Event Emitter Pattern (like Anthropic SDK)\n // ============================================\n\n /**\n * Register event handler for streaming events\n *\n * @example\n * ```typescript\n * const result = runtime.stream(body)\n * .on('text', (text) => console.log('Text:', text))\n * .on('toolCall', (call) => console.log('Tool:', call.name))\n * .on('done', (result) => console.log('Final:', result.text))\n * .on('error', (err) => console.error('Error:', err));\n *\n * await result.pipeToResponse(res);\n * ```\n */\n on(event: \"text\", handler: TextHandler): this;\n on(event: \"toolCall\", handler: ToolCallHandler): this;\n on(event: \"done\", handler: DoneHandler): this;\n on(event: \"error\", handler: ErrorHandler): this;\n on(event: string, handler: Function): this {\n this.eventHandlers.set(event, handler);\n return this;\n }\n\n // ============================================\n // Internal Methods\n // ============================================\n\n /**\n * Ensure stream hasn't been consumed\n */\n private ensureNotConsumed(): void {\n if (this.consumed) {\n throw new Error(\n \"StreamResult has already been consumed. \" +\n \"Each StreamResult can only be consumed once.\",\n );\n }\n this.consumed = true;\n }\n\n /**\n * Create empty collector object\n */\n private createCollector(): CollectedResult {\n return {\n text: \"\",\n messages: [],\n toolCalls: [],\n requiresAction: false,\n usage: undefined,\n events: [],\n };\n }\n\n /**\n * Collect event into result\n */\n private collectEvent(event: StreamEvent, collected: CollectedResult): void {\n collected.events.push(event);\n\n switch (event.type) {\n case \"message:delta\":\n collected.text += event.content;\n break;\n\n case \"tool_calls\":\n collected.toolCalls.push(...event.toolCalls);\n break;\n\n case \"done\":\n if (event.messages) {\n collected.messages.push(...event.messages);\n }\n if (event.requiresAction) {\n collected.requiresAction = true;\n }\n if (event.usage) {\n // Capture usage before it might be stripped\n this.capturedUsage = event.usage;\n collected.usage = event.usage;\n }\n break;\n }\n }\n\n /**\n * Call onFinish callback with collected result\n */\n private async callOnFinish(collected: CollectedResult): Promise<void> {\n if (this.onFinishCallback) {\n try {\n const usage = this.capturedUsage;\n await this.onFinishCallback({\n messages: collected.messages,\n usage: usage\n ? {\n promptTokens: usage.prompt_tokens,\n completionTokens: usage.completion_tokens,\n totalTokens:\n usage.total_tokens ??\n usage.prompt_tokens + usage.completion_tokens,\n }\n : undefined,\n });\n } catch (error) {\n console.error(\"[StreamResult] onFinish callback error:\", error);\n }\n }\n }\n\n /**\n * Call registered event handlers\n */\n private callEventHandlers(\n event: StreamEvent,\n collected: CollectedResult,\n ): void {\n switch (event.type) {\n case \"message:delta\": {\n const textHandler = this.eventHandlers.get(\"text\") as TextHandler;\n if (textHandler) {\n textHandler(event.content);\n }\n break;\n }\n\n case \"tool_calls\": {\n const toolCallHandler = this.eventHandlers.get(\n \"toolCall\",\n ) as ToolCallHandler;\n if (toolCallHandler) {\n for (const toolCall of event.toolCalls) {\n toolCallHandler(toolCall);\n }\n }\n break;\n }\n\n case \"error\": {\n const errorHandler = this.eventHandlers.get(\"error\") as ErrorHandler;\n if (errorHandler) {\n errorHandler(new Error(event.message));\n }\n break;\n }\n }\n }\n\n /**\n * Strip usage from result (usage is server-side only for billing)\n * Client-facing APIs should not expose token usage\n */\n private stripUsageFromResult(collected: CollectedResult): CollectedResult {\n const { usage: _usage, events, ...clientResult } = collected;\n // Also strip usage from done event in events array\n const cleanedEvents = events.map((event) => {\n if (event.type === \"done\" && \"usage\" in event) {\n const { usage: _eventUsage, ...cleanEvent } = event;\n return cleanEvent as StreamEvent;\n }\n return event;\n });\n return { ...clientResult, events: cleanedEvents } as CollectedResult;\n }\n}\n\n/**\n * Create a StreamResult from an async generator\n *\n * @example\n * ```typescript\n * const result = createStreamResult(generator);\n * await result.pipeToResponse(res);\n * ```\n */\nexport function createStreamResult(\n generator: AsyncGenerator<StreamEvent>,\n): StreamResult {\n return new StreamResult(generator);\n}\n","/**\n * GenerateResult - Result from non-streaming generation\n *\n * Similar to Vercel AI SDK's generateText() result.\n * Provides both raw access and formatted response methods.\n *\n * @example\n * ```typescript\n * const result = await runtime.generate(body);\n *\n * // Raw access\n * console.log(result.text);\n * console.log(result.toolCalls);\n *\n * // CopilotChat format\n * res.json(result.toResponse());\n * ```\n */\n\nimport type { DoneEventMessage } from \"../core/stream-events\";\n\nexport interface GenerateResultData {\n text: string;\n messages: DoneEventMessage[];\n toolCalls: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n }>;\n toolResults: Array<{\n id: string;\n result: unknown;\n }>;\n requiresAction: boolean;\n error?: {\n message: string;\n code?: string;\n };\n}\n\n/**\n * Response format compatible with CopilotChat\n */\nexport interface CopilotChatResponse {\n success: boolean;\n content: string;\n messages?: DoneEventMessage[];\n toolCalls?: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n }>;\n toolResults?: Array<{\n id: string;\n result: unknown;\n }>;\n requiresAction?: boolean;\n error?: {\n message: string;\n code?: string;\n };\n}\n\n/**\n * GenerateResult - Non-streaming generation result\n */\nexport class GenerateResult {\n private data: GenerateResultData;\n\n constructor(data: GenerateResultData) {\n this.data = data;\n }\n\n /**\n * Generated text content\n */\n get text(): string {\n return this.data.text;\n }\n\n /**\n * All messages from the conversation\n */\n get messages(): DoneEventMessage[] {\n return this.data.messages;\n }\n\n /**\n * Tool calls made during generation\n */\n get toolCalls(): GenerateResultData[\"toolCalls\"] {\n return this.data.toolCalls;\n }\n\n /**\n * Results from tool executions\n */\n get toolResults(): GenerateResultData[\"toolResults\"] {\n return this.data.toolResults;\n }\n\n /**\n * Whether client action is required (e.g., tool approval)\n */\n get requiresAction(): boolean {\n return this.data.requiresAction;\n }\n\n /**\n * Error if generation failed\n */\n get error(): GenerateResultData[\"error\"] {\n return this.data.error;\n }\n\n /**\n * Whether generation was successful\n */\n get success(): boolean {\n return !this.data.error;\n }\n\n /**\n * Convert to CopilotChat-compatible JSON response\n *\n * @example\n * ```typescript\n * // Express\n * res.json(result.toResponse());\n *\n * // Next.js\n * return Response.json(result.toResponse());\n * ```\n */\n toResponse(): CopilotChatResponse {\n return {\n success: this.success,\n content: this.data.text,\n messages: this.data.messages.length > 0 ? this.data.messages : undefined,\n toolCalls:\n this.data.toolCalls.length > 0 ? this.data.toolCalls : undefined,\n toolResults:\n this.data.toolResults.length > 0 ? this.data.toolResults : undefined,\n requiresAction: this.data.requiresAction || undefined,\n error: this.data.error,\n };\n }\n\n /**\n * Convert to raw object (without methods)\n */\n toJSON(): GenerateResultData {\n return { ...this.data };\n }\n}\n","import type {\n Message,\n ActionDefinition,\n ActionParameter,\n StreamEvent,\n ToolDefinition,\n ToolCallInfo,\n AssistantToolMessage,\n DoneEventMessage,\n ToolResponse,\n AIResponseMode,\n AIContent,\n ToolContext,\n WebSearchConfig,\n} from \"../core/stream-events\";\nimport type { AIProvider } from \"../providers/types\";\nimport { createMessage } from \"../core/stream-events\";\nimport type { LLMAdapter, ChatCompletionRequest } from \"../adapters/base\";\nimport type {\n RuntimeConfig,\n ChatRequest,\n HandleRequestOptions,\n HandleRequestResult,\n GenerateOptions,\n} from \"./types\";\nimport { createSSEResponse } from \"./streaming\";\nimport { StreamResult, type CollectedResult } from \"./stream-result\";\nimport { GenerateResult } from \"./generate-result\";\n\n// ============================================\n// AI Response Control\n// ============================================\n\n/**\n * Build the content string sent to AI for a tool result.\n *\n * This function transforms tool results based on the tool's aiResponseMode and aiContext settings,\n * controlling what information the AI receives to generate its response.\n *\n * @param tool - The tool definition (may include aiResponseMode, aiContext)\n * @param result - The tool result (may include _aiResponseMode, _aiContext, _aiContent overrides)\n * @param args - The arguments passed to the tool\n * @returns The content string to send to the AI, or multimodal content array\n */\nfunction buildToolResultForAI(\n tool: ToolDefinition | undefined,\n result: ToolResponse | unknown,\n args: Record<string, unknown>,\n): string | AIContent[] {\n // Type guard for ToolResponse with AI response fields\n const typedResult = result as ToolResponse | undefined;\n\n // Determine response mode (result override > tool config > default 'full')\n const responseMode: AIResponseMode =\n typedResult?._aiResponseMode ?? tool?.aiResponseMode ?? \"full\";\n\n // Check for multimodal content (images, etc.) - always include if present\n if (typedResult?._aiContent && typedResult._aiContent.length > 0) {\n return typedResult._aiContent;\n }\n\n // Get AI context (result override > tool config > undefined)\n let aiContext: string | undefined;\n\n if (typedResult?._aiContext) {\n aiContext = typedResult._aiContext;\n } else if (tool?.aiContext) {\n aiContext =\n typeof tool.aiContext === \"function\"\n ? tool.aiContext(typedResult as ToolResponse, args)\n : tool.aiContext;\n }\n\n // Apply response mode\n switch (responseMode) {\n case \"none\":\n // Minimal message so AI knows tool executed\n return aiContext ?? \"[Result displayed to user]\";\n\n case \"brief\":\n // Use context if available, otherwise minimal acknowledgment\n return (\n aiContext ?? `[Tool ${tool?.name ?? \"unknown\"} executed successfully]`\n );\n\n case \"full\":\n default:\n // Include context as prefix if available, then full data\n const fullData = JSON.stringify(result);\n return aiContext ? `${aiContext}\\n\\nFull data: ${fullData}` : fullData;\n }\n}\n\n/**\n * Serialize tool result content for API message.\n * Handles both string and multimodal (AIContent[]) results.\n */\nfunction serializeToolResultContent(\n content: string | AIContent[],\n): string | Array<{ type: string; [key: string]: unknown }> {\n if (typeof content === \"string\") {\n return content;\n }\n\n // Convert AIContent to API format (OpenAI multimodal format)\n return content.map((item) => {\n if (item.type === \"image\") {\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${item.mediaType};base64,${item.data}`,\n },\n };\n }\n // Text content\n return {\n type: \"text\",\n text: item.text,\n };\n });\n}\n\n/**\n * Extract headers from HTTP request as a plain object\n */\nfunction extractHeaders(request?: Request): Record<string, string> {\n if (!request) return {};\n const headers: Record<string, string> = {};\n request.headers.forEach((value, key) => {\n headers[key.toLowerCase()] = value;\n });\n return headers;\n}\n\n/**\n * Build ToolContext from runtime config and HTTP request\n */\nfunction buildToolContext(\n toolCallId: string,\n signal: AbortSignal | undefined,\n threadId: string | undefined,\n httpRequest: Request | undefined,\n toolContextData: Record<string, unknown> | undefined,\n): ToolContext {\n const headers = extractHeaders(httpRequest);\n return {\n signal,\n threadId,\n toolCallId,\n headers,\n request: httpRequest\n ? {\n method: httpRequest.method,\n url: httpRequest.url,\n headers,\n }\n : undefined,\n data: toolContextData,\n };\n}\n\n/**\n * Copilot SDK Runtime\n *\n * Handles chat requests and manages LLM interactions.\n */\nexport class Runtime {\n private adapter: LLMAdapter;\n private config: RuntimeConfig;\n private actions: Map<string, ActionDefinition> = new Map();\n private tools: Map<string, ToolDefinition> = new Map();\n\n constructor(config: RuntimeConfig) {\n this.config = config;\n\n // Create adapter based on configuration type\n if (\"provider\" in config && config.provider) {\n // Use AIProvider to get adapter\n this.adapter = config.provider.languageModel(config.model);\n } else if (\"adapter\" in config && config.adapter) {\n // Direct adapter\n this.adapter = config.adapter;\n } else {\n throw new Error(\n \"Runtime requires either 'provider' or 'adapter' configuration. \" +\n \"Use: createRuntime({ provider: createOpenAI({ apiKey }), model: 'gpt-4o' })\",\n );\n }\n\n // Register actions (legacy)\n if (config.actions) {\n for (const action of config.actions) {\n this.actions.set(action.name, action);\n }\n }\n\n // Register tools\n if (config.tools) {\n for (const tool of config.tools) {\n this.tools.set(tool.name, tool);\n }\n }\n }\n\n /**\n * Process a chat request and return streaming response\n */\n async *processChat(\n request: ChatRequest,\n signal?: AbortSignal,\n ): AsyncGenerator<StreamEvent> {\n // Convert request messages to Message type\n const messages: Message[] = request.messages.map((m, i) =>\n createMessage({\n id: `msg_${i}`,\n role: m.role as Message[\"role\"],\n content: m.content,\n }),\n );\n\n // Merge actions from config and request\n const allActions = [...this.actions.values()];\n if (request.actions) {\n for (const action of request.actions) {\n if (!this.actions.has(action.name)) {\n allActions.push({\n name: action.name,\n description: action.description,\n parameters: action.parameters as ActionDefinition[\"parameters\"],\n handler: async () => {\n // Client-side action - will be handled by frontend\n return { handled: false };\n },\n });\n }\n }\n }\n\n // Create completion request\n const completionRequest: ChatCompletionRequest = {\n messages,\n actions: allActions.length > 0 ? allActions : undefined,\n systemPrompt: request.systemPrompt || this.config.systemPrompt,\n config: request.config,\n signal,\n webSearch: this.getWebSearchConfig(),\n };\n\n // Stream response from adapter\n const stream = this.adapter.stream(completionRequest);\n\n // Process events and handle tool calls\n for await (const event of stream) {\n // Handle action execution\n if (event.type === \"action:args\") {\n const action = this.actions.get(event.id);\n if (action) {\n try {\n const args = JSON.parse(event.args);\n const result = await action.handler(args);\n yield {\n type: \"action:end\",\n id: event.id,\n result,\n };\n } catch (error) {\n yield {\n type: \"action:end\",\n id: event.id,\n error: error instanceof Error ? error.message : \"Action failed\",\n };\n }\n } else {\n // Forward to client for handling\n yield event;\n }\n } else {\n yield event;\n }\n }\n }\n\n /**\n * Handle HTTP request (for use with any framework)\n *\n * @param request - The HTTP request\n * @param options - Optional configuration including onFinish callback for persistence\n *\n * @example\n * ```typescript\n * // Basic usage\n * return runtime.handleRequest(request);\n *\n * // With server-side persistence\n * return runtime.handleRequest(request, {\n * onFinish: async ({ messages, threadId }) => {\n * await db.thread.upsert({\n * where: { id: threadId },\n * update: { messages, updatedAt: new Date() },\n * create: { id: threadId, messages },\n * });\n * },\n * });\n * ```\n */\n async handleRequest(\n request: Request,\n options?: HandleRequestOptions,\n ): Promise<Response> {\n try {\n const body = (await request.json()) as ChatRequest;\n\n if (this.config.debug) {\n console.log(\"[Copilot SDK] Request:\", JSON.stringify(body, null, 2));\n }\n\n // Create abort controller from request signal\n const signal = request.signal;\n\n // Use agent loop if tools are present or explicitly enabled\n const hasTools =\n (body.tools && body.tools.length > 0) || this.tools.size > 0;\n const useAgentLoop = hasTools || this.config.agentLoop?.enabled;\n\n // NON-STREAMING: Return JSON response instead of SSE\n if (body.streaming === false) {\n return this.handleNonStreamingRequest(\n body,\n signal,\n useAgentLoop || false,\n request,\n options,\n );\n }\n\n // STREAMING: Process chat and return SSE response\n // Always use processChatWithLoop for consistent message handling\n const generator = this.processChatWithLoop(\n body,\n signal,\n undefined,\n undefined,\n request,\n );\n\n // Wrap generator to intercept done event for onFinish callback\n const wrappedGenerator = this.wrapGeneratorWithOnFinish(\n generator,\n body.threadId,\n options,\n );\n\n return createSSEResponse(wrappedGenerator);\n } catch (error) {\n console.error(\"[Copilot SDK] Error:\", error);\n\n return new Response(\n JSON.stringify({\n error: error instanceof Error ? error.message : \"Unknown error\",\n }),\n {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n }\n\n /**\n * Wrap a generator to intercept the done event and call onFinish\n */\n private async *wrapGeneratorWithOnFinish(\n generator: AsyncGenerator<StreamEvent>,\n threadId?: string,\n options?: HandleRequestOptions,\n ): AsyncGenerator<StreamEvent> {\n let doneMessages: DoneEventMessage[] | undefined;\n let doneUsage:\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens?: number;\n }\n | undefined;\n\n for await (const event of generator) {\n // Capture messages and usage from done event\n if (event.type === \"done\") {\n if (event.messages) {\n doneMessages = event.messages;\n }\n if (event.usage) {\n doneUsage = event.usage;\n }\n // Strip usage from client-facing event (usage is server-side only for billing)\n const { usage: _usage, ...clientEvent } = event;\n yield clientEvent as StreamEvent;\n } else {\n yield event;\n }\n }\n\n // Call onFinish after stream completes\n if (options?.onFinish && doneMessages) {\n try {\n const result: HandleRequestResult = {\n messages: doneMessages,\n threadId,\n usage: doneUsage\n ? {\n promptTokens: doneUsage.prompt_tokens,\n completionTokens: doneUsage.completion_tokens,\n totalTokens:\n doneUsage.total_tokens ??\n doneUsage.prompt_tokens + doneUsage.completion_tokens,\n }\n : undefined,\n };\n await options.onFinish(result);\n } catch (error) {\n console.error(\"[Copilot SDK] onFinish callback error:\", error);\n }\n }\n }\n\n /**\n * Handle non-streaming request - returns JSON instead of SSE\n */\n private async handleNonStreamingRequest(\n body: ChatRequest,\n signal: AbortSignal | undefined,\n _useAgentLoop: boolean, // Kept for backward compatibility, always uses agent loop now\n httpRequest: Request,\n options?: HandleRequestOptions,\n ): Promise<Response> {\n try {\n // Always use processChatWithLoop for consistent message handling\n const generator = this.processChatWithLoop(\n body,\n signal,\n undefined,\n undefined,\n httpRequest,\n );\n\n // Collect all events\n const events: StreamEvent[] = [];\n let content = \"\";\n const toolCalls: ToolCallInfo[] = [];\n const toolResults: Array<{ id: string; result: unknown }> = [];\n let messages: DoneEventMessage[] | undefined;\n let requiresAction = false;\n let error: { message: string; code?: string } | undefined;\n let doneUsage:\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens?: number;\n }\n | undefined;\n\n for await (const event of generator) {\n events.push(event);\n\n switch (event.type) {\n case \"message:delta\":\n content += event.content;\n break;\n case \"action:start\":\n toolCalls.push({ id: event.id, name: event.name, args: {} });\n break;\n case \"action:args\":\n const tc = toolCalls.find((t) => t.id === event.id);\n if (tc) {\n try {\n tc.args = JSON.parse(event.args || \"{}\");\n } catch {\n tc.args = {};\n }\n }\n break;\n case \"action:end\":\n toolResults.push({\n id: event.id,\n result: event.result || event.error,\n });\n break;\n case \"tool_calls\":\n // Client-side tool calls\n break;\n case \"done\":\n messages = event.messages;\n requiresAction = event.requiresAction || false;\n if (event.usage) {\n doneUsage = event.usage;\n }\n break;\n case \"error\":\n error = { message: event.message, code: event.code };\n break;\n }\n }\n\n // Call onFinish callback if provided\n if (options?.onFinish && messages && !error) {\n try {\n const result: HandleRequestResult = {\n messages,\n threadId: body.threadId,\n usage: doneUsage\n ? {\n promptTokens: doneUsage.prompt_tokens,\n completionTokens: doneUsage.completion_tokens,\n totalTokens:\n doneUsage.total_tokens ??\n doneUsage.prompt_tokens + doneUsage.completion_tokens,\n }\n : undefined,\n };\n await options.onFinish(result);\n } catch (callbackError) {\n console.error(\n \"[Copilot SDK] onFinish callback error:\",\n callbackError,\n );\n }\n }\n\n // Build JSON response\n const response = {\n success: !error,\n content,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n toolResults: toolResults.length > 0 ? toolResults : undefined,\n messages,\n requiresAction,\n error,\n // Include raw events for debugging\n _events: this.config.debug ? events : undefined,\n };\n\n console.log(\"[Copilot SDK] Non-streaming response:\", {\n contentLength: content.length,\n toolCalls: toolCalls.length,\n toolResults: toolResults.length,\n messagesCount: messages?.length,\n requiresAction,\n hasError: !!error,\n });\n\n return new Response(JSON.stringify(response), {\n status: error ? 500 : 200,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Access-Control-Allow-Origin\": \"*\",\n },\n });\n } catch (err) {\n console.error(\"[Copilot SDK] Non-streaming error:\", err);\n return new Response(\n JSON.stringify({\n success: false,\n error: {\n message: err instanceof Error ? err.message : \"Unknown error\",\n },\n }),\n {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n }\n\n /**\n * Get registered actions\n */\n getActions(): ActionDefinition[] {\n return [...this.actions.values()];\n }\n\n /**\n * Register a new action\n */\n registerAction(action: ActionDefinition): void {\n this.actions.set(action.name, action);\n }\n\n /**\n * Unregister an action\n */\n unregisterAction(name: string): void {\n this.actions.delete(name);\n }\n\n /**\n * Register a new tool\n */\n registerTool(tool: ToolDefinition): void {\n this.tools.set(tool.name, tool);\n }\n\n /**\n * Unregister a tool\n */\n unregisterTool(name: string): void {\n this.tools.delete(name);\n }\n\n /**\n * Get registered tools\n */\n getTools(): ToolDefinition[] {\n return [...this.tools.values()];\n }\n\n /**\n * Get the AI provider instance (if using provider config)\n */\n getProvider(): AIProvider | null {\n if (\"provider\" in this.config) {\n return this.config.provider as AIProvider;\n }\n return null;\n }\n\n /**\n * Get the current model ID\n */\n getModel(): string {\n if (\"provider\" in this.config) {\n return this.config.model;\n }\n return this.adapter.model;\n }\n\n /**\n * Get web search configuration from runtime config\n */\n private getWebSearchConfig(): boolean | WebSearchConfig | undefined {\n if (\"webSearch\" in this.config) {\n return this.config.webSearch;\n }\n return undefined;\n }\n\n /**\n * Process a chat request with tool support (Vercel AI SDK pattern)\n *\n * This method:\n * 1. Streams response from adapter\n * 2. Detects tool calls from streaming events\n * 3. Server-side tools are executed immediately\n * 4. Client-side tool calls are yielded for client to execute\n * 5. Loop continues until no more tool calls or max iterations reached\n * 6. Returns all new messages in the done event for client to append\n */\n async *processChatWithLoop(\n request: ChatRequest,\n signal?: AbortSignal,\n // Internal: accumulated messages from recursive calls (for returning in done event)\n _accumulatedMessages?: DoneEventMessage[],\n _isRecursive?: boolean,\n // HTTP request for extracting headers (auth context)\n _httpRequest?: Request,\n ): AsyncGenerator<StreamEvent> {\n const debug = this.config.debug || this.config.agentLoop?.debug;\n\n // Check if non-streaming mode is requested\n // Use non-streaming for better comparison with original studio-ai behavior\n if (request.streaming === false) {\n if (debug) {\n console.log(\"[Copilot SDK] Using non-streaming mode\");\n }\n // Delegate to non-streaming implementation\n for await (const event of this.processChatWithLoopNonStreaming(\n request,\n signal,\n _accumulatedMessages,\n _isRecursive,\n _httpRequest,\n )) {\n yield event;\n }\n return;\n }\n\n // Track new messages created during this request\n const newMessages: DoneEventMessage[] = _accumulatedMessages || [];\n const maxIterations = this.config.agentLoop?.maxIterations || 20;\n\n // Collect all tools (server + client from request)\n const allTools: ToolDefinition[] = [...this.tools.values()];\n\n // Add client tools from request\n if (request.tools) {\n for (const tool of request.tools) {\n allTools.push({\n name: tool.name,\n description: tool.description,\n location: \"client\",\n inputSchema: tool.inputSchema as ToolDefinition[\"inputSchema\"],\n });\n }\n }\n\n if (debug) {\n console.log(\n `[Copilot SDK] Processing chat with ${allTools.length} tools`,\n );\n // Log messages with attachments for debugging vision support\n for (let i = 0; i < request.messages.length; i++) {\n const msg = request.messages[i];\n const hasAttachments = msg.attachments && msg.attachments.length > 0;\n if (hasAttachments) {\n console.log(\n `[Copilot SDK] Message ${i} (${msg.role}) has ${msg.attachments!.length} attachments:`,\n msg.attachments!.map((a) => ({\n type: a.type,\n mimeType: a.mimeType,\n dataLength: a.data?.length || 0,\n })),\n );\n }\n }\n }\n\n // Build system prompt\n const systemPrompt = request.systemPrompt || this.config.systemPrompt || \"\";\n\n // Accumulate data from stream\n let accumulatedText = \"\";\n const toolCalls: ToolCallInfo[] = [];\n let currentToolCall: { id: string; name: string; args: string } | null =\n null;\n // Capture usage from adapter for onFinish callback (server-side only)\n let adapterUsage:\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens?: number;\n }\n | undefined;\n\n // Create completion request\n // Use rawMessages if provided (when client sends tool results in messages)\n const completionRequest: ChatCompletionRequest = {\n messages: [], // Not used when rawMessages is provided\n rawMessages: request.messages as Array<Record<string, unknown>>,\n actions: this.convertToolsToActions(allTools),\n systemPrompt: systemPrompt,\n config: request.config,\n signal,\n webSearch: this.getWebSearchConfig(),\n };\n\n // Stream from adapter\n const stream = this.adapter.stream(completionRequest);\n\n // Process stream events\n for await (const event of stream) {\n switch (event.type) {\n case \"message:start\":\n case \"message:end\":\n yield event; // Forward to client\n break;\n\n case \"message:delta\":\n accumulatedText += event.content;\n yield event; // Forward text to client\n break;\n\n case \"action:start\":\n currentToolCall = { id: event.id, name: event.name, args: \"\" };\n if (debug) {\n console.log(`[Copilot SDK] Tool call started: ${event.name}`);\n }\n yield event; // Forward to client\n break;\n\n case \"action:args\":\n if (currentToolCall) {\n try {\n const parsedArgs = JSON.parse(event.args || \"{}\");\n if (debug) {\n console.log(\n `[Copilot SDK] Tool args for ${currentToolCall.name}:`,\n parsedArgs,\n );\n }\n toolCalls.push({\n id: currentToolCall.id,\n name: currentToolCall.name,\n args: parsedArgs,\n });\n } catch (e) {\n console.error(\n \"[Copilot SDK] Failed to parse tool args:\",\n event.args,\n e,\n );\n toolCalls.push({\n id: currentToolCall.id,\n name: currentToolCall.name,\n args: {},\n });\n }\n currentToolCall = null;\n }\n yield event; // Forward to client\n break;\n\n case \"citation\":\n // Forward web search citations to client\n yield event;\n break;\n\n case \"error\":\n yield event;\n return; // Exit on error\n\n case \"done\":\n // Capture usage from adapter's done event (for onFinish callback)\n // We don't yield done yet - we need to check for tool calls first\n if (event.usage) {\n adapterUsage = event.usage;\n }\n break;\n\n default:\n yield event;\n }\n }\n\n // Check if we got tool calls\n if (toolCalls.length > 0) {\n if (debug) {\n console.log(\n `[Copilot SDK] Detected ${toolCalls.length} tool calls:`,\n toolCalls.map((t) => t.name),\n );\n }\n\n // Separate server-side and client-side tool calls\n const serverToolCalls: ToolCallInfo[] = [];\n const clientToolCalls: ToolCallInfo[] = [];\n\n for (const tc of toolCalls) {\n const tool = allTools.find((t) => t.name === tc.name);\n if (tool?.location === \"server\" && tool.handler) {\n serverToolCalls.push(tc);\n } else {\n clientToolCalls.push(tc);\n }\n }\n\n // Execute server-side tools\n const serverToolResults: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n result: unknown;\n tool: ToolDefinition;\n }> = [];\n\n // Get toolContext from config (if available)\n const toolContextData =\n \"toolContext\" in this.config ? this.config.toolContext : undefined;\n\n for (const tc of serverToolCalls) {\n const tool = allTools.find((t) => t.name === tc.name);\n if (tool?.handler) {\n if (debug) {\n console.log(`[Copilot SDK] Executing server-side tool: ${tc.name}`);\n }\n\n // Build rich context for the tool handler\n const toolContext = buildToolContext(\n tc.id,\n signal,\n request.threadId,\n _httpRequest,\n toolContextData,\n );\n\n try {\n const result = await tool.handler(tc.args, toolContext);\n serverToolResults.push({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n result,\n tool,\n });\n\n yield {\n type: \"action:end\",\n id: tc.id,\n result,\n } as StreamEvent;\n } catch (error) {\n const errorResult = {\n success: false,\n error:\n error instanceof Error\n ? error.message\n : \"Tool execution failed\",\n };\n serverToolResults.push({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n result: errorResult,\n tool,\n });\n\n yield {\n type: \"action:end\",\n id: tc.id,\n error:\n error instanceof Error\n ? error.message\n : \"Tool execution failed\",\n } as StreamEvent;\n }\n }\n }\n\n // If there are server-side tools executed, continue the loop by making another LLM call\n if (serverToolResults.length > 0) {\n if (debug) {\n console.log(\n `[Copilot SDK] Server tools executed, continuing conversation...`,\n );\n }\n\n // Create assistant message with tool_calls\n const assistantWithToolCalls: DoneEventMessage = {\n role: \"assistant\",\n content: accumulatedText || null,\n tool_calls: serverToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n\n // Create tool result messages (using buildToolResultForAI for AI response control)\n const toolResultMessages: DoneEventMessage[] = serverToolResults.map(\n (tr) => {\n const aiContent = buildToolResultForAI(tr.tool, tr.result, tr.args);\n // Serialize content (handles both string and multimodal)\n const content =\n typeof aiContent === \"string\"\n ? aiContent\n : JSON.stringify(serializeToolResultContent(aiContent));\n return {\n role: \"tool\" as const,\n content,\n tool_call_id: tr.id,\n };\n },\n );\n\n // Add to accumulated messages for client\n newMessages.push(assistantWithToolCalls);\n newMessages.push(...toolResultMessages);\n\n // Build messages for next LLM call (cast DoneEventMessage to Record for request)\n const messagesWithResults: Array<Record<string, unknown>> = [\n ...(request.messages as Array<Record<string, unknown>>),\n assistantWithToolCalls as unknown as Record<string, unknown>,\n ...(toolResultMessages as unknown as Array<Record<string, unknown>>),\n ];\n\n // Make recursive call with updated messages\n const nextRequest: ChatRequest = {\n ...request,\n messages: messagesWithResults as ChatRequest[\"messages\"],\n };\n\n // Continue the agent loop - pass accumulated messages and HTTP request\n for await (const event of this.processChatWithLoop(\n nextRequest,\n signal,\n newMessages,\n true, // Mark as recursive\n _httpRequest,\n )) {\n yield event;\n }\n return;\n }\n\n // If there are client-side tools, send them to client\n if (clientToolCalls.length > 0) {\n // Build assistant message with tool_calls for client to include in next request\n const assistantMessage: AssistantToolMessage = {\n role: \"assistant\",\n content: accumulatedText || null,\n tool_calls: clientToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n\n // Add to accumulated messages (cast to DoneEventMessage since structure matches)\n newMessages.push(assistantMessage as DoneEventMessage);\n\n // Yield tool_calls event (Vercel AI SDK pattern)\n yield {\n type: \"tool_calls\",\n toolCalls: clientToolCalls,\n assistantMessage,\n } as StreamEvent;\n\n // Signal that client needs to execute tools and send results\n // Include accumulated messages so client can update state\n // Include usage for onFinish callback (will be stripped before sending to client)\n yield {\n type: \"done\",\n requiresAction: true,\n messages: newMessages,\n usage: adapterUsage,\n } as StreamEvent;\n return;\n }\n }\n\n // No tool calls - add final assistant message and we're done\n if (accumulatedText) {\n newMessages.push({\n role: \"assistant\" as const,\n content: accumulatedText,\n });\n }\n\n if (debug) {\n console.log(\n `[Copilot SDK] Stream complete, returning ${newMessages.length} new messages`,\n );\n }\n\n // Return all accumulated messages for client to append\n // Include usage for onFinish callback (will be stripped before sending to client)\n yield {\n type: \"done\",\n messages: newMessages.length > 0 ? newMessages : undefined,\n usage: adapterUsage,\n } as StreamEvent;\n }\n\n /**\n * Non-streaming agent loop implementation\n *\n * Uses adapter.complete() instead of stream() for:\n * - Better comparison with original studio-ai behavior\n * - Easier debugging (full response at once)\n * - More predictable retry behavior\n */\n private async *processChatWithLoopNonStreaming(\n request: ChatRequest,\n signal?: AbortSignal,\n _accumulatedMessages?: DoneEventMessage[],\n _isRecursive?: boolean,\n _httpRequest?: Request,\n ): AsyncGenerator<StreamEvent> {\n const newMessages: DoneEventMessage[] = _accumulatedMessages || [];\n const debug = this.config.debug || this.config.agentLoop?.debug;\n const maxIterations = this.config.agentLoop?.maxIterations || 20;\n // Track accumulated usage across iterations (for onFinish callback)\n let accumulatedUsage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n } = { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 };\n\n // Collect all tools (server + client from request)\n const allTools: ToolDefinition[] = [...this.tools.values()];\n\n // Add client tools from request\n if (request.tools) {\n for (const tool of request.tools) {\n allTools.push({\n name: tool.name,\n description: tool.description,\n location: \"client\",\n inputSchema: tool.inputSchema as ToolDefinition[\"inputSchema\"],\n });\n }\n }\n\n // Build system prompt\n const systemPrompt = request.systemPrompt || this.config.systemPrompt || \"\";\n\n // Main agent loop\n let iteration = 0;\n let conversationMessages = request.messages as Array<\n Record<string, unknown>\n >;\n\n while (iteration < maxIterations) {\n iteration++;\n\n if (debug) {\n console.log(`[Copilot SDK] Iteration ${iteration}/${maxIterations}`);\n }\n\n // Check for abort\n if (signal?.aborted) {\n yield {\n type: \"error\",\n message: \"Aborted\",\n code: \"ABORTED\",\n } as StreamEvent;\n return;\n }\n\n // Check if adapter supports non-streaming\n if (!this.adapter.complete) {\n if (debug) {\n console.log(\n \"[Copilot SDK] Adapter does not support non-streaming, falling back to streaming\",\n );\n }\n // Fall back to streaming by delegating to the streaming implementation\n // But set streaming to true to avoid infinite loop\n const streamingRequest = { ...request, streaming: true };\n for await (const event of this.processChatWithLoop(\n streamingRequest,\n signal,\n _accumulatedMessages,\n _isRecursive,\n _httpRequest,\n )) {\n yield event;\n }\n return;\n }\n\n // Create completion request\n const completionRequest: ChatCompletionRequest = {\n messages: [],\n rawMessages: conversationMessages,\n actions: this.convertToolsToActions(allTools),\n systemPrompt: systemPrompt,\n config: request.config,\n signal,\n webSearch: this.getWebSearchConfig(),\n };\n\n try {\n // Call the non-streaming complete method\n const result = await this.adapter.complete(completionRequest);\n\n // Capture usage from adapter response (convert camelCase to snake_case)\n if (result.usage) {\n accumulatedUsage.prompt_tokens += result.usage.promptTokens;\n accumulatedUsage.completion_tokens += result.usage.completionTokens;\n accumulatedUsage.total_tokens += result.usage.totalTokens;\n }\n\n if (debug) {\n console.log(\n `[Copilot SDK] Got response: ${result.content.length} chars, ${result.toolCalls.length} tool calls`,\n );\n }\n\n // Emit message events (for SSE compatibility)\n yield { type: \"message:start\", id: `msg_${Date.now()}` } as StreamEvent;\n if (result.content) {\n yield {\n type: \"message:delta\",\n content: result.content,\n } as StreamEvent;\n }\n yield { type: \"message:end\" } as StreamEvent;\n\n // Check for tool calls\n if (result.toolCalls.length > 0) {\n // Separate server and client tools\n const serverToolCalls: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n }> = [];\n const clientToolCalls: ToolCallInfo[] = [];\n\n for (const tc of result.toolCalls) {\n const tool = allTools.find((t) => t.name === tc.name);\n if (tool?.location === \"server\" && tool.handler) {\n serverToolCalls.push(tc);\n } else {\n clientToolCalls.push({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n });\n }\n }\n\n // Emit tool call events\n for (const tc of result.toolCalls) {\n yield {\n type: \"action:start\",\n id: tc.id,\n name: tc.name,\n } as StreamEvent;\n yield {\n type: \"action:args\",\n id: tc.id,\n args: JSON.stringify(tc.args),\n } as StreamEvent;\n }\n\n // Execute server-side tools\n const serverToolResults: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n result: unknown;\n tool: ToolDefinition;\n }> = [];\n\n // Get toolContext from config (if available)\n const toolContextData =\n \"toolContext\" in this.config ? this.config.toolContext : undefined;\n\n for (const tc of serverToolCalls) {\n const tool = allTools.find((t) => t.name === tc.name);\n if (tool?.handler) {\n if (debug) {\n console.log(`[Copilot SDK] Executing tool: ${tc.name}`);\n }\n\n // Build rich context for the tool handler\n const toolContext = buildToolContext(\n tc.id,\n signal,\n request.threadId,\n _httpRequest,\n toolContextData,\n );\n\n try {\n const toolResult = await tool.handler(tc.args, toolContext);\n serverToolResults.push({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n result: toolResult,\n tool,\n });\n yield {\n type: \"action:end\",\n id: tc.id,\n result: toolResult,\n } as StreamEvent;\n } catch (error) {\n const errorResult = {\n success: false,\n error:\n error instanceof Error\n ? error.message\n : \"Tool execution failed\",\n };\n serverToolResults.push({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n result: errorResult,\n tool,\n });\n yield {\n type: \"action:end\",\n id: tc.id,\n error:\n error instanceof Error\n ? error.message\n : \"Tool execution failed\",\n } as StreamEvent;\n }\n }\n }\n\n // If server tools were executed, continue the loop\n if (serverToolResults.length > 0) {\n // Build assistant message with tool_calls\n const assistantWithToolCalls: DoneEventMessage = {\n role: \"assistant\",\n content: result.content || null,\n tool_calls: result.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n\n // Build tool result messages (using buildToolResultForAI for AI response control)\n const toolResultMessages: DoneEventMessage[] =\n serverToolResults.map((tr) => {\n const aiContent = buildToolResultForAI(\n tr.tool,\n tr.result,\n tr.args,\n );\n const content =\n typeof aiContent === \"string\"\n ? aiContent\n : JSON.stringify(serializeToolResultContent(aiContent));\n return {\n role: \"tool\" as const,\n content,\n tool_call_id: tr.id,\n };\n });\n\n // Add to accumulated messages\n newMessages.push(assistantWithToolCalls);\n newMessages.push(...toolResultMessages);\n\n // Update conversation for next iteration\n conversationMessages = [\n ...conversationMessages,\n assistantWithToolCalls as unknown as Record<string, unknown>,\n ...(toolResultMessages as unknown as Array<\n Record<string, unknown>\n >),\n ];\n\n // Continue loop\n continue;\n }\n\n // Client tools - yield for client to execute and return\n if (clientToolCalls.length > 0) {\n const assistantMessage: AssistantToolMessage = {\n role: \"assistant\",\n content: result.content || null,\n tool_calls: clientToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n\n newMessages.push(assistantMessage as DoneEventMessage);\n\n yield {\n type: \"tool_calls\",\n toolCalls: clientToolCalls,\n assistantMessage,\n } as StreamEvent;\n\n yield {\n type: \"done\",\n requiresAction: true,\n messages: newMessages,\n usage:\n accumulatedUsage.total_tokens > 0\n ? accumulatedUsage\n : undefined,\n } as StreamEvent;\n return;\n }\n }\n\n // No tool calls - we're done\n if (result.content) {\n newMessages.push({\n role: \"assistant\" as const,\n content: result.content,\n });\n }\n\n if (debug) {\n console.log(`[Copilot SDK] Complete after ${iteration} iterations`);\n }\n\n yield {\n type: \"done\",\n messages: newMessages.length > 0 ? newMessages : undefined,\n usage:\n accumulatedUsage.total_tokens > 0 ? accumulatedUsage : undefined,\n } as StreamEvent;\n return;\n } catch (error) {\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"COMPLETION_ERROR\",\n } as StreamEvent;\n return;\n }\n }\n\n // Max iterations reached\n if (debug) {\n console.log(`[Copilot SDK] Max iterations (${maxIterations}) reached`);\n }\n\n yield {\n type: \"done\",\n messages: newMessages.length > 0 ? newMessages : undefined,\n usage: accumulatedUsage.total_tokens > 0 ? accumulatedUsage : undefined,\n } as StreamEvent;\n }\n\n /**\n * Convert tools to legacy action format (for adapter compatibility)\n */\n private convertToolsToActions(tools: ToolDefinition[]): ActionDefinition[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: this.convertInputSchemaToParameters(tool.inputSchema),\n handler: tool.handler || (async () => ({ handled: false })),\n }));\n }\n\n /**\n * Convert JSON Schema property to ActionParameter format recursively\n */\n private convertSchemaProperty(prop: unknown): ActionParameter {\n const p = prop as {\n type?: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n };\n\n type ParamType = \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\n const typeMap: Record<string, ParamType> = {\n string: \"string\",\n number: \"number\",\n integer: \"number\",\n boolean: \"boolean\",\n object: \"object\",\n array: \"array\",\n };\n\n const result: ActionParameter = {\n type: typeMap[p.type || \"string\"] || \"string\",\n };\n\n if (p.description) {\n result.description = p.description;\n }\n\n if (p.enum) {\n result.enum = p.enum;\n }\n\n // Preserve items for array types\n if (p.type === \"array\" && p.items) {\n result.items = this.convertSchemaProperty(p.items);\n }\n\n // Preserve properties for object types\n if (p.type === \"object\" && p.properties) {\n result.properties = Object.fromEntries(\n Object.entries(p.properties).map(([key, val]) => [\n key,\n this.convertSchemaProperty(val),\n ]),\n );\n }\n\n return result;\n }\n\n /**\n * Convert JSON Schema to legacy parameters format\n */\n private convertInputSchemaToParameters(\n schema: ToolDefinition[\"inputSchema\"],\n ): Record<string, ActionParameter> {\n const parameters: Record<string, ActionParameter> = {};\n\n if (!schema?.properties) {\n return parameters;\n }\n\n for (const [name, prop] of Object.entries(schema.properties)) {\n const converted = this.convertSchemaProperty(prop);\n parameters[name] = {\n ...converted,\n required: schema.required?.includes(name),\n };\n }\n\n return parameters;\n }\n\n // ============================================\n // StreamResult API (Industry Standard Pattern)\n // ============================================\n\n /**\n * Stream chat and return StreamResult with helper methods\n *\n * This is the recommended API for new projects. It returns a StreamResult\n * object with multiple ways to consume the response:\n * - `pipeToResponse(res)` for Express/Node.js\n * - `toResponse()` for Next.js/Web API\n * - `collect()` for non-streaming use cases\n *\n * @example\n * ```typescript\n * // Express - one-liner\n * app.post('/chat', async (req, res) => {\n * await runtime.stream(req.body).pipeToResponse(res);\n * });\n *\n * // Next.js App Router\n * export async function POST(req: Request) {\n * const body = await req.json();\n * return runtime.stream(body).toResponse();\n * }\n *\n * // With event handlers\n * const result = runtime.stream(body)\n * .on('text', (text) => console.log(text))\n * .on('done', (result) => console.log('Done:', result.text));\n * await result.pipeToResponse(res);\n *\n * // With onFinish for usage tracking\n * await runtime.stream(body, {\n * onFinish: ({ messages, usage }) => {\n * console.log('Tokens used:', usage?.totalTokens);\n * }\n * }).pipeToResponse(res);\n * ```\n */\n stream(\n request: ChatRequest,\n options?: {\n signal?: AbortSignal;\n /**\n * Called after stream completes (for persistence, billing, etc.)\n * Usage data is only available server-side and is not exposed to clients.\n */\n onFinish?: (result: {\n messages: DoneEventMessage[];\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n }) => Promise<void> | void;\n },\n ): StreamResult {\n const generator = this.processChatWithLoop(request, options?.signal);\n return new StreamResult(generator, { onFinish: options?.onFinish });\n }\n\n /**\n * Chat and collect the full response (non-streaming)\n *\n * Convenience method that calls stream().collect() for you.\n * Use this when you need the complete response before responding.\n *\n * @example\n * ```typescript\n * const { text, messages, toolCalls } = await runtime.chat(body);\n * console.log('Response:', text);\n * res.json({ response: text });\n *\n * // Usage is included in result - strip before sending to client\n * const { usage, ...clientResult } = await runtime.chat(body);\n * await billing.record(usage);\n * res.json(clientResult);\n * ```\n */\n async chat(\n request: ChatRequest,\n options?: {\n signal?: AbortSignal;\n },\n ): Promise<CollectedResult> {\n // Usage is included in result - user can strip before sending to client\n return this.stream(request, { signal: options?.signal }).collect({\n includeUsage: true,\n });\n }\n\n /**\n * Generate a complete response (non-streaming)\n *\n * Like Vercel AI SDK's generateText() - clean, non-streaming API.\n * Returns GenerateResult with .toResponse() for CopilotChat format.\n *\n * @example\n * ```typescript\n * // Simple usage\n * const result = await runtime.generate(body);\n * console.log(result.text);\n *\n * // CopilotChat format response (Express)\n * res.json(result.toResponse());\n *\n * // CopilotChat format response (Next.js)\n * return Response.json(result.toResponse());\n *\n * // With persistence callback\n * const result = await runtime.generate(body, {\n * onFinish: async ({ messages }) => {\n * await db.saveMessages(messages);\n * },\n * });\n * ```\n */\n async generate(\n request: ChatRequest,\n options?: GenerateOptions,\n ): Promise<GenerateResult> {\n const generator = this.processChatWithLoop(\n { ...request, streaming: false },\n options?.signal,\n undefined,\n undefined,\n options?.httpRequest,\n );\n\n let text = \"\";\n const toolCalls: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n }> = [];\n const toolResults: Array<{ id: string; result: unknown }> = [];\n let messages: DoneEventMessage[] = [];\n let requiresAction = false;\n let error: { message: string; code?: string } | undefined;\n\n try {\n for await (const event of generator) {\n switch (event.type) {\n case \"message:delta\":\n text += event.content;\n break;\n case \"action:start\":\n toolCalls.push({ id: event.id, name: event.name, args: {} });\n break;\n case \"action:args\": {\n const tc = toolCalls.find((t) => t.id === event.id);\n if (tc) {\n try {\n tc.args = JSON.parse(event.args || \"{}\");\n } catch {\n tc.args = {};\n }\n }\n break;\n }\n case \"action:end\":\n toolResults.push({\n id: event.id,\n result: event.result || event.error,\n });\n break;\n case \"done\":\n messages = event.messages || [];\n requiresAction = event.requiresAction || false;\n break;\n case \"error\":\n error = { message: event.message, code: event.code };\n break;\n }\n }\n } catch (err) {\n error = {\n message: err instanceof Error ? err.message : \"Unknown error\",\n code: \"GENERATION_ERROR\",\n };\n }\n\n // Call onFinish callback if provided and no error\n if (options?.onFinish && messages.length > 0 && !error) {\n try {\n await options.onFinish({\n messages,\n threadId: request.threadId,\n });\n } catch (callbackError) {\n console.error(\n \"[Copilot SDK] generate() onFinish callback error:\",\n callbackError,\n );\n }\n }\n\n return new GenerateResult({\n text,\n messages,\n toolCalls,\n toolResults,\n requiresAction,\n error,\n });\n }\n\n /**\n * Create Express-compatible handler middleware\n *\n * Returns a function that can be used directly as Express middleware.\n *\n * @example\n * ```typescript\n * // Simple usage\n * app.post('/chat', runtime.expressHandler());\n *\n * // With options\n * app.post('/chat', runtime.expressHandler({ format: 'text' }));\n * ```\n */\n expressHandler(options?: {\n /** Response format: 'sse' (default) or 'text' */\n format?: \"sse\" | \"text\";\n /** Additional headers to include */\n headers?: Record<string, string>;\n }) {\n return async (\n req: { body: ChatRequest },\n res: {\n setHeader(name: string, value: string): void;\n write(chunk: string): boolean;\n end(): void;\n status(code: number): { json(data: unknown): void };\n },\n ) => {\n try {\n const result = this.stream(req.body);\n\n if (options?.format === \"text\") {\n await result.pipeTextToResponse(res, { headers: options?.headers });\n } else {\n await result.pipeToResponse(res, { headers: options?.headers });\n }\n } catch (error) {\n console.error(\"[Runtime] Express handler error:\", error);\n res.status(500).json({\n error: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n };\n }\n}\n\n/**\n * Create runtime instance\n */\nexport function createRuntime(config: RuntimeConfig): Runtime {\n return new Runtime(config);\n}\n","import { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport type { Runtime } from \"./runtime\";\nimport type { RuntimeConfig } from \"./types\";\nimport { createRuntime } from \"./runtime\";\nimport { createSSEResponse } from \"./streaming\";\n\n/**\n * Create Hono app with chat endpoint\n */\nexport function createHonoApp(runtime: Runtime): Hono {\n const app = new Hono();\n\n // Enable CORS\n app.use(\"*\", cors());\n\n // Health check\n app.get(\"/\", (c) => {\n return c.json({ status: \"ok\", provider: \"yourgpt-copilot\" });\n });\n\n // Chat endpoint at root (for Next.js App Router mounting)\n // e.g., mounted at /api/chat/openai → POST /api/chat/openai works\n app.post(\"/\", async (c) => {\n const request = c.req.raw;\n return runtime.handleRequest(request);\n });\n\n // Chat endpoint (standard - single turn)\n // Also available at /chat sub-path for flexibility\n app.post(\"/chat\", async (c) => {\n const request = c.req.raw;\n return runtime.handleRequest(request);\n });\n\n // Chat endpoint with agent loop (multi-turn with tools)\n // Note: With Vercel AI SDK pattern, this is the same as /chat\n // Client sends tool results in messages, server doesn't wait\n app.post(\"/chat/loop\", async (c) => {\n try {\n const body = await c.req.json();\n const signal = c.req.raw.signal;\n\n // Process with tool support\n const generator = runtime.processChatWithLoop(body, signal);\n return createSSEResponse(generator);\n } catch (error) {\n return c.json(\n { error: error instanceof Error ? error.message : \"Unknown error\" },\n 500,\n );\n }\n });\n\n // Get available actions (legacy)\n app.get(\"/actions\", (c) => {\n const actions = runtime.getActions().map((a) => ({\n name: a.name,\n description: a.description,\n parameters: a.parameters,\n }));\n return c.json({ actions });\n });\n\n // Get available tools (new)\n app.get(\"/tools\", (c) => {\n const tools = runtime.getTools().map((t) => ({\n name: t.name,\n description: t.description,\n location: t.location,\n inputSchema: t.inputSchema,\n }));\n return c.json({ tools });\n });\n\n // Get model capabilities (for UI feature flags)\n app.get(\"/capabilities\", (c) => {\n const provider = runtime.getProvider();\n const model = runtime.getModel();\n\n if (provider) {\n const capabilities = provider.getCapabilities(model);\n return c.json({\n provider: provider.name,\n model,\n capabilities,\n supportedModels: provider.supportedModels,\n });\n }\n\n // Fallback for legacy config (no provider instance)\n return c.json({\n provider: \"unknown\",\n model,\n capabilities: {\n supportsVision: false,\n supportsTools: true,\n supportsThinking: false,\n supportsStreaming: true,\n supportsPDF: false,\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: 8192,\n supportedImageTypes: [],\n supportsJsonMode: false,\n supportsSystemMessages: true,\n },\n supportedModels: [],\n });\n });\n\n return app;\n}\n\n/**\n * Next.js App Router handler\n *\n * For simple Next.js routes, prefer using `streamText()` directly:\n * @example\n * ```ts\n * // app/api/chat/route.ts (RECOMMENDED)\n * import { streamText } from '@yourgpt/llm-sdk';\n * import { openai } from '@yourgpt/llm-sdk/openai';\n *\n * export async function POST(req: Request) {\n * const { messages } = await req.json();\n * const result = await streamText({\n * model: openai('gpt-4o'),\n * system: 'You are a helpful assistant.',\n * messages,\n * });\n * return result.toTextStreamResponse();\n * }\n * ```\n *\n * Use createNextHandler when you need runtime features like tools:\n * @example\n * ```ts\n * // app/api/chat/route.ts\n * import { createNextHandler } from '@yourgpt/llm-sdk';\n * import { createOpenAI } from '@yourgpt/llm-sdk/openai';\n *\n * export const POST = createNextHandler({\n * provider: createOpenAI({ apiKey: process.env.OPENAI_API_KEY! }),\n * model: 'gpt-4o',\n * systemPrompt: 'You are a helpful assistant.',\n * });\n * ```\n */\nexport function createNextHandler(config: RuntimeConfig) {\n const runtime = createRuntime(config);\n\n return async function handler(request: Request): Promise<Response> {\n return runtime.handleRequest(request);\n };\n}\n\n/**\n * Express middleware (Simplified with StreamResult)\n *\n * Creates an Express-compatible middleware that uses the new StreamResult API.\n * Much simpler internally - no more manual request/response conversion.\n *\n * @example\n * ```ts\n * import express from 'express';\n * import { createExpressMiddleware } from '@yourgpt/llm-sdk';\n * import { createOpenAI } from '@yourgpt/llm-sdk/openai';\n *\n * const app = express();\n * app.use(express.json());\n *\n * // Simple usage\n * app.post('/api/chat', createExpressMiddleware({\n * provider: createOpenAI({ apiKey: process.env.OPENAI_API_KEY }),\n * model: 'gpt-4o',\n * }));\n *\n * // With options\n * app.post('/api/chat', createExpressMiddleware({\n * provider: createOpenAI({ apiKey: process.env.OPENAI_API_KEY }),\n * model: 'gpt-4o',\n * }, { format: 'text' }));\n * ```\n */\nexport function createExpressMiddleware(\n config: RuntimeConfig,\n options?: {\n /** Response format: 'sse' (default) or 'text' */\n format?: \"sse\" | \"text\";\n /** Additional headers to include */\n headers?: Record<string, string>;\n },\n) {\n const runtime = createRuntime(config);\n\n // Express response type - more permissive to work with different Express versions\n type ExpressResponse = {\n status: (code: number) => { json: (data: unknown) => void };\n setHeader: (\n name: string,\n value: string | number | readonly string[],\n ) => unknown;\n write: (data: string | Buffer) => boolean;\n end: () => unknown;\n };\n\n return async (req: { body: unknown }, res: ExpressResponse) => {\n try {\n // Use the new StreamResult API - much simpler!\n const result = runtime.stream(req.body as import(\"./types\").ChatRequest);\n\n // Cast to the interface expected by pipeToResponse\n // This is safe because Express response satisfies these methods\n const nodeRes = res as unknown as {\n setHeader(\n name: string,\n value: string | number | readonly string[],\n ): void;\n write(chunk: string | Buffer): boolean;\n end(): void;\n };\n\n if (options?.format === \"text\") {\n await result.pipeTextToResponse(nodeRes, { headers: options?.headers });\n } else {\n await result.pipeToResponse(nodeRes, { headers: options?.headers });\n }\n } catch (error) {\n console.error(\"[Express Middleware] Error:\", error);\n res.status(500).json({\n error: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n };\n}\n\n/**\n * Create Express handler from existing Runtime instance\n *\n * Use this when you already have a Runtime instance and want to create\n * an Express handler from it.\n *\n * @example\n * ```ts\n * import express from 'express';\n * import { createRuntime, createExpressHandler } from '@yourgpt/llm-sdk';\n * import { createOpenAI } from '@yourgpt/llm-sdk/openai';\n *\n * const runtime = createRuntime({\n * provider: createOpenAI({ apiKey: process.env.OPENAI_API_KEY }),\n * model: 'gpt-4o',\n * });\n *\n * const app = express();\n * app.use(express.json());\n *\n * // Use with existing runtime\n * app.post('/api/chat', createExpressHandler(runtime));\n *\n * // Or use runtime.expressHandler() directly\n * app.post('/api/chat', runtime.expressHandler());\n * ```\n */\nexport function createExpressHandler(\n runtime: Runtime,\n options?: {\n format?: \"sse\" | \"text\";\n headers?: Record<string, string>;\n },\n) {\n return runtime.expressHandler(options);\n}\n\n/**\n * Node.js HTTP handler\n *\n * @example\n * ```ts\n * import http from 'http';\n * import { createNodeHandler } from '@yourgpt/llm-sdk';\n * import { createOpenAI } from '@yourgpt/llm-sdk/openai';\n *\n * const handler = createNodeHandler({\n * provider: createOpenAI({ apiKey: process.env.OPENAI_API_KEY! }),\n * model: 'gpt-4o',\n * systemPrompt: 'You are a helpful assistant.',\n * });\n *\n * const server = http.createServer(handler);\n * server.listen(3001);\n * ```\n */\nexport function createNodeHandler(config: RuntimeConfig) {\n const runtime = createRuntime(config);\n const app = createHonoApp(runtime);\n\n return app.fetch;\n}\n","/**\n * Utility functions for llm-sdk\n */\n\n/**\n * Generate a unique ID with optional prefix\n */\nexport function generateId(prefix = \"id\"): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Generate a message ID\n */\nexport function generateMessageId(): string {\n return generateId(\"msg\");\n}\n\n/**\n * Generate a conversation/thread ID\n */\nexport function generateThreadId(): string {\n return generateId(\"thread\");\n}\n\n/**\n * Generate a tool call ID\n */\nexport function generateToolCallId(): string {\n return generateId(\"call\");\n}\n","/**\n * OpenAI Provider Formatter\n *\n * Transformation functions for OpenAI API format\n * Also used by xAI/Grok (they use OpenAI-compatible format)\n */\n\nimport type {\n ToolDefinition,\n UnifiedToolCall,\n UnifiedToolResult,\n} from \"../core/stream-events\";\nimport type {\n ProviderFormatter,\n OpenAITool,\n OpenAIToolCall,\n OpenAIToolResult,\n} from \"./types\";\n\n// ========================================\n// Tool Definition Transformation\n// ========================================\n\n/**\n * Transform unified tool definitions to OpenAI format\n */\nexport function transformTools(tools: ToolDefinition[]): OpenAITool[] {\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }));\n}\n\n// ========================================\n// Response Parsing\n// ========================================\n\n/**\n * Parse tool calls from OpenAI response\n */\nexport function parseToolCalls(response: unknown): UnifiedToolCall[] {\n const resp = response as Record<string, unknown>;\n const choices = resp?.choices as Array<Record<string, unknown>> | undefined;\n const message = choices?.[0]?.message as Record<string, unknown> | undefined;\n const toolCalls = (message?.tool_calls as OpenAIToolCall[]) || [];\n\n return toolCalls.map((tc) => {\n let input: Record<string, unknown> = {};\n try {\n input = JSON.parse(tc.function.arguments);\n } catch (e) {\n console.error(\n \"Failed to parse tool arguments:\",\n tc.function.arguments,\n e,\n );\n }\n return {\n id: tc.id,\n name: tc.function.name,\n input,\n };\n });\n}\n\n/**\n * Extract text content from OpenAI response\n */\nexport function extractTextContent(response: unknown): string {\n const resp = response as Record<string, unknown>;\n const choices = resp?.choices as Array<Record<string, unknown>> | undefined;\n const message = choices?.[0]?.message as Record<string, unknown> | undefined;\n return (message?.content as string) || \"\";\n}\n\n// ========================================\n// Tool Result Formatting\n// ========================================\n\n/**\n * Format tool results for OpenAI\n */\nexport function formatToolResults(\n results: UnifiedToolResult[],\n): OpenAIToolResult[] {\n return results.map((r) => ({\n role: \"tool\" as const,\n tool_call_id: r.toolCallId,\n content: r.content,\n }));\n}\n\n// ========================================\n// Stop Reason Detection\n// ========================================\n\n/**\n * Check if response indicates the AI wants to use tools\n */\nexport function isToolUseStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n const choices = resp?.choices as Array<Record<string, unknown>> | undefined;\n return choices?.[0]?.finish_reason === \"tool_calls\";\n}\n\n/**\n * Check if response indicates conversation should end\n */\nexport function isEndTurnStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n const choices = resp?.choices as Array<Record<string, unknown>> | undefined;\n return choices?.[0]?.finish_reason === \"stop\";\n}\n\n/**\n * Get the stop reason string from response\n */\nexport function getStopReason(response: unknown): string {\n const resp = response as Record<string, unknown>;\n const choices = resp?.choices as Array<Record<string, unknown>> | undefined;\n return (choices?.[0]?.finish_reason as string) || \"unknown\";\n}\n\n// ========================================\n// Message Building\n// ========================================\n\n/**\n * Build assistant message with tool calls for OpenAI format\n */\nexport function buildAssistantToolMessage(\n toolCalls: UnifiedToolCall[],\n textContent?: string,\n): unknown {\n return {\n role: \"assistant\",\n content: textContent || null,\n tool_calls: toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.input),\n },\n })),\n };\n}\n\n/**\n * Build tool result messages for OpenAI\n * In OpenAI format, each tool result is a separate message\n */\nexport function buildToolResultMessage(results: UnifiedToolResult[]): unknown {\n // OpenAI expects each tool result as a separate message\n // Return an array to be spread into the conversation\n return formatToolResults(results);\n}\n\n// ========================================\n// Formatter Object\n// ========================================\n\n/**\n * OpenAI provider formatter\n */\nexport const openaiFormatter: ProviderFormatter = {\n transformTools,\n parseToolCalls,\n formatToolResults,\n isToolUseStop,\n isEndTurnStop,\n getStopReason,\n extractTextContent,\n buildAssistantToolMessage,\n buildToolResultMessage,\n};\n","/**\n * Anthropic/Claude Provider Formatter\n *\n * Transformation functions for Anthropic API format\n */\n\nimport type {\n ToolDefinition,\n UnifiedToolCall,\n UnifiedToolResult,\n} from \"../core/stream-events\";\nimport type {\n ProviderFormatter,\n AnthropicTool,\n AnthropicToolUse,\n AnthropicToolResult,\n} from \"./types\";\n\n// ========================================\n// Tool Definition Transformation\n// ========================================\n\n/**\n * Transform unified tool definitions to Anthropic format\n */\nexport function transformTools(tools: ToolDefinition[]): AnthropicTool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema,\n }));\n}\n\n// ========================================\n// Response Parsing\n// ========================================\n\n/**\n * Parse tool calls from Anthropic response content\n */\nexport function parseToolCalls(response: unknown): UnifiedToolCall[] {\n // Handle both raw response and content array\n const content = Array.isArray(response)\n ? response\n : (response as Record<string, unknown>)?.content;\n\n if (!Array.isArray(content)) {\n return [];\n }\n\n return content\n .filter((block): block is AnthropicToolUse => block?.type === \"tool_use\")\n .map((block) => ({\n id: block.id,\n name: block.name,\n input: block.input || {},\n }));\n}\n\n/**\n * Extract text content from Anthropic response\n */\nexport function extractTextContent(response: unknown): string {\n // Handle both raw response and content array\n const content = Array.isArray(response)\n ? response\n : (response as Record<string, unknown>)?.content;\n\n if (!Array.isArray(content)) {\n return \"\";\n }\n\n return content\n .filter((block) => block?.type === \"text\")\n .map((block) => (block as { text?: string }).text || \"\")\n .join(\"\\n\");\n}\n\n// ========================================\n// Tool Result Formatting\n// ========================================\n\n/**\n * Format tool results for Anthropic\n */\nexport function formatToolResults(\n results: UnifiedToolResult[],\n): AnthropicToolResult[] {\n return results.map((r) => ({\n type: \"tool_result\" as const,\n tool_use_id: r.toolCallId,\n content: r.content,\n }));\n}\n\n// ========================================\n// Stop Reason Detection\n// ========================================\n\n/**\n * Check if response indicates the AI wants to use tools\n */\nexport function isToolUseStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n return resp?.stop_reason === \"tool_use\";\n}\n\n/**\n * Check if response indicates conversation should end\n */\nexport function isEndTurnStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n const stopReason = resp?.stop_reason;\n return stopReason === \"end_turn\" || stopReason === \"stop\";\n}\n\n/**\n * Get the stop reason string from response\n */\nexport function getStopReason(response: unknown): string {\n const resp = response as Record<string, unknown>;\n return (resp?.stop_reason as string) || \"unknown\";\n}\n\n// ========================================\n// Message Building\n// ========================================\n\n/**\n * Build assistant message with tool calls for Anthropic format\n */\nexport function buildAssistantToolMessage(\n toolCalls: UnifiedToolCall[],\n textContent?: string,\n): unknown {\n const content: unknown[] = [];\n\n if (textContent) {\n content.push({ type: \"text\", text: textContent });\n }\n\n toolCalls.forEach((tc) => {\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.name,\n input: tc.input,\n });\n });\n\n return { role: \"assistant\", content };\n}\n\n/**\n * Build user message with tool results for Anthropic\n * In Anthropic format, tool results are sent as a user message with tool_result blocks\n */\nexport function buildToolResultMessage(results: UnifiedToolResult[]): unknown {\n return {\n role: \"user\",\n content: formatToolResults(results),\n };\n}\n\n// ========================================\n// Formatter Object\n// ========================================\n\n/**\n * Anthropic provider formatter\n */\nexport const anthropicFormatter: ProviderFormatter = {\n transformTools,\n parseToolCalls,\n formatToolResults,\n isToolUseStop,\n isEndTurnStop,\n getStopReason,\n extractTextContent,\n buildAssistantToolMessage,\n buildToolResultMessage,\n};\n","/**\n * Google Gemini Provider Formatter\n *\n * Transformation functions for Google Gemini API format\n */\n\nimport type {\n ToolDefinition,\n UnifiedToolCall,\n UnifiedToolResult,\n} from \"../core/stream-events\";\nimport type {\n ProviderFormatter,\n GeminiFunctionDeclaration,\n GeminiFunctionCall,\n GeminiFunctionResponse,\n} from \"./types\";\n\n// ========================================\n// Tool Definition Transformation\n// ========================================\n\n/**\n * Transform unified tool definitions to Gemini format\n */\nexport function transformTools(\n tools: ToolDefinition[],\n): Array<{ functionDeclarations: GeminiFunctionDeclaration[] }> {\n return [\n {\n functionDeclarations: tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n })),\n },\n ];\n}\n\n// ========================================\n// Response Parsing\n// ========================================\n\n/**\n * Parse tool calls from Gemini response\n */\nexport function parseToolCalls(response: unknown): UnifiedToolCall[] {\n const resp = response as Record<string, unknown>;\n const candidates = resp?.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n const content = candidates?.[0]?.content as\n | Record<string, unknown>\n | undefined;\n const parts = content?.parts as Array<Record<string, unknown>> | undefined;\n\n if (!parts) return [];\n\n const functionCalls: UnifiedToolCall[] = [];\n\n for (const part of parts) {\n const functionCall = part.functionCall as GeminiFunctionCall | undefined;\n if (functionCall) {\n functionCalls.push({\n id: `gemini_${Date.now()}_${functionCalls.length}`, // Gemini doesn't provide IDs\n name: functionCall.name,\n input: functionCall.args || {},\n });\n }\n }\n\n return functionCalls;\n}\n\n/**\n * Extract text content from Gemini response\n */\nexport function extractTextContent(response: unknown): string {\n const resp = response as Record<string, unknown>;\n const candidates = resp?.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n const content = candidates?.[0]?.content as\n | Record<string, unknown>\n | undefined;\n const parts = content?.parts as Array<Record<string, unknown>> | undefined;\n\n if (!parts) return \"\";\n\n return parts\n .filter((part) => typeof part.text === \"string\")\n .map((part) => part.text as string)\n .join(\"\\n\");\n}\n\n// ========================================\n// Tool Result Formatting\n// ========================================\n\n/**\n * Format tool results for Gemini\n */\nexport function formatToolResults(\n results: UnifiedToolResult[],\n): GeminiFunctionResponse[] {\n return results.map((r) => {\n let response: Record<string, unknown>;\n try {\n response = JSON.parse(r.content);\n } catch {\n response = { result: r.content };\n }\n\n return {\n name: r.toolCallId.split(\"_\").slice(2).join(\"_\") || \"unknown\", // Extract name from ID\n response,\n };\n });\n}\n\n// ========================================\n// Stop Reason Detection\n// ========================================\n\n/**\n * Check if response indicates the AI wants to use tools\n */\nexport function isToolUseStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n const candidates = resp?.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n const content = candidates?.[0]?.content as\n | Record<string, unknown>\n | undefined;\n const parts = content?.parts as Array<Record<string, unknown>> | undefined;\n\n if (!parts) return false;\n\n return parts.some((part) => part.functionCall !== undefined);\n}\n\n/**\n * Check if response indicates conversation should end\n */\nexport function isEndTurnStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n const candidates = resp?.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n const finishReason = candidates?.[0]?.finishReason as string | undefined;\n\n return finishReason === \"STOP\" || finishReason === \"END_TURN\";\n}\n\n/**\n * Get the stop reason string from response\n */\nexport function getStopReason(response: unknown): string {\n const resp = response as Record<string, unknown>;\n const candidates = resp?.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n return (candidates?.[0]?.finishReason as string) || \"unknown\";\n}\n\n// ========================================\n// Message Building\n// ========================================\n\n/**\n * Build assistant message with tool calls for Gemini format\n */\nexport function buildAssistantToolMessage(\n toolCalls: UnifiedToolCall[],\n textContent?: string,\n): unknown {\n const parts: unknown[] = [];\n\n if (textContent) {\n parts.push({ text: textContent });\n }\n\n toolCalls.forEach((tc) => {\n parts.push({\n functionCall: {\n name: tc.name,\n args: tc.input,\n },\n });\n });\n\n return {\n role: \"model\",\n parts,\n };\n}\n\n/**\n * Build user message with tool results for Gemini\n */\nexport function buildToolResultMessage(results: UnifiedToolResult[]): unknown {\n const parts = results.map((r) => {\n let response: Record<string, unknown>;\n try {\n response = JSON.parse(r.content);\n } catch {\n response = { result: r.content };\n }\n\n // Extract tool name from the result - we need to track this separately\n // For now, use a placeholder since Gemini doesn't use IDs\n return {\n functionResponse: {\n name: \"tool\", // This should be the actual tool name\n response,\n },\n };\n });\n\n return {\n role: \"user\",\n parts,\n };\n}\n\n// ========================================\n// Formatter Object\n// ========================================\n\n/**\n * Gemini provider formatter\n */\nexport const geminiFormatter: ProviderFormatter = {\n transformTools,\n parseToolCalls,\n formatToolResults,\n isToolUseStop,\n isEndTurnStop,\n getStopReason,\n extractTextContent,\n buildAssistantToolMessage,\n buildToolResultMessage,\n};\n","/**\n * Provider Formatter Registry\n *\n * Maps provider names to their formatters for the agent loop.\n * Formatters handle tool transformations between unified format and provider-specific formats.\n */\n\nimport type { ProviderFormatter } from \"./types\";\nimport { openaiFormatter } from \"./openai\";\nimport { anthropicFormatter } from \"./anthropic\";\nimport { geminiFormatter } from \"./gemini\";\n\n// ============================================\n// Formatter Registry\n// ============================================\n\n/**\n * Map of provider names to their formatters\n */\nconst formatters: Record<string, ProviderFormatter> = {\n openai: openaiFormatter,\n anthropic: anthropicFormatter,\n google: geminiFormatter,\n gemini: geminiFormatter, // Alias\n // OpenAI-compatible providers use openaiFormatter\n ollama: openaiFormatter,\n xai: openaiFormatter,\n azure: openaiFormatter,\n};\n\n/**\n * Get a formatter for a specific provider\n *\n * @param provider - Provider name (e.g., 'openai', 'anthropic', 'google')\n * @returns The provider's formatter\n * @throws Error if provider is not supported\n *\n * @example\n * ```typescript\n * const formatter = getFormatter('openai');\n * const tools = formatter.transformTools(unifiedTools);\n * ```\n */\nexport function getFormatter(provider: string): ProviderFormatter {\n const formatter = formatters[provider.toLowerCase()];\n if (!formatter) {\n throw new Error(\n `Unsupported provider: ${provider}. Supported providers: ${Object.keys(formatters).join(\", \")}`,\n );\n }\n return formatter;\n}\n\n/**\n * Check if a provider is supported\n *\n * @param provider - Provider name to check\n * @returns True if provider has a formatter\n *\n * @example\n * ```typescript\n * if (isProviderSupported('openai')) {\n * // Use the provider\n * }\n * ```\n */\nexport function isProviderSupported(provider: string): boolean {\n return provider.toLowerCase() in formatters;\n}\n\n/**\n * Get list of supported providers\n *\n * @returns Array of supported provider names\n *\n * @example\n * ```typescript\n * const providers = getSupportedProviders();\n * // ['openai', 'anthropic', 'google', ...]\n * ```\n */\nexport function getSupportedProviders(): string[] {\n return Object.keys(formatters);\n}\n\n/**\n * Register a custom formatter for a provider\n *\n * @param provider - Provider name\n * @param formatter - Formatter implementation\n *\n * @example\n * ```typescript\n * registerFormatter('custom-provider', myCustomFormatter);\n * ```\n */\nexport function registerFormatter(\n provider: string,\n formatter: ProviderFormatter,\n): void {\n formatters[provider.toLowerCase()] = formatter;\n}\n","/**\n * Agent Loop Implementation\n *\n * Server-side agentic loop that:\n * 1. Calls LLM with tools\n * 2. Parses tool calls from response\n * 3. Executes server-side tools or requests client execution\n * 4. Loops until LLM returns end_turn or max iterations reached\n *\n * Streams events to client via SSE for real-time updates\n */\n\nimport type {\n StreamEvent,\n ToolDefinition,\n UnifiedToolCall,\n UnifiedToolResult,\n ToolResponse,\n AgentLoopConfig,\n Message,\n} from \"../core/stream-events\";\nimport type { AIProvider } from \"../providers/types\";\nimport { generateToolCallId, generateMessageId } from \"../core/utils\";\nimport { getFormatter } from \"../providers\";\n\n// ========================================\n// Constants\n// ========================================\n\n/** Default maximum iterations */\nconst DEFAULT_MAX_ITERATIONS = 20;\n\n// ========================================\n// Types\n// ========================================\n\n/**\n * Agent loop options\n */\nexport interface AgentLoopOptions {\n /** Initial messages */\n messages: Message[];\n /** Available tools */\n tools: ToolDefinition[];\n /** System prompt */\n systemPrompt?: string;\n /** AI provider */\n provider: AIProvider;\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n /** Loop configuration */\n config?: AgentLoopConfig;\n /**\n * LLM call function\n * Should call the LLM and return the raw response\n */\n callLLM: (messages: unknown[], tools: unknown[]) => Promise<unknown>;\n /**\n * Server-side tool executor\n * Called when a server-side tool needs to be executed\n */\n executeServerTool?: (\n name: string,\n args: Record<string, unknown>,\n ) => Promise<ToolResponse>;\n /**\n * Callback to wait for client tool result\n * Called when a client-side tool needs to be executed\n * Should return a Promise that resolves when client sends result\n */\n waitForClientToolResult?: (\n toolCallId: string,\n name: string,\n args: Record<string, unknown>,\n ) => Promise<ToolResponse>;\n}\n\n/**\n * Internal conversation message format\n */\ninterface ConversationMessage {\n role: string;\n content: unknown;\n [key: string]: unknown;\n}\n\n// ========================================\n// Main Agent Loop\n// ========================================\n\n/**\n * Run the agentic loop\n *\n * @yields Stream events for each step of the loop\n */\nexport async function* runAgentLoop(\n options: AgentLoopOptions,\n): AsyncGenerator<StreamEvent> {\n const {\n messages,\n tools,\n systemPrompt,\n provider,\n signal,\n config,\n callLLM,\n executeServerTool,\n waitForClientToolResult,\n } = options;\n\n const maxIterations = config?.maxIterations ?? DEFAULT_MAX_ITERATIONS;\n const debug = config?.debug ?? false;\n const formatter = getFormatter(provider.name);\n\n // Separate server and client tools\n const serverTools = tools.filter((t) => t.location === \"server\");\n const clientTools = tools.filter((t) => t.location === \"client\");\n const allTools = [...serverTools, ...clientTools];\n\n // Transform tools to provider format\n const providerTools = formatter.transformTools(allTools);\n\n // Build conversation\n const conversation: ConversationMessage[] = buildConversation(\n messages,\n systemPrompt,\n );\n\n let iteration = 0;\n\n if (debug) {\n console.log(\"[AgentLoop] Starting with\", {\n messageCount: messages.length,\n toolCount: allTools.length,\n serverToolCount: serverTools.length,\n clientToolCount: clientTools.length,\n maxIterations,\n });\n }\n\n // Main loop\n while (iteration < maxIterations) {\n // Check for abort\n if (signal?.aborted) {\n yield {\n type: \"loop:complete\",\n iterations: iteration,\n aborted: true,\n };\n return;\n }\n\n iteration++;\n\n // Emit iteration progress\n yield {\n type: \"loop:iteration\",\n iteration,\n maxIterations,\n };\n\n if (debug) {\n console.log(`[AgentLoop] Iteration ${iteration}/${maxIterations}`);\n }\n\n try {\n // Call LLM\n const response = await callLLM(conversation, providerTools);\n\n // Parse tool calls and text from response\n const toolCalls = formatter.parseToolCalls(response);\n const textContent = formatter.extractTextContent(response);\n\n // Emit text content as message\n if (textContent) {\n const messageId = generateMessageId();\n yield { type: \"message:start\", id: messageId };\n yield { type: \"message:delta\", content: textContent };\n yield { type: \"message:end\" };\n }\n\n // Check if we should use tools\n if (formatter.isToolUseStop(response) && toolCalls.length > 0) {\n if (debug) {\n console.log(\n \"[AgentLoop] Tool calls:\",\n toolCalls.map((tc) => tc.name),\n );\n }\n\n // Execute tools\n const results = await executeToolCalls(\n toolCalls,\n tools,\n executeServerTool,\n waitForClientToolResult,\n function* (event: StreamEvent) {\n yield event;\n },\n debug,\n );\n\n // Emit tool results\n for (const result of results) {\n const toolCall = toolCalls.find((tc) => tc.id === result.toolCallId);\n if (toolCall) {\n yield {\n type: \"tool:result\",\n id: result.toolCallId,\n name: toolCall.name,\n result: JSON.parse(result.content) as ToolResponse,\n };\n }\n }\n\n // Add assistant message with tool calls to conversation\n const assistantMessage = formatter.buildAssistantToolMessage(\n toolCalls,\n textContent,\n );\n conversation.push(assistantMessage as ConversationMessage);\n\n // Add tool results to conversation\n const toolResultMessage = formatter.buildToolResultMessage(results);\n if (Array.isArray(toolResultMessage)) {\n // OpenAI format returns array of messages\n conversation.push(...(toolResultMessage as ConversationMessage[]));\n } else {\n conversation.push(toolResultMessage as ConversationMessage);\n }\n\n // Continue loop\n continue;\n }\n\n // Check for end turn\n if (formatter.isEndTurnStop(response)) {\n if (debug) {\n console.log(\"[AgentLoop] End turn detected\");\n }\n break;\n }\n\n // Unknown stop reason - break to be safe\n const stopReason = formatter.getStopReason(response);\n if (debug) {\n console.log(\"[AgentLoop] Unknown stop reason:\", stopReason);\n }\n break;\n } catch (error) {\n if (debug) {\n console.error(\"[AgentLoop] Error:\", error);\n }\n\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"AGENT_LOOP_ERROR\",\n };\n\n break;\n }\n }\n\n // Emit completion\n yield {\n type: \"loop:complete\",\n iterations: iteration,\n maxIterationsReached: iteration >= maxIterations,\n };\n\n yield { type: \"done\" };\n}\n\n// ========================================\n// Helper Functions\n// ========================================\n\n/**\n * Build conversation from messages\n */\nfunction buildConversation(\n messages: Message[],\n systemPrompt?: string,\n): ConversationMessage[] {\n const conversation: ConversationMessage[] = [];\n\n // Add system prompt if provided\n if (systemPrompt) {\n conversation.push({\n role: \"system\",\n content: systemPrompt,\n });\n }\n\n // Add messages\n for (const msg of messages) {\n conversation.push({\n role: msg.role,\n content: msg.content,\n });\n }\n\n return conversation;\n}\n\n/**\n * Execute tool calls\n */\nasync function executeToolCalls(\n toolCalls: UnifiedToolCall[],\n tools: ToolDefinition[],\n executeServerTool?: (\n name: string,\n args: Record<string, unknown>,\n ) => Promise<ToolResponse>,\n waitForClientToolResult?: (\n toolCallId: string,\n name: string,\n args: Record<string, unknown>,\n ) => Promise<ToolResponse>,\n emitEvent?: (event: StreamEvent) => void,\n debug?: boolean,\n): Promise<UnifiedToolResult[]> {\n const results: UnifiedToolResult[] = [];\n\n for (const toolCall of toolCalls) {\n const tool = tools.find((t) => t.name === toolCall.name);\n\n if (!tool) {\n // Unknown tool\n if (debug) {\n console.warn(`[AgentLoop] Unknown tool: ${toolCall.name}`);\n }\n\n results.push({\n toolCallId: toolCall.id,\n content: JSON.stringify({\n success: false,\n error: `Unknown tool: ${toolCall.name}`,\n }),\n success: false,\n error: `Unknown tool: ${toolCall.name}`,\n });\n continue;\n }\n\n // Emit action start\n emitEvent?.({\n type: \"action:start\",\n id: toolCall.id,\n name: toolCall.name,\n });\n\n // Emit arguments\n emitEvent?.({\n type: \"action:args\",\n id: toolCall.id,\n args: JSON.stringify(toolCall.input),\n });\n\n try {\n let response: ToolResponse;\n\n if (tool.location === \"server\") {\n // Server-side tool\n if (tool.handler) {\n response = (await tool.handler(toolCall.input)) as ToolResponse;\n } else if (executeServerTool) {\n response = await executeServerTool(toolCall.name, toolCall.input);\n } else {\n response = {\n success: false,\n error: `No handler for server tool: ${toolCall.name}`,\n };\n }\n } else {\n // Client-side tool\n if (waitForClientToolResult) {\n // Wait for client result (client handles execution)\n response = await waitForClientToolResult(\n toolCall.id,\n toolCall.name,\n toolCall.input,\n );\n } else {\n response = {\n success: false,\n error: `No client tool handler for: ${toolCall.name}`,\n };\n }\n }\n\n // Emit action end\n emitEvent?.({\n type: \"action:end\",\n id: toolCall.id,\n name: toolCall.name,\n result: response,\n });\n\n results.push({\n toolCallId: toolCall.id,\n content: JSON.stringify(response),\n success: response.success,\n error: response.error,\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Tool execution failed\";\n\n // Emit action end with error\n emitEvent?.({\n type: \"action:end\",\n id: toolCall.id,\n name: toolCall.name,\n error: errorMessage,\n });\n\n results.push({\n toolCallId: toolCall.id,\n content: JSON.stringify({\n success: false,\n error: errorMessage,\n }),\n success: false,\n error: errorMessage,\n });\n }\n }\n\n return results;\n}\n\n// ========================================\n// Exports\n// ========================================\n\nexport { DEFAULT_MAX_ITERATIONS };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/tool.ts","../src/core/generate-text.ts","../src/core/stream-text.ts","../src/core/types.ts","../src/core/stream-events.ts","../src/server/streaming.ts","../src/server/stream-result.ts","../src/server/generate-result.ts","../src/server/runtime.ts","../src/server/integrations.ts","../src/core/utils.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/gemini.ts","../src/providers/formatter-registry.ts","../src/server/agent-loop.ts"],"names":["result","buildMessages","formatToolsForProvider","tool","transformTools","parseToolCalls","extractTextContent","formatToolResults","isToolUseStop","isEndTurnStop","getStopReason","buildAssistantToolMessage","buildToolResultMessage"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Tool Helper\n *\n * Create type-safe tools with Zod schema validation.\n *\n * @example\n * ```ts\n * import { tool } from '@yourgpt/llm-sdk';\n * import { z } from 'zod';\n *\n * const weatherTool = tool({\n * description: 'Get current weather for a city',\n * parameters: z.object({\n * city: z.string().describe('City name'),\n * unit: z.enum(['celsius', 'fahrenheit']).optional(),\n * }),\n * execute: async ({ city, unit }) => {\n * const data = await fetchWeather(city);\n * return { temperature: data.temp, condition: data.condition };\n * },\n * });\n * ```\n */\n\nimport type { z } from \"zod\";\nimport type { Tool, ToolContext } from \"./types\";\n\n/**\n * Configuration for creating a tool\n */\nexport interface ToolConfig<TParams extends z.ZodType, TResult = unknown> {\n /** Description of what the tool does (shown to LLM) */\n description: string;\n\n /** Zod schema defining the tool's parameters */\n parameters: TParams;\n\n /** Function to execute when the tool is called */\n execute: (params: z.infer<TParams>, context: ToolContext) => Promise<TResult>;\n\n /**\n * Hide this tool's execution from the chat UI.\n * When true, tool calls and results won't be displayed to the user,\n * but the tool will still execute normally.\n * @default false\n */\n hidden?: boolean;\n}\n\n/**\n * Create a type-safe tool definition\n *\n * @param config - Tool configuration with description, parameters, and execute function\n * @returns A Tool object that can be passed to generateText/streamText\n *\n * @example\n * ```ts\n * const searchTool = tool({\n * description: 'Search for products in the database',\n * parameters: z.object({\n * query: z.string(),\n * maxResults: z.number().optional().default(10),\n * }),\n * execute: async ({ query, maxResults }) => {\n * return await db.products.search(query, maxResults);\n * },\n * });\n *\n * const result = await generateText({\n * model: openai('gpt-4o'),\n * prompt: 'Find me some headphones',\n * tools: { search: searchTool },\n * });\n * ```\n */\nexport function tool<TParams extends z.ZodType, TResult = unknown>(\n config: ToolConfig<TParams, TResult>,\n): Tool<z.infer<TParams>, TResult> {\n return {\n description: config.description,\n parameters: config.parameters,\n execute: config.execute,\n hidden: config.hidden,\n };\n}\n\n/**\n * Convert a Tool's Zod schema to JSON Schema format\n * Used internally when sending tools to LLM providers\n */\nexport function toolToJsonSchema(toolDef: Tool): {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n} {\n const schema = zodToJsonSchema(toolDef.parameters);\n return {\n type: \"object\",\n properties: schema.properties ?? {},\n required: schema.required,\n };\n}\n\n/**\n * Convert Zod schema to JSON Schema\n * Handles common Zod types used in tool definitions\n */\nfunction zodToJsonSchema(schema: z.ZodType): {\n type?: string;\n properties?: Record<string, unknown>;\n required?: string[];\n items?: unknown;\n enum?: unknown[];\n description?: string;\n} {\n const def = (schema as unknown as { _def: unknown })._def as Record<\n string,\n unknown\n >;\n const typeName = def.typeName as string;\n\n // Handle descriptions\n const description = def.description as string | undefined;\n\n switch (typeName) {\n case \"ZodString\":\n return { type: \"string\", description };\n\n case \"ZodNumber\":\n return { type: \"number\", description };\n\n case \"ZodBoolean\":\n return { type: \"boolean\", description };\n\n case \"ZodEnum\": {\n const values = def.values as unknown[];\n return { type: \"string\", enum: values, description };\n }\n\n case \"ZodArray\": {\n const innerType = def.type as z.ZodType;\n return {\n type: \"array\",\n items: zodToJsonSchema(innerType),\n description,\n };\n }\n\n case \"ZodObject\": {\n const shape = def.shape as () => Record<string, z.ZodType>;\n const shapeObj = shape();\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shapeObj)) {\n properties[key] = zodToJsonSchema(value);\n\n // Check if required (not optional, not nullable, not with default)\n const valueDef = (value as unknown as { _def: Record<string, unknown> })\n ._def;\n const isOptional =\n valueDef.typeName === \"ZodOptional\" ||\n valueDef.typeName === \"ZodNullable\" ||\n valueDef.typeName === \"ZodDefault\";\n\n if (!isOptional) {\n required.push(key);\n }\n }\n\n return {\n type: \"object\",\n properties,\n required: required.length > 0 ? required : undefined,\n description,\n };\n }\n\n case \"ZodOptional\":\n case \"ZodNullable\": {\n const innerType = def.innerType as z.ZodType;\n return zodToJsonSchema(innerType);\n }\n\n case \"ZodDefault\": {\n const innerType = def.innerType as z.ZodType;\n return zodToJsonSchema(innerType);\n }\n\n case \"ZodLiteral\": {\n const value = def.value;\n if (typeof value === \"string\") {\n return { type: \"string\", enum: [value], description };\n }\n if (typeof value === \"number\") {\n return { type: \"number\", enum: [value], description };\n }\n if (typeof value === \"boolean\") {\n return { type: \"boolean\", enum: [value], description };\n }\n return { description };\n }\n\n case \"ZodUnion\": {\n // For simple string unions, convert to enum\n const options = def.options as z.ZodType[];\n const stringLiterals: string[] = [];\n\n for (const option of options) {\n const optDef = (option as unknown as { _def: Record<string, unknown> })\n ._def;\n if (\n optDef.typeName === \"ZodLiteral\" &&\n typeof optDef.value === \"string\"\n ) {\n stringLiterals.push(optDef.value as string);\n }\n }\n\n if (stringLiterals.length === options.length) {\n return { type: \"string\", enum: stringLiterals, description };\n }\n\n // For complex unions, just return the first option's schema\n return zodToJsonSchema(options[0]);\n }\n\n default:\n // Fallback for unknown types\n return { type: \"string\", description };\n }\n}\n\n/**\n * Format tools for OpenAI API format\n */\nexport function formatToolsForOpenAI(tools: Record<string, Tool>): Array<{\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: object;\n };\n}> {\n return Object.entries(tools).map(([name, toolDef]) => ({\n type: \"function\" as const,\n function: {\n name,\n description: toolDef.description,\n parameters: toolToJsonSchema(toolDef),\n },\n }));\n}\n\n/**\n * Format tools for Anthropic API format\n */\nexport function formatToolsForAnthropic(tools: Record<string, Tool>): Array<{\n name: string;\n description: string;\n input_schema: object;\n}> {\n return Object.entries(tools).map(([name, toolDef]) => ({\n name,\n description: toolDef.description,\n input_schema: toolToJsonSchema(toolDef),\n }));\n}\n\n/**\n * Format tools for Google Gemini API format\n */\nexport function formatToolsForGoogle(tools: Record<string, Tool>): Array<{\n functionDeclarations: Array<{\n name: string;\n description: string;\n parameters?: object;\n }>;\n}> {\n return [\n {\n functionDeclarations: Object.entries(tools).map(([name, toolDef]) => ({\n name,\n description: toolDef.description,\n parameters: toolToJsonSchema(toolDef),\n })),\n },\n ];\n}\n","/**\n * generateText - Generate text using a language model\n *\n * @example\n * ```ts\n * import { generateText } from '@yourgpt/llm-sdk';\n * import { openai } from '@yourgpt/llm-sdk/openai';\n *\n * // Simple usage\n * const result = await generateText({\n * model: openai('gpt-4o'),\n * prompt: 'Explain quantum computing in simple terms.',\n * });\n * console.log(result.text);\n *\n * // With tools (agentic)\n * const result = await generateText({\n * model: openai('gpt-4o'),\n * prompt: 'What is the weather in Tokyo?',\n * tools: { weather: weatherTool },\n * maxSteps: 5,\n * });\n * ```\n */\n\nimport type {\n GenerateTextParams,\n GenerateTextResult,\n GenerateStep,\n CoreMessage,\n Tool,\n ToolCall,\n ToolResult,\n TokenUsage,\n FinishReason,\n} from \"./types\";\nimport { formatToolsForOpenAI, formatToolsForAnthropic } from \"./tool\";\n\n/**\n * Generate text using a language model\n *\n * @param params - Generation parameters\n * @returns Promise resolving to generation result with text, usage, and tool interactions\n */\nexport async function generateText(\n params: GenerateTextParams,\n): Promise<GenerateTextResult> {\n const { model, tools, maxSteps = 1, signal } = params;\n\n // Build initial messages\n let messages = buildMessages(params);\n const steps: GenerateStep[] = [];\n const allToolCalls: ToolCall[] = [];\n const allToolResults: ToolResult[] = [];\n\n // Agent loop - keep going until no more tool calls or max steps reached\n for (let step = 0; step < maxSteps; step++) {\n // Check for abort\n if (signal?.aborted) {\n throw new Error(\"Generation aborted\");\n }\n\n // Format tools for this model's provider\n const formattedTools = tools\n ? formatToolsForProvider(tools, model.provider)\n : undefined;\n\n // Call model\n const result = await model.doGenerate({\n messages,\n tools: formattedTools,\n temperature: params.temperature,\n maxTokens: params.maxTokens,\n signal,\n });\n\n // Record this step\n const stepToolResults: ToolResult[] = [];\n\n // If there are tool calls, execute them\n if (result.toolCalls && result.toolCalls.length > 0 && tools) {\n allToolCalls.push(...result.toolCalls);\n\n // Execute each tool\n for (const call of result.toolCalls) {\n const toolDef = tools[call.name];\n if (!toolDef) {\n const errorResult: ToolResult = {\n toolCallId: call.id,\n result: { error: `Tool not found: ${call.name}` },\n };\n stepToolResults.push(errorResult);\n allToolResults.push(errorResult);\n continue;\n }\n\n try {\n // Validate and execute\n const parsedArgs = toolDef.parameters.parse(call.args);\n const toolResult = await toolDef.execute(parsedArgs, {\n toolCallId: call.id,\n abortSignal: signal,\n messages,\n });\n\n const result: ToolResult = {\n toolCallId: call.id,\n result: toolResult,\n };\n stepToolResults.push(result);\n allToolResults.push(result);\n } catch (error) {\n const errorResult: ToolResult = {\n toolCallId: call.id,\n result: {\n error:\n error instanceof Error\n ? error.message\n : \"Tool execution failed\",\n },\n };\n stepToolResults.push(errorResult);\n allToolResults.push(errorResult);\n }\n }\n }\n\n // Record step\n steps.push({\n text: result.text,\n toolCalls: result.toolCalls,\n toolResults: stepToolResults,\n finishReason: result.finishReason,\n usage: result.usage,\n });\n\n // If no tool calls, we're done\n if (!result.toolCalls || result.toolCalls.length === 0) {\n break;\n }\n\n // Add assistant message with tool calls\n const assistantMessage: AssistantMessage = {\n role: \"assistant\",\n content: result.text || null,\n toolCalls: result.toolCalls,\n };\n messages = [...messages, assistantMessage];\n\n // Add tool result messages\n for (const tr of stepToolResults) {\n const toolMessage: ToolMessage = {\n role: \"tool\",\n toolCallId: tr.toolCallId,\n content: JSON.stringify(tr.result),\n };\n messages = [...messages, toolMessage];\n }\n }\n\n // Build final result\n const lastStep = steps[steps.length - 1];\n\n return {\n text: lastStep?.text ?? \"\",\n usage: sumUsage(steps),\n finishReason: lastStep?.finishReason ?? \"stop\",\n steps,\n toolCalls: allToolCalls,\n toolResults: allToolResults,\n response: {\n messages,\n },\n };\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\ninterface AssistantMessage {\n role: \"assistant\";\n content: string | null;\n toolCalls?: ToolCall[];\n}\n\ninterface ToolMessage {\n role: \"tool\";\n toolCallId: string;\n content: string;\n}\n\n/**\n * Build initial messages from params\n */\nfunction buildMessages(params: GenerateTextParams): CoreMessage[] {\n const messages: CoreMessage[] = [];\n\n // Add system prompt if provided\n if (params.system) {\n messages.push({ role: \"system\", content: params.system });\n }\n\n // Add existing messages\n if (params.messages) {\n messages.push(...params.messages);\n }\n\n // Add prompt as user message if provided\n if (params.prompt) {\n messages.push({ role: \"user\", content: params.prompt });\n }\n\n return messages;\n}\n\n/**\n * Format tools based on provider\n */\nfunction formatToolsForProvider(\n tools: Record<string, Tool>,\n provider: string,\n): unknown[] {\n switch (provider) {\n case \"anthropic\":\n return formatToolsForAnthropic(tools);\n case \"openai\":\n case \"xai\":\n case \"azure\":\n default:\n return formatToolsForOpenAI(tools);\n }\n}\n\n/**\n * Sum token usage across all steps\n */\nfunction sumUsage(steps: GenerateStep[]): TokenUsage {\n return steps.reduce(\n (acc, step) => ({\n promptTokens: acc.promptTokens + (step.usage?.promptTokens ?? 0),\n completionTokens:\n acc.completionTokens + (step.usage?.completionTokens ?? 0),\n totalTokens: acc.totalTokens + (step.usage?.totalTokens ?? 0),\n }),\n { promptTokens: 0, completionTokens: 0, totalTokens: 0 },\n );\n}\n","/**\n * streamText - Stream text from a language model\n *\n * @example\n * ```ts\n * import { streamText } from '@yourgpt/llm-sdk';\n * import { openai } from '@yourgpt/llm-sdk/openai';\n *\n * // Simple streaming\n * const result = await streamText({\n * model: openai('gpt-4o'),\n * prompt: 'Tell me a story.',\n * });\n *\n * // Option 1: Iterate text chunks\n * for await (const chunk of result.textStream) {\n * process.stdout.write(chunk);\n * }\n *\n * // Option 2: Get full text\n * const text = await result.text;\n *\n * // Option 3: Return as Response (for API routes)\n * return result.toTextStreamResponse();\n * ```\n */\n\nimport type {\n StreamTextParams,\n StreamTextResult,\n StreamPart,\n CoreMessage,\n Tool,\n ToolCall,\n TokenUsage,\n FinishReason,\n ResponseOptions,\n StreamChunk,\n} from \"./types\";\nimport { formatToolsForOpenAI, formatToolsForAnthropic } from \"./tool\";\n\n/**\n * Stream text from a language model\n *\n * @param params - Stream parameters\n * @returns Promise resolving to stream result with text stream and helpers\n */\nexport async function streamText(\n params: StreamTextParams,\n): Promise<StreamTextResult> {\n const { model, tools, maxSteps = 1, signal } = params;\n\n // State for collecting results\n let fullText = \"\";\n let finalUsage: TokenUsage = {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n let finalFinishReason: FinishReason = \"stop\";\n\n // Create the stream generator\n async function* createFullStream(): AsyncGenerator<StreamPart> {\n let messages = buildMessages(params);\n\n for (let step = 0; step < maxSteps; step++) {\n yield { type: \"step-start\", step };\n\n // Check for abort\n if (signal?.aborted) {\n yield { type: \"error\", error: new Error(\"Stream aborted\") };\n return;\n }\n\n // Format tools for this model's provider\n const formattedTools = tools\n ? formatToolsForProvider(tools, model.provider)\n : undefined;\n\n // Collect data from this step\n let stepText = \"\";\n const toolCalls: ToolCall[] = [];\n let currentToolCall: Partial<ToolCall> | null = null;\n let stepFinishReason: FinishReason = \"stop\";\n\n try {\n // Stream from model\n for await (const chunk of model.doStream({\n messages,\n tools: formattedTools,\n temperature: params.temperature,\n maxTokens: params.maxTokens,\n signal,\n })) {\n switch (chunk.type) {\n case \"text-delta\":\n stepText += chunk.text;\n fullText += chunk.text;\n yield { type: \"text-delta\", text: chunk.text };\n break;\n\n case \"tool-call\":\n toolCalls.push(chunk.toolCall);\n yield {\n type: \"tool-call-complete\",\n toolCall: chunk.toolCall,\n };\n break;\n\n case \"finish\":\n stepFinishReason = chunk.finishReason;\n finalFinishReason = chunk.finishReason;\n if (chunk.usage) {\n finalUsage = {\n promptTokens:\n finalUsage.promptTokens + chunk.usage.promptTokens,\n completionTokens:\n finalUsage.completionTokens + chunk.usage.completionTokens,\n totalTokens: finalUsage.totalTokens + chunk.usage.totalTokens,\n };\n }\n break;\n\n case \"error\":\n yield { type: \"error\", error: chunk.error };\n return;\n }\n }\n } catch (error) {\n yield {\n type: \"error\",\n error: error instanceof Error ? error : new Error(String(error)),\n };\n return;\n }\n\n yield { type: \"step-finish\", step, finishReason: stepFinishReason };\n\n // If no tool calls, we're done\n if (toolCalls.length === 0 || !tools) {\n break;\n }\n\n // Execute tools and continue\n const assistantMessage: CoreMessage = {\n role: \"assistant\",\n content: stepText || null,\n toolCalls,\n };\n messages = [...messages, assistantMessage];\n\n // Execute each tool\n for (const call of toolCalls) {\n const toolDef = tools[call.name];\n if (!toolDef) {\n const errorResult = { error: `Tool not found: ${call.name}` };\n yield {\n type: \"tool-result\",\n toolCallId: call.id,\n result: errorResult,\n };\n messages = [\n ...messages,\n {\n role: \"tool\",\n toolCallId: call.id,\n content: JSON.stringify(errorResult),\n },\n ];\n continue;\n }\n\n try {\n const parsedArgs = toolDef.parameters.parse(call.args);\n const result = await toolDef.execute(parsedArgs, {\n toolCallId: call.id,\n abortSignal: signal,\n messages,\n });\n\n yield { type: \"tool-result\", toolCallId: call.id, result };\n messages = [\n ...messages,\n {\n role: \"tool\",\n toolCallId: call.id,\n content: JSON.stringify(result),\n },\n ];\n } catch (error) {\n const errorResult = {\n error:\n error instanceof Error ? error.message : \"Tool execution failed\",\n };\n yield {\n type: \"tool-result\",\n toolCallId: call.id,\n result: errorResult,\n };\n messages = [\n ...messages,\n {\n role: \"tool\",\n toolCallId: call.id,\n content: JSON.stringify(errorResult),\n },\n ];\n }\n }\n }\n\n // Final finish event\n yield {\n type: \"finish\",\n finishReason: finalFinishReason,\n usage: finalUsage,\n };\n }\n\n // Create text-only stream\n async function* createTextStream(): AsyncIterable<string> {\n for await (const part of createFullStream()) {\n if (part.type === \"text-delta\") {\n yield part.text;\n }\n }\n }\n\n // Promises for lazy evaluation\n let textPromise: Promise<string> | undefined;\n let usagePromise: Promise<TokenUsage> | undefined;\n let finishReasonPromise: Promise<FinishReason> | undefined;\n\n // Consume stream to get final values\n async function consumeStream(): Promise<void> {\n for await (const _ of createFullStream()) {\n // Just consume to completion\n }\n }\n\n return {\n textStream: createTextStream(),\n fullStream: createFullStream(),\n\n get text(): Promise<string> {\n if (!textPromise) {\n textPromise = consumeStream().then(() => fullText);\n }\n return textPromise;\n },\n\n get usage(): Promise<TokenUsage> {\n if (!usagePromise) {\n usagePromise = consumeStream().then(() => finalUsage);\n }\n return usagePromise;\n },\n\n get finishReason(): Promise<FinishReason> {\n if (!finishReasonPromise) {\n finishReasonPromise = consumeStream().then(() => finalFinishReason);\n }\n return finishReasonPromise;\n },\n\n toTextStreamResponse(options?: ResponseOptions): Response {\n const stream = createTextStreamReadable(createTextStream());\n return new Response(stream, {\n status: options?.status ?? 200,\n headers: {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n ...options?.headers,\n },\n });\n },\n\n toDataStreamResponse(options?: ResponseOptions): Response {\n const stream = createDataStreamReadable(createFullStream());\n return new Response(stream, {\n status: options?.status ?? 200,\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n ...options?.headers,\n },\n });\n },\n };\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\n/**\n * Build initial messages from params\n */\nfunction buildMessages(params: StreamTextParams): CoreMessage[] {\n const messages: CoreMessage[] = [];\n\n if (params.system) {\n messages.push({ role: \"system\", content: params.system });\n }\n\n if (params.messages) {\n messages.push(...params.messages);\n }\n\n if (params.prompt) {\n messages.push({ role: \"user\", content: params.prompt });\n }\n\n return messages;\n}\n\n/**\n * Format tools based on provider\n */\nfunction formatToolsForProvider(\n tools: Record<string, Tool>,\n provider: string,\n): unknown[] {\n switch (provider) {\n case \"anthropic\":\n return formatToolsForAnthropic(tools);\n case \"openai\":\n case \"xai\":\n case \"azure\":\n default:\n return formatToolsForOpenAI(tools);\n }\n}\n\n/**\n * Create a ReadableStream from text async iterable\n */\nfunction createTextStreamReadable(\n textStream: AsyncIterable<string>,\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n\n return new ReadableStream({\n async start(controller) {\n try {\n for await (const text of textStream) {\n controller.enqueue(encoder.encode(text));\n }\n controller.close();\n } catch (error) {\n controller.error(error);\n }\n },\n });\n}\n\n/**\n * Create a ReadableStream for SSE data stream\n */\nfunction createDataStreamReadable(\n fullStream: AsyncIterable<StreamPart>,\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n\n return new ReadableStream({\n async start(controller) {\n try {\n for await (const part of fullStream) {\n const data = JSON.stringify(part);\n controller.enqueue(encoder.encode(`data: ${data}\\n\\n`));\n }\n controller.enqueue(encoder.encode(\"data: [DONE]\\n\\n\"));\n controller.close();\n } catch (error) {\n const errorData = JSON.stringify({\n type: \"error\",\n error: error instanceof Error ? error.message : String(error),\n });\n controller.enqueue(encoder.encode(`data: ${errorData}\\n\\n`));\n controller.close();\n }\n },\n });\n}\n","/**\n * Core Types for @yourgpt/llm-sdk\n *\n * Modern, instance-based types following Vercel AI SDK patterns.\n */\n\nimport type { z } from \"zod\";\n\n// ============================================\n// Language Model Types\n// ============================================\n\n/**\n * A language model instance that can generate text.\n * This is what provider functions like `openai('gpt-4o')` return.\n */\nexport interface LanguageModel {\n /** Provider identifier (e.g., 'openai', 'anthropic') */\n readonly provider: string;\n\n /** Model identifier (e.g., 'gpt-4o', 'claude-3-5-sonnet') */\n readonly modelId: string;\n\n /** Model capabilities for feature detection */\n readonly capabilities: ModelCapabilities;\n\n /**\n * Generate a complete response (non-streaming)\n * Used internally by generateText()\n */\n doGenerate(params: DoGenerateParams): Promise<DoGenerateResult>;\n\n /**\n * Stream a response\n * Used internally by streamText()\n */\n doStream(params: DoGenerateParams): AsyncGenerator<StreamChunk>;\n}\n\n/**\n * Model capabilities for UI feature flags\n */\nexport interface ModelCapabilities {\n /** Supports image inputs */\n supportsVision: boolean;\n /** Supports tool/function calling */\n supportsTools: boolean;\n /** Supports streaming responses */\n supportsStreaming: boolean;\n /** Supports JSON mode / structured output */\n supportsJsonMode: boolean;\n /** Supports extended thinking (Claude) */\n supportsThinking: boolean;\n /** Supports PDF document inputs */\n supportsPDF: boolean;\n /** Maximum context tokens */\n maxTokens: number;\n /** Supported image MIME types */\n supportedImageTypes: string[];\n}\n\n/**\n * Default capabilities for unknown models\n */\nexport const DEFAULT_CAPABILITIES: ModelCapabilities = {\n supportsVision: false,\n supportsTools: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n supportsThinking: false,\n supportsPDF: false,\n maxTokens: 8192,\n supportedImageTypes: [],\n};\n\n// ============================================\n// Message Types\n// ============================================\n\n/**\n * Core message types for LLM conversations\n */\nexport type CoreMessage =\n | SystemMessage\n | UserMessage\n | AssistantMessage\n | ToolMessage;\n\nexport interface SystemMessage {\n role: \"system\";\n content: string;\n}\n\nexport interface UserMessage {\n role: \"user\";\n content: string | UserContentPart[];\n}\n\nexport interface AssistantMessage {\n role: \"assistant\";\n content: string | null;\n toolCalls?: ToolCall[];\n}\n\nexport interface ToolMessage {\n role: \"tool\";\n toolCallId: string;\n content: string;\n}\n\n/**\n * Content parts for multimodal user messages\n */\nexport type UserContentPart = TextPart | ImagePart | FilePart;\n\nexport interface TextPart {\n type: \"text\";\n text: string;\n}\n\nexport interface ImagePart {\n type: \"image\";\n /** Base64 data or URL */\n image: string | Uint8Array;\n /** MIME type (e.g., 'image/png') */\n mimeType?: string;\n}\n\nexport interface FilePart {\n type: \"file\";\n /** Base64 data or URL */\n data: string;\n /** MIME type (e.g., 'application/pdf') */\n mimeType: string;\n}\n\n// ============================================\n// Tool Types\n// ============================================\n\n/**\n * Tool definition with Zod schema support\n */\nexport interface Tool<TParams = unknown, TResult = unknown> {\n /** Tool description for the LLM */\n description: string;\n /** Zod schema for parameters */\n parameters: z.ZodType<TParams>;\n /** Execute function */\n execute: (params: TParams, context: ToolContext) => Promise<TResult>;\n /**\n * Hide this tool's execution from the chat UI.\n * When true, tool calls and results won't be displayed to the user,\n * but the tool will still execute normally.\n * @default false\n */\n hidden?: boolean;\n}\n\n/**\n * Context passed to tool execute function\n */\nexport interface ToolContext {\n /** Abort signal for cancellation */\n abortSignal?: AbortSignal;\n /** Unique tool call ID */\n toolCallId: string;\n /** Optional: messages in conversation */\n messages?: CoreMessage[];\n}\n\n/**\n * Tool call from LLM response\n */\nexport interface ToolCall {\n /** Unique ID for this tool call */\n id: string;\n /** Tool name */\n name: string;\n /** Parsed arguments */\n args: Record<string, unknown>;\n}\n\n/**\n * Tool execution result\n */\nexport interface ToolResult {\n /** Tool call ID this result corresponds to */\n toolCallId: string;\n /** Result data (will be JSON stringified for LLM) */\n result: unknown;\n}\n\n// ============================================\n// Generation Types\n// ============================================\n\n/**\n * Parameters for model.doGenerate() and model.doStream()\n */\nexport interface DoGenerateParams {\n /** Messages to send to LLM */\n messages: CoreMessage[];\n /** Tools available to the LLM (already formatted for provider) */\n tools?: unknown[];\n /** Temperature (0-2) */\n temperature?: number;\n /** Maximum tokens to generate */\n maxTokens?: number;\n /** Abort signal */\n signal?: AbortSignal;\n}\n\n/**\n * Result from model.doGenerate()\n */\nexport interface DoGenerateResult {\n /** Generated text content */\n text: string;\n /** Tool calls requested by the LLM */\n toolCalls: ToolCall[];\n /** Why generation stopped */\n finishReason: FinishReason;\n /** Token usage */\n usage: TokenUsage;\n /** Raw provider response (for debugging) */\n rawResponse?: unknown;\n}\n\n/**\n * Finish reason for generation\n */\nexport type FinishReason =\n | \"stop\"\n | \"length\"\n | \"tool-calls\"\n | \"content-filter\"\n | \"error\"\n | \"unknown\";\n\n/**\n * Token usage statistics\n */\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\n// ============================================\n// Streaming Types\n// ============================================\n\n/**\n * Stream chunk from model.doStream()\n */\nexport type StreamChunk =\n | TextDeltaChunk\n | ToolCallChunk\n | ToolResultChunk\n | FinishChunk\n | ErrorChunk;\n\nexport interface TextDeltaChunk {\n type: \"text-delta\";\n text: string;\n}\n\nexport interface ToolCallChunk {\n type: \"tool-call\";\n toolCall: ToolCall;\n}\n\nexport interface ToolResultChunk {\n type: \"tool-result\";\n toolCallId: string;\n result: unknown;\n}\n\nexport interface FinishChunk {\n type: \"finish\";\n finishReason: FinishReason;\n usage?: TokenUsage;\n}\n\nexport interface ErrorChunk {\n type: \"error\";\n error: Error;\n}\n\n// ============================================\n// Generate Text Types\n// ============================================\n\n/**\n * Parameters for generateText()\n */\nexport interface GenerateTextParams {\n /** Language model to use */\n model: LanguageModel;\n /** Simple prompt (converted to user message) */\n prompt?: string;\n /** System prompt */\n system?: string;\n /** Full message history */\n messages?: CoreMessage[];\n /** Tools available to the LLM */\n tools?: Record<string, Tool>;\n /** Maximum agentic steps (tool call loops) */\n maxSteps?: number;\n /** Temperature (0-2) */\n temperature?: number;\n /** Maximum tokens to generate */\n maxTokens?: number;\n /** Abort signal */\n signal?: AbortSignal;\n}\n\n/**\n * Result from generateText()\n */\nexport interface GenerateTextResult {\n /** Final text output */\n text: string;\n /** Token usage */\n usage: TokenUsage;\n /** Why generation stopped */\n finishReason: FinishReason;\n /** All steps taken (for agentic workflows) */\n steps: GenerateStep[];\n /** All tool calls made across all steps */\n toolCalls: ToolCall[];\n /** All tool results across all steps */\n toolResults: ToolResult[];\n /** Final message list including tool interactions */\n response: {\n messages: CoreMessage[];\n };\n}\n\n/**\n * A single step in the generation process\n */\nexport interface GenerateStep {\n /** Text generated in this step */\n text: string;\n /** Tool calls made in this step */\n toolCalls: ToolCall[];\n /** Tool results from this step */\n toolResults: ToolResult[];\n /** Finish reason for this step */\n finishReason: FinishReason;\n /** Token usage for this step */\n usage: TokenUsage;\n}\n\n// ============================================\n// Stream Text Types\n// ============================================\n\n/**\n * Parameters for streamText() - same as generateText\n */\nexport type StreamTextParams = GenerateTextParams;\n\n/**\n * Result from streamText()\n */\nexport interface StreamTextResult {\n /** Async iterable of text chunks only */\n textStream: AsyncIterable<string>;\n\n /** Async iterable of all stream parts */\n fullStream: AsyncIterable<StreamPart>;\n\n /** Promise that resolves to full text when complete */\n readonly text: Promise<string>;\n\n /** Promise that resolves to usage when complete */\n readonly usage: Promise<TokenUsage>;\n\n /** Promise that resolves to finish reason when complete */\n readonly finishReason: Promise<FinishReason>;\n\n /** Convert to plain text streaming Response */\n toTextStreamResponse(options?: ResponseOptions): Response;\n\n /** Convert to data stream Response (SSE with tool calls) */\n toDataStreamResponse(options?: ResponseOptions): Response;\n}\n\n/**\n * Stream part for fullStream\n */\nexport type StreamPart =\n | { type: \"text-delta\"; text: string }\n | { type: \"tool-call-start\"; toolCallId: string; toolName: string }\n | { type: \"tool-call-delta\"; toolCallId: string; argsText: string }\n | { type: \"tool-call-complete\"; toolCall: ToolCall }\n | { type: \"tool-result\"; toolCallId: string; result: unknown }\n | { type: \"step-start\"; step: number }\n | { type: \"step-finish\"; step: number; finishReason: FinishReason }\n | { type: \"finish\"; finishReason: FinishReason; usage: TokenUsage }\n | { type: \"error\"; error: Error };\n\n/**\n * Options for Response helpers\n */\nexport interface ResponseOptions {\n /** Additional headers */\n headers?: Record<string, string>;\n /** Response status (default: 200) */\n status?: number;\n}\n","/**\n * Stream event types for llm-sdk\n * These types are used internally by the SDK for streaming responses\n */\n\n/**\n * Stream event types\n */\nexport type StreamEventType =\n | \"message:start\"\n | \"message:delta\"\n | \"message:end\"\n | \"thinking:start\"\n | \"thinking:delta\"\n | \"thinking:end\"\n | \"action:start\"\n | \"action:args\"\n | \"action:end\"\n | \"tool_calls\"\n | \"tool:result\"\n | \"citation\"\n | \"loop:iteration\"\n | \"loop:complete\"\n | \"error\"\n | \"done\";\n\n/**\n * Base event interface\n */\ninterface BaseEvent {\n type: StreamEventType;\n}\n\n/**\n * Message started streaming\n */\nexport interface MessageStartEvent extends BaseEvent {\n type: \"message:start\";\n id: string;\n}\n\n/**\n * Message content delta (incremental update)\n */\nexport interface MessageDeltaEvent extends BaseEvent {\n type: \"message:delta\";\n content: string;\n}\n\n/**\n * Message finished streaming\n */\nexport interface MessageEndEvent extends BaseEvent {\n type: \"message:end\";\n}\n\n/**\n * Thinking/reasoning started (for models like Claude, DeepSeek)\n */\nexport interface ThinkingStartEvent extends BaseEvent {\n type: \"thinking:start\";\n}\n\n/**\n * Thinking content delta\n */\nexport interface ThinkingDeltaEvent extends BaseEvent {\n type: \"thinking:delta\";\n content: string;\n}\n\n/**\n * Thinking finished\n */\nexport interface ThinkingEndEvent extends BaseEvent {\n type: \"thinking:end\";\n}\n\n/**\n * Action/tool execution started\n */\nexport interface ActionStartEvent extends BaseEvent {\n type: \"action:start\";\n id: string;\n name: string;\n /** Whether this tool should be hidden from UI */\n hidden?: boolean;\n}\n\n/**\n * Action arguments (streaming)\n */\nexport interface ActionArgsEvent extends BaseEvent {\n type: \"action:args\";\n id: string;\n args: string;\n}\n\n/**\n * Action execution completed\n */\nexport interface ActionEndEvent extends BaseEvent {\n type: \"action:end\";\n id: string;\n name?: string;\n result?: unknown;\n error?: string;\n}\n\n/**\n * Error event\n */\nexport interface ErrorEvent extends BaseEvent {\n type: \"error\";\n message: string;\n code?: string;\n}\n\n/**\n * Tool call information\n */\nexport interface ToolCallInfo {\n id: string;\n name: string;\n args: Record<string, unknown>;\n /** Whether this tool should be hidden from UI */\n hidden?: boolean;\n}\n\n/**\n * Assistant message with tool calls\n */\nexport interface AssistantToolMessage {\n role: \"assistant\";\n content: string | null;\n tool_calls: Array<{\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string;\n };\n }>;\n}\n\n/**\n * Tool calls event - client should execute and send results\n */\nexport interface ToolCallsEvent extends BaseEvent {\n type: \"tool_calls\";\n toolCalls: ToolCallInfo[];\n assistantMessage: AssistantToolMessage;\n}\n\n/**\n * Tool result event\n */\nexport interface ToolResultEvent extends BaseEvent {\n type: \"tool:result\";\n id: string;\n name: string;\n result: ToolResponse;\n}\n\n/**\n * Loop iteration event\n */\nexport interface LoopIterationEvent extends BaseEvent {\n type: \"loop:iteration\";\n iteration: number;\n maxIterations: number;\n}\n\n/**\n * Loop complete event\n */\nexport interface LoopCompleteEvent extends BaseEvent {\n type: \"loop:complete\";\n iterations: number;\n aborted?: boolean;\n maxIterationsReached?: boolean;\n}\n\n/**\n * Citation from web search (unified format for all providers)\n */\nexport interface Citation {\n /** Unique citation index (1-based) */\n index: number;\n /** Source URL */\n url: string;\n /** Page title */\n title: string;\n /** Cited text snippet (optional) */\n citedText?: string;\n /** Source domain (extracted from URL) */\n domain?: string;\n /** Favicon URL (generated from domain) */\n favicon?: string;\n}\n\n/**\n * Citation event - web search returned citations\n */\nexport interface CitationEvent extends BaseEvent {\n type: \"citation\";\n citations: Citation[];\n}\n\n/**\n * Message format for done event (API format with snake_case)\n */\nexport interface DoneEventMessage {\n role: \"assistant\" | \"tool\";\n content: string | null;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string;\n };\n }>;\n tool_call_id?: string;\n}\n\n/**\n * Token usage (snake_case for API compatibility)\n */\nexport interface TokenUsageRaw {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens?: number;\n}\n\n/**\n * Stream completed\n */\nexport interface DoneEvent extends BaseEvent {\n type: \"done\";\n requiresAction?: boolean;\n messages?: DoneEventMessage[];\n /** Token usage (server-side only, stripped before sending to client) */\n usage?: TokenUsageRaw;\n}\n\n/**\n * Union of all stream events\n */\nexport type StreamEvent =\n | MessageStartEvent\n | MessageDeltaEvent\n | MessageEndEvent\n | ThinkingStartEvent\n | ThinkingDeltaEvent\n | ThinkingEndEvent\n | ActionStartEvent\n | ActionArgsEvent\n | ActionEndEvent\n | ToolCallsEvent\n | ToolResultEvent\n | CitationEvent\n | LoopIterationEvent\n | LoopCompleteEvent\n | ErrorEvent\n | DoneEvent;\n\n/**\n * LLM configuration\n */\nexport interface LLMConfig {\n temperature?: number;\n maxTokens?: number;\n}\n\n/**\n * Tool call format (OpenAI style)\n */\nexport interface ToolCall {\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string;\n };\n}\n\n/**\n * Message role\n */\nexport type MessageRole = \"system\" | \"user\" | \"assistant\" | \"tool\";\n\n/**\n * Message attachment\n */\nexport interface MessageAttachment {\n type: \"image\" | \"file\" | \"audio\" | \"video\";\n data?: string;\n url?: string;\n mimeType: string;\n filename?: string;\n}\n\n/**\n * Message metadata\n */\nexport interface MessageMetadata {\n thinking?: string;\n attachments?: MessageAttachment[];\n toolName?: string;\n [key: string]: unknown;\n}\n\n/**\n * Message type (simplified for llm-sdk)\n */\nexport interface Message {\n id: string;\n thread_id?: string;\n role: MessageRole;\n content: string | null;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n metadata?: MessageMetadata;\n created_at?: Date;\n}\n\n/**\n * Action parameter definition\n */\nexport interface ActionParameter {\n type: string;\n description?: string;\n required?: boolean;\n enum?: string[];\n items?: ActionParameter;\n properties?: Record<string, ActionParameter>;\n}\n\n/**\n * Action definition for tool calling\n */\nexport interface ActionDefinition<TParams = Record<string, unknown>> {\n name: string;\n description: string;\n parameters?: Record<string, ActionParameter>;\n handler: (params: TParams) => unknown | Promise<unknown>;\n}\n\n/**\n * Tool location (server or client)\n */\nexport type ToolLocation = \"server\" | \"client\";\n\n/**\n * Tool execution status\n */\nexport type ToolExecutionStatus =\n | \"pending\"\n | \"executing\"\n | \"completed\"\n | \"error\";\n\n/**\n * Tool response\n */\nexport interface ToolResponse<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n /** Internal: AI response mode override */\n _aiResponseMode?: AIResponseMode;\n /** Internal: AI content for multimodal response (images, etc.) */\n _aiContent?: AIContent[];\n /** Internal: AI context string override */\n _aiContext?: string;\n}\n\n/**\n * Tool context passed to handlers\n */\nexport interface ToolContext {\n userId?: string;\n threadId?: string;\n [key: string]: unknown;\n}\n\n/**\n * AI response mode for tool results\n */\nexport type AIResponseMode = \"none\" | \"brief\" | \"full\";\n\n/**\n * AI content structure\n */\nexport interface AIContent {\n type?: \"text\" | \"image\";\n text?: string;\n mediaType?: string;\n data?: string;\n summary?: string;\n details?: string;\n}\n\n/**\n * JSON Schema for tool input\n */\nexport interface ToolInputSchema {\n type: \"object\";\n properties?: Record<string, unknown>;\n required?: string[];\n}\n\n/**\n * Tool AI context for result formatting\n */\nexport interface ToolAIContext {\n enabled?: boolean;\n mode?: AIResponseMode;\n content?: AIContent | ((result: unknown) => AIContent);\n}\n\n/**\n * Tool definition\n */\nexport interface ToolDefinition<TParams = Record<string, unknown>> {\n name: string;\n description: string;\n location: ToolLocation;\n title?: string | ((args: TParams) => string);\n inputSchema?: ToolInputSchema;\n handler?: (\n params: TParams,\n context?: ToolContext,\n ) => unknown | Promise<unknown>;\n render?: (props: unknown) => unknown;\n available?: boolean;\n /**\n * Hide this tool's execution from the chat UI.\n * When true, tool calls and results won't be displayed to the user,\n * but the tool will still execute normally.\n * @default false\n */\n hidden?: boolean;\n needsApproval?: boolean;\n approvalMessage?: string | ((params: TParams) => string);\n /** AI response mode for this tool (none, brief, full) */\n aiResponseMode?: AIResponseMode;\n /** AI context string or function to generate context */\n aiContext?:\n | string\n | ((result: ToolResponse, args: Record<string, unknown>) => string);\n}\n\n/**\n * Agent loop configuration\n */\nexport interface AgentLoopConfig {\n maxIterations?: number;\n debug?: boolean;\n enabled?: boolean;\n}\n\n/**\n * Web search configuration for native provider search\n *\n * Enables native web search for supported providers:\n * - Anthropic: Uses Claude's built-in web search tool\n * - OpenAI: Uses GPT's web search preview\n * - Google: Uses Gemini's Google Search grounding\n *\n * @example\n * ```typescript\n * const runtime = createRuntime({\n * provider: createAnthropic({ apiKey: '...' }),\n * model: 'claude-sonnet-4-20250514',\n * webSearch: true, // Enable with defaults\n * });\n *\n * // Or with configuration\n * const runtime = createRuntime({\n * provider: createOpenAI({ apiKey: '...' }),\n * model: 'gpt-4o',\n * webSearch: {\n * maxUses: 5,\n * allowedDomains: ['docs.anthropic.com', 'openai.com'],\n * },\n * });\n * ```\n */\nexport interface WebSearchConfig {\n /** Maximum number of search uses per request (default: unlimited) */\n maxUses?: number;\n /** Only search these domains (provider-specific support) */\n allowedDomains?: string[];\n /** Exclude these domains from search (provider-specific support) */\n blockedDomains?: string[];\n /** User location for localized results (Anthropic only) */\n userLocation?: {\n type: \"approximate\";\n city?: string;\n region?: string;\n country?: string;\n timezone?: string;\n };\n}\n\n/**\n * Unified tool call format\n */\nexport interface UnifiedToolCall {\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\n/**\n * Unified tool result format\n */\nexport interface UnifiedToolResult {\n toolCallId: string;\n content: string;\n success: boolean;\n error?: string;\n}\n\n/**\n * Tool execution state\n */\nexport interface ToolExecution {\n id: string;\n name: string;\n args: Record<string, unknown>;\n status: ToolExecutionStatus;\n result?: ToolResponse;\n}\n\n/**\n * Knowledge base provider\n */\nexport type KnowledgeBaseProvider =\n | \"pinecone\"\n | \"qdrant\"\n | \"weaviate\"\n | \"custom\";\n\n/**\n * Knowledge base configuration\n */\nexport interface KnowledgeBaseConfig {\n id: string;\n name?: string;\n provider: KnowledgeBaseProvider;\n apiKey?: string;\n index?: string;\n}\n\n/**\n * Create a message helper\n */\nexport function createMessage(\n partial: Partial<Message> &\n Pick<Message, \"role\"> & { content?: string | null },\n): Message {\n return {\n id: `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,\n thread_id: partial.thread_id,\n role: partial.role,\n content: partial.content ?? null,\n tool_calls: partial.tool_calls,\n tool_call_id: partial.tool_call_id,\n metadata: partial.metadata,\n created_at: partial.created_at ?? new Date(),\n };\n}\n","import type { StreamEvent } from \"../core/stream-events\";\n\n/**\n * Node.js ServerResponse interface (minimal subset for type safety)\n * Note: Return types are `unknown` to support both Node.js (returns `this`)\n * and Express (returns `void`) response objects.\n */\ninterface NodeServerResponse {\n setHeader(name: string, value: string | number | readonly string[]): unknown;\n write(chunk: string | Buffer): boolean;\n end(): unknown;\n}\n\n/**\n * Create SSE response headers\n */\nexport function createSSEHeaders(): Record<string, string> {\n return {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n };\n}\n\n/**\n * Create text stream response headers\n */\nexport function createTextStreamHeaders(): Record<string, string> {\n return {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"Cache-Control\": \"no-cache\",\n };\n}\n\n/**\n * Format event as SSE data\n */\nexport function formatSSEData(event: StreamEvent): string {\n return `data: ${JSON.stringify(event)}\\n\\n`;\n}\n\n/**\n * Create a ReadableStream from an async generator of events\n */\nexport function createEventStream(\n generator: AsyncGenerator<StreamEvent>,\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n\n return new ReadableStream({\n async start(controller) {\n try {\n for await (const event of generator) {\n const data = formatSSEData(event);\n controller.enqueue(encoder.encode(data));\n }\n } catch (error) {\n // Send error event\n const errorEvent: StreamEvent = {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n };\n controller.enqueue(encoder.encode(formatSSEData(errorEvent)));\n } finally {\n // Send done event\n controller.enqueue(encoder.encode(\"data: [DONE]\\n\\n\"));\n controller.close();\n }\n },\n });\n}\n\n/**\n * Create SSE Response object\n */\nexport function createSSEResponse(\n generator: AsyncGenerator<StreamEvent>,\n options?: { headers?: Record<string, string> },\n): Response {\n return new Response(createEventStream(generator), {\n headers: {\n ...createSSEHeaders(),\n ...options?.headers,\n },\n });\n}\n\n/**\n * Create text-only stream Response (no SSE events, just text content)\n *\n * @example\n * ```typescript\n * const generator = runtime.processChatWithLoop(body);\n * return createTextStreamResponse(generator);\n * ```\n */\nexport function createTextStreamResponse(\n generator: AsyncGenerator<StreamEvent>,\n options?: { headers?: Record<string, string> },\n): Response {\n const encoder = new TextEncoder();\n\n const stream = new ReadableStream({\n async start(controller) {\n try {\n for await (const event of generator) {\n if (event.type === \"message:delta\") {\n controller.enqueue(encoder.encode(event.content));\n }\n }\n } catch (error) {\n console.error(\"[Streaming] Text stream error:\", error);\n } finally {\n controller.close();\n }\n },\n });\n\n return new Response(stream, {\n headers: {\n ...createTextStreamHeaders(),\n ...options?.headers,\n },\n });\n}\n\n/**\n * Pipe SSE stream to Node.js ServerResponse\n *\n * Standalone helper for piping streaming events directly to Express/Node.js responses.\n *\n * @example\n * ```typescript\n * // Express\n * app.post('/chat', async (req, res) => {\n * const generator = runtime.processChatWithLoop(req.body);\n * await pipeSSEToResponse(generator, res);\n * });\n * ```\n */\nexport async function pipeSSEToResponse(\n generator: AsyncGenerator<StreamEvent>,\n res: NodeServerResponse,\n options?: { headers?: Record<string, string> },\n): Promise<void> {\n // Set SSE headers\n res.setHeader(\"Content-Type\", \"text/event-stream\");\n res.setHeader(\"Cache-Control\", \"no-cache, no-transform\");\n res.setHeader(\"Connection\", \"keep-alive\");\n res.setHeader(\"X-Accel-Buffering\", \"no\");\n\n // Apply custom headers\n if (options?.headers) {\n for (const [key, value] of Object.entries(options.headers)) {\n res.setHeader(key, value);\n }\n }\n\n try {\n for await (const event of generator) {\n res.write(formatSSEData(event));\n }\n } catch (error) {\n // Send error event\n const errorEvent: StreamEvent = {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n };\n res.write(formatSSEData(errorEvent));\n } finally {\n res.write(\"data: [DONE]\\n\\n\");\n res.end();\n }\n}\n\n/**\n * Pipe text-only stream to Node.js ServerResponse\n *\n * Standalone helper for piping only text content to Express/Node.js responses.\n *\n * @example\n * ```typescript\n * // Express - text only\n * app.post('/chat', async (req, res) => {\n * const generator = runtime.processChatWithLoop(req.body);\n * await pipeTextToResponse(generator, res);\n * });\n * ```\n */\nexport async function pipeTextToResponse(\n generator: AsyncGenerator<StreamEvent>,\n res: NodeServerResponse,\n options?: { headers?: Record<string, string> },\n): Promise<void> {\n // Set text headers\n res.setHeader(\"Content-Type\", \"text/plain; charset=utf-8\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n\n // Apply custom headers\n if (options?.headers) {\n for (const [key, value] of Object.entries(options.headers)) {\n res.setHeader(key, value);\n }\n }\n\n try {\n for await (const event of generator) {\n if (event.type === \"message:delta\") {\n res.write(event.content);\n }\n }\n } finally {\n res.end();\n }\n}\n","/**\n * StreamResult - Industry-standard streaming result object\n *\n * Provides multiple ways to consume streaming responses:\n * - Web API: toResponse(), toTextResponse()\n * - Node.js/Express: pipeToResponse(), pipeTextToResponse()\n * - Collection: collect(), text()\n * - Iteration: for await...of\n *\n * @example\n * ```typescript\n * // Express - one-liner\n * app.post('/chat', async (req, res) => {\n * await runtime.stream(req.body).pipeToResponse(res);\n * });\n *\n * // Next.js\n * export async function POST(req: Request) {\n * const body = await req.json();\n * return runtime.stream(body).toResponse();\n * }\n *\n * // Collect full response\n * const { text, messages } = await runtime.stream(body).collect();\n * ```\n */\n\nimport type {\n StreamEvent,\n DoneEventMessage,\n ToolCallInfo,\n TokenUsageRaw,\n} from \"../core/stream-events\";\nimport {\n createSSEHeaders,\n formatSSEData,\n createEventStream,\n} from \"./streaming\";\n\n/**\n * Options for response methods\n */\nexport interface StreamResultOptions {\n /** Additional headers to include in response */\n headers?: Record<string, string>;\n /**\n * Include token usage in response (default: false)\n * Set to true for raw API access where you need usage data.\n * When false, usage is stripped from client-facing responses\n * but still available in onFinish callback for billing.\n */\n includeUsage?: boolean;\n}\n\n/**\n * Result passed to onFinish callback\n */\nexport interface OnFinishResult {\n /** All messages from the stream (for persistence) */\n messages: DoneEventMessage[];\n /** Token usage for billing/tracking (server-side only) */\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n}\n\n/**\n * Options for StreamResult constructor\n */\nexport interface StreamResultConstructorOptions {\n /**\n * Called after stream completes (for persistence, billing, etc.)\n * Usage data is only available server-side and is not exposed to clients.\n */\n onFinish?: (result: OnFinishResult) => Promise<void> | void;\n}\n\n/**\n * Collected result after consuming the stream\n */\nexport interface CollectedResult {\n /** Accumulated text content */\n text: string;\n /** All messages from the stream (for persistence) */\n messages: DoneEventMessage[];\n /** Tool calls that were made */\n toolCalls: ToolCallInfo[];\n /** Whether client action is required (client-side tools) */\n requiresAction: boolean;\n /** Token usage for billing/tracking */\n usage?: TokenUsageRaw;\n /** Raw events (for debugging) */\n events: StreamEvent[];\n}\n\n/**\n * Node.js ServerResponse interface (minimal subset)\n * Note: Return types are `unknown` to support both Node.js (returns `this`)\n * and Express (returns `void`) response objects.\n */\ninterface NodeServerResponse {\n setHeader(name: string, value: string | number | readonly string[]): unknown;\n write(chunk: string | Buffer): boolean;\n end(): unknown;\n}\n\n/**\n * Event handler types for the on() method\n */\ntype TextHandler = (text: string) => void;\ntype ToolCallHandler = (toolCall: ToolCallInfo) => void;\ntype DoneHandler = (result: CollectedResult) => void;\ntype ErrorHandler = (error: Error) => void;\n\n/**\n * StreamResult provides multiple ways to consume a streaming response.\n *\n * This follows the industry-standard pattern used by Vercel AI SDK,\n * OpenAI SDK, and Anthropic SDK.\n */\nexport class StreamResult {\n private generator: AsyncGenerator<StreamEvent>;\n private consumed = false;\n private eventHandlers = new Map<string, Function>();\n private onFinishCallback?: StreamResultConstructorOptions[\"onFinish\"];\n // Store usage from done event (before it's stripped for client)\n private capturedUsage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens?: number;\n };\n\n constructor(\n generator: AsyncGenerator<StreamEvent>,\n options?: StreamResultConstructorOptions,\n ) {\n this.generator = generator;\n this.onFinishCallback = options?.onFinish;\n }\n\n // ============================================\n // Async Iteration (base pattern)\n // ============================================\n\n /**\n * Iterate over stream events\n *\n * @example\n * ```typescript\n * const result = runtime.stream(body);\n * for await (const event of result) {\n * if (event.type === 'message:delta') {\n * console.log(event.content);\n * }\n * }\n * ```\n */\n [Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n this.ensureNotConsumed();\n return this.generator;\n }\n\n // ============================================\n // Web API Response Methods (Next.js, Cloudflare, Deno)\n // ============================================\n\n /**\n * Returns SSE Response for Web API frameworks\n *\n * @example\n * ```typescript\n * // Next.js App Router\n * export async function POST(req: Request) {\n * const body = await req.json();\n * return runtime.stream(body).toResponse();\n * }\n * ```\n */\n toResponse(options?: StreamResultOptions): Response {\n this.ensureNotConsumed();\n\n const headers = {\n ...createSSEHeaders(),\n ...options?.headers,\n };\n\n return new Response(createEventStream(this.generator), { headers });\n }\n\n /**\n * Alias for toResponse() - returns SSE Response\n */\n toSSEResponse(options?: StreamResultOptions): Response {\n return this.toResponse(options);\n }\n\n /**\n * Returns text-only Response (no SSE events, just text content)\n *\n * @example\n * ```typescript\n * // Simple text streaming\n * return runtime.stream(body).toTextResponse();\n * ```\n */\n toTextResponse(options?: StreamResultOptions): Response {\n this.ensureNotConsumed();\n\n const encoder = new TextEncoder();\n const generator = this.generator;\n\n const stream = new ReadableStream({\n async start(controller) {\n try {\n for await (const event of generator) {\n if (event.type === \"message:delta\") {\n controller.enqueue(encoder.encode(event.content));\n }\n }\n } catch (error) {\n console.error(\"[StreamResult] Text stream error:\", error);\n } finally {\n controller.close();\n }\n },\n });\n\n return new Response(stream, {\n headers: {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"Cache-Control\": \"no-cache\",\n ...options?.headers,\n },\n });\n }\n\n /**\n * Returns the underlying ReadableStream\n *\n * @example\n * ```typescript\n * const stream = runtime.stream(body).toReadableStream();\n * // Use with custom handling\n * ```\n */\n toReadableStream(): ReadableStream<Uint8Array> {\n this.ensureNotConsumed();\n return createEventStream(this.generator);\n }\n\n // ============================================\n // Node.js/Express Response Methods\n // ============================================\n\n /**\n * Pipe SSE stream to Node.js ServerResponse\n *\n * @example\n * ```typescript\n * // Express - one-liner\n * app.post('/chat', async (req, res) => {\n * await runtime.stream(req.body).pipeToResponse(res);\n * });\n * ```\n */\n async pipeToResponse(\n res: NodeServerResponse,\n options?: StreamResultOptions,\n ): Promise<CollectedResult> {\n this.ensureNotConsumed();\n\n // Set SSE headers\n res.setHeader(\"Content-Type\", \"text/event-stream\");\n res.setHeader(\"Cache-Control\", \"no-cache, no-transform\");\n res.setHeader(\"Connection\", \"keep-alive\");\n res.setHeader(\"X-Accel-Buffering\", \"no\");\n\n // Apply custom headers\n if (options?.headers) {\n for (const [key, value] of Object.entries(options.headers)) {\n res.setHeader(key, value);\n }\n }\n\n // Collect result while streaming\n const collected = this.createCollector();\n\n const includeUsage = options?.includeUsage ?? false;\n\n try {\n for await (const event of this.generator) {\n // Collect event (captures usage for onFinish)\n this.collectEvent(event, collected);\n\n // Call event handlers\n this.callEventHandlers(event, collected);\n\n // Write to response (conditionally strip usage from done event)\n if (!includeUsage && event.type === \"done\" && \"usage\" in event) {\n const { usage: _usage, ...clientEvent } = event;\n res.write(formatSSEData(clientEvent as StreamEvent));\n } else {\n res.write(formatSSEData(event));\n }\n }\n } catch (error) {\n // Send error event\n const errorEvent: StreamEvent = {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n };\n res.write(formatSSEData(errorEvent));\n\n // Call error handler\n const errorHandler = this.eventHandlers.get(\"error\") as ErrorHandler;\n if (errorHandler) {\n errorHandler(error instanceof Error ? error : new Error(String(error)));\n }\n } finally {\n res.write(\"data: [DONE]\\n\\n\");\n res.end();\n }\n\n // Call done handler\n const doneHandler = this.eventHandlers.get(\"done\") as DoneHandler;\n if (doneHandler) {\n doneHandler(collected);\n }\n\n // Call onFinish callback (has access to usage)\n await this.callOnFinish(collected);\n\n // Return result (strip usage unless includeUsage is true)\n return includeUsage ? collected : this.stripUsageFromResult(collected);\n }\n\n /**\n * Pipe text-only stream to Node.js ServerResponse\n *\n * @example\n * ```typescript\n * // Express - text-only streaming\n * app.post('/chat', async (req, res) => {\n * await runtime.stream(req.body).pipeTextToResponse(res);\n * });\n * ```\n */\n async pipeTextToResponse(\n res: NodeServerResponse,\n options?: StreamResultOptions,\n ): Promise<CollectedResult> {\n this.ensureNotConsumed();\n\n // Set text headers\n res.setHeader(\"Content-Type\", \"text/plain; charset=utf-8\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n\n // Apply custom headers\n if (options?.headers) {\n for (const [key, value] of Object.entries(options.headers)) {\n res.setHeader(key, value);\n }\n }\n\n // Collect result while streaming\n const collected = this.createCollector();\n\n try {\n for await (const event of this.generator) {\n // Collect event\n this.collectEvent(event, collected);\n\n // Call event handlers\n this.callEventHandlers(event, collected);\n\n // Write text content only\n if (event.type === \"message:delta\") {\n res.write(event.content);\n }\n }\n } catch (error) {\n const errorHandler = this.eventHandlers.get(\"error\") as ErrorHandler;\n if (errorHandler) {\n errorHandler(error instanceof Error ? error : new Error(String(error)));\n }\n } finally {\n res.end();\n }\n\n // Call done handler\n const doneHandler = this.eventHandlers.get(\"done\") as DoneHandler;\n if (doneHandler) {\n doneHandler(collected);\n }\n\n // Call onFinish callback (has access to usage)\n await this.callOnFinish(collected);\n\n // Return result (strip usage unless includeUsage is true)\n const includeUsage = options?.includeUsage ?? false;\n return includeUsage ? collected : this.stripUsageFromResult(collected);\n }\n\n // ============================================\n // Collection Methods\n // ============================================\n\n /**\n * Collect all events and return final result\n *\n * @example\n * ```typescript\n * // Default: usage stripped for client-facing responses\n * const { text, messages, toolCalls } = await runtime.stream(body).collect();\n *\n * // Raw: include usage for server-side processing\n * const { text, usage } = await runtime.stream(body).collect({ includeUsage: true });\n * ```\n */\n async collect(options?: StreamResultOptions): Promise<CollectedResult> {\n this.ensureNotConsumed();\n\n const collected = this.createCollector();\n\n for await (const event of this.generator) {\n this.collectEvent(event, collected);\n this.callEventHandlers(event, collected);\n }\n\n // Call done handler\n const doneHandler = this.eventHandlers.get(\"done\") as DoneHandler;\n if (doneHandler) {\n doneHandler(collected);\n }\n\n // Call onFinish callback (has access to usage)\n await this.callOnFinish(collected);\n\n // Return result (strip usage unless includeUsage is true)\n const includeUsage = options?.includeUsage ?? false;\n return includeUsage ? collected : this.stripUsageFromResult(collected);\n }\n\n /**\n * Get final text (convenience method)\n *\n * @example\n * ```typescript\n * const text = await runtime.stream(body).text();\n * ```\n */\n async text(): Promise<string> {\n const result = await this.collect();\n return result.text;\n }\n\n // ============================================\n // Event Emitter Pattern (like Anthropic SDK)\n // ============================================\n\n /**\n * Register event handler for streaming events\n *\n * @example\n * ```typescript\n * const result = runtime.stream(body)\n * .on('text', (text) => console.log('Text:', text))\n * .on('toolCall', (call) => console.log('Tool:', call.name))\n * .on('done', (result) => console.log('Final:', result.text))\n * .on('error', (err) => console.error('Error:', err));\n *\n * await result.pipeToResponse(res);\n * ```\n */\n on(event: \"text\", handler: TextHandler): this;\n on(event: \"toolCall\", handler: ToolCallHandler): this;\n on(event: \"done\", handler: DoneHandler): this;\n on(event: \"error\", handler: ErrorHandler): this;\n on(event: string, handler: Function): this {\n this.eventHandlers.set(event, handler);\n return this;\n }\n\n // ============================================\n // Internal Methods\n // ============================================\n\n /**\n * Ensure stream hasn't been consumed\n */\n private ensureNotConsumed(): void {\n if (this.consumed) {\n throw new Error(\n \"StreamResult has already been consumed. \" +\n \"Each StreamResult can only be consumed once.\",\n );\n }\n this.consumed = true;\n }\n\n /**\n * Create empty collector object\n */\n private createCollector(): CollectedResult {\n return {\n text: \"\",\n messages: [],\n toolCalls: [],\n requiresAction: false,\n usage: undefined,\n events: [],\n };\n }\n\n /**\n * Collect event into result\n */\n private collectEvent(event: StreamEvent, collected: CollectedResult): void {\n collected.events.push(event);\n\n switch (event.type) {\n case \"message:delta\":\n collected.text += event.content;\n break;\n\n case \"tool_calls\":\n collected.toolCalls.push(...event.toolCalls);\n break;\n\n case \"action:start\":\n // Capture tool call with hidden flag (for server-side tools)\n collected.toolCalls.push({\n id: event.id,\n name: event.name,\n args: {},\n hidden: event.hidden,\n });\n break;\n\n case \"action:args\": {\n // Update args for the tool call\n const tc = collected.toolCalls.find((t) => t.id === event.id);\n if (tc) {\n try {\n tc.args = JSON.parse(event.args || \"{}\");\n } catch {\n tc.args = {};\n }\n }\n break;\n }\n\n case \"done\":\n if (event.messages) {\n collected.messages.push(...event.messages);\n }\n if (event.requiresAction) {\n collected.requiresAction = true;\n }\n if (event.usage) {\n // Capture usage before it might be stripped\n this.capturedUsage = event.usage;\n collected.usage = event.usage;\n }\n break;\n }\n }\n\n /**\n * Call onFinish callback with collected result\n */\n private async callOnFinish(collected: CollectedResult): Promise<void> {\n if (this.onFinishCallback) {\n try {\n const usage = this.capturedUsage;\n await this.onFinishCallback({\n messages: collected.messages,\n usage: usage\n ? {\n promptTokens: usage.prompt_tokens,\n completionTokens: usage.completion_tokens,\n totalTokens:\n usage.total_tokens ??\n usage.prompt_tokens + usage.completion_tokens,\n }\n : undefined,\n });\n } catch (error) {\n console.error(\"[StreamResult] onFinish callback error:\", error);\n }\n }\n }\n\n /**\n * Call registered event handlers\n */\n private callEventHandlers(\n event: StreamEvent,\n collected: CollectedResult,\n ): void {\n switch (event.type) {\n case \"message:delta\": {\n const textHandler = this.eventHandlers.get(\"text\") as TextHandler;\n if (textHandler) {\n textHandler(event.content);\n }\n break;\n }\n\n case \"tool_calls\": {\n const toolCallHandler = this.eventHandlers.get(\n \"toolCall\",\n ) as ToolCallHandler;\n if (toolCallHandler) {\n for (const toolCall of event.toolCalls) {\n toolCallHandler(toolCall);\n }\n }\n break;\n }\n\n case \"error\": {\n const errorHandler = this.eventHandlers.get(\"error\") as ErrorHandler;\n if (errorHandler) {\n errorHandler(new Error(event.message));\n }\n break;\n }\n }\n }\n\n /**\n * Strip usage from result (usage is server-side only for billing)\n * Client-facing APIs should not expose token usage\n */\n private stripUsageFromResult(collected: CollectedResult): CollectedResult {\n const { usage: _usage, events, ...clientResult } = collected;\n // Also strip usage from done event in events array\n const cleanedEvents = events.map((event) => {\n if (event.type === \"done\" && \"usage\" in event) {\n const { usage: _eventUsage, ...cleanEvent } = event;\n return cleanEvent as StreamEvent;\n }\n return event;\n });\n return { ...clientResult, events: cleanedEvents } as CollectedResult;\n }\n}\n\n/**\n * Create a StreamResult from an async generator\n *\n * @example\n * ```typescript\n * const result = createStreamResult(generator);\n * await result.pipeToResponse(res);\n * ```\n */\nexport function createStreamResult(\n generator: AsyncGenerator<StreamEvent>,\n): StreamResult {\n return new StreamResult(generator);\n}\n","/**\n * GenerateResult - Result from non-streaming generation\n *\n * Similar to Vercel AI SDK's generateText() result.\n * Provides both raw access and formatted response methods.\n *\n * @example\n * ```typescript\n * const result = await runtime.generate(body);\n *\n * // Raw access\n * console.log(result.text);\n * console.log(result.toolCalls);\n *\n * // CopilotChat format\n * res.json(result.toResponse());\n * ```\n */\n\nimport type { DoneEventMessage } from \"../core/stream-events\";\n\nexport interface GenerateResultData {\n text: string;\n messages: DoneEventMessage[];\n toolCalls: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n }>;\n toolResults: Array<{\n id: string;\n result: unknown;\n }>;\n requiresAction: boolean;\n error?: {\n message: string;\n code?: string;\n };\n}\n\n/**\n * Response format compatible with CopilotChat\n */\nexport interface CopilotChatResponse {\n success: boolean;\n content: string;\n messages?: DoneEventMessage[];\n toolCalls?: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n }>;\n toolResults?: Array<{\n id: string;\n result: unknown;\n }>;\n requiresAction?: boolean;\n error?: {\n message: string;\n code?: string;\n };\n}\n\n/**\n * GenerateResult - Non-streaming generation result\n */\nexport class GenerateResult {\n private data: GenerateResultData;\n\n constructor(data: GenerateResultData) {\n this.data = data;\n }\n\n /**\n * Generated text content\n */\n get text(): string {\n return this.data.text;\n }\n\n /**\n * All messages from the conversation\n */\n get messages(): DoneEventMessage[] {\n return this.data.messages;\n }\n\n /**\n * Tool calls made during generation\n */\n get toolCalls(): GenerateResultData[\"toolCalls\"] {\n return this.data.toolCalls;\n }\n\n /**\n * Results from tool executions\n */\n get toolResults(): GenerateResultData[\"toolResults\"] {\n return this.data.toolResults;\n }\n\n /**\n * Whether client action is required (e.g., tool approval)\n */\n get requiresAction(): boolean {\n return this.data.requiresAction;\n }\n\n /**\n * Error if generation failed\n */\n get error(): GenerateResultData[\"error\"] {\n return this.data.error;\n }\n\n /**\n * Whether generation was successful\n */\n get success(): boolean {\n return !this.data.error;\n }\n\n /**\n * Convert to CopilotChat-compatible JSON response\n *\n * @example\n * ```typescript\n * // Express\n * res.json(result.toResponse());\n *\n * // Next.js\n * return Response.json(result.toResponse());\n * ```\n */\n toResponse(): CopilotChatResponse {\n return {\n success: this.success,\n content: this.data.text,\n messages: this.data.messages.length > 0 ? this.data.messages : undefined,\n toolCalls:\n this.data.toolCalls.length > 0 ? this.data.toolCalls : undefined,\n toolResults:\n this.data.toolResults.length > 0 ? this.data.toolResults : undefined,\n requiresAction: this.data.requiresAction || undefined,\n error: this.data.error,\n };\n }\n\n /**\n * Convert to raw object (without methods)\n */\n toJSON(): GenerateResultData {\n return { ...this.data };\n }\n}\n","import type {\n Message,\n ActionDefinition,\n ActionParameter,\n StreamEvent,\n ToolDefinition,\n ToolCallInfo,\n AssistantToolMessage,\n DoneEventMessage,\n ToolResponse,\n AIResponseMode,\n AIContent,\n ToolContext,\n WebSearchConfig,\n} from \"../core/stream-events\";\nimport type { AIProvider } from \"../providers/types\";\nimport { createMessage } from \"../core/stream-events\";\nimport type { LLMAdapter, ChatCompletionRequest } from \"../adapters/base\";\nimport type {\n RuntimeConfig,\n ChatRequest,\n HandleRequestOptions,\n HandleRequestResult,\n GenerateOptions,\n} from \"./types\";\nimport { createSSEResponse } from \"./streaming\";\nimport { StreamResult, type CollectedResult } from \"./stream-result\";\nimport { GenerateResult } from \"./generate-result\";\n\n// ============================================\n// AI Response Control\n// ============================================\n\n/**\n * Build the content string sent to AI for a tool result.\n *\n * This function transforms tool results based on the tool's aiResponseMode and aiContext settings,\n * controlling what information the AI receives to generate its response.\n *\n * @param tool - The tool definition (may include aiResponseMode, aiContext)\n * @param result - The tool result (may include _aiResponseMode, _aiContext, _aiContent overrides)\n * @param args - The arguments passed to the tool\n * @returns The content string to send to the AI, or multimodal content array\n */\nfunction buildToolResultForAI(\n tool: ToolDefinition | undefined,\n result: ToolResponse | unknown,\n args: Record<string, unknown>,\n): string | AIContent[] {\n // Type guard for ToolResponse with AI response fields\n const typedResult = result as ToolResponse | undefined;\n\n // Determine response mode (result override > tool config > default 'full')\n const responseMode: AIResponseMode =\n typedResult?._aiResponseMode ?? tool?.aiResponseMode ?? \"full\";\n\n // Check for multimodal content (images, etc.) - always include if present\n if (typedResult?._aiContent && typedResult._aiContent.length > 0) {\n return typedResult._aiContent;\n }\n\n // Get AI context (result override > tool config > undefined)\n let aiContext: string | undefined;\n\n if (typedResult?._aiContext) {\n aiContext = typedResult._aiContext;\n } else if (tool?.aiContext) {\n aiContext =\n typeof tool.aiContext === \"function\"\n ? tool.aiContext(typedResult as ToolResponse, args)\n : tool.aiContext;\n }\n\n // Apply response mode\n switch (responseMode) {\n case \"none\":\n // Minimal message so AI knows tool executed\n return aiContext ?? \"[Result displayed to user]\";\n\n case \"brief\":\n // Use context if available, otherwise minimal acknowledgment\n return (\n aiContext ?? `[Tool ${tool?.name ?? \"unknown\"} executed successfully]`\n );\n\n case \"full\":\n default:\n // Include context as prefix if available, then full data\n const fullData = JSON.stringify(result);\n return aiContext ? `${aiContext}\\n\\nFull data: ${fullData}` : fullData;\n }\n}\n\n/**\n * Serialize tool result content for API message.\n * Handles both string and multimodal (AIContent[]) results.\n */\nfunction serializeToolResultContent(\n content: string | AIContent[],\n): string | Array<{ type: string; [key: string]: unknown }> {\n if (typeof content === \"string\") {\n return content;\n }\n\n // Convert AIContent to API format (OpenAI multimodal format)\n return content.map((item) => {\n if (item.type === \"image\") {\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${item.mediaType};base64,${item.data}`,\n },\n };\n }\n // Text content\n return {\n type: \"text\",\n text: item.text,\n };\n });\n}\n\n/**\n * Extract headers from HTTP request as a plain object\n */\nfunction extractHeaders(request?: Request): Record<string, string> {\n if (!request) return {};\n const headers: Record<string, string> = {};\n request.headers.forEach((value, key) => {\n headers[key.toLowerCase()] = value;\n });\n return headers;\n}\n\n/**\n * Build ToolContext from runtime config and HTTP request\n */\nfunction buildToolContext(\n toolCallId: string,\n signal: AbortSignal | undefined,\n threadId: string | undefined,\n httpRequest: Request | undefined,\n toolContextData: Record<string, unknown> | undefined,\n): ToolContext {\n const headers = extractHeaders(httpRequest);\n return {\n signal,\n threadId,\n toolCallId,\n headers,\n request: httpRequest\n ? {\n method: httpRequest.method,\n url: httpRequest.url,\n headers,\n }\n : undefined,\n data: toolContextData,\n };\n}\n\n/**\n * Copilot SDK Runtime\n *\n * Handles chat requests and manages LLM interactions.\n */\nexport class Runtime {\n private adapter: LLMAdapter;\n private config: RuntimeConfig;\n private actions: Map<string, ActionDefinition> = new Map();\n private tools: Map<string, ToolDefinition> = new Map();\n\n constructor(config: RuntimeConfig) {\n this.config = config;\n\n // Create adapter based on configuration type\n if (\"provider\" in config && config.provider) {\n // Use AIProvider to get adapter\n this.adapter = config.provider.languageModel(config.model);\n } else if (\"adapter\" in config && config.adapter) {\n // Direct adapter\n this.adapter = config.adapter;\n } else {\n throw new Error(\n \"Runtime requires either 'provider' or 'adapter' configuration. \" +\n \"Use: createRuntime({ provider: createOpenAI({ apiKey }), model: 'gpt-4o' })\",\n );\n }\n\n // Register actions (legacy)\n if (config.actions) {\n for (const action of config.actions) {\n this.actions.set(action.name, action);\n }\n }\n\n // Register tools\n if (config.tools) {\n for (const tool of config.tools) {\n this.tools.set(tool.name, tool);\n }\n }\n }\n\n /**\n * Process a chat request and return streaming response\n */\n async *processChat(\n request: ChatRequest,\n signal?: AbortSignal,\n ): AsyncGenerator<StreamEvent> {\n // Convert request messages to Message type\n const messages: Message[] = request.messages.map((m, i) =>\n createMessage({\n id: `msg_${i}`,\n role: m.role as Message[\"role\"],\n content: m.content,\n }),\n );\n\n // Merge actions from config and request\n const allActions = [...this.actions.values()];\n if (request.actions) {\n for (const action of request.actions) {\n if (!this.actions.has(action.name)) {\n allActions.push({\n name: action.name,\n description: action.description,\n parameters: action.parameters as ActionDefinition[\"parameters\"],\n handler: async () => {\n // Client-side action - will be handled by frontend\n return { handled: false };\n },\n });\n }\n }\n }\n\n // Create completion request\n const completionRequest: ChatCompletionRequest = {\n messages,\n actions: allActions.length > 0 ? allActions : undefined,\n systemPrompt: request.systemPrompt || this.config.systemPrompt,\n config: request.config,\n signal,\n webSearch: this.getWebSearchConfig(),\n };\n\n // Stream response from adapter\n const stream = this.adapter.stream(completionRequest);\n\n // Process events and handle tool calls\n for await (const event of stream) {\n // Handle action execution\n if (event.type === \"action:args\") {\n const action = this.actions.get(event.id);\n if (action) {\n try {\n const args = JSON.parse(event.args);\n const result = await action.handler(args);\n yield {\n type: \"action:end\",\n id: event.id,\n result,\n };\n } catch (error) {\n yield {\n type: \"action:end\",\n id: event.id,\n error: error instanceof Error ? error.message : \"Action failed\",\n };\n }\n } else {\n // Forward to client for handling\n yield event;\n }\n } else {\n yield event;\n }\n }\n }\n\n /**\n * Handle HTTP request (for use with any framework)\n *\n * @param request - The HTTP request\n * @param options - Optional configuration including onFinish callback for persistence\n *\n * @example\n * ```typescript\n * // Basic usage\n * return runtime.handleRequest(request);\n *\n * // With server-side persistence\n * return runtime.handleRequest(request, {\n * onFinish: async ({ messages, threadId }) => {\n * await db.thread.upsert({\n * where: { id: threadId },\n * update: { messages, updatedAt: new Date() },\n * create: { id: threadId, messages },\n * });\n * },\n * });\n * ```\n */\n async handleRequest(\n request: Request,\n options?: HandleRequestOptions,\n ): Promise<Response> {\n try {\n const body = (await request.json()) as ChatRequest;\n\n if (this.config.debug) {\n console.log(\"[Copilot SDK] Request:\", JSON.stringify(body, null, 2));\n }\n\n // Create abort controller from request signal\n const signal = request.signal;\n\n // Use agent loop if tools are present or explicitly enabled\n const hasTools =\n (body.tools && body.tools.length > 0) || this.tools.size > 0;\n const useAgentLoop = hasTools || this.config.agentLoop?.enabled;\n\n // NON-STREAMING: Return JSON response instead of SSE\n if (body.streaming === false) {\n return this.handleNonStreamingRequest(\n body,\n signal,\n useAgentLoop || false,\n request,\n options,\n );\n }\n\n // STREAMING: Process chat and return SSE response\n // Always use processChatWithLoop for consistent message handling\n const generator = this.processChatWithLoop(\n body,\n signal,\n undefined,\n undefined,\n request,\n );\n\n // Wrap generator to intercept done event for onFinish callback\n const wrappedGenerator = this.wrapGeneratorWithOnFinish(\n generator,\n body.threadId,\n options,\n );\n\n return createSSEResponse(wrappedGenerator);\n } catch (error) {\n console.error(\"[Copilot SDK] Error:\", error);\n\n return new Response(\n JSON.stringify({\n error: error instanceof Error ? error.message : \"Unknown error\",\n }),\n {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n }\n\n /**\n * Wrap a generator to intercept the done event and call onFinish\n */\n private async *wrapGeneratorWithOnFinish(\n generator: AsyncGenerator<StreamEvent>,\n threadId?: string,\n options?: HandleRequestOptions,\n ): AsyncGenerator<StreamEvent> {\n let doneMessages: DoneEventMessage[] | undefined;\n let doneUsage:\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens?: number;\n }\n | undefined;\n\n for await (const event of generator) {\n // Capture messages and usage from done event\n if (event.type === \"done\") {\n if (event.messages) {\n doneMessages = event.messages;\n }\n if (event.usage) {\n doneUsage = event.usage;\n }\n // Strip usage from client-facing event (usage is server-side only for billing)\n const { usage: _usage, ...clientEvent } = event;\n yield clientEvent as StreamEvent;\n } else {\n yield event;\n }\n }\n\n // Call onFinish after stream completes\n if (options?.onFinish && doneMessages) {\n try {\n const result: HandleRequestResult = {\n messages: doneMessages,\n threadId,\n usage: doneUsage\n ? {\n promptTokens: doneUsage.prompt_tokens,\n completionTokens: doneUsage.completion_tokens,\n totalTokens:\n doneUsage.total_tokens ??\n doneUsage.prompt_tokens + doneUsage.completion_tokens,\n }\n : undefined,\n };\n await options.onFinish(result);\n } catch (error) {\n console.error(\"[Copilot SDK] onFinish callback error:\", error);\n }\n }\n }\n\n /**\n * Handle non-streaming request - returns JSON instead of SSE\n */\n private async handleNonStreamingRequest(\n body: ChatRequest,\n signal: AbortSignal | undefined,\n _useAgentLoop: boolean, // Kept for backward compatibility, always uses agent loop now\n httpRequest: Request,\n options?: HandleRequestOptions,\n ): Promise<Response> {\n try {\n // Always use processChatWithLoop for consistent message handling\n const generator = this.processChatWithLoop(\n body,\n signal,\n undefined,\n undefined,\n httpRequest,\n );\n\n // Collect all events\n const events: StreamEvent[] = [];\n let content = \"\";\n const toolCalls: ToolCallInfo[] = [];\n const toolResults: Array<{ id: string; result: unknown }> = [];\n let messages: DoneEventMessage[] | undefined;\n let requiresAction = false;\n let error: { message: string; code?: string } | undefined;\n let doneUsage:\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens?: number;\n }\n | undefined;\n\n for await (const event of generator) {\n events.push(event);\n\n switch (event.type) {\n case \"message:delta\":\n content += event.content;\n break;\n case \"action:start\":\n toolCalls.push({ id: event.id, name: event.name, args: {} });\n break;\n case \"action:args\":\n const tc = toolCalls.find((t) => t.id === event.id);\n if (tc) {\n try {\n tc.args = JSON.parse(event.args || \"{}\");\n } catch {\n tc.args = {};\n }\n }\n break;\n case \"action:end\":\n toolResults.push({\n id: event.id,\n result: event.result || event.error,\n });\n break;\n case \"tool_calls\":\n // Client-side tool calls\n break;\n case \"done\":\n messages = event.messages;\n requiresAction = event.requiresAction || false;\n if (event.usage) {\n doneUsage = event.usage;\n }\n break;\n case \"error\":\n error = { message: event.message, code: event.code };\n break;\n }\n }\n\n // Call onFinish callback if provided\n if (options?.onFinish && messages && !error) {\n try {\n const result: HandleRequestResult = {\n messages,\n threadId: body.threadId,\n usage: doneUsage\n ? {\n promptTokens: doneUsage.prompt_tokens,\n completionTokens: doneUsage.completion_tokens,\n totalTokens:\n doneUsage.total_tokens ??\n doneUsage.prompt_tokens + doneUsage.completion_tokens,\n }\n : undefined,\n };\n await options.onFinish(result);\n } catch (callbackError) {\n console.error(\n \"[Copilot SDK] onFinish callback error:\",\n callbackError,\n );\n }\n }\n\n // Build JSON response\n const response = {\n success: !error,\n content,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n toolResults: toolResults.length > 0 ? toolResults : undefined,\n messages,\n requiresAction,\n error,\n // Include raw events for debugging\n _events: this.config.debug ? events : undefined,\n };\n\n console.log(\"[Copilot SDK] Non-streaming response:\", {\n contentLength: content.length,\n toolCalls: toolCalls.length,\n toolResults: toolResults.length,\n messagesCount: messages?.length,\n requiresAction,\n hasError: !!error,\n });\n\n return new Response(JSON.stringify(response), {\n status: error ? 500 : 200,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Access-Control-Allow-Origin\": \"*\",\n },\n });\n } catch (err) {\n console.error(\"[Copilot SDK] Non-streaming error:\", err);\n return new Response(\n JSON.stringify({\n success: false,\n error: {\n message: err instanceof Error ? err.message : \"Unknown error\",\n },\n }),\n {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n }\n\n /**\n * Get registered actions\n */\n getActions(): ActionDefinition[] {\n return [...this.actions.values()];\n }\n\n /**\n * Register a new action\n */\n registerAction(action: ActionDefinition): void {\n this.actions.set(action.name, action);\n }\n\n /**\n * Unregister an action\n */\n unregisterAction(name: string): void {\n this.actions.delete(name);\n }\n\n /**\n * Register a new tool\n */\n registerTool(tool: ToolDefinition): void {\n this.tools.set(tool.name, tool);\n }\n\n /**\n * Unregister a tool\n */\n unregisterTool(name: string): void {\n this.tools.delete(name);\n }\n\n /**\n * Get registered tools\n */\n getTools(): ToolDefinition[] {\n return [...this.tools.values()];\n }\n\n /**\n * Get the AI provider instance (if using provider config)\n */\n getProvider(): AIProvider | null {\n if (\"provider\" in this.config) {\n return this.config.provider as AIProvider;\n }\n return null;\n }\n\n /**\n * Get the current model ID\n */\n getModel(): string {\n if (\"provider\" in this.config) {\n return this.config.model;\n }\n return this.adapter.model;\n }\n\n /**\n * Get web search configuration from runtime config\n */\n private getWebSearchConfig(): boolean | WebSearchConfig | undefined {\n if (\"webSearch\" in this.config) {\n return this.config.webSearch;\n }\n return undefined;\n }\n\n /**\n * Process a chat request with tool support (Vercel AI SDK pattern)\n *\n * This method:\n * 1. Streams response from adapter\n * 2. Detects tool calls from streaming events\n * 3. Server-side tools are executed immediately\n * 4. Client-side tool calls are yielded for client to execute\n * 5. Loop continues until no more tool calls or max iterations reached\n * 6. Returns all new messages in the done event for client to append\n */\n async *processChatWithLoop(\n request: ChatRequest,\n signal?: AbortSignal,\n // Internal: accumulated messages from recursive calls (for returning in done event)\n _accumulatedMessages?: DoneEventMessage[],\n _isRecursive?: boolean,\n // HTTP request for extracting headers (auth context)\n _httpRequest?: Request,\n ): AsyncGenerator<StreamEvent> {\n const debug = this.config.debug || this.config.agentLoop?.debug;\n\n // Check if non-streaming mode is requested\n // Use non-streaming for better comparison with original studio-ai behavior\n if (request.streaming === false) {\n if (debug) {\n console.log(\"[Copilot SDK] Using non-streaming mode\");\n }\n // Delegate to non-streaming implementation\n for await (const event of this.processChatWithLoopNonStreaming(\n request,\n signal,\n _accumulatedMessages,\n _isRecursive,\n _httpRequest,\n )) {\n yield event;\n }\n return;\n }\n\n // Track new messages created during this request\n const newMessages: DoneEventMessage[] = _accumulatedMessages || [];\n const maxIterations = this.config.agentLoop?.maxIterations || 20;\n\n // Collect all tools (server + client from request)\n const allTools: ToolDefinition[] = [...this.tools.values()];\n\n // Add client tools from request\n if (request.tools) {\n for (const tool of request.tools) {\n allTools.push({\n name: tool.name,\n description: tool.description,\n location: \"client\",\n inputSchema: tool.inputSchema as ToolDefinition[\"inputSchema\"],\n });\n }\n }\n\n if (debug) {\n console.log(\n `[Copilot SDK] Processing chat with ${allTools.length} tools`,\n );\n // Log messages with attachments for debugging vision support\n for (let i = 0; i < request.messages.length; i++) {\n const msg = request.messages[i];\n const hasAttachments = msg.attachments && msg.attachments.length > 0;\n if (hasAttachments) {\n console.log(\n `[Copilot SDK] Message ${i} (${msg.role}) has ${msg.attachments!.length} attachments:`,\n msg.attachments!.map((a) => ({\n type: a.type,\n mimeType: a.mimeType,\n dataLength: a.data?.length || 0,\n })),\n );\n }\n }\n }\n\n // Build system prompt\n const systemPrompt = request.systemPrompt || this.config.systemPrompt || \"\";\n\n // Accumulate data from stream\n let accumulatedText = \"\";\n const toolCalls: ToolCallInfo[] = [];\n let currentToolCall: { id: string; name: string; args: string } | null =\n null;\n // Capture usage from adapter for onFinish callback (server-side only)\n let adapterUsage:\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens?: number;\n }\n | undefined;\n\n // Create completion request\n // Use rawMessages if provided (when client sends tool results in messages)\n const completionRequest: ChatCompletionRequest = {\n messages: [], // Not used when rawMessages is provided\n rawMessages: request.messages as Array<Record<string, unknown>>,\n actions: this.convertToolsToActions(allTools),\n systemPrompt: systemPrompt,\n config: request.config,\n signal,\n webSearch: this.getWebSearchConfig(),\n };\n\n // Stream from adapter\n const stream = this.adapter.stream(completionRequest);\n\n // Process stream events\n for await (const event of stream) {\n switch (event.type) {\n case \"message:start\":\n case \"message:end\":\n yield event; // Forward to client\n break;\n\n case \"message:delta\":\n accumulatedText += event.content;\n yield event; // Forward text to client\n break;\n\n case \"action:start\":\n currentToolCall = { id: event.id, name: event.name, args: \"\" };\n if (debug) {\n console.log(`[Copilot SDK] Tool call started: ${event.name}`);\n }\n yield event; // Forward to client\n break;\n\n case \"action:args\":\n if (currentToolCall) {\n try {\n const parsedArgs = JSON.parse(event.args || \"{}\");\n if (debug) {\n console.log(\n `[Copilot SDK] Tool args for ${currentToolCall.name}:`,\n parsedArgs,\n );\n }\n toolCalls.push({\n id: currentToolCall.id,\n name: currentToolCall.name,\n args: parsedArgs,\n });\n } catch (e) {\n console.error(\n \"[Copilot SDK] Failed to parse tool args:\",\n event.args,\n e,\n );\n toolCalls.push({\n id: currentToolCall.id,\n name: currentToolCall.name,\n args: {},\n });\n }\n currentToolCall = null;\n }\n yield event; // Forward to client\n break;\n\n case \"citation\":\n // Forward web search citations to client\n yield event;\n break;\n\n case \"error\":\n yield event;\n return; // Exit on error\n\n case \"done\":\n // Capture usage from adapter's done event (for onFinish callback)\n // We don't yield done yet - we need to check for tool calls first\n if (event.usage) {\n adapterUsage = event.usage;\n }\n break;\n\n default:\n yield event;\n }\n }\n\n // Check if we got tool calls\n if (toolCalls.length > 0) {\n if (debug) {\n console.log(\n `[Copilot SDK] Detected ${toolCalls.length} tool calls:`,\n toolCalls.map((t) => t.name),\n );\n }\n\n // Separate server-side and client-side tool calls\n const serverToolCalls: ToolCallInfo[] = [];\n const clientToolCalls: ToolCallInfo[] = [];\n\n for (const tc of toolCalls) {\n const tool = allTools.find((t) => t.name === tc.name);\n if (tool?.location === \"server\" && tool.handler) {\n serverToolCalls.push(tc);\n } else {\n clientToolCalls.push(tc);\n }\n }\n\n // Execute server-side tools\n const serverToolResults: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n result: unknown;\n tool: ToolDefinition;\n }> = [];\n\n // Get toolContext from config (if available)\n const toolContextData =\n \"toolContext\" in this.config ? this.config.toolContext : undefined;\n\n for (const tc of serverToolCalls) {\n const tool = allTools.find((t) => t.name === tc.name);\n if (tool?.handler) {\n if (debug) {\n console.log(`[Copilot SDK] Executing server-side tool: ${tc.name}`);\n }\n\n // Build rich context for the tool handler\n const toolContext = buildToolContext(\n tc.id,\n signal,\n request.threadId,\n _httpRequest,\n toolContextData,\n );\n\n try {\n const result = await tool.handler(tc.args, toolContext);\n serverToolResults.push({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n result,\n tool,\n });\n\n yield {\n type: \"action:end\",\n id: tc.id,\n result,\n } as StreamEvent;\n } catch (error) {\n const errorResult = {\n success: false,\n error:\n error instanceof Error\n ? error.message\n : \"Tool execution failed\",\n };\n serverToolResults.push({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n result: errorResult,\n tool,\n });\n\n yield {\n type: \"action:end\",\n id: tc.id,\n error:\n error instanceof Error\n ? error.message\n : \"Tool execution failed\",\n } as StreamEvent;\n }\n }\n }\n\n // If there are server-side tools executed, continue the loop by making another LLM call\n if (serverToolResults.length > 0) {\n if (debug) {\n console.log(\n `[Copilot SDK] Server tools executed, continuing conversation...`,\n );\n }\n\n // Create assistant message with tool_calls\n const assistantWithToolCalls: DoneEventMessage = {\n role: \"assistant\",\n content: accumulatedText || null,\n tool_calls: serverToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n\n // Create tool result messages (using buildToolResultForAI for AI response control)\n const toolResultMessages: DoneEventMessage[] = serverToolResults.map(\n (tr) => {\n const aiContent = buildToolResultForAI(tr.tool, tr.result, tr.args);\n // Serialize content (handles both string and multimodal)\n const content =\n typeof aiContent === \"string\"\n ? aiContent\n : JSON.stringify(serializeToolResultContent(aiContent));\n return {\n role: \"tool\" as const,\n content,\n tool_call_id: tr.id,\n };\n },\n );\n\n // Add to accumulated messages for client\n newMessages.push(assistantWithToolCalls);\n newMessages.push(...toolResultMessages);\n\n // Build messages for next LLM call (cast DoneEventMessage to Record for request)\n const messagesWithResults: Array<Record<string, unknown>> = [\n ...(request.messages as Array<Record<string, unknown>>),\n assistantWithToolCalls as unknown as Record<string, unknown>,\n ...(toolResultMessages as unknown as Array<Record<string, unknown>>),\n ];\n\n // Make recursive call with updated messages\n const nextRequest: ChatRequest = {\n ...request,\n messages: messagesWithResults as ChatRequest[\"messages\"],\n };\n\n // Continue the agent loop - pass accumulated messages and HTTP request\n for await (const event of this.processChatWithLoop(\n nextRequest,\n signal,\n newMessages,\n true, // Mark as recursive\n _httpRequest,\n )) {\n yield event;\n }\n return;\n }\n\n // If there are client-side tools, send them to client\n if (clientToolCalls.length > 0) {\n // Build assistant message with tool_calls for client to include in next request\n const assistantMessage: AssistantToolMessage = {\n role: \"assistant\",\n content: accumulatedText || null,\n tool_calls: clientToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n\n // Add to accumulated messages (cast to DoneEventMessage since structure matches)\n newMessages.push(assistantMessage as DoneEventMessage);\n\n // Yield tool_calls event (Vercel AI SDK pattern)\n yield {\n type: \"tool_calls\",\n toolCalls: clientToolCalls,\n assistantMessage,\n } as StreamEvent;\n\n // Signal that client needs to execute tools and send results\n // Include accumulated messages so client can update state\n // Include usage for onFinish callback (will be stripped before sending to client)\n yield {\n type: \"done\",\n requiresAction: true,\n messages: newMessages,\n usage: adapterUsage,\n } as StreamEvent;\n return;\n }\n }\n\n // No tool calls - add final assistant message and we're done\n if (accumulatedText) {\n newMessages.push({\n role: \"assistant\" as const,\n content: accumulatedText,\n });\n }\n\n if (debug) {\n console.log(\n `[Copilot SDK] Stream complete, returning ${newMessages.length} new messages`,\n );\n }\n\n // Return all accumulated messages for client to append\n // Include usage for onFinish callback (will be stripped before sending to client)\n yield {\n type: \"done\",\n messages: newMessages.length > 0 ? newMessages : undefined,\n usage: adapterUsage,\n } as StreamEvent;\n }\n\n /**\n * Non-streaming agent loop implementation\n *\n * Uses adapter.complete() instead of stream() for:\n * - Better comparison with original studio-ai behavior\n * - Easier debugging (full response at once)\n * - More predictable retry behavior\n */\n private async *processChatWithLoopNonStreaming(\n request: ChatRequest,\n signal?: AbortSignal,\n _accumulatedMessages?: DoneEventMessage[],\n _isRecursive?: boolean,\n _httpRequest?: Request,\n ): AsyncGenerator<StreamEvent> {\n const newMessages: DoneEventMessage[] = _accumulatedMessages || [];\n const debug = this.config.debug || this.config.agentLoop?.debug;\n const maxIterations = this.config.agentLoop?.maxIterations || 20;\n // Track accumulated usage across iterations (for onFinish callback)\n let accumulatedUsage: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n } = { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 };\n\n // Collect all tools (server + client from request)\n const allTools: ToolDefinition[] = [...this.tools.values()];\n\n // Add client tools from request\n if (request.tools) {\n for (const tool of request.tools) {\n allTools.push({\n name: tool.name,\n description: tool.description,\n location: \"client\",\n inputSchema: tool.inputSchema as ToolDefinition[\"inputSchema\"],\n });\n }\n }\n\n // Build system prompt\n const systemPrompt = request.systemPrompt || this.config.systemPrompt || \"\";\n\n // Main agent loop\n let iteration = 0;\n let conversationMessages = request.messages as Array<\n Record<string, unknown>\n >;\n\n while (iteration < maxIterations) {\n iteration++;\n\n if (debug) {\n console.log(`[Copilot SDK] Iteration ${iteration}/${maxIterations}`);\n }\n\n // Check for abort\n if (signal?.aborted) {\n yield {\n type: \"error\",\n message: \"Aborted\",\n code: \"ABORTED\",\n } as StreamEvent;\n return;\n }\n\n // Check if adapter supports non-streaming\n if (!this.adapter.complete) {\n if (debug) {\n console.log(\n \"[Copilot SDK] Adapter does not support non-streaming, falling back to streaming\",\n );\n }\n // Fall back to streaming by delegating to the streaming implementation\n // But set streaming to true to avoid infinite loop\n const streamingRequest = { ...request, streaming: true };\n for await (const event of this.processChatWithLoop(\n streamingRequest,\n signal,\n _accumulatedMessages,\n _isRecursive,\n _httpRequest,\n )) {\n yield event;\n }\n return;\n }\n\n // Create completion request\n const completionRequest: ChatCompletionRequest = {\n messages: [],\n rawMessages: conversationMessages,\n actions: this.convertToolsToActions(allTools),\n systemPrompt: systemPrompt,\n config: request.config,\n signal,\n webSearch: this.getWebSearchConfig(),\n };\n\n try {\n // Call the non-streaming complete method\n const result = await this.adapter.complete(completionRequest);\n\n // Capture usage from adapter response (convert camelCase to snake_case)\n if (result.usage) {\n accumulatedUsage.prompt_tokens += result.usage.promptTokens;\n accumulatedUsage.completion_tokens += result.usage.completionTokens;\n accumulatedUsage.total_tokens += result.usage.totalTokens;\n }\n\n if (debug) {\n console.log(\n `[Copilot SDK] Got response: ${result.content.length} chars, ${result.toolCalls.length} tool calls`,\n );\n }\n\n // Emit message events (for SSE compatibility)\n yield { type: \"message:start\", id: `msg_${Date.now()}` } as StreamEvent;\n if (result.content) {\n yield {\n type: \"message:delta\",\n content: result.content,\n } as StreamEvent;\n }\n yield { type: \"message:end\" } as StreamEvent;\n\n // Check for tool calls\n if (result.toolCalls.length > 0) {\n // Separate server and client tools\n const serverToolCalls: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n }> = [];\n const clientToolCalls: ToolCallInfo[] = [];\n\n for (const tc of result.toolCalls) {\n const tool = allTools.find((t) => t.name === tc.name);\n if (tool?.location === \"server\" && tool.handler) {\n serverToolCalls.push(tc);\n } else {\n clientToolCalls.push({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n });\n }\n }\n\n // Emit tool call events\n for (const tc of result.toolCalls) {\n const tool = allTools.find((t) => t.name === tc.name);\n yield {\n type: \"action:start\",\n id: tc.id,\n name: tc.name,\n hidden: tool?.hidden ?? false,\n } as StreamEvent;\n yield {\n type: \"action:args\",\n id: tc.id,\n args: JSON.stringify(tc.args),\n } as StreamEvent;\n }\n\n // Execute server-side tools\n const serverToolResults: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n result: unknown;\n tool: ToolDefinition;\n }> = [];\n\n // Get toolContext from config (if available)\n const toolContextData =\n \"toolContext\" in this.config ? this.config.toolContext : undefined;\n\n for (const tc of serverToolCalls) {\n const tool = allTools.find((t) => t.name === tc.name);\n if (tool?.handler) {\n if (debug) {\n console.log(`[Copilot SDK] Executing tool: ${tc.name}`);\n }\n\n // Build rich context for the tool handler\n const toolContext = buildToolContext(\n tc.id,\n signal,\n request.threadId,\n _httpRequest,\n toolContextData,\n );\n\n try {\n const toolResult = await tool.handler(tc.args, toolContext);\n serverToolResults.push({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n result: toolResult,\n tool,\n });\n yield {\n type: \"action:end\",\n id: tc.id,\n result: toolResult,\n } as StreamEvent;\n } catch (error) {\n const errorResult = {\n success: false,\n error:\n error instanceof Error\n ? error.message\n : \"Tool execution failed\",\n };\n serverToolResults.push({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n result: errorResult,\n tool,\n });\n yield {\n type: \"action:end\",\n id: tc.id,\n error:\n error instanceof Error\n ? error.message\n : \"Tool execution failed\",\n } as StreamEvent;\n }\n }\n }\n\n // If server tools were executed, continue the loop\n if (serverToolResults.length > 0) {\n // Build assistant message with tool_calls\n const assistantWithToolCalls: DoneEventMessage = {\n role: \"assistant\",\n content: result.content || null,\n tool_calls: result.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n\n // Build tool result messages (using buildToolResultForAI for AI response control)\n const toolResultMessages: DoneEventMessage[] =\n serverToolResults.map((tr) => {\n const aiContent = buildToolResultForAI(\n tr.tool,\n tr.result,\n tr.args,\n );\n const content =\n typeof aiContent === \"string\"\n ? aiContent\n : JSON.stringify(serializeToolResultContent(aiContent));\n return {\n role: \"tool\" as const,\n content,\n tool_call_id: tr.id,\n };\n });\n\n // Add to accumulated messages\n newMessages.push(assistantWithToolCalls);\n newMessages.push(...toolResultMessages);\n\n // Update conversation for next iteration\n conversationMessages = [\n ...conversationMessages,\n assistantWithToolCalls as unknown as Record<string, unknown>,\n ...(toolResultMessages as unknown as Array<\n Record<string, unknown>\n >),\n ];\n\n // Continue loop\n continue;\n }\n\n // Client tools - yield for client to execute and return\n if (clientToolCalls.length > 0) {\n const assistantMessage: AssistantToolMessage = {\n role: \"assistant\",\n content: result.content || null,\n tool_calls: clientToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n\n newMessages.push(assistantMessage as DoneEventMessage);\n\n yield {\n type: \"tool_calls\",\n toolCalls: clientToolCalls,\n assistantMessage,\n } as StreamEvent;\n\n yield {\n type: \"done\",\n requiresAction: true,\n messages: newMessages,\n usage:\n accumulatedUsage.total_tokens > 0\n ? accumulatedUsage\n : undefined,\n } as StreamEvent;\n return;\n }\n }\n\n // No tool calls - we're done\n if (result.content) {\n newMessages.push({\n role: \"assistant\" as const,\n content: result.content,\n });\n }\n\n if (debug) {\n console.log(`[Copilot SDK] Complete after ${iteration} iterations`);\n }\n\n yield {\n type: \"done\",\n messages: newMessages.length > 0 ? newMessages : undefined,\n usage:\n accumulatedUsage.total_tokens > 0 ? accumulatedUsage : undefined,\n } as StreamEvent;\n return;\n } catch (error) {\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"COMPLETION_ERROR\",\n } as StreamEvent;\n return;\n }\n }\n\n // Max iterations reached\n if (debug) {\n console.log(`[Copilot SDK] Max iterations (${maxIterations}) reached`);\n }\n\n yield {\n type: \"done\",\n messages: newMessages.length > 0 ? newMessages : undefined,\n usage: accumulatedUsage.total_tokens > 0 ? accumulatedUsage : undefined,\n } as StreamEvent;\n }\n\n /**\n * Convert tools to legacy action format (for adapter compatibility)\n */\n private convertToolsToActions(tools: ToolDefinition[]): ActionDefinition[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: this.convertInputSchemaToParameters(tool.inputSchema),\n handler: tool.handler || (async () => ({ handled: false })),\n }));\n }\n\n /**\n * Convert JSON Schema property to ActionParameter format recursively\n */\n private convertSchemaProperty(prop: unknown): ActionParameter {\n const p = prop as {\n type?: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n };\n\n type ParamType = \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\n const typeMap: Record<string, ParamType> = {\n string: \"string\",\n number: \"number\",\n integer: \"number\",\n boolean: \"boolean\",\n object: \"object\",\n array: \"array\",\n };\n\n const result: ActionParameter = {\n type: typeMap[p.type || \"string\"] || \"string\",\n };\n\n if (p.description) {\n result.description = p.description;\n }\n\n if (p.enum) {\n result.enum = p.enum;\n }\n\n // Preserve items for array types\n if (p.type === \"array\" && p.items) {\n result.items = this.convertSchemaProperty(p.items);\n }\n\n // Preserve properties for object types\n if (p.type === \"object\" && p.properties) {\n result.properties = Object.fromEntries(\n Object.entries(p.properties).map(([key, val]) => [\n key,\n this.convertSchemaProperty(val),\n ]),\n );\n }\n\n return result;\n }\n\n /**\n * Convert JSON Schema to legacy parameters format\n */\n private convertInputSchemaToParameters(\n schema: ToolDefinition[\"inputSchema\"],\n ): Record<string, ActionParameter> {\n const parameters: Record<string, ActionParameter> = {};\n\n if (!schema?.properties) {\n return parameters;\n }\n\n for (const [name, prop] of Object.entries(schema.properties)) {\n const converted = this.convertSchemaProperty(prop);\n parameters[name] = {\n ...converted,\n required: schema.required?.includes(name),\n };\n }\n\n return parameters;\n }\n\n // ============================================\n // StreamResult API (Industry Standard Pattern)\n // ============================================\n\n /**\n * Stream chat and return StreamResult with helper methods\n *\n * This is the recommended API for new projects. It returns a StreamResult\n * object with multiple ways to consume the response:\n * - `pipeToResponse(res)` for Express/Node.js\n * - `toResponse()` for Next.js/Web API\n * - `collect()` for non-streaming use cases\n *\n * @example\n * ```typescript\n * // Express - one-liner\n * app.post('/chat', async (req, res) => {\n * await runtime.stream(req.body).pipeToResponse(res);\n * });\n *\n * // Next.js App Router\n * export async function POST(req: Request) {\n * const body = await req.json();\n * return runtime.stream(body).toResponse();\n * }\n *\n * // With event handlers\n * const result = runtime.stream(body)\n * .on('text', (text) => console.log(text))\n * .on('done', (result) => console.log('Done:', result.text));\n * await result.pipeToResponse(res);\n *\n * // With onFinish for usage tracking\n * await runtime.stream(body, {\n * onFinish: ({ messages, usage }) => {\n * console.log('Tokens used:', usage?.totalTokens);\n * }\n * }).pipeToResponse(res);\n * ```\n */\n stream(\n request: ChatRequest,\n options?: {\n signal?: AbortSignal;\n /**\n * Called after stream completes (for persistence, billing, etc.)\n * Usage data is only available server-side and is not exposed to clients.\n */\n onFinish?: (result: {\n messages: DoneEventMessage[];\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n }) => Promise<void> | void;\n },\n ): StreamResult {\n const generator = this.processChatWithLoop(request, options?.signal);\n return new StreamResult(generator, { onFinish: options?.onFinish });\n }\n\n /**\n * Chat and collect the full response (non-streaming)\n *\n * Convenience method that calls stream().collect() for you.\n * Use this when you need the complete response before responding.\n *\n * @example\n * ```typescript\n * const { text, messages, toolCalls } = await runtime.chat(body);\n * console.log('Response:', text);\n * res.json({ response: text });\n *\n * // Usage is included in result - strip before sending to client\n * const { usage, ...clientResult } = await runtime.chat(body);\n * await billing.record(usage);\n * res.json(clientResult);\n * ```\n */\n async chat(\n request: ChatRequest,\n options?: {\n signal?: AbortSignal;\n },\n ): Promise<CollectedResult> {\n // Usage is included in result - user can strip before sending to client\n return this.stream(request, { signal: options?.signal }).collect({\n includeUsage: true,\n });\n }\n\n /**\n * Generate a complete response (non-streaming)\n *\n * Like Vercel AI SDK's generateText() - clean, non-streaming API.\n * Returns GenerateResult with .toResponse() for CopilotChat format.\n *\n * @example\n * ```typescript\n * // Simple usage\n * const result = await runtime.generate(body);\n * console.log(result.text);\n *\n * // CopilotChat format response (Express)\n * res.json(result.toResponse());\n *\n * // CopilotChat format response (Next.js)\n * return Response.json(result.toResponse());\n *\n * // With persistence callback\n * const result = await runtime.generate(body, {\n * onFinish: async ({ messages }) => {\n * await db.saveMessages(messages);\n * },\n * });\n * ```\n */\n async generate(\n request: ChatRequest,\n options?: GenerateOptions,\n ): Promise<GenerateResult> {\n const generator = this.processChatWithLoop(\n { ...request, streaming: false },\n options?.signal,\n undefined,\n undefined,\n options?.httpRequest,\n );\n\n let text = \"\";\n const toolCalls: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n }> = [];\n const toolResults: Array<{ id: string; result: unknown }> = [];\n let messages: DoneEventMessage[] = [];\n let requiresAction = false;\n let error: { message: string; code?: string } | undefined;\n\n try {\n for await (const event of generator) {\n switch (event.type) {\n case \"message:delta\":\n text += event.content;\n break;\n case \"action:start\":\n toolCalls.push({ id: event.id, name: event.name, args: {} });\n break;\n case \"action:args\": {\n const tc = toolCalls.find((t) => t.id === event.id);\n if (tc) {\n try {\n tc.args = JSON.parse(event.args || \"{}\");\n } catch {\n tc.args = {};\n }\n }\n break;\n }\n case \"action:end\":\n toolResults.push({\n id: event.id,\n result: event.result || event.error,\n });\n break;\n case \"done\":\n messages = event.messages || [];\n requiresAction = event.requiresAction || false;\n break;\n case \"error\":\n error = { message: event.message, code: event.code };\n break;\n }\n }\n } catch (err) {\n error = {\n message: err instanceof Error ? err.message : \"Unknown error\",\n code: \"GENERATION_ERROR\",\n };\n }\n\n // Call onFinish callback if provided and no error\n if (options?.onFinish && messages.length > 0 && !error) {\n try {\n await options.onFinish({\n messages,\n threadId: request.threadId,\n });\n } catch (callbackError) {\n console.error(\n \"[Copilot SDK] generate() onFinish callback error:\",\n callbackError,\n );\n }\n }\n\n return new GenerateResult({\n text,\n messages,\n toolCalls,\n toolResults,\n requiresAction,\n error,\n });\n }\n\n /**\n * Create Express-compatible handler middleware\n *\n * Returns a function that can be used directly as Express middleware.\n *\n * @example\n * ```typescript\n * // Simple usage\n * app.post('/chat', runtime.expressHandler());\n *\n * // With options\n * app.post('/chat', runtime.expressHandler({ format: 'text' }));\n * ```\n */\n expressHandler(options?: {\n /** Response format: 'sse' (default) or 'text' */\n format?: \"sse\" | \"text\";\n /** Additional headers to include */\n headers?: Record<string, string>;\n }) {\n return async (\n req: { body: ChatRequest },\n res: {\n setHeader(name: string, value: string): void;\n write(chunk: string): boolean;\n end(): void;\n status(code: number): { json(data: unknown): void };\n },\n ) => {\n try {\n const result = this.stream(req.body);\n\n if (options?.format === \"text\") {\n await result.pipeTextToResponse(res, { headers: options?.headers });\n } else {\n await result.pipeToResponse(res, { headers: options?.headers });\n }\n } catch (error) {\n console.error(\"[Runtime] Express handler error:\", error);\n res.status(500).json({\n error: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n };\n }\n}\n\n/**\n * Create runtime instance\n */\nexport function createRuntime(config: RuntimeConfig): Runtime {\n return new Runtime(config);\n}\n","import { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport type { Runtime } from \"./runtime\";\nimport type { RuntimeConfig } from \"./types\";\nimport { createRuntime } from \"./runtime\";\nimport { createSSEResponse } from \"./streaming\";\n\n/**\n * Create Hono app with chat endpoint\n */\nexport function createHonoApp(runtime: Runtime): Hono {\n const app = new Hono();\n\n // Enable CORS\n app.use(\"*\", cors());\n\n // Health check\n app.get(\"/\", (c) => {\n return c.json({ status: \"ok\", provider: \"yourgpt-copilot\" });\n });\n\n // Chat endpoint at root (for Next.js App Router mounting)\n // e.g., mounted at /api/chat/openai → POST /api/chat/openai works\n app.post(\"/\", async (c) => {\n const request = c.req.raw;\n return runtime.handleRequest(request);\n });\n\n // Chat endpoint (standard - single turn)\n // Also available at /chat sub-path for flexibility\n app.post(\"/chat\", async (c) => {\n const request = c.req.raw;\n return runtime.handleRequest(request);\n });\n\n // Chat endpoint with agent loop (multi-turn with tools)\n // Note: With Vercel AI SDK pattern, this is the same as /chat\n // Client sends tool results in messages, server doesn't wait\n app.post(\"/chat/loop\", async (c) => {\n try {\n const body = await c.req.json();\n const signal = c.req.raw.signal;\n\n // Process with tool support\n const generator = runtime.processChatWithLoop(body, signal);\n return createSSEResponse(generator);\n } catch (error) {\n return c.json(\n { error: error instanceof Error ? error.message : \"Unknown error\" },\n 500,\n );\n }\n });\n\n // Get available actions (legacy)\n app.get(\"/actions\", (c) => {\n const actions = runtime.getActions().map((a) => ({\n name: a.name,\n description: a.description,\n parameters: a.parameters,\n }));\n return c.json({ actions });\n });\n\n // Get available tools (new)\n app.get(\"/tools\", (c) => {\n const tools = runtime.getTools().map((t) => ({\n name: t.name,\n description: t.description,\n location: t.location,\n inputSchema: t.inputSchema,\n }));\n return c.json({ tools });\n });\n\n // Get model capabilities (for UI feature flags)\n app.get(\"/capabilities\", (c) => {\n const provider = runtime.getProvider();\n const model = runtime.getModel();\n\n if (provider) {\n const capabilities = provider.getCapabilities(model);\n return c.json({\n provider: provider.name,\n model,\n capabilities,\n supportedModels: provider.supportedModels,\n });\n }\n\n // Fallback for legacy config (no provider instance)\n return c.json({\n provider: \"unknown\",\n model,\n capabilities: {\n supportsVision: false,\n supportsTools: true,\n supportsThinking: false,\n supportsStreaming: true,\n supportsPDF: false,\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: 8192,\n supportedImageTypes: [],\n supportsJsonMode: false,\n supportsSystemMessages: true,\n },\n supportedModels: [],\n });\n });\n\n return app;\n}\n\n/**\n * Next.js App Router handler\n *\n * For simple Next.js routes, prefer using `streamText()` directly:\n * @example\n * ```ts\n * // app/api/chat/route.ts (RECOMMENDED)\n * import { streamText } from '@yourgpt/llm-sdk';\n * import { openai } from '@yourgpt/llm-sdk/openai';\n *\n * export async function POST(req: Request) {\n * const { messages } = await req.json();\n * const result = await streamText({\n * model: openai('gpt-4o'),\n * system: 'You are a helpful assistant.',\n * messages,\n * });\n * return result.toTextStreamResponse();\n * }\n * ```\n *\n * Use createNextHandler when you need runtime features like tools:\n * @example\n * ```ts\n * // app/api/chat/route.ts\n * import { createNextHandler } from '@yourgpt/llm-sdk';\n * import { createOpenAI } from '@yourgpt/llm-sdk/openai';\n *\n * export const POST = createNextHandler({\n * provider: createOpenAI({ apiKey: process.env.OPENAI_API_KEY! }),\n * model: 'gpt-4o',\n * systemPrompt: 'You are a helpful assistant.',\n * });\n * ```\n */\nexport function createNextHandler(config: RuntimeConfig) {\n const runtime = createRuntime(config);\n\n return async function handler(request: Request): Promise<Response> {\n return runtime.handleRequest(request);\n };\n}\n\n/**\n * Express middleware (Simplified with StreamResult)\n *\n * Creates an Express-compatible middleware that uses the new StreamResult API.\n * Much simpler internally - no more manual request/response conversion.\n *\n * @example\n * ```ts\n * import express from 'express';\n * import { createExpressMiddleware } from '@yourgpt/llm-sdk';\n * import { createOpenAI } from '@yourgpt/llm-sdk/openai';\n *\n * const app = express();\n * app.use(express.json());\n *\n * // Simple usage\n * app.post('/api/chat', createExpressMiddleware({\n * provider: createOpenAI({ apiKey: process.env.OPENAI_API_KEY }),\n * model: 'gpt-4o',\n * }));\n *\n * // With options\n * app.post('/api/chat', createExpressMiddleware({\n * provider: createOpenAI({ apiKey: process.env.OPENAI_API_KEY }),\n * model: 'gpt-4o',\n * }, { format: 'text' }));\n * ```\n */\nexport function createExpressMiddleware(\n config: RuntimeConfig,\n options?: {\n /** Response format: 'sse' (default) or 'text' */\n format?: \"sse\" | \"text\";\n /** Additional headers to include */\n headers?: Record<string, string>;\n },\n) {\n const runtime = createRuntime(config);\n\n // Express response type - more permissive to work with different Express versions\n type ExpressResponse = {\n status: (code: number) => { json: (data: unknown) => void };\n setHeader: (\n name: string,\n value: string | number | readonly string[],\n ) => unknown;\n write: (data: string | Buffer) => boolean;\n end: () => unknown;\n };\n\n return async (req: { body: unknown }, res: ExpressResponse) => {\n try {\n // Use the new StreamResult API - much simpler!\n const result = runtime.stream(req.body as import(\"./types\").ChatRequest);\n\n // Cast to the interface expected by pipeToResponse\n // This is safe because Express response satisfies these methods\n const nodeRes = res as unknown as {\n setHeader(\n name: string,\n value: string | number | readonly string[],\n ): void;\n write(chunk: string | Buffer): boolean;\n end(): void;\n };\n\n if (options?.format === \"text\") {\n await result.pipeTextToResponse(nodeRes, { headers: options?.headers });\n } else {\n await result.pipeToResponse(nodeRes, { headers: options?.headers });\n }\n } catch (error) {\n console.error(\"[Express Middleware] Error:\", error);\n res.status(500).json({\n error: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n };\n}\n\n/**\n * Create Express handler from existing Runtime instance\n *\n * Use this when you already have a Runtime instance and want to create\n * an Express handler from it.\n *\n * @example\n * ```ts\n * import express from 'express';\n * import { createRuntime, createExpressHandler } from '@yourgpt/llm-sdk';\n * import { createOpenAI } from '@yourgpt/llm-sdk/openai';\n *\n * const runtime = createRuntime({\n * provider: createOpenAI({ apiKey: process.env.OPENAI_API_KEY }),\n * model: 'gpt-4o',\n * });\n *\n * const app = express();\n * app.use(express.json());\n *\n * // Use with existing runtime\n * app.post('/api/chat', createExpressHandler(runtime));\n *\n * // Or use runtime.expressHandler() directly\n * app.post('/api/chat', runtime.expressHandler());\n * ```\n */\nexport function createExpressHandler(\n runtime: Runtime,\n options?: {\n format?: \"sse\" | \"text\";\n headers?: Record<string, string>;\n },\n) {\n return runtime.expressHandler(options);\n}\n\n/**\n * Node.js HTTP handler\n *\n * @example\n * ```ts\n * import http from 'http';\n * import { createNodeHandler } from '@yourgpt/llm-sdk';\n * import { createOpenAI } from '@yourgpt/llm-sdk/openai';\n *\n * const handler = createNodeHandler({\n * provider: createOpenAI({ apiKey: process.env.OPENAI_API_KEY! }),\n * model: 'gpt-4o',\n * systemPrompt: 'You are a helpful assistant.',\n * });\n *\n * const server = http.createServer(handler);\n * server.listen(3001);\n * ```\n */\nexport function createNodeHandler(config: RuntimeConfig) {\n const runtime = createRuntime(config);\n const app = createHonoApp(runtime);\n\n return app.fetch;\n}\n","/**\n * Utility functions for llm-sdk\n */\n\n/**\n * Generate a unique ID with optional prefix\n */\nexport function generateId(prefix = \"id\"): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Generate a message ID\n */\nexport function generateMessageId(): string {\n return generateId(\"msg\");\n}\n\n/**\n * Generate a conversation/thread ID\n */\nexport function generateThreadId(): string {\n return generateId(\"thread\");\n}\n\n/**\n * Generate a tool call ID\n */\nexport function generateToolCallId(): string {\n return generateId(\"call\");\n}\n","/**\n * OpenAI Provider Formatter\n *\n * Transformation functions for OpenAI API format\n * Also used by xAI/Grok (they use OpenAI-compatible format)\n */\n\nimport type {\n ToolDefinition,\n UnifiedToolCall,\n UnifiedToolResult,\n} from \"../core/stream-events\";\nimport type {\n ProviderFormatter,\n OpenAITool,\n OpenAIToolCall,\n OpenAIToolResult,\n} from \"./types\";\n\n// ========================================\n// Tool Definition Transformation\n// ========================================\n\n/**\n * Transform unified tool definitions to OpenAI format\n */\nexport function transformTools(tools: ToolDefinition[]): OpenAITool[] {\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }));\n}\n\n// ========================================\n// Response Parsing\n// ========================================\n\n/**\n * Parse tool calls from OpenAI response\n */\nexport function parseToolCalls(response: unknown): UnifiedToolCall[] {\n const resp = response as Record<string, unknown>;\n const choices = resp?.choices as Array<Record<string, unknown>> | undefined;\n const message = choices?.[0]?.message as Record<string, unknown> | undefined;\n const toolCalls = (message?.tool_calls as OpenAIToolCall[]) || [];\n\n return toolCalls.map((tc) => {\n let input: Record<string, unknown> = {};\n try {\n input = JSON.parse(tc.function.arguments);\n } catch (e) {\n console.error(\n \"Failed to parse tool arguments:\",\n tc.function.arguments,\n e,\n );\n }\n return {\n id: tc.id,\n name: tc.function.name,\n input,\n };\n });\n}\n\n/**\n * Extract text content from OpenAI response\n */\nexport function extractTextContent(response: unknown): string {\n const resp = response as Record<string, unknown>;\n const choices = resp?.choices as Array<Record<string, unknown>> | undefined;\n const message = choices?.[0]?.message as Record<string, unknown> | undefined;\n return (message?.content as string) || \"\";\n}\n\n// ========================================\n// Tool Result Formatting\n// ========================================\n\n/**\n * Format tool results for OpenAI\n */\nexport function formatToolResults(\n results: UnifiedToolResult[],\n): OpenAIToolResult[] {\n return results.map((r) => ({\n role: \"tool\" as const,\n tool_call_id: r.toolCallId,\n content: r.content,\n }));\n}\n\n// ========================================\n// Stop Reason Detection\n// ========================================\n\n/**\n * Check if response indicates the AI wants to use tools\n */\nexport function isToolUseStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n const choices = resp?.choices as Array<Record<string, unknown>> | undefined;\n return choices?.[0]?.finish_reason === \"tool_calls\";\n}\n\n/**\n * Check if response indicates conversation should end\n */\nexport function isEndTurnStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n const choices = resp?.choices as Array<Record<string, unknown>> | undefined;\n return choices?.[0]?.finish_reason === \"stop\";\n}\n\n/**\n * Get the stop reason string from response\n */\nexport function getStopReason(response: unknown): string {\n const resp = response as Record<string, unknown>;\n const choices = resp?.choices as Array<Record<string, unknown>> | undefined;\n return (choices?.[0]?.finish_reason as string) || \"unknown\";\n}\n\n// ========================================\n// Message Building\n// ========================================\n\n/**\n * Build assistant message with tool calls for OpenAI format\n */\nexport function buildAssistantToolMessage(\n toolCalls: UnifiedToolCall[],\n textContent?: string,\n): unknown {\n return {\n role: \"assistant\",\n content: textContent || null,\n tool_calls: toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.input),\n },\n })),\n };\n}\n\n/**\n * Build tool result messages for OpenAI\n * In OpenAI format, each tool result is a separate message\n */\nexport function buildToolResultMessage(results: UnifiedToolResult[]): unknown {\n // OpenAI expects each tool result as a separate message\n // Return an array to be spread into the conversation\n return formatToolResults(results);\n}\n\n// ========================================\n// Formatter Object\n// ========================================\n\n/**\n * OpenAI provider formatter\n */\nexport const openaiFormatter: ProviderFormatter = {\n transformTools,\n parseToolCalls,\n formatToolResults,\n isToolUseStop,\n isEndTurnStop,\n getStopReason,\n extractTextContent,\n buildAssistantToolMessage,\n buildToolResultMessage,\n};\n","/**\n * Anthropic/Claude Provider Formatter\n *\n * Transformation functions for Anthropic API format\n */\n\nimport type {\n ToolDefinition,\n UnifiedToolCall,\n UnifiedToolResult,\n} from \"../core/stream-events\";\nimport type {\n ProviderFormatter,\n AnthropicTool,\n AnthropicToolUse,\n AnthropicToolResult,\n} from \"./types\";\n\n// ========================================\n// Tool Definition Transformation\n// ========================================\n\n/**\n * Transform unified tool definitions to Anthropic format\n */\nexport function transformTools(tools: ToolDefinition[]): AnthropicTool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema,\n }));\n}\n\n// ========================================\n// Response Parsing\n// ========================================\n\n/**\n * Parse tool calls from Anthropic response content\n */\nexport function parseToolCalls(response: unknown): UnifiedToolCall[] {\n // Handle both raw response and content array\n const content = Array.isArray(response)\n ? response\n : (response as Record<string, unknown>)?.content;\n\n if (!Array.isArray(content)) {\n return [];\n }\n\n return content\n .filter((block): block is AnthropicToolUse => block?.type === \"tool_use\")\n .map((block) => ({\n id: block.id,\n name: block.name,\n input: block.input || {},\n }));\n}\n\n/**\n * Extract text content from Anthropic response\n */\nexport function extractTextContent(response: unknown): string {\n // Handle both raw response and content array\n const content = Array.isArray(response)\n ? response\n : (response as Record<string, unknown>)?.content;\n\n if (!Array.isArray(content)) {\n return \"\";\n }\n\n return content\n .filter((block) => block?.type === \"text\")\n .map((block) => (block as { text?: string }).text || \"\")\n .join(\"\\n\");\n}\n\n// ========================================\n// Tool Result Formatting\n// ========================================\n\n/**\n * Format tool results for Anthropic\n */\nexport function formatToolResults(\n results: UnifiedToolResult[],\n): AnthropicToolResult[] {\n return results.map((r) => ({\n type: \"tool_result\" as const,\n tool_use_id: r.toolCallId,\n content: r.content,\n }));\n}\n\n// ========================================\n// Stop Reason Detection\n// ========================================\n\n/**\n * Check if response indicates the AI wants to use tools\n */\nexport function isToolUseStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n return resp?.stop_reason === \"tool_use\";\n}\n\n/**\n * Check if response indicates conversation should end\n */\nexport function isEndTurnStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n const stopReason = resp?.stop_reason;\n return stopReason === \"end_turn\" || stopReason === \"stop\";\n}\n\n/**\n * Get the stop reason string from response\n */\nexport function getStopReason(response: unknown): string {\n const resp = response as Record<string, unknown>;\n return (resp?.stop_reason as string) || \"unknown\";\n}\n\n// ========================================\n// Message Building\n// ========================================\n\n/**\n * Build assistant message with tool calls for Anthropic format\n */\nexport function buildAssistantToolMessage(\n toolCalls: UnifiedToolCall[],\n textContent?: string,\n): unknown {\n const content: unknown[] = [];\n\n if (textContent) {\n content.push({ type: \"text\", text: textContent });\n }\n\n toolCalls.forEach((tc) => {\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.name,\n input: tc.input,\n });\n });\n\n return { role: \"assistant\", content };\n}\n\n/**\n * Build user message with tool results for Anthropic\n * In Anthropic format, tool results are sent as a user message with tool_result blocks\n */\nexport function buildToolResultMessage(results: UnifiedToolResult[]): unknown {\n return {\n role: \"user\",\n content: formatToolResults(results),\n };\n}\n\n// ========================================\n// Formatter Object\n// ========================================\n\n/**\n * Anthropic provider formatter\n */\nexport const anthropicFormatter: ProviderFormatter = {\n transformTools,\n parseToolCalls,\n formatToolResults,\n isToolUseStop,\n isEndTurnStop,\n getStopReason,\n extractTextContent,\n buildAssistantToolMessage,\n buildToolResultMessage,\n};\n","/**\n * Google Gemini Provider Formatter\n *\n * Transformation functions for Google Gemini API format\n */\n\nimport type {\n ToolDefinition,\n UnifiedToolCall,\n UnifiedToolResult,\n} from \"../core/stream-events\";\nimport type {\n ProviderFormatter,\n GeminiFunctionDeclaration,\n GeminiFunctionCall,\n GeminiFunctionResponse,\n} from \"./types\";\n\n// ========================================\n// Tool Definition Transformation\n// ========================================\n\n/**\n * Transform unified tool definitions to Gemini format\n */\nexport function transformTools(\n tools: ToolDefinition[],\n): Array<{ functionDeclarations: GeminiFunctionDeclaration[] }> {\n return [\n {\n functionDeclarations: tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n })),\n },\n ];\n}\n\n// ========================================\n// Response Parsing\n// ========================================\n\n/**\n * Parse tool calls from Gemini response\n */\nexport function parseToolCalls(response: unknown): UnifiedToolCall[] {\n const resp = response as Record<string, unknown>;\n const candidates = resp?.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n const content = candidates?.[0]?.content as\n | Record<string, unknown>\n | undefined;\n const parts = content?.parts as Array<Record<string, unknown>> | undefined;\n\n if (!parts) return [];\n\n const functionCalls: UnifiedToolCall[] = [];\n\n for (const part of parts) {\n const functionCall = part.functionCall as GeminiFunctionCall | undefined;\n if (functionCall) {\n functionCalls.push({\n id: `gemini_${Date.now()}_${functionCalls.length}`, // Gemini doesn't provide IDs\n name: functionCall.name,\n input: functionCall.args || {},\n });\n }\n }\n\n return functionCalls;\n}\n\n/**\n * Extract text content from Gemini response\n */\nexport function extractTextContent(response: unknown): string {\n const resp = response as Record<string, unknown>;\n const candidates = resp?.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n const content = candidates?.[0]?.content as\n | Record<string, unknown>\n | undefined;\n const parts = content?.parts as Array<Record<string, unknown>> | undefined;\n\n if (!parts) return \"\";\n\n return parts\n .filter((part) => typeof part.text === \"string\")\n .map((part) => part.text as string)\n .join(\"\\n\");\n}\n\n// ========================================\n// Tool Result Formatting\n// ========================================\n\n/**\n * Format tool results for Gemini\n */\nexport function formatToolResults(\n results: UnifiedToolResult[],\n): GeminiFunctionResponse[] {\n return results.map((r) => {\n let response: Record<string, unknown>;\n try {\n response = JSON.parse(r.content);\n } catch {\n response = { result: r.content };\n }\n\n return {\n name: r.toolCallId.split(\"_\").slice(2).join(\"_\") || \"unknown\", // Extract name from ID\n response,\n };\n });\n}\n\n// ========================================\n// Stop Reason Detection\n// ========================================\n\n/**\n * Check if response indicates the AI wants to use tools\n */\nexport function isToolUseStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n const candidates = resp?.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n const content = candidates?.[0]?.content as\n | Record<string, unknown>\n | undefined;\n const parts = content?.parts as Array<Record<string, unknown>> | undefined;\n\n if (!parts) return false;\n\n return parts.some((part) => part.functionCall !== undefined);\n}\n\n/**\n * Check if response indicates conversation should end\n */\nexport function isEndTurnStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n const candidates = resp?.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n const finishReason = candidates?.[0]?.finishReason as string | undefined;\n\n return finishReason === \"STOP\" || finishReason === \"END_TURN\";\n}\n\n/**\n * Get the stop reason string from response\n */\nexport function getStopReason(response: unknown): string {\n const resp = response as Record<string, unknown>;\n const candidates = resp?.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n return (candidates?.[0]?.finishReason as string) || \"unknown\";\n}\n\n// ========================================\n// Message Building\n// ========================================\n\n/**\n * Build assistant message with tool calls for Gemini format\n */\nexport function buildAssistantToolMessage(\n toolCalls: UnifiedToolCall[],\n textContent?: string,\n): unknown {\n const parts: unknown[] = [];\n\n if (textContent) {\n parts.push({ text: textContent });\n }\n\n toolCalls.forEach((tc) => {\n parts.push({\n functionCall: {\n name: tc.name,\n args: tc.input,\n },\n });\n });\n\n return {\n role: \"model\",\n parts,\n };\n}\n\n/**\n * Build user message with tool results for Gemini\n */\nexport function buildToolResultMessage(results: UnifiedToolResult[]): unknown {\n const parts = results.map((r) => {\n let response: Record<string, unknown>;\n try {\n response = JSON.parse(r.content);\n } catch {\n response = { result: r.content };\n }\n\n // Extract tool name from the result - we need to track this separately\n // For now, use a placeholder since Gemini doesn't use IDs\n return {\n functionResponse: {\n name: \"tool\", // This should be the actual tool name\n response,\n },\n };\n });\n\n return {\n role: \"user\",\n parts,\n };\n}\n\n// ========================================\n// Formatter Object\n// ========================================\n\n/**\n * Gemini provider formatter\n */\nexport const geminiFormatter: ProviderFormatter = {\n transformTools,\n parseToolCalls,\n formatToolResults,\n isToolUseStop,\n isEndTurnStop,\n getStopReason,\n extractTextContent,\n buildAssistantToolMessage,\n buildToolResultMessage,\n};\n","/**\n * Provider Formatter Registry\n *\n * Maps provider names to their formatters for the agent loop.\n * Formatters handle tool transformations between unified format and provider-specific formats.\n */\n\nimport type { ProviderFormatter } from \"./types\";\nimport { openaiFormatter } from \"./openai\";\nimport { anthropicFormatter } from \"./anthropic\";\nimport { geminiFormatter } from \"./gemini\";\n\n// ============================================\n// Formatter Registry\n// ============================================\n\n/**\n * Map of provider names to their formatters\n */\nconst formatters: Record<string, ProviderFormatter> = {\n openai: openaiFormatter,\n anthropic: anthropicFormatter,\n google: geminiFormatter,\n gemini: geminiFormatter, // Alias\n // OpenAI-compatible providers use openaiFormatter\n ollama: openaiFormatter,\n xai: openaiFormatter,\n azure: openaiFormatter,\n};\n\n/**\n * Get a formatter for a specific provider\n *\n * @param provider - Provider name (e.g., 'openai', 'anthropic', 'google')\n * @returns The provider's formatter\n * @throws Error if provider is not supported\n *\n * @example\n * ```typescript\n * const formatter = getFormatter('openai');\n * const tools = formatter.transformTools(unifiedTools);\n * ```\n */\nexport function getFormatter(provider: string): ProviderFormatter {\n const formatter = formatters[provider.toLowerCase()];\n if (!formatter) {\n throw new Error(\n `Unsupported provider: ${provider}. Supported providers: ${Object.keys(formatters).join(\", \")}`,\n );\n }\n return formatter;\n}\n\n/**\n * Check if a provider is supported\n *\n * @param provider - Provider name to check\n * @returns True if provider has a formatter\n *\n * @example\n * ```typescript\n * if (isProviderSupported('openai')) {\n * // Use the provider\n * }\n * ```\n */\nexport function isProviderSupported(provider: string): boolean {\n return provider.toLowerCase() in formatters;\n}\n\n/**\n * Get list of supported providers\n *\n * @returns Array of supported provider names\n *\n * @example\n * ```typescript\n * const providers = getSupportedProviders();\n * // ['openai', 'anthropic', 'google', ...]\n * ```\n */\nexport function getSupportedProviders(): string[] {\n return Object.keys(formatters);\n}\n\n/**\n * Register a custom formatter for a provider\n *\n * @param provider - Provider name\n * @param formatter - Formatter implementation\n *\n * @example\n * ```typescript\n * registerFormatter('custom-provider', myCustomFormatter);\n * ```\n */\nexport function registerFormatter(\n provider: string,\n formatter: ProviderFormatter,\n): void {\n formatters[provider.toLowerCase()] = formatter;\n}\n","/**\n * Agent Loop Implementation\n *\n * Server-side agentic loop that:\n * 1. Calls LLM with tools\n * 2. Parses tool calls from response\n * 3. Executes server-side tools or requests client execution\n * 4. Loops until LLM returns end_turn or max iterations reached\n *\n * Streams events to client via SSE for real-time updates\n */\n\nimport type {\n StreamEvent,\n ToolDefinition,\n UnifiedToolCall,\n UnifiedToolResult,\n ToolResponse,\n AgentLoopConfig,\n Message,\n} from \"../core/stream-events\";\nimport type { AIProvider } from \"../providers/types\";\nimport { generateToolCallId, generateMessageId } from \"../core/utils\";\nimport { getFormatter } from \"../providers\";\n\n// ========================================\n// Constants\n// ========================================\n\n/** Default maximum iterations */\nconst DEFAULT_MAX_ITERATIONS = 20;\n\n// ========================================\n// Types\n// ========================================\n\n/**\n * Agent loop options\n */\nexport interface AgentLoopOptions {\n /** Initial messages */\n messages: Message[];\n /** Available tools */\n tools: ToolDefinition[];\n /** System prompt */\n systemPrompt?: string;\n /** AI provider */\n provider: AIProvider;\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n /** Loop configuration */\n config?: AgentLoopConfig;\n /**\n * LLM call function\n * Should call the LLM and return the raw response\n */\n callLLM: (messages: unknown[], tools: unknown[]) => Promise<unknown>;\n /**\n * Server-side tool executor\n * Called when a server-side tool needs to be executed\n */\n executeServerTool?: (\n name: string,\n args: Record<string, unknown>,\n ) => Promise<ToolResponse>;\n /**\n * Callback to wait for client tool result\n * Called when a client-side tool needs to be executed\n * Should return a Promise that resolves when client sends result\n */\n waitForClientToolResult?: (\n toolCallId: string,\n name: string,\n args: Record<string, unknown>,\n ) => Promise<ToolResponse>;\n}\n\n/**\n * Internal conversation message format\n */\ninterface ConversationMessage {\n role: string;\n content: unknown;\n [key: string]: unknown;\n}\n\n// ========================================\n// Main Agent Loop\n// ========================================\n\n/**\n * Run the agentic loop\n *\n * @yields Stream events for each step of the loop\n */\nexport async function* runAgentLoop(\n options: AgentLoopOptions,\n): AsyncGenerator<StreamEvent> {\n const {\n messages,\n tools,\n systemPrompt,\n provider,\n signal,\n config,\n callLLM,\n executeServerTool,\n waitForClientToolResult,\n } = options;\n\n const maxIterations = config?.maxIterations ?? DEFAULT_MAX_ITERATIONS;\n const debug = config?.debug ?? false;\n const formatter = getFormatter(provider.name);\n\n // Separate server and client tools\n const serverTools = tools.filter((t) => t.location === \"server\");\n const clientTools = tools.filter((t) => t.location === \"client\");\n const allTools = [...serverTools, ...clientTools];\n\n // Transform tools to provider format\n const providerTools = formatter.transformTools(allTools);\n\n // Build conversation\n const conversation: ConversationMessage[] = buildConversation(\n messages,\n systemPrompt,\n );\n\n let iteration = 0;\n\n if (debug) {\n console.log(\"[AgentLoop] Starting with\", {\n messageCount: messages.length,\n toolCount: allTools.length,\n serverToolCount: serverTools.length,\n clientToolCount: clientTools.length,\n maxIterations,\n });\n }\n\n // Main loop\n while (iteration < maxIterations) {\n // Check for abort\n if (signal?.aborted) {\n yield {\n type: \"loop:complete\",\n iterations: iteration,\n aborted: true,\n };\n return;\n }\n\n iteration++;\n\n // Emit iteration progress\n yield {\n type: \"loop:iteration\",\n iteration,\n maxIterations,\n };\n\n if (debug) {\n console.log(`[AgentLoop] Iteration ${iteration}/${maxIterations}`);\n }\n\n try {\n // Call LLM\n const response = await callLLM(conversation, providerTools);\n\n // Parse tool calls and text from response\n const toolCalls = formatter.parseToolCalls(response);\n const textContent = formatter.extractTextContent(response);\n\n // Emit text content as message\n if (textContent) {\n const messageId = generateMessageId();\n yield { type: \"message:start\", id: messageId };\n yield { type: \"message:delta\", content: textContent };\n yield { type: \"message:end\" };\n }\n\n // Check if we should use tools\n if (formatter.isToolUseStop(response) && toolCalls.length > 0) {\n if (debug) {\n console.log(\n \"[AgentLoop] Tool calls:\",\n toolCalls.map((tc) => tc.name),\n );\n }\n\n // Execute tools\n const results = await executeToolCalls(\n toolCalls,\n tools,\n executeServerTool,\n waitForClientToolResult,\n function* (event: StreamEvent) {\n yield event;\n },\n debug,\n );\n\n // Emit tool results\n for (const result of results) {\n const toolCall = toolCalls.find((tc) => tc.id === result.toolCallId);\n if (toolCall) {\n yield {\n type: \"tool:result\",\n id: result.toolCallId,\n name: toolCall.name,\n result: JSON.parse(result.content) as ToolResponse,\n };\n }\n }\n\n // Add assistant message with tool calls to conversation\n const assistantMessage = formatter.buildAssistantToolMessage(\n toolCalls,\n textContent,\n );\n conversation.push(assistantMessage as ConversationMessage);\n\n // Add tool results to conversation\n const toolResultMessage = formatter.buildToolResultMessage(results);\n if (Array.isArray(toolResultMessage)) {\n // OpenAI format returns array of messages\n conversation.push(...(toolResultMessage as ConversationMessage[]));\n } else {\n conversation.push(toolResultMessage as ConversationMessage);\n }\n\n // Continue loop\n continue;\n }\n\n // Check for end turn\n if (formatter.isEndTurnStop(response)) {\n if (debug) {\n console.log(\"[AgentLoop] End turn detected\");\n }\n break;\n }\n\n // Unknown stop reason - break to be safe\n const stopReason = formatter.getStopReason(response);\n if (debug) {\n console.log(\"[AgentLoop] Unknown stop reason:\", stopReason);\n }\n break;\n } catch (error) {\n if (debug) {\n console.error(\"[AgentLoop] Error:\", error);\n }\n\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"AGENT_LOOP_ERROR\",\n };\n\n break;\n }\n }\n\n // Emit completion\n yield {\n type: \"loop:complete\",\n iterations: iteration,\n maxIterationsReached: iteration >= maxIterations,\n };\n\n yield { type: \"done\" };\n}\n\n// ========================================\n// Helper Functions\n// ========================================\n\n/**\n * Build conversation from messages\n */\nfunction buildConversation(\n messages: Message[],\n systemPrompt?: string,\n): ConversationMessage[] {\n const conversation: ConversationMessage[] = [];\n\n // Add system prompt if provided\n if (systemPrompt) {\n conversation.push({\n role: \"system\",\n content: systemPrompt,\n });\n }\n\n // Add messages\n for (const msg of messages) {\n conversation.push({\n role: msg.role,\n content: msg.content,\n });\n }\n\n return conversation;\n}\n\n/**\n * Execute tool calls\n */\nasync function executeToolCalls(\n toolCalls: UnifiedToolCall[],\n tools: ToolDefinition[],\n executeServerTool?: (\n name: string,\n args: Record<string, unknown>,\n ) => Promise<ToolResponse>,\n waitForClientToolResult?: (\n toolCallId: string,\n name: string,\n args: Record<string, unknown>,\n ) => Promise<ToolResponse>,\n emitEvent?: (event: StreamEvent) => void,\n debug?: boolean,\n): Promise<UnifiedToolResult[]> {\n const results: UnifiedToolResult[] = [];\n\n for (const toolCall of toolCalls) {\n const tool = tools.find((t) => t.name === toolCall.name);\n\n if (!tool) {\n // Unknown tool\n if (debug) {\n console.warn(`[AgentLoop] Unknown tool: ${toolCall.name}`);\n }\n\n results.push({\n toolCallId: toolCall.id,\n content: JSON.stringify({\n success: false,\n error: `Unknown tool: ${toolCall.name}`,\n }),\n success: false,\n error: `Unknown tool: ${toolCall.name}`,\n });\n continue;\n }\n\n // Emit action start (include hidden flag for client-side filtering)\n emitEvent?.({\n type: \"action:start\",\n id: toolCall.id,\n name: toolCall.name,\n hidden: tool.hidden ?? false,\n });\n\n // Emit arguments\n emitEvent?.({\n type: \"action:args\",\n id: toolCall.id,\n args: JSON.stringify(toolCall.input),\n });\n\n try {\n let response: ToolResponse;\n\n if (tool.location === \"server\") {\n // Server-side tool\n if (tool.handler) {\n response = (await tool.handler(toolCall.input)) as ToolResponse;\n } else if (executeServerTool) {\n response = await executeServerTool(toolCall.name, toolCall.input);\n } else {\n response = {\n success: false,\n error: `No handler for server tool: ${toolCall.name}`,\n };\n }\n } else {\n // Client-side tool\n if (waitForClientToolResult) {\n // Wait for client result (client handles execution)\n response = await waitForClientToolResult(\n toolCall.id,\n toolCall.name,\n toolCall.input,\n );\n } else {\n response = {\n success: false,\n error: `No client tool handler for: ${toolCall.name}`,\n };\n }\n }\n\n // Emit action end\n emitEvent?.({\n type: \"action:end\",\n id: toolCall.id,\n name: toolCall.name,\n result: response,\n });\n\n results.push({\n toolCallId: toolCall.id,\n content: JSON.stringify(response),\n success: response.success,\n error: response.error,\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Tool execution failed\";\n\n // Emit action end with error\n emitEvent?.({\n type: \"action:end\",\n id: toolCall.id,\n name: toolCall.name,\n error: errorMessage,\n });\n\n results.push({\n toolCallId: toolCall.id,\n content: JSON.stringify({\n success: false,\n error: errorMessage,\n }),\n success: false,\n error: errorMessage,\n });\n }\n }\n\n return results;\n}\n\n// ========================================\n// Exports\n// ========================================\n\nexport { DEFAULT_MAX_ITERATIONS };\n"]}
|