@fgv/ts-extras 5.1.0-20 → 5.1.0-21

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 (64) hide show
  1. package/dist/packlets/ai-assist/apiClient.js +30 -25
  2. package/dist/packlets/ai-assist/apiClient.js.map +1 -1
  3. package/dist/packlets/ai-assist/converters.js +2 -1
  4. package/dist/packlets/ai-assist/converters.js.map +1 -1
  5. package/dist/packlets/ai-assist/endpoint.js +78 -0
  6. package/dist/packlets/ai-assist/endpoint.js.map +1 -0
  7. package/dist/packlets/ai-assist/model.js.map +1 -1
  8. package/dist/packlets/ai-assist/registry.js +26 -0
  9. package/dist/packlets/ai-assist/registry.js.map +1 -1
  10. package/dist/packlets/ai-assist/streamingAdapters/common.js.map +1 -1
  11. package/dist/packlets/ai-assist/streamingAdapters/openaiChat.js +2 -1
  12. package/dist/packlets/ai-assist/streamingAdapters/openaiChat.js.map +1 -1
  13. package/dist/packlets/ai-assist/streamingAdapters/openaiResponses.js +2 -1
  14. package/dist/packlets/ai-assist/streamingAdapters/openaiResponses.js.map +1 -1
  15. package/dist/packlets/ai-assist/streamingClient.js +11 -5
  16. package/dist/packlets/ai-assist/streamingClient.js.map +1 -1
  17. package/dist/packlets/crypto-utils/keyPairAlgorithmParams.js +6 -0
  18. package/dist/packlets/crypto-utils/keyPairAlgorithmParams.js.map +1 -1
  19. package/dist/packlets/crypto-utils/model.js +2 -1
  20. package/dist/packlets/crypto-utils/model.js.map +1 -1
  21. package/dist/packlets/crypto-utils/nodeCryptoProvider.js +12 -1
  22. package/dist/packlets/crypto-utils/nodeCryptoProvider.js.map +1 -1
  23. package/dist/ts-extras.d.ts +66 -5
  24. package/lib/packlets/ai-assist/apiClient.d.ts +29 -0
  25. package/lib/packlets/ai-assist/apiClient.d.ts.map +1 -1
  26. package/lib/packlets/ai-assist/apiClient.js +30 -25
  27. package/lib/packlets/ai-assist/apiClient.js.map +1 -1
  28. package/lib/packlets/ai-assist/converters.d.ts.map +1 -1
  29. package/lib/packlets/ai-assist/converters.js +2 -1
  30. package/lib/packlets/ai-assist/converters.js.map +1 -1
  31. package/lib/packlets/ai-assist/endpoint.d.ts +28 -0
  32. package/lib/packlets/ai-assist/endpoint.d.ts.map +1 -0
  33. package/lib/packlets/ai-assist/endpoint.js +82 -0
  34. package/lib/packlets/ai-assist/endpoint.js.map +1 -0
  35. package/lib/packlets/ai-assist/model.d.ts +9 -1
  36. package/lib/packlets/ai-assist/model.d.ts.map +1 -1
  37. package/lib/packlets/ai-assist/model.js.map +1 -1
  38. package/lib/packlets/ai-assist/registry.d.ts.map +1 -1
  39. package/lib/packlets/ai-assist/registry.js +26 -0
  40. package/lib/packlets/ai-assist/registry.js.map +1 -1
  41. package/lib/packlets/ai-assist/streamingAdapters/common.d.ts +8 -0
  42. package/lib/packlets/ai-assist/streamingAdapters/common.d.ts.map +1 -1
  43. package/lib/packlets/ai-assist/streamingAdapters/common.js.map +1 -1
  44. package/lib/packlets/ai-assist/streamingAdapters/openaiChat.d.ts.map +1 -1
  45. package/lib/packlets/ai-assist/streamingAdapters/openaiChat.js +2 -1
  46. package/lib/packlets/ai-assist/streamingAdapters/openaiChat.js.map +1 -1
  47. package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.d.ts.map +1 -1
  48. package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.js +2 -1
  49. package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.js.map +1 -1
  50. package/lib/packlets/ai-assist/streamingClient.d.ts.map +1 -1
  51. package/lib/packlets/ai-assist/streamingClient.js +11 -5
  52. package/lib/packlets/ai-assist/streamingClient.js.map +1 -1
  53. package/lib/packlets/crypto-utils/keyPairAlgorithmParams.d.ts +14 -3
  54. package/lib/packlets/crypto-utils/keyPairAlgorithmParams.d.ts.map +1 -1
  55. package/lib/packlets/crypto-utils/keyPairAlgorithmParams.js +6 -0
  56. package/lib/packlets/crypto-utils/keyPairAlgorithmParams.js.map +1 -1
  57. package/lib/packlets/crypto-utils/model.d.ts +6 -1
  58. package/lib/packlets/crypto-utils/model.d.ts.map +1 -1
  59. package/lib/packlets/crypto-utils/model.js +2 -1
  60. package/lib/packlets/crypto-utils/model.js.map +1 -1
  61. package/lib/packlets/crypto-utils/nodeCryptoProvider.d.ts.map +1 -1
  62. package/lib/packlets/crypto-utils/nodeCryptoProvider.js +12 -1
  63. package/lib/packlets/crypto-utils/nodeCryptoProvider.js.map +1 -1
  64. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"apiClient.js","sourceRoot":"","sources":["../../../src/packlets/ai-assist/apiClient.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Erik Fortune\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n/**\n * Chat completion client for AI assist with support for multiple provider APIs.\n *\n * Supports OpenAI-compatible providers (xAI, OpenAI, Groq, Mistral) directly,\n * plus adapters for Anthropic and Google Gemini.\n *\n * When server-side tools (e.g. web_search) are configured, providers that support\n * them will include tool configuration in the request and handle tool-augmented\n * responses.\n *\n * @packageDocumentation\n */\n\nimport { isJsonObject, type JsonObject } from '@fgv/ts-json-base';\nimport { fail, type Logging, mapResults, Result, succeed, type Validator, Validators } from '@fgv/ts-utils';\n\nimport {\n AiPrompt,\n type AiModelCapability,\n type AiServerToolConfig,\n type IAiCompletionResponse,\n type IAiGeneratedImage,\n type IAiImageAttachment,\n type IAiImageGenerationOptions,\n type IAiImageGenerationParams,\n type IAiImageGenerationResponse,\n type IAiModelCapabilityConfig,\n type IAiModelCapabilityRule,\n type IAiModelInfo,\n type IAiProviderDescriptor,\n type IChatMessage,\n type ModelSpec,\n resolveModel\n} from './model';\nimport {\n buildAnthropicMessages,\n buildGeminiContents,\n buildMessages,\n buildOpenAiChatUserContent,\n buildOpenAiResponsesUserContent\n} from './chatRequestBuilders';\nimport { DEFAULT_MODEL_CAPABILITY_CONFIG, resolveImageCapability, supportsImageGeneration } from './registry';\nimport { toAnthropicTools, toGeminiTools, toResponsesApiTools } from './toolFormats';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Internal API configuration built from a provider descriptor.\n * @internal\n */\ninterface IAiApiConfig {\n readonly baseUrl: string;\n readonly apiKey: string;\n readonly model: string;\n}\n\n/**\n * Parameters for a provider completion request.\n * @public\n */\nexport interface IProviderCompletionParams {\n /** The provider descriptor */\n readonly descriptor: IAiProviderDescriptor;\n /** API key for authentication */\n readonly apiKey: string;\n /** The structured prompt to send */\n readonly prompt: AiPrompt;\n /**\n * Additional messages to append after system+user (e.g. for correction retries).\n * These are appended in order after the initial system and user messages.\n */\n readonly additionalMessages?: ReadonlyArray<IChatMessage>;\n /** Sampling temperature (default: 0.7) */\n readonly temperature?: number;\n /** Optional model override — string or context-aware map (uses descriptor.defaultModel otherwise) */\n readonly modelOverride?: ModelSpec;\n /** Optional logger for request/response observability. */\n readonly logger?: Logging.ILogger;\n /** Server-side tools to include in the request. Overrides settings-level tool config when provided. */\n readonly tools?: ReadonlyArray<AiServerToolConfig>;\n /** Optional abort signal for cancelling the in-flight request. */\n readonly signal?: AbortSignal;\n}\n\n// ============================================================================\n// Shared helpers\n// ============================================================================\n\n/**\n * Makes an HTTP request and returns the parsed JSON, or a failure.\n * @internal\n */\nasync function fetchJson(\n url: string,\n headers: Record<string, string>,\n body: unknown,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<JsonObject>> {\n /* c8 ignore next 1 - optional logger */\n logger?.detail(`AI API request: POST ${url}`);\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers\n },\n body: JSON.stringify(body),\n signal\n });\n } catch (err: unknown) {\n const detail = err instanceof Error ? err.message : String(err);\n /* c8 ignore next 1 - optional logger */\n logger?.error(`AI API request failed: ${detail}`);\n return fail(`AI API request failed: ${detail}`);\n }\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'unknown error');\n /* c8 ignore next 1 - optional logger */\n logger?.error(`AI API returned ${response.status}: ${errorText}`);\n return fail(`AI API returned ${response.status}: ${errorText}`);\n }\n\n /* c8 ignore next 1 - optional logger */\n logger?.detail(`AI API response: ${response.status}`);\n\n let json: unknown;\n try {\n json = await response.json();\n } catch {\n /* c8 ignore next 1 - optional logger */\n logger?.error('AI API returned invalid JSON response');\n return fail('AI API returned invalid JSON response');\n }\n\n if (!isJsonObject(json)) {\n /* c8 ignore next 1 - optional logger */\n logger?.error('AI API returned non-object JSON response');\n return fail('AI API returned non-object JSON response');\n }\n return succeed(json);\n}\n\n/**\n * Makes a multipart/form-data POST request and returns the parsed JSON, or a\n * failure. The Content-Type header (with boundary) is set automatically by\n * `fetch` from the `FormData` body — callers must NOT pass it explicitly.\n * @internal\n */\nasync function fetchMultipart(\n url: string,\n headers: Record<string, string>,\n body: FormData,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<JsonObject>> {\n /* c8 ignore next 1 - optional logger */\n logger?.detail(`AI API request: POST ${url} (multipart)`);\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: 'POST',\n headers,\n body,\n signal\n });\n } catch (err: unknown) {\n const detail = err instanceof Error ? err.message : String(err);\n /* c8 ignore next 1 - optional logger */\n logger?.error(`AI API request failed: ${detail}`);\n return fail(`AI API request failed: ${detail}`);\n }\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'unknown error');\n /* c8 ignore next 1 - optional logger */\n logger?.error(`AI API returned ${response.status}: ${errorText}`);\n return fail(`AI API returned ${response.status}: ${errorText}`);\n }\n\n /* c8 ignore next 1 - optional logger */\n logger?.detail(`AI API response: ${response.status}`);\n\n let json: unknown;\n try {\n json = await response.json();\n } catch {\n /* c8 ignore next 1 - optional logger */\n logger?.error('AI API returned invalid JSON response');\n return fail('AI API returned invalid JSON response');\n }\n\n if (!isJsonObject(json)) {\n /* c8 ignore next 1 - optional logger */\n logger?.error('AI API returned non-object JSON response');\n return fail('AI API returned non-object JSON response');\n }\n return succeed(json);\n}\n\n/**\n * Decodes a base64-encoded image attachment into a `Blob` suitable for use as\n * a multipart file field. On Node hands the `Buffer` straight to `Blob`\n * (Buffer extends Uint8Array) to skip an intermediate copy; falls back to\n * `atob` in browsers. Inputs come from `FileReader` or prior provider\n * responses, which are trusted to be valid. Note that Node's\n * `Buffer.from(..., 'base64')` silently strips invalid characters rather\n * than throwing, so failures are only observable in the browser path.\n * @internal\n */\nfunction attachmentToBlob(attachment: IAiImageAttachment): Result<Blob> {\n if (typeof Buffer !== 'undefined') {\n return succeed(new Blob([Buffer.from(attachment.base64, 'base64')], { type: attachment.mimeType }));\n }\n /* c8 ignore start - Browser-only fallback cannot be tested in Node.js environment */\n try {\n const binary = atob(attachment.base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return succeed(new Blob([bytes], { type: attachment.mimeType }));\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return fail(`Invalid base64: ${message}`);\n }\n /* c8 ignore stop */\n}\n\n/**\n * Maps a MIME type to a sensible file extension for multipart filenames.\n * @internal\n */\nfunction extensionForMimeType(mimeType: string): string {\n switch (mimeType) {\n case 'image/png':\n return 'png';\n case 'image/jpeg':\n case 'image/jpg':\n return 'jpg';\n case 'image/webp':\n return 'webp';\n case 'image/gif':\n return 'gif';\n default:\n return 'bin';\n }\n}\n\n/**\n * Makes an HTTP GET request and returns the parsed JSON, or a failure.\n * @internal\n */\nasync function fetchGetJson(\n url: string,\n headers: Record<string, string>,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<JsonObject>> {\n /* c8 ignore next 1 - optional logger */\n logger?.detail(`AI API request: GET ${url}`);\n\n let response: Response;\n try {\n response = await fetch(url, { method: 'GET', headers, signal });\n } catch (err: unknown) {\n const detail = err instanceof Error ? err.message : String(err);\n /* c8 ignore next 1 - optional logger */\n logger?.error(`AI API request failed: ${detail}`);\n return fail(`AI API request failed: ${detail}`);\n }\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'unknown error');\n /* c8 ignore next 1 - optional logger */\n logger?.error(`AI API returned ${response.status}: ${errorText}`);\n return fail(`AI API returned ${response.status}: ${errorText}`);\n }\n\n /* c8 ignore next 1 - optional logger */\n logger?.detail(`AI API response: ${response.status}`);\n\n let json: unknown;\n try {\n json = await response.json();\n } catch {\n /* c8 ignore next 1 - optional logger */\n logger?.error('AI API returned invalid JSON response');\n return fail('AI API returned invalid JSON response');\n }\n\n if (!isJsonObject(json)) {\n /* c8 ignore next 1 - optional logger */\n logger?.error('AI API returned non-object JSON response');\n return fail('AI API returned non-object JSON response');\n }\n return succeed(json);\n}\n\n// ============================================================================\n// Response validators (non-strict — extra API fields preserved for debugging)\n// ============================================================================\n\n// ---- OpenAI Chat Completions format ----\n\n/** @internal */\ninterface IOpenAiMessage {\n content: string;\n}\n/** @internal */\ninterface IOpenAiChoice {\n message: IOpenAiMessage;\n finish_reason: string;\n}\n/** @internal */\ninterface IOpenAiResponse {\n choices: IOpenAiChoice[];\n}\n\nconst openAiMessage: Validator<IOpenAiMessage> = Validators.object<IOpenAiMessage>({\n content: Validators.string\n});\nconst openAiChoice: Validator<IOpenAiChoice> = Validators.object<IOpenAiChoice>({\n message: openAiMessage,\n finish_reason: Validators.string\n});\nconst openAiResponse: Validator<IOpenAiResponse> = Validators.object<IOpenAiResponse>({\n choices: Validators.arrayOf(openAiChoice).withConstraint((arr) => arr.length > 0)\n});\n\n// ---- OpenAI/xAI Responses API format ----\n\n/** @internal */\ninterface IResponsesApiOutputText {\n type: 'output_text';\n text: string;\n}\n/** @internal */\ninterface IResponsesApiMessage {\n type: 'message';\n role: string;\n content: IResponsesApiOutputText[];\n}\n/** @internal */\ninterface IResponsesApiResponse {\n output: Array<Record<string, unknown>>;\n status: string;\n}\n\nconst responsesApiOutputText: Validator<IResponsesApiOutputText> = Validators.object<IResponsesApiOutputText>(\n {\n type: Validators.literal('output_text'),\n text: Validators.string\n }\n);\nconst responsesApiMessage: Validator<IResponsesApiMessage> = Validators.object<IResponsesApiMessage>({\n type: Validators.literal('message'),\n role: Validators.string,\n content: Validators.arrayOf(responsesApiOutputText).withConstraint((arr) => arr.length > 0)\n});\nconst responsesApiOutputItem: Validator<Record<string, unknown>> = Validators.isA(\n 'object',\n (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null\n);\nconst responsesApiResponse: Validator<IResponsesApiResponse> = Validators.object<IResponsesApiResponse>({\n output: Validators.arrayOf(responsesApiOutputItem).withConstraint((arr) => arr.length > 0),\n status: Validators.string\n});\n\n// ---- Anthropic format ----\n\n/** @internal */\ninterface IAnthropicContentBlock {\n text: string;\n}\n/** @internal */\ninterface IAnthropicResponse {\n content: IAnthropicContentBlock[];\n stop_reason: string;\n}\n\nconst anthropicContentBlock: Validator<IAnthropicContentBlock> = Validators.object<IAnthropicContentBlock>({\n text: Validators.string\n});\nconst anthropicResponse: Validator<IAnthropicResponse> = Validators.object<IAnthropicResponse>({\n content: Validators.arrayOf(anthropicContentBlock).withConstraint((arr) => arr.length > 0),\n stop_reason: Validators.string\n});\n\n// ---- Gemini format ----\n\n/** @internal */\ninterface IGeminiPart {\n text: string;\n}\n/** @internal */\ninterface IGeminiContent {\n parts: IGeminiPart[];\n}\n/** @internal */\ninterface IGeminiCandidate {\n content: IGeminiContent;\n finishReason: string;\n}\n/** @internal */\ninterface IGeminiResponse {\n candidates: IGeminiCandidate[];\n}\n\nconst geminiPart: Validator<IGeminiPart> = Validators.object<IGeminiPart>({\n text: Validators.string\n});\nconst geminiContent: Validator<IGeminiContent> = Validators.object<IGeminiContent>({\n parts: Validators.arrayOf(geminiPart).withConstraint((arr) => arr.length > 0)\n});\nconst geminiCandidate: Validator<IGeminiCandidate> = Validators.object<IGeminiCandidate>({\n content: geminiContent,\n finishReason: Validators.string\n});\nconst geminiResponse: Validator<IGeminiResponse> = Validators.object<IGeminiResponse>({\n candidates: Validators.arrayOf(geminiCandidate).withConstraint((arr) => arr.length > 0)\n});\n\n// ============================================================================\n// OpenAI-compatible client (Chat Completions — no tools)\n// ============================================================================\n\n/**\n * Calls an OpenAI-compatible chat completion endpoint.\n * Works for xAI Grok, OpenAI, Groq, and Mistral.\n * @internal\n */\nasync function callOpenAiCompletion(\n config: IAiApiConfig,\n prompt: AiPrompt,\n additionalMessages?: ReadonlyArray<IChatMessage>,\n temperature: number = 0.7,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<IAiCompletionResponse>> {\n const url = `${config.baseUrl}/chat/completions`;\n const messages = buildMessages(prompt.system, buildOpenAiChatUserContent(prompt), {\n tail: additionalMessages\n });\n const body = { model: config.model, messages, temperature };\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`\n };\n\n /* c8 ignore next 1 - optional logger */\n logger?.info(`OpenAI completion: model=${config.model}`);\n const jsonResult = await fetchJson(url, headers, body, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n return openAiResponse\n .validate(jsonResult.value)\n .withErrorFormat((msg) => `OpenAI API response: ${msg}`)\n .onSuccess((response) => {\n const choice = response.choices[0];\n return succeed({\n content: choice.message.content,\n truncated: choice.finish_reason === 'length'\n });\n });\n}\n\n// ============================================================================\n// OpenAI/xAI Responses API (with tools)\n// ============================================================================\n\n/**\n * Extracts text content from a Responses API output array.\n * Finds the first message-type output item and concatenates its text content blocks.\n * @internal\n */\nfunction extractResponsesApiText(output: Array<Record<string, unknown>>): Result<string> {\n for (const item of output) {\n if (item.type === 'message') {\n const messageResult = responsesApiMessage.validate(item as JsonObject);\n if (messageResult.isSuccess()) {\n return succeed(messageResult.value.content.map((c) => c.text).join(''));\n }\n }\n }\n return fail('Responses API output contained no message with text content');\n}\n\n/**\n * Calls the xAI/OpenAI Responses API with server-side tools.\n * Used when tools are configured for an openai-format provider.\n * @internal\n */\nasync function callOpenAiResponsesCompletion(\n config: IAiApiConfig,\n prompt: AiPrompt,\n tools: ReadonlyArray<AiServerToolConfig>,\n additionalMessages?: ReadonlyArray<IChatMessage>,\n temperature: number = 0.7,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<IAiCompletionResponse>> {\n const url = `${config.baseUrl}/responses`;\n const input = buildMessages(prompt.system, buildOpenAiResponsesUserContent(prompt), {\n tail: additionalMessages\n });\n const body: Record<string, unknown> = {\n model: config.model,\n input,\n tools: toResponsesApiTools(tools),\n temperature\n };\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`\n };\n\n /* c8 ignore next 1 - optional logger */\n logger?.info(`OpenAI Responses API: model=${config.model}, tools=${tools.map((t) => t.type).join(',')}`);\n const jsonResult = await fetchJson(url, headers, body, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n return responsesApiResponse\n .validate(jsonResult.value)\n .withErrorFormat((msg) => `Responses API response: ${msg}`)\n .onSuccess((response) => {\n return extractResponsesApiText(response.output).onSuccess((text) =>\n succeed({\n content: text,\n truncated: response.status === 'incomplete'\n })\n );\n });\n}\n\n// ============================================================================\n// Anthropic adapter\n// ============================================================================\n\n/**\n * Extracts text content from Anthropic response content blocks.\n * When tools are used, the content array contains mixed block types\n * (text, server_tool_use, web_search_tool_result). We extract and\n * concatenate only the text blocks.\n * @internal\n */\nfunction extractAnthropicText(content: unknown[]): Result<string> {\n const textParts: string[] = [];\n for (const block of content) {\n if (typeof block === 'object' && block !== null && 'type' in block) {\n const typed = block as Record<string, unknown>;\n if (typed.type === 'text' && typeof typed.text === 'string') {\n textParts.push(typed.text);\n }\n }\n }\n if (textParts.length === 0) {\n return fail('Anthropic response contained no text content blocks');\n }\n return succeed(textParts.join(''));\n}\n\n/**\n * Calls the Anthropic Messages API.\n * When tools are configured, includes them in the request and handles\n * mixed content block responses.\n * @internal\n */\nasync function callAnthropicCompletion(\n config: IAiApiConfig,\n prompt: AiPrompt,\n additionalMessages?: ReadonlyArray<IChatMessage>,\n temperature: number = 0.7,\n logger?: Logging.ILogger,\n tools?: ReadonlyArray<AiServerToolConfig>,\n signal?: AbortSignal\n): Promise<Result<IAiCompletionResponse>> {\n const url = `${config.baseUrl}/messages`;\n\n // Anthropic uses system as a top-level field, not in messages\n const messages = buildAnthropicMessages(prompt, { tail: additionalMessages });\n\n const body: Record<string, unknown> = {\n model: config.model,\n system: prompt.system,\n messages,\n max_tokens: 4096,\n temperature\n };\n\n if (tools && tools.length > 0) {\n body.tools = toAnthropicTools(tools);\n /* c8 ignore next 3 - optional logger diagnostic output */\n logger?.info(`Anthropic completion: model=${config.model}, tools=${tools.map((t) => t.type).join(',')}`);\n } else {\n /* c8 ignore next 1 - optional logger */\n logger?.info(`Anthropic completion: model=${config.model}`);\n }\n\n const headers: Record<string, string> = {\n 'x-api-key': config.apiKey,\n 'anthropic-version': '2023-06-01',\n 'anthropic-dangerous-direct-browser-access': 'true'\n };\n\n const jsonResult = await fetchJson(url, headers, body, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n\n // When tools are used, the response content is a mixed array of block types.\n // We need to extract text from all text blocks.\n if (tools && tools.length > 0) {\n const rawContent = (jsonResult.value as Record<string, unknown>).content;\n const stopReason = (jsonResult.value as Record<string, unknown>).stop_reason;\n if (!Array.isArray(rawContent)) {\n return fail('Anthropic API response: content is not an array');\n }\n return extractAnthropicText(rawContent).onSuccess((text) =>\n succeed({\n content: text,\n truncated: stopReason === 'max_tokens'\n })\n );\n }\n\n return anthropicResponse\n .validate(jsonResult.value)\n .withErrorFormat((msg) => `Anthropic API response: ${msg}`)\n .onSuccess((response) => {\n return succeed({\n content: response.content[0].text,\n truncated: response.stop_reason === 'max_tokens'\n });\n });\n}\n\n// ============================================================================\n// Google Gemini adapter\n// ============================================================================\n\n/**\n * Calls the Google Gemini generateContent API.\n * When tools are configured, includes Google Search grounding.\n * @internal\n */\nasync function callGeminiCompletion(\n config: IAiApiConfig,\n prompt: AiPrompt,\n additionalMessages?: ReadonlyArray<IChatMessage>,\n temperature: number = 0.7,\n logger?: Logging.ILogger,\n tools?: ReadonlyArray<AiServerToolConfig>,\n signal?: AbortSignal\n): Promise<Result<IAiCompletionResponse>> {\n const url = `${config.baseUrl}/models/${config.model}:generateContent`;\n\n // Gemini uses 'contents' with 'parts', and 'model' role instead of 'assistant'\n const contents = buildGeminiContents(prompt, { tail: additionalMessages });\n\n const body: Record<string, unknown> = {\n systemInstruction: { parts: [{ text: prompt.system }] },\n contents,\n generationConfig: { temperature }\n };\n\n if (tools && tools.length > 0) {\n body.tools = toGeminiTools(tools);\n /* c8 ignore next 1 - optional logger */\n logger?.info(`Gemini completion: model=${config.model}, tools=${tools.map((t) => t.type).join(',')}`);\n } else {\n /* c8 ignore next 1 - optional logger */\n logger?.info(`Gemini completion: model=${config.model}`);\n }\n\n const headers: Record<string, string> = {\n 'x-goog-api-key': config.apiKey\n };\n\n const jsonResult = await fetchJson(url, headers, body, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n return geminiResponse\n .validate(jsonResult.value)\n .withErrorFormat((msg) => `Gemini API response: ${msg}`)\n .onSuccess((response) => {\n const candidate = response.candidates[0];\n return succeed({\n content: candidate.content.parts[0].text,\n truncated: candidate.finishReason === 'MAX_TOKENS'\n });\n });\n}\n\n// ============================================================================\n// Provider dispatcher\n// ============================================================================\n\n/**\n * Calls the appropriate chat completion API for a given provider.\n *\n * Routes based on the provider descriptor's `apiFormat` field:\n * - `'openai'` for xAI, OpenAI, Groq, Mistral\n * - `'anthropic'` for Anthropic Claude\n * - `'gemini'` for Google Gemini\n *\n * When tools are provided and the provider supports them:\n * - OpenAI-format providers switch to the Responses API\n * - Anthropic includes tools in the Messages API request\n * - Gemini includes Google Search grounding\n *\n * @param params - Request parameters including descriptor, API key, prompt, and optional tools\n * @returns The completion response with content and truncation status, or a failure\n * @public\n */\nexport async function callProviderCompletion(\n params: IProviderCompletionParams\n): Promise<Result<IAiCompletionResponse>> {\n const {\n descriptor,\n apiKey,\n prompt,\n additionalMessages,\n temperature = 0.7,\n modelOverride,\n logger,\n tools,\n signal\n } = params;\n\n if (!descriptor.baseUrl) {\n return fail(`provider \"${descriptor.id}\" has no API endpoint configured`);\n }\n if (prompt.attachments.length > 0 && !descriptor.acceptsImageInput) {\n return fail(`provider \"${descriptor.id}\" does not accept image input`);\n }\n\n const hasTools = tools !== undefined && tools.length > 0;\n const modelContext = hasTools ? 'tools' : undefined;\n\n const config: IAiApiConfig = {\n baseUrl: descriptor.baseUrl,\n apiKey,\n model: resolveModel(modelOverride ?? descriptor.defaultModel, modelContext)\n };\n /* c8 ignore next 8 - optional logger diagnostic output */\n if (logger) {\n const toolTypes = hasTools ? tools.map((t) => t.type).join(',') : 'none';\n const supported = descriptor.supportedTools.length > 0 ? descriptor.supportedTools.join(',') : 'none';\n logger.info(\n `AI completion: provider=${descriptor.id}, format=${descriptor.apiFormat}, model=${config.model}, ` +\n `tools=${toolTypes}, supported=${supported}`\n );\n }\n\n switch (descriptor.apiFormat) {\n case 'openai':\n if (hasTools) {\n return callOpenAiResponsesCompletion(\n config,\n prompt,\n tools,\n additionalMessages,\n temperature,\n logger,\n signal\n );\n }\n return callOpenAiCompletion(config, prompt, additionalMessages, temperature, logger, signal);\n case 'anthropic':\n return callAnthropicCompletion(config, prompt, additionalMessages, temperature, logger, tools, signal);\n case 'gemini':\n return callGeminiCompletion(config, prompt, additionalMessages, temperature, logger, tools, signal);\n /* c8 ignore next 4 - defensive coding: exhaustive switch guaranteed by TypeScript */\n default: {\n const _exhaustive: never = descriptor.apiFormat;\n return fail(`unsupported API format: ${String(_exhaustive)}`);\n }\n }\n}\n\n// ============================================================================\n// Image generation — request types\n// ============================================================================\n\n/**\n * Parameters for an image-generation request.\n * @public\n */\nexport interface IProviderImageGenerationParams {\n /** The provider descriptor */\n readonly descriptor: IAiProviderDescriptor;\n /** API key for authentication */\n readonly apiKey: string;\n /** The image-generation request */\n readonly params: IAiImageGenerationParams;\n /** Optional model override — string or context-aware map (uses descriptor.defaultModel.image otherwise) */\n readonly modelOverride?: ModelSpec;\n /** Optional logger for request/response observability. */\n readonly logger?: Logging.ILogger;\n /** Optional abort signal for cancelling the in-flight request. */\n readonly signal?: AbortSignal;\n}\n\n// ============================================================================\n// Image generation — response validators\n// ============================================================================\n\n// ---- OpenAI / xAI images format ----\n\n/** @internal */\ninterface IOpenAiImageItem {\n b64_json: string;\n revised_prompt?: string;\n}\n/** @internal */\ninterface IOpenAiImageResponse {\n data: IOpenAiImageItem[];\n}\n\nconst openAiImageItem: Validator<IOpenAiImageItem> = Validators.object<IOpenAiImageItem>({\n b64_json: Validators.string,\n revised_prompt: Validators.string.optional()\n});\nconst openAiImageResponse: Validator<IOpenAiImageResponse> = Validators.object<IOpenAiImageResponse>({\n data: Validators.arrayOf(openAiImageItem).withConstraint((arr) => arr.length > 0)\n});\n\n// ---- Gemini Imagen format ----\n\n/** @internal */\ninterface IImagenPrediction {\n bytesBase64Encoded: string;\n mimeType?: string;\n}\n/** @internal */\ninterface IImagenResponse {\n predictions: IImagenPrediction[];\n}\n\nconst imagenPrediction: Validator<IImagenPrediction> = Validators.object<IImagenPrediction>({\n bytesBase64Encoded: Validators.string,\n mimeType: Validators.string.optional()\n});\nconst imagenResponse: Validator<IImagenResponse> = Validators.object<IImagenResponse>({\n predictions: Validators.arrayOf(imagenPrediction).withConstraint((arr) => arr.length > 0)\n});\n\n// ---- Gemini image-out (`:generateContent` returning image parts) format ----\n\n/** @internal */\ninterface IGeminiImageInlineData {\n mimeType: string;\n data: string;\n}\n/** @internal */\ninterface IGeminiImageOutPart {\n text?: string;\n inlineData?: IGeminiImageInlineData;\n}\n/** @internal */\ninterface IGeminiImageOutContent {\n parts: IGeminiImageOutPart[];\n}\n/** @internal */\ninterface IGeminiImageOutCandidate {\n content: IGeminiImageOutContent;\n finishReason?: string;\n}\n/** @internal */\ninterface IGeminiImageOutResponse {\n candidates: IGeminiImageOutCandidate[];\n}\n\nconst geminiImageInlineData: Validator<IGeminiImageInlineData> = Validators.object<IGeminiImageInlineData>({\n mimeType: Validators.string,\n data: Validators.string\n});\nconst geminiImageOutPart: Validator<IGeminiImageOutPart> = Validators.object<IGeminiImageOutPart>({\n text: Validators.string.optional(),\n inlineData: geminiImageInlineData.optional()\n});\nconst geminiImageOutContent: Validator<IGeminiImageOutContent> = Validators.object<IGeminiImageOutContent>({\n parts: Validators.arrayOf(geminiImageOutPart).withConstraint((arr) => arr.length > 0)\n});\nconst geminiImageOutCandidate: Validator<IGeminiImageOutCandidate> =\n Validators.object<IGeminiImageOutCandidate>({\n content: geminiImageOutContent,\n finishReason: Validators.string.optional()\n });\nconst geminiImageOutResponse: Validator<IGeminiImageOutResponse> = Validators.object<IGeminiImageOutResponse>(\n {\n candidates: Validators.arrayOf(geminiImageOutCandidate).withConstraint((arr) => arr.length > 0)\n }\n);\n\n// ---- Proxied image generation response ----\n\nconst proxiedGeneratedImage: Validator<IAiGeneratedImage> = Validators.object<IAiGeneratedImage>({\n mimeType: Validators.string,\n base64: Validators.string,\n revisedPrompt: Validators.string.optional()\n});\nconst proxiedImageGenerationResponse: Validator<IAiImageGenerationResponse> =\n Validators.object<IAiImageGenerationResponse>({\n images: Validators.arrayOf(proxiedGeneratedImage).withConstraint((arr) => arr.length > 0)\n });\n\n// ---- Proxied list-models response ----\n\n/**\n * Wire shape for proxy list-models responses. `capabilities` arrives as an\n * array (Sets don't survive JSON), then gets reassembled into a `Set` in\n * {@link callProxiedListModels}.\n * @internal\n */\ninterface IProxiedListModelsEntry {\n id: string;\n capabilities: AiModelCapability[];\n displayName?: string;\n}\n/** @internal */\ninterface IProxiedListModelsBody {\n models: IProxiedListModelsEntry[];\n}\n\nconst proxiedListModelsEntry: Validator<IProxiedListModelsEntry> = Validators.object<IProxiedListModelsEntry>(\n {\n id: Validators.string,\n capabilities: Validators.arrayOf(\n Validators.enumeratedValue<AiModelCapability>(['chat', 'tools', 'vision', 'image-generation'])\n ),\n displayName: Validators.string.optional()\n }\n);\nconst proxiedListModelsResponse: Validator<IProxiedListModelsBody> =\n Validators.object<IProxiedListModelsBody>({\n models: Validators.arrayOf(proxiedListModelsEntry)\n });\n\n// ============================================================================\n// Image generation — adapters\n// ============================================================================\n\n/**\n * Calls the OpenAI Images API. Used for both `openai-images` and `xai-images`\n * formats — the request shape is the same; the only difference is whether the\n * `size` field is honored (OpenAI: yes, xAI: ignored at the provider).\n *\n * When `request.referenceImages` is non-empty, routes to `/images/edits`\n * (multipart) instead of `/images/generations` (JSON). Per-model edit support\n * is not validated here (e.g. dall-e-3 does not support edits) — the\n * provider's 400 surfaces through the failure path.\n *\n * @internal\n */\nasync function callOpenAiImageGeneration(\n config: IAiApiConfig,\n request: IAiImageGenerationParams,\n defaultMimeType: string,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<IAiImageGenerationResponse>> {\n const opts: IAiImageGenerationOptions = request.options ?? {};\n const refs = request.referenceImages ?? [];\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`\n };\n const n = opts.count ?? 1;\n\n const fetched =\n refs.length > 0\n ? await callOpenAiImagesEdits(config, request, headers, n, refs, logger, signal)\n : await callOpenAiImagesGenerations(config, request, headers, n, logger, signal);\n\n return fetched.onSuccess((json) =>\n openAiImageResponse\n .validate(json)\n .withErrorFormat((msg) => `OpenAI images API response: ${msg}`)\n .onSuccess((response) =>\n succeed({\n images: response.data.map((item) => ({\n mimeType: defaultMimeType,\n base64: item.b64_json,\n ...(item.revised_prompt !== undefined ? { revisedPrompt: item.revised_prompt } : {})\n }))\n })\n )\n );\n}\n\n/**\n * Builds and posts the JSON `/images/generations` request (no refs).\n * @internal\n */\nfunction callOpenAiImagesGenerations(\n config: IAiApiConfig,\n request: IAiImageGenerationParams,\n headers: Record<string, string>,\n n: number,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<JsonObject>> {\n const opts: IAiImageGenerationOptions = request.options ?? {};\n const body: Record<string, unknown> = {\n model: config.model,\n prompt: request.prompt,\n n,\n response_format: 'b64_json'\n };\n if (opts.size !== undefined) {\n body.size = opts.size;\n }\n if (opts.quality !== undefined) {\n body.quality = opts.quality;\n }\n if (opts.seed !== undefined) {\n body.seed = opts.seed;\n }\n /* c8 ignore next 1 - optional logger */\n logger?.info(`Image generation: model=${config.model}, n=${n}`);\n return fetchJson(`${config.baseUrl}/images/generations`, headers, body, logger, signal);\n}\n\n/**\n * Builds and posts the multipart `/images/edits` request (with refs).\n * @internal\n */\nasync function callOpenAiImagesEdits(\n config: IAiApiConfig,\n request: IAiImageGenerationParams,\n headers: Record<string, string>,\n n: number,\n refs: ReadonlyArray<IAiImageAttachment>,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<JsonObject>> {\n const blobsResult = mapResults(\n refs.map((ref, i) => attachmentToBlob(ref).withErrorFormat((msg) => `reference image ${i}: ${msg}`))\n );\n /* c8 ignore next 3 - decode failure unreachable via Node's Buffer.from (silently strips invalid input) */\n if (blobsResult.isFailure()) {\n return fail(blobsResult.message);\n }\n\n const opts: IAiImageGenerationOptions = request.options ?? {};\n const form = new FormData();\n form.append('model', config.model);\n form.append('prompt', request.prompt);\n form.append('n', String(n));\n form.append('response_format', 'b64_json');\n if (opts.size !== undefined) {\n form.append('size', opts.size);\n }\n if (opts.quality !== undefined) {\n form.append('quality', opts.quality);\n }\n if (opts.seed !== undefined) {\n form.append('seed', String(opts.seed));\n }\n blobsResult.value.forEach((blob, i) => {\n form.append('image[]', blob, `ref-${i}.${extensionForMimeType(refs[i].mimeType)}`);\n });\n /* c8 ignore next 1 - optional logger */\n logger?.info(`Image edit: model=${config.model}, n=${n}, refs=${refs.length}`);\n return fetchMultipart(`${config.baseUrl}/images/edits`, headers, form, logger, signal);\n}\n\n/**\n * Calls Gemini's chat-style `:generateContent` endpoint for image output\n * (Gemini 2.5 Flash Image / \"Nano Banana\"). Accepts reference images, which\n * are passed as `inlineData` parts alongside the text prompt.\n *\n * @internal\n */\nasync function callGeminiImageOutGeneration(\n config: IAiApiConfig,\n request: IAiImageGenerationParams,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<IAiImageGenerationResponse>> {\n const url = `${config.baseUrl}/models/${config.model}:generateContent`;\n const refs = request.referenceImages ?? [];\n const parts: Array<Record<string, unknown>> = [{ text: request.prompt }];\n for (const ref of refs) {\n parts.push({ inlineData: { mimeType: ref.mimeType, data: ref.base64 } });\n }\n const body: Record<string, unknown> = {\n contents: [{ role: 'user', parts }]\n };\n const headers: Record<string, string> = {\n 'x-goog-api-key': config.apiKey\n };\n\n /* c8 ignore next 1 - optional logger */\n logger?.info(`Gemini image-out: model=${config.model}, refs=${refs.length}`);\n return (await fetchJson(url, headers, body, logger, signal)).onSuccess((json) =>\n geminiImageOutResponse\n .validate(json)\n .withErrorFormat((msg) => `Gemini image API response: ${msg}`)\n .onSuccess((response) => {\n const images: IAiGeneratedImage[] = [];\n for (const candidate of response.candidates) {\n for (const part of candidate.content.parts) {\n if (part.inlineData) {\n images.push({\n mimeType: part.inlineData.mimeType,\n base64: part.inlineData.data\n });\n }\n }\n }\n if (images.length === 0) {\n return fail('Gemini image API response: no image parts in response');\n }\n return succeed({ images });\n })\n );\n}\n\n/**\n * Calls the Gemini Imagen `:predict` endpoint.\n * @internal\n */\nasync function callImagenGeneration(\n config: IAiApiConfig,\n request: IAiImageGenerationParams,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<IAiImageGenerationResponse>> {\n const url = `${config.baseUrl}/models/${config.model}:predict`;\n const opts: IAiImageGenerationOptions = request.options ?? {};\n const parameters: Record<string, unknown> = {\n sampleCount: opts.count ?? 1\n };\n if (opts.imagen?.aspectRatio !== undefined) {\n parameters.aspectRatio = opts.imagen.aspectRatio;\n }\n if (opts.imagen?.negativePrompt !== undefined) {\n parameters.negativePrompt = opts.imagen.negativePrompt;\n }\n if (opts.seed !== undefined) {\n parameters.seed = opts.seed;\n }\n\n const body: Record<string, unknown> = {\n instances: [{ prompt: request.prompt }],\n parameters\n };\n\n const headers: Record<string, string> = {\n 'x-goog-api-key': config.apiKey\n };\n\n /* c8 ignore next 1 - optional logger */\n logger?.info(`Imagen generation: model=${config.model}, n=${parameters.sampleCount}`);\n const jsonResult = await fetchJson(url, headers, body, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n return imagenResponse\n .validate(jsonResult.value)\n .withErrorFormat((msg) => `Imagen API response: ${msg}`)\n .onSuccess((response) => {\n const images: IAiGeneratedImage[] = response.predictions.map((p) => ({\n mimeType: p.mimeType ?? 'image/png',\n base64: p.bytesBase64Encoded\n }));\n return succeed({ images });\n });\n}\n\n// ============================================================================\n// Image generation — dispatcher\n// ============================================================================\n\n/**\n * Calls the appropriate image-generation API for a given provider.\n *\n * Resolves a {@link IAiImageModelCapability} from\n * {@link IAiProviderDescriptor.imageGeneration} for the requested model and\n * routes by its `format`:\n * - `'openai-images'` for OpenAI (DALL-E, gpt-image-1)\n * - `'xai-images'` for xAI Grok image models\n * - `'gemini-imagen'` for Google Imagen `:predict`\n * - `'gemini-image-out'` for Gemini chat-style image output (Nano Banana)\n *\n * Image-model selection reuses the existing `'image'` {@link ModelSpecKey}.\n * When `request.referenceImages` is non-empty, the call is rejected up front\n * unless the resolved capability declares `acceptsImageReferenceInput`.\n *\n * @param params - Request parameters including descriptor, API key, and prompt\n * @returns The generated images, or a failure\n * @public\n */\nexport async function callProviderImageGeneration(\n params: IProviderImageGenerationParams\n): Promise<Result<IAiImageGenerationResponse>> {\n const { descriptor, apiKey, params: request, modelOverride, logger, signal } = params;\n\n if (!supportsImageGeneration(descriptor)) {\n return fail(`provider \"${descriptor.id}\" does not support image generation`);\n }\n if (!descriptor.baseUrl) {\n return fail(`provider \"${descriptor.id}\" has no API endpoint configured`);\n }\n\n const model = resolveModel(modelOverride ?? descriptor.defaultModel, 'image');\n const capability = resolveImageCapability(descriptor, model);\n if (capability === undefined) {\n return fail(`provider \"${descriptor.id}\" does not support image generation for model \"${model}\"`);\n }\n if ((request.referenceImages?.length ?? 0) > 0 && !capability.acceptsImageReferenceInput) {\n return fail(`model \"${model}\" does not support reference images`);\n }\n\n const config: IAiApiConfig = {\n baseUrl: descriptor.baseUrl,\n apiKey,\n model\n };\n /* c8 ignore next 6 - optional logger diagnostic output */\n if (logger) {\n logger.info(\n `AI image generation: provider=${descriptor.id}, format=${capability.format}, ` +\n `model=${config.model}`\n );\n }\n\n switch (capability.format) {\n case 'openai-images':\n return callOpenAiImageGeneration(config, request, 'image/png', logger, signal);\n case 'xai-images':\n return callOpenAiImageGeneration(config, request, 'image/jpeg', logger, signal);\n case 'gemini-imagen':\n return callImagenGeneration(config, request, logger, signal);\n case 'gemini-image-out':\n return callGeminiImageOutGeneration(config, request, logger, signal);\n /* c8 ignore next 4 - defensive coding: exhaustive switch guaranteed by TypeScript */\n default: {\n const _exhaustive: never = capability.format;\n return fail(`unsupported image API format: ${String(_exhaustive)}`);\n }\n }\n}\n\n// ============================================================================\n// List models — request types\n// ============================================================================\n\n/**\n * Parameters for a list-models request.\n * @public\n */\nexport interface IProviderListModelsParams {\n /** The provider descriptor */\n readonly descriptor: IAiProviderDescriptor;\n /** API key for authentication */\n readonly apiKey: string;\n /** Optional capability filter; when set, only models declaring this capability are returned. */\n readonly capability?: AiModelCapability;\n /** Optional capability config override (defaults to {@link DEFAULT_MODEL_CAPABILITY_CONFIG}). */\n readonly capabilityConfig?: IAiModelCapabilityConfig;\n /** Optional logger for request/response observability. */\n readonly logger?: Logging.ILogger;\n /** Optional abort signal for cancelling the in-flight request. */\n readonly signal?: AbortSignal;\n}\n\n// ============================================================================\n// List models — response validators\n// ============================================================================\n\n// ---- OpenAI / xAI / Groq / Mistral list format ----\n\n/** @internal */\ninterface IOpenAiListEntry {\n id: string;\n}\n/** @internal */\ninterface IOpenAiListResponse {\n data: IOpenAiListEntry[];\n}\n\nconst openAiListEntry: Validator<IOpenAiListEntry> = Validators.object<IOpenAiListEntry>({\n id: Validators.string\n});\nconst openAiListResponse: Validator<IOpenAiListResponse> = Validators.object<IOpenAiListResponse>({\n data: Validators.arrayOf(openAiListEntry)\n});\n\n// ---- Anthropic list format ----\n\n/** @internal */\ninterface IAnthropicListEntry {\n id: string;\n display_name?: string;\n}\n/** @internal */\ninterface IAnthropicListResponse {\n data: IAnthropicListEntry[];\n}\n\nconst anthropicListEntry: Validator<IAnthropicListEntry> = Validators.object<IAnthropicListEntry>({\n id: Validators.string,\n display_name: Validators.string.optional()\n});\nconst anthropicListResponse: Validator<IAnthropicListResponse> = Validators.object<IAnthropicListResponse>({\n data: Validators.arrayOf(anthropicListEntry)\n});\n\n// ---- Gemini list format ----\n\n/** @internal */\ninterface IGeminiListEntry {\n name: string;\n displayName?: string;\n supportedGenerationMethods?: string[];\n}\n/** @internal */\ninterface IGeminiListResponse {\n models: IGeminiListEntry[];\n}\n\nconst geminiListEntry: Validator<IGeminiListEntry> = Validators.object<IGeminiListEntry>({\n name: Validators.string,\n displayName: Validators.string.optional(),\n supportedGenerationMethods: Validators.arrayOf(Validators.string).optional()\n});\nconst geminiListResponse: Validator<IGeminiListResponse> = Validators.object<IGeminiListResponse>({\n models: Validators.arrayOf(geminiListEntry)\n});\n\n// ============================================================================\n// List models — capability resolution\n// ============================================================================\n\n/**\n * Translates Gemini's `supportedGenerationMethods` strings into our abstract\n * capability vocabulary. Methods without a mapping are ignored.\n * @internal\n */\nfunction geminiMethodsToCapabilities(methods: ReadonlyArray<string>): ReadonlyArray<AiModelCapability> {\n const out: AiModelCapability[] = [];\n for (const m of methods) {\n if (m === 'generateContent') {\n out.push('chat');\n } else if (m === 'predict') {\n out.push('image-generation');\n }\n }\n return out;\n}\n\n/**\n * Strips the `models/` prefix Gemini includes on listed model names.\n * @internal\n */\nfunction geminiBareId(name: string): string {\n return name.startsWith('models/') ? name.substring('models/'.length) : name;\n}\n\n/**\n * Applies a capability config to a model id. Walks per-provider rules then\n * global rules; unions all matching rules' capabilities. Returns the union\n * and the first matching `displayName` (if any).\n * @internal\n */\nfunction applyCapabilityConfig(\n config: IAiModelCapabilityConfig,\n providerId: string,\n modelId: string\n): { capabilities: AiModelCapability[]; displayName: string | undefined } {\n const caps = new Set<AiModelCapability>();\n let displayName: string | undefined;\n\n const rulesets: ReadonlyArray<ReadonlyArray<IAiModelCapabilityRule>> = [\n config.perProvider?.[providerId as keyof typeof config.perProvider] ?? [],\n config.global ?? []\n ];\n\n for (const rules of rulesets) {\n for (const rule of rules) {\n rule.idPattern.lastIndex = 0;\n if (rule.idPattern.test(modelId)) {\n for (const cap of rule.capabilities) {\n caps.add(cap);\n }\n if (displayName === undefined && rule.displayName !== undefined) {\n displayName = typeof rule.displayName === 'function' ? rule.displayName(modelId) : rule.displayName;\n }\n }\n }\n }\n return { capabilities: Array.from(caps), displayName };\n}\n\n/**\n * Combines provider-native capability info (when supplied) and config-derived\n * capability info into a final {@link IAiModelInfo}.\n * @internal\n */\nfunction buildModelInfo(\n providerId: string,\n id: string,\n nativeCapabilities: ReadonlyArray<AiModelCapability>,\n nativeDisplayName: string | undefined,\n config: IAiModelCapabilityConfig\n): IAiModelInfo {\n const fromConfig = applyCapabilityConfig(config, providerId, id);\n const all = new Set<AiModelCapability>([...nativeCapabilities, ...fromConfig.capabilities]);\n return {\n id,\n capabilities: all,\n ...(nativeDisplayName !== undefined\n ? { displayName: nativeDisplayName }\n : fromConfig.displayName !== undefined\n ? { displayName: fromConfig.displayName }\n : {})\n };\n}\n\n// ============================================================================\n// List models — adapters\n// ============================================================================\n\n/**\n * Calls the OpenAI-style `GET /models` endpoint. Used by openai, xai-grok,\n * groq, and mistral. Provider supplies no capability info — capabilities are\n * derived entirely from the config.\n * @internal\n */\nasync function callOpenAiListModels(\n config: IAiApiConfig,\n providerId: string,\n capabilityConfig: IAiModelCapabilityConfig,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<ReadonlyArray<IAiModelInfo>>> {\n const url = `${config.baseUrl}/models`;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`\n };\n /* c8 ignore next 1 - optional logger */\n logger?.info(`List models: provider=${providerId}, format=openai`);\n const jsonResult = await fetchGetJson(url, headers, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n return openAiListResponse\n .validate(jsonResult.value)\n .withErrorFormat((msg) => `OpenAI models API response: ${msg}`)\n .onSuccess((response) => {\n const models = response.data.map((entry) =>\n buildModelInfo(providerId, entry.id, [], undefined, capabilityConfig)\n );\n return succeed(models);\n });\n}\n\n/**\n * Calls the Anthropic `GET /models` endpoint. Provider supplies a\n * `display_name` but no native capability info.\n * @internal\n */\nasync function callAnthropicListModels(\n config: IAiApiConfig,\n providerId: string,\n capabilityConfig: IAiModelCapabilityConfig,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<ReadonlyArray<IAiModelInfo>>> {\n const url = `${config.baseUrl}/models`;\n const headers: Record<string, string> = {\n 'x-api-key': config.apiKey,\n 'anthropic-version': '2023-06-01',\n 'anthropic-dangerous-direct-browser-access': 'true'\n };\n /* c8 ignore next 1 - optional logger */\n logger?.info(`List models: provider=${providerId}, format=anthropic`);\n const jsonResult = await fetchGetJson(url, headers, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n return anthropicListResponse\n .validate(jsonResult.value)\n .withErrorFormat((msg) => `Anthropic models API response: ${msg}`)\n .onSuccess((response) => {\n const models = response.data.map((entry) =>\n buildModelInfo(providerId, entry.id, [], entry.display_name, capabilityConfig)\n );\n return succeed(models);\n });\n}\n\n/**\n * Calls the Gemini `GET /models` endpoint. Provider supplies both a\n * `displayName` and `supportedGenerationMethods` — translated to native\n * capabilities and unioned with config-derived capabilities.\n * @internal\n */\nasync function callGeminiListModels(\n config: IAiApiConfig,\n providerId: string,\n capabilityConfig: IAiModelCapabilityConfig,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<ReadonlyArray<IAiModelInfo>>> {\n const url = `${config.baseUrl}/models`;\n const headers: Record<string, string> = {\n 'x-goog-api-key': config.apiKey\n };\n /* c8 ignore next 1 - optional logger */\n logger?.info(`List models: provider=${providerId}, format=gemini`);\n const jsonResult = await fetchGetJson(url, headers, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n return geminiListResponse\n .validate(jsonResult.value)\n .withErrorFormat((msg) => `Gemini models API response: ${msg}`)\n .onSuccess((response) => {\n const models = response.models.map((entry) => {\n const id = geminiBareId(entry.name);\n const native = entry.supportedGenerationMethods\n ? geminiMethodsToCapabilities(entry.supportedGenerationMethods)\n : [];\n return buildModelInfo(providerId, id, native, entry.displayName, capabilityConfig);\n });\n return succeed(models);\n });\n}\n\n// ============================================================================\n// List models — dispatcher\n// ============================================================================\n\n/**\n * Lists models available from a provider, with capabilities resolved from\n * native provider info (where supplied) and a configurable rule set.\n *\n * Routes based on `descriptor.apiFormat` — listing reuses the existing\n * format dispatch and does not require a separate descriptor field.\n *\n * @param params - Request parameters including descriptor, API key, and optional capability filter\n * @returns The resolved model list, or a failure\n * @public\n */\nexport async function callProviderListModels(\n params: IProviderListModelsParams\n): Promise<Result<ReadonlyArray<IAiModelInfo>>> {\n const { descriptor, apiKey, capability, capabilityConfig, logger, signal } = params;\n\n if (!descriptor.baseUrl) {\n return fail(`provider \"${descriptor.id}\" has no API endpoint configured`);\n }\n\n const config: IAiApiConfig = {\n baseUrl: descriptor.baseUrl,\n apiKey,\n model: '' // unused by listing\n };\n const effectiveConfig = capabilityConfig ?? DEFAULT_MODEL_CAPABILITY_CONFIG;\n\n let listResult: Result<ReadonlyArray<IAiModelInfo>>;\n switch (descriptor.apiFormat) {\n case 'openai':\n listResult = await callOpenAiListModels(config, descriptor.id, effectiveConfig, logger, signal);\n break;\n case 'anthropic':\n listResult = await callAnthropicListModels(config, descriptor.id, effectiveConfig, logger, signal);\n break;\n case 'gemini':\n listResult = await callGeminiListModels(config, descriptor.id, effectiveConfig, logger, signal);\n break;\n /* c8 ignore next 4 - defensive coding: exhaustive switch guaranteed by TypeScript */\n default: {\n const _exhaustive: never = descriptor.apiFormat;\n return fail(`unsupported API format: ${String(_exhaustive)}`);\n }\n }\n\n if (listResult.isFailure()) {\n return listResult;\n }\n if (capability === undefined) {\n return listResult;\n }\n return succeed(listResult.value.filter((m) => m.capabilities.has(capability)));\n}\n\n// ============================================================================\n// Proxied list models\n// ============================================================================\n\n/**\n * Calls the model-listing endpoint on a proxy server.\n *\n * @remarks\n * Proxy contract:\n * - Endpoint: `POST ${proxyUrl}/api/ai/list-models`\n * - Request body: `{providerId, apiKey, capability?}`. Capability config is\n * not forwarded — the proxy applies its own (typically the same default\n * the library ships).\n * - Success response body: an `IAiModelInfo[]` (under key `models`) where\n * `capabilities` is serialized as a string array (not Set, which doesn't\n * round-trip through JSON).\n * - Error response body: `{error: string}`, surfaced as `proxy: ${error}`.\n *\n * @public\n */\nexport async function callProxiedListModels(\n proxyUrl: string,\n params: IProviderListModelsParams\n): Promise<Result<ReadonlyArray<IAiModelInfo>>> {\n const { descriptor, apiKey, capability, logger, signal } = params;\n\n const body: Record<string, unknown> = {\n providerId: descriptor.id,\n apiKey\n };\n if (capability !== undefined) {\n body.capability = capability;\n }\n\n /* c8 ignore next 1 - optional logger */\n logger?.info(`AI list-models proxy request: provider=${descriptor.id}, proxy=${proxyUrl}`);\n\n const url = `${proxyUrl}/api/ai/list-models`;\n const jsonResult = await fetchJson(url, {}, body, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n\n const response = jsonResult.value as Record<string, unknown>;\n if (typeof response.error === 'string') {\n return fail(`proxy: ${response.error}`);\n }\n\n return proxiedListModelsResponse\n .validate(response)\n .withErrorFormat((msg) => `proxy returned invalid response: ${msg}`)\n .onSuccess((parsed) => {\n const models: IAiModelInfo[] = parsed.models.map((m) => ({\n id: m.id,\n capabilities: new Set<AiModelCapability>(m.capabilities),\n ...(m.displayName !== undefined ? { displayName: m.displayName } : {})\n }));\n return succeed(models);\n });\n}\n\n// ============================================================================\n// Proxied completion (routes through a backend server)\n// ============================================================================\n\n/**\n * Calls the AI completion endpoint on a proxy server instead of calling\n * the provider API directly from the browser.\n *\n * The proxy server handles provider dispatch, CORS, and API key forwarding.\n * The request shape mirrors {@link IProviderCompletionParams} but is serialized\n * as JSON for the proxy endpoint.\n *\n * @param proxyUrl - Base URL of the proxy server (e.g. `http://localhost:3001`)\n * @param params - Same parameters as {@link callProviderCompletion}\n * @returns The completion response, or a failure\n * @public\n */\nexport async function callProxiedCompletion(\n proxyUrl: string,\n params: IProviderCompletionParams\n): Promise<Result<IAiCompletionResponse>> {\n const {\n descriptor,\n apiKey,\n prompt,\n additionalMessages,\n temperature,\n modelOverride,\n logger,\n tools,\n signal\n } = params;\n\n const promptBody: Record<string, unknown> = { system: prompt.system, user: prompt.user };\n if (prompt.attachments.length > 0) {\n promptBody.attachments = prompt.attachments;\n }\n const body: Record<string, unknown> = {\n providerId: descriptor.id,\n apiKey,\n prompt: promptBody,\n temperature: temperature ?? 0.7\n };\n if (additionalMessages && additionalMessages.length > 0) {\n body.additionalMessages = additionalMessages;\n }\n if (modelOverride !== undefined) {\n body.modelOverride = modelOverride;\n }\n if (tools && tools.length > 0) {\n body.tools = tools;\n }\n\n /* c8 ignore next 1 - optional logger */\n logger?.info(`AI proxy request: provider=${descriptor.id}, proxy=${proxyUrl}`);\n\n const url = `${proxyUrl}/api/ai/completion`;\n const jsonResult = await fetchJson(url, {}, body, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n\n // Check for error response from proxy\n const response = jsonResult.value as Record<string, unknown>;\n if (typeof response.error === 'string') {\n return fail(`proxy: ${response.error}`);\n }\n\n if (typeof response.content !== 'string') {\n return fail('proxy returned invalid response: missing content');\n }\n\n return succeed({\n content: response.content,\n truncated: response.truncated === true\n });\n}\n\n// ============================================================================\n// Proxied image generation\n// ============================================================================\n\n/**\n * Calls the image-generation endpoint on a proxy server instead of calling\n * the provider API directly from the browser.\n *\n * @remarks\n * The proxy contract:\n * - Endpoint: `POST ${proxyUrl}/api/ai/image-generation`\n * - Request body: `{providerId, apiKey, params, modelOverride?}`\n * - Success response body: an {@link IAiImageGenerationResponse}\n * - Error response body: `{error: string}` (surfaced as `proxy: ${error}`)\n *\n * The proxy server is responsible for descriptor lookup, model resolution,\n * provider dispatch, and response normalization. When `params.referenceImages`\n * is present, the proxy is also responsible for repackaging it into the\n * upstream wire format (e.g. multipart/form-data for OpenAI `/images/edits`,\n * `inlineData` parts for Gemini `:generateContent`).\n *\n * @param proxyUrl - Base URL of the proxy server (e.g. `http://localhost:3001`)\n * @param params - Same parameters as {@link callProviderImageGeneration}\n * @returns The generated images, or a failure\n * @public\n */\nexport async function callProxiedImageGeneration(\n proxyUrl: string,\n params: IProviderImageGenerationParams\n): Promise<Result<IAiImageGenerationResponse>> {\n const { descriptor, apiKey, params: request, modelOverride, logger, signal } = params;\n\n const body: Record<string, unknown> = {\n providerId: descriptor.id,\n apiKey,\n params: request\n };\n if (modelOverride !== undefined) {\n body.modelOverride = modelOverride;\n }\n\n /* c8 ignore next 1 - optional logger */\n logger?.info(`AI image proxy request: provider=${descriptor.id}, proxy=${proxyUrl}`);\n\n const url = `${proxyUrl}/api/ai/image-generation`;\n const jsonResult = await fetchJson(url, {}, body, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n\n const response = jsonResult.value as Record<string, unknown>;\n if (typeof response.error === 'string') {\n return fail(`proxy: ${response.error}`);\n }\n\n return proxiedImageGenerationResponse\n .validate(response)\n .withErrorFormat((msg) => `proxy returned invalid response: ${msg}`);\n}\n"]}
1
+ {"version":3,"file":"apiClient.js","sourceRoot":"","sources":["../../../src/packlets/ai-assist/apiClient.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Erik Fortune\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n/**\n * Chat completion client for AI assist with support for multiple provider APIs.\n *\n * Supports OpenAI-compatible providers (xAI, OpenAI, Groq, Mistral) directly,\n * plus adapters for Anthropic and Google Gemini.\n *\n * When server-side tools (e.g. web_search) are configured, providers that support\n * them will include tool configuration in the request and handle tool-augmented\n * responses.\n *\n * @packageDocumentation\n */\n\nimport { isJsonObject, type JsonObject } from '@fgv/ts-json-base';\nimport { fail, type Logging, mapResults, Result, succeed, type Validator, Validators } from '@fgv/ts-utils';\n\nimport {\n AiPrompt,\n type AiModelCapability,\n type AiServerToolConfig,\n type IAiCompletionResponse,\n type IAiGeneratedImage,\n type IAiImageAttachment,\n type IAiImageGenerationOptions,\n type IAiImageGenerationParams,\n type IAiImageGenerationResponse,\n type IAiModelCapabilityConfig,\n type IAiModelCapabilityRule,\n type IAiModelInfo,\n type IAiProviderDescriptor,\n type IChatMessage,\n type ModelSpec,\n resolveModel\n} from './model';\nimport {\n buildAnthropicMessages,\n buildGeminiContents,\n buildMessages,\n buildOpenAiChatUserContent,\n buildOpenAiResponsesUserContent\n} from './chatRequestBuilders';\nimport { bearerAuthHeader, resolveEffectiveBaseUrl } from './endpoint';\nimport { DEFAULT_MODEL_CAPABILITY_CONFIG, resolveImageCapability, supportsImageGeneration } from './registry';\nimport { toAnthropicTools, toGeminiTools, toResponsesApiTools } from './toolFormats';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Internal API configuration built from a provider descriptor.\n * @internal\n */\ninterface IAiApiConfig {\n readonly baseUrl: string;\n readonly apiKey: string;\n readonly model: string;\n}\n\n/**\n * Parameters for a provider completion request.\n * @public\n */\nexport interface IProviderCompletionParams {\n /** The provider descriptor */\n readonly descriptor: IAiProviderDescriptor;\n /** API key for authentication */\n readonly apiKey: string;\n /** The structured prompt to send */\n readonly prompt: AiPrompt;\n /**\n * Additional messages to append after system+user (e.g. for correction retries).\n * These are appended in order after the initial system and user messages.\n */\n readonly additionalMessages?: ReadonlyArray<IChatMessage>;\n /** Sampling temperature (default: 0.7) */\n readonly temperature?: number;\n /** Optional model override — string or context-aware map (uses descriptor.defaultModel otherwise) */\n readonly modelOverride?: ModelSpec;\n /** Optional logger for request/response observability. */\n readonly logger?: Logging.ILogger;\n /** Server-side tools to include in the request. Overrides settings-level tool config when provided. */\n readonly tools?: ReadonlyArray<AiServerToolConfig>;\n /** Optional abort signal for cancelling the in-flight request. */\n readonly signal?: AbortSignal;\n /**\n * Optional override of the descriptor's default base URL. When set, the\n * dispatcher uses this URL (scheme + host + optional port + optional path\n * prefix) and appends the descriptor's per-route suffix (e.g.\n * `/chat/completions`) the same way it composes against the default.\n *\n * Must be a well-formed `http`/`https` URL string. Used to dispatch the same\n * provider descriptor against a self-hosted or local endpoint (e.g.\n * `http://localhost:11434/v1` for Ollama, or LAN-hosted OpenAI-compatible\n * servers).\n *\n * Setting `endpoint` does not change the auth shape: providers with\n * `needsSecret === true` still require an API key.\n */\n readonly endpoint?: string;\n}\n\n// ============================================================================\n// Shared helpers\n// ============================================================================\n\n/**\n * Makes an HTTP request and returns the parsed JSON, or a failure.\n * @internal\n */\nasync function fetchJson(\n url: string,\n headers: Record<string, string>,\n body: unknown,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<JsonObject>> {\n /* c8 ignore next 1 - optional logger */\n logger?.detail(`AI API request: POST ${url}`);\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers\n },\n body: JSON.stringify(body),\n signal\n });\n } catch (err: unknown) {\n const detail = err instanceof Error ? err.message : String(err);\n /* c8 ignore next 1 - optional logger */\n logger?.error(`AI API request failed: ${detail}`);\n return fail(`AI API request failed: ${detail}`);\n }\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'unknown error');\n /* c8 ignore next 1 - optional logger */\n logger?.error(`AI API returned ${response.status}: ${errorText}`);\n return fail(`AI API returned ${response.status}: ${errorText}`);\n }\n\n /* c8 ignore next 1 - optional logger */\n logger?.detail(`AI API response: ${response.status}`);\n\n let json: unknown;\n try {\n json = await response.json();\n } catch {\n /* c8 ignore next 1 - optional logger */\n logger?.error('AI API returned invalid JSON response');\n return fail('AI API returned invalid JSON response');\n }\n\n if (!isJsonObject(json)) {\n /* c8 ignore next 1 - optional logger */\n logger?.error('AI API returned non-object JSON response');\n return fail('AI API returned non-object JSON response');\n }\n return succeed(json);\n}\n\n/**\n * Makes a multipart/form-data POST request and returns the parsed JSON, or a\n * failure. The Content-Type header (with boundary) is set automatically by\n * `fetch` from the `FormData` body — callers must NOT pass it explicitly.\n * @internal\n */\nasync function fetchMultipart(\n url: string,\n headers: Record<string, string>,\n body: FormData,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<JsonObject>> {\n /* c8 ignore next 1 - optional logger */\n logger?.detail(`AI API request: POST ${url} (multipart)`);\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: 'POST',\n headers,\n body,\n signal\n });\n } catch (err: unknown) {\n const detail = err instanceof Error ? err.message : String(err);\n /* c8 ignore next 1 - optional logger */\n logger?.error(`AI API request failed: ${detail}`);\n return fail(`AI API request failed: ${detail}`);\n }\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'unknown error');\n /* c8 ignore next 1 - optional logger */\n logger?.error(`AI API returned ${response.status}: ${errorText}`);\n return fail(`AI API returned ${response.status}: ${errorText}`);\n }\n\n /* c8 ignore next 1 - optional logger */\n logger?.detail(`AI API response: ${response.status}`);\n\n let json: unknown;\n try {\n json = await response.json();\n } catch {\n /* c8 ignore next 1 - optional logger */\n logger?.error('AI API returned invalid JSON response');\n return fail('AI API returned invalid JSON response');\n }\n\n if (!isJsonObject(json)) {\n /* c8 ignore next 1 - optional logger */\n logger?.error('AI API returned non-object JSON response');\n return fail('AI API returned non-object JSON response');\n }\n return succeed(json);\n}\n\n/**\n * Decodes a base64-encoded image attachment into a `Blob` suitable for use as\n * a multipart file field. On Node hands the `Buffer` straight to `Blob`\n * (Buffer extends Uint8Array) to skip an intermediate copy; falls back to\n * `atob` in browsers. Inputs come from `FileReader` or prior provider\n * responses, which are trusted to be valid. Note that Node's\n * `Buffer.from(..., 'base64')` silently strips invalid characters rather\n * than throwing, so failures are only observable in the browser path.\n * @internal\n */\nfunction attachmentToBlob(attachment: IAiImageAttachment): Result<Blob> {\n if (typeof Buffer !== 'undefined') {\n return succeed(new Blob([Buffer.from(attachment.base64, 'base64')], { type: attachment.mimeType }));\n }\n /* c8 ignore start - Browser-only fallback cannot be tested in Node.js environment */\n try {\n const binary = atob(attachment.base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return succeed(new Blob([bytes], { type: attachment.mimeType }));\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return fail(`Invalid base64: ${message}`);\n }\n /* c8 ignore stop */\n}\n\n/**\n * Maps a MIME type to a sensible file extension for multipart filenames.\n * @internal\n */\nfunction extensionForMimeType(mimeType: string): string {\n switch (mimeType) {\n case 'image/png':\n return 'png';\n case 'image/jpeg':\n case 'image/jpg':\n return 'jpg';\n case 'image/webp':\n return 'webp';\n case 'image/gif':\n return 'gif';\n default:\n return 'bin';\n }\n}\n\n/**\n * Makes an HTTP GET request and returns the parsed JSON, or a failure.\n * @internal\n */\nasync function fetchGetJson(\n url: string,\n headers: Record<string, string>,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<JsonObject>> {\n /* c8 ignore next 1 - optional logger */\n logger?.detail(`AI API request: GET ${url}`);\n\n let response: Response;\n try {\n response = await fetch(url, { method: 'GET', headers, signal });\n } catch (err: unknown) {\n const detail = err instanceof Error ? err.message : String(err);\n /* c8 ignore next 1 - optional logger */\n logger?.error(`AI API request failed: ${detail}`);\n return fail(`AI API request failed: ${detail}`);\n }\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'unknown error');\n /* c8 ignore next 1 - optional logger */\n logger?.error(`AI API returned ${response.status}: ${errorText}`);\n return fail(`AI API returned ${response.status}: ${errorText}`);\n }\n\n /* c8 ignore next 1 - optional logger */\n logger?.detail(`AI API response: ${response.status}`);\n\n let json: unknown;\n try {\n json = await response.json();\n } catch {\n /* c8 ignore next 1 - optional logger */\n logger?.error('AI API returned invalid JSON response');\n return fail('AI API returned invalid JSON response');\n }\n\n if (!isJsonObject(json)) {\n /* c8 ignore next 1 - optional logger */\n logger?.error('AI API returned non-object JSON response');\n return fail('AI API returned non-object JSON response');\n }\n return succeed(json);\n}\n\n// ============================================================================\n// Response validators (non-strict — extra API fields preserved for debugging)\n// ============================================================================\n\n// ---- OpenAI Chat Completions format ----\n\n/** @internal */\ninterface IOpenAiMessage {\n content: string;\n}\n/** @internal */\ninterface IOpenAiChoice {\n message: IOpenAiMessage;\n finish_reason: string;\n}\n/** @internal */\ninterface IOpenAiResponse {\n choices: IOpenAiChoice[];\n}\n\nconst openAiMessage: Validator<IOpenAiMessage> = Validators.object<IOpenAiMessage>({\n content: Validators.string\n});\nconst openAiChoice: Validator<IOpenAiChoice> = Validators.object<IOpenAiChoice>({\n message: openAiMessage,\n finish_reason: Validators.string\n});\nconst openAiResponse: Validator<IOpenAiResponse> = Validators.object<IOpenAiResponse>({\n choices: Validators.arrayOf(openAiChoice).withConstraint((arr) => arr.length > 0)\n});\n\n// ---- OpenAI/xAI Responses API format ----\n\n/** @internal */\ninterface IResponsesApiOutputText {\n type: 'output_text';\n text: string;\n}\n/** @internal */\ninterface IResponsesApiMessage {\n type: 'message';\n role: string;\n content: IResponsesApiOutputText[];\n}\n/** @internal */\ninterface IResponsesApiResponse {\n output: Array<Record<string, unknown>>;\n status: string;\n}\n\nconst responsesApiOutputText: Validator<IResponsesApiOutputText> = Validators.object<IResponsesApiOutputText>(\n {\n type: Validators.literal('output_text'),\n text: Validators.string\n }\n);\nconst responsesApiMessage: Validator<IResponsesApiMessage> = Validators.object<IResponsesApiMessage>({\n type: Validators.literal('message'),\n role: Validators.string,\n content: Validators.arrayOf(responsesApiOutputText).withConstraint((arr) => arr.length > 0)\n});\nconst responsesApiOutputItem: Validator<Record<string, unknown>> = Validators.isA(\n 'object',\n (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null\n);\nconst responsesApiResponse: Validator<IResponsesApiResponse> = Validators.object<IResponsesApiResponse>({\n output: Validators.arrayOf(responsesApiOutputItem).withConstraint((arr) => arr.length > 0),\n status: Validators.string\n});\n\n// ---- Anthropic format ----\n\n/** @internal */\ninterface IAnthropicContentBlock {\n text: string;\n}\n/** @internal */\ninterface IAnthropicResponse {\n content: IAnthropicContentBlock[];\n stop_reason: string;\n}\n\nconst anthropicContentBlock: Validator<IAnthropicContentBlock> = Validators.object<IAnthropicContentBlock>({\n text: Validators.string\n});\nconst anthropicResponse: Validator<IAnthropicResponse> = Validators.object<IAnthropicResponse>({\n content: Validators.arrayOf(anthropicContentBlock).withConstraint((arr) => arr.length > 0),\n stop_reason: Validators.string\n});\n\n// ---- Gemini format ----\n\n/** @internal */\ninterface IGeminiPart {\n text: string;\n}\n/** @internal */\ninterface IGeminiContent {\n parts: IGeminiPart[];\n}\n/** @internal */\ninterface IGeminiCandidate {\n content: IGeminiContent;\n finishReason: string;\n}\n/** @internal */\ninterface IGeminiResponse {\n candidates: IGeminiCandidate[];\n}\n\nconst geminiPart: Validator<IGeminiPart> = Validators.object<IGeminiPart>({\n text: Validators.string\n});\nconst geminiContent: Validator<IGeminiContent> = Validators.object<IGeminiContent>({\n parts: Validators.arrayOf(geminiPart).withConstraint((arr) => arr.length > 0)\n});\nconst geminiCandidate: Validator<IGeminiCandidate> = Validators.object<IGeminiCandidate>({\n content: geminiContent,\n finishReason: Validators.string\n});\nconst geminiResponse: Validator<IGeminiResponse> = Validators.object<IGeminiResponse>({\n candidates: Validators.arrayOf(geminiCandidate).withConstraint((arr) => arr.length > 0)\n});\n\n// ============================================================================\n// OpenAI-compatible client (Chat Completions — no tools)\n// ============================================================================\n\n/**\n * Calls an OpenAI-compatible chat completion endpoint.\n * Works for xAI Grok, OpenAI, Groq, and Mistral.\n * @internal\n */\nasync function callOpenAiCompletion(\n config: IAiApiConfig,\n prompt: AiPrompt,\n additionalMessages?: ReadonlyArray<IChatMessage>,\n temperature: number = 0.7,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<IAiCompletionResponse>> {\n const url = `${config.baseUrl}/chat/completions`;\n const messages = buildMessages(prompt.system, buildOpenAiChatUserContent(prompt), {\n tail: additionalMessages\n });\n const body = { model: config.model, messages, temperature };\n\n const headers: Record<string, string> = bearerAuthHeader(config.apiKey);\n\n /* c8 ignore next 1 - optional logger */\n logger?.info(`OpenAI completion: model=${config.model}`);\n const jsonResult = await fetchJson(url, headers, body, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n return openAiResponse\n .validate(jsonResult.value)\n .withErrorFormat((msg) => `OpenAI API response: ${msg}`)\n .onSuccess((response) => {\n const choice = response.choices[0];\n return succeed({\n content: choice.message.content,\n truncated: choice.finish_reason === 'length'\n });\n });\n}\n\n// ============================================================================\n// OpenAI/xAI Responses API (with tools)\n// ============================================================================\n\n/**\n * Extracts text content from a Responses API output array.\n * Finds the first message-type output item and concatenates its text content blocks.\n * @internal\n */\nfunction extractResponsesApiText(output: Array<Record<string, unknown>>): Result<string> {\n for (const item of output) {\n if (item.type === 'message') {\n const messageResult = responsesApiMessage.validate(item as JsonObject);\n if (messageResult.isSuccess()) {\n return succeed(messageResult.value.content.map((c) => c.text).join(''));\n }\n }\n }\n return fail('Responses API output contained no message with text content');\n}\n\n/**\n * Calls the xAI/OpenAI Responses API with server-side tools.\n * Used when tools are configured for an openai-format provider.\n * @internal\n */\nasync function callOpenAiResponsesCompletion(\n config: IAiApiConfig,\n prompt: AiPrompt,\n tools: ReadonlyArray<AiServerToolConfig>,\n additionalMessages?: ReadonlyArray<IChatMessage>,\n temperature: number = 0.7,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<IAiCompletionResponse>> {\n const url = `${config.baseUrl}/responses`;\n const input = buildMessages(prompt.system, buildOpenAiResponsesUserContent(prompt), {\n tail: additionalMessages\n });\n const body: Record<string, unknown> = {\n model: config.model,\n input,\n tools: toResponsesApiTools(tools),\n temperature\n };\n\n const headers: Record<string, string> = bearerAuthHeader(config.apiKey);\n\n /* c8 ignore next 1 - optional logger */\n logger?.info(`OpenAI Responses API: model=${config.model}, tools=${tools.map((t) => t.type).join(',')}`);\n const jsonResult = await fetchJson(url, headers, body, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n return responsesApiResponse\n .validate(jsonResult.value)\n .withErrorFormat((msg) => `Responses API response: ${msg}`)\n .onSuccess((response) => {\n return extractResponsesApiText(response.output).onSuccess((text) =>\n succeed({\n content: text,\n truncated: response.status === 'incomplete'\n })\n );\n });\n}\n\n// ============================================================================\n// Anthropic adapter\n// ============================================================================\n\n/**\n * Extracts text content from Anthropic response content blocks.\n * When tools are used, the content array contains mixed block types\n * (text, server_tool_use, web_search_tool_result). We extract and\n * concatenate only the text blocks.\n * @internal\n */\nfunction extractAnthropicText(content: unknown[]): Result<string> {\n const textParts: string[] = [];\n for (const block of content) {\n if (typeof block === 'object' && block !== null && 'type' in block) {\n const typed = block as Record<string, unknown>;\n if (typed.type === 'text' && typeof typed.text === 'string') {\n textParts.push(typed.text);\n }\n }\n }\n if (textParts.length === 0) {\n return fail('Anthropic response contained no text content blocks');\n }\n return succeed(textParts.join(''));\n}\n\n/**\n * Calls the Anthropic Messages API.\n * When tools are configured, includes them in the request and handles\n * mixed content block responses.\n * @internal\n */\nasync function callAnthropicCompletion(\n config: IAiApiConfig,\n prompt: AiPrompt,\n additionalMessages?: ReadonlyArray<IChatMessage>,\n temperature: number = 0.7,\n logger?: Logging.ILogger,\n tools?: ReadonlyArray<AiServerToolConfig>,\n signal?: AbortSignal\n): Promise<Result<IAiCompletionResponse>> {\n const url = `${config.baseUrl}/messages`;\n\n // Anthropic uses system as a top-level field, not in messages\n const messages = buildAnthropicMessages(prompt, { tail: additionalMessages });\n\n const body: Record<string, unknown> = {\n model: config.model,\n system: prompt.system,\n messages,\n max_tokens: 4096,\n temperature\n };\n\n if (tools && tools.length > 0) {\n body.tools = toAnthropicTools(tools);\n /* c8 ignore next 3 - optional logger diagnostic output */\n logger?.info(`Anthropic completion: model=${config.model}, tools=${tools.map((t) => t.type).join(',')}`);\n } else {\n /* c8 ignore next 1 - optional logger */\n logger?.info(`Anthropic completion: model=${config.model}`);\n }\n\n const headers: Record<string, string> = {\n 'x-api-key': config.apiKey,\n 'anthropic-version': '2023-06-01',\n 'anthropic-dangerous-direct-browser-access': 'true'\n };\n\n const jsonResult = await fetchJson(url, headers, body, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n\n // When tools are used, the response content is a mixed array of block types.\n // We need to extract text from all text blocks.\n if (tools && tools.length > 0) {\n const rawContent = (jsonResult.value as Record<string, unknown>).content;\n const stopReason = (jsonResult.value as Record<string, unknown>).stop_reason;\n if (!Array.isArray(rawContent)) {\n return fail('Anthropic API response: content is not an array');\n }\n return extractAnthropicText(rawContent).onSuccess((text) =>\n succeed({\n content: text,\n truncated: stopReason === 'max_tokens'\n })\n );\n }\n\n return anthropicResponse\n .validate(jsonResult.value)\n .withErrorFormat((msg) => `Anthropic API response: ${msg}`)\n .onSuccess((response) => {\n return succeed({\n content: response.content[0].text,\n truncated: response.stop_reason === 'max_tokens'\n });\n });\n}\n\n// ============================================================================\n// Google Gemini adapter\n// ============================================================================\n\n/**\n * Calls the Google Gemini generateContent API.\n * When tools are configured, includes Google Search grounding.\n * @internal\n */\nasync function callGeminiCompletion(\n config: IAiApiConfig,\n prompt: AiPrompt,\n additionalMessages?: ReadonlyArray<IChatMessage>,\n temperature: number = 0.7,\n logger?: Logging.ILogger,\n tools?: ReadonlyArray<AiServerToolConfig>,\n signal?: AbortSignal\n): Promise<Result<IAiCompletionResponse>> {\n const url = `${config.baseUrl}/models/${config.model}:generateContent`;\n\n // Gemini uses 'contents' with 'parts', and 'model' role instead of 'assistant'\n const contents = buildGeminiContents(prompt, { tail: additionalMessages });\n\n const body: Record<string, unknown> = {\n systemInstruction: { parts: [{ text: prompt.system }] },\n contents,\n generationConfig: { temperature }\n };\n\n if (tools && tools.length > 0) {\n body.tools = toGeminiTools(tools);\n /* c8 ignore next 1 - optional logger */\n logger?.info(`Gemini completion: model=${config.model}, tools=${tools.map((t) => t.type).join(',')}`);\n } else {\n /* c8 ignore next 1 - optional logger */\n logger?.info(`Gemini completion: model=${config.model}`);\n }\n\n const headers: Record<string, string> = {\n 'x-goog-api-key': config.apiKey\n };\n\n const jsonResult = await fetchJson(url, headers, body, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n return geminiResponse\n .validate(jsonResult.value)\n .withErrorFormat((msg) => `Gemini API response: ${msg}`)\n .onSuccess((response) => {\n const candidate = response.candidates[0];\n return succeed({\n content: candidate.content.parts[0].text,\n truncated: candidate.finishReason === 'MAX_TOKENS'\n });\n });\n}\n\n// ============================================================================\n// Provider dispatcher\n// ============================================================================\n\n/**\n * Calls the appropriate chat completion API for a given provider.\n *\n * Routes based on the provider descriptor's `apiFormat` field:\n * - `'openai'` for xAI, OpenAI, Groq, Mistral\n * - `'anthropic'` for Anthropic Claude\n * - `'gemini'` for Google Gemini\n *\n * When tools are provided and the provider supports them:\n * - OpenAI-format providers switch to the Responses API\n * - Anthropic includes tools in the Messages API request\n * - Gemini includes Google Search grounding\n *\n * @param params - Request parameters including descriptor, API key, prompt, and optional tools\n * @returns The completion response with content and truncation status, or a failure\n * @public\n */\nexport async function callProviderCompletion(\n params: IProviderCompletionParams\n): Promise<Result<IAiCompletionResponse>> {\n const {\n descriptor,\n apiKey,\n prompt,\n additionalMessages,\n temperature = 0.7,\n modelOverride,\n logger,\n tools,\n signal,\n endpoint\n } = params;\n\n const baseUrlResult = resolveEffectiveBaseUrl(descriptor, endpoint);\n if (baseUrlResult.isFailure()) {\n return fail(baseUrlResult.message);\n }\n if (prompt.attachments.length > 0 && !descriptor.acceptsImageInput) {\n return fail(`provider \"${descriptor.id}\" does not accept image input`);\n }\n\n const hasTools = tools !== undefined && tools.length > 0;\n const modelContext = hasTools ? 'tools' : undefined;\n\n const model = resolveModel(modelOverride ?? descriptor.defaultModel, modelContext);\n if (model.length === 0) {\n return fail(\n `provider \"${descriptor.id}\": no model resolved; pass modelOverride or set descriptor.defaultModel`\n );\n }\n\n const config: IAiApiConfig = {\n baseUrl: baseUrlResult.value,\n apiKey,\n model\n };\n /* c8 ignore next 8 - optional logger diagnostic output */\n if (logger) {\n const toolTypes = hasTools ? tools.map((t) => t.type).join(',') : 'none';\n const supported = descriptor.supportedTools.length > 0 ? descriptor.supportedTools.join(',') : 'none';\n logger.info(\n `AI completion: provider=${descriptor.id}, format=${descriptor.apiFormat}, model=${config.model}, ` +\n `tools=${toolTypes}, supported=${supported}`\n );\n }\n\n switch (descriptor.apiFormat) {\n case 'openai':\n if (hasTools) {\n return callOpenAiResponsesCompletion(\n config,\n prompt,\n tools,\n additionalMessages,\n temperature,\n logger,\n signal\n );\n }\n return callOpenAiCompletion(config, prompt, additionalMessages, temperature, logger, signal);\n case 'anthropic':\n return callAnthropicCompletion(config, prompt, additionalMessages, temperature, logger, tools, signal);\n case 'gemini':\n return callGeminiCompletion(config, prompt, additionalMessages, temperature, logger, tools, signal);\n /* c8 ignore next 4 - defensive coding: exhaustive switch guaranteed by TypeScript */\n default: {\n const _exhaustive: never = descriptor.apiFormat;\n return fail(`unsupported API format: ${String(_exhaustive)}`);\n }\n }\n}\n\n// ============================================================================\n// Image generation — request types\n// ============================================================================\n\n/**\n * Parameters for an image-generation request.\n * @public\n */\nexport interface IProviderImageGenerationParams {\n /** The provider descriptor */\n readonly descriptor: IAiProviderDescriptor;\n /** API key for authentication */\n readonly apiKey: string;\n /** The image-generation request */\n readonly params: IAiImageGenerationParams;\n /** Optional model override — string or context-aware map (uses descriptor.defaultModel.image otherwise) */\n readonly modelOverride?: ModelSpec;\n /** Optional logger for request/response observability. */\n readonly logger?: Logging.ILogger;\n /** Optional abort signal for cancelling the in-flight request. */\n readonly signal?: AbortSignal;\n /**\n * Optional override of the descriptor's default base URL. Same semantics as\n * the non-streaming completion path's endpoint: a well-formed `http`/`https`\n * URL substituted for `descriptor.baseUrl` when composing the request, with\n * the per-route suffix (e.g. `/images/generations`, `:predict`) appended\n * unchanged.\n */\n readonly endpoint?: string;\n}\n\n// ============================================================================\n// Image generation — response validators\n// ============================================================================\n\n// ---- OpenAI / xAI images format ----\n\n/** @internal */\ninterface IOpenAiImageItem {\n b64_json: string;\n revised_prompt?: string;\n}\n/** @internal */\ninterface IOpenAiImageResponse {\n data: IOpenAiImageItem[];\n}\n\nconst openAiImageItem: Validator<IOpenAiImageItem> = Validators.object<IOpenAiImageItem>({\n b64_json: Validators.string,\n revised_prompt: Validators.string.optional()\n});\nconst openAiImageResponse: Validator<IOpenAiImageResponse> = Validators.object<IOpenAiImageResponse>({\n data: Validators.arrayOf(openAiImageItem).withConstraint((arr) => arr.length > 0)\n});\n\n// ---- Gemini Imagen format ----\n\n/** @internal */\ninterface IImagenPrediction {\n bytesBase64Encoded: string;\n mimeType?: string;\n}\n/** @internal */\ninterface IImagenResponse {\n predictions: IImagenPrediction[];\n}\n\nconst imagenPrediction: Validator<IImagenPrediction> = Validators.object<IImagenPrediction>({\n bytesBase64Encoded: Validators.string,\n mimeType: Validators.string.optional()\n});\nconst imagenResponse: Validator<IImagenResponse> = Validators.object<IImagenResponse>({\n predictions: Validators.arrayOf(imagenPrediction).withConstraint((arr) => arr.length > 0)\n});\n\n// ---- Gemini image-out (`:generateContent` returning image parts) format ----\n\n/** @internal */\ninterface IGeminiImageInlineData {\n mimeType: string;\n data: string;\n}\n/** @internal */\ninterface IGeminiImageOutPart {\n text?: string;\n inlineData?: IGeminiImageInlineData;\n}\n/** @internal */\ninterface IGeminiImageOutContent {\n parts: IGeminiImageOutPart[];\n}\n/** @internal */\ninterface IGeminiImageOutCandidate {\n content: IGeminiImageOutContent;\n finishReason?: string;\n}\n/** @internal */\ninterface IGeminiImageOutResponse {\n candidates: IGeminiImageOutCandidate[];\n}\n\nconst geminiImageInlineData: Validator<IGeminiImageInlineData> = Validators.object<IGeminiImageInlineData>({\n mimeType: Validators.string,\n data: Validators.string\n});\nconst geminiImageOutPart: Validator<IGeminiImageOutPart> = Validators.object<IGeminiImageOutPart>({\n text: Validators.string.optional(),\n inlineData: geminiImageInlineData.optional()\n});\nconst geminiImageOutContent: Validator<IGeminiImageOutContent> = Validators.object<IGeminiImageOutContent>({\n parts: Validators.arrayOf(geminiImageOutPart).withConstraint((arr) => arr.length > 0)\n});\nconst geminiImageOutCandidate: Validator<IGeminiImageOutCandidate> =\n Validators.object<IGeminiImageOutCandidate>({\n content: geminiImageOutContent,\n finishReason: Validators.string.optional()\n });\nconst geminiImageOutResponse: Validator<IGeminiImageOutResponse> = Validators.object<IGeminiImageOutResponse>(\n {\n candidates: Validators.arrayOf(geminiImageOutCandidate).withConstraint((arr) => arr.length > 0)\n }\n);\n\n// ---- Proxied image generation response ----\n\nconst proxiedGeneratedImage: Validator<IAiGeneratedImage> = Validators.object<IAiGeneratedImage>({\n mimeType: Validators.string,\n base64: Validators.string,\n revisedPrompt: Validators.string.optional()\n});\nconst proxiedImageGenerationResponse: Validator<IAiImageGenerationResponse> =\n Validators.object<IAiImageGenerationResponse>({\n images: Validators.arrayOf(proxiedGeneratedImage).withConstraint((arr) => arr.length > 0)\n });\n\n// ---- Proxied list-models response ----\n\n/**\n * Wire shape for proxy list-models responses. `capabilities` arrives as an\n * array (Sets don't survive JSON), then gets reassembled into a `Set` in\n * {@link callProxiedListModels}.\n * @internal\n */\ninterface IProxiedListModelsEntry {\n id: string;\n capabilities: AiModelCapability[];\n displayName?: string;\n}\n/** @internal */\ninterface IProxiedListModelsBody {\n models: IProxiedListModelsEntry[];\n}\n\nconst proxiedListModelsEntry: Validator<IProxiedListModelsEntry> = Validators.object<IProxiedListModelsEntry>(\n {\n id: Validators.string,\n capabilities: Validators.arrayOf(\n Validators.enumeratedValue<AiModelCapability>(['chat', 'tools', 'vision', 'image-generation'])\n ),\n displayName: Validators.string.optional()\n }\n);\nconst proxiedListModelsResponse: Validator<IProxiedListModelsBody> =\n Validators.object<IProxiedListModelsBody>({\n models: Validators.arrayOf(proxiedListModelsEntry)\n });\n\n// ============================================================================\n// Image generation — adapters\n// ============================================================================\n\n/**\n * Calls the OpenAI Images API. Used for both `openai-images` and `xai-images`\n * formats — the request shape is the same; the only difference is whether the\n * `size` field is honored (OpenAI: yes, xAI: ignored at the provider).\n *\n * When `request.referenceImages` is non-empty, routes to `/images/edits`\n * (multipart) instead of `/images/generations` (JSON). Per-model edit support\n * is not validated here (e.g. dall-e-3 does not support edits) — the\n * provider's 400 surfaces through the failure path.\n *\n * @internal\n */\nasync function callOpenAiImageGeneration(\n config: IAiApiConfig,\n request: IAiImageGenerationParams,\n defaultMimeType: string,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<IAiImageGenerationResponse>> {\n const opts: IAiImageGenerationOptions = request.options ?? {};\n const refs = request.referenceImages ?? [];\n const headers: Record<string, string> = bearerAuthHeader(config.apiKey);\n const n = opts.count ?? 1;\n\n const fetched =\n refs.length > 0\n ? await callOpenAiImagesEdits(config, request, headers, n, refs, logger, signal)\n : await callOpenAiImagesGenerations(config, request, headers, n, logger, signal);\n\n return fetched.onSuccess((json) =>\n openAiImageResponse\n .validate(json)\n .withErrorFormat((msg) => `OpenAI images API response: ${msg}`)\n .onSuccess((response) =>\n succeed({\n images: response.data.map((item) => ({\n mimeType: defaultMimeType,\n base64: item.b64_json,\n ...(item.revised_prompt !== undefined ? { revisedPrompt: item.revised_prompt } : {})\n }))\n })\n )\n );\n}\n\n/**\n * Builds and posts the JSON `/images/generations` request (no refs).\n * @internal\n */\nfunction callOpenAiImagesGenerations(\n config: IAiApiConfig,\n request: IAiImageGenerationParams,\n headers: Record<string, string>,\n n: number,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<JsonObject>> {\n const opts: IAiImageGenerationOptions = request.options ?? {};\n const body: Record<string, unknown> = {\n model: config.model,\n prompt: request.prompt,\n n,\n response_format: 'b64_json'\n };\n if (opts.size !== undefined) {\n body.size = opts.size;\n }\n if (opts.quality !== undefined) {\n body.quality = opts.quality;\n }\n if (opts.seed !== undefined) {\n body.seed = opts.seed;\n }\n /* c8 ignore next 1 - optional logger */\n logger?.info(`Image generation: model=${config.model}, n=${n}`);\n return fetchJson(`${config.baseUrl}/images/generations`, headers, body, logger, signal);\n}\n\n/**\n * Builds and posts the multipart `/images/edits` request (with refs).\n * @internal\n */\nasync function callOpenAiImagesEdits(\n config: IAiApiConfig,\n request: IAiImageGenerationParams,\n headers: Record<string, string>,\n n: number,\n refs: ReadonlyArray<IAiImageAttachment>,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<JsonObject>> {\n const blobsResult = mapResults(\n refs.map((ref, i) => attachmentToBlob(ref).withErrorFormat((msg) => `reference image ${i}: ${msg}`))\n );\n /* c8 ignore next 3 - decode failure unreachable via Node's Buffer.from (silently strips invalid input) */\n if (blobsResult.isFailure()) {\n return fail(blobsResult.message);\n }\n\n const opts: IAiImageGenerationOptions = request.options ?? {};\n const form = new FormData();\n form.append('model', config.model);\n form.append('prompt', request.prompt);\n form.append('n', String(n));\n form.append('response_format', 'b64_json');\n if (opts.size !== undefined) {\n form.append('size', opts.size);\n }\n if (opts.quality !== undefined) {\n form.append('quality', opts.quality);\n }\n if (opts.seed !== undefined) {\n form.append('seed', String(opts.seed));\n }\n blobsResult.value.forEach((blob, i) => {\n form.append('image[]', blob, `ref-${i}.${extensionForMimeType(refs[i].mimeType)}`);\n });\n /* c8 ignore next 1 - optional logger */\n logger?.info(`Image edit: model=${config.model}, n=${n}, refs=${refs.length}`);\n return fetchMultipart(`${config.baseUrl}/images/edits`, headers, form, logger, signal);\n}\n\n/**\n * Calls Gemini's chat-style `:generateContent` endpoint for image output\n * (Gemini 2.5 Flash Image / \"Nano Banana\"). Accepts reference images, which\n * are passed as `inlineData` parts alongside the text prompt.\n *\n * @internal\n */\nasync function callGeminiImageOutGeneration(\n config: IAiApiConfig,\n request: IAiImageGenerationParams,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<IAiImageGenerationResponse>> {\n const url = `${config.baseUrl}/models/${config.model}:generateContent`;\n const refs = request.referenceImages ?? [];\n const parts: Array<Record<string, unknown>> = [{ text: request.prompt }];\n for (const ref of refs) {\n parts.push({ inlineData: { mimeType: ref.mimeType, data: ref.base64 } });\n }\n const body: Record<string, unknown> = {\n contents: [{ role: 'user', parts }]\n };\n const headers: Record<string, string> = {\n 'x-goog-api-key': config.apiKey\n };\n\n /* c8 ignore next 1 - optional logger */\n logger?.info(`Gemini image-out: model=${config.model}, refs=${refs.length}`);\n return (await fetchJson(url, headers, body, logger, signal)).onSuccess((json) =>\n geminiImageOutResponse\n .validate(json)\n .withErrorFormat((msg) => `Gemini image API response: ${msg}`)\n .onSuccess((response) => {\n const images: IAiGeneratedImage[] = [];\n for (const candidate of response.candidates) {\n for (const part of candidate.content.parts) {\n if (part.inlineData) {\n images.push({\n mimeType: part.inlineData.mimeType,\n base64: part.inlineData.data\n });\n }\n }\n }\n if (images.length === 0) {\n return fail('Gemini image API response: no image parts in response');\n }\n return succeed({ images });\n })\n );\n}\n\n/**\n * Calls the Gemini Imagen `:predict` endpoint.\n * @internal\n */\nasync function callImagenGeneration(\n config: IAiApiConfig,\n request: IAiImageGenerationParams,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<IAiImageGenerationResponse>> {\n const url = `${config.baseUrl}/models/${config.model}:predict`;\n const opts: IAiImageGenerationOptions = request.options ?? {};\n const parameters: Record<string, unknown> = {\n sampleCount: opts.count ?? 1\n };\n if (opts.imagen?.aspectRatio !== undefined) {\n parameters.aspectRatio = opts.imagen.aspectRatio;\n }\n if (opts.imagen?.negativePrompt !== undefined) {\n parameters.negativePrompt = opts.imagen.negativePrompt;\n }\n if (opts.seed !== undefined) {\n parameters.seed = opts.seed;\n }\n\n const body: Record<string, unknown> = {\n instances: [{ prompt: request.prompt }],\n parameters\n };\n\n const headers: Record<string, string> = {\n 'x-goog-api-key': config.apiKey\n };\n\n /* c8 ignore next 1 - optional logger */\n logger?.info(`Imagen generation: model=${config.model}, n=${parameters.sampleCount}`);\n const jsonResult = await fetchJson(url, headers, body, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n return imagenResponse\n .validate(jsonResult.value)\n .withErrorFormat((msg) => `Imagen API response: ${msg}`)\n .onSuccess((response) => {\n const images: IAiGeneratedImage[] = response.predictions.map((p) => ({\n mimeType: p.mimeType ?? 'image/png',\n base64: p.bytesBase64Encoded\n }));\n return succeed({ images });\n });\n}\n\n// ============================================================================\n// Image generation — dispatcher\n// ============================================================================\n\n/**\n * Calls the appropriate image-generation API for a given provider.\n *\n * Resolves a {@link IAiImageModelCapability} from\n * {@link IAiProviderDescriptor.imageGeneration} for the requested model and\n * routes by its `format`:\n * - `'openai-images'` for OpenAI (DALL-E, gpt-image-1)\n * - `'xai-images'` for xAI Grok image models\n * - `'gemini-imagen'` for Google Imagen `:predict`\n * - `'gemini-image-out'` for Gemini chat-style image output (Nano Banana)\n *\n * Image-model selection reuses the existing `'image'` {@link ModelSpecKey}.\n * When `request.referenceImages` is non-empty, the call is rejected up front\n * unless the resolved capability declares `acceptsImageReferenceInput`.\n *\n * @param params - Request parameters including descriptor, API key, and prompt\n * @returns The generated images, or a failure\n * @public\n */\nexport async function callProviderImageGeneration(\n params: IProviderImageGenerationParams\n): Promise<Result<IAiImageGenerationResponse>> {\n const { descriptor, apiKey, params: request, modelOverride, logger, signal, endpoint } = params;\n\n if (!supportsImageGeneration(descriptor)) {\n return fail(`provider \"${descriptor.id}\" does not support image generation`);\n }\n const baseUrlResult = resolveEffectiveBaseUrl(descriptor, endpoint);\n if (baseUrlResult.isFailure()) {\n return fail(baseUrlResult.message);\n }\n\n const model = resolveModel(modelOverride ?? descriptor.defaultModel, 'image');\n if (model.length === 0) {\n return fail(\n `provider \"${descriptor.id}\": no image model resolved; ` +\n `pass modelOverride or set descriptor.defaultModel ` +\n `(a plain string, or an object with an \"image\" entry)`\n );\n }\n const capability = resolveImageCapability(descriptor, model);\n if (capability === undefined) {\n return fail(`provider \"${descriptor.id}\" does not support image generation for model \"${model}\"`);\n }\n if ((request.referenceImages?.length ?? 0) > 0 && !capability.acceptsImageReferenceInput) {\n return fail(`model \"${model}\" does not support reference images`);\n }\n\n const config: IAiApiConfig = {\n baseUrl: baseUrlResult.value,\n apiKey,\n model\n };\n /* c8 ignore next 6 - optional logger diagnostic output */\n if (logger) {\n logger.info(\n `AI image generation: provider=${descriptor.id}, format=${capability.format}, ` +\n `model=${config.model}`\n );\n }\n\n switch (capability.format) {\n case 'openai-images':\n return callOpenAiImageGeneration(config, request, 'image/png', logger, signal);\n case 'xai-images':\n return callOpenAiImageGeneration(config, request, 'image/jpeg', logger, signal);\n case 'gemini-imagen':\n return callImagenGeneration(config, request, logger, signal);\n case 'gemini-image-out':\n return callGeminiImageOutGeneration(config, request, logger, signal);\n /* c8 ignore next 4 - defensive coding: exhaustive switch guaranteed by TypeScript */\n default: {\n const _exhaustive: never = capability.format;\n return fail(`unsupported image API format: ${String(_exhaustive)}`);\n }\n }\n}\n\n// ============================================================================\n// List models — request types\n// ============================================================================\n\n/**\n * Parameters for a list-models request.\n * @public\n */\nexport interface IProviderListModelsParams {\n /** The provider descriptor */\n readonly descriptor: IAiProviderDescriptor;\n /** API key for authentication */\n readonly apiKey: string;\n /** Optional capability filter; when set, only models declaring this capability are returned. */\n readonly capability?: AiModelCapability;\n /** Optional capability config override (defaults to {@link DEFAULT_MODEL_CAPABILITY_CONFIG}). */\n readonly capabilityConfig?: IAiModelCapabilityConfig;\n /** Optional logger for request/response observability. */\n readonly logger?: Logging.ILogger;\n /** Optional abort signal for cancelling the in-flight request. */\n readonly signal?: AbortSignal;\n /**\n * Optional override of the descriptor's default base URL — a well-formed\n * `http`/`https` URL substituted for `descriptor.baseUrl`, with the\n * per-format `/models` route appended unchanged.\n */\n readonly endpoint?: string;\n}\n\n// ============================================================================\n// List models — response validators\n// ============================================================================\n\n// ---- OpenAI / xAI / Groq / Mistral list format ----\n\n/** @internal */\ninterface IOpenAiListEntry {\n id: string;\n}\n/** @internal */\ninterface IOpenAiListResponse {\n data: IOpenAiListEntry[];\n}\n\nconst openAiListEntry: Validator<IOpenAiListEntry> = Validators.object<IOpenAiListEntry>({\n id: Validators.string\n});\nconst openAiListResponse: Validator<IOpenAiListResponse> = Validators.object<IOpenAiListResponse>({\n data: Validators.arrayOf(openAiListEntry)\n});\n\n// ---- Anthropic list format ----\n\n/** @internal */\ninterface IAnthropicListEntry {\n id: string;\n display_name?: string;\n}\n/** @internal */\ninterface IAnthropicListResponse {\n data: IAnthropicListEntry[];\n}\n\nconst anthropicListEntry: Validator<IAnthropicListEntry> = Validators.object<IAnthropicListEntry>({\n id: Validators.string,\n display_name: Validators.string.optional()\n});\nconst anthropicListResponse: Validator<IAnthropicListResponse> = Validators.object<IAnthropicListResponse>({\n data: Validators.arrayOf(anthropicListEntry)\n});\n\n// ---- Gemini list format ----\n\n/** @internal */\ninterface IGeminiListEntry {\n name: string;\n displayName?: string;\n supportedGenerationMethods?: string[];\n}\n/** @internal */\ninterface IGeminiListResponse {\n models: IGeminiListEntry[];\n}\n\nconst geminiListEntry: Validator<IGeminiListEntry> = Validators.object<IGeminiListEntry>({\n name: Validators.string,\n displayName: Validators.string.optional(),\n supportedGenerationMethods: Validators.arrayOf(Validators.string).optional()\n});\nconst geminiListResponse: Validator<IGeminiListResponse> = Validators.object<IGeminiListResponse>({\n models: Validators.arrayOf(geminiListEntry)\n});\n\n// ============================================================================\n// List models — capability resolution\n// ============================================================================\n\n/**\n * Translates Gemini's `supportedGenerationMethods` strings into our abstract\n * capability vocabulary. Methods without a mapping are ignored.\n * @internal\n */\nfunction geminiMethodsToCapabilities(methods: ReadonlyArray<string>): ReadonlyArray<AiModelCapability> {\n const out: AiModelCapability[] = [];\n for (const m of methods) {\n if (m === 'generateContent') {\n out.push('chat');\n } else if (m === 'predict') {\n out.push('image-generation');\n }\n }\n return out;\n}\n\n/**\n * Strips the `models/` prefix Gemini includes on listed model names.\n * @internal\n */\nfunction geminiBareId(name: string): string {\n return name.startsWith('models/') ? name.substring('models/'.length) : name;\n}\n\n/**\n * Applies a capability config to a model id. Walks per-provider rules then\n * global rules; unions all matching rules' capabilities. Returns the union\n * and the first matching `displayName` (if any).\n * @internal\n */\nfunction applyCapabilityConfig(\n config: IAiModelCapabilityConfig,\n providerId: string,\n modelId: string\n): { capabilities: AiModelCapability[]; displayName: string | undefined } {\n const caps = new Set<AiModelCapability>();\n let displayName: string | undefined;\n\n const rulesets: ReadonlyArray<ReadonlyArray<IAiModelCapabilityRule>> = [\n config.perProvider?.[providerId as keyof typeof config.perProvider] ?? [],\n config.global ?? []\n ];\n\n for (const rules of rulesets) {\n for (const rule of rules) {\n rule.idPattern.lastIndex = 0;\n if (rule.idPattern.test(modelId)) {\n for (const cap of rule.capabilities) {\n caps.add(cap);\n }\n if (displayName === undefined && rule.displayName !== undefined) {\n displayName = typeof rule.displayName === 'function' ? rule.displayName(modelId) : rule.displayName;\n }\n }\n }\n }\n return { capabilities: Array.from(caps), displayName };\n}\n\n/**\n * Combines provider-native capability info (when supplied) and config-derived\n * capability info into a final {@link IAiModelInfo}.\n * @internal\n */\nfunction buildModelInfo(\n providerId: string,\n id: string,\n nativeCapabilities: ReadonlyArray<AiModelCapability>,\n nativeDisplayName: string | undefined,\n config: IAiModelCapabilityConfig\n): IAiModelInfo {\n const fromConfig = applyCapabilityConfig(config, providerId, id);\n const all = new Set<AiModelCapability>([...nativeCapabilities, ...fromConfig.capabilities]);\n return {\n id,\n capabilities: all,\n ...(nativeDisplayName !== undefined\n ? { displayName: nativeDisplayName }\n : fromConfig.displayName !== undefined\n ? { displayName: fromConfig.displayName }\n : {})\n };\n}\n\n// ============================================================================\n// List models — adapters\n// ============================================================================\n\n/**\n * Calls the OpenAI-style `GET /models` endpoint. Used by openai, xai-grok,\n * groq, and mistral. Provider supplies no capability info — capabilities are\n * derived entirely from the config.\n * @internal\n */\nasync function callOpenAiListModels(\n config: IAiApiConfig,\n providerId: string,\n capabilityConfig: IAiModelCapabilityConfig,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<ReadonlyArray<IAiModelInfo>>> {\n const url = `${config.baseUrl}/models`;\n const headers: Record<string, string> = bearerAuthHeader(config.apiKey);\n /* c8 ignore next 1 - optional logger */\n logger?.info(`List models: provider=${providerId}, format=openai`);\n const jsonResult = await fetchGetJson(url, headers, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n return openAiListResponse\n .validate(jsonResult.value)\n .withErrorFormat((msg) => `OpenAI models API response: ${msg}`)\n .onSuccess((response) => {\n const models = response.data.map((entry) =>\n buildModelInfo(providerId, entry.id, [], undefined, capabilityConfig)\n );\n return succeed(models);\n });\n}\n\n/**\n * Calls the Anthropic `GET /models` endpoint. Provider supplies a\n * `display_name` but no native capability info.\n * @internal\n */\nasync function callAnthropicListModels(\n config: IAiApiConfig,\n providerId: string,\n capabilityConfig: IAiModelCapabilityConfig,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<ReadonlyArray<IAiModelInfo>>> {\n const url = `${config.baseUrl}/models`;\n const headers: Record<string, string> = {\n 'x-api-key': config.apiKey,\n 'anthropic-version': '2023-06-01',\n 'anthropic-dangerous-direct-browser-access': 'true'\n };\n /* c8 ignore next 1 - optional logger */\n logger?.info(`List models: provider=${providerId}, format=anthropic`);\n const jsonResult = await fetchGetJson(url, headers, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n return anthropicListResponse\n .validate(jsonResult.value)\n .withErrorFormat((msg) => `Anthropic models API response: ${msg}`)\n .onSuccess((response) => {\n const models = response.data.map((entry) =>\n buildModelInfo(providerId, entry.id, [], entry.display_name, capabilityConfig)\n );\n return succeed(models);\n });\n}\n\n/**\n * Calls the Gemini `GET /models` endpoint. Provider supplies both a\n * `displayName` and `supportedGenerationMethods` — translated to native\n * capabilities and unioned with config-derived capabilities.\n * @internal\n */\nasync function callGeminiListModels(\n config: IAiApiConfig,\n providerId: string,\n capabilityConfig: IAiModelCapabilityConfig,\n logger?: Logging.ILogger,\n signal?: AbortSignal\n): Promise<Result<ReadonlyArray<IAiModelInfo>>> {\n const url = `${config.baseUrl}/models`;\n const headers: Record<string, string> = {\n 'x-goog-api-key': config.apiKey\n };\n /* c8 ignore next 1 - optional logger */\n logger?.info(`List models: provider=${providerId}, format=gemini`);\n const jsonResult = await fetchGetJson(url, headers, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n return geminiListResponse\n .validate(jsonResult.value)\n .withErrorFormat((msg) => `Gemini models API response: ${msg}`)\n .onSuccess((response) => {\n const models = response.models.map((entry) => {\n const id = geminiBareId(entry.name);\n const native = entry.supportedGenerationMethods\n ? geminiMethodsToCapabilities(entry.supportedGenerationMethods)\n : [];\n return buildModelInfo(providerId, id, native, entry.displayName, capabilityConfig);\n });\n return succeed(models);\n });\n}\n\n// ============================================================================\n// List models — dispatcher\n// ============================================================================\n\n/**\n * Lists models available from a provider, with capabilities resolved from\n * native provider info (where supplied) and a configurable rule set.\n *\n * Routes based on `descriptor.apiFormat` — listing reuses the existing\n * format dispatch and does not require a separate descriptor field.\n *\n * @param params - Request parameters including descriptor, API key, and optional capability filter\n * @returns The resolved model list, or a failure\n * @public\n */\nexport async function callProviderListModels(\n params: IProviderListModelsParams\n): Promise<Result<ReadonlyArray<IAiModelInfo>>> {\n const { descriptor, apiKey, capability, capabilityConfig, logger, signal, endpoint } = params;\n\n const baseUrlResult = resolveEffectiveBaseUrl(descriptor, endpoint);\n if (baseUrlResult.isFailure()) {\n return fail(baseUrlResult.message);\n }\n\n const config: IAiApiConfig = {\n baseUrl: baseUrlResult.value,\n apiKey,\n model: '' // unused by listing\n };\n const effectiveConfig = capabilityConfig ?? DEFAULT_MODEL_CAPABILITY_CONFIG;\n\n let listResult: Result<ReadonlyArray<IAiModelInfo>>;\n switch (descriptor.apiFormat) {\n case 'openai':\n listResult = await callOpenAiListModels(config, descriptor.id, effectiveConfig, logger, signal);\n break;\n case 'anthropic':\n listResult = await callAnthropicListModels(config, descriptor.id, effectiveConfig, logger, signal);\n break;\n case 'gemini':\n listResult = await callGeminiListModels(config, descriptor.id, effectiveConfig, logger, signal);\n break;\n /* c8 ignore next 4 - defensive coding: exhaustive switch guaranteed by TypeScript */\n default: {\n const _exhaustive: never = descriptor.apiFormat;\n return fail(`unsupported API format: ${String(_exhaustive)}`);\n }\n }\n\n if (listResult.isFailure()) {\n return listResult;\n }\n if (capability === undefined) {\n return listResult;\n }\n return succeed(listResult.value.filter((m) => m.capabilities.has(capability)));\n}\n\n// ============================================================================\n// Proxied list models\n// ============================================================================\n\n/**\n * Calls the model-listing endpoint on a proxy server.\n *\n * @remarks\n * Proxy contract:\n * - Endpoint: `POST ${proxyUrl}/api/ai/list-models`\n * - Request body: `{providerId, apiKey, capability?}`. Capability config is\n * not forwarded — the proxy applies its own (typically the same default\n * the library ships).\n * - Success response body: an `IAiModelInfo[]` (under key `models`) where\n * `capabilities` is serialized as a string array (not Set, which doesn't\n * round-trip through JSON).\n * - Error response body: `{error: string}`, surfaced as `proxy: ${error}`.\n *\n * @public\n */\nexport async function callProxiedListModels(\n proxyUrl: string,\n params: IProviderListModelsParams\n): Promise<Result<ReadonlyArray<IAiModelInfo>>> {\n const { descriptor, apiKey, capability, logger, signal } = params;\n\n const body: Record<string, unknown> = {\n providerId: descriptor.id,\n apiKey\n };\n if (capability !== undefined) {\n body.capability = capability;\n }\n\n /* c8 ignore next 1 - optional logger */\n logger?.info(`AI list-models proxy request: provider=${descriptor.id}, proxy=${proxyUrl}`);\n\n const url = `${proxyUrl}/api/ai/list-models`;\n const jsonResult = await fetchJson(url, {}, body, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n\n const response = jsonResult.value as Record<string, unknown>;\n if (typeof response.error === 'string') {\n return fail(`proxy: ${response.error}`);\n }\n\n return proxiedListModelsResponse\n .validate(response)\n .withErrorFormat((msg) => `proxy returned invalid response: ${msg}`)\n .onSuccess((parsed) => {\n const models: IAiModelInfo[] = parsed.models.map((m) => ({\n id: m.id,\n capabilities: new Set<AiModelCapability>(m.capabilities),\n ...(m.displayName !== undefined ? { displayName: m.displayName } : {})\n }));\n return succeed(models);\n });\n}\n\n// ============================================================================\n// Proxied completion (routes through a backend server)\n// ============================================================================\n\n/**\n * Calls the AI completion endpoint on a proxy server instead of calling\n * the provider API directly from the browser.\n *\n * The proxy server handles provider dispatch, CORS, and API key forwarding.\n * The request shape mirrors {@link IProviderCompletionParams} but is serialized\n * as JSON for the proxy endpoint.\n *\n * @param proxyUrl - Base URL of the proxy server (e.g. `http://localhost:3001`)\n * @param params - Same parameters as {@link callProviderCompletion}\n * @returns The completion response, or a failure\n * @public\n */\nexport async function callProxiedCompletion(\n proxyUrl: string,\n params: IProviderCompletionParams\n): Promise<Result<IAiCompletionResponse>> {\n const {\n descriptor,\n apiKey,\n prompt,\n additionalMessages,\n temperature,\n modelOverride,\n logger,\n tools,\n signal\n } = params;\n\n const promptBody: Record<string, unknown> = { system: prompt.system, user: prompt.user };\n if (prompt.attachments.length > 0) {\n promptBody.attachments = prompt.attachments;\n }\n const body: Record<string, unknown> = {\n providerId: descriptor.id,\n apiKey,\n prompt: promptBody,\n temperature: temperature ?? 0.7\n };\n if (additionalMessages && additionalMessages.length > 0) {\n body.additionalMessages = additionalMessages;\n }\n if (modelOverride !== undefined) {\n body.modelOverride = modelOverride;\n }\n if (tools && tools.length > 0) {\n body.tools = tools;\n }\n\n /* c8 ignore next 1 - optional logger */\n logger?.info(`AI proxy request: provider=${descriptor.id}, proxy=${proxyUrl}`);\n\n const url = `${proxyUrl}/api/ai/completion`;\n const jsonResult = await fetchJson(url, {}, body, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n\n // Check for error response from proxy\n const response = jsonResult.value as Record<string, unknown>;\n if (typeof response.error === 'string') {\n return fail(`proxy: ${response.error}`);\n }\n\n if (typeof response.content !== 'string') {\n return fail('proxy returned invalid response: missing content');\n }\n\n return succeed({\n content: response.content,\n truncated: response.truncated === true\n });\n}\n\n// ============================================================================\n// Proxied image generation\n// ============================================================================\n\n/**\n * Calls the image-generation endpoint on a proxy server instead of calling\n * the provider API directly from the browser.\n *\n * @remarks\n * The proxy contract:\n * - Endpoint: `POST ${proxyUrl}/api/ai/image-generation`\n * - Request body: `{providerId, apiKey, params, modelOverride?}`\n * - Success response body: an {@link IAiImageGenerationResponse}\n * - Error response body: `{error: string}` (surfaced as `proxy: ${error}`)\n *\n * The proxy server is responsible for descriptor lookup, model resolution,\n * provider dispatch, and response normalization. When `params.referenceImages`\n * is present, the proxy is also responsible for repackaging it into the\n * upstream wire format (e.g. multipart/form-data for OpenAI `/images/edits`,\n * `inlineData` parts for Gemini `:generateContent`).\n *\n * @param proxyUrl - Base URL of the proxy server (e.g. `http://localhost:3001`)\n * @param params - Same parameters as {@link callProviderImageGeneration}\n * @returns The generated images, or a failure\n * @public\n */\nexport async function callProxiedImageGeneration(\n proxyUrl: string,\n params: IProviderImageGenerationParams\n): Promise<Result<IAiImageGenerationResponse>> {\n const { descriptor, apiKey, params: request, modelOverride, logger, signal } = params;\n\n const body: Record<string, unknown> = {\n providerId: descriptor.id,\n apiKey,\n params: request\n };\n if (modelOverride !== undefined) {\n body.modelOverride = modelOverride;\n }\n\n /* c8 ignore next 1 - optional logger */\n logger?.info(`AI image proxy request: provider=${descriptor.id}, proxy=${proxyUrl}`);\n\n const url = `${proxyUrl}/api/ai/image-generation`;\n const jsonResult = await fetchJson(url, {}, body, logger, signal);\n if (jsonResult.isFailure()) {\n return fail(jsonResult.message);\n }\n\n const response = jsonResult.value as Record<string, unknown>;\n if (typeof response.error === 'string') {\n return fail(`proxy: ${response.error}`);\n }\n\n return proxiedImageGenerationResponse\n .validate(response)\n .withErrorFormat((msg) => `proxy returned invalid response: ${msg}`);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"converters.d.ts","sourceRoot":"","sources":["../../../src/packlets/ai-assist/converters.ts"],"names":[],"mappings":"AAoBA;;;GAGG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAc,MAAM,eAAe,CAAC;AAE3D,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,SAAS,EACd,KAAK,YAAY,EAElB,MAAM,SAAS,CAAC;AAOjB;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,SAAS,CAAC,YAAY,CAA4D,CAAC;AAY9G;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CACS,CAAC;AAEnE;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,CAAC,sBAAsB,CAOhE,CAAC;AAEL;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,CAAC,kBAAkB,CAGzD,CAAC;AAEL;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,iBAAiB,CAIxD,CAAC;AAMH;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,SAAS,CAAC,YAAY,CACW,CAAC;AAE7D;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,EAAE,SAAS,CAAC,SAAS,CAS1C,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,CAAC,uBAAuB,CAMlE,CAAC;AAEL;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,iBAAiB,CAKxD,CAAC"}
1
+ {"version":3,"file":"converters.d.ts","sourceRoot":"","sources":["../../../src/packlets/ai-assist/converters.ts"],"names":[],"mappings":"AAoBA;;;GAGG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAc,MAAM,eAAe,CAAC;AAE3D,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,SAAS,EACd,KAAK,YAAY,EAElB,MAAM,SAAS,CAAC;AAOjB;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,SAAS,CAAC,YAAY,CAA4D,CAAC;AAY9G;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CACS,CAAC;AAEnE;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,CAAC,sBAAsB,CAOhE,CAAC;AAEL;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,CAAC,kBAAkB,CAGzD,CAAC;AAEL;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,iBAAiB,CAIxD,CAAC;AAMH;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,SAAS,CAAC,YAAY,CACW,CAAC;AAE7D;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,EAAE,SAAS,CAAC,SAAS,CAS1C,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,CAAC,uBAAuB,CAOlE,CAAC;AAEL;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,iBAAiB,CAKxD,CAAC"}
@@ -109,7 +109,8 @@ exports.aiAssistProviderConfig = ts_utils_1.Converters.strictObject({
109
109
  provider: exports.aiProviderId,
110
110
  secretName: ts_utils_1.Converters.string.optional(),
111
111
  model: exports.modelSpec.optional(),
112
- tools: ts_utils_1.Converters.arrayOf(exports.aiToolEnablement).optional()
112
+ tools: ts_utils_1.Converters.arrayOf(exports.aiToolEnablement).optional(),
113
+ endpoint: ts_utils_1.Converters.string.optional()
113
114
  });
114
115
  /**
115
116
  * Converter for {@link IAiAssistSettings}.
@@ -1 +1 @@
1
- {"version":3,"file":"converters.js","sourceRoot":"","sources":["../../../src/packlets/ai-assist/converters.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Erik Fortune\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n/**\n * Converters for AI assist settings types.\n * @packageDocumentation\n */\n\nimport { type Converter, Converters } from '@fgv/ts-utils';\n\nimport {\n type AiProviderId,\n type AiServerToolConfig,\n type AiServerToolType,\n type IAiAssistProviderConfig,\n type IAiAssistSettings,\n type IAiToolEnablement,\n type IAiWebSearchToolConfig,\n type ModelSpec,\n type ModelSpecKey,\n allModelSpecKeys\n} from './model';\nimport { allProviderIds } from './registry';\n\n// ============================================================================\n// Provider ID\n// ============================================================================\n\n/**\n * Converter for {@link AiProviderId}.\n * @public\n */\nexport const aiProviderId: Converter<AiProviderId> = Converters.enumeratedValue<AiProviderId>(allProviderIds);\n\n// ============================================================================\n// Server-Side Tool Converters\n// ============================================================================\n\n/**\n * All known server-side tool type values.\n * @internal\n */\nconst allServerToolTypes: ReadonlyArray<AiServerToolType> = ['web_search'];\n\n/**\n * Converter for {@link AiServerToolType}.\n * @public\n */\nexport const aiServerToolType: Converter<AiServerToolType> =\n Converters.enumeratedValue<AiServerToolType>(allServerToolTypes);\n\n/**\n * Converter for {@link IAiWebSearchToolConfig}.\n * @public\n */\nexport const aiWebSearchToolConfig: Converter<IAiWebSearchToolConfig> =\n Converters.strictObject<IAiWebSearchToolConfig>({\n type: Converters.enumeratedValue<'web_search'>(['web_search']),\n allowedDomains: Converters.arrayOf(Converters.string).optional(),\n blockedDomains: Converters.arrayOf(Converters.string).optional(),\n maxUses: Converters.number.optional(),\n enableImageUnderstanding: Converters.boolean.optional()\n });\n\n/**\n * Converter for {@link AiServerToolConfig} (discriminated union on `type`).\n * @public\n */\nexport const aiServerToolConfig: Converter<AiServerToolConfig> =\n Converters.discriminatedObject<AiServerToolConfig>('type', {\n web_search: aiWebSearchToolConfig\n });\n\n/**\n * Converter for {@link IAiToolEnablement}.\n * @public\n */\nexport const aiToolEnablement: Converter<IAiToolEnablement> = Converters.strictObject<IAiToolEnablement>({\n type: aiServerToolType,\n enabled: Converters.boolean,\n config: aiServerToolConfig.optional()\n});\n\n// ============================================================================\n// Model Specification\n// ============================================================================\n\n/**\n * Converter for {@link ModelSpecKey}.\n * @public\n */\nexport const modelSpecKey: Converter<ModelSpecKey> =\n Converters.enumeratedValue<ModelSpecKey>(allModelSpecKeys);\n\n/**\n * Recursive converter for {@link ModelSpec}.\n * Accepts a string or an object whose values are themselves ModelSpec values,\n * with keys constrained to known {@link ModelSpecKey} values.\n * Uses the `self` parameter from `Converters.generic` for recursion.\n * @public\n */\nexport const modelSpec: Converter<ModelSpec> = Converters.generic<ModelSpec>(\n (from: unknown, self: Converter<ModelSpec>) => {\n return Converters.oneOf<ModelSpec>([\n Converters.string,\n Converters.recordOf(self, { keyConverter: modelSpecKey })\n ])\n .withFormattedError(() => 'expected model spec (string or object with keys: base, tools, image)')\n .convert(from);\n }\n);\n\n// ============================================================================\n// Provider Config & Settings\n// ============================================================================\n\n/**\n * Converter for {@link IAiAssistProviderConfig}.\n * @public\n */\nexport const aiAssistProviderConfig: Converter<IAiAssistProviderConfig> =\n Converters.strictObject<IAiAssistProviderConfig>({\n provider: aiProviderId,\n secretName: Converters.string.optional(),\n model: modelSpec.optional(),\n tools: Converters.arrayOf(aiToolEnablement).optional()\n });\n\n/**\n * Converter for {@link IAiAssistSettings}.\n * @public\n */\nexport const aiAssistSettings: Converter<IAiAssistSettings> = Converters.strictObject<IAiAssistSettings>({\n providers: Converters.arrayOf(aiAssistProviderConfig),\n defaultProvider: aiProviderId.optional(),\n proxyUrl: Converters.string.optional(),\n proxyAllProviders: Converters.boolean.optional()\n});\n"]}
1
+ {"version":3,"file":"converters.js","sourceRoot":"","sources":["../../../src/packlets/ai-assist/converters.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Erik Fortune\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n/**\n * Converters for AI assist settings types.\n * @packageDocumentation\n */\n\nimport { type Converter, Converters } from '@fgv/ts-utils';\n\nimport {\n type AiProviderId,\n type AiServerToolConfig,\n type AiServerToolType,\n type IAiAssistProviderConfig,\n type IAiAssistSettings,\n type IAiToolEnablement,\n type IAiWebSearchToolConfig,\n type ModelSpec,\n type ModelSpecKey,\n allModelSpecKeys\n} from './model';\nimport { allProviderIds } from './registry';\n\n// ============================================================================\n// Provider ID\n// ============================================================================\n\n/**\n * Converter for {@link AiProviderId}.\n * @public\n */\nexport const aiProviderId: Converter<AiProviderId> = Converters.enumeratedValue<AiProviderId>(allProviderIds);\n\n// ============================================================================\n// Server-Side Tool Converters\n// ============================================================================\n\n/**\n * All known server-side tool type values.\n * @internal\n */\nconst allServerToolTypes: ReadonlyArray<AiServerToolType> = ['web_search'];\n\n/**\n * Converter for {@link AiServerToolType}.\n * @public\n */\nexport const aiServerToolType: Converter<AiServerToolType> =\n Converters.enumeratedValue<AiServerToolType>(allServerToolTypes);\n\n/**\n * Converter for {@link IAiWebSearchToolConfig}.\n * @public\n */\nexport const aiWebSearchToolConfig: Converter<IAiWebSearchToolConfig> =\n Converters.strictObject<IAiWebSearchToolConfig>({\n type: Converters.enumeratedValue<'web_search'>(['web_search']),\n allowedDomains: Converters.arrayOf(Converters.string).optional(),\n blockedDomains: Converters.arrayOf(Converters.string).optional(),\n maxUses: Converters.number.optional(),\n enableImageUnderstanding: Converters.boolean.optional()\n });\n\n/**\n * Converter for {@link AiServerToolConfig} (discriminated union on `type`).\n * @public\n */\nexport const aiServerToolConfig: Converter<AiServerToolConfig> =\n Converters.discriminatedObject<AiServerToolConfig>('type', {\n web_search: aiWebSearchToolConfig\n });\n\n/**\n * Converter for {@link IAiToolEnablement}.\n * @public\n */\nexport const aiToolEnablement: Converter<IAiToolEnablement> = Converters.strictObject<IAiToolEnablement>({\n type: aiServerToolType,\n enabled: Converters.boolean,\n config: aiServerToolConfig.optional()\n});\n\n// ============================================================================\n// Model Specification\n// ============================================================================\n\n/**\n * Converter for {@link ModelSpecKey}.\n * @public\n */\nexport const modelSpecKey: Converter<ModelSpecKey> =\n Converters.enumeratedValue<ModelSpecKey>(allModelSpecKeys);\n\n/**\n * Recursive converter for {@link ModelSpec}.\n * Accepts a string or an object whose values are themselves ModelSpec values,\n * with keys constrained to known {@link ModelSpecKey} values.\n * Uses the `self` parameter from `Converters.generic` for recursion.\n * @public\n */\nexport const modelSpec: Converter<ModelSpec> = Converters.generic<ModelSpec>(\n (from: unknown, self: Converter<ModelSpec>) => {\n return Converters.oneOf<ModelSpec>([\n Converters.string,\n Converters.recordOf(self, { keyConverter: modelSpecKey })\n ])\n .withFormattedError(() => 'expected model spec (string or object with keys: base, tools, image)')\n .convert(from);\n }\n);\n\n// ============================================================================\n// Provider Config & Settings\n// ============================================================================\n\n/**\n * Converter for {@link IAiAssistProviderConfig}.\n * @public\n */\nexport const aiAssistProviderConfig: Converter<IAiAssistProviderConfig> =\n Converters.strictObject<IAiAssistProviderConfig>({\n provider: aiProviderId,\n secretName: Converters.string.optional(),\n model: modelSpec.optional(),\n tools: Converters.arrayOf(aiToolEnablement).optional(),\n endpoint: Converters.string.optional()\n });\n\n/**\n * Converter for {@link IAiAssistSettings}.\n * @public\n */\nexport const aiAssistSettings: Converter<IAiAssistSettings> = Converters.strictObject<IAiAssistSettings>({\n providers: Converters.arrayOf(aiAssistProviderConfig),\n defaultProvider: aiProviderId.optional(),\n proxyUrl: Converters.string.optional(),\n proxyAllProviders: Converters.boolean.optional()\n});\n"]}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Helper for resolving a request's effective base URL from a provider
3
+ * descriptor and an optional caller-supplied endpoint override.
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ import { Result } from '@fgv/ts-utils';
8
+ import { type IAiProviderDescriptor } from './model';
9
+ /**
10
+ * Builds an OpenAI-style `Authorization: Bearer ${key}` header, or an empty
11
+ * record when the key is empty. Self-hosted/local OpenAI-compatible servers
12
+ * (Ollama, LM Studio, llama.cpp) often reject `Authorization: Bearer ` with
13
+ * an empty key, so we omit the header entirely in that case.
14
+ *
15
+ * @internal
16
+ */
17
+ export declare function bearerAuthHeader(apiKey: string): Record<string, string>;
18
+ /**
19
+ * Resolves the effective base URL for a request, validating the optional
20
+ * `endpoint` override when present. Returns the URL with any trailing slash
21
+ * stripped so per-route suffix concatenation (e.g. `/chat/completions`)
22
+ * produces the same shape regardless of whether the caller supplied an
23
+ * override or the descriptor's default is used.
24
+ *
25
+ * @internal
26
+ */
27
+ export declare function resolveEffectiveBaseUrl(descriptor: IAiProviderDescriptor, endpoint?: string): Result<string>;
28
+ //# sourceMappingURL=endpoint.d.ts.map