@providerprotocol/ai 0.0.38 → 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.
- package/README.md +94 -3
- package/dist/anthropic/index.d.ts +3 -2
- package/dist/cerebras/index.d.ts +3 -2
- package/dist/chunk-3Q5VELKG.js +124 -0
- package/dist/chunk-3Q5VELKG.js.map +1 -0
- package/dist/{chunk-LTEMH3CI.js → chunk-5XPRVUOK.js} +6 -4
- package/dist/{chunk-LTEMH3CI.js.map → chunk-5XPRVUOK.js.map} +1 -1
- package/dist/chunk-7ULSRWDH.js +83 -0
- package/dist/chunk-7ULSRWDH.js.map +1 -0
- package/dist/{chunk-YQLR3XOA.js → chunk-BIBMNP7Y.js} +1 -75
- package/dist/chunk-BIBMNP7Y.js.map +1 -0
- package/dist/{chunk-7GTWHZY2.js → chunk-IDZR4ROP.js} +5 -3
- package/dist/{chunk-7GTWHZY2.js.map → chunk-IDZR4ROP.js.map} +1 -1
- package/dist/{chunk-4RX4VQCB.js → chunk-IIMTP3XC.js} +2 -2
- package/dist/{chunk-ZRVNAET3.js → chunk-KNBODIQU.js} +6 -3
- package/dist/chunk-KNBODIQU.js.map +1 -0
- package/dist/{chunk-FYSZFIZS.js → chunk-O32SBS6S.js} +5 -3
- package/dist/{chunk-FYSZFIZS.js.map → chunk-O32SBS6S.js.map} +1 -1
- package/dist/{chunk-BDXH6NQS.js → chunk-RDC5GYST.js} +5 -5
- package/dist/{chunk-5IWHCXKN.js → chunk-SAMIK4WZ.js} +2 -2
- package/dist/{chunk-EPB3GQNL.js → chunk-U6M3MXNI.js} +11 -2
- package/dist/chunk-U6M3MXNI.js.map +1 -0
- package/dist/{chunk-2YXFLRQ6.js → chunk-WNB5PSY6.js} +2 -2
- package/dist/{chunk-CRP6Y7NF.js → chunk-ZDYEDI2A.js} +2 -2
- package/dist/{embedding-CwZ1ZNWv.d.ts → embedding-iNQCeXfk.d.ts} +1 -1
- package/dist/google/index.d.ts +3 -2
- package/dist/groq/index.d.ts +3 -2
- package/dist/http/index.d.ts +4 -3
- package/dist/{image-stream-CeQHtjxS.d.ts → image-stream-ARno6XlS.d.ts} +1 -1
- package/dist/index.d.ts +8 -7
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/dist/{llm-DS_-l71X.d.ts → llm-CZqlijjK.d.ts} +16 -9
- package/dist/middleware/logging/index.d.ts +3 -2
- package/dist/middleware/parsed-object/index.d.ts +3 -2
- package/dist/middleware/persistence/index.d.ts +3 -2
- package/dist/middleware/pubsub/index.d.ts +5 -4
- package/dist/middleware/pubsub/index.js +49 -3
- package/dist/middleware/pubsub/index.js.map +1 -1
- package/dist/middleware/pubsub/server/express/index.d.ts +3 -2
- package/dist/middleware/pubsub/server/express/index.js +2 -2
- package/dist/middleware/pubsub/server/fastify/index.d.ts +3 -2
- package/dist/middleware/pubsub/server/fastify/index.js +2 -2
- package/dist/middleware/pubsub/server/h3/index.d.ts +3 -2
- package/dist/middleware/pubsub/server/h3/index.js +2 -2
- package/dist/middleware/pubsub/server/index.d.ts +3 -2
- package/dist/middleware/pubsub/server/index.js +5 -5
- package/dist/middleware/pubsub/server/webapi/index.d.ts +3 -2
- package/dist/middleware/pubsub/server/webapi/index.js +2 -2
- package/dist/moonshot/index.d.ts +3 -2
- package/dist/ollama/index.d.ts +3 -2
- package/dist/openai/index.d.ts +3 -2
- package/dist/openrouter/index.d.ts +3 -2
- package/dist/proxy/index.d.ts +5 -4
- package/dist/proxy/index.js +10 -8
- package/dist/proxy/index.js.map +1 -1
- package/dist/proxy/server/express/index.d.ts +5 -4
- package/dist/proxy/server/express/index.js +3 -2
- package/dist/proxy/server/fastify/index.d.ts +5 -4
- package/dist/proxy/server/fastify/index.js +3 -2
- package/dist/proxy/server/h3/index.d.ts +19 -17
- package/dist/proxy/server/h3/index.js +3 -2
- package/dist/proxy/server/index.d.ts +5 -4
- package/dist/proxy/server/index.js +7 -6
- package/dist/proxy/server/webapi/index.d.ts +5 -4
- package/dist/proxy/server/webapi/index.js +3 -2
- package/dist/responses/index.d.ts +3 -2
- package/dist/{retry-CgoBNa51.d.ts → retry-C1eJbEMV.d.ts} +1 -1
- package/dist/{stream-sXhBtWjl.d.ts → stream-DVVUIKpz.d.ts} +3 -416
- package/dist/tool-D22EhP5F.d.ts +507 -0
- package/dist/{types-Cr4F0tVy.d.ts → types-CyXF0J7C.d.ts} +16 -3
- package/dist/utils/index.d.ts +65 -1
- package/dist/utils/index.js +15 -1
- package/dist/xai/index.d.ts +3 -2
- package/package.json +15 -3
- package/dist/chunk-EPB3GQNL.js.map +0 -1
- package/dist/chunk-YQLR3XOA.js.map +0 -1
- package/dist/chunk-ZRVNAET3.js.map +0 -1
- /package/dist/{chunk-4RX4VQCB.js.map → chunk-IIMTP3XC.js.map} +0 -0
- /package/dist/{chunk-BDXH6NQS.js.map → chunk-RDC5GYST.js.map} +0 -0
- /package/dist/{chunk-5IWHCXKN.js.map → chunk-SAMIK4WZ.js.map} +0 -0
- /package/dist/{chunk-2YXFLRQ6.js.map → chunk-WNB5PSY6.js.map} +0 -0
- /package/dist/{chunk-CRP6Y7NF.js.map → chunk-ZDYEDI2A.js.map} +0 -0
package/dist/proxy/index.js.map
CHANGED
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASO,SAAS,aACd,gBACA,gBACwB;AACxB,QAAM,UAAkC,EAAE,GAAG,eAAe;AAC5D,MAAI,gBAAgB;AAClB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,cAAc,GAAG;AACzD,UAAI,UAAU,QAAW;AACvB,gBAAQ,GAAG,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;ACmBA,IAAM,qBAAsC;AAAA,EAC1C,WAAW;AAAA,EACX,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,YAAY;AACd;AAKA,SAAS,iBACP,SACA,SACyB;AACzB,SAAO;AAAA,IACL,OAAO;AAAA,IACP,UAAU,QAAQ,SAAS,IAAI,gBAAgB;AAAA,IAC/C,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ,OAAO,IAAI,CAAC,OAAO;AAAA,MAChC,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,MACf,YAAY,EAAE;AAAA,MACd,UAAU,EAAE;AAAA,IACd,EAAE;AAAA,IACF,WAAW,QAAQ;AAAA,EACrB;AACF;AAEA,SAAS,wBAAwB,QAAwB;AACvD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,uBAAuB,QAAwB;AACtD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,oBAAoB,QAAwB;AACnD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,oBAAoB,QAAwB;AACnD,MAAI,WAAW,UAAU;AACvB,WAAO;AAAA,EACT;AACA,MAAI,WAAW,QAAQ;AACrB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,SAA+C;AACvE,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,aAAa,QAAQ,UAAU,SAAS,GAAG;AACrD,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,QAAQ;AACzB,QAAM,aAAa,UAAU;AAC7B,MAAI,YAAY,QAAQ;AACtB,QAAI,WAAW,WAAW,UAAU;AAClC,aAAO;AAAA,IACT;AACA,QAAI,WAAW,WAAW,aAAa;AACrC,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,YAAY,eAAe;AAC7B,WAAO,wBAAwB,WAAW,aAAa;AAAA,EACzD;AAEA,QAAM,iBAAiB,UAAU;AACjC,MAAI,gBAAgB,eAAe;AACjC,WAAO,wBAAwB,eAAe,aAAa;AAAA,EAC7D;AAEA,QAAM,UAAU,UAAU;AAC1B,MAAI,SAAS,QAAQ;AACnB,QAAI,QAAQ,WAAW,UAAU;AAC/B,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,WAAW,aAAa;AAClC,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,SAAS,eAAe;AAC1B,WAAO,wBAAwB,QAAQ,aAAa;AAAA,EACtD;AAEA,QAAM,gBAAgB,UAAU;AAChC,MAAI,eAAe,aAAa;AAC9B,WAAO,uBAAuB,cAAc,WAAW;AAAA,EACzD;AAEA,QAAM,aAAa,UAAU;AAC7B,MAAI,YAAY,cAAc;AAC5B,WAAO,oBAAoB,WAAW,YAAY;AAAA,EACpD;AAEA,QAAM,aAAa,UAAU;AAC7B,MAAI,YAAY,aAAa;AAC3B,WAAO,oBAAoB,WAAW,WAAW;AAAA,EACnD;AAEA,SAAO;AACT;AAKA,SAAS,sBAAsB,MAA6B;AAC1D,QAAM,WAAW,KAAK,SAAS,IAAI,kBAAkB;AACrD,QAAM,gBAAgB,SACnB,OAAO,CAAC,MAA6B,EAAE,SAAS,WAAW,EAC3D,IAAI;AAEP,QAAM,aAAa,iBAAiB,aAAa;AAEjD,SAAO;AAAA,IACL,SAAS,iBAAiB,IAAI,iBAAiB,EAAE;AAAA,IACjD,OAAO,KAAK,SAAS,WAAW;AAAA,IAChC;AAAA,IACA,MAAM,KAAK;AAAA,EACb;AACF;AA4BO,SAAS,iBAAiB,SAA2D;AAC1F,QAAM,EAAE,UAAU,SAAS,iBAAiB,CAAC,EAAE,IAAI;AAEnD,MAAI,cAAkD;AAEtD,SAAO;AAAA,IACL,aAAa,UAAuC;AAClD,oBAAc;AAAA,IAChB;AAAA,IAEA,KAAK,SAAgD;AACnD,YAAM,WAAW;AACjB,UAAI,CAAC,UAAU;AACb,cAAM,IAAI;AAAA,UACR;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA,aAAa;AAAA,QACf;AAAA,MACF;AAEA,YAAM,QAAuC;AAAA,QAC3C;AAAA,QACA,cAAc;AAAA,QAEd,IAAI,WAAwC;AAC1C,iBAAO;AAAA,QACT;AAAA,QAEA,MAAM,SAAS,SAA2D;AACxE,gBAAM,OAAO,iBAAiB,SAAS,OAAO;AAC9C,gBAAM,UAAU,aAAa,QAAQ,OAAO,SAAS,cAAc;AAEnE,gBAAM,WAAW,MAAM;AAAA,YACrB;AAAA,YACA;AAAA,cACE,QAAQ;AAAA,cACR,SAAS;AAAA,gBACP,GAAG;AAAA,gBACH,gBAAgB;AAAA,gBAChB,QAAQ;AAAA,cACV;AAAA,cACA,MAAM,KAAK,UAAU,IAAI;AAAA,cACzB,QAAQ,QAAQ;AAAA,YAClB;AAAA,YACA,QAAQ;AAAA,YACR;AAAA,YACA;AAAA,UACF;AAEA,gBAAM,OAAO,MAAM,kBAA4B,UAAU,SAAS,KAAK;AACvE,iBAAO,sBAAsB,IAAI;AAAA,QACnC;AAAA,QAEA,OAAO,SAAsD;AAC3D,gBAAM,OAAO,iBAAiB,SAAS,OAAO;AAC9C,gBAAM,UAAU,aAAa,QAAQ,OAAO,SAAS,cAAc;AAEnE,cAAI;AACJ,cAAI;AACJ,cAAI,kBAAkB;AACtB,gBAAM,kBAAkB,IAAI,QAAqB,CAAC,SAAS,WAAW;AACpE,8BAAkB,CAAC,UAAU;AAC3B,kBAAI,CAAC,iBAAiB;AACpB,kCAAkB;AAClB,wBAAQ,KAAK;AAAA,cACf;AAAA,YACF;AACA,6BAAiB,CAAC,UAAU;AAC1B,kBAAI,CAAC,iBAAiB;AACpB,kCAAkB;AAClB,uBAAO,KAAK;AAAA,cACd;AAAA,YACF;AAAA,UACF,CAAC;AAED,gBAAM,YAAY,mBAAgD;AAChE,gBAAI;AACF,oBAAM,WAAW,MAAM;AAAA,gBACrB;AAAA,gBACA;AAAA,kBACE,QAAQ;AAAA,kBACR,SAAS;AAAA,oBACP,GAAG;AAAA,oBACH,gBAAgB;AAAA,oBAChB,QAAQ;AAAA,kBACV;AAAA,kBACA,MAAM,KAAK,UAAU,IAAI;AAAA,kBACzB,QAAQ,QAAQ;AAAA,gBAClB;AAAA,gBACA,QAAQ;AAAA,gBACR;AAAA,gBACA;AAAA,cACF;AAEA,kBAAI,CAAC,SAAS,IAAI;AAChB,sBAAM,MAAM,mBAAmB,UAAU,SAAS,KAAK;AAAA,cACzD;AAEA,kBAAI,CAAC,SAAS,MAAM;AAClB,sBAAM,IAAI;AAAA,kBACR;AAAA,kBACA,UAAU;AAAA,kBACV;AAAA,kBACA,aAAa;AAAA,gBACf;AAAA,cACF;AAEA,oBAAM,SAAS,SAAS,KAAK,UAAU;AACvC,oBAAM,UAAU,IAAI,YAAY;AAChC,kBAAI,SAAS;AAEb,qBAAO,MAAM;AACX,sBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,oBAAI,KAAM;AAEV,0BAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,sBAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,yBAAS,MAAM,IAAI,KAAK;AAExB,2BAAW,QAAQ,OAAO;AACxB,sBAAI,CAAC,KAAK,KAAK,KAAK,KAAK,WAAW,GAAG,EAAG;AAE1C,sBAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,wBAAI,OAAO,KAAK,MAAM,CAAC;AACvB,wBAAI,KAAK,WAAW,GAAG,GAAG;AACxB,6BAAO,KAAK,MAAM,CAAC;AAAA,oBACrB;AACA,wBAAI,SAAS,SAAU;AAEvB,wBAAI;AACF,4BAAM,SAAS,KAAK,MAAM,IAAI;AAG9B,0BAAI,cAAc,UAAU,WAAW,UAAU,YAAY,QAAQ;AACnE,wCAAgB,sBAAsB,MAAkB,CAAC;AAAA,sBAC3D,OAAO;AAEL,8BAAM,QAAQ,uBAAuB,MAAqB;AAC1D,8BAAM;AAEN,4BAAI,QAAQ,aAAa,MAAM,SAAS,gBAAgB,WAAW;AACjE,gCAAM,YAAY,MAAM,MAAM,QAAQ,IAAI,MAAM,KAAK;AAAA,wBACvD;AAEA,4BAAI,QAAQ,aAAa,MAAM,SAAS,gBAAgB,iBAAiB,MAAM,MAAM,eAAe;AAClG,gCAAM,YAAY,MAAM,MAAM,eAAe,MAAM,KAAK;AAAA,wBAC1D;AAAA,sBACF;AAAA,oBACF,QAAQ;AAAA,oBAER;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AACA,oBAAM,YAAY,QAAQ,OAAO;AACjC,kBAAI,WAAW;AACb,0BAAU;AACV,sBAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,yBAAS,MAAM,IAAI,KAAK;AACxB,2BAAW,QAAQ,OAAO;AACxB,sBAAI,CAAC,KAAK,KAAK,KAAK,KAAK,WAAW,GAAG,EAAG;AAC1C,sBAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,wBAAI,OAAO,KAAK,MAAM,CAAC;AACvB,wBAAI,KAAK,WAAW,GAAG,GAAG;AACxB,6BAAO,KAAK,MAAM,CAAC;AAAA,oBACrB;AACA,wBAAI,SAAS,SAAU;AACvB,wBAAI;AACF,4BAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,0BAAI,cAAc,UAAU,WAAW,UAAU,YAAY,QAAQ;AACnE,wCAAgB,sBAAsB,MAAkB,CAAC;AAAA,sBAC3D,OAAO;AACL,8BAAM,QAAQ,uBAAuB,MAAqB;AAC1D,8BAAM;AAEN,4BAAI,QAAQ,aAAa,MAAM,SAAS,gBAAgB,WAAW;AACjE,gCAAM,YAAY,MAAM,MAAM,QAAQ,IAAI,MAAM,KAAK;AAAA,wBACvD;AAEA,4BAAI,QAAQ,aAAa,MAAM,SAAS,gBAAgB,iBAAiB,MAAM,MAAM,eAAe;AAClG,gCAAM,YAAY,MAAM,MAAM,eAAe,MAAM,KAAK;AAAA,wBAC1D;AAAA,sBACF;AAAA,oBACF,QAAQ;AAAA,oBAER;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAEA,kBAAI,CAAC,iBAAiB;AACpB,+BAAe,IAAI;AAAA,kBACjB;AAAA,kBACA,UAAU;AAAA,kBACV;AAAA,kBACA,aAAa;AAAA,gBACf,CAAC;AAAA,cACH;AAAA,YACF,SAAS,OAAO;AACd,6BAAe,QAAQ,KAAK,CAAC;AAC7B,oBAAM;AAAA,YACR;AAAA,UACF;AAEA,iBAAO;AAAA,YACL,CAAC,OAAO,aAAa,GAAG;AAAA,YACxB,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC1aA,IAAM,yBAAyB,OAAO;AACtC,IAAM,2BAA2B,OAAO;AACxC,IAAM,qBAAqB;AAkB3B,SAAS,2BACP,MACmB;AACnB,MAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,KAAK,UAAU,GAAG;AACxE,UAAM,IAAI;AAAA,MACR;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EACF;AAEA,QAAM,aAAa,KAAK,WAAW,IAAI,CAAC,WAAW,UAAU;AAC3D,QAAI,CAAC,aAAa,OAAO,cAAc,UAAU;AAC/C,YAAM,IAAI;AAAA,QACR;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AAEA,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,UAAU;AACxD,YAAM,IAAI;AAAA,QACR;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AAEA,UAAM,gBAAgB,OAAO,UAAU,UAAU,WAAW,UAAU,QAAQ;AAC9E,UAAM,SAAS,OAAO,UAAU,WAAW,WAAW,UAAU,SAAS;AAEzE,WAAO;AAAA,MACL;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,UAAU,UAAU;AAAA,IACtB;AAAA,EACF,CAAC;AAED,QAAM,cAAc,OAAO,KAAK,OAAO,gBAAgB,WACnD,KAAK,MAAM,cACX;AAEJ,SAAO;AAAA,IACL;AAAA,IACA,OAAO,EAAE,YAAY;AAAA,IACrB,UAAU,KAAK;AAAA,EACjB;AACF;AAYO,SAAS,uBACd,SACwC;AACxC,QAAM,EAAE,UAAU,SAAS,iBAAiB,CAAC,EAAE,IAAI;AAEnD,MAAI,cAA8D;AAElE,SAAO;AAAA,IACL,iBAAiB,CAAC,QAAQ,OAAO;AAAA,IAEjC,aAAa,UAAmD;AAC9D,oBAAc;AAAA,IAChB;AAAA,IAEA,KAAK,SAA4D;AAC/D,YAAM,WAAW;AACjB,UAAI,CAAC,UAAU;AACb,cAAM,IAAI;AAAA,UACR;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA,aAAa;AAAA,QACf;AAAA,MACF;AAEA,YAAM,QAAmD;AAAA,QACvD;AAAA,QACA,cAAc;AAAA,QACd,gBAAgB;AAAA,QAChB,YAAY;AAAA,QAEZ,IAAI,WAAoD;AACtD,iBAAO;AAAA,QACT;AAAA,QAEA,MAAM,MACJ,SAC4B;AAC5B,gBAAM,OAAO;AAAA,YACX,OAAO;AAAA,YACP,QAAQ,QAAQ,OAAO,IAAI,uBAAuB;AAAA,YAClD,QAAQ,QAAQ;AAAA,UAClB;AAEA,gBAAM,UAAU,aAAa,QAAQ,OAAO,SAAS,cAAc;AAEnE,gBAAM,WAAW,MAAM;AAAA,YACrB;AAAA,YACA;AAAA,cACE,QAAQ;AAAA,cACR,SAAS;AAAA,gBACP,GAAG;AAAA,gBACH,gBAAgB;AAAA,gBAChB,QAAQ;AAAA,cACV;AAAA,cACA,MAAM,KAAK,UAAU,IAAI;AAAA,cACzB,QAAQ,QAAQ;AAAA,YAClB;AAAA,YACA,QAAQ;AAAA,YACR;AAAA,YACA;AAAA,UACF;AAEA,gBAAM,OAAO,MAAM;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,iBAAO,2BAA2B,IAAI;AAAA,QACxC;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACrJA,IAAM,2BAA8C;AAAA,EAClD,UAAU;AAAA,EACV,WAAW;AAAA,EACX,MAAM;AACR;AAUA,SAAS,sBACP,SACA,SACuB;AACvB,SAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,EAClB;AACF;AAEA,SAAS,0BACP,SACA,SACuB;AACvB,SAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,OAAO,eAAe,QAAQ,KAAK;AAAA,IACnC,MAAM,QAAQ,OAAO,eAAe,QAAQ,IAAI,IAAI;AAAA,EACtD;AACF;AAEA,SAAS,uBACP,SACoC;AACpC,SAAO,CAAC,CAAC,WACJ,OAAO,YAAY,YACnB,YAAY,WACZ,MAAM,QAAS,QAAoC,MAAM;AAChE;AAEA,eAAe,oBACb,UACA,MACA,SACA,gBACwB;AACxB,QAAM,UAAU,aAAa,QAAQ,OAAO,SAAS,cAAc;AAEnE,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,GAAG;AAAA,QACH,gBAAgB;AAAA,QAChB,QAAQ;AAAA,MACV;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,MACzB,QAAQ,QAAQ;AAAA,IAClB;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AAEA,QAAM,OAAO,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,yBAAyB,IAAI;AACtC;AAEA,SAAS,mBACP,UACA,MACA,SACA,gBAC2B;AAC3B,QAAM,UAAU,aAAa,QAAQ,OAAO,SAAS,cAAc;AAEnE,MAAI;AACJ,MAAI;AACJ,MAAI,kBAAkB;AACtB,QAAM,kBAAkB,IAAI,QAAuB,CAAC,SAAS,WAAW;AACtE,sBAAkB,CAAC,UAAU;AAC3B,UAAI,CAAC,iBAAiB;AACpB,0BAAkB;AAClB,gBAAQ,KAAK;AAAA,MACf;AAAA,IACF;AACA,qBAAiB,CAAC,UAAU;AAC1B,UAAI,CAAC,iBAAiB;AACpB,0BAAkB;AAClB,eAAO,KAAK;AAAA,MACd;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,YAAY,gBAAgBA,aAA8C;AAC9E,QAAI;AACF,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,GAAG;AAAA,YACH,gBAAgB;AAAA,YAChB,QAAQ;AAAA,UACV;AAAA,UACA,MAAM,KAAK,UAAU,IAAI;AAAA,UACzB,QAAQ,QAAQ;AAAA,QAClB;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAEA,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,MAAM,mBAAmB,UAAU,SAAS,OAAO;AAAA,MAC3D;AAEA,UAAI,CAAC,SAAS,MAAM;AAClB,cAAM,IAAI;AAAA,UACR;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA,aAAa;AAAA,QACf;AAAA,MACF;AAEA,YAAM,SAAS,SAAS,KAAK,UAAU;AACvC,YAAM,UAAU,IAAI,YAAY;AAChC,UAAI,SAAS;AAEb,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,KAAM;AAEV,kBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,cAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,iBAAS,MAAM,IAAI,KAAK;AAExB,mBAAW,QAAQ,OAAO;AACxB,cAAI,CAAC,KAAK,KAAK,KAAK,KAAK,WAAW,GAAG,EAAG;AAE1C,cAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,gBAAI,OAAO,KAAK,MAAM,CAAC;AACvB,gBAAI,KAAK,WAAW,GAAG,GAAG;AACxB,qBAAO,KAAK,MAAM,CAAC;AAAA,YACrB;AACA,gBAAI,SAAS,SAAU;AAEvB,gBAAI;AACF,oBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,kBAAI,uBAAuB,MAAM,GAAG;AAClC,gCAAgB,yBAAyB,MAAM,CAAC;AAAA,cAClD,OAAO;AACL,sBAAM,4BAA4B,MAAM;AAAA,cAC1C;AAAA,YACF,QAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YAAY,QAAQ,OAAO;AACjC,UAAI,WAAW;AACb,kBAAU;AACV,cAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,iBAAS,MAAM,IAAI,KAAK;AACxB,mBAAW,QAAQ,OAAO;AACxB,cAAI,CAAC,KAAK,KAAK,KAAK,KAAK,WAAW,GAAG,EAAG;AAC1C,cAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,gBAAI,OAAO,KAAK,MAAM,CAAC;AACvB,gBAAI,KAAK,WAAW,GAAG,GAAG;AACxB,qBAAO,KAAK,MAAM,CAAC;AAAA,YACrB;AACA,gBAAI,SAAS,SAAU;AACvB,gBAAI;AACF,oBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,kBAAI,uBAAuB,MAAM,GAAG;AAClC,gCAAgB,yBAAyB,MAAM,CAAC;AAAA,cAClD,OAAO;AACL,sBAAM,4BAA4B,MAAM;AAAA,cAC1C;AAAA,YACF,QAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,CAAC,iBAAiB;AACpB,uBAAe,IAAI;AAAA,UACjB;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA,aAAa;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,qBAAe,QAAQ,KAAK,CAAC;AAC7B,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AAAA,IACL,CAAC,OAAO,aAAa,GAAG;AAAA,IACxB,UAAU;AAAA,EACZ;AACF;AAYO,SAAS,mBACd,SACgC;AAChC,QAAM,EAAE,UAAU,SAAS,iBAAiB,CAAC,EAAE,IAAI;AAEnD,MAAI,cAAsD;AAE1D,SAAO;AAAA,IACL,aAAa,UAA2C;AACtD,oBAAc;AAAA,IAChB;AAAA,IAEA,KAAK,SAAoD;AACvD,YAAM,WAAW;AACjB,UAAI,CAAC,UAAU;AACb,cAAM,IAAI;AAAA,UACR;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA,aAAa;AAAA,QACf;AAAA,MACF;AAEA,YAAM,QAA2C;AAAA,QAC/C;AAAA,QACA,cAAc;AAAA,QAEd,IAAI,WAA4C;AAC9C,iBAAO;AAAA,QACT;AAAA,QAEA,MAAM,SAAS,SAAiE;AAC9E,gBAAM,OAAO,sBAAsB,SAAS,OAAO;AACnD,iBAAO,oBAAoB,UAAU,MAAM,SAAS,cAAc;AAAA,QACpE;AAAA,QAEA,MAAM,KAAK,SAAqE;AAC9E,gBAAM,OAAO,0BAA0B,SAAS,OAAO;AACvD,iBAAO,oBAAoB,UAAU,MAAM,SAAS,cAAc;AAAA,QACpE;AAAA,MACF;AAEA,YAAM,SAAS,SAAS,OACtB,SAC2B;AAC3B,cAAM,OAAO,sBAAsB,SAAS,OAAO;AACnD,eAAO,mBAAmB,UAAU,MAAM,SAAS,cAAc;AAAA,MACnE;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC5RO,SAAS,MAAM,SAA+B;AACnD,SAAO,eAAoC;AAAA,IACzC,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,MACR,KAAK,iBAAiB,OAAO;AAAA,MAC7B,WAAW,uBAAuB,OAAO;AAAA,MACzC,OAAO,mBAAmB,OAAO;AAAA,IACnC;AAAA,EACF,CAAC;AACH;AAoBO,SAAS,WAAW,UAAuD;AAChF,SAAO,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS;AACtC;","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,
|
|
2
|
-
import { d as EmbeddingResult } from '../../../embedding-
|
|
3
|
-
import { N as ImageResult } from '../../../llm-
|
|
4
|
-
import { I as ImageStreamLike } from '../../../image-stream-
|
|
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-
|
|
10
|
-
import "../../../chunk-
|
|
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,
|
|
2
|
-
import { d as EmbeddingResult } from '../../../embedding-
|
|
3
|
-
import { N as ImageResult } from '../../../llm-
|
|
4
|
-
import { I as ImageStreamLike } from '../../../image-stream-
|
|
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-
|
|
10
|
-
import "../../../chunk-
|
|
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";
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { T as Turn,
|
|
2
|
-
import { d as EmbeddingResult } from '../../../embedding-
|
|
3
|
-
import { N as ImageResult } from '../../../llm-
|
|
4
|
-
import { I as ImageStreamLike } from '../../../image-stream-
|
|
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 H3/Nitro/Nuxt adapter for proxy server.
|
|
@@ -18,6 +19,7 @@ import { I as ImageStreamLike } from '../../../image-stream-CeQHtjxS.js';
|
|
|
18
19
|
interface H3Event {
|
|
19
20
|
node: {
|
|
20
21
|
res: {
|
|
22
|
+
statusCode: number;
|
|
21
23
|
setHeader(name: string, value: string): void;
|
|
22
24
|
write(chunk: string): boolean;
|
|
23
25
|
end(): void;
|
|
@@ -57,14 +59,14 @@ declare function sendImageJSON(result: ImageResult, event: H3Event): unknown;
|
|
|
57
59
|
/**
|
|
58
60
|
* Stream a StreamResult as Server-Sent Events.
|
|
59
61
|
*
|
|
60
|
-
*
|
|
61
|
-
* @param event - H3 event object
|
|
62
|
-
*
|
|
63
|
-
* @example
|
|
62
|
+
* Note: For better H3/Nuxt integration, prefer using `createSSEStream` with `sendStream`:
|
|
64
63
|
* ```typescript
|
|
65
|
-
*
|
|
66
|
-
* return h3Adapter.
|
|
64
|
+
* import { sendStream } from 'h3';
|
|
65
|
+
* return sendStream(event, h3Adapter.createSSEStream(stream));
|
|
67
66
|
* ```
|
|
67
|
+
*
|
|
68
|
+
* @param stream - The StreamResult from instance.stream()
|
|
69
|
+
* @param event - H3 event object
|
|
68
70
|
*/
|
|
69
71
|
declare function streamSSE(stream: StreamResult, event: H3Event): void;
|
|
70
72
|
/**
|
|
@@ -95,7 +97,7 @@ declare function createSSEStream(stream: StreamResult): ReadableStream<Uint8Arra
|
|
|
95
97
|
*/
|
|
96
98
|
declare function createImageSSEStream(stream: ImageStreamLike): ReadableStream<Uint8Array>;
|
|
97
99
|
/**
|
|
98
|
-
* Send an error response.
|
|
100
|
+
* Send an error response with proper HTTP status.
|
|
99
101
|
*
|
|
100
102
|
* @param message - Error message
|
|
101
103
|
* @param status - HTTP status code
|
|
@@ -112,10 +114,10 @@ declare function sendError(message: string, status: number, event: H3Event): {
|
|
|
112
114
|
* @example Basic usage
|
|
113
115
|
* ```typescript
|
|
114
116
|
* // Nuxt server route: server/api/ai.post.ts
|
|
117
|
+
* import { sendStream } from 'h3';
|
|
115
118
|
* import { llm } from '@providerprotocol/ai';
|
|
116
119
|
* import { anthropic } from '@providerprotocol/ai/anthropic';
|
|
117
|
-
* import { parseBody } from '@providerprotocol/ai/proxy';
|
|
118
|
-
* import { h3 as h3Adapter } from '@providerprotocol/ai/proxy/server';
|
|
120
|
+
* import { parseBody, h3 as h3Adapter } from '@providerprotocol/ai/proxy';
|
|
119
121
|
*
|
|
120
122
|
* export default defineEventHandler(async (event) => {
|
|
121
123
|
* const body = await readBody(event);
|
|
@@ -124,7 +126,7 @@ declare function sendError(message: string, status: number, event: H3Event): {
|
|
|
124
126
|
*
|
|
125
127
|
* const wantsStream = getHeader(event, 'accept')?.includes('text/event-stream');
|
|
126
128
|
* if (wantsStream) {
|
|
127
|
-
* return h3Adapter.
|
|
129
|
+
* return sendStream(event, h3Adapter.createSSEStream(instance.stream(messages)));
|
|
128
130
|
* } else {
|
|
129
131
|
* const turn = await instance.generate(messages);
|
|
130
132
|
* return h3Adapter.sendJSON(turn, event);
|
|
@@ -135,11 +137,11 @@ declare function sendError(message: string, status: number, event: H3Event): {
|
|
|
135
137
|
* @example API Gateway with authentication (Nuxt)
|
|
136
138
|
* ```typescript
|
|
137
139
|
* // server/api/ai.post.ts
|
|
140
|
+
* import { sendStream } from 'h3';
|
|
138
141
|
* import { llm } from '@providerprotocol/ai';
|
|
139
142
|
* import { anthropic } from '@providerprotocol/ai/anthropic';
|
|
140
143
|
* import { ExponentialBackoff, RoundRobinKeys } from '@providerprotocol/ai/http';
|
|
141
|
-
* import { parseBody } from '@providerprotocol/ai/proxy';
|
|
142
|
-
* import { h3 as h3Adapter } from '@providerprotocol/ai/proxy/server';
|
|
144
|
+
* import { parseBody, h3 as h3Adapter } from '@providerprotocol/ai/proxy';
|
|
143
145
|
*
|
|
144
146
|
* // Server manages AI provider keys - users never see them
|
|
145
147
|
* const claude = llm({
|
|
@@ -168,7 +170,7 @@ declare function sendError(message: string, status: number, event: H3Event): {
|
|
|
168
170
|
* const { messages, system, params } = parseBody(body);
|
|
169
171
|
*
|
|
170
172
|
* if (params?.stream) {
|
|
171
|
-
* return h3Adapter.
|
|
173
|
+
* return sendStream(event, h3Adapter.createSSEStream(claude.stream(messages, { system })));
|
|
172
174
|
* }
|
|
173
175
|
* const turn = await claude.generate(messages, { system });
|
|
174
176
|
* return h3Adapter.sendJSON(turn, event);
|
|
@@ -8,8 +8,9 @@ import {
|
|
|
8
8
|
sendJSON,
|
|
9
9
|
streamImageSSE,
|
|
10
10
|
streamSSE
|
|
11
|
-
} from "../../../chunk-
|
|
12
|
-
import "../../../chunk-
|
|
11
|
+
} from "../../../chunk-KNBODIQU.js";
|
|
12
|
+
import "../../../chunk-BIBMNP7Y.js";
|
|
13
|
+
import "../../../chunk-7ULSRWDH.js";
|
|
13
14
|
import "../../../chunk-ETBFOLQN.js";
|
|
14
15
|
import "../../../chunk-N5DX5JW3.js";
|
|
15
16
|
import "../../../chunk-WU4U6IHF.js";
|
|
@@ -6,10 +6,11 @@ import { sendJSON, sendEmbeddingJSON, sendImageJSON, streamSSE, streamImageSSE,
|
|
|
6
6
|
export { express } from './express/index.js';
|
|
7
7
|
import { parseBody, parseEmbeddingBody, parseImageBody, toJSON, toEmbeddingJSON, toImageJSON, toSSE, toImageSSE, toError, bindTools } from './webapi/index.js';
|
|
8
8
|
export { ParsedEmbeddingRequest, ParsedImageRequest, ParsedRequest, webapi } from './webapi/index.js';
|
|
9
|
-
import { M as Message,
|
|
10
|
-
import '../../
|
|
11
|
-
import '../../
|
|
12
|
-
import '../../
|
|
9
|
+
import { M as Message, T as Turn, g as StreamResult } from '../../stream-DVVUIKpz.js';
|
|
10
|
+
import { J as JSONSchema, j as ToolMetadata } from '../../tool-D22EhP5F.js';
|
|
11
|
+
import '../../embedding-iNQCeXfk.js';
|
|
12
|
+
import '../../llm-CZqlijjK.js';
|
|
13
|
+
import '../../image-stream-ARno6XlS.js';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* @fileoverview Shared types for proxy server adapters.
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
server
|
|
3
|
-
} from "../../chunk-
|
|
3
|
+
} from "../../chunk-RDC5GYST.js";
|
|
4
4
|
import {
|
|
5
5
|
express
|
|
6
|
-
} from "../../chunk-
|
|
6
|
+
} from "../../chunk-O32SBS6S.js";
|
|
7
7
|
import {
|
|
8
8
|
h3
|
|
9
|
-
} from "../../chunk-
|
|
9
|
+
} from "../../chunk-KNBODIQU.js";
|
|
10
10
|
import {
|
|
11
11
|
fastify
|
|
12
|
-
} from "../../chunk-
|
|
12
|
+
} from "../../chunk-IDZR4ROP.js";
|
|
13
13
|
import {
|
|
14
14
|
bindTools,
|
|
15
15
|
parseBody,
|
|
@@ -22,8 +22,9 @@ import {
|
|
|
22
22
|
toJSON,
|
|
23
23
|
toSSE,
|
|
24
24
|
webapi
|
|
25
|
-
} from "../../chunk-
|
|
26
|
-
import "../../chunk-
|
|
25
|
+
} from "../../chunk-5XPRVUOK.js";
|
|
26
|
+
import "../../chunk-BIBMNP7Y.js";
|
|
27
|
+
import "../../chunk-7ULSRWDH.js";
|
|
27
28
|
import "../../chunk-ETBFOLQN.js";
|
|
28
29
|
import "../../chunk-N5DX5JW3.js";
|
|
29
30
|
import "../../chunk-WU4U6IHF.js";
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { M as Message,
|
|
2
|
-
import { o as Image, E as EmbeddingInput, N as ImageResult } from '../../../llm-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { M as Message, T as Turn, g as StreamResult } from '../../../stream-DVVUIKpz.js';
|
|
2
|
+
import { o as Image, E as EmbeddingInput, N as ImageResult } from '../../../llm-CZqlijjK.js';
|
|
3
|
+
import { J as JSONSchema, j as ToolMetadata, b as Tool } from '../../../tool-D22EhP5F.js';
|
|
4
|
+
import { d as EmbeddingResult } from '../../../embedding-iNQCeXfk.js';
|
|
5
|
+
import { I as ImageStreamLike } from '../../../image-stream-ARno6XlS.js';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* @fileoverview Media serialization utilities for proxy transport.
|
|
@@ -10,8 +10,9 @@ import {
|
|
|
10
10
|
toJSON,
|
|
11
11
|
toSSE,
|
|
12
12
|
webapi
|
|
13
|
-
} from "../../../chunk-
|
|
14
|
-
import "../../../chunk-
|
|
13
|
+
} from "../../../chunk-5XPRVUOK.js";
|
|
14
|
+
import "../../../chunk-BIBMNP7Y.js";
|
|
15
|
+
import "../../../chunk-7ULSRWDH.js";
|
|
15
16
|
import "../../../chunk-ETBFOLQN.js";
|
|
16
17
|
import "../../../chunk-N5DX5JW3.js";
|
|
17
18
|
import "../../../chunk-WU4U6IHF.js";
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { e as Provider } from '../llm-
|
|
2
|
-
import '../stream-
|
|
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 OpenResponses Provider Type Definitions
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { K as KeyStrategy, c as ProviderConfig, f as Modality, R as RetryStrategy, U as UPPError } from './llm-
|
|
1
|
+
import { K as KeyStrategy, c as ProviderConfig, f as Modality, R as RetryStrategy, U as UPPError } from './llm-CZqlijjK.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* API key management strategies for load balancing and dynamic key selection.
|