@providerprotocol/ai 0.0.37 → 0.0.39

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.
Files changed (85) hide show
  1. package/README.md +94 -3
  2. package/dist/anthropic/index.d.ts +3 -2
  3. package/dist/cerebras/index.d.ts +3 -2
  4. package/dist/chunk-3Q5VELKG.js +124 -0
  5. package/dist/chunk-3Q5VELKG.js.map +1 -0
  6. package/dist/{chunk-LTEMH3CI.js → chunk-5XPRVUOK.js} +6 -4
  7. package/dist/{chunk-LTEMH3CI.js.map → chunk-5XPRVUOK.js.map} +1 -1
  8. package/dist/chunk-7ULSRWDH.js +83 -0
  9. package/dist/chunk-7ULSRWDH.js.map +1 -0
  10. package/dist/{chunk-YQLR3XOA.js → chunk-BIBMNP7Y.js} +1 -75
  11. package/dist/chunk-BIBMNP7Y.js.map +1 -0
  12. package/dist/{chunk-7GTWHZY2.js → chunk-IDZR4ROP.js} +5 -3
  13. package/dist/{chunk-7GTWHZY2.js.map → chunk-IDZR4ROP.js.map} +1 -1
  14. package/dist/{chunk-4RX4VQCB.js → chunk-IIMTP3XC.js} +2 -2
  15. package/dist/{chunk-ZRVNAET3.js → chunk-KNBODIQU.js} +6 -3
  16. package/dist/chunk-KNBODIQU.js.map +1 -0
  17. package/dist/{chunk-FYSZFIZS.js → chunk-O32SBS6S.js} +5 -3
  18. package/dist/{chunk-FYSZFIZS.js.map → chunk-O32SBS6S.js.map} +1 -1
  19. package/dist/{chunk-IK6NRCW5.js → chunk-RDC5GYST.js} +7 -7
  20. package/dist/{chunk-5IWHCXKN.js → chunk-SAMIK4WZ.js} +2 -2
  21. package/dist/{chunk-EPB3GQNL.js → chunk-U6M3MXNI.js} +11 -2
  22. package/dist/chunk-U6M3MXNI.js.map +1 -0
  23. package/dist/{chunk-2YXFLRQ6.js → chunk-WNB5PSY6.js} +2 -2
  24. package/dist/{chunk-CRP6Y7NF.js → chunk-ZDYEDI2A.js} +2 -2
  25. package/dist/{embedding-CwZ1ZNWv.d.ts → embedding-iNQCeXfk.d.ts} +1 -1
  26. package/dist/google/index.d.ts +3 -2
  27. package/dist/groq/index.d.ts +3 -2
  28. package/dist/http/index.d.ts +4 -3
  29. package/dist/{image-stream-CeQHtjxS.d.ts → image-stream-ARno6XlS.d.ts} +1 -1
  30. package/dist/index.d.ts +8 -7
  31. package/dist/index.js +11 -2
  32. package/dist/index.js.map +1 -1
  33. package/dist/{llm-DS_-l71X.d.ts → llm-CZqlijjK.d.ts} +16 -9
  34. package/dist/middleware/logging/index.d.ts +3 -2
  35. package/dist/middleware/parsed-object/index.d.ts +3 -2
  36. package/dist/middleware/persistence/index.d.ts +3 -2
  37. package/dist/middleware/pubsub/index.d.ts +5 -4
  38. package/dist/middleware/pubsub/index.js +49 -3
  39. package/dist/middleware/pubsub/index.js.map +1 -1
  40. package/dist/middleware/pubsub/server/express/index.d.ts +3 -2
  41. package/dist/middleware/pubsub/server/express/index.js +2 -2
  42. package/dist/middleware/pubsub/server/fastify/index.d.ts +3 -2
  43. package/dist/middleware/pubsub/server/fastify/index.js +2 -2
  44. package/dist/middleware/pubsub/server/h3/index.d.ts +3 -2
  45. package/dist/middleware/pubsub/server/h3/index.js +2 -2
  46. package/dist/middleware/pubsub/server/index.d.ts +3 -2
  47. package/dist/middleware/pubsub/server/index.js +5 -5
  48. package/dist/middleware/pubsub/server/webapi/index.d.ts +3 -2
  49. package/dist/middleware/pubsub/server/webapi/index.js +2 -2
  50. package/dist/moonshot/index.d.ts +511 -0
  51. package/dist/moonshot/index.js +1090 -0
  52. package/dist/moonshot/index.js.map +1 -0
  53. package/dist/ollama/index.d.ts +3 -2
  54. package/dist/openai/index.d.ts +3 -2
  55. package/dist/openrouter/index.d.ts +3 -2
  56. package/dist/proxy/index.d.ts +5 -4
  57. package/dist/proxy/index.js +12 -10
  58. package/dist/proxy/index.js.map +1 -1
  59. package/dist/proxy/server/express/index.d.ts +5 -4
  60. package/dist/proxy/server/express/index.js +3 -2
  61. package/dist/proxy/server/fastify/index.d.ts +5 -4
  62. package/dist/proxy/server/fastify/index.js +3 -2
  63. package/dist/proxy/server/h3/index.d.ts +19 -17
  64. package/dist/proxy/server/h3/index.js +3 -2
  65. package/dist/proxy/server/index.d.ts +5 -4
  66. package/dist/proxy/server/index.js +9 -8
  67. package/dist/proxy/server/webapi/index.d.ts +5 -4
  68. package/dist/proxy/server/webapi/index.js +3 -2
  69. package/dist/responses/index.d.ts +3 -2
  70. package/dist/{retry-CgoBNa51.d.ts → retry-C1eJbEMV.d.ts} +1 -1
  71. package/dist/{stream-sXhBtWjl.d.ts → stream-DVVUIKpz.d.ts} +3 -416
  72. package/dist/tool-D22EhP5F.d.ts +507 -0
  73. package/dist/{types-Cr4F0tVy.d.ts → types-CyXF0J7C.d.ts} +16 -3
  74. package/dist/utils/index.d.ts +65 -1
  75. package/dist/utils/index.js +15 -1
  76. package/dist/xai/index.d.ts +3 -2
  77. package/package.json +22 -3
  78. package/dist/chunk-EPB3GQNL.js.map +0 -1
  79. package/dist/chunk-YQLR3XOA.js.map +0 -1
  80. package/dist/chunk-ZRVNAET3.js.map +0 -1
  81. /package/dist/{chunk-4RX4VQCB.js.map → chunk-IIMTP3XC.js.map} +0 -0
  82. /package/dist/{chunk-IK6NRCW5.js.map → chunk-RDC5GYST.js.map} +0 -0
  83. /package/dist/{chunk-5IWHCXKN.js.map → chunk-SAMIK4WZ.js.map} +0 -0
  84. /package/dist/{chunk-2YXFLRQ6.js.map → chunk-WNB5PSY6.js.map} +0 -0
  85. /package/dist/{chunk-CRP6Y7NF.js.map → chunk-ZDYEDI2A.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/providers/moonshot/transform.ts","../../src/providers/moonshot/llm.ts","../../src/providers/moonshot/types.ts","../../src/providers/moonshot/index.ts"],"sourcesContent":["/**\n * @fileoverview Moonshot API Message Transformers\n *\n * This module provides transformation functions for converting between the\n * Universal Provider Protocol (UPP) message format and Moonshot's Chat Completions\n * API format (OpenAI-compatible). It handles both request transformation (UPP -> Moonshot)\n * and response transformation (Moonshot -> UPP), including streaming event transformation.\n *\n * @module providers/moonshot/transform\n */\n\nimport type { LLMRequest, LLMResponse } from '../../types/llm.ts';\nimport type { Message } from '../../types/messages.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport { StreamEventType } from '../../types/stream.ts';\nimport type { Tool, ToolCall } from '../../types/tool.ts';\nimport type { TokenUsage } from '../../types/turn.ts';\nimport type { ContentBlock, TextBlock, ImageBlock, VideoBlock, ReasoningBlock } from '../../types/content.ts';\nimport {\n AssistantMessage,\n isUserMessage,\n isAssistantMessage,\n isToolResultMessage,\n} from '../../types/messages.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { generateId } from '../../utils/id.ts';\nimport type {\n MoonshotLLMParams,\n MoonshotRequest,\n MoonshotMessage,\n MoonshotUserContent,\n MoonshotTool,\n MoonshotResponse,\n MoonshotStreamChunk,\n MoonshotToolCall,\n} from './types.ts';\n\n/**\n * Normalizes system prompt to string.\n */\nfunction normalizeSystem(system: string | unknown[] | undefined): string | undefined {\n if (system === undefined || system === null) return undefined;\n if (typeof system === 'string') return system;\n if (!Array.isArray(system)) {\n throw new UPPError(\n 'System prompt must be a string or an array of text blocks',\n ErrorCode.InvalidRequest,\n 'moonshot',\n ModalityType.LLM\n );\n }\n\n const texts: string[] = [];\n for (const block of system) {\n if (!block || typeof block !== 'object' || !('text' in block)) {\n throw new UPPError(\n 'System prompt array must contain objects with a text field',\n ErrorCode.InvalidRequest,\n 'moonshot',\n ModalityType.LLM\n );\n }\n const textValue = (block as { text?: unknown }).text;\n if (typeof textValue !== 'string') {\n throw new UPPError(\n 'System prompt text must be a string',\n ErrorCode.InvalidRequest,\n 'moonshot',\n ModalityType.LLM\n );\n }\n if (textValue.length > 0) {\n texts.push(textValue);\n }\n }\n\n return texts.length > 0 ? texts.join('\\n\\n') : undefined;\n}\n\n/**\n * Filters content blocks to only include those with a valid type property.\n */\nfunction filterValidContent<T extends { type?: string }>(content: T[]): T[] {\n return content.filter((c) => c && typeof c.type === 'string');\n}\n\n/**\n * Transforms a UPP content block to Moonshot user content format.\n */\nfunction transformContentBlock(block: ContentBlock): MoonshotUserContent {\n switch (block.type) {\n case 'text':\n return { type: 'text', text: block.text };\n\n case 'image': {\n const imageBlock = block as ImageBlock;\n let url: string;\n\n if (imageBlock.source.type === 'base64') {\n url = `data:${imageBlock.mimeType};base64,${imageBlock.source.data}`;\n } else if (imageBlock.source.type === 'url') {\n url = imageBlock.source.url;\n } else if (imageBlock.source.type === 'bytes') {\n const base64 = Buffer.from(imageBlock.source.data).toString('base64');\n url = `data:${imageBlock.mimeType};base64,${base64}`;\n } else {\n throw new UPPError(\n 'Unknown image source type',\n ErrorCode.InvalidRequest,\n 'moonshot',\n ModalityType.LLM\n );\n }\n\n return {\n type: 'image_url',\n image_url: { url },\n };\n }\n\n case 'video': {\n const videoBlock = block as VideoBlock;\n const base64 = Buffer.from(videoBlock.data).toString('base64');\n const url = `data:${videoBlock.mimeType};base64,${base64}`;\n\n return {\n type: 'video_url',\n video_url: { url },\n };\n }\n\n case 'document':\n throw new UPPError(\n 'Moonshot does not support inline document blocks. Use the /v1/files API to upload documents first.',\n ErrorCode.InvalidRequest,\n 'moonshot',\n ModalityType.LLM\n );\n\n case 'audio':\n throw new UPPError(\n 'Moonshot does not support audio input',\n ErrorCode.InvalidRequest,\n 'moonshot',\n ModalityType.LLM\n );\n\n default:\n throw new UPPError(\n `Unsupported content type: ${block.type}`,\n ErrorCode.InvalidRequest,\n 'moonshot',\n ModalityType.LLM\n );\n }\n}\n\n/**\n * Transforms a single UPP message to Moonshot format.\n */\nfunction transformMessage(message: Message): MoonshotMessage | null {\n if (isUserMessage(message)) {\n const validContent = filterValidContent(message.content);\n if (validContent.length === 1 && validContent[0]?.type === 'text') {\n return {\n role: 'user',\n content: (validContent[0] as TextBlock).text,\n };\n }\n return {\n role: 'user',\n content: validContent.map(transformContentBlock),\n };\n }\n\n if (isAssistantMessage(message)) {\n const validContent = filterValidContent(message.content);\n const textContent = validContent\n .filter((c): c is TextBlock => c.type === 'text')\n .map((c) => c.text)\n .join('');\n\n // Extract reasoning content from metadata or content blocks\n const moonshotMeta = message.metadata?.moonshot as { reasoning_content?: string } | undefined;\n let reasoningContent = moonshotMeta?.reasoning_content;\n\n // Also check for ReasoningBlock in content if not in metadata\n if (!reasoningContent) {\n const reasoningBlocks = validContent.filter(\n (c): c is ReasoningBlock => c.type === 'reasoning'\n );\n if (reasoningBlocks.length > 0) {\n reasoningContent = reasoningBlocks.map((b) => b.text).join('\\n');\n }\n }\n\n const assistantMessage: MoonshotMessage = {\n role: 'assistant',\n content: textContent || null,\n };\n\n // Include reasoning_content if present (required for tool call messages)\n if (reasoningContent) {\n (assistantMessage as { reasoning_content?: string }).reasoning_content = reasoningContent;\n }\n\n if (message.toolCalls && message.toolCalls.length > 0) {\n (assistantMessage as { tool_calls?: MoonshotToolCall[] }).tool_calls =\n message.toolCalls.map((call) => ({\n id: call.toolCallId,\n type: 'function' as const,\n function: {\n name: call.toolName,\n arguments: JSON.stringify(call.arguments),\n },\n }));\n }\n\n return assistantMessage;\n }\n\n if (isToolResultMessage(message)) {\n const results = message.results.map((result) => ({\n role: 'tool' as const,\n tool_call_id: result.toolCallId,\n content:\n typeof result.result === 'string'\n ? result.result\n : JSON.stringify(result.result),\n }));\n\n return results[0] ?? null;\n }\n\n return null;\n}\n\n/**\n * Transforms tool result messages into multiple Moonshot tool messages.\n */\nexport function transformToolResults(message: Message): MoonshotMessage[] {\n if (!isToolResultMessage(message)) {\n const single = transformMessage(message);\n return single ? [single] : [];\n }\n\n return message.results.map((result) => ({\n role: 'tool' as const,\n tool_call_id: result.toolCallId,\n content:\n typeof result.result === 'string'\n ? result.result\n : JSON.stringify(result.result),\n }));\n}\n\n/**\n * Transforms UPP messages to Moonshot message format.\n *\n * @param messages - Array of UPP messages to transform\n * @param system - Optional system prompt\n * @returns Array of Moonshot-formatted messages\n */\nfunction transformMessages(\n messages: Message[],\n system?: string | unknown[]\n): MoonshotMessage[] {\n const result: MoonshotMessage[] = [];\n const normalizedSystem = normalizeSystem(system);\n\n if (normalizedSystem) {\n result.push({\n role: 'system',\n content: normalizedSystem,\n });\n }\n\n for (const message of messages) {\n if (isToolResultMessage(message)) {\n const toolMessages = transformToolResults(message);\n result.push(...toolMessages);\n } else {\n const transformed = transformMessage(message);\n if (transformed) {\n result.push(transformed);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Extracts Moonshot-specific options from tool metadata.\n */\nfunction extractToolOptions(tool: Tool): { strict?: boolean } {\n const moonshotMeta = tool.metadata?.moonshot as { strict?: boolean } | undefined;\n return { strict: moonshotMeta?.strict };\n}\n\n/**\n * Transforms a UPP tool definition to Moonshot function tool format.\n */\nfunction transformTool(tool: Tool): MoonshotTool {\n const { strict } = extractToolOptions(tool);\n\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties: tool.parameters.properties,\n required: tool.parameters.required,\n ...(tool.parameters.additionalProperties !== undefined\n ? { additionalProperties: tool.parameters.additionalProperties }\n : {}),\n },\n ...(strict !== undefined ? { strict } : {}),\n },\n };\n}\n\n/**\n * Transforms a UPP LLM request into Moonshot Chat Completions API format.\n *\n * @param request - The UPP LLM request containing messages, tools, and configuration\n * @param modelId - The Moonshot model identifier (e.g., 'kimi-k2.5')\n * @returns A Moonshot Chat Completions API request body\n */\nexport function transformRequest(\n request: LLMRequest<MoonshotLLMParams>,\n modelId: string\n): MoonshotRequest {\n const params = request.params ?? ({} as MoonshotLLMParams);\n\n // Extract builtin tools from params before spreading\n const { tools: paramsTools, ...restParams } = params;\n\n const moonshotRequest: MoonshotRequest = {\n ...restParams,\n model: modelId,\n messages: transformMessages(request.messages, request.system),\n };\n\n // Combine builtin tools from params with transformed UPP tools\n const allTools: MoonshotTool[] = [];\n\n // Add builtin tools from params (already in Moonshot format)\n if (paramsTools && paramsTools.length > 0) {\n allTools.push(...paramsTools);\n }\n\n // Transform and add UPP tools from request.tools\n if (request.tools && request.tools.length > 0) {\n allTools.push(...request.tools.map(transformTool));\n }\n\n if (allTools.length > 0) {\n moonshotRequest.tools = allTools;\n }\n\n if (request.structure) {\n const schema: Record<string, unknown> = {\n type: 'object',\n properties: request.structure.properties,\n required: request.structure.required,\n ...(request.structure.additionalProperties !== undefined\n ? { additionalProperties: request.structure.additionalProperties }\n : { additionalProperties: false }),\n };\n if (request.structure.description) {\n schema.description = request.structure.description;\n }\n\n moonshotRequest.response_format = {\n type: 'json_schema',\n json_schema: {\n name: 'json_response',\n description: request.structure.description,\n schema,\n strict: true,\n },\n };\n }\n\n return moonshotRequest;\n}\n\n/**\n * Transforms a Moonshot response to UPP LLMResponse format.\n */\nexport function transformResponse(data: MoonshotResponse): LLMResponse {\n const choice = data.choices[0];\n if (!choice) {\n throw new UPPError(\n 'No choices in Moonshot response',\n ErrorCode.InvalidResponse,\n 'moonshot',\n ModalityType.LLM\n );\n }\n\n const contentBlocks: (TextBlock | ReasoningBlock)[] = [];\n let structuredData: unknown;\n\n if (choice.message.reasoning_content) {\n contentBlocks.push({ type: 'reasoning', text: choice.message.reasoning_content });\n }\n\n if (choice.message.content) {\n contentBlocks.push({ type: 'text', text: choice.message.content });\n try {\n structuredData = JSON.parse(choice.message.content);\n } catch {\n // Not JSON - expected for non-structured responses\n }\n }\n\n const toolCalls: ToolCall[] = [];\n if (choice.message.tool_calls) {\n for (const call of choice.message.tool_calls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(call.function.arguments);\n } catch {\n // Invalid JSON - use empty object\n }\n toolCalls.push({\n toolCallId: call.id,\n toolName: call.function.name,\n arguments: args,\n });\n }\n }\n\n const message = new AssistantMessage(\n contentBlocks,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: data.id || generateId(),\n metadata: {\n moonshot: {\n model: data.model,\n finish_reason: choice.finish_reason,\n system_fingerprint: data.system_fingerprint,\n reasoning_content: choice.message.reasoning_content ?? undefined,\n },\n },\n }\n );\n\n const usage: TokenUsage = {\n inputTokens: data.usage.prompt_tokens,\n outputTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens,\n cacheReadTokens: data.usage.prompt_tokens_details?.cached_tokens ?? 0,\n cacheWriteTokens: 0,\n };\n\n let stopReason = 'end_turn';\n switch (choice.finish_reason) {\n case 'stop':\n stopReason = 'end_turn';\n break;\n case 'length':\n stopReason = 'max_tokens';\n break;\n case 'tool_calls':\n stopReason = 'tool_use';\n break;\n case 'content_filter':\n stopReason = 'content_filter';\n break;\n }\n\n return {\n message,\n usage,\n stopReason,\n data: structuredData,\n };\n}\n\n/**\n * Mutable state object for accumulating data during streaming responses.\n */\nexport interface MoonshotStreamState {\n /** Response ID from the first chunk */\n id: string;\n /** Model identifier */\n model: string;\n /** Accumulated text content */\n text: string;\n /** Accumulated reasoning content (thinking traces) */\n reasoningText: string;\n /** Map of tool call index to accumulated tool call data */\n toolCalls: Map<number, { id: string; name: string; arguments: string }>;\n /** The finish reason when streaming completes */\n finishReason: string | null;\n /** Input token count (from usage chunk) */\n inputTokens: number;\n /** Output token count (from usage chunk) */\n outputTokens: number;\n /** Number of tokens read from cache */\n cacheReadTokens: number;\n}\n\n/**\n * Creates a fresh stream state object for a new streaming session.\n */\nexport function createStreamState(): MoonshotStreamState {\n return {\n id: '',\n model: '',\n text: '',\n reasoningText: '',\n toolCalls: new Map(),\n finishReason: null,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n };\n}\n\n/**\n * Transforms a Moonshot streaming chunk into UPP stream events.\n */\nexport function transformStreamEvent(\n chunk: MoonshotStreamChunk,\n state: MoonshotStreamState\n): StreamEvent[] {\n const events: StreamEvent[] = [];\n\n if (chunk.id && !state.id) {\n state.id = chunk.id;\n events.push({ type: StreamEventType.MessageStart, index: 0, delta: {} });\n }\n if (chunk.model) {\n state.model = chunk.model;\n }\n\n const choice = chunk.choices[0];\n if (choice) {\n if (choice.delta.reasoning_content) {\n state.reasoningText += choice.delta.reasoning_content;\n events.push({\n type: StreamEventType.ReasoningDelta,\n index: 0,\n delta: { text: choice.delta.reasoning_content },\n });\n }\n\n if (choice.delta.content) {\n state.text += choice.delta.content;\n events.push({\n type: StreamEventType.TextDelta,\n index: 0,\n delta: { text: choice.delta.content },\n });\n }\n\n if (choice.delta.tool_calls) {\n for (const toolCallDelta of choice.delta.tool_calls) {\n const index = toolCallDelta.index;\n let toolCall = state.toolCalls.get(index);\n\n if (!toolCall) {\n toolCall = { id: '', name: '', arguments: '' };\n state.toolCalls.set(index, toolCall);\n }\n\n if (toolCallDelta.id) {\n toolCall.id = toolCallDelta.id;\n }\n if (toolCallDelta.function?.name) {\n toolCall.name = toolCallDelta.function.name;\n }\n if (toolCallDelta.function?.arguments) {\n toolCall.arguments += toolCallDelta.function.arguments;\n events.push({\n type: StreamEventType.ToolCallDelta,\n index: index,\n delta: {\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n argumentsJson: toolCallDelta.function.arguments,\n },\n });\n }\n }\n }\n\n if (choice.finish_reason) {\n state.finishReason = choice.finish_reason;\n events.push({ type: StreamEventType.MessageStop, index: 0, delta: {} });\n }\n }\n\n if (chunk.usage) {\n state.inputTokens = chunk.usage.prompt_tokens;\n state.outputTokens = chunk.usage.completion_tokens;\n state.cacheReadTokens = chunk.usage.prompt_tokens_details?.cached_tokens ?? 0;\n }\n\n return events;\n}\n\n/**\n * Builds a complete LLMResponse from accumulated streaming state.\n */\nexport function buildResponseFromState(state: MoonshotStreamState): LLMResponse {\n const contentBlocks: (TextBlock | ReasoningBlock)[] = [];\n let structuredData: unknown;\n\n if (state.reasoningText) {\n contentBlocks.push({ type: 'reasoning', text: state.reasoningText });\n }\n\n if (state.text) {\n contentBlocks.push({ type: 'text', text: state.text });\n try {\n structuredData = JSON.parse(state.text);\n } catch {\n // Not JSON - expected for non-structured responses\n }\n }\n\n const toolCalls: ToolCall[] = [];\n for (const [, toolCall] of state.toolCalls) {\n let args: Record<string, unknown> = {};\n if (toolCall.arguments) {\n try {\n args = JSON.parse(toolCall.arguments);\n } catch {\n // Invalid JSON - use empty object\n }\n }\n toolCalls.push({\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n arguments: args,\n });\n }\n\n const messageId = state.id || generateId();\n const message = new AssistantMessage(\n contentBlocks,\n toolCalls.length > 0 ? toolCalls : undefined,\n {\n id: messageId,\n metadata: {\n moonshot: {\n model: state.model,\n finish_reason: state.finishReason,\n reasoning_content: state.reasoningText || undefined,\n },\n },\n }\n );\n\n const usage: TokenUsage = {\n inputTokens: state.inputTokens,\n outputTokens: state.outputTokens,\n totalTokens: state.inputTokens + state.outputTokens,\n cacheReadTokens: state.cacheReadTokens,\n cacheWriteTokens: 0,\n };\n\n let stopReason = 'end_turn';\n switch (state.finishReason) {\n case 'stop':\n stopReason = 'end_turn';\n break;\n case 'length':\n stopReason = 'max_tokens';\n break;\n case 'tool_calls':\n stopReason = 'tool_use';\n break;\n case 'content_filter':\n stopReason = 'content_filter';\n break;\n }\n\n return {\n message,\n usage,\n stopReason,\n data: structuredData,\n };\n}\n","/**\n * @fileoverview Moonshot Chat Completions API Handler\n *\n * This module implements the LLM handler for Moonshot's Chat Completions API\n * (OpenAI-compatible at `https://api.moonshot.ai/v1/chat/completions`).\n *\n * @see {@link https://platform.moonshot.ai/docs/api/chat Moonshot API Reference}\n * @module providers/moonshot/llm\n */\n\nimport type { BoundLLMModel, LLMRequest, LLMResponse, LLMStreamResult, LLMCapabilities } from '../../types/llm.ts';\nimport type { LLMHandler } from '../../types/provider.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport { StreamEventType, objectDelta } from '../../types/stream.ts';\nimport type { LLMProvider, ProviderConfig } from '../../types/provider.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { resolveApiKey } from '../../http/keys.ts';\nimport { doFetch, doStreamFetch } from '../../http/fetch.ts';\nimport { parseSSEStream } from '../../http/sse.ts';\nimport { normalizeHttpError } from '../../http/errors.ts';\nimport { parseJsonResponse } from '../../http/json.ts';\nimport { toError } from '../../utils/error.ts';\nimport type { MoonshotLLMParams, MoonshotResponse, MoonshotStreamChunk } from './types.ts';\nimport {\n transformRequest,\n transformResponse,\n transformStreamEvent,\n createStreamState,\n buildResponseFromState,\n} from './transform.ts';\n\n/** Base URL for Moonshot's Chat Completions API endpoint (global) */\nconst MOONSHOT_API_URL = 'https://api.moonshot.ai/v1/chat/completions';\n\n/**\n * Capability declaration for the Moonshot Chat Completions API.\n *\n * Defines what features are supported by this handler:\n * - Streaming: Real-time token-by-token response streaming via SSE\n * - Tools: Function calling for structured interactions\n * - Structured Output: JSON schema-based response formatting\n * - Image Input: Native vision via MoonViT encoder\n * - Video Input: Experimental video support\n */\nconst MOONSHOT_CAPABILITIES: LLMCapabilities = {\n streaming: true,\n tools: true,\n structuredOutput: true,\n imageInput: true,\n documentInput: false,\n videoInput: true,\n audioInput: false,\n};\n\n/**\n * Resolves the Moonshot API key from config or environment variables.\n *\n * Checks in order:\n * 1. config.apiKey (if provided)\n * 2. MOONSHOT_API_KEY environment variable\n * 3. KIMI_API_KEY environment variable (fallback)\n *\n * @param config - Provider configuration\n * @returns The API key\n * @throws UPPError if no API key is found\n */\nasync function resolveMoonshotApiKey(config: ProviderConfig): Promise<string> {\n // First try the standard resolution with MOONSHOT_API_KEY\n try {\n return await resolveApiKey(config, 'MOONSHOT_API_KEY', 'moonshot', 'llm');\n } catch {\n // Fall back to KIMI_API_KEY\n const kimiKey = process.env.KIMI_API_KEY;\n if (kimiKey) {\n return kimiKey;\n }\n\n throw new UPPError(\n 'API key not found. Set MOONSHOT_API_KEY or KIMI_API_KEY environment variable, or pass apiKey in config.',\n ErrorCode.AuthenticationFailed,\n 'moonshot',\n ModalityType.LLM\n );\n }\n}\n\n/**\n * Creates an LLM handler for Moonshot's Chat Completions API.\n *\n * This factory function creates a handler that communicates with the\n * `/v1/chat/completions` endpoint. The handler supports both synchronous\n * completion requests and streaming responses.\n *\n * @returns An LLM handler configured for the Moonshot API\n *\n * @example\n * ```typescript\n * const handler = createLLMHandler();\n * const model = handler.bind('kimi-k2.5');\n *\n * // Synchronous completion\n * const response = await model.complete({\n * messages: [{ role: 'user', content: 'Hello!' }],\n * config: { apiKey: 'sk-...' }\n * });\n *\n * // Streaming completion\n * const stream = model.stream({\n * messages: [{ role: 'user', content: 'Tell me a story' }],\n * config: { apiKey: 'sk-...' }\n * });\n *\n * for await (const event of stream) {\n * if (event.type === StreamEventType.TextDelta) {\n * process.stdout.write(event.delta.text);\n * }\n * }\n * ```\n */\nexport function createLLMHandler(): LLMHandler<MoonshotLLMParams> {\n let providerRef: LLMProvider<MoonshotLLMParams> | null = null;\n\n return {\n _setProvider(provider: LLMProvider<MoonshotLLMParams>) {\n providerRef = provider;\n },\n\n bind(modelId: string): BoundLLMModel<MoonshotLLMParams> {\n if (!providerRef) {\n throw new UPPError(\n 'Provider reference not set. Handler must be used with createProvider() or have _setProvider called.',\n ErrorCode.InvalidRequest,\n 'moonshot',\n ModalityType.LLM\n );\n }\n\n const model: BoundLLMModel<MoonshotLLMParams> = {\n modelId,\n capabilities: MOONSHOT_CAPABILITIES,\n\n get provider(): LLMProvider<MoonshotLLMParams> {\n return providerRef!;\n },\n\n async complete(request: LLMRequest<MoonshotLLMParams>): Promise<LLMResponse> {\n const apiKey = await resolveMoonshotApiKey(request.config);\n\n const baseUrl = request.config.baseUrl ?? MOONSHOT_API_URL;\n const body = transformRequest(request, modelId);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n };\n\n if (request.config.headers) {\n for (const [key, value] of Object.entries(request.config.headers)) {\n if (value !== undefined) {\n headers[key] = value;\n }\n }\n }\n\n const response = await doFetch(\n baseUrl,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'moonshot',\n 'llm'\n );\n\n const data = await parseJsonResponse<MoonshotResponse>(response, 'moonshot', 'llm');\n return transformResponse(data);\n },\n\n stream(request: LLMRequest<MoonshotLLMParams>): LLMStreamResult {\n const state = createStreamState();\n let responseResolve: (value: LLMResponse) => void;\n let responseReject: (error: Error) => void;\n\n const responsePromise = new Promise<LLMResponse>((resolve, reject) => {\n responseResolve = resolve;\n responseReject = reject;\n });\n\n async function* generateEvents(): AsyncGenerator<StreamEvent, void, unknown> {\n try {\n const apiKey = await resolveMoonshotApiKey(request.config);\n\n const baseUrl = request.config.baseUrl ?? MOONSHOT_API_URL;\n const body = transformRequest(request, modelId);\n body.stream = true;\n body.stream_options = { include_usage: true };\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n Accept: 'text/event-stream',\n };\n\n if (request.config.headers) {\n for (const [key, value] of Object.entries(request.config.headers)) {\n if (value !== undefined) {\n headers[key] = value;\n }\n }\n }\n\n const response = await doStreamFetch(\n baseUrl,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'moonshot',\n 'llm'\n );\n\n if (!response.ok) {\n const error = await normalizeHttpError(response, 'moonshot', 'llm');\n responseReject(error);\n throw error;\n }\n\n if (!response.body) {\n const error = new UPPError(\n 'No response body for streaming request',\n ErrorCode.ProviderError,\n 'moonshot',\n ModalityType.LLM\n );\n responseReject(error);\n throw error;\n }\n\n for await (const data of parseSSEStream(response.body)) {\n // Skip [DONE] marker\n if (data === '[DONE]') {\n continue;\n }\n\n // Check for Moonshot error event\n if (typeof data === 'object' && data !== null) {\n const chunk = data as MoonshotStreamChunk;\n\n // Check for error in chunk\n if ('error' in chunk && chunk.error) {\n const errorData = chunk.error as { message?: string; type?: string };\n const error = new UPPError(\n errorData.message ?? 'Unknown error',\n ErrorCode.ProviderError,\n 'moonshot',\n ModalityType.LLM\n );\n responseReject(error);\n throw error;\n }\n\n const uppEvents = transformStreamEvent(chunk, state);\n for (const event of uppEvents) {\n yield event;\n // Also emit ObjectDelta for structured output - gives developers explicit hook\n if (request.structure && event.type === StreamEventType.TextDelta) {\n yield objectDelta(event.delta.text ?? '', event.index);\n }\n }\n }\n }\n\n // Build final response\n responseResolve(buildResponseFromState(state));\n } catch (error) {\n const err = toError(error);\n responseReject(err);\n throw err;\n }\n }\n\n return {\n [Symbol.asyncIterator]() {\n return generateEvents();\n },\n response: responsePromise,\n };\n },\n };\n\n return model;\n },\n };\n}\n","/**\n * @fileoverview Moonshot AI Provider Type Definitions\n *\n * This module contains all TypeScript type definitions for the Moonshot provider,\n * including types for the Chat Completions API (OpenAI-compatible).\n *\n * @module providers/moonshot/types\n */\n\n/**\n * Thinking mode configuration for Moonshot models.\n *\n * By default, kimi-k2.5 has thinking mode enabled and returns reasoning traces.\n * Use `{ type: 'disabled' }` to switch to instant mode for faster responses.\n */\nexport interface MoonshotThinkingConfig {\n /** Thinking mode type: 'enabled' (default) or 'disabled' for instant mode */\n type: 'enabled' | 'disabled';\n}\n\n/**\n * Parameters for the Moonshot Chat Completions API.\n *\n * These parameters are passed directly to the `/v1/chat/completions` endpoint.\n * Moonshot's API is OpenAI-compatible with additional thinking mode support.\n *\n * @example\n * ```typescript\n * const params: MoonshotLLMParams = {\n * temperature: 1.0,\n * max_tokens: 1000,\n * thinking: { type: 'enabled' } // Default for kimi-k2.5\n * };\n * ```\n */\nexport interface MoonshotLLMParams {\n /** Maximum number of tokens to generate */\n max_tokens?: number;\n\n /** Maximum completion tokens (alias for max_tokens) */\n max_completion_tokens?: number;\n\n /** Temperature for randomness (0.0 to 2.0). Default: 1.0 (thinking) or 0.6 (instant) */\n temperature?: number;\n\n /** Top-p (nucleus) sampling (0.0 - 1.0), default 0.95 */\n top_p?: number;\n\n /** Custom stop sequences */\n stop?: string | string[];\n\n /** Frequency penalty (-2.0 - 2.0) */\n frequency_penalty?: number;\n\n /** Presence penalty (-2.0 - 2.0) */\n presence_penalty?: number;\n\n /** Seed for deterministic sampling */\n seed?: number;\n\n /** User identifier for rate limit tracking */\n user?: string;\n\n /** Response format for structured output */\n response_format?: MoonshotResponseFormat;\n\n /** Thinking mode configuration (kimi-k2.5 specific) */\n thinking?: MoonshotThinkingConfig;\n\n /**\n * Builtin tools to enable for this request.\n * Use the `tools` helper object to create these.\n *\n * @example\n * ```typescript\n * import { moonshot, tools } from '@providerprotocol/ai/moonshot';\n *\n * const model = llm({\n * model: moonshot('kimi-k2.5'),\n * params: {\n * tools: [tools.webSearch(), tools.codeRunner()],\n * },\n * });\n * ```\n */\n tools?: MoonshotTool[];\n}\n\n/**\n * Response format options for structured output.\n */\nexport type MoonshotResponseFormat =\n | { type: 'text' }\n | { type: 'json_object' }\n | {\n type: 'json_schema';\n json_schema: {\n name: string;\n description?: string;\n schema: Record<string, unknown>;\n strict?: boolean;\n };\n };\n\n/**\n * Request body for the Moonshot Chat Completions API.\n */\nexport interface MoonshotRequest {\n model: string;\n messages: MoonshotMessage[];\n temperature?: number;\n top_p?: number;\n stream?: boolean;\n stream_options?: { include_usage?: boolean };\n stop?: string | string[];\n max_tokens?: number;\n max_completion_tokens?: number;\n presence_penalty?: number;\n frequency_penalty?: number;\n user?: string;\n seed?: number;\n tools?: MoonshotTool[];\n tool_choice?: MoonshotToolChoice;\n response_format?: MoonshotResponseFormat;\n thinking?: MoonshotThinkingConfig;\n}\n\n/**\n * Union type for all message types in the Moonshot API.\n */\nexport type MoonshotMessage =\n | MoonshotSystemMessage\n | MoonshotUserMessage\n | MoonshotAssistantMessage\n | MoonshotToolMessage;\n\n/** System message for setting context and instructions */\nexport interface MoonshotSystemMessage {\n role: 'system';\n content: string;\n}\n\n/** User message with text or multimodal content */\nexport interface MoonshotUserMessage {\n role: 'user';\n content: string | MoonshotUserContent[];\n}\n\n/** Assistant message containing the model's response */\nexport interface MoonshotAssistantMessage {\n role: 'assistant';\n content?: string | null;\n /** Reasoning traces from thinking mode */\n reasoning_content?: string | null;\n tool_calls?: MoonshotToolCall[];\n}\n\n/** Tool result message providing output from a function call */\nexport interface MoonshotToolMessage {\n role: 'tool';\n content: string;\n tool_call_id: string;\n}\n\n/**\n * Union type for user content parts (text, image, or video).\n */\nexport type MoonshotUserContent = MoonshotTextContent | MoonshotImageContent | MoonshotVideoContent;\n\n/** Text content part */\nexport interface MoonshotTextContent {\n type: 'text';\n text: string;\n}\n\n/** Image content part with URL reference (for vision models) */\nexport interface MoonshotImageContent {\n type: 'image_url';\n image_url: {\n url: string;\n };\n}\n\n/** Video content part with URL reference (experimental) */\nexport interface MoonshotVideoContent {\n type: 'video_url';\n video_url: {\n url: string;\n };\n}\n\n/**\n * Tool call structure in assistant messages.\n */\nexport interface MoonshotToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\n/**\n * Tool definition for the Moonshot API.\n * Used for both custom function tools and server-side builtin tools.\n */\nexport interface MoonshotTool {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: {\n type?: 'object';\n description?: string;\n properties: Record<string, unknown>;\n required?: string[];\n additionalProperties?: boolean;\n };\n strict?: boolean;\n };\n}\n\n/**\n * Tool choice options for controlling function calling behavior.\n * Moonshot models support full tool_choice including 'required'.\n */\nexport type MoonshotToolChoice =\n | 'none'\n | 'auto'\n | 'required'\n | { type: 'function'; function: { name: string } };\n\n// ============================================\n// Server-Side Tool Factory Functions\n// ============================================\n// These tools are executed by Moonshot's servers, not by the client.\n// The model decides when to call them and the API handles execution.\n//\n// TODO: Implement `excel` plugin - uses `_plugin` format with multiple\n// sub-functions (read_file, list_sheets, describe, inspect, pipe, groupby,\n// orderby, filter, head, value_counts, correlation, sample, select, count,\n// sum, distinct, add_column). Requires file IDs from Moonshot's /v1/files API.\n\n/**\n * Options for web search tool.\n */\nexport interface MoonshotWebSearchOptions {\n /** Search domains to focus on */\n classes?: Array<'all' | 'academic' | 'social' | 'library' | 'finance' | 'code' | 'ecommerce' | 'medical'>;\n}\n\n/**\n * Creates a web search tool (server-side execution).\n * Enables real-time internet search capabilities.\n *\n * Note: Web search is charged separately from regular API usage.\n *\n * @example\n * ```typescript\n * import { moonshot, tools } from '@providerprotocol/ai/moonshot';\n *\n * const model = llm({\n * model: moonshot('kimi-k2.5'),\n * params: {\n * tools: [tools.webSearch()],\n * },\n * });\n * ```\n */\nexport function webSearch(): MoonshotTool {\n return {\n type: 'function',\n function: {\n name: 'web_search',\n description: 'Search the web for information',\n parameters: {\n type: 'object',\n properties: {\n query: {\n description: 'What to search for',\n type: 'string',\n },\n classes: {\n description: 'Search domains to focus on. Defaults to \"all\" if not specified.',\n type: 'array',\n items: {\n type: 'string',\n enum: ['all', 'academic', 'social', 'library', 'finance', 'code', 'ecommerce', 'medical'],\n },\n },\n },\n required: ['query'],\n },\n },\n };\n}\n\n/**\n * Creates a Python code runner tool (server-side execution).\n * Allows execution of Python code for calculations and data processing.\n * Supports print output, matplotlib plots, pandas, and file reading via ctx.read_object().\n */\nexport function codeRunner(): MoonshotTool {\n return {\n type: 'function',\n function: {\n name: 'code_runner',\n description: 'Safely executes Python code and returns the result, with print output, last-line evaluation, error handling, and timeout protection.',\n parameters: {\n type: 'object',\n properties: {\n code: {\n description: 'The Python code to execute. Supports print(), matplotlib, pandas, and ctx.read_object() for file reading.',\n type: 'string',\n },\n },\n required: ['code'],\n },\n },\n };\n}\n\n/**\n * Creates a QuickJS JavaScript execution tool (server-side execution).\n * Enables secure JavaScript code execution via the QuickJS engine.\n */\nexport function quickjs(): MoonshotTool {\n return {\n type: 'function',\n function: {\n name: 'quickjs',\n description: 'Safely executes JavaScript code using QuickJS engine',\n parameters: {\n type: 'object',\n properties: {\n code: {\n description: 'The JavaScript code to execute. Supports console.log(), ES6+ features, and ctx.log() for logging.',\n type: 'string',\n },\n },\n required: ['code'],\n },\n },\n };\n}\n\n/**\n * Creates a URL fetch tool (server-side execution).\n * Extracts content from URLs and formats it as Markdown.\n */\nexport function fetch(): MoonshotTool {\n return {\n type: 'function',\n function: {\n name: 'fetch',\n description: 'Fetches a URL from the internet and optionally extracts its contents as markdown.',\n parameters: {\n type: 'object',\n properties: {\n url: {\n description: 'URL to fetch',\n type: 'string',\n format: 'uri',\n },\n max_length: {\n description: 'Maximum number of characters to return (default: 5000)',\n type: 'integer',\n default: 5000,\n },\n start_index: {\n description: 'Start at this character index, useful for pagination',\n type: 'integer',\n default: 0,\n },\n raw: {\n description: 'Get raw HTML without simplification',\n type: 'boolean',\n default: false,\n },\n },\n required: ['url'],\n },\n },\n };\n}\n\n/**\n * Creates a unit conversion tool (server-side execution).\n * Supports length, mass, volume, temperature, area, time, energy,\n * pressure, speed, and currency conversions.\n */\nexport function convert(): MoonshotTool {\n return {\n type: 'function',\n function: {\n name: 'convert',\n description: 'Convert between supported units of length, mass, volume, temperature, area, time, energy, pressure, speed, and currency.',\n parameters: {\n type: 'object',\n properties: {\n value: {\n description: 'Value to convert',\n type: 'number',\n },\n from_unit: {\n description: 'Source unit (e.g., m, km, ft, kg, lb, °C, °F, USD, EUR)',\n type: 'string',\n },\n to_unit: {\n description: 'Target unit',\n type: 'string',\n },\n },\n required: ['value', 'from_unit', 'to_unit'],\n },\n },\n };\n}\n\n/**\n * Creates a date/time processing tool (server-side execution).\n * Handles date and time calculations, timezone conversion, and formatting.\n */\nexport function date(): MoonshotTool {\n return {\n type: 'function',\n function: {\n name: 'date',\n description: 'Date and time processing tool, supports displaying current time, timezone conversion, date calculation, and more.',\n parameters: {\n type: 'object',\n properties: {\n operation: {\n description: 'Operation type',\n type: 'string',\n enum: ['time', 'convert', 'between', 'add', 'subtract'],\n },\n date: {\n description: 'Date string (YYYY-MM-DD or YYYY-MM-DD HH:MM:SS)',\n type: 'string',\n },\n date1: {\n description: 'First date (for difference calculation)',\n type: 'string',\n },\n date2: {\n description: 'Second date (for difference calculation)',\n type: 'string',\n },\n days: {\n description: 'Number of days (for add/subtract)',\n type: 'integer',\n },\n zone: {\n description: 'Timezone name (e.g., Asia/Shanghai, America/New_York, UTC)',\n type: 'string',\n },\n from_zone: {\n description: 'Source timezone (for conversion)',\n type: 'string',\n },\n to_zone: {\n description: 'Target timezone (for conversion)',\n type: 'string',\n },\n format: {\n description: 'Output format (Python strftime)',\n type: 'string',\n default: '%Y-%m-%d %H:%M:%S',\n },\n },\n required: ['operation'],\n },\n },\n };\n}\n\n/**\n * Creates a Base64 encoding tool (server-side execution).\n */\nexport function base64Encode(): MoonshotTool {\n return {\n type: 'function',\n function: {\n name: 'base64_encode',\n description: 'Encode text to base64 format',\n parameters: {\n type: 'object',\n properties: {\n data: {\n description: 'Text data to encode to base64',\n type: 'string',\n },\n encoding: {\n description: 'Character encoding to use (default: utf-8)',\n type: 'string',\n default: 'utf-8',\n },\n },\n required: ['data'],\n },\n },\n };\n}\n\n/**\n * Creates a Base64 decoding tool (server-side execution).\n */\nexport function base64Decode(): MoonshotTool {\n return {\n type: 'function',\n function: {\n name: 'base64_decode',\n description: 'Decode base64 text to original format',\n parameters: {\n type: 'object',\n properties: {\n data: {\n description: 'Base64 encoded data to decode',\n type: 'string',\n },\n encoding: {\n description: 'Character encoding to use (default: utf-8)',\n type: 'string',\n default: 'utf-8',\n },\n },\n required: ['data'],\n },\n },\n };\n}\n\n/**\n * Creates a memory storage tool (server-side execution).\n * Supports persistent storage of conversation history and user preferences.\n */\nexport function memory(): MoonshotTool {\n return {\n type: 'function',\n function: {\n name: 'memory',\n description: 'Memory storage and retrieval system, supporting persistence of conversation history, user preferences, and other data.',\n parameters: {\n type: 'object',\n properties: {\n action: {\n description: 'Operation type',\n type: 'string',\n enum: ['store', 'retrieve', 'delete', 'list'],\n },\n key: {\n description: 'Storage key name',\n type: 'string',\n },\n data: {\n description: 'Data content to store',\n type: 'object',\n },\n prefix: {\n description: 'Key prefix for list operation',\n type: 'string',\n },\n ttl: {\n description: 'Data expiration time in seconds (default: 86400 = 24 hours)',\n type: 'integer',\n default: 86400,\n },\n },\n required: ['action'],\n },\n },\n };\n}\n\n/**\n * Creates an intelligent reasoning tool (server-side execution).\n * Allows the model to organize thoughts and plan before responding.\n */\nexport function rethink(): MoonshotTool {\n return {\n type: 'function',\n function: {\n name: 'rethink',\n description: 'Tool for organizing thoughts, making plans, and thinking step by step. Does not return information, just for reflection.',\n parameters: {\n type: 'object',\n properties: {\n thought: {\n description: 'The thought to consider for better solving the current task',\n type: 'string',\n },\n },\n required: ['thought'],\n },\n },\n };\n}\n\n/**\n * Creates a random choice tool (server-side execution).\n * Enables random selection from options with optional weights.\n */\nexport function randomChoice(): MoonshotTool {\n return {\n type: 'function',\n function: {\n name: 'random_choice',\n description: 'Random selection tool that supports choosing items from candidates with optional weights.',\n parameters: {\n type: 'object',\n properties: {\n candidates: {\n description: 'List of candidates to choose from',\n type: 'array',\n items: { type: 'string' },\n },\n count: {\n description: 'Number of items to select (default: 1)',\n type: 'integer',\n default: 1,\n },\n replace: {\n description: 'Allow duplicates (default: false)',\n type: 'boolean',\n default: false,\n },\n weights: {\n description: 'Optional weights for weighted selection',\n type: 'array',\n items: { type: 'number' },\n },\n seed: {\n description: 'Random seed for reproducibility',\n type: 'integer',\n },\n format: {\n description: 'Output format',\n type: 'string',\n enum: ['simple', 'detailed', 'json'],\n default: 'simple',\n },\n },\n required: ['candidates'],\n },\n },\n };\n}\n\n/**\n * Creates a cat meowing/blessing tool (server-side execution).\n * Returns random cat meowing sounds and blessings based on mood.\n */\nexport function mew(): MoonshotTool {\n return {\n type: 'function',\n function: {\n name: 'mew_generator',\n description: \"Randomly generates a cat's meow, accompanied by a blessing.\",\n parameters: {\n type: 'object',\n properties: {\n mood: {\n description: \"The cat's mood\",\n type: 'string',\n enum: ['happy', 'sleepy', 'hungry', 'playful', 'grumpy'],\n },\n },\n required: [],\n },\n },\n };\n}\n\n\n/**\n * Moonshot builtin tools factory object.\n * Provides convenient access to all builtin tool creators.\n *\n * Note: The `excel` plugin tool uses a different format and is not included here.\n * It requires file IDs from the Moonshot file upload API.\n *\n * @example\n * ```typescript\n * import { moonshot, tools } from '@providerprotocol/ai/moonshot';\n *\n * const model = llm({\n * model: moonshot('kimi-k2.5'),\n * params: {\n * tools: [\n * tools.webSearch(),\n * tools.codeRunner(),\n * tools.fetch(),\n * ],\n * },\n * });\n * ```\n */\nexport const tools = {\n /** Web search for real-time internet information */\n webSearch,\n /** Python code execution with matplotlib, pandas support */\n codeRunner,\n /** JavaScript execution via QuickJS engine */\n quickjs,\n /** URL content fetching with markdown extraction */\n fetch,\n /** Unit conversion (length, mass, temperature, currency, etc.) */\n convert,\n /** Date/time processing and timezone conversion */\n date,\n /** Base64 encoding */\n base64Encode,\n /** Base64 decoding */\n base64Decode,\n /** Alias for base64Encode */\n base64: base64Encode,\n /** Memory storage and retrieval system */\n memory,\n /** Intelligent reasoning/reflection tool */\n rethink,\n /** Random selection with optional weights */\n randomChoice,\n /** Cat meowing and blessings generator */\n mew,\n};\n\n/**\n * Response structure from the Moonshot Chat Completions API.\n */\nexport interface MoonshotResponse {\n id: string;\n object: 'chat.completion';\n created: number;\n model: string;\n choices: MoonshotChoice[];\n usage: MoonshotUsage;\n system_fingerprint?: string;\n}\n\n/** A single choice from a completion response */\nexport interface MoonshotChoice {\n index: number;\n message: MoonshotAssistantMessage;\n finish_reason: 'stop' | 'length' | 'tool_calls' | 'content_filter' | null;\n}\n\n/** Token usage statistics from the API response */\nexport interface MoonshotUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n prompt_tokens_details?: {\n cached_tokens?: number;\n };\n}\n\n/**\n * Streaming chunk structure from the Moonshot API.\n */\nexport interface MoonshotStreamChunk {\n id: string;\n object: 'chat.completion.chunk';\n created: number;\n model: string;\n choices: MoonshotStreamChoice[];\n usage?: MoonshotUsage | null;\n system_fingerprint?: string;\n}\n\n/** A streaming choice containing incremental content */\nexport interface MoonshotStreamChoice {\n index: number;\n delta: MoonshotStreamDelta;\n finish_reason: 'stop' | 'length' | 'tool_calls' | 'content_filter' | null;\n}\n\n/** Incremental content delta in a streaming chunk */\nexport interface MoonshotStreamDelta {\n role?: 'assistant';\n content?: string | null;\n reasoning_content?: string | null;\n tool_calls?: MoonshotStreamToolCall[];\n}\n\n/** Incremental tool call data in a streaming chunk */\nexport interface MoonshotStreamToolCall {\n index: number;\n id?: string;\n type?: 'function';\n function?: {\n name?: string;\n arguments?: string;\n };\n}\n\n/**\n * Moonshot-specific HTTP headers for API requests.\n *\n * @example\n * ```typescript\n * const headers: MoonshotHeaders = {\n * 'X-Request-Id': 'my-request-id',\n * };\n * ```\n */\nexport interface MoonshotHeaders {\n /** Client-generated request ID for tracing */\n 'X-Request-Id'?: string;\n [key: string]: string | undefined;\n}\n","/**\n * @fileoverview Moonshot Provider Factory\n *\n * This module provides the main Moonshot provider implementation for the\n * OpenAI-compatible Chat Completions API.\n *\n * @module providers/moonshot\n */\n\nimport { createProvider } from '../../core/provider.ts';\nimport { createLLMHandler } from './llm.ts';\n\n/**\n * Configuration options for the Moonshot provider.\n *\n * Currently Moonshot only supports one API endpoint (Chat Completions),\n * so no additional options are needed.\n */\nexport interface MoonshotProviderOptions {\n // Reserved for future use\n}\n\n/**\n * The Moonshot provider instance.\n *\n * Use this provider to create model references for Moonshot models like\n * Kimi K2.5 and other models available on the Moonshot AI platform.\n *\n * @example Basic usage\n * ```typescript\n * import { moonshot } from './providers/moonshot';\n * import { llm } from './core/llm';\n *\n * const model = llm({\n * model: moonshot('kimi-k2.5'),\n * params: { max_tokens: 1000 }\n * });\n *\n * const turn = await model.generate('Hello!');\n * console.log(turn.response.text);\n * ```\n *\n * @example With streaming\n * ```typescript\n * const stream = model.stream('Tell me a story');\n *\n * for await (const event of stream) {\n * if (event.type === StreamEventType.TextDelta) {\n * process.stdout.write(event.delta.text ?? '');\n * }\n * }\n *\n * const turn = await stream.turn;\n * console.log('Tokens used:', turn.usage.totalTokens);\n * ```\n *\n * @example With thinking mode (default for K2.5)\n * ```typescript\n * const model = llm({\n * model: moonshot('kimi-k2.5'),\n * params: {\n * max_tokens: 2000,\n * temperature: 1.0, // Recommended for thinking mode\n * thinking: { type: 'enabled' } // Default\n * }\n * });\n *\n * // Response includes reasoning_content in metadata\n * const turn = await model.generate('Solve this step by step: 2x + 5 = 13');\n * ```\n *\n * @example With instant mode (disabled thinking)\n * ```typescript\n * const model = llm({\n * model: moonshot('kimi-k2.5'),\n * params: {\n * max_tokens: 1000,\n * temperature: 0.6, // Recommended for instant mode\n * thinking: { type: 'disabled' }\n * }\n * });\n * ```\n *\n * @example With vision (image input)\n * ```typescript\n * import { Image } from './core/media/Image';\n *\n * const image = await Image.fromPath('./photo.png');\n * const turn = await model.generate([\n * image.toBlock(),\n * { type: 'text', text: 'Describe this image' }\n * ]);\n * ```\n *\n * @example Available models\n * Production models:\n * - `kimi-k2.5` - Latest K2.5 with 256K context, vision, thinking mode\n *\n * Environment variables:\n * - `MOONSHOT_API_KEY` - Primary API key\n * - `KIMI_API_KEY` - Fallback API key\n */\nexport const moonshot = createProvider<MoonshotProviderOptions>({\n name: 'moonshot',\n version: '1.0.0',\n handlers: {\n llm: createLLMHandler(),\n },\n});\n\nexport { tools } from './types.ts';\nexport type {\n MoonshotLLMParams,\n MoonshotHeaders,\n MoonshotResponseFormat,\n MoonshotMessage,\n MoonshotRequest,\n MoonshotResponse,\n MoonshotStreamChunk,\n MoonshotTool,\n MoonshotToolCall,\n MoonshotToolChoice,\n MoonshotUsage,\n MoonshotThinkingConfig,\n} from './types.ts';\n"],"mappings":"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","names":[]}
@@ -1,5 +1,6 @@
1
- import { e as Provider } from '../llm-DS_-l71X.js';
2
- import '../stream-sXhBtWjl.js';
1
+ import { e as Provider } from '../llm-CZqlijjK.js';
2
+ import '../stream-DVVUIKpz.js';
3
+ import '../tool-D22EhP5F.js';
3
4
 
4
5
  /**
5
6
  * @fileoverview Type definitions for the Ollama provider.
@@ -1,5 +1,6 @@
1
- import { e as Provider } from '../llm-DS_-l71X.js';
2
- import '../stream-sXhBtWjl.js';
1
+ import { e as Provider } from '../llm-CZqlijjK.js';
2
+ import '../stream-DVVUIKpz.js';
3
+ import '../tool-D22EhP5F.js';
3
4
 
4
5
  /**
5
6
  * @fileoverview OpenAI Provider Type Definitions
@@ -1,5 +1,6 @@
1
- import { e as Provider } from '../llm-DS_-l71X.js';
2
- import '../stream-sXhBtWjl.js';
1
+ import { e as Provider } from '../llm-CZqlijjK.js';
2
+ import '../stream-DVVUIKpz.js';
3
+ import '../tool-D22EhP5F.js';
3
4
 
4
5
  /**
5
6
  * OpenRouter-specific types for the Unified Provider Protocol.
@@ -1,12 +1,13 @@
1
- import { e as Provider, h as ModelReference } from '../llm-DS_-l71X.js';
1
+ import { e as Provider, h as ModelReference } from '../llm-CZqlijjK.js';
2
2
  export { AdapterOptions, ParsedBody, ProxyHandler, RequestMeta, server } from './server/index.js';
3
- import { M as Message, a as MessageJSON, T as Turn, b as TurnJSON, S as StreamEvent } from '../stream-sXhBtWjl.js';
3
+ import { M as Message, a as MessageJSON, T as Turn, b as TurnJSON, S as StreamEvent } from '../stream-DVVUIKpz.js';
4
4
  export { ParsedEmbeddingRequest, ParsedImageRequest, ParsedRequest, bindTools, parseBody, parseEmbeddingBody, parseImageBody, toEmbeddingJSON, toError, toImageJSON, toImageSSE, toJSON, toSSE, webapi } from './server/webapi/index.js';
5
5
  export { express } from './server/express/index.js';
6
6
  export { fastify } from './server/fastify/index.js';
7
7
  export { h3 } from './server/h3/index.js';
8
- import '../embedding-CwZ1ZNWv.js';
9
- import '../image-stream-CeQHtjxS.js';
8
+ import '../tool-D22EhP5F.js';
9
+ import '../embedding-iNQCeXfk.js';
10
+ import '../image-stream-ARno6XlS.js';
10
11
 
11
12
  /**
12
13
  * @fileoverview Proxy provider types.
@@ -1,12 +1,15 @@
1
1
  import {
2
2
  server
3
- } from "../chunk-IK6NRCW5.js";
3
+ } from "../chunk-RDC5GYST.js";
4
+ import {
5
+ express
6
+ } from "../chunk-O32SBS6S.js";
4
7
  import {
5
8
  h3
6
- } from "../chunk-ZRVNAET3.js";
9
+ } from "../chunk-KNBODIQU.js";
7
10
  import {
8
11
  fastify
9
- } from "../chunk-7GTWHZY2.js";
12
+ } from "../chunk-IDZR4ROP.js";
10
13
  import {
11
14
  bindTools,
12
15
  parseBody,
@@ -19,21 +22,20 @@ import {
19
22
  toJSON,
20
23
  toSSE,
21
24
  webapi
22
- } from "../chunk-LTEMH3CI.js";
23
- import {
24
- express
25
- } from "../chunk-FYSZFIZS.js";
25
+ } from "../chunk-5XPRVUOK.js";
26
26
  import {
27
27
  deserializeImageResponse,
28
28
  deserializeImageStreamEvent,
29
+ serializeEmbeddingInput,
30
+ serializeImage
31
+ } from "../chunk-BIBMNP7Y.js";
32
+ import {
29
33
  deserializeMessage,
30
34
  deserializeStreamEvent,
31
- serializeEmbeddingInput,
32
- serializeImage,
33
35
  serializeMessage,
34
36
  serializeStreamEvent,
35
37
  serializeTurn
36
- } from "../chunk-YQLR3XOA.js";
38
+ } from "../chunk-7ULSRWDH.js";
37
39
  import "../chunk-ETBFOLQN.js";
38
40
  import {
39
41
  emptyUsage
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/providers/proxy/headers.ts","../../src/providers/proxy/llm.ts","../../src/providers/proxy/embedding.ts","../../src/providers/proxy/image.ts","../../src/providers/proxy/index.ts"],"sourcesContent":["/**\n * @fileoverview Header merging utilities for proxy provider.\n *\n * @module providers/proxy/headers\n */\n\n/**\n * Merge request headers with provider default headers.\n */\nexport function mergeHeaders(\n requestHeaders: Record<string, string | undefined> | undefined,\n defaultHeaders: Record<string, string>\n): Record<string, string> {\n const headers: Record<string, string> = { ...defaultHeaders };\n if (requestHeaders) {\n for (const [key, value] of Object.entries(requestHeaders)) {\n if (value !== undefined) {\n headers[key] = value;\n }\n }\n }\n return headers;\n}\n","/**\n * @fileoverview Proxy LLM handler implementation.\n *\n * Transports PP LLM requests over HTTP to a backend server.\n * Supports both synchronous completion and streaming via SSE.\n * Full support for retry strategies, timeouts, and custom headers.\n *\n * @module providers/proxy/llm\n */\n\nimport type {\n BoundLLMModel,\n LLMRequest,\n LLMResponse,\n LLMStreamResult,\n LLMCapabilities,\n} from '../../types/llm.ts';\nimport type { LLMHandler } from '../../types/provider.ts';\nimport type { LLMProvider } from '../../types/provider.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport { StreamEventType, objectDelta } from '../../types/stream.ts';\nimport type { TurnJSON } from '../../types/turn.ts';\nimport { AssistantMessage } from '../../types/messages.ts';\nimport { emptyUsage } from '../../types/turn.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { doFetch, doStreamFetch } from '../../http/fetch.ts';\nimport { normalizeHttpError } from '../../http/errors.ts';\nimport { parseJsonResponse } from '../../http/json.ts';\nimport { toError } from '../../utils/error.ts';\nimport type { ProxyLLMParams, ProxyProviderOptions } from './types.ts';\nimport { mergeHeaders } from './headers.ts';\nimport {\n serializeMessage,\n deserializeMessage,\n deserializeStreamEvent,\n} from './serialization.ts';\n\n/**\n * Capability flags for proxy provider.\n * All capabilities are enabled since the backend determines actual support.\n */\nconst PROXY_CAPABILITIES: LLMCapabilities = {\n streaming: true,\n tools: true,\n structuredOutput: true,\n imageInput: true,\n documentInput: true,\n videoInput: true,\n audioInput: true,\n};\n\n/**\n * Serialize an LLMRequest for HTTP transport.\n */\nfunction serializeRequest(\n request: LLMRequest<ProxyLLMParams>,\n modelId: string\n): Record<string, unknown> {\n return {\n model: modelId,\n messages: request.messages.map(serializeMessage),\n system: request.system,\n params: request.params,\n tools: request.tools?.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n metadata: t.metadata,\n })),\n structure: request.structure,\n };\n}\n\nfunction mapCompletionStopReason(reason: string): string {\n switch (reason) {\n case 'stop':\n return 'end_turn';\n case 'length':\n return 'max_tokens';\n case 'tool_calls':\n return 'tool_use';\n case 'content_filter':\n return 'content_filter';\n default:\n return 'end_turn';\n }\n}\n\nfunction mapAnthropicStopReason(reason: string): string {\n switch (reason) {\n case 'tool_use':\n return 'tool_use';\n case 'max_tokens':\n return 'max_tokens';\n case 'end_turn':\n return 'end_turn';\n case 'stop_sequence':\n return 'end_turn';\n default:\n return 'end_turn';\n }\n}\n\nfunction mapGoogleStopReason(reason: string): string {\n switch (reason) {\n case 'STOP':\n return 'end_turn';\n case 'MAX_TOKENS':\n return 'max_tokens';\n case 'SAFETY':\n return 'content_filter';\n case 'RECITATION':\n return 'content_filter';\n case 'OTHER':\n return 'end_turn';\n default:\n return 'end_turn';\n }\n}\n\nfunction mapOllamaStopReason(reason: string): string {\n if (reason === 'length') {\n return 'max_tokens';\n }\n if (reason === 'stop') {\n return 'end_turn';\n }\n return 'end_turn';\n}\n\nfunction deriveStopReason(message: AssistantMessage | undefined): string {\n if (!message) {\n return 'end_turn';\n }\n\n if (message.toolCalls && message.toolCalls.length > 0) {\n return 'tool_use';\n }\n\n const metadata = message.metadata;\n const openaiMeta = metadata?.openai as { finish_reason?: string; status?: string } | undefined;\n if (openaiMeta?.status) {\n if (openaiMeta.status === 'failed') {\n return 'error';\n }\n if (openaiMeta.status === 'completed') {\n return 'end_turn';\n }\n }\n if (openaiMeta?.finish_reason) {\n return mapCompletionStopReason(openaiMeta.finish_reason);\n }\n\n const openrouterMeta = metadata?.openrouter as { finish_reason?: string } | undefined;\n if (openrouterMeta?.finish_reason) {\n return mapCompletionStopReason(openrouterMeta.finish_reason);\n }\n\n const xaiMeta = metadata?.xai as { finish_reason?: string; status?: string } | undefined;\n if (xaiMeta?.status) {\n if (xaiMeta.status === 'failed') {\n return 'error';\n }\n if (xaiMeta.status === 'completed') {\n return 'end_turn';\n }\n }\n if (xaiMeta?.finish_reason) {\n return mapCompletionStopReason(xaiMeta.finish_reason);\n }\n\n const anthropicMeta = metadata?.anthropic as { stop_reason?: string } | undefined;\n if (anthropicMeta?.stop_reason) {\n return mapAnthropicStopReason(anthropicMeta.stop_reason);\n }\n\n const googleMeta = metadata?.google as { finishReason?: string } | undefined;\n if (googleMeta?.finishReason) {\n return mapGoogleStopReason(googleMeta.finishReason);\n }\n\n const ollamaMeta = metadata?.ollama as { done_reason?: string } | undefined;\n if (ollamaMeta?.done_reason) {\n return mapOllamaStopReason(ollamaMeta.done_reason);\n }\n\n return 'end_turn';\n}\n\n/**\n * Convert TurnJSON to LLMResponse.\n */\nfunction turnJSONToLLMResponse(data: TurnJSON): LLMResponse {\n const messages = data.messages.map(deserializeMessage);\n const lastAssistant = messages\n .filter((m): m is AssistantMessage => m.type === 'assistant')\n .pop();\n\n const stopReason = deriveStopReason(lastAssistant);\n\n return {\n message: lastAssistant ?? new AssistantMessage(''),\n usage: data.usage ?? emptyUsage(),\n stopReason,\n data: data.data,\n };\n}\n\n/**\n * Creates a proxy LLM handler.\n *\n * Supports full ProviderConfig options including retry strategies, timeouts,\n * custom headers, and custom fetch implementations. This allows client-side\n * retry logic for network failures to the proxy server.\n *\n * @param options - Proxy configuration options\n * @returns An LLM handler that transports requests over HTTP\n *\n * @example\n * ```typescript\n * import { llm } from '@providerprotocol/ai';\n * import { proxy } from '@providerprotocol/ai/proxy';\n * import { ExponentialBackoff } from '@providerprotocol/ai/http';\n *\n * const claude = llm({\n * model: proxy('https://api.myplatform.com/ai'),\n * config: {\n * headers: { 'Authorization': 'Bearer user-token' },\n * retryStrategy: new ExponentialBackoff({ maxAttempts: 3 }),\n * timeout: 30000,\n * },\n * });\n * ```\n */\nexport function createLLMHandler(options: ProxyProviderOptions): LLMHandler<ProxyLLMParams> {\n const { endpoint, headers: defaultHeaders = {} } = options;\n\n let providerRef: LLMProvider<ProxyLLMParams> | null = null;\n\n return {\n _setProvider(provider: LLMProvider<ProxyLLMParams>) {\n providerRef = provider;\n },\n\n bind(modelId: string): BoundLLMModel<ProxyLLMParams> {\n const provider = providerRef;\n if (!provider) {\n throw new UPPError(\n 'Provider reference not set. Handler must be used with createProvider().',\n ErrorCode.InvalidRequest,\n 'proxy',\n ModalityType.LLM\n );\n }\n\n const model: BoundLLMModel<ProxyLLMParams> = {\n modelId,\n capabilities: PROXY_CAPABILITIES,\n\n get provider(): LLMProvider<ProxyLLMParams> {\n return provider;\n },\n\n async complete(request: LLMRequest<ProxyLLMParams>): Promise<LLMResponse> {\n const body = serializeRequest(request, modelId);\n const headers = mergeHeaders(request.config.headers, defaultHeaders);\n\n const response = await doFetch(\n endpoint,\n {\n method: 'POST',\n headers: {\n ...headers,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'proxy',\n 'llm'\n );\n\n const data = await parseJsonResponse<TurnJSON>(response, 'proxy', 'llm');\n return turnJSONToLLMResponse(data);\n },\n\n stream(request: LLMRequest<ProxyLLMParams>): LLMStreamResult {\n const body = serializeRequest(request, modelId);\n const headers = mergeHeaders(request.config.headers, defaultHeaders);\n\n let resolveResponse: (value: LLMResponse) => void;\n let rejectResponse: (error: Error) => void;\n let responseSettled = false;\n const responsePromise = new Promise<LLMResponse>((resolve, reject) => {\n resolveResponse = (value) => {\n if (!responseSettled) {\n responseSettled = true;\n resolve(value);\n }\n };\n rejectResponse = (error) => {\n if (!responseSettled) {\n responseSettled = true;\n reject(error);\n }\n };\n });\n\n const generator = async function* (): AsyncGenerator<StreamEvent> {\n try {\n const response = await doStreamFetch(\n endpoint,\n {\n method: 'POST',\n headers: {\n ...headers,\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n },\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'proxy',\n 'llm'\n );\n\n if (!response.ok) {\n throw await normalizeHttpError(response, 'proxy', 'llm');\n }\n\n if (!response.body) {\n throw new UPPError(\n 'Response body is null',\n ErrorCode.ProviderError,\n 'proxy',\n ModalityType.LLM\n );\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() || line.startsWith(':')) continue;\n\n if (line.startsWith('data:')) {\n let data = line.slice(5);\n if (data.startsWith(' ')) {\n data = data.slice(1);\n }\n if (data === '[DONE]') continue;\n\n try {\n const parsed = JSON.parse(data);\n\n // Check if this is the final turn data\n if ('messages' in parsed && 'usage' in parsed && 'cycles' in parsed) {\n resolveResponse(turnJSONToLLMResponse(parsed as TurnJSON));\n } else {\n // It's a StreamEvent - deserialize (middleware handles parsing)\n const event = deserializeStreamEvent(parsed as StreamEvent);\n yield event;\n // Also emit ObjectDelta for structured output - gives developers explicit hook\n if (request.structure && event.type === StreamEventType.TextDelta) {\n yield objectDelta(event.delta.text ?? '', event.index);\n }\n // Handle tool-based structured output (e.g., Anthropic)\n if (request.structure && event.type === StreamEventType.ToolCallDelta && event.delta.argumentsJson) {\n yield objectDelta(event.delta.argumentsJson, event.index);\n }\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n const remaining = decoder.decode();\n if (remaining) {\n buffer += remaining;\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n for (const line of lines) {\n if (!line.trim() || line.startsWith(':')) continue;\n if (line.startsWith('data:')) {\n let data = line.slice(5);\n if (data.startsWith(' ')) {\n data = data.slice(1);\n }\n if (data === '[DONE]') continue;\n try {\n const parsed = JSON.parse(data);\n if ('messages' in parsed && 'usage' in parsed && 'cycles' in parsed) {\n resolveResponse(turnJSONToLLMResponse(parsed as TurnJSON));\n } else {\n const event = deserializeStreamEvent(parsed as StreamEvent);\n yield event;\n // Also emit ObjectDelta for structured output - gives developers explicit hook\n if (request.structure && event.type === StreamEventType.TextDelta) {\n yield objectDelta(event.delta.text ?? '', event.index);\n }\n // Handle tool-based structured output (e.g., Anthropic)\n if (request.structure && event.type === StreamEventType.ToolCallDelta && event.delta.argumentsJson) {\n yield objectDelta(event.delta.argumentsJson, event.index);\n }\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n if (!responseSettled) {\n rejectResponse(new UPPError(\n 'Stream ended without final response',\n ErrorCode.InvalidResponse,\n 'proxy',\n ModalityType.LLM\n ));\n }\n } catch (error) {\n rejectResponse(toError(error));\n throw error;\n }\n };\n\n return {\n [Symbol.asyncIterator]: generator,\n response: responsePromise,\n };\n },\n };\n\n return model;\n },\n };\n}\n","/**\n * @fileoverview Proxy embedding handler implementation.\n *\n * Transports PP embedding requests over HTTP to a backend server.\n * The proxy is a pure transport layer - PP types go in, PP types come out.\n *\n * @module providers/proxy/embedding\n */\n\nimport type {\n EmbeddingHandler,\n BoundEmbeddingModel,\n EmbeddingRequest,\n EmbeddingResponse,\n EmbeddingProvider,\n} from '../../types/provider.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { doFetch } from '../../http/fetch.ts';\nimport { parseJsonResponse } from '../../http/json.ts';\nimport type { ProxyEmbeddingParams, ProxyProviderOptions } from './types.ts';\nimport { mergeHeaders } from './headers.ts';\nimport { serializeEmbeddingInput } from './serialization.media.ts';\n\nconst DEFAULT_MAX_BATCH_SIZE = Number.MAX_SAFE_INTEGER;\nconst DEFAULT_MAX_INPUT_LENGTH = Number.MAX_SAFE_INTEGER;\nconst DEFAULT_DIMENSIONS = 0;\n\ninterface ProxyEmbeddingVector {\n vector: number[] | string;\n index?: number;\n tokens?: number;\n metadata?: Record<string, unknown>;\n dimensions?: number;\n}\n\ninterface ProxyEmbeddingResponsePayload {\n embeddings: ProxyEmbeddingVector[];\n usage?: {\n totalTokens?: number;\n };\n metadata?: Record<string, unknown>;\n}\n\nfunction normalizeEmbeddingResponse(\n data: ProxyEmbeddingResponsePayload\n): EmbeddingResponse {\n if (!data || typeof data !== 'object' || !Array.isArray(data.embeddings)) {\n throw new UPPError(\n 'Invalid embedding response',\n ErrorCode.InvalidResponse,\n 'proxy',\n ModalityType.Embedding\n );\n }\n\n const embeddings = data.embeddings.map((embedding, index) => {\n if (!embedding || typeof embedding !== 'object') {\n throw new UPPError(\n 'Invalid embedding entry',\n ErrorCode.InvalidResponse,\n 'proxy',\n ModalityType.Embedding\n );\n }\n\n const vector = embedding.vector;\n if (!Array.isArray(vector) && typeof vector !== 'string') {\n throw new UPPError(\n 'Invalid embedding vector',\n ErrorCode.InvalidResponse,\n 'proxy',\n ModalityType.Embedding\n );\n }\n\n const resolvedIndex = typeof embedding.index === 'number' ? embedding.index : index;\n const tokens = typeof embedding.tokens === 'number' ? embedding.tokens : undefined;\n\n return {\n vector,\n index: resolvedIndex,\n tokens,\n metadata: embedding.metadata,\n };\n });\n\n const totalTokens = typeof data.usage?.totalTokens === 'number'\n ? data.usage.totalTokens\n : 0;\n\n return {\n embeddings,\n usage: { totalTokens },\n metadata: data.metadata,\n };\n}\n\n/**\n * Creates a proxy embedding handler.\n *\n * Supports full ProviderConfig options including retry strategies, timeouts,\n * custom headers, and custom fetch implementations. This allows client-side\n * retry logic for network failures to the proxy server.\n *\n * @param options - Proxy configuration options\n * @returns An embedding handler that transports requests over HTTP\n */\nexport function createEmbeddingHandler(\n options: ProxyProviderOptions\n): EmbeddingHandler<ProxyEmbeddingParams> {\n const { endpoint, headers: defaultHeaders = {} } = options;\n\n let providerRef: EmbeddingProvider<ProxyEmbeddingParams> | null = null;\n\n return {\n supportedInputs: ['text', 'image'],\n\n _setProvider(provider: EmbeddingProvider<ProxyEmbeddingParams>) {\n providerRef = provider;\n },\n\n bind(modelId: string): BoundEmbeddingModel<ProxyEmbeddingParams> {\n const provider = providerRef;\n if (!provider) {\n throw new UPPError(\n 'Provider reference not set. Handler must be used with createProvider().',\n ErrorCode.InvalidRequest,\n 'proxy',\n ModalityType.Embedding\n );\n }\n\n const model: BoundEmbeddingModel<ProxyEmbeddingParams> = {\n modelId,\n maxBatchSize: DEFAULT_MAX_BATCH_SIZE,\n maxInputLength: DEFAULT_MAX_INPUT_LENGTH,\n dimensions: DEFAULT_DIMENSIONS,\n\n get provider(): EmbeddingProvider<ProxyEmbeddingParams> {\n return provider;\n },\n\n async embed(\n request: EmbeddingRequest<ProxyEmbeddingParams>\n ): Promise<EmbeddingResponse> {\n const body = {\n model: modelId,\n inputs: request.inputs.map(serializeEmbeddingInput),\n params: request.params,\n };\n\n const headers = mergeHeaders(request.config.headers, defaultHeaders);\n\n const response = await doFetch(\n endpoint,\n {\n method: 'POST',\n headers: {\n ...headers,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'proxy',\n 'embedding'\n );\n\n const data = await parseJsonResponse<ProxyEmbeddingResponsePayload>(\n response,\n 'proxy',\n 'embedding'\n );\n\n return normalizeEmbeddingResponse(data);\n },\n };\n\n return model;\n },\n };\n}\n","/**\n * @fileoverview Proxy image handler implementation.\n *\n * Transports PP image generation requests over HTTP to a backend server.\n * Supports generate, edit, and streaming operations via SSE.\n *\n * @module providers/proxy/image\n */\n\nimport type {\n BoundImageModel,\n ImageRequest,\n ImageEditRequest,\n ImageResponse,\n ImageProviderStreamResult,\n ImageStreamEvent,\n ImageCapabilities,\n} from '../../types/image.ts';\nimport type { ImageProvider, ImageHandler } from '../../types/provider.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { doFetch, doStreamFetch } from '../../http/fetch.ts';\nimport { normalizeHttpError } from '../../http/errors.ts';\nimport { parseJsonResponse } from '../../http/json.ts';\nimport { toError } from '../../utils/error.ts';\nimport type { ProxyImageParams, ProxyProviderOptions } from './types.ts';\nimport { mergeHeaders } from './headers.ts';\nimport {\n serializeImage,\n deserializeImageResponse,\n deserializeImageStreamEvent,\n type SerializedImageResponse,\n type SerializedImageStreamEvent,\n} from './serialization.media.ts';\n\nconst PROXY_IMAGE_CAPABILITIES: ImageCapabilities = {\n generate: true,\n streaming: true,\n edit: true,\n};\n\ninterface ProxyImageRequestBody {\n model: string;\n prompt: string;\n params?: ProxyImageParams;\n image?: ReturnType<typeof serializeImage>;\n mask?: ReturnType<typeof serializeImage>;\n}\n\nfunction buildImageRequestBody(\n modelId: string,\n request: ImageRequest<ProxyImageParams>\n): ProxyImageRequestBody {\n return {\n model: modelId,\n prompt: request.prompt,\n params: request.params,\n };\n}\n\nfunction buildImageEditRequestBody(\n modelId: string,\n request: ImageEditRequest<ProxyImageParams>\n): ProxyImageRequestBody {\n return {\n model: modelId,\n prompt: request.prompt,\n params: request.params,\n image: serializeImage(request.image),\n mask: request.mask ? serializeImage(request.mask) : undefined,\n };\n}\n\nfunction isImageResponsePayload(\n payload: SerializedImageStreamEvent | SerializedImageResponse\n): payload is SerializedImageResponse {\n return !!payload\n && typeof payload === 'object'\n && 'images' in payload\n && Array.isArray((payload as SerializedImageResponse).images);\n}\n\nasync function executeImageRequest(\n endpoint: string,\n body: ProxyImageRequestBody,\n request: ImageRequest<ProxyImageParams> | ImageEditRequest<ProxyImageParams>,\n defaultHeaders: Record<string, string>\n): Promise<ImageResponse> {\n const headers = mergeHeaders(request.config.headers, defaultHeaders);\n\n const response = await doFetch(\n endpoint,\n {\n method: 'POST',\n headers: {\n ...headers,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'proxy',\n 'image'\n );\n\n const data = await parseJsonResponse<SerializedImageResponse>(\n response,\n 'proxy',\n 'image'\n );\n\n return deserializeImageResponse(data);\n}\n\nfunction executeImageStream(\n endpoint: string,\n body: ProxyImageRequestBody,\n request: ImageRequest<ProxyImageParams>,\n defaultHeaders: Record<string, string>\n): ImageProviderStreamResult {\n const headers = mergeHeaders(request.config.headers, defaultHeaders);\n\n let resolveResponse: (value: ImageResponse) => void;\n let rejectResponse: (error: Error) => void;\n let responseSettled = false;\n const responsePromise = new Promise<ImageResponse>((resolve, reject) => {\n resolveResponse = (value) => {\n if (!responseSettled) {\n responseSettled = true;\n resolve(value);\n }\n };\n rejectResponse = (error) => {\n if (!responseSettled) {\n responseSettled = true;\n reject(error);\n }\n };\n });\n\n const generator = async function* generator(): AsyncGenerator<ImageStreamEvent> {\n try {\n const response = await doStreamFetch(\n endpoint,\n {\n method: 'POST',\n headers: {\n ...headers,\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n },\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'proxy',\n 'image'\n );\n\n if (!response.ok) {\n throw await normalizeHttpError(response, 'proxy', 'image');\n }\n\n if (!response.body) {\n throw new UPPError(\n 'Response body is null',\n ErrorCode.ProviderError,\n 'proxy',\n ModalityType.Image\n );\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() || line.startsWith(':')) continue;\n\n if (line.startsWith('data:')) {\n let data = line.slice(5);\n if (data.startsWith(' ')) {\n data = data.slice(1);\n }\n if (data === '[DONE]') continue;\n\n try {\n const parsed = JSON.parse(data) as SerializedImageStreamEvent | SerializedImageResponse;\n if (isImageResponsePayload(parsed)) {\n resolveResponse(deserializeImageResponse(parsed));\n } else {\n yield deserializeImageStreamEvent(parsed);\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n const remaining = decoder.decode();\n if (remaining) {\n buffer += remaining;\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n for (const line of lines) {\n if (!line.trim() || line.startsWith(':')) continue;\n if (line.startsWith('data:')) {\n let data = line.slice(5);\n if (data.startsWith(' ')) {\n data = data.slice(1);\n }\n if (data === '[DONE]') continue;\n try {\n const parsed = JSON.parse(data) as SerializedImageStreamEvent | SerializedImageResponse;\n if (isImageResponsePayload(parsed)) {\n resolveResponse(deserializeImageResponse(parsed));\n } else {\n yield deserializeImageStreamEvent(parsed);\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n if (!responseSettled) {\n rejectResponse(new UPPError(\n 'Stream ended without final response',\n ErrorCode.InvalidResponse,\n 'proxy',\n ModalityType.Image\n ));\n }\n } catch (error) {\n rejectResponse(toError(error));\n throw error;\n }\n };\n\n return {\n [Symbol.asyncIterator]: generator,\n response: responsePromise,\n };\n}\n\n/**\n * Creates a proxy image handler.\n *\n * Supports full ProviderConfig options including retry strategies, timeouts,\n * custom headers, and custom fetch implementations. This allows client-side\n * retry logic for network failures to the proxy server.\n *\n * @param options - Proxy configuration options\n * @returns An image handler that transports requests over HTTP\n */\nexport function createImageHandler(\n options: ProxyProviderOptions\n): ImageHandler<ProxyImageParams> {\n const { endpoint, headers: defaultHeaders = {} } = options;\n\n let providerRef: ImageProvider<ProxyImageParams> | null = null;\n\n return {\n _setProvider(provider: ImageProvider<ProxyImageParams>) {\n providerRef = provider;\n },\n\n bind(modelId: string): BoundImageModel<ProxyImageParams> {\n const provider = providerRef;\n if (!provider) {\n throw new UPPError(\n 'Provider reference not set. Handler must be used with createProvider().',\n ErrorCode.InvalidRequest,\n 'proxy',\n ModalityType.Image\n );\n }\n\n const model: BoundImageModel<ProxyImageParams> = {\n modelId,\n capabilities: PROXY_IMAGE_CAPABILITIES,\n\n get provider(): ImageProvider<ProxyImageParams> {\n return provider;\n },\n\n async generate(request: ImageRequest<ProxyImageParams>): Promise<ImageResponse> {\n const body = buildImageRequestBody(modelId, request);\n return executeImageRequest(endpoint, body, request, defaultHeaders);\n },\n\n async edit(request: ImageEditRequest<ProxyImageParams>): Promise<ImageResponse> {\n const body = buildImageEditRequestBody(modelId, request);\n return executeImageRequest(endpoint, body, request, defaultHeaders);\n },\n };\n\n model.stream = function stream(\n request: ImageRequest<ProxyImageParams>\n ): ImageProviderStreamResult {\n const body = buildImageRequestBody(modelId, request);\n return executeImageStream(endpoint, body, request, defaultHeaders);\n };\n\n return model;\n },\n };\n}\n","import { createProvider } from '../../core/provider.ts';\nimport type { ModelReference } from '../../types/provider.ts';\nimport { createLLMHandler } from './llm.ts';\nimport { createEmbeddingHandler } from './embedding.ts';\nimport { createImageHandler } from './image.ts';\nimport type {\n ProxyProviderOptions,\n ProxyRequestOptions,\n} from './types.ts';\n\n/**\n * Creates a proxy provider that transports PP requests over HTTP to a backend server.\n *\n * The proxy acts as a pure transport layer - PP types go in, PP types come out.\n * The modelId is passed through to the backend, which decides which actual model to use.\n *\n * @param options - Configuration for the proxy endpoint\n * @returns A provider that can be used with llm()\n *\n * @example\n * ```typescript\n * import { proxy } from './providers/proxy';\n * import { llm } from './core/llm';\n *\n * const backend = proxy({ endpoint: '/api/ai' });\n *\n * const model = llm({\n * model: backend('gpt-4o'),\n * system: 'You are a helpful assistant.',\n * });\n *\n * const turn = await model.generate('Hello!');\n * ```\n */\nexport function proxy(options: ProxyProviderOptions) {\n return createProvider<ProxyRequestOptions>({\n name: 'proxy',\n version: '1.0.0',\n handlers: {\n llm: createLLMHandler(options),\n embedding: createEmbeddingHandler(options),\n image: createImageHandler(options),\n },\n });\n}\n\n/**\n * Shorthand for creating a proxy model reference with default model ID.\n *\n * Creates a proxy provider and immediately returns a model reference using\n * 'default' as the model identifier. Useful for simple single-endpoint setups.\n *\n * @param endpoint - The URL to proxy requests to\n * @returns A model reference for use with llm()\n *\n * @example\n * ```typescript\n * import { proxyModel } from './providers/proxy';\n * import { llm } from './core/llm';\n *\n * const model = llm({ model: proxyModel('/api/ai') });\n * const turn = await model.generate('Hello!');\n * ```\n */\nexport function proxyModel(endpoint: string): ModelReference<ProxyRequestOptions> {\n return proxy({ endpoint })('default');\n}\n\n// Re-export types\nexport type {\n ProxyLLMParams,\n ProxyEmbeddingParams,\n ProxyImageParams,\n ProxyProviderOptions,\n ProxyRequestOptions,\n} from './types.ts';\n\n// Re-export serialization utilities\nexport {\n serializeMessage,\n deserializeMessage,\n serializeTurn,\n serializeStreamEvent,\n deserializeStreamEvent,\n} from './serialization.ts';\n\n// Re-export server adapters\nexport { server, express, fastify, h3 } from './server/index.ts';\nexport type { ParsedBody, ProxyHandler, RequestMeta, AdapterOptions } from './server/index.ts';\n"],"mappings":"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","names":["generator"]}
1
+ {"version":3,"sources":["../../src/providers/proxy/headers.ts","../../src/providers/proxy/llm.ts","../../src/providers/proxy/embedding.ts","../../src/providers/proxy/image.ts","../../src/providers/proxy/index.ts"],"sourcesContent":["/**\n * @fileoverview Header merging utilities for proxy provider.\n *\n * @module providers/proxy/headers\n */\n\n/**\n * Merge request headers with provider default headers.\n */\nexport function mergeHeaders(\n requestHeaders: Record<string, string | undefined> | undefined,\n defaultHeaders: Record<string, string>\n): Record<string, string> {\n const headers: Record<string, string> = { ...defaultHeaders };\n if (requestHeaders) {\n for (const [key, value] of Object.entries(requestHeaders)) {\n if (value !== undefined) {\n headers[key] = value;\n }\n }\n }\n return headers;\n}\n","/**\n * @fileoverview Proxy LLM handler implementation.\n *\n * Transports PP LLM requests over HTTP to a backend server.\n * Supports both synchronous completion and streaming via SSE.\n * Full support for retry strategies, timeouts, and custom headers.\n *\n * @module providers/proxy/llm\n */\n\nimport type {\n BoundLLMModel,\n LLMRequest,\n LLMResponse,\n LLMStreamResult,\n LLMCapabilities,\n} from '../../types/llm.ts';\nimport type { LLMHandler } from '../../types/provider.ts';\nimport type { LLMProvider } from '../../types/provider.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport { StreamEventType, objectDelta } from '../../types/stream.ts';\nimport type { TurnJSON } from '../../types/turn.ts';\nimport { AssistantMessage } from '../../types/messages.ts';\nimport { emptyUsage } from '../../types/turn.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { doFetch, doStreamFetch } from '../../http/fetch.ts';\nimport { normalizeHttpError } from '../../http/errors.ts';\nimport { parseJsonResponse } from '../../http/json.ts';\nimport { toError } from '../../utils/error.ts';\nimport type { ProxyLLMParams, ProxyProviderOptions } from './types.ts';\nimport { mergeHeaders } from './headers.ts';\nimport {\n serializeMessage,\n deserializeMessage,\n deserializeStreamEvent,\n} from './serialization.ts';\n\n/**\n * Capability flags for proxy provider.\n * All capabilities are enabled since the backend determines actual support.\n */\nconst PROXY_CAPABILITIES: LLMCapabilities = {\n streaming: true,\n tools: true,\n structuredOutput: true,\n imageInput: true,\n documentInput: true,\n videoInput: true,\n audioInput: true,\n};\n\n/**\n * Serialize an LLMRequest for HTTP transport.\n */\nfunction serializeRequest(\n request: LLMRequest<ProxyLLMParams>,\n modelId: string\n): Record<string, unknown> {\n return {\n model: modelId,\n messages: request.messages.map(serializeMessage),\n system: request.system,\n params: request.params,\n tools: request.tools?.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n metadata: t.metadata,\n })),\n structure: request.structure,\n };\n}\n\nfunction mapCompletionStopReason(reason: string): string {\n switch (reason) {\n case 'stop':\n return 'end_turn';\n case 'length':\n return 'max_tokens';\n case 'tool_calls':\n return 'tool_use';\n case 'content_filter':\n return 'content_filter';\n default:\n return 'end_turn';\n }\n}\n\nfunction mapAnthropicStopReason(reason: string): string {\n switch (reason) {\n case 'tool_use':\n return 'tool_use';\n case 'max_tokens':\n return 'max_tokens';\n case 'end_turn':\n return 'end_turn';\n case 'stop_sequence':\n return 'end_turn';\n default:\n return 'end_turn';\n }\n}\n\nfunction mapGoogleStopReason(reason: string): string {\n switch (reason) {\n case 'STOP':\n return 'end_turn';\n case 'MAX_TOKENS':\n return 'max_tokens';\n case 'SAFETY':\n return 'content_filter';\n case 'RECITATION':\n return 'content_filter';\n case 'OTHER':\n return 'end_turn';\n default:\n return 'end_turn';\n }\n}\n\nfunction mapOllamaStopReason(reason: string): string {\n if (reason === 'length') {\n return 'max_tokens';\n }\n if (reason === 'stop') {\n return 'end_turn';\n }\n return 'end_turn';\n}\n\nfunction deriveStopReason(message: AssistantMessage | undefined): string {\n if (!message) {\n return 'end_turn';\n }\n\n if (message.toolCalls && message.toolCalls.length > 0) {\n return 'tool_use';\n }\n\n const metadata = message.metadata;\n const openaiMeta = metadata?.openai as { finish_reason?: string; status?: string } | undefined;\n if (openaiMeta?.status) {\n if (openaiMeta.status === 'failed') {\n return 'error';\n }\n if (openaiMeta.status === 'completed') {\n return 'end_turn';\n }\n }\n if (openaiMeta?.finish_reason) {\n return mapCompletionStopReason(openaiMeta.finish_reason);\n }\n\n const openrouterMeta = metadata?.openrouter as { finish_reason?: string } | undefined;\n if (openrouterMeta?.finish_reason) {\n return mapCompletionStopReason(openrouterMeta.finish_reason);\n }\n\n const xaiMeta = metadata?.xai as { finish_reason?: string; status?: string } | undefined;\n if (xaiMeta?.status) {\n if (xaiMeta.status === 'failed') {\n return 'error';\n }\n if (xaiMeta.status === 'completed') {\n return 'end_turn';\n }\n }\n if (xaiMeta?.finish_reason) {\n return mapCompletionStopReason(xaiMeta.finish_reason);\n }\n\n const anthropicMeta = metadata?.anthropic as { stop_reason?: string } | undefined;\n if (anthropicMeta?.stop_reason) {\n return mapAnthropicStopReason(anthropicMeta.stop_reason);\n }\n\n const googleMeta = metadata?.google as { finishReason?: string } | undefined;\n if (googleMeta?.finishReason) {\n return mapGoogleStopReason(googleMeta.finishReason);\n }\n\n const ollamaMeta = metadata?.ollama as { done_reason?: string } | undefined;\n if (ollamaMeta?.done_reason) {\n return mapOllamaStopReason(ollamaMeta.done_reason);\n }\n\n return 'end_turn';\n}\n\n/**\n * Convert TurnJSON to LLMResponse.\n */\nfunction turnJSONToLLMResponse(data: TurnJSON): LLMResponse {\n const messages = data.messages.map(deserializeMessage);\n const lastAssistant = messages\n .filter((m): m is AssistantMessage => m.type === 'assistant')\n .pop();\n\n const stopReason = deriveStopReason(lastAssistant);\n\n return {\n message: lastAssistant ?? new AssistantMessage(''),\n usage: data.usage ?? emptyUsage(),\n stopReason,\n data: data.data,\n };\n}\n\n/**\n * Creates a proxy LLM handler.\n *\n * Supports full ProviderConfig options including retry strategies, timeouts,\n * custom headers, and custom fetch implementations. This allows client-side\n * retry logic for network failures to the proxy server.\n *\n * @param options - Proxy configuration options\n * @returns An LLM handler that transports requests over HTTP\n *\n * @example\n * ```typescript\n * import { llm } from '@providerprotocol/ai';\n * import { proxy } from '@providerprotocol/ai/proxy';\n * import { ExponentialBackoff } from '@providerprotocol/ai/http';\n *\n * const claude = llm({\n * model: proxy('https://api.myplatform.com/ai'),\n * config: {\n * headers: { 'Authorization': 'Bearer user-token' },\n * retryStrategy: new ExponentialBackoff({ maxAttempts: 3 }),\n * timeout: 30000,\n * },\n * });\n * ```\n */\nexport function createLLMHandler(options: ProxyProviderOptions): LLMHandler<ProxyLLMParams> {\n const { endpoint, headers: defaultHeaders = {} } = options;\n\n let providerRef: LLMProvider<ProxyLLMParams> | null = null;\n\n return {\n _setProvider(provider: LLMProvider<ProxyLLMParams>) {\n providerRef = provider;\n },\n\n bind(modelId: string): BoundLLMModel<ProxyLLMParams> {\n const provider = providerRef;\n if (!provider) {\n throw new UPPError(\n 'Provider reference not set. Handler must be used with createProvider().',\n ErrorCode.InvalidRequest,\n 'proxy',\n ModalityType.LLM\n );\n }\n\n const model: BoundLLMModel<ProxyLLMParams> = {\n modelId,\n capabilities: PROXY_CAPABILITIES,\n\n get provider(): LLMProvider<ProxyLLMParams> {\n return provider;\n },\n\n async complete(request: LLMRequest<ProxyLLMParams>): Promise<LLMResponse> {\n const body = serializeRequest(request, modelId);\n const headers = mergeHeaders(request.config.headers, defaultHeaders);\n\n const response = await doFetch(\n endpoint,\n {\n method: 'POST',\n headers: {\n ...headers,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'proxy',\n 'llm'\n );\n\n const data = await parseJsonResponse<TurnJSON>(response, 'proxy', 'llm');\n return turnJSONToLLMResponse(data);\n },\n\n stream(request: LLMRequest<ProxyLLMParams>): LLMStreamResult {\n const body = serializeRequest(request, modelId);\n const headers = mergeHeaders(request.config.headers, defaultHeaders);\n\n let resolveResponse: (value: LLMResponse) => void;\n let rejectResponse: (error: Error) => void;\n let responseSettled = false;\n const responsePromise = new Promise<LLMResponse>((resolve, reject) => {\n resolveResponse = (value) => {\n if (!responseSettled) {\n responseSettled = true;\n resolve(value);\n }\n };\n rejectResponse = (error) => {\n if (!responseSettled) {\n responseSettled = true;\n reject(error);\n }\n };\n });\n\n const generator = async function* (): AsyncGenerator<StreamEvent> {\n try {\n const response = await doStreamFetch(\n endpoint,\n {\n method: 'POST',\n headers: {\n ...headers,\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n },\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'proxy',\n 'llm'\n );\n\n if (!response.ok) {\n throw await normalizeHttpError(response, 'proxy', 'llm');\n }\n\n if (!response.body) {\n throw new UPPError(\n 'Response body is null',\n ErrorCode.ProviderError,\n 'proxy',\n ModalityType.LLM\n );\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() || line.startsWith(':')) continue;\n\n if (line.startsWith('data:')) {\n let data = line.slice(5);\n if (data.startsWith(' ')) {\n data = data.slice(1);\n }\n if (data === '[DONE]') continue;\n\n try {\n const parsed = JSON.parse(data);\n\n // Check if this is the final turn data\n if ('messages' in parsed && 'usage' in parsed && 'cycles' in parsed) {\n resolveResponse(turnJSONToLLMResponse(parsed as TurnJSON));\n } else {\n // It's a StreamEvent - deserialize (middleware handles parsing)\n const event = deserializeStreamEvent(parsed as StreamEvent);\n yield event;\n // Also emit ObjectDelta for structured output - gives developers explicit hook\n if (request.structure && event.type === StreamEventType.TextDelta) {\n yield objectDelta(event.delta.text ?? '', event.index);\n }\n // Handle tool-based structured output (e.g., Anthropic)\n if (request.structure && event.type === StreamEventType.ToolCallDelta && event.delta.argumentsJson) {\n yield objectDelta(event.delta.argumentsJson, event.index);\n }\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n const remaining = decoder.decode();\n if (remaining) {\n buffer += remaining;\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n for (const line of lines) {\n if (!line.trim() || line.startsWith(':')) continue;\n if (line.startsWith('data:')) {\n let data = line.slice(5);\n if (data.startsWith(' ')) {\n data = data.slice(1);\n }\n if (data === '[DONE]') continue;\n try {\n const parsed = JSON.parse(data);\n if ('messages' in parsed && 'usage' in parsed && 'cycles' in parsed) {\n resolveResponse(turnJSONToLLMResponse(parsed as TurnJSON));\n } else {\n const event = deserializeStreamEvent(parsed as StreamEvent);\n yield event;\n // Also emit ObjectDelta for structured output - gives developers explicit hook\n if (request.structure && event.type === StreamEventType.TextDelta) {\n yield objectDelta(event.delta.text ?? '', event.index);\n }\n // Handle tool-based structured output (e.g., Anthropic)\n if (request.structure && event.type === StreamEventType.ToolCallDelta && event.delta.argumentsJson) {\n yield objectDelta(event.delta.argumentsJson, event.index);\n }\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n if (!responseSettled) {\n rejectResponse(new UPPError(\n 'Stream ended without final response',\n ErrorCode.InvalidResponse,\n 'proxy',\n ModalityType.LLM\n ));\n }\n } catch (error) {\n rejectResponse(toError(error));\n throw error;\n }\n };\n\n return {\n [Symbol.asyncIterator]: generator,\n response: responsePromise,\n };\n },\n };\n\n return model;\n },\n };\n}\n","/**\n * @fileoverview Proxy embedding handler implementation.\n *\n * Transports PP embedding requests over HTTP to a backend server.\n * The proxy is a pure transport layer - PP types go in, PP types come out.\n *\n * @module providers/proxy/embedding\n */\n\nimport type {\n EmbeddingHandler,\n BoundEmbeddingModel,\n EmbeddingRequest,\n EmbeddingResponse,\n EmbeddingProvider,\n} from '../../types/provider.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { doFetch } from '../../http/fetch.ts';\nimport { parseJsonResponse } from '../../http/json.ts';\nimport type { ProxyEmbeddingParams, ProxyProviderOptions } from './types.ts';\nimport { mergeHeaders } from './headers.ts';\nimport { serializeEmbeddingInput } from './serialization.media.ts';\n\nconst DEFAULT_MAX_BATCH_SIZE = Number.MAX_SAFE_INTEGER;\nconst DEFAULT_MAX_INPUT_LENGTH = Number.MAX_SAFE_INTEGER;\nconst DEFAULT_DIMENSIONS = 0;\n\ninterface ProxyEmbeddingVector {\n vector: number[] | string;\n index?: number;\n tokens?: number;\n metadata?: Record<string, unknown>;\n dimensions?: number;\n}\n\ninterface ProxyEmbeddingResponsePayload {\n embeddings: ProxyEmbeddingVector[];\n usage?: {\n totalTokens?: number;\n };\n metadata?: Record<string, unknown>;\n}\n\nfunction normalizeEmbeddingResponse(\n data: ProxyEmbeddingResponsePayload\n): EmbeddingResponse {\n if (!data || typeof data !== 'object' || !Array.isArray(data.embeddings)) {\n throw new UPPError(\n 'Invalid embedding response',\n ErrorCode.InvalidResponse,\n 'proxy',\n ModalityType.Embedding\n );\n }\n\n const embeddings = data.embeddings.map((embedding, index) => {\n if (!embedding || typeof embedding !== 'object') {\n throw new UPPError(\n 'Invalid embedding entry',\n ErrorCode.InvalidResponse,\n 'proxy',\n ModalityType.Embedding\n );\n }\n\n const vector = embedding.vector;\n if (!Array.isArray(vector) && typeof vector !== 'string') {\n throw new UPPError(\n 'Invalid embedding vector',\n ErrorCode.InvalidResponse,\n 'proxy',\n ModalityType.Embedding\n );\n }\n\n const resolvedIndex = typeof embedding.index === 'number' ? embedding.index : index;\n const tokens = typeof embedding.tokens === 'number' ? embedding.tokens : undefined;\n\n return {\n vector,\n index: resolvedIndex,\n tokens,\n metadata: embedding.metadata,\n };\n });\n\n const totalTokens = typeof data.usage?.totalTokens === 'number'\n ? data.usage.totalTokens\n : 0;\n\n return {\n embeddings,\n usage: { totalTokens },\n metadata: data.metadata,\n };\n}\n\n/**\n * Creates a proxy embedding handler.\n *\n * Supports full ProviderConfig options including retry strategies, timeouts,\n * custom headers, and custom fetch implementations. This allows client-side\n * retry logic for network failures to the proxy server.\n *\n * @param options - Proxy configuration options\n * @returns An embedding handler that transports requests over HTTP\n */\nexport function createEmbeddingHandler(\n options: ProxyProviderOptions\n): EmbeddingHandler<ProxyEmbeddingParams> {\n const { endpoint, headers: defaultHeaders = {} } = options;\n\n let providerRef: EmbeddingProvider<ProxyEmbeddingParams> | null = null;\n\n return {\n supportedInputs: ['text', 'image'],\n\n _setProvider(provider: EmbeddingProvider<ProxyEmbeddingParams>) {\n providerRef = provider;\n },\n\n bind(modelId: string): BoundEmbeddingModel<ProxyEmbeddingParams> {\n const provider = providerRef;\n if (!provider) {\n throw new UPPError(\n 'Provider reference not set. Handler must be used with createProvider().',\n ErrorCode.InvalidRequest,\n 'proxy',\n ModalityType.Embedding\n );\n }\n\n const model: BoundEmbeddingModel<ProxyEmbeddingParams> = {\n modelId,\n maxBatchSize: DEFAULT_MAX_BATCH_SIZE,\n maxInputLength: DEFAULT_MAX_INPUT_LENGTH,\n dimensions: DEFAULT_DIMENSIONS,\n\n get provider(): EmbeddingProvider<ProxyEmbeddingParams> {\n return provider;\n },\n\n async embed(\n request: EmbeddingRequest<ProxyEmbeddingParams>\n ): Promise<EmbeddingResponse> {\n const body = {\n model: modelId,\n inputs: request.inputs.map(serializeEmbeddingInput),\n params: request.params,\n };\n\n const headers = mergeHeaders(request.config.headers, defaultHeaders);\n\n const response = await doFetch(\n endpoint,\n {\n method: 'POST',\n headers: {\n ...headers,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'proxy',\n 'embedding'\n );\n\n const data = await parseJsonResponse<ProxyEmbeddingResponsePayload>(\n response,\n 'proxy',\n 'embedding'\n );\n\n return normalizeEmbeddingResponse(data);\n },\n };\n\n return model;\n },\n };\n}\n","/**\n * @fileoverview Proxy image handler implementation.\n *\n * Transports PP image generation requests over HTTP to a backend server.\n * Supports generate, edit, and streaming operations via SSE.\n *\n * @module providers/proxy/image\n */\n\nimport type {\n BoundImageModel,\n ImageRequest,\n ImageEditRequest,\n ImageResponse,\n ImageProviderStreamResult,\n ImageStreamEvent,\n ImageCapabilities,\n} from '../../types/image.ts';\nimport type { ImageProvider, ImageHandler } from '../../types/provider.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport { doFetch, doStreamFetch } from '../../http/fetch.ts';\nimport { normalizeHttpError } from '../../http/errors.ts';\nimport { parseJsonResponse } from '../../http/json.ts';\nimport { toError } from '../../utils/error.ts';\nimport type { ProxyImageParams, ProxyProviderOptions } from './types.ts';\nimport { mergeHeaders } from './headers.ts';\nimport {\n serializeImage,\n deserializeImageResponse,\n deserializeImageStreamEvent,\n type SerializedImageResponse,\n type SerializedImageStreamEvent,\n} from './serialization.media.ts';\n\nconst PROXY_IMAGE_CAPABILITIES: ImageCapabilities = {\n generate: true,\n streaming: true,\n edit: true,\n};\n\ninterface ProxyImageRequestBody {\n model: string;\n prompt: string;\n params?: ProxyImageParams;\n image?: ReturnType<typeof serializeImage>;\n mask?: ReturnType<typeof serializeImage>;\n}\n\nfunction buildImageRequestBody(\n modelId: string,\n request: ImageRequest<ProxyImageParams>\n): ProxyImageRequestBody {\n return {\n model: modelId,\n prompt: request.prompt,\n params: request.params,\n };\n}\n\nfunction buildImageEditRequestBody(\n modelId: string,\n request: ImageEditRequest<ProxyImageParams>\n): ProxyImageRequestBody {\n return {\n model: modelId,\n prompt: request.prompt,\n params: request.params,\n image: serializeImage(request.image),\n mask: request.mask ? serializeImage(request.mask) : undefined,\n };\n}\n\nfunction isImageResponsePayload(\n payload: SerializedImageStreamEvent | SerializedImageResponse\n): payload is SerializedImageResponse {\n return !!payload\n && typeof payload === 'object'\n && 'images' in payload\n && Array.isArray((payload as SerializedImageResponse).images);\n}\n\nasync function executeImageRequest(\n endpoint: string,\n body: ProxyImageRequestBody,\n request: ImageRequest<ProxyImageParams> | ImageEditRequest<ProxyImageParams>,\n defaultHeaders: Record<string, string>\n): Promise<ImageResponse> {\n const headers = mergeHeaders(request.config.headers, defaultHeaders);\n\n const response = await doFetch(\n endpoint,\n {\n method: 'POST',\n headers: {\n ...headers,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'proxy',\n 'image'\n );\n\n const data = await parseJsonResponse<SerializedImageResponse>(\n response,\n 'proxy',\n 'image'\n );\n\n return deserializeImageResponse(data);\n}\n\nfunction executeImageStream(\n endpoint: string,\n body: ProxyImageRequestBody,\n request: ImageRequest<ProxyImageParams>,\n defaultHeaders: Record<string, string>\n): ImageProviderStreamResult {\n const headers = mergeHeaders(request.config.headers, defaultHeaders);\n\n let resolveResponse: (value: ImageResponse) => void;\n let rejectResponse: (error: Error) => void;\n let responseSettled = false;\n const responsePromise = new Promise<ImageResponse>((resolve, reject) => {\n resolveResponse = (value) => {\n if (!responseSettled) {\n responseSettled = true;\n resolve(value);\n }\n };\n rejectResponse = (error) => {\n if (!responseSettled) {\n responseSettled = true;\n reject(error);\n }\n };\n });\n\n const generator = async function* generator(): AsyncGenerator<ImageStreamEvent> {\n try {\n const response = await doStreamFetch(\n endpoint,\n {\n method: 'POST',\n headers: {\n ...headers,\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n },\n body: JSON.stringify(body),\n signal: request.signal,\n },\n request.config,\n 'proxy',\n 'image'\n );\n\n if (!response.ok) {\n throw await normalizeHttpError(response, 'proxy', 'image');\n }\n\n if (!response.body) {\n throw new UPPError(\n 'Response body is null',\n ErrorCode.ProviderError,\n 'proxy',\n ModalityType.Image\n );\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() || line.startsWith(':')) continue;\n\n if (line.startsWith('data:')) {\n let data = line.slice(5);\n if (data.startsWith(' ')) {\n data = data.slice(1);\n }\n if (data === '[DONE]') continue;\n\n try {\n const parsed = JSON.parse(data) as SerializedImageStreamEvent | SerializedImageResponse;\n if (isImageResponsePayload(parsed)) {\n resolveResponse(deserializeImageResponse(parsed));\n } else {\n yield deserializeImageStreamEvent(parsed);\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n const remaining = decoder.decode();\n if (remaining) {\n buffer += remaining;\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n for (const line of lines) {\n if (!line.trim() || line.startsWith(':')) continue;\n if (line.startsWith('data:')) {\n let data = line.slice(5);\n if (data.startsWith(' ')) {\n data = data.slice(1);\n }\n if (data === '[DONE]') continue;\n try {\n const parsed = JSON.parse(data) as SerializedImageStreamEvent | SerializedImageResponse;\n if (isImageResponsePayload(parsed)) {\n resolveResponse(deserializeImageResponse(parsed));\n } else {\n yield deserializeImageStreamEvent(parsed);\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n if (!responseSettled) {\n rejectResponse(new UPPError(\n 'Stream ended without final response',\n ErrorCode.InvalidResponse,\n 'proxy',\n ModalityType.Image\n ));\n }\n } catch (error) {\n rejectResponse(toError(error));\n throw error;\n }\n };\n\n return {\n [Symbol.asyncIterator]: generator,\n response: responsePromise,\n };\n}\n\n/**\n * Creates a proxy image handler.\n *\n * Supports full ProviderConfig options including retry strategies, timeouts,\n * custom headers, and custom fetch implementations. This allows client-side\n * retry logic for network failures to the proxy server.\n *\n * @param options - Proxy configuration options\n * @returns An image handler that transports requests over HTTP\n */\nexport function createImageHandler(\n options: ProxyProviderOptions\n): ImageHandler<ProxyImageParams> {\n const { endpoint, headers: defaultHeaders = {} } = options;\n\n let providerRef: ImageProvider<ProxyImageParams> | null = null;\n\n return {\n _setProvider(provider: ImageProvider<ProxyImageParams>) {\n providerRef = provider;\n },\n\n bind(modelId: string): BoundImageModel<ProxyImageParams> {\n const provider = providerRef;\n if (!provider) {\n throw new UPPError(\n 'Provider reference not set. Handler must be used with createProvider().',\n ErrorCode.InvalidRequest,\n 'proxy',\n ModalityType.Image\n );\n }\n\n const model: BoundImageModel<ProxyImageParams> = {\n modelId,\n capabilities: PROXY_IMAGE_CAPABILITIES,\n\n get provider(): ImageProvider<ProxyImageParams> {\n return provider;\n },\n\n async generate(request: ImageRequest<ProxyImageParams>): Promise<ImageResponse> {\n const body = buildImageRequestBody(modelId, request);\n return executeImageRequest(endpoint, body, request, defaultHeaders);\n },\n\n async edit(request: ImageEditRequest<ProxyImageParams>): Promise<ImageResponse> {\n const body = buildImageEditRequestBody(modelId, request);\n return executeImageRequest(endpoint, body, request, defaultHeaders);\n },\n };\n\n model.stream = function stream(\n request: ImageRequest<ProxyImageParams>\n ): ImageProviderStreamResult {\n const body = buildImageRequestBody(modelId, request);\n return executeImageStream(endpoint, body, request, defaultHeaders);\n };\n\n return model;\n },\n };\n}\n","import { createProvider } from '../../core/provider.ts';\nimport type { ModelReference } from '../../types/provider.ts';\nimport { createLLMHandler } from './llm.ts';\nimport { createEmbeddingHandler } from './embedding.ts';\nimport { createImageHandler } from './image.ts';\nimport type {\n ProxyProviderOptions,\n ProxyRequestOptions,\n} from './types.ts';\n\n/**\n * Creates a proxy provider that transports PP requests over HTTP to a backend server.\n *\n * The proxy acts as a pure transport layer - PP types go in, PP types come out.\n * The modelId is passed through to the backend, which decides which actual model to use.\n *\n * @param options - Configuration for the proxy endpoint\n * @returns A provider that can be used with llm()\n *\n * @example\n * ```typescript\n * import { proxy } from './providers/proxy';\n * import { llm } from './core/llm';\n *\n * const backend = proxy({ endpoint: '/api/ai' });\n *\n * const model = llm({\n * model: backend('gpt-4o'),\n * system: 'You are a helpful assistant.',\n * });\n *\n * const turn = await model.generate('Hello!');\n * ```\n */\nexport function proxy(options: ProxyProviderOptions) {\n return createProvider<ProxyRequestOptions>({\n name: 'proxy',\n version: '1.0.0',\n handlers: {\n llm: createLLMHandler(options),\n embedding: createEmbeddingHandler(options),\n image: createImageHandler(options),\n },\n });\n}\n\n/**\n * Shorthand for creating a proxy model reference with default model ID.\n *\n * Creates a proxy provider and immediately returns a model reference using\n * 'default' as the model identifier. Useful for simple single-endpoint setups.\n *\n * @param endpoint - The URL to proxy requests to\n * @returns A model reference for use with llm()\n *\n * @example\n * ```typescript\n * import { proxyModel } from './providers/proxy';\n * import { llm } from './core/llm';\n *\n * const model = llm({ model: proxyModel('/api/ai') });\n * const turn = await model.generate('Hello!');\n * ```\n */\nexport function proxyModel(endpoint: string): ModelReference<ProxyRequestOptions> {\n return proxy({ endpoint })('default');\n}\n\n// Re-export types\nexport type {\n ProxyLLMParams,\n ProxyEmbeddingParams,\n ProxyImageParams,\n ProxyProviderOptions,\n ProxyRequestOptions,\n} from './types.ts';\n\n// Re-export serialization utilities\nexport {\n serializeMessage,\n deserializeMessage,\n serializeTurn,\n serializeStreamEvent,\n deserializeStreamEvent,\n} from './serialization.ts';\n\n// Re-export server adapters\nexport { server, express, fastify, h3 } from './server/index.ts';\nexport type { ParsedBody, ProxyHandler, RequestMeta, AdapterOptions } from './server/index.ts';\n"],"mappings":"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","names":["generator"]}
@@ -1,7 +1,8 @@
1
- import { T as Turn, i as StreamResult } from '../../../stream-sXhBtWjl.js';
2
- import { d as EmbeddingResult } from '../../../embedding-CwZ1ZNWv.js';
3
- import { N as ImageResult } from '../../../llm-DS_-l71X.js';
4
- import { I as ImageStreamLike } from '../../../image-stream-CeQHtjxS.js';
1
+ import { T as Turn, g as StreamResult } from '../../../stream-DVVUIKpz.js';
2
+ import { d as EmbeddingResult } from '../../../embedding-iNQCeXfk.js';
3
+ import { N as ImageResult } from '../../../llm-CZqlijjK.js';
4
+ import { I as ImageStreamLike } from '../../../image-stream-ARno6XlS.js';
5
+ import '../../../tool-D22EhP5F.js';
5
6
 
6
7
  /**
7
8
  * @fileoverview Express/Connect adapter for proxy server.
@@ -6,8 +6,9 @@ import {
6
6
  sendJSON,
7
7
  streamImageSSE,
8
8
  streamSSE
9
- } from "../../../chunk-FYSZFIZS.js";
10
- import "../../../chunk-YQLR3XOA.js";
9
+ } from "../../../chunk-O32SBS6S.js";
10
+ import "../../../chunk-BIBMNP7Y.js";
11
+ import "../../../chunk-7ULSRWDH.js";
11
12
  import "../../../chunk-ETBFOLQN.js";
12
13
  import "../../../chunk-N5DX5JW3.js";
13
14
  import "../../../chunk-WU4U6IHF.js";
@@ -1,7 +1,8 @@
1
- import { T as Turn, i as StreamResult } from '../../../stream-sXhBtWjl.js';
2
- import { d as EmbeddingResult } from '../../../embedding-CwZ1ZNWv.js';
3
- import { N as ImageResult } from '../../../llm-DS_-l71X.js';
4
- import { I as ImageStreamLike } from '../../../image-stream-CeQHtjxS.js';
1
+ import { T as Turn, g as StreamResult } from '../../../stream-DVVUIKpz.js';
2
+ import { d as EmbeddingResult } from '../../../embedding-iNQCeXfk.js';
3
+ import { N as ImageResult } from '../../../llm-CZqlijjK.js';
4
+ import { I as ImageStreamLike } from '../../../image-stream-ARno6XlS.js';
5
+ import '../../../tool-D22EhP5F.js';
5
6
 
6
7
  /**
7
8
  * @fileoverview Fastify adapter for proxy server.
@@ -6,8 +6,9 @@ import {
6
6
  sendJSON,
7
7
  streamImageSSE,
8
8
  streamSSE
9
- } from "../../../chunk-7GTWHZY2.js";
10
- import "../../../chunk-YQLR3XOA.js";
9
+ } from "../../../chunk-IDZR4ROP.js";
10
+ import "../../../chunk-BIBMNP7Y.js";
11
+ import "../../../chunk-7ULSRWDH.js";
11
12
  import "../../../chunk-ETBFOLQN.js";
12
13
  import "../../../chunk-N5DX5JW3.js";
13
14
  import "../../../chunk-WU4U6IHF.js";