@yourgpt/llm-sdk 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -0
- package/dist/index.d.mts +424 -13
- package/dist/index.d.ts +424 -13
- package/dist/index.js +505 -23
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +499 -24
- package/dist/index.mjs.map +1 -1
- package/dist/providers/openai/index.d.mts +17 -8
- package/dist/providers/openai/index.d.ts +17 -8
- package/dist/providers/openai/index.js.map +1 -1
- package/dist/providers/openai/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.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/adapters/base.ts","../src/adapters/openai.ts","../src/adapters/anthropic.ts","../src/adapters/ollama.ts","../src/server/streaming.ts","../src/server/runtime.ts","../src/server/integrations.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","generateMessageId","tool","createMessage","Hono","cors","transformTools","parseToolCalls","extractTextContent","formatToolResults","isToolUseStop","isEndTurnStop","getStopReason","buildAssistantToolMessage","buildToolResultMessage"],"mappings":"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","file":"index.js","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/**\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 };\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\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","import type {\n Message,\n MessageAttachment,\n ActionDefinition,\n StreamEvent,\n LLMConfig,\n} from \"@yourgpt/copilot-sdk/core\";\n\n/**\n * Request-level LLM configuration overrides\n */\nexport interface RequestLLMConfig {\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\n/**\n * Chat completion request\n */\nexport interface ChatCompletionRequest {\n /** Conversation messages */\n messages: Message[];\n /**\n * Raw provider-formatted messages (for agent loop with tool calls)\n * When provided, these are used instead of converting from Message[]\n * This allows passing messages with tool_calls and tool role\n */\n rawMessages?: Array<Record<string, unknown>>;\n /** Available actions/tools */\n actions?: ActionDefinition[];\n /** System prompt */\n systemPrompt?: string;\n /** LLM configuration overrides */\n config?: RequestLLMConfig;\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n}\n\n/**\n * Non-streaming completion result\n */\nexport interface CompletionResult {\n /** Text content */\n content: string;\n /** Tool calls */\n toolCalls: Array<{ id: string; name: string; args: Record<string, unknown> }>;\n /** Thinking content (if extended thinking enabled) */\n thinking?: string;\n /** Raw provider response for debugging */\n rawResponse: Record<string, unknown>;\n}\n\n/**\n * Base LLM adapter interface\n */\nexport interface LLMAdapter {\n /** Provider name */\n readonly provider: string;\n\n /** Model name */\n readonly model: string;\n\n /**\n * Stream a chat completion\n */\n stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent>;\n\n /**\n * Non-streaming chat completion (for debugging/comparison)\n */\n complete?(request: ChatCompletionRequest): Promise<CompletionResult>;\n}\n\n/**\n * Adapter factory function type\n */\nexport type AdapterFactory = (config: LLMConfig) => LLMAdapter;\n\n/**\n * Convert messages to provider format (simple text only)\n */\nexport function formatMessages(\n messages: Message[],\n systemPrompt?: string,\n): Array<{ role: string; content: string }> {\n const formatted: Array<{ role: string; content: string }> = [];\n\n // Add system prompt if provided\n if (systemPrompt) {\n formatted.push({ role: \"system\", content: systemPrompt });\n }\n\n // Add conversation messages\n for (const msg of messages) {\n formatted.push({\n role: msg.role,\n content: msg.content ?? \"\",\n });\n }\n\n return formatted;\n}\n\n/**\n * Convert ActionParameter to JSON Schema format recursively\n */\nfunction parameterToJsonSchema(param: {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n}): Record<string, unknown> {\n const schema: Record<string, unknown> = {\n type: param.type,\n };\n\n if (param.description) {\n schema.description = param.description;\n }\n\n if (param.enum) {\n schema.enum = param.enum;\n }\n\n // Handle array items\n if (param.type === \"array\" && param.items) {\n schema.items = parameterToJsonSchema(\n param.items as {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n },\n );\n }\n\n // Handle nested object properties\n if (param.type === \"object\" && param.properties) {\n schema.properties = Object.fromEntries(\n Object.entries(param.properties).map(([key, prop]) => [\n key,\n parameterToJsonSchema(\n prop as {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n },\n ),\n ]),\n );\n }\n\n return schema;\n}\n\n/**\n * Convert actions to OpenAI tool format\n */\nexport function formatTools(actions: ActionDefinition[]): Array<{\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: object;\n };\n}> {\n return actions.map((action) => ({\n type: \"function\" as const,\n function: {\n name: action.name,\n description: action.description,\n parameters: {\n type: \"object\",\n properties: action.parameters\n ? Object.fromEntries(\n Object.entries(action.parameters).map(([key, param]) => [\n key,\n parameterToJsonSchema(param),\n ]),\n )\n : {},\n required: action.parameters\n ? Object.entries(action.parameters)\n .filter(([, param]) => param.required)\n .map(([key]) => key)\n : [],\n },\n },\n }));\n}\n\n// ============================================\n// Vision/Multimodal Support\n// ============================================\n\n/**\n * Content block types for multimodal messages\n */\nexport type AnthropicContentBlock =\n | { type: \"text\"; text: string }\n | {\n type: \"image\";\n source:\n | {\n type: \"base64\";\n media_type: string;\n data: string;\n }\n | {\n type: \"url\";\n url: string;\n };\n }\n | {\n type: \"document\";\n source:\n | {\n type: \"base64\";\n media_type: string;\n data: string;\n }\n | {\n type: \"url\";\n url: string;\n };\n };\n\nexport type OpenAIContentBlock =\n | { type: \"text\"; text: string }\n | {\n type: \"image_url\";\n image_url: {\n url: string;\n detail?: \"low\" | \"high\" | \"auto\";\n };\n };\n\n/**\n * Check if a message has image attachments\n * Supports both new format (metadata.attachments) and legacy (attachments)\n */\nexport function hasImageAttachments(message: Message): boolean {\n const attachments = message.metadata?.attachments;\n return attachments?.some((a) => a.type === \"image\") ?? false;\n}\n\n/**\n * Check if a message has media attachments (images or PDFs)\n */\nexport function hasMediaAttachments(message: Message): boolean {\n const attachments = message.metadata?.attachments;\n return (\n attachments?.some(\n (a) =>\n a.type === \"image\" ||\n (a.type === \"file\" && a.mimeType === \"application/pdf\"),\n ) ?? false\n );\n}\n\n/**\n * Convert MessageAttachment to Anthropic image content block\n *\n * Anthropic format:\n * {\n * type: \"image\",\n * source: {\n * type: \"base64\",\n * media_type: \"image/png\",\n * data: \"base64data...\"\n * }\n * }\n */\nexport function attachmentToAnthropicImage(\n attachment: MessageAttachment,\n): AnthropicContentBlock | null {\n if (attachment.type !== \"image\") return null;\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n return {\n type: \"image\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n };\n }\n\n // Fall back to base64 data\n if (!attachment.data) return null;\n\n // Extract base64 data (remove data URI prefix if present)\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: attachment.mimeType || \"image/png\",\n data: base64Data,\n },\n };\n}\n\n/**\n * Convert MessageAttachment to OpenAI image_url content block\n *\n * OpenAI format:\n * {\n * type: \"image_url\",\n * image_url: {\n * url: \"data:image/png;base64,...\"\n * }\n * }\n */\nexport function attachmentToOpenAIImage(\n attachment: MessageAttachment,\n): OpenAIContentBlock | null {\n if (attachment.type !== \"image\") return null;\n\n let imageUrl: string;\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n imageUrl = attachment.url;\n } else if (attachment.data) {\n // Build data URI if not already one\n imageUrl = attachment.data.startsWith(\"data:\")\n ? attachment.data\n : `data:${attachment.mimeType || \"image/png\"};base64,${attachment.data}`;\n } else {\n return null;\n }\n\n return {\n type: \"image_url\",\n image_url: {\n url: imageUrl,\n detail: \"auto\",\n },\n };\n}\n\n/**\n * Convert MessageAttachment (PDF) to Anthropic document content block\n *\n * Anthropic format:\n * {\n * type: \"document\",\n * source: {\n * type: \"base64\",\n * media_type: \"application/pdf\",\n * data: \"base64data...\"\n * }\n * }\n */\nexport function attachmentToAnthropicDocument(\n attachment: MessageAttachment,\n): AnthropicContentBlock | null {\n // Only handle PDF files\n if (attachment.type !== \"file\" || attachment.mimeType !== \"application/pdf\") {\n return null;\n }\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n return {\n type: \"document\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n };\n }\n\n // Fall back to base64 data\n if (!attachment.data) return null;\n\n // Extract base64 data (remove data URI prefix if present)\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n\n return {\n type: \"document\",\n source: {\n type: \"base64\",\n media_type: \"application/pdf\",\n data: base64Data,\n },\n };\n}\n\n/**\n * Convert a Message to Anthropic multimodal content blocks\n */\nexport function messageToAnthropicContent(\n message: Message,\n): string | AnthropicContentBlock[] {\n const attachments = message.metadata?.attachments;\n const content = message.content ?? \"\";\n\n // If no media attachments (images or PDFs), return simple string\n if (!hasMediaAttachments(message)) {\n return content;\n }\n\n // Build content blocks array\n const blocks: AnthropicContentBlock[] = [];\n\n // Add media attachments first (Claude recommends media before text)\n if (attachments) {\n for (const attachment of attachments) {\n // Try image first\n const imageBlock = attachmentToAnthropicImage(attachment);\n if (imageBlock) {\n blocks.push(imageBlock);\n continue;\n }\n // Try document (PDF)\n const docBlock = attachmentToAnthropicDocument(attachment);\n if (docBlock) {\n blocks.push(docBlock);\n }\n }\n }\n\n // Add text content\n if (content) {\n blocks.push({ type: \"text\", text: content });\n }\n\n return blocks;\n}\n\n/**\n * Convert a Message to OpenAI multimodal content blocks\n */\nexport function messageToOpenAIContent(\n message: Message,\n): string | OpenAIContentBlock[] {\n const attachments = message.metadata?.attachments;\n const content = message.content ?? \"\";\n\n // If no image attachments, return simple string\n if (!hasImageAttachments(message)) {\n return content;\n }\n\n // Build content blocks array\n const blocks: OpenAIContentBlock[] = [];\n\n // Add text content first\n if (content) {\n blocks.push({ type: \"text\", text: content });\n }\n\n // Add image attachments\n if (attachments) {\n for (const attachment of attachments) {\n const imageBlock = attachmentToOpenAIImage(attachment);\n if (imageBlock) {\n blocks.push(imageBlock);\n }\n }\n }\n\n return blocks;\n}\n\n/**\n * Anthropic content block types (extended for tools)\n */\nexport type AnthropicToolUseBlock = {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n};\n\nexport type AnthropicToolResultBlock = {\n type: \"tool_result\";\n tool_use_id: string;\n content: string;\n};\n\nexport type AnthropicMessageContent =\n | string\n | Array<\n AnthropicContentBlock | AnthropicToolUseBlock | AnthropicToolResultBlock\n >;\n\n/**\n * Format messages for Anthropic with full tool support\n * Handles: text, images, tool_use, and tool_result\n *\n * Key differences from OpenAI:\n * - tool_calls become tool_use blocks in assistant content\n * - tool results become tool_result blocks in user content\n */\nexport function formatMessagesForAnthropic(\n messages: Message[],\n systemPrompt?: string,\n): {\n system: string;\n messages: Array<{\n role: \"user\" | \"assistant\";\n content: AnthropicMessageContent;\n }>;\n} {\n const formatted: Array<{\n role: \"user\" | \"assistant\";\n content: AnthropicMessageContent;\n }> = [];\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n\n if (msg.role === \"system\") continue; // System handled separately\n\n if (msg.role === \"assistant\") {\n // Build content array for assistant\n const content: Array<AnthropicContentBlock | AnthropicToolUseBlock> = [];\n\n // Add text content if present\n if (msg.content) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Convert tool_calls to tool_use blocks\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n for (const tc of msg.tool_calls) {\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n });\n }\n }\n\n formatted.push({\n role: \"assistant\",\n content:\n content.length === 1 && content[0].type === \"text\"\n ? (content[0] as { type: \"text\"; text: string }).text\n : content,\n });\n } else if (msg.role === \"tool\" && msg.tool_call_id) {\n // Tool results go in user message as tool_result blocks\n // Group consecutive tool messages together\n const toolResults: AnthropicToolResultBlock[] = [\n {\n type: \"tool_result\",\n tool_use_id: msg.tool_call_id,\n content: msg.content ?? \"\",\n },\n ];\n\n // Look ahead for more consecutive tool messages\n while (i + 1 < messages.length && messages[i + 1].role === \"tool\") {\n i++;\n const nextTool = messages[i];\n if (nextTool.tool_call_id) {\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: nextTool.tool_call_id,\n content: nextTool.content ?? \"\",\n });\n }\n }\n\n formatted.push({\n role: \"user\",\n content: toolResults,\n });\n } else if (msg.role === \"user\") {\n formatted.push({\n role: \"user\",\n content: messageToAnthropicContent(msg),\n });\n }\n }\n\n return {\n system: systemPrompt || \"\",\n messages: formatted,\n };\n}\n\n/**\n * OpenAI message format with tool support\n */\nexport type OpenAIMessage =\n | { role: \"system\"; content: string }\n | { role: \"user\"; content: string | OpenAIContentBlock[] }\n | {\n role: \"assistant\";\n content: string | null;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n }\n | { role: \"tool\"; content: string; tool_call_id: string };\n\n/**\n * Format messages for OpenAI with full tool support\n * Handles: text, images, tool_calls, and tool results\n */\nexport function formatMessagesForOpenAI(\n messages: Message[],\n systemPrompt?: string,\n): OpenAIMessage[] {\n const formatted: OpenAIMessage[] = [];\n\n // Add system prompt if provided\n if (systemPrompt) {\n formatted.push({ role: \"system\", content: systemPrompt });\n }\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n formatted.push({ role: \"system\", content: msg.content ?? \"\" });\n } else if (msg.role === \"user\") {\n formatted.push({\n role: \"user\",\n content: messageToOpenAIContent(msg),\n });\n } else if (msg.role === \"assistant\") {\n const assistantMsg: OpenAIMessage = {\n role: \"assistant\",\n content: msg.content,\n };\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n (assistantMsg as { tool_calls: typeof msg.tool_calls }).tool_calls =\n msg.tool_calls;\n }\n formatted.push(assistantMsg);\n } else if (msg.role === \"tool\" && msg.tool_call_id) {\n formatted.push({\n role: \"tool\",\n content: msg.content ?? \"\",\n tool_call_id: msg.tool_call_id,\n });\n }\n }\n\n return formatted;\n}\n","import type { LLMConfig, StreamEvent } from \"@yourgpt/copilot-sdk/core\";\nimport {\n generateMessageId,\n generateToolCallId,\n} from \"@yourgpt/copilot-sdk/core\";\nimport type { LLMAdapter, ChatCompletionRequest } from \"./base\";\nimport { formatMessagesForOpenAI, formatTools } from \"./base\";\n\n/**\n * OpenAI adapter configuration\n */\nexport interface OpenAIAdapterConfig {\n apiKey: string;\n model?: string;\n baseUrl?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\n/**\n * OpenAI LLM Adapter\n *\n * Supports: GPT-4, GPT-4o, GPT-3.5-turbo, etc.\n */\nexport class OpenAIAdapter implements LLMAdapter {\n readonly provider = \"openai\";\n readonly model: string;\n\n private client: any; // OpenAI client (lazy loaded)\n private config: OpenAIAdapterConfig;\n\n constructor(config: OpenAIAdapterConfig) {\n this.config = config;\n this.model = config.model || \"gpt-4o\";\n }\n\n private async getClient() {\n if (!this.client) {\n // Dynamic import to make openai optional\n const { default: OpenAI } = await import(\"openai\");\n this.client = new OpenAI({\n apiKey: this.config.apiKey,\n baseURL: this.config.baseUrl,\n });\n }\n return this.client;\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n const client = await this.getClient();\n\n // Use raw messages if provided (for agent loop with tool calls), otherwise format from Message[]\n let messages: Array<Record<string, unknown>>;\n if (request.rawMessages && request.rawMessages.length > 0) {\n // Process raw messages - convert any attachments to OpenAI vision format\n const processedMessages = request.rawMessages.map((msg) => {\n // Check if message has attachments (images)\n const hasAttachments =\n msg.attachments &&\n Array.isArray(msg.attachments) &&\n msg.attachments.length > 0;\n\n if (hasAttachments) {\n // Convert to OpenAI multimodal content format\n const content: Array<Record<string, unknown>> = [];\n\n // Add text content if present\n if (msg.content) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Add image attachments\n for (const attachment of msg.attachments as Array<{\n type: string;\n data?: string;\n url?: string;\n mimeType?: string;\n }>) {\n if (attachment.type === \"image\") {\n let imageUrl: string;\n\n if (attachment.url) {\n // Use URL directly (cloud storage)\n imageUrl = attachment.url;\n } else if (attachment.data) {\n // Use base64 data\n imageUrl = attachment.data.startsWith(\"data:\")\n ? attachment.data\n : `data:${attachment.mimeType || \"image/png\"};base64,${attachment.data}`;\n } else {\n continue; // Skip if no data or URL\n }\n\n content.push({\n type: \"image_url\",\n image_url: { url: imageUrl, detail: \"auto\" },\n });\n }\n }\n\n return { ...msg, content, attachments: undefined };\n }\n return msg;\n });\n\n // Add system prompt at the start if provided and not already present\n if (request.systemPrompt) {\n const hasSystem = processedMessages.some((m) => m.role === \"system\");\n if (!hasSystem) {\n messages = [\n { role: \"system\", content: request.systemPrompt },\n ...processedMessages,\n ];\n } else {\n messages = processedMessages;\n }\n } else {\n messages = processedMessages;\n }\n } else {\n // Format from Message[] with multimodal support (images, attachments)\n messages = formatMessagesForOpenAI(\n request.messages,\n request.systemPrompt,\n ) as Array<Record<string, unknown>>;\n }\n\n const tools = request.actions?.length\n ? formatTools(request.actions)\n : undefined;\n\n const messageId = generateMessageId();\n\n // Emit message start\n yield { type: \"message:start\", id: messageId };\n\n try {\n const stream = await client.chat.completions.create({\n model: request.config?.model || this.model,\n messages,\n tools,\n temperature: request.config?.temperature ?? this.config.temperature,\n max_tokens: request.config?.maxTokens ?? this.config.maxTokens,\n stream: true,\n });\n\n let currentToolCall: {\n id: string;\n name: string;\n arguments: string;\n } | null = null;\n\n for await (const chunk of stream) {\n // Check for abort\n if (request.signal?.aborted) {\n break;\n }\n\n const delta = chunk.choices[0]?.delta;\n\n // Handle content\n if (delta?.content) {\n yield { type: \"message:delta\", content: delta.content };\n }\n\n // Handle tool calls\n if (delta?.tool_calls) {\n for (const toolCall of delta.tool_calls) {\n // New tool call\n if (toolCall.id) {\n // End previous tool call if any\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: currentToolCall.arguments,\n };\n }\n\n currentToolCall = {\n id: toolCall.id,\n name: toolCall.function?.name || \"\",\n arguments: toolCall.function?.arguments || \"\",\n };\n\n yield {\n type: \"action:start\",\n id: currentToolCall.id,\n name: currentToolCall.name,\n };\n } else if (currentToolCall && toolCall.function?.arguments) {\n // Append to current tool call arguments\n currentToolCall.arguments += toolCall.function.arguments;\n }\n }\n }\n\n // Check for finish\n if (chunk.choices[0]?.finish_reason) {\n // Complete any pending tool call\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: currentToolCall.arguments,\n };\n }\n }\n }\n\n // Emit message end\n yield { type: \"message:end\" };\n yield { type: \"done\" };\n } catch (error) {\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"OPENAI_ERROR\",\n };\n }\n }\n}\n\n/**\n * Create OpenAI adapter\n */\nexport function createOpenAIAdapter(\n config: OpenAIAdapterConfig,\n): OpenAIAdapter {\n return new OpenAIAdapter(config);\n}\n","import type { LLMConfig, StreamEvent } from \"@yourgpt/copilot-sdk/core\";\nimport { generateMessageId } from \"@yourgpt/copilot-sdk/core\";\nimport type {\n LLMAdapter,\n ChatCompletionRequest,\n CompletionResult,\n} from \"./base\";\nimport {\n formatMessagesForAnthropic,\n messageToAnthropicContent,\n type AnthropicContentBlock,\n} from \"./base\";\n\n/**\n * Extended thinking configuration\n */\nexport interface ThinkingConfig {\n type: \"enabled\";\n /** Budget for thinking tokens (minimum 1024) */\n budgetTokens?: number;\n}\n\n/**\n * Anthropic adapter configuration\n */\nexport interface AnthropicAdapterConfig {\n apiKey: string;\n model?: string;\n /** Base URL for API endpoint */\n baseUrl?: string;\n /** Enable extended thinking (for Claude 3.7 Sonnet, Claude 4) */\n thinking?: ThinkingConfig;\n temperature?: number;\n maxTokens?: number;\n}\n\n/**\n * Anthropic LLM Adapter\n *\n * Supports: Claude 3.5 Sonnet, Claude 3 Opus, Claude 3 Haiku, etc.\n */\nexport class AnthropicAdapter implements LLMAdapter {\n readonly provider = \"anthropic\";\n readonly model: string;\n\n private client: any; // Anthropic client (lazy loaded)\n private config: AnthropicAdapterConfig;\n\n constructor(config: AnthropicAdapterConfig) {\n this.config = config;\n this.model = config.model || \"claude-3-5-sonnet-latest\";\n }\n\n private async getClient() {\n if (!this.client) {\n // Dynamic import to make @anthropic-ai/sdk optional\n const { default: Anthropic } = await import(\"@anthropic-ai/sdk\");\n this.client = new Anthropic({\n apiKey: this.config.apiKey,\n });\n }\n return this.client;\n }\n\n /**\n * Convert OpenAI-style messages to Anthropic format\n *\n * OpenAI format:\n * - { role: \"assistant\", content: \"...\", tool_calls: [...] }\n * - { role: \"tool\", tool_call_id: \"...\", content: \"...\" }\n *\n * Anthropic format:\n * - { role: \"assistant\", content: [{ type: \"text\", text: \"...\" }, { type: \"tool_use\", id: \"...\", name: \"...\", input: {...} }] }\n * - { role: \"user\", content: [{ type: \"tool_result\", tool_use_id: \"...\", content: \"...\" }] }\n */\n private convertToAnthropicMessages(\n rawMessages: Array<Record<string, unknown>>,\n ): Array<Record<string, unknown>> {\n const messages: Array<Record<string, unknown>> = [];\n const pendingToolResults: Array<{ tool_use_id: string; content: string }> =\n [];\n\n for (const msg of rawMessages) {\n // Skip system messages (handled separately)\n if (msg.role === \"system\") continue;\n\n if (msg.role === \"assistant\") {\n // CRITICAL: Insert pending tool results BEFORE adding any assistant message\n // Anthropic requires: assistant(tool_use) → user(tool_result) → assistant(response)\n // Without this, the sequence becomes: assistant(tool_use) → assistant(response) → user(tool_result)\n // which violates Anthropic's API requirements and causes error:\n // \"tool_use ids were found without tool_result blocks immediately after\"\n if (pendingToolResults.length > 0) {\n messages.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.tool_use_id,\n content: tr.content,\n })),\n });\n pendingToolResults.length = 0;\n }\n\n // Convert assistant message with potential tool_calls\n const content: Array<Record<string, unknown>> = [];\n\n // Add text content if present\n if (\n msg.content &&\n typeof msg.content === \"string\" &&\n msg.content.trim()\n ) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Convert tool_calls to tool_use blocks\n const toolCalls = msg.tool_calls as\n | Array<{\n id: string;\n type: string;\n function: { name: string; arguments: string };\n }>\n | undefined;\n\n if (toolCalls && toolCalls.length > 0) {\n for (const tc of toolCalls) {\n let input = {};\n try {\n input = JSON.parse(tc.function.arguments);\n } catch {\n // Keep empty object if parse fails\n }\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input,\n });\n }\n }\n\n // Only add if there's content\n if (content.length > 0) {\n messages.push({ role: \"assistant\", content });\n }\n } else if (msg.role === \"tool\") {\n // Collect tool results to be bundled into a user message\n pendingToolResults.push({\n tool_use_id: msg.tool_call_id as string,\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content),\n });\n } else if (msg.role === \"user\") {\n // First, flush any pending tool results as a user message\n if (pendingToolResults.length > 0) {\n messages.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.tool_use_id,\n content: tr.content,\n })),\n });\n pendingToolResults.length = 0;\n }\n\n // Check if message has attachments (images)\n if (\n msg.attachments &&\n Array.isArray(msg.attachments) &&\n msg.attachments.length > 0\n ) {\n // Convert to Anthropic multimodal content format\n const content: Array<Record<string, unknown>> = [];\n\n // Add text content if present\n if (msg.content && typeof msg.content === \"string\") {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Add attachments (images, PDFs)\n for (const attachment of msg.attachments as Array<{\n type: string;\n data?: string;\n url?: string;\n mimeType?: string;\n }>) {\n if (attachment.type === \"image\") {\n if (attachment.url) {\n // Use URL directly (cloud storage) - Anthropic supports URL sources\n content.push({\n type: \"image\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n });\n } else if (attachment.data) {\n // Use base64 data\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n // Extract base64 from data URL\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n content.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: attachment.mimeType || \"image/png\",\n data: base64Data,\n },\n });\n }\n } else if (\n attachment.type === \"file\" &&\n attachment.mimeType === \"application/pdf\"\n ) {\n // PDF documents - Anthropic uses \"document\" type\n if (attachment.url) {\n content.push({\n type: \"document\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n });\n } else if (attachment.data) {\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n content.push({\n type: \"document\",\n source: {\n type: \"base64\",\n media_type: \"application/pdf\",\n data: base64Data,\n },\n });\n }\n }\n }\n\n messages.push({ role: \"user\", content });\n } else {\n // Add user message without attachments\n messages.push({\n role: \"user\",\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content),\n });\n }\n }\n }\n\n // Flush any remaining tool results\n if (pendingToolResults.length > 0) {\n messages.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.tool_use_id,\n content: tr.content,\n })),\n });\n }\n\n return messages;\n }\n\n /**\n * Build common request options for both streaming and non-streaming\n */\n private buildRequestOptions(request: ChatCompletionRequest): {\n options: Record<string, unknown>;\n messages: Array<Record<string, unknown>>;\n } {\n // Extract system message\n const systemMessage = request.systemPrompt || \"\";\n\n // Use raw messages if provided (for agent loop with tool calls)\n let messages: Array<Record<string, unknown>>;\n if (request.rawMessages && request.rawMessages.length > 0) {\n // Convert OpenAI-style messages to Anthropic format\n messages = this.convertToAnthropicMessages(request.rawMessages);\n } else {\n // Format from Message[] with multimodal support (images, attachments)\n const formatted = formatMessagesForAnthropic(request.messages, undefined);\n messages = formatted.messages as Array<Record<string, unknown>>;\n }\n\n // Convert actions to Anthropic tool format\n const tools = request.actions?.map((action) => ({\n name: action.name,\n description: action.description,\n input_schema: {\n type: \"object\" as const,\n properties: action.parameters\n ? Object.fromEntries(\n Object.entries(action.parameters).map(([key, param]) => [\n key,\n {\n type: param.type,\n description: param.description,\n enum: param.enum,\n },\n ]),\n )\n : {},\n required: action.parameters\n ? Object.entries(action.parameters)\n .filter(([, param]) => param.required)\n .map(([key]) => key)\n : [],\n },\n }));\n\n // Build request options\n const options: Record<string, unknown> = {\n model: request.config?.model || this.model,\n max_tokens: request.config?.maxTokens || this.config.maxTokens || 4096,\n system: systemMessage,\n messages,\n tools: tools?.length ? tools : undefined,\n };\n\n // Add thinking configuration if enabled\n if (this.config.thinking?.type === \"enabled\") {\n options.thinking = {\n type: \"enabled\",\n budget_tokens: this.config.thinking.budgetTokens || 10000,\n };\n }\n\n return { options, messages };\n }\n\n /**\n * Non-streaming completion (for debugging/comparison with original studio-ai)\n */\n async complete(request: ChatCompletionRequest): Promise<CompletionResult> {\n const client = await this.getClient();\n const { options } = this.buildRequestOptions(request);\n\n // Ensure non-streaming mode\n const nonStreamingOptions = {\n ...options,\n stream: false as const,\n } as Record<string, unknown> & { stream: false };\n\n try {\n const response = await client.messages.create(nonStreamingOptions);\n\n // Parse response\n let content = \"\";\n let thinking = \"\";\n const toolCalls: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n }> = [];\n\n for (const block of response.content) {\n if (block.type === \"text\") {\n content += block.text;\n } else if (block.type === \"thinking\") {\n thinking += (block as { thinking: string }).thinking;\n } else if (block.type === \"tool_use\") {\n toolCalls.push({\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n });\n }\n }\n\n return {\n content,\n toolCalls,\n thinking: thinking || undefined,\n rawResponse: response as Record<string, unknown>,\n };\n } catch (error) {\n throw error;\n }\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n const client = await this.getClient();\n const { options } = this.buildRequestOptions(request);\n\n const messageId = generateMessageId();\n\n // Emit message start\n yield { type: \"message:start\", id: messageId };\n\n try {\n const stream = await client.messages.stream(options);\n\n let currentToolUse: {\n id: string;\n name: string;\n input: string;\n } | null = null;\n\n let isInThinkingBlock = false;\n\n for await (const event of stream) {\n // Check for abort\n if (request.signal?.aborted) {\n break;\n }\n\n switch (event.type) {\n case \"content_block_start\":\n if (event.content_block.type === \"tool_use\") {\n currentToolUse = {\n id: event.content_block.id,\n name: event.content_block.name,\n input: \"\",\n };\n yield {\n type: \"action:start\",\n id: currentToolUse.id,\n name: currentToolUse.name,\n };\n } else if (event.content_block.type === \"thinking\") {\n // Start of thinking block\n isInThinkingBlock = true;\n yield { type: \"thinking:start\" };\n }\n break;\n\n case \"content_block_delta\":\n if (event.delta.type === \"text_delta\") {\n yield { type: \"message:delta\", content: event.delta.text };\n } else if (event.delta.type === \"thinking_delta\") {\n // Thinking content delta\n yield { type: \"thinking:delta\", content: event.delta.thinking };\n } else if (\n event.delta.type === \"input_json_delta\" &&\n currentToolUse\n ) {\n currentToolUse.input += event.delta.partial_json;\n }\n break;\n\n case \"content_block_stop\":\n if (currentToolUse) {\n yield {\n type: \"action:args\",\n id: currentToolUse.id,\n args: currentToolUse.input,\n };\n currentToolUse = null;\n }\n if (isInThinkingBlock) {\n yield { type: \"thinking:end\" };\n isInThinkingBlock = false;\n }\n break;\n\n case \"message_stop\":\n break;\n }\n }\n\n // Emit message end\n yield { type: \"message:end\" };\n yield { type: \"done\" };\n } catch (error) {\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"ANTHROPIC_ERROR\",\n };\n }\n }\n}\n\n/**\n * Create Anthropic adapter\n */\nexport function createAnthropicAdapter(\n config: AnthropicAdapterConfig,\n): AnthropicAdapter {\n return new AnthropicAdapter(config);\n}\n","import type { LLMConfig, StreamEvent } from \"@yourgpt/copilot-sdk/core\";\nimport { generateMessageId } from \"@yourgpt/copilot-sdk/core\";\nimport type { LLMAdapter, ChatCompletionRequest } from \"./base\";\nimport { formatMessages } from \"./base\";\n\n/**\n * Ollama adapter configuration\n */\nexport interface OllamaAdapterConfig {\n model?: string;\n baseUrl?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\n/**\n * Ollama LLM Adapter (Local models)\n *\n * Supports: Llama 3, Mistral, Phi, Gemma, CodeLlama, etc.\n */\nexport class OllamaAdapter implements LLMAdapter {\n readonly provider = \"ollama\";\n readonly model: string;\n\n private baseUrl: string;\n private config: OllamaAdapterConfig;\n\n constructor(config: OllamaAdapterConfig = {}) {\n this.config = config;\n this.model = config.model || \"llama3\";\n this.baseUrl = config.baseUrl || \"http://localhost:11434\";\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n const messages = formatMessages(request.messages, request.systemPrompt);\n\n const messageId = generateMessageId();\n\n // Emit message start\n yield { type: \"message:start\", id: messageId };\n\n try {\n const response = await fetch(`${this.baseUrl}/api/chat`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model: request.config?.model || this.model,\n messages,\n stream: true,\n options: {\n temperature: request.config?.temperature ?? this.config.temperature,\n num_predict: request.config?.maxTokens ?? this.config.maxTokens,\n },\n }),\n signal: request.signal,\n });\n\n if (!response.ok) {\n throw new Error(`Ollama API error: ${response.status}`);\n }\n\n if (!response.body) {\n throw new Error(\"No response body\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n\n try {\n const chunk = JSON.parse(line);\n\n if (chunk.message?.content) {\n yield { type: \"message:delta\", content: chunk.message.content };\n }\n\n // Ollama indicates completion with done: true\n if (chunk.done) {\n break;\n }\n } catch {\n // Skip invalid JSON\n }\n }\n }\n\n yield { type: \"message:end\" };\n yield { type: \"done\" };\n } catch (error) {\n if ((error as Error).name === \"AbortError\") {\n yield { type: \"done\" };\n } else {\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"OLLAMA_ERROR\",\n };\n }\n }\n }\n}\n\n/**\n * Create Ollama adapter\n */\nexport function createOllamaAdapter(\n config?: OllamaAdapterConfig,\n): OllamaAdapter {\n return new OllamaAdapter(config);\n}\n","import type { StreamEvent } from \"@yourgpt/copilot-sdk/core\";\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 * 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): Response {\n return new Response(createEventStream(generator), {\n headers: createSSEHeaders(),\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} from \"@yourgpt/copilot-sdk/core\";\nimport type { AIProvider } from \"../providers/types\";\nimport { createMessage } from \"@yourgpt/copilot-sdk/core\";\nimport type { LLMAdapter, ChatCompletionRequest } from \"../adapters/base\";\n// Legacy imports - only used for legacy llm config\n// These are the most common adapters, kept for backward compatibility\nimport { createOpenAIAdapter } from \"../adapters/openai\";\nimport { createAnthropicAdapter } from \"../adapters/anthropic\";\nimport { createOllamaAdapter } from \"../adapters/ollama\";\nimport type {\n RuntimeConfig,\n ChatRequest,\n HandleRequestOptions,\n HandleRequestResult,\n} from \"./types\";\nimport { createSSEResponse } from \"./streaming\";\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 // NEW: Use AIProvider to get adapter\n this.adapter = config.provider.languageModel(config.model);\n } else if (\"adapter\" in config && config.adapter) {\n // EXISTING: Direct adapter\n this.adapter = config.adapter;\n } else {\n // EXISTING: Legacy LLM config\n this.adapter = this.createAdapter(config);\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 (new)\n if (config.tools) {\n for (const tool of config.tools) {\n this.tools.set(tool.name, tool);\n }\n }\n }\n\n /**\n * Create LLM adapter based on config\n */\n private createAdapter(config: RuntimeConfig): LLMAdapter {\n if (!(\"llm\" in config) || !config.llm) {\n throw new Error(\n \"LLM configuration is required when adapter is not provided\",\n );\n }\n const { llm } = config;\n\n switch (llm.provider) {\n case \"openai\":\n return createOpenAIAdapter({\n apiKey: llm.apiKey,\n model: llm.model,\n baseUrl: llm.baseUrl,\n temperature: llm.temperature,\n maxTokens: llm.maxTokens,\n });\n\n case \"anthropic\":\n return createAnthropicAdapter({\n apiKey: llm.apiKey,\n model: llm.model,\n temperature: llm.temperature,\n maxTokens: llm.maxTokens,\n });\n\n case \"ollama\":\n return createOllamaAdapter({\n model: llm.model,\n baseUrl: llm.baseUrl,\n temperature: llm.temperature,\n maxTokens: llm.maxTokens,\n });\n\n default:\n // Default to OpenAI-compatible\n return createOpenAIAdapter({\n apiKey: llm.apiKey,\n model: llm.model,\n baseUrl: llm.baseUrl,\n temperature: llm.temperature,\n maxTokens: llm.maxTokens,\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 };\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\n for await (const event of generator) {\n // Capture messages from done event\n if (event.type === \"done\" && event.messages) {\n doneMessages = event.messages;\n }\n yield event;\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 // TODO: Add usage tracking when available from adapter\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\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 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 };\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 name from config\n */\n private getProviderName(): string {\n if (\"provider\" in this.config && this.config.provider) {\n return this.config.provider.name;\n }\n if (\"llm\" in this.config && this.config.llm) {\n return this.config.llm.provider;\n }\n // Default to openai if using custom adapter\n return \"openai\";\n }\n\n /**\n * Get the AI provider instance (if using provider config)\n */\n getProvider(): AIProvider | null {\n if (\"provider\" in this.config && this.config.provider) {\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 && this.config.provider) {\n return this.config.model;\n }\n if (\"llm\" in this.config && this.config.llm) {\n return this.config.llm.model || \"unknown\";\n }\n return this.adapter.model;\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\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 };\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 \"error\":\n yield event;\n return; // Exit on error\n\n case \"done\":\n // Don't yield done yet - we need to check for tool calls first\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 yield {\n type: \"done\",\n requiresAction: true,\n messages: newMessages,\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 yield {\n type: \"done\",\n messages: newMessages.length > 0 ? newMessages : undefined,\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\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 };\n\n try {\n // Call the non-streaming complete method\n const result = await this.adapter.complete(completionRequest);\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 } 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 } 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 } 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 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/**\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 * @example\n * ```ts\n * // app/api/chat/route.ts\n * import { createNextHandler } from '@yourgpt/llm-sdk';\n *\n * const handler = createNextHandler({\n * llm: { provider: 'openai', apiKey: process.env.OPENAI_API_KEY! },\n * });\n *\n * export const POST = handler;\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\n *\n * @example\n * ```ts\n * import express from 'express';\n * import { createExpressMiddleware } from '@yourgpt/llm-sdk';\n *\n * const app = express();\n *\n * app.use('/api/chat', createExpressMiddleware({\n * llm: { provider: 'openai', apiKey: process.env.OPENAI_API_KEY! },\n * }));\n * ```\n */\nexport function createExpressMiddleware(config: RuntimeConfig) {\n const runtime = createRuntime(config);\n const app = createHonoApp(runtime);\n\n // Return Hono's fetch handler wrapped for Express\n return async (\n req: {\n method: string;\n url: string;\n headers: Record<string, string>;\n body: unknown;\n },\n res: {\n status: (code: number) => { json: (data: unknown) => void };\n setHeader: (name: string, value: string) => void;\n write: (data: string) => void;\n end: () => void;\n },\n ) => {\n try {\n // Convert Express request to Fetch Request\n const url = new URL(req.url, \"http://localhost\");\n const request = new Request(url, {\n method: req.method,\n headers: req.headers,\n body: req.method !== \"GET\" ? JSON.stringify(req.body) : undefined,\n });\n\n // Handle with runtime\n const response = await runtime.handleRequest(request);\n\n // Set response headers\n response.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n\n // Stream response body\n if (response.body) {\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n res.write(decoder.decode(value));\n }\n }\n\n res.end();\n } catch (error) {\n res.status(500).json({\n error: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n };\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 *\n * const handler = createNodeHandler({\n * llm: { provider: 'openai', apiKey: process.env.OPENAI_API_KEY! },\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 * 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 \"@yourgpt/copilot-sdk/core\";\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 \"@yourgpt/copilot-sdk/core\";\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 \"@yourgpt/copilot-sdk/core\";\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 AIProvider,\n AgentLoopConfig,\n Message,\n} from \"@yourgpt/copilot-sdk/core\";\nimport {\n generateToolCallId,\n generateMessageId,\n} from \"@yourgpt/copilot-sdk/core\";\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);\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);\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/adapters/base.ts","../src/adapters/openai.ts","../src/adapters/anthropic.ts","../src/adapters/ollama.ts","../src/server/streaming.ts","../src/server/stream-result.ts","../src/server/runtime.ts","../src/server/integrations.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","generateMessageId","tool","createMessage","Hono","cors","transformTools","parseToolCalls","extractTextContent","formatToolResults","isToolUseStop","isEndTurnStop","getStopReason","buildAssistantToolMessage","buildToolResultMessage"],"mappings":"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","file":"index.js","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/**\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 };\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\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","import type {\n Message,\n MessageAttachment,\n ActionDefinition,\n StreamEvent,\n LLMConfig,\n} from \"@yourgpt/copilot-sdk/core\";\n\n/**\n * Request-level LLM configuration overrides\n */\nexport interface RequestLLMConfig {\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\n/**\n * Chat completion request\n */\nexport interface ChatCompletionRequest {\n /** Conversation messages */\n messages: Message[];\n /**\n * Raw provider-formatted messages (for agent loop with tool calls)\n * When provided, these are used instead of converting from Message[]\n * This allows passing messages with tool_calls and tool role\n */\n rawMessages?: Array<Record<string, unknown>>;\n /** Available actions/tools */\n actions?: ActionDefinition[];\n /** System prompt */\n systemPrompt?: string;\n /** LLM configuration overrides */\n config?: RequestLLMConfig;\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n}\n\n/**\n * Non-streaming completion result\n */\nexport interface CompletionResult {\n /** Text content */\n content: string;\n /** Tool calls */\n toolCalls: Array<{ id: string; name: string; args: Record<string, unknown> }>;\n /** Thinking content (if extended thinking enabled) */\n thinking?: string;\n /** Raw provider response for debugging */\n rawResponse: Record<string, unknown>;\n}\n\n/**\n * Base LLM adapter interface\n */\nexport interface LLMAdapter {\n /** Provider name */\n readonly provider: string;\n\n /** Model name */\n readonly model: string;\n\n /**\n * Stream a chat completion\n */\n stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent>;\n\n /**\n * Non-streaming chat completion (for debugging/comparison)\n */\n complete?(request: ChatCompletionRequest): Promise<CompletionResult>;\n}\n\n/**\n * Adapter factory function type\n */\nexport type AdapterFactory = (config: LLMConfig) => LLMAdapter;\n\n/**\n * Convert messages to provider format (simple text only)\n */\nexport function formatMessages(\n messages: Message[],\n systemPrompt?: string,\n): Array<{ role: string; content: string }> {\n const formatted: Array<{ role: string; content: string }> = [];\n\n // Add system prompt if provided\n if (systemPrompt) {\n formatted.push({ role: \"system\", content: systemPrompt });\n }\n\n // Add conversation messages\n for (const msg of messages) {\n formatted.push({\n role: msg.role,\n content: msg.content ?? \"\",\n });\n }\n\n return formatted;\n}\n\n/**\n * Convert ActionParameter to JSON Schema format recursively\n */\nfunction parameterToJsonSchema(param: {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n}): Record<string, unknown> {\n const schema: Record<string, unknown> = {\n type: param.type,\n };\n\n if (param.description) {\n schema.description = param.description;\n }\n\n if (param.enum) {\n schema.enum = param.enum;\n }\n\n // Handle array items\n if (param.type === \"array\" && param.items) {\n schema.items = parameterToJsonSchema(\n param.items as {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n },\n );\n }\n\n // Handle nested object properties\n if (param.type === \"object\" && param.properties) {\n schema.properties = Object.fromEntries(\n Object.entries(param.properties).map(([key, prop]) => [\n key,\n parameterToJsonSchema(\n prop as {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n },\n ),\n ]),\n );\n }\n\n return schema;\n}\n\n/**\n * Convert actions to OpenAI tool format\n */\nexport function formatTools(actions: ActionDefinition[]): Array<{\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: object;\n };\n}> {\n return actions.map((action) => ({\n type: \"function\" as const,\n function: {\n name: action.name,\n description: action.description,\n parameters: {\n type: \"object\",\n properties: action.parameters\n ? Object.fromEntries(\n Object.entries(action.parameters).map(([key, param]) => [\n key,\n parameterToJsonSchema(param),\n ]),\n )\n : {},\n required: action.parameters\n ? Object.entries(action.parameters)\n .filter(([, param]) => param.required)\n .map(([key]) => key)\n : [],\n },\n },\n }));\n}\n\n// ============================================\n// Vision/Multimodal Support\n// ============================================\n\n/**\n * Content block types for multimodal messages\n */\nexport type AnthropicContentBlock =\n | { type: \"text\"; text: string }\n | {\n type: \"image\";\n source:\n | {\n type: \"base64\";\n media_type: string;\n data: string;\n }\n | {\n type: \"url\";\n url: string;\n };\n }\n | {\n type: \"document\";\n source:\n | {\n type: \"base64\";\n media_type: string;\n data: string;\n }\n | {\n type: \"url\";\n url: string;\n };\n };\n\nexport type OpenAIContentBlock =\n | { type: \"text\"; text: string }\n | {\n type: \"image_url\";\n image_url: {\n url: string;\n detail?: \"low\" | \"high\" | \"auto\";\n };\n };\n\n/**\n * Check if a message has image attachments\n * Supports both new format (metadata.attachments) and legacy (attachments)\n */\nexport function hasImageAttachments(message: Message): boolean {\n const attachments = message.metadata?.attachments;\n return attachments?.some((a) => a.type === \"image\") ?? false;\n}\n\n/**\n * Check if a message has media attachments (images or PDFs)\n */\nexport function hasMediaAttachments(message: Message): boolean {\n const attachments = message.metadata?.attachments;\n return (\n attachments?.some(\n (a) =>\n a.type === \"image\" ||\n (a.type === \"file\" && a.mimeType === \"application/pdf\"),\n ) ?? false\n );\n}\n\n/**\n * Convert MessageAttachment to Anthropic image content block\n *\n * Anthropic format:\n * {\n * type: \"image\",\n * source: {\n * type: \"base64\",\n * media_type: \"image/png\",\n * data: \"base64data...\"\n * }\n * }\n */\nexport function attachmentToAnthropicImage(\n attachment: MessageAttachment,\n): AnthropicContentBlock | null {\n if (attachment.type !== \"image\") return null;\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n return {\n type: \"image\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n };\n }\n\n // Fall back to base64 data\n if (!attachment.data) return null;\n\n // Extract base64 data (remove data URI prefix if present)\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: attachment.mimeType || \"image/png\",\n data: base64Data,\n },\n };\n}\n\n/**\n * Convert MessageAttachment to OpenAI image_url content block\n *\n * OpenAI format:\n * {\n * type: \"image_url\",\n * image_url: {\n * url: \"data:image/png;base64,...\"\n * }\n * }\n */\nexport function attachmentToOpenAIImage(\n attachment: MessageAttachment,\n): OpenAIContentBlock | null {\n if (attachment.type !== \"image\") return null;\n\n let imageUrl: string;\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n imageUrl = attachment.url;\n } else if (attachment.data) {\n // Build data URI if not already one\n imageUrl = attachment.data.startsWith(\"data:\")\n ? attachment.data\n : `data:${attachment.mimeType || \"image/png\"};base64,${attachment.data}`;\n } else {\n return null;\n }\n\n return {\n type: \"image_url\",\n image_url: {\n url: imageUrl,\n detail: \"auto\",\n },\n };\n}\n\n/**\n * Convert MessageAttachment (PDF) to Anthropic document content block\n *\n * Anthropic format:\n * {\n * type: \"document\",\n * source: {\n * type: \"base64\",\n * media_type: \"application/pdf\",\n * data: \"base64data...\"\n * }\n * }\n */\nexport function attachmentToAnthropicDocument(\n attachment: MessageAttachment,\n): AnthropicContentBlock | null {\n // Only handle PDF files\n if (attachment.type !== \"file\" || attachment.mimeType !== \"application/pdf\") {\n return null;\n }\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n return {\n type: \"document\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n };\n }\n\n // Fall back to base64 data\n if (!attachment.data) return null;\n\n // Extract base64 data (remove data URI prefix if present)\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n\n return {\n type: \"document\",\n source: {\n type: \"base64\",\n media_type: \"application/pdf\",\n data: base64Data,\n },\n };\n}\n\n/**\n * Convert a Message to Anthropic multimodal content blocks\n */\nexport function messageToAnthropicContent(\n message: Message,\n): string | AnthropicContentBlock[] {\n const attachments = message.metadata?.attachments;\n const content = message.content ?? \"\";\n\n // If no media attachments (images or PDFs), return simple string\n if (!hasMediaAttachments(message)) {\n return content;\n }\n\n // Build content blocks array\n const blocks: AnthropicContentBlock[] = [];\n\n // Add media attachments first (Claude recommends media before text)\n if (attachments) {\n for (const attachment of attachments) {\n // Try image first\n const imageBlock = attachmentToAnthropicImage(attachment);\n if (imageBlock) {\n blocks.push(imageBlock);\n continue;\n }\n // Try document (PDF)\n const docBlock = attachmentToAnthropicDocument(attachment);\n if (docBlock) {\n blocks.push(docBlock);\n }\n }\n }\n\n // Add text content\n if (content) {\n blocks.push({ type: \"text\", text: content });\n }\n\n return blocks;\n}\n\n/**\n * Convert a Message to OpenAI multimodal content blocks\n */\nexport function messageToOpenAIContent(\n message: Message,\n): string | OpenAIContentBlock[] {\n const attachments = message.metadata?.attachments;\n const content = message.content ?? \"\";\n\n // If no image attachments, return simple string\n if (!hasImageAttachments(message)) {\n return content;\n }\n\n // Build content blocks array\n const blocks: OpenAIContentBlock[] = [];\n\n // Add text content first\n if (content) {\n blocks.push({ type: \"text\", text: content });\n }\n\n // Add image attachments\n if (attachments) {\n for (const attachment of attachments) {\n const imageBlock = attachmentToOpenAIImage(attachment);\n if (imageBlock) {\n blocks.push(imageBlock);\n }\n }\n }\n\n return blocks;\n}\n\n/**\n * Anthropic content block types (extended for tools)\n */\nexport type AnthropicToolUseBlock = {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n};\n\nexport type AnthropicToolResultBlock = {\n type: \"tool_result\";\n tool_use_id: string;\n content: string;\n};\n\nexport type AnthropicMessageContent =\n | string\n | Array<\n AnthropicContentBlock | AnthropicToolUseBlock | AnthropicToolResultBlock\n >;\n\n/**\n * Format messages for Anthropic with full tool support\n * Handles: text, images, tool_use, and tool_result\n *\n * Key differences from OpenAI:\n * - tool_calls become tool_use blocks in assistant content\n * - tool results become tool_result blocks in user content\n */\nexport function formatMessagesForAnthropic(\n messages: Message[],\n systemPrompt?: string,\n): {\n system: string;\n messages: Array<{\n role: \"user\" | \"assistant\";\n content: AnthropicMessageContent;\n }>;\n} {\n const formatted: Array<{\n role: \"user\" | \"assistant\";\n content: AnthropicMessageContent;\n }> = [];\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n\n if (msg.role === \"system\") continue; // System handled separately\n\n if (msg.role === \"assistant\") {\n // Build content array for assistant\n const content: Array<AnthropicContentBlock | AnthropicToolUseBlock> = [];\n\n // Add text content if present\n if (msg.content) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Convert tool_calls to tool_use blocks\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n for (const tc of msg.tool_calls) {\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n });\n }\n }\n\n formatted.push({\n role: \"assistant\",\n content:\n content.length === 1 && content[0].type === \"text\"\n ? (content[0] as { type: \"text\"; text: string }).text\n : content,\n });\n } else if (msg.role === \"tool\" && msg.tool_call_id) {\n // Tool results go in user message as tool_result blocks\n // Group consecutive tool messages together\n const toolResults: AnthropicToolResultBlock[] = [\n {\n type: \"tool_result\",\n tool_use_id: msg.tool_call_id,\n content: msg.content ?? \"\",\n },\n ];\n\n // Look ahead for more consecutive tool messages\n while (i + 1 < messages.length && messages[i + 1].role === \"tool\") {\n i++;\n const nextTool = messages[i];\n if (nextTool.tool_call_id) {\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: nextTool.tool_call_id,\n content: nextTool.content ?? \"\",\n });\n }\n }\n\n formatted.push({\n role: \"user\",\n content: toolResults,\n });\n } else if (msg.role === \"user\") {\n formatted.push({\n role: \"user\",\n content: messageToAnthropicContent(msg),\n });\n }\n }\n\n return {\n system: systemPrompt || \"\",\n messages: formatted,\n };\n}\n\n/**\n * OpenAI message format with tool support\n */\nexport type OpenAIMessage =\n | { role: \"system\"; content: string }\n | { role: \"user\"; content: string | OpenAIContentBlock[] }\n | {\n role: \"assistant\";\n content: string | null;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n }\n | { role: \"tool\"; content: string; tool_call_id: string };\n\n/**\n * Format messages for OpenAI with full tool support\n * Handles: text, images, tool_calls, and tool results\n */\nexport function formatMessagesForOpenAI(\n messages: Message[],\n systemPrompt?: string,\n): OpenAIMessage[] {\n const formatted: OpenAIMessage[] = [];\n\n // Add system prompt if provided\n if (systemPrompt) {\n formatted.push({ role: \"system\", content: systemPrompt });\n }\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n formatted.push({ role: \"system\", content: msg.content ?? \"\" });\n } else if (msg.role === \"user\") {\n formatted.push({\n role: \"user\",\n content: messageToOpenAIContent(msg),\n });\n } else if (msg.role === \"assistant\") {\n const assistantMsg: OpenAIMessage = {\n role: \"assistant\",\n content: msg.content,\n };\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n (assistantMsg as { tool_calls: typeof msg.tool_calls }).tool_calls =\n msg.tool_calls;\n }\n formatted.push(assistantMsg);\n } else if (msg.role === \"tool\" && msg.tool_call_id) {\n formatted.push({\n role: \"tool\",\n content: msg.content ?? \"\",\n tool_call_id: msg.tool_call_id,\n });\n }\n }\n\n return formatted;\n}\n","import type { LLMConfig, StreamEvent } from \"@yourgpt/copilot-sdk/core\";\nimport {\n generateMessageId,\n generateToolCallId,\n} from \"@yourgpt/copilot-sdk/core\";\nimport type { LLMAdapter, ChatCompletionRequest } from \"./base\";\nimport { formatMessagesForOpenAI, formatTools } from \"./base\";\n\n/**\n * OpenAI adapter configuration\n */\nexport interface OpenAIAdapterConfig {\n apiKey: string;\n model?: string;\n baseUrl?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\n/**\n * OpenAI LLM Adapter\n *\n * Supports: GPT-4, GPT-4o, GPT-3.5-turbo, etc.\n */\nexport class OpenAIAdapter implements LLMAdapter {\n readonly provider = \"openai\";\n readonly model: string;\n\n private client: any; // OpenAI client (lazy loaded)\n private config: OpenAIAdapterConfig;\n\n constructor(config: OpenAIAdapterConfig) {\n this.config = config;\n this.model = config.model || \"gpt-4o\";\n }\n\n private async getClient() {\n if (!this.client) {\n // Dynamic import to make openai optional\n const { default: OpenAI } = await import(\"openai\");\n this.client = new OpenAI({\n apiKey: this.config.apiKey,\n baseURL: this.config.baseUrl,\n });\n }\n return this.client;\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n const client = await this.getClient();\n\n // Use raw messages if provided (for agent loop with tool calls), otherwise format from Message[]\n let messages: Array<Record<string, unknown>>;\n if (request.rawMessages && request.rawMessages.length > 0) {\n // Process raw messages - convert any attachments to OpenAI vision format\n const processedMessages = request.rawMessages.map((msg) => {\n // Check if message has attachments (images)\n const hasAttachments =\n msg.attachments &&\n Array.isArray(msg.attachments) &&\n msg.attachments.length > 0;\n\n if (hasAttachments) {\n // Convert to OpenAI multimodal content format\n const content: Array<Record<string, unknown>> = [];\n\n // Add text content if present\n if (msg.content) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Add image attachments\n for (const attachment of msg.attachments as Array<{\n type: string;\n data?: string;\n url?: string;\n mimeType?: string;\n }>) {\n if (attachment.type === \"image\") {\n let imageUrl: string;\n\n if (attachment.url) {\n // Use URL directly (cloud storage)\n imageUrl = attachment.url;\n } else if (attachment.data) {\n // Use base64 data\n imageUrl = attachment.data.startsWith(\"data:\")\n ? attachment.data\n : `data:${attachment.mimeType || \"image/png\"};base64,${attachment.data}`;\n } else {\n continue; // Skip if no data or URL\n }\n\n content.push({\n type: \"image_url\",\n image_url: { url: imageUrl, detail: \"auto\" },\n });\n }\n }\n\n return { ...msg, content, attachments: undefined };\n }\n return msg;\n });\n\n // Add system prompt at the start if provided and not already present\n if (request.systemPrompt) {\n const hasSystem = processedMessages.some((m) => m.role === \"system\");\n if (!hasSystem) {\n messages = [\n { role: \"system\", content: request.systemPrompt },\n ...processedMessages,\n ];\n } else {\n messages = processedMessages;\n }\n } else {\n messages = processedMessages;\n }\n } else {\n // Format from Message[] with multimodal support (images, attachments)\n messages = formatMessagesForOpenAI(\n request.messages,\n request.systemPrompt,\n ) as Array<Record<string, unknown>>;\n }\n\n const tools = request.actions?.length\n ? formatTools(request.actions)\n : undefined;\n\n const messageId = generateMessageId();\n\n // Emit message start\n yield { type: \"message:start\", id: messageId };\n\n try {\n const stream = await client.chat.completions.create({\n model: request.config?.model || this.model,\n messages,\n tools,\n temperature: request.config?.temperature ?? this.config.temperature,\n max_tokens: request.config?.maxTokens ?? this.config.maxTokens,\n stream: true,\n });\n\n let currentToolCall: {\n id: string;\n name: string;\n arguments: string;\n } | null = null;\n\n for await (const chunk of stream) {\n // Check for abort\n if (request.signal?.aborted) {\n break;\n }\n\n const delta = chunk.choices[0]?.delta;\n\n // Handle content\n if (delta?.content) {\n yield { type: \"message:delta\", content: delta.content };\n }\n\n // Handle tool calls\n if (delta?.tool_calls) {\n for (const toolCall of delta.tool_calls) {\n // New tool call\n if (toolCall.id) {\n // End previous tool call if any\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: currentToolCall.arguments,\n };\n }\n\n currentToolCall = {\n id: toolCall.id,\n name: toolCall.function?.name || \"\",\n arguments: toolCall.function?.arguments || \"\",\n };\n\n yield {\n type: \"action:start\",\n id: currentToolCall.id,\n name: currentToolCall.name,\n };\n } else if (currentToolCall && toolCall.function?.arguments) {\n // Append to current tool call arguments\n currentToolCall.arguments += toolCall.function.arguments;\n }\n }\n }\n\n // Check for finish\n if (chunk.choices[0]?.finish_reason) {\n // Complete any pending tool call\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: currentToolCall.arguments,\n };\n }\n }\n }\n\n // Emit message end\n yield { type: \"message:end\" };\n yield { type: \"done\" };\n } catch (error) {\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"OPENAI_ERROR\",\n };\n }\n }\n}\n\n/**\n * Create OpenAI adapter\n */\nexport function createOpenAIAdapter(\n config: OpenAIAdapterConfig,\n): OpenAIAdapter {\n return new OpenAIAdapter(config);\n}\n","import type { LLMConfig, StreamEvent } from \"@yourgpt/copilot-sdk/core\";\nimport { generateMessageId } from \"@yourgpt/copilot-sdk/core\";\nimport type {\n LLMAdapter,\n ChatCompletionRequest,\n CompletionResult,\n} from \"./base\";\nimport {\n formatMessagesForAnthropic,\n messageToAnthropicContent,\n type AnthropicContentBlock,\n} from \"./base\";\n\n/**\n * Extended thinking configuration\n */\nexport interface ThinkingConfig {\n type: \"enabled\";\n /** Budget for thinking tokens (minimum 1024) */\n budgetTokens?: number;\n}\n\n/**\n * Anthropic adapter configuration\n */\nexport interface AnthropicAdapterConfig {\n apiKey: string;\n model?: string;\n /** Base URL for API endpoint */\n baseUrl?: string;\n /** Enable extended thinking (for Claude 3.7 Sonnet, Claude 4) */\n thinking?: ThinkingConfig;\n temperature?: number;\n maxTokens?: number;\n}\n\n/**\n * Anthropic LLM Adapter\n *\n * Supports: Claude 3.5 Sonnet, Claude 3 Opus, Claude 3 Haiku, etc.\n */\nexport class AnthropicAdapter implements LLMAdapter {\n readonly provider = \"anthropic\";\n readonly model: string;\n\n private client: any; // Anthropic client (lazy loaded)\n private config: AnthropicAdapterConfig;\n\n constructor(config: AnthropicAdapterConfig) {\n this.config = config;\n this.model = config.model || \"claude-3-5-sonnet-latest\";\n }\n\n private async getClient() {\n if (!this.client) {\n // Dynamic import to make @anthropic-ai/sdk optional\n const { default: Anthropic } = await import(\"@anthropic-ai/sdk\");\n this.client = new Anthropic({\n apiKey: this.config.apiKey,\n });\n }\n return this.client;\n }\n\n /**\n * Convert OpenAI-style messages to Anthropic format\n *\n * OpenAI format:\n * - { role: \"assistant\", content: \"...\", tool_calls: [...] }\n * - { role: \"tool\", tool_call_id: \"...\", content: \"...\" }\n *\n * Anthropic format:\n * - { role: \"assistant\", content: [{ type: \"text\", text: \"...\" }, { type: \"tool_use\", id: \"...\", name: \"...\", input: {...} }] }\n * - { role: \"user\", content: [{ type: \"tool_result\", tool_use_id: \"...\", content: \"...\" }] }\n */\n private convertToAnthropicMessages(\n rawMessages: Array<Record<string, unknown>>,\n ): Array<Record<string, unknown>> {\n const messages: Array<Record<string, unknown>> = [];\n const pendingToolResults: Array<{ tool_use_id: string; content: string }> =\n [];\n\n for (const msg of rawMessages) {\n // Skip system messages (handled separately)\n if (msg.role === \"system\") continue;\n\n if (msg.role === \"assistant\") {\n // CRITICAL: Insert pending tool results BEFORE adding any assistant message\n // Anthropic requires: assistant(tool_use) → user(tool_result) → assistant(response)\n // Without this, the sequence becomes: assistant(tool_use) → assistant(response) → user(tool_result)\n // which violates Anthropic's API requirements and causes error:\n // \"tool_use ids were found without tool_result blocks immediately after\"\n if (pendingToolResults.length > 0) {\n messages.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.tool_use_id,\n content: tr.content,\n })),\n });\n pendingToolResults.length = 0;\n }\n\n // Convert assistant message with potential tool_calls\n const content: Array<Record<string, unknown>> = [];\n\n // Add text content if present\n if (\n msg.content &&\n typeof msg.content === \"string\" &&\n msg.content.trim()\n ) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Convert tool_calls to tool_use blocks\n const toolCalls = msg.tool_calls as\n | Array<{\n id: string;\n type: string;\n function: { name: string; arguments: string };\n }>\n | undefined;\n\n if (toolCalls && toolCalls.length > 0) {\n for (const tc of toolCalls) {\n let input = {};\n try {\n input = JSON.parse(tc.function.arguments);\n } catch {\n // Keep empty object if parse fails\n }\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input,\n });\n }\n }\n\n // Only add if there's content\n if (content.length > 0) {\n messages.push({ role: \"assistant\", content });\n }\n } else if (msg.role === \"tool\") {\n // Collect tool results to be bundled into a user message\n pendingToolResults.push({\n tool_use_id: msg.tool_call_id as string,\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content),\n });\n } else if (msg.role === \"user\") {\n // First, flush any pending tool results as a user message\n if (pendingToolResults.length > 0) {\n messages.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.tool_use_id,\n content: tr.content,\n })),\n });\n pendingToolResults.length = 0;\n }\n\n // Check if message has attachments (images)\n if (\n msg.attachments &&\n Array.isArray(msg.attachments) &&\n msg.attachments.length > 0\n ) {\n // Convert to Anthropic multimodal content format\n const content: Array<Record<string, unknown>> = [];\n\n // Add text content if present\n if (msg.content && typeof msg.content === \"string\") {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Add attachments (images, PDFs)\n for (const attachment of msg.attachments as Array<{\n type: string;\n data?: string;\n url?: string;\n mimeType?: string;\n }>) {\n if (attachment.type === \"image\") {\n if (attachment.url) {\n // Use URL directly (cloud storage) - Anthropic supports URL sources\n content.push({\n type: \"image\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n });\n } else if (attachment.data) {\n // Use base64 data\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n // Extract base64 from data URL\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n content.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: attachment.mimeType || \"image/png\",\n data: base64Data,\n },\n });\n }\n } else if (\n attachment.type === \"file\" &&\n attachment.mimeType === \"application/pdf\"\n ) {\n // PDF documents - Anthropic uses \"document\" type\n if (attachment.url) {\n content.push({\n type: \"document\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n });\n } else if (attachment.data) {\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n content.push({\n type: \"document\",\n source: {\n type: \"base64\",\n media_type: \"application/pdf\",\n data: base64Data,\n },\n });\n }\n }\n }\n\n messages.push({ role: \"user\", content });\n } else {\n // Add user message without attachments\n messages.push({\n role: \"user\",\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content),\n });\n }\n }\n }\n\n // Flush any remaining tool results\n if (pendingToolResults.length > 0) {\n messages.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.tool_use_id,\n content: tr.content,\n })),\n });\n }\n\n return messages;\n }\n\n /**\n * Build common request options for both streaming and non-streaming\n */\n private buildRequestOptions(request: ChatCompletionRequest): {\n options: Record<string, unknown>;\n messages: Array<Record<string, unknown>>;\n } {\n // Extract system message\n const systemMessage = request.systemPrompt || \"\";\n\n // Use raw messages if provided (for agent loop with tool calls)\n let messages: Array<Record<string, unknown>>;\n if (request.rawMessages && request.rawMessages.length > 0) {\n // Convert OpenAI-style messages to Anthropic format\n messages = this.convertToAnthropicMessages(request.rawMessages);\n } else {\n // Format from Message[] with multimodal support (images, attachments)\n const formatted = formatMessagesForAnthropic(request.messages, undefined);\n messages = formatted.messages as Array<Record<string, unknown>>;\n }\n\n // Convert actions to Anthropic tool format\n const tools = request.actions?.map((action) => ({\n name: action.name,\n description: action.description,\n input_schema: {\n type: \"object\" as const,\n properties: action.parameters\n ? Object.fromEntries(\n Object.entries(action.parameters).map(([key, param]) => [\n key,\n {\n type: param.type,\n description: param.description,\n enum: param.enum,\n },\n ]),\n )\n : {},\n required: action.parameters\n ? Object.entries(action.parameters)\n .filter(([, param]) => param.required)\n .map(([key]) => key)\n : [],\n },\n }));\n\n // Build request options\n const options: Record<string, unknown> = {\n model: request.config?.model || this.model,\n max_tokens: request.config?.maxTokens || this.config.maxTokens || 4096,\n system: systemMessage,\n messages,\n tools: tools?.length ? tools : undefined,\n };\n\n // Add thinking configuration if enabled\n if (this.config.thinking?.type === \"enabled\") {\n options.thinking = {\n type: \"enabled\",\n budget_tokens: this.config.thinking.budgetTokens || 10000,\n };\n }\n\n return { options, messages };\n }\n\n /**\n * Non-streaming completion (for debugging/comparison with original studio-ai)\n */\n async complete(request: ChatCompletionRequest): Promise<CompletionResult> {\n const client = await this.getClient();\n const { options } = this.buildRequestOptions(request);\n\n // Ensure non-streaming mode\n const nonStreamingOptions = {\n ...options,\n stream: false as const,\n } as Record<string, unknown> & { stream: false };\n\n try {\n const response = await client.messages.create(nonStreamingOptions);\n\n // Parse response\n let content = \"\";\n let thinking = \"\";\n const toolCalls: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n }> = [];\n\n for (const block of response.content) {\n if (block.type === \"text\") {\n content += block.text;\n } else if (block.type === \"thinking\") {\n thinking += (block as { thinking: string }).thinking;\n } else if (block.type === \"tool_use\") {\n toolCalls.push({\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n });\n }\n }\n\n return {\n content,\n toolCalls,\n thinking: thinking || undefined,\n rawResponse: response as Record<string, unknown>,\n };\n } catch (error) {\n throw error;\n }\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n const client = await this.getClient();\n const { options } = this.buildRequestOptions(request);\n\n const messageId = generateMessageId();\n\n // Emit message start\n yield { type: \"message:start\", id: messageId };\n\n try {\n const stream = await client.messages.stream(options);\n\n let currentToolUse: {\n id: string;\n name: string;\n input: string;\n } | null = null;\n\n let isInThinkingBlock = false;\n\n for await (const event of stream) {\n // Check for abort\n if (request.signal?.aborted) {\n break;\n }\n\n switch (event.type) {\n case \"content_block_start\":\n if (event.content_block.type === \"tool_use\") {\n currentToolUse = {\n id: event.content_block.id,\n name: event.content_block.name,\n input: \"\",\n };\n yield {\n type: \"action:start\",\n id: currentToolUse.id,\n name: currentToolUse.name,\n };\n } else if (event.content_block.type === \"thinking\") {\n // Start of thinking block\n isInThinkingBlock = true;\n yield { type: \"thinking:start\" };\n }\n break;\n\n case \"content_block_delta\":\n if (event.delta.type === \"text_delta\") {\n yield { type: \"message:delta\", content: event.delta.text };\n } else if (event.delta.type === \"thinking_delta\") {\n // Thinking content delta\n yield { type: \"thinking:delta\", content: event.delta.thinking };\n } else if (\n event.delta.type === \"input_json_delta\" &&\n currentToolUse\n ) {\n currentToolUse.input += event.delta.partial_json;\n }\n break;\n\n case \"content_block_stop\":\n if (currentToolUse) {\n yield {\n type: \"action:args\",\n id: currentToolUse.id,\n args: currentToolUse.input,\n };\n currentToolUse = null;\n }\n if (isInThinkingBlock) {\n yield { type: \"thinking:end\" };\n isInThinkingBlock = false;\n }\n break;\n\n case \"message_stop\":\n break;\n }\n }\n\n // Emit message end\n yield { type: \"message:end\" };\n yield { type: \"done\" };\n } catch (error) {\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"ANTHROPIC_ERROR\",\n };\n }\n }\n}\n\n/**\n * Create Anthropic adapter\n */\nexport function createAnthropicAdapter(\n config: AnthropicAdapterConfig,\n): AnthropicAdapter {\n return new AnthropicAdapter(config);\n}\n","import type { LLMConfig, StreamEvent } from \"@yourgpt/copilot-sdk/core\";\nimport { generateMessageId } from \"@yourgpt/copilot-sdk/core\";\nimport type { LLMAdapter, ChatCompletionRequest } from \"./base\";\nimport { formatMessages } from \"./base\";\n\n/**\n * Ollama adapter configuration\n */\nexport interface OllamaAdapterConfig {\n model?: string;\n baseUrl?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\n/**\n * Ollama LLM Adapter (Local models)\n *\n * Supports: Llama 3, Mistral, Phi, Gemma, CodeLlama, etc.\n */\nexport class OllamaAdapter implements LLMAdapter {\n readonly provider = \"ollama\";\n readonly model: string;\n\n private baseUrl: string;\n private config: OllamaAdapterConfig;\n\n constructor(config: OllamaAdapterConfig = {}) {\n this.config = config;\n this.model = config.model || \"llama3\";\n this.baseUrl = config.baseUrl || \"http://localhost:11434\";\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n const messages = formatMessages(request.messages, request.systemPrompt);\n\n const messageId = generateMessageId();\n\n // Emit message start\n yield { type: \"message:start\", id: messageId };\n\n try {\n const response = await fetch(`${this.baseUrl}/api/chat`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model: request.config?.model || this.model,\n messages,\n stream: true,\n options: {\n temperature: request.config?.temperature ?? this.config.temperature,\n num_predict: request.config?.maxTokens ?? this.config.maxTokens,\n },\n }),\n signal: request.signal,\n });\n\n if (!response.ok) {\n throw new Error(`Ollama API error: ${response.status}`);\n }\n\n if (!response.body) {\n throw new Error(\"No response body\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n\n try {\n const chunk = JSON.parse(line);\n\n if (chunk.message?.content) {\n yield { type: \"message:delta\", content: chunk.message.content };\n }\n\n // Ollama indicates completion with done: true\n if (chunk.done) {\n break;\n }\n } catch {\n // Skip invalid JSON\n }\n }\n }\n\n yield { type: \"message:end\" };\n yield { type: \"done\" };\n } catch (error) {\n if ((error as Error).name === \"AbortError\") {\n yield { type: \"done\" };\n } else {\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"OLLAMA_ERROR\",\n };\n }\n }\n }\n}\n\n/**\n * Create Ollama adapter\n */\nexport function createOllamaAdapter(\n config?: OllamaAdapterConfig,\n): OllamaAdapter {\n return new OllamaAdapter(config);\n}\n","import type { StreamEvent } from \"@yourgpt/copilot-sdk/core\";\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} from \"@yourgpt/copilot-sdk/core\";\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\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 /** 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\n constructor(generator: AsyncGenerator<StreamEvent>) {\n this.generator = generator;\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 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 to response\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\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 return 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 return collected;\n }\n\n // ============================================\n // Collection Methods\n // ============================================\n\n /**\n * Collect all events and return final result\n *\n * @example\n * ```typescript\n * const { text, messages, toolCalls } = await runtime.stream(body).collect();\n * console.log('Response:', text);\n * ```\n */\n async collect(): 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 return 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 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 break;\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/**\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","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} from \"@yourgpt/copilot-sdk/core\";\nimport type { AIProvider } from \"../providers/types\";\nimport { createMessage } from \"@yourgpt/copilot-sdk/core\";\nimport type { LLMAdapter, ChatCompletionRequest } from \"../adapters/base\";\n// Legacy imports - only used for legacy llm config\n// These are the most common adapters, kept for backward compatibility\nimport { createOpenAIAdapter } from \"../adapters/openai\";\nimport { createAnthropicAdapter } from \"../adapters/anthropic\";\nimport { createOllamaAdapter } from \"../adapters/ollama\";\nimport type {\n RuntimeConfig,\n ChatRequest,\n HandleRequestOptions,\n HandleRequestResult,\n} from \"./types\";\nimport { createSSEResponse } from \"./streaming\";\nimport { StreamResult, type CollectedResult } from \"./stream-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 // NEW: Use AIProvider to get adapter\n this.adapter = config.provider.languageModel(config.model);\n } else if (\"adapter\" in config && config.adapter) {\n // EXISTING: Direct adapter\n this.adapter = config.adapter;\n } else {\n // EXISTING: Legacy LLM config\n this.adapter = this.createAdapter(config);\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 (new)\n if (config.tools) {\n for (const tool of config.tools) {\n this.tools.set(tool.name, tool);\n }\n }\n }\n\n /**\n * Create LLM adapter based on config\n */\n private createAdapter(config: RuntimeConfig): LLMAdapter {\n if (!(\"llm\" in config) || !config.llm) {\n throw new Error(\n \"LLM configuration is required when adapter is not provided\",\n );\n }\n const { llm } = config;\n\n switch (llm.provider) {\n case \"openai\":\n return createOpenAIAdapter({\n apiKey: llm.apiKey,\n model: llm.model,\n baseUrl: llm.baseUrl,\n temperature: llm.temperature,\n maxTokens: llm.maxTokens,\n });\n\n case \"anthropic\":\n return createAnthropicAdapter({\n apiKey: llm.apiKey,\n model: llm.model,\n temperature: llm.temperature,\n maxTokens: llm.maxTokens,\n });\n\n case \"ollama\":\n return createOllamaAdapter({\n model: llm.model,\n baseUrl: llm.baseUrl,\n temperature: llm.temperature,\n maxTokens: llm.maxTokens,\n });\n\n default:\n // Default to OpenAI-compatible\n return createOpenAIAdapter({\n apiKey: llm.apiKey,\n model: llm.model,\n baseUrl: llm.baseUrl,\n temperature: llm.temperature,\n maxTokens: llm.maxTokens,\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 };\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\n for await (const event of generator) {\n // Capture messages from done event\n if (event.type === \"done\" && event.messages) {\n doneMessages = event.messages;\n }\n yield event;\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 // TODO: Add usage tracking when available from adapter\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\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 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 };\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 name from config\n */\n private getProviderName(): string {\n if (\"provider\" in this.config && this.config.provider) {\n return this.config.provider.name;\n }\n if (\"llm\" in this.config && this.config.llm) {\n return this.config.llm.provider;\n }\n // Default to openai if using custom adapter\n return \"openai\";\n }\n\n /**\n * Get the AI provider instance (if using provider config)\n */\n getProvider(): AIProvider | null {\n if (\"provider\" in this.config && this.config.provider) {\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 && this.config.provider) {\n return this.config.model;\n }\n if (\"llm\" in this.config && this.config.llm) {\n return this.config.llm.model || \"unknown\";\n }\n return this.adapter.model;\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\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 };\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 \"error\":\n yield event;\n return; // Exit on error\n\n case \"done\":\n // Don't yield done yet - we need to check for tool calls first\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 yield {\n type: \"done\",\n requiresAction: true,\n messages: newMessages,\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 yield {\n type: \"done\",\n messages: newMessages.length > 0 ? newMessages : undefined,\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\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 };\n\n try {\n // Call the non-streaming complete method\n const result = await this.adapter.complete(completionRequest);\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 } 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 } 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 } 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 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 */\n stream(\n request: ChatRequest,\n options?: { signal?: AbortSignal },\n ): StreamResult {\n const generator = this.processChatWithLoop(request, options?.signal);\n return new StreamResult(generator);\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 */\n async chat(\n request: ChatRequest,\n options?: { signal?: AbortSignal },\n ): Promise<CollectedResult> {\n return this.stream(request, options).collect();\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 * @example\n * ```ts\n * // app/api/chat/route.ts\n * import { createNextHandler } from '@yourgpt/llm-sdk';\n *\n * const handler = createNextHandler({\n * llm: { provider: 'openai', apiKey: process.env.OPENAI_API_KEY! },\n * });\n *\n * export const POST = handler;\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 *\n * const handler = createNodeHandler({\n * llm: { provider: 'openai', apiKey: process.env.OPENAI_API_KEY! },\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 * 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 \"@yourgpt/copilot-sdk/core\";\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 \"@yourgpt/copilot-sdk/core\";\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 \"@yourgpt/copilot-sdk/core\";\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 AIProvider,\n AgentLoopConfig,\n Message,\n} from \"@yourgpt/copilot-sdk/core\";\nimport {\n generateToolCallId,\n generateMessageId,\n} from \"@yourgpt/copilot-sdk/core\";\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);\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);\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"]}
|