@jambonz/llm 0.2.5 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +26 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +26 -2
- package/dist/index.js.map +1 -1
- package/dist/test-kit/index.cjs +26 -2
- package/dist/test-kit/index.cjs.map +1 -1
- package/dist/test-kit/index.js +26 -2
- package/dist/test-kit/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/registry.ts","../src/adapters/openai/adapter.ts","../src/validate.ts","../src/adapters/openai/_streaming.ts","../src/adapters/openai/manifest.ts","../src/adapters/openai/factory.ts","../src/adapters/anthropic/adapter.ts","../src/adapters/anthropic/manifest.ts","../src/adapters/anthropic/factory.ts","../src/adapters/google/adapter.ts","../src/adapters/google/_streaming.ts","../src/adapters/google/manifest.ts","../src/adapters/google/factory.ts","../src/adapters/vertex-gemini/adapter.ts","../src/adapters/vertex-gemini/manifest.ts","../src/adapters/vertex-gemini/factory.ts","../src/adapters/vertex-openai/adapter.ts","../src/adapters/vertex-openai/manifest.ts","../src/adapters/vertex-openai/factory.ts","../src/adapters/bedrock/adapter.ts","../src/adapters/bedrock/manifest.ts","../src/adapters/bedrock/factory.ts","../src/adapters/index.ts","../src/normalize-auth.ts"],"sourcesContent":["/**\n * @jambonz/llm — voice-oriented LLM adapter library.\n *\n * Public entry point. Importing this module auto-registers all bundled adapters\n * via the side-effectful import of `./adapters/index.js`.\n *\n * Consumers use:\n * - `createLlm({vendor, auth, client?})` to get a ready-to-stream adapter instance.\n * - `getManifest()` to enumerate registered vendors (used by api-server).\n * - `normalizeAuth(vendor, rawCred)` to convert DB-shape creds to AuthSpec.\n * - `registerAdapter(factory)` to add a custom adapter at runtime.\n */\n\n// Side effect: register all bundled adapters. Must come first.\nimport './adapters/index.js';\n\nimport { getAdapterFactory } from './registry.js';\nimport type {\n AuthSpec,\n CreateLlmArgs,\n LlmAdapter,\n} from './types.js';\n\nexport async function createLlm<A extends AuthSpec = AuthSpec>(\n args: CreateLlmArgs<A>,\n): Promise<LlmAdapter<A>> {\n const factory = getAdapterFactory<A>(args.vendor);\n if (!factory.manifest.authKinds.some((k) => k.kind === args.auth.kind)) {\n const accepted = factory.manifest.authKinds.map((k) => k.kind).join(', ');\n throw new Error(\n `Vendor '${args.vendor}' does not accept auth kind '${args.auth.kind}'. ` +\n `Accepted kinds: ${accepted}`,\n );\n }\n const instance = factory.create();\n await Promise.resolve(instance.init(args.auth, args.client));\n return instance;\n}\n\n// Re-export the full public surface.\nexport type {\n AdapterFactory,\n AdapterManifest,\n ApiKeyAuth,\n AuthKind,\n AuthKindSchema,\n AuthSpec,\n BedrockApiKeyAuth,\n BedrockIamAuth,\n ClientOptions,\n ContentBlock,\n CreateLlmArgs,\n FinishReason,\n FormField,\n FormFieldType,\n GoogleApiKeyAuth,\n GoogleServiceAccountAuth,\n JsonSchema,\n LlmAdapter,\n LlmEvent,\n Message,\n ModelCapabilities,\n ModelInfo,\n PromptRequest,\n Role,\n ServiceAccountJson,\n Tool,\n ToolCallEvent,\n Usage,\n VertexServiceAccountAuth,\n} from './types.js';\n\nexport { normalizeAuth } from './normalize-auth.js';\nexport type { RawCredential } from './normalize-auth.js';\n\nexport { assertValidRequest } from './validate.js';\n\nexport {\n getAdapterFactory,\n getManifest,\n listVendors,\n registerAdapter,\n replaceAdapter,\n unregisterAdapter,\n} from './registry.js';\n","import type { AdapterFactory, AdapterManifest, AuthSpec } from './types.js';\n\n/**\n * Module-scope registry of adapter factories, keyed by vendor id.\n *\n * Adapters register themselves at import time via `registerAdapter`. Consumers\n * of the library then call `createLlm({vendor, auth})` and the factory for\n * that vendor is looked up here.\n */\nconst registry = new Map<string, AdapterFactory>();\n\n/**\n * Register an adapter factory. Called once per adapter at module load.\n *\n * Throws if a factory is already registered for the same vendor id — this\n * catches accidental double-registration and typos in `src/adapters/index.ts`.\n *\n * Use `replaceAdapter` if you deliberately need to override a registered adapter\n * (primarily useful in tests).\n */\nexport function registerAdapter(factory: AdapterFactory): void {\n if (registry.has(factory.vendor)) {\n throw new Error(\n `Adapter already registered for vendor '${factory.vendor}'. ` +\n `Use replaceAdapter() if you intended to override.`,\n );\n }\n if (factory.vendor !== factory.manifest.vendor) {\n throw new Error(\n `Adapter factory vendor '${factory.vendor}' does not match ` +\n `manifest.vendor '${factory.manifest.vendor}'.`,\n );\n }\n registry.set(factory.vendor, factory);\n}\n\n/**\n * Replace an already-registered adapter. Intended for test overrides.\n */\nexport function replaceAdapter(factory: AdapterFactory): void {\n registry.set(factory.vendor, factory);\n}\n\n/**\n * Remove an adapter from the registry. Intended for test cleanup.\n */\nexport function unregisterAdapter(vendor: string): void {\n registry.delete(vendor);\n}\n\n/**\n * Get a registered adapter factory. Throws if unknown vendor.\n */\nexport function getAdapterFactory<A extends AuthSpec = AuthSpec>(\n vendor: string,\n): AdapterFactory<A> {\n const factory = registry.get(vendor);\n if (!factory) {\n const known = Array.from(registry.keys()).sort().join(', ') || '(none)';\n throw new Error(\n `Unknown vendor '${vendor}'. Registered vendors: ${known}`,\n );\n }\n return factory as AdapterFactory<A>;\n}\n\n/**\n * List all registered vendor ids, sorted alphabetically.\n */\nexport function listVendors(): string[] {\n return Array.from(registry.keys()).sort();\n}\n\n/**\n * Return an aggregated manifest for all registered adapters. Used by\n * api-server's /llm-vendors/manifest endpoint.\n */\nexport function getManifest(): { vendors: AdapterManifest[] } {\n const vendors = Array.from(registry.values())\n .map((f) => f.manifest)\n .sort((a, b) => a.vendor.localeCompare(b.vendor));\n return { vendors };\n}\n\n/**\n * Test-only: reset the registry. Exposed for unit tests that register/unregister\n * adapters and need a clean slate.\n */\nexport function _resetRegistryForTests(): void {\n registry.clear();\n}\n","import OpenAI from 'openai';\nimport type {\n ApiKeyAuth,\n ClientOptions,\n LlmAdapter,\n LlmEvent,\n Message,\n ModelInfo,\n PromptRequest,\n ToolCallEvent,\n} from '../../types.js';\nimport {\n appendOpenAIAssistantToolCall,\n appendOpenAIToolResult,\n listOpenAICompatibleModels,\n streamFromOpenAI,\n} from './_streaming.js';\nimport { openAIManifest } from './manifest.js';\n\n/**\n * Adapter for OpenAI (and OpenAI-compatible endpoints: DeepSeek, LM Studio,\n * Ollama, vLLM, custom gateways).\n *\n * Wire translation lives in `_streaming.ts` and is shared with the\n * Vertex-OpenAI adapter — both use the same `openai` SDK with the same\n * on-wire shape; only client construction (auth, baseURL, fetch wrapper)\n * differs.\n */\nexport class OpenAIAdapter implements LlmAdapter<ApiKeyAuth> {\n readonly vendor = openAIManifest.vendor;\n readonly acceptedAuth = ['apiKey'] as const;\n\n protected client: OpenAI | undefined;\n\n init(auth: ApiKeyAuth, client?: ClientOptions): void {\n if (!auth.apiKey) {\n throw new Error('OpenAIAdapter: apiKey is required');\n }\n this.client = new OpenAI({\n apiKey: auth.apiKey,\n ...(auth.baseURL ? { baseURL: auth.baseURL } : {}),\n ...(client?.timeout !== undefined ? { timeout: client.timeout } : {}),\n ...(client?.maxRetries !== undefined ? { maxRetries: client.maxRetries } : {}),\n });\n }\n\n stream(req: PromptRequest): AsyncIterable<LlmEvent> {\n return streamFromOpenAI(this.ensureClient(), req, {\n knownModels: openAIManifest.knownModels,\n });\n }\n\n appendAssistantToolCall(\n history: Message[],\n toolCalls: ReadonlyArray<ToolCallEvent>,\n ): Message[] {\n return appendOpenAIAssistantToolCall(history, toolCalls);\n }\n\n appendToolResult(history: Message[], toolCallId: string, result: unknown): Message[] {\n return appendOpenAIToolResult(history, toolCallId, result);\n }\n\n async listAvailableModels(): Promise<ModelInfo[]> {\n return listOpenAICompatibleModels(this.ensureClient(), openAIManifest.knownModels);\n }\n\n async warmup(): Promise<void> {\n const client = this.ensureClient();\n await client.models.list().catch(() => undefined);\n }\n\n protected ensureClient(): OpenAI {\n if (!this.client) {\n throw new Error('OpenAIAdapter: init() must be called before stream()/listAvailableModels()');\n }\n return this.client;\n }\n}\n","import type { PromptRequest } from './types.js';\n\n/**\n * Validate a PromptRequest against the library's universal preconditions.\n *\n * Adapters should call this at the top of `stream()` to get consistent error\n * messages. The contract test-kit's check #18 verifies empty messages are\n * rejected, so adapters that skip this helper must implement the equivalent\n * validation themselves.\n *\n * Rules enforced:\n * - `model` is a non-empty string.\n * - `messages` is a non-empty array.\n * - `messages` does not contain `role: 'system'` turns (use `system` top-level).\n */\nexport function assertValidRequest(req: PromptRequest): void {\n if (!req || typeof req !== 'object') {\n throw new Error('PromptRequest must be an object');\n }\n if (typeof req.model !== 'string' || req.model.length === 0) {\n throw new Error('PromptRequest.model must be a non-empty string');\n }\n if (!Array.isArray(req.messages) || req.messages.length === 0) {\n throw new Error('PromptRequest.messages must be a non-empty array');\n }\n if (req.messages.some((m) => m.role === 'system')) {\n throw new Error(\n 'PromptRequest.messages must not contain role: \\'system\\'. ' +\n 'Pass the system prompt via PromptRequest.system instead.',\n );\n }\n}\n","import type OpenAI from 'openai';\nimport type { ChatCompletionCreateParamsStreaming } from 'openai/resources/chat/completions';\nimport type {\n FinishReason,\n LlmEvent,\n Message,\n ModelCapabilities,\n ModelInfo,\n PromptRequest,\n Tool,\n} from '../../types.js';\nimport { assertValidRequest } from '../../validate.js';\n\n/**\n * OpenAI wire translation, shared between the native OpenAI adapter and the\n * Vertex-OpenAI adapter (which talks to third-party models hosted on Vertex AI\n * via the OpenAI-compatible endpoint).\n */\nexport async function* streamFromOpenAI(\n client: OpenAI,\n req: PromptRequest,\n options: {\n knownModels: ReadonlyArray<ModelInfo>;\n /**\n * Whether to set `stream_options: { include_usage: true }` on the\n * request. Defaults to `true` for OpenAI's native API. Set to `false`\n * for third-party OpenAI-compatible endpoints (e.g. Vertex AI's OpenAI\n * endpoint for partner models) that reject unknown extensions with a\n * 400 error. When disabled, the `end` event's `usage` field is omitted.\n */\n includeStreamOptions?: boolean;\n /**\n * If the caller did not supply `maxTokens`, use this value. Set by the\n * Vertex-OpenAI adapter because Vertex AI's Llama MaaS endpoint returns\n * an empty assistant message (zero tokens, `finish_reason: stop`) when\n * `max_tokens` is omitted. Leave undefined for OpenAI's native API,\n * which defaults correctly on its own.\n */\n defaultMaxTokens?: number;\n },\n): AsyncIterable<LlmEvent> {\n assertValidRequest(req);\n\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n const capabilities = capabilitiesFor(req.model, options.knownModels);\n const useTools = req.tools && req.tools.length > 0 && capabilities.tools;\n\n const messages = buildWireMessages(req);\n const tools = useTools ? formatTools(req.tools!) : undefined;\n\n const body: ChatCompletionCreateParamsStreaming = {\n model: req.model,\n messages: messages as ChatCompletionCreateParamsStreaming['messages'],\n stream: true,\n ...(options.includeStreamOptions !== false\n ? { stream_options: { include_usage: true } }\n : {}),\n };\n if (tools) {\n body.tools = tools as unknown as ChatCompletionCreateParamsStreaming['tools'];\n body.tool_choice = 'auto';\n }\n if (req.temperature !== undefined) body.temperature = req.temperature;\n const effectiveMaxTokens = req.maxTokens ?? options.defaultMaxTokens;\n if (effectiveMaxTokens !== undefined) body.max_tokens = effectiveMaxTokens;\n\n let stream;\n try {\n stream = await client.chat.completions.create(body, { signal: req.signal });\n } catch (err) {\n if (isAbortError(err)) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n throw err;\n }\n\n const pending: Record<number, PendingToolCall> = {};\n const startedIds = new Set<string>();\n const toolCallsEmitted = new Set<string>();\n let usage: { inputTokens?: number; outputTokens?: number; totalTokens?: number } | undefined;\n let finalFinishReason: FinishReason | null = null;\n let finalRawReason: string | undefined;\n\n try {\n for await (const chunk of stream) {\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n if (chunk.usage) {\n usage = {\n ...(chunk.usage.prompt_tokens !== undefined\n ? { inputTokens: chunk.usage.prompt_tokens }\n : {}),\n ...(chunk.usage.completion_tokens !== undefined\n ? { outputTokens: chunk.usage.completion_tokens }\n : {}),\n ...(chunk.usage.total_tokens !== undefined\n ? { totalTokens: chunk.usage.total_tokens }\n : {}),\n };\n }\n\n const choice = chunk.choices?.[0];\n if (!choice) continue;\n\n const delta = choice.delta;\n const finishReason = choice.finish_reason;\n\n if (delta?.content) {\n yield { type: 'token', text: delta.content };\n }\n\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n if (!pending[idx]) {\n pending[idx] = { id: '', name: '', arguments: '' };\n }\n if (tc.id) pending[idx].id += tc.id;\n if (tc.function?.name) pending[idx].name += tc.function.name;\n if (tc.function?.arguments) pending[idx].arguments += tc.function.arguments;\n\n if (pending[idx].id && pending[idx].name && !startedIds.has(pending[idx].id)) {\n startedIds.add(pending[idx].id);\n yield {\n type: 'toolCallStart',\n id: pending[idx].id,\n name: pending[idx].name,\n };\n }\n }\n }\n\n if (finishReason === 'tool_calls') {\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n for (const tc of Object.values(pending)) {\n if (!tc.id || !tc.name) continue;\n if (toolCallsEmitted.has(tc.id)) continue;\n toolCallsEmitted.add(tc.id);\n let args: unknown = {};\n try {\n args = tc.arguments ? JSON.parse(tc.arguments) : {};\n } catch {\n args = {};\n }\n yield {\n type: 'toolCall',\n id: tc.id,\n name: tc.name,\n arguments: args,\n };\n }\n finalFinishReason = 'tool';\n finalRawReason = finishReason;\n } else if (finishReason) {\n finalFinishReason = mapFinishReason(finishReason);\n finalRawReason = finishReason;\n }\n }\n } catch (err) {\n if (isAbortError(err)) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n throw err;\n }\n\n const endEvent: Extract<LlmEvent, { type: 'end' }> = {\n type: 'end',\n finishReason: finalFinishReason ?? 'stop',\n ...(usage ? { usage } : {}),\n ...(finalRawReason ? { rawReason: finalRawReason } : {}),\n };\n yield endEvent;\n}\n\nexport function appendOpenAIAssistantToolCall(\n history: Message[],\n toolCalls: ReadonlyArray<Extract<LlmEvent, { type: 'toolCall' }>>,\n): Message[] {\n const wireMessage = {\n role: 'assistant',\n content: null,\n tool_calls: toolCalls.map((tc) => ({\n id: tc.id,\n type: 'function',\n function: {\n name: tc.name,\n arguments: typeof tc.arguments === 'string'\n ? tc.arguments\n : JSON.stringify(tc.arguments ?? {}),\n },\n })),\n };\n return [\n ...history,\n {\n role: 'assistant',\n content: '',\n vendorRaw: wireMessage,\n },\n ];\n}\n\nexport function appendOpenAIToolResult(\n history: Message[],\n toolCallId: string,\n result: unknown,\n): Message[] {\n const content = typeof result === 'string' ? result : JSON.stringify(result);\n const wireMessage = {\n role: 'tool',\n tool_call_id: toolCallId,\n content,\n };\n return [\n ...history,\n {\n role: 'tool',\n content,\n vendorRaw: wireMessage,\n },\n ];\n}\n\n/**\n * Call `models.list()` and normalise results, merging capabilities from a\n * known-models table when possible.\n */\nexport async function listOpenAICompatibleModels(\n client: OpenAI,\n knownModels: ReadonlyArray<ModelInfo>,\n): Promise<ModelInfo[]> {\n const result = await client.models.list();\n const out: ModelInfo[] = [];\n for (const m of result.data) {\n const known = knownModels.find((k) => k.id === m.id);\n if (known) {\n out.push(known);\n } else {\n out.push({\n id: m.id,\n capabilities: defaultCapabilitiesForUnknown(m.id),\n });\n }\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers (internal)\n// ---------------------------------------------------------------------------\n\ninterface PendingToolCall {\n id: string;\n name: string;\n arguments: string;\n}\n\nfunction buildWireMessages(req: PromptRequest): unknown[] {\n const out: unknown[] = [];\n if (req.system) {\n out.push({ role: 'system', content: req.system });\n }\n for (const msg of req.messages) {\n if (msg.vendorRaw && typeof msg.vendorRaw === 'object') {\n out.push(msg.vendorRaw);\n } else {\n out.push({ role: msg.role, content: msg.content });\n }\n }\n return out;\n}\n\nfunction formatTools(tools: Tool[]): Array<Record<string, unknown>> {\n return tools.map((t) => ({\n type: 'function',\n function: {\n name: t.name,\n description: t.description ?? '',\n parameters: t.parameters ?? { type: 'object', properties: {} },\n },\n }));\n}\n\nfunction capabilitiesFor(\n modelId: string,\n knownModels: ReadonlyArray<ModelInfo>,\n): ModelCapabilities {\n const known = knownModels.find((k) => k.id === modelId);\n if (known) return known.capabilities;\n return defaultCapabilitiesForUnknown(modelId);\n}\n\nexport function defaultCapabilitiesForUnknown(modelId: string): ModelCapabilities {\n const isReasoning = /^o[13]([-/]|$)/i.test(modelId);\n if (isReasoning) {\n return {\n streaming: false,\n tools: false,\n vision: false,\n systemPrompt: false,\n };\n }\n return {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n };\n}\n\nfunction mapFinishReason(r: string): FinishReason {\n switch (r) {\n case 'stop': return 'stop';\n case 'tool_calls': return 'tool';\n case 'function_call': return 'tool';\n case 'length': return 'length';\n case 'content_filter': return 'filtered';\n default: return 'stop';\n }\n}\n\nfunction isAbortError(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false;\n const e = err as { name?: string; code?: string; message?: string };\n return (\n e.name === 'APIUserAbortError' ||\n e.name === 'AbortError' ||\n e.code === 'ABORT_ERR' ||\n (typeof e.message === 'string' && /aborted/i.test(e.message))\n );\n}\n","import type { AdapterManifest, ModelInfo } from '../../types.js';\n\n/**\n * Known OpenAI models with capability flags.\n *\n * Model listing via `listAvailableModels()` hits the live `/v1/models` endpoint,\n * so this curated list is for the admin-UI dropdown and for capability\n * validation (e.g., rejecting tools on reasoning-only models).\n */\nconst OPENAI_KNOWN_MODELS: ModelInfo[] = [\n {\n id: 'gpt-4o',\n displayName: 'GPT-4o',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'gpt-4o-mini',\n displayName: 'GPT-4o mini',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'gpt-4-turbo',\n displayName: 'GPT-4 Turbo',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'gpt-3.5-turbo',\n displayName: 'GPT-3.5 Turbo',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 16_385,\n },\n },\n {\n id: 'o1-preview',\n displayName: 'o1 preview (reasoning)',\n capabilities: {\n streaming: false,\n tools: false,\n vision: false,\n systemPrompt: false,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'o1-mini',\n displayName: 'o1 mini (reasoning)',\n capabilities: {\n streaming: false,\n tools: false,\n vision: false,\n systemPrompt: false,\n maxContextTokens: 128_000,\n },\n },\n];\n\nexport const openAIManifest: AdapterManifest = {\n vendor: 'openai',\n displayName: 'OpenAI',\n authKinds: [\n {\n kind: 'apiKey',\n displayName: 'API Key',\n fields: [\n {\n name: 'apiKey',\n label: 'API Key',\n type: 'password',\n required: true,\n help: 'Get an API key from https://platform.openai.com/api-keys',\n },\n {\n name: 'baseURL',\n label: 'Base URL',\n type: 'url',\n required: false,\n default: 'https://api.openai.com/v1',\n help: 'Override for OpenAI-compatible endpoints (LM Studio, Ollama, vLLM, proxies).',\n },\n ],\n },\n ],\n knownModels: OPENAI_KNOWN_MODELS,\n supportsModelListing: true,\n docsUrl: 'https://platform.openai.com/docs/api-reference',\n};\n","import type { AdapterFactory, AdapterManifest, ApiKeyAuth } from '../../types.js';\nimport { OpenAIAdapter } from './adapter.js';\nimport { openAIManifest } from './manifest.js';\n\nexport const openAIFactory: AdapterFactory<ApiKeyAuth> = {\n vendor: openAIManifest.vendor,\n manifest: openAIManifest,\n create: () => new OpenAIAdapter(),\n};\n\n/**\n * DeepSeek alias factory. Wraps the OpenAI adapter but advertises itself as\n * `deepseek` and ships a DeepSeek-specific manifest (different default\n * `baseURL`, different known models, different docsUrl).\n *\n * Consumers call `createLlm({vendor: 'deepseek', auth: {kind: 'apiKey', apiKey}})`\n * and get the OpenAI wire adapter pointed at the DeepSeek endpoint.\n */\nconst deepseekManifest: AdapterManifest = {\n vendor: 'deepseek',\n displayName: 'DeepSeek',\n authKinds: [\n {\n kind: 'apiKey',\n displayName: 'API Key',\n fields: [\n {\n name: 'apiKey',\n label: 'API Key',\n type: 'password',\n required: true,\n help: 'Get an API key from https://platform.deepseek.com/api_keys',\n },\n {\n name: 'baseURL',\n label: 'Base URL',\n type: 'url',\n required: false,\n default: 'https://api.deepseek.com/v1',\n help: 'Override for self-hosted DeepSeek or proxy endpoints.',\n },\n ],\n },\n ],\n knownModels: [\n {\n id: 'deepseek-chat',\n displayName: 'DeepSeek Chat',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 64_000,\n },\n },\n {\n id: 'deepseek-reasoner',\n displayName: 'DeepSeek Reasoner',\n capabilities: {\n streaming: true,\n tools: false,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 64_000,\n },\n },\n ],\n supportsModelListing: true,\n docsUrl: 'https://api-docs.deepseek.com/',\n};\n\nclass DeepSeekAdapter extends OpenAIAdapter {\n readonly vendor = deepseekManifest.vendor;\n\n override init(auth: ApiKeyAuth, client?: Parameters<OpenAIAdapter['init']>[1]): void {\n super.init(\n {\n ...auth,\n baseURL: auth.baseURL ?? 'https://api.deepseek.com/v1',\n },\n client,\n );\n }\n}\n\nexport const deepseekFactory: AdapterFactory<ApiKeyAuth> = {\n vendor: deepseekManifest.vendor,\n manifest: deepseekManifest,\n create: () => new DeepSeekAdapter(),\n};\n","import Anthropic from '@anthropic-ai/sdk';\nimport type {\n ApiKeyAuth,\n ClientOptions,\n FinishReason,\n LlmAdapter,\n LlmEvent,\n Message,\n ModelInfo,\n PromptRequest,\n Tool,\n ToolCallEvent,\n} from '../../types.js';\nimport { assertValidRequest } from '../../validate.js';\nimport { anthropicManifest } from './manifest.js';\n\n/**\n * Adapter for Anthropic Claude.\n *\n * Key wire-shape differences from OpenAI:\n * - `system` is a top-level request parameter, not a message.\n * - Tool schema is `{name, description, input_schema}` (not `parameters`).\n * - Tool results are `{role: 'user', content: [{type: 'tool_result', tool_use_id, content}]}`\n * — note role: 'user', not 'tool'.\n * - Assistant messages with tool calls carry `content: [{type: 'tool_use', id, name, input}]`\n * — content is an array of blocks, not a string or a separate tool_calls array.\n * - Stream events are content-block based (content_block_start/delta/stop + message_*).\n * - `max_tokens` is REQUIRED; we default to 4096 if the caller doesn't set one.\n */\nexport class AnthropicAdapter implements LlmAdapter<ApiKeyAuth> {\n readonly vendor = anthropicManifest.vendor;\n readonly acceptedAuth = ['apiKey'] as const;\n\n private client: Anthropic | undefined;\n\n init(auth: ApiKeyAuth, client?: ClientOptions): void {\n if (!auth.apiKey) {\n throw new Error('AnthropicAdapter: apiKey is required');\n }\n this.client = new Anthropic({\n apiKey: auth.apiKey,\n ...(auth.baseURL ? { baseURL: auth.baseURL } : {}),\n ...(client?.timeout !== undefined ? { timeout: client.timeout } : {}),\n ...(client?.maxRetries !== undefined ? { maxRetries: client.maxRetries } : {}),\n });\n }\n\n async *stream(req: PromptRequest): AsyncIterable<LlmEvent> {\n assertValidRequest(req);\n const client = this.ensureClient();\n\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n const messages = buildWireMessages(req);\n const tools = req.tools && req.tools.length > 0 ? formatTools(req.tools) : undefined;\n\n const body: Record<string, unknown> = {\n model: req.model,\n messages,\n max_tokens: req.maxTokens ?? 4_096,\n stream: true,\n };\n if (req.system) body.system = req.system;\n if (tools) body.tools = tools;\n if (req.temperature !== undefined) body.temperature = req.temperature;\n\n let stream;\n try {\n stream = await client.messages.create(\n body as unknown as Parameters<typeof client.messages.create>[0],\n { signal: req.signal },\n );\n } catch (err) {\n if (isAbortError(err)) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n throw err;\n }\n\n let currentToolUse: PendingToolUse | null = null;\n const completedToolCalls: CompletedToolCall[] = [];\n let stopReason: string | undefined;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n\n try {\n for await (const event of stream as unknown as AsyncIterable<AnthropicStreamEvent>) {\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n switch (event.type) {\n case 'message_start':\n inputTokens = event.message?.usage?.input_tokens;\n break;\n\n case 'content_block_start': {\n const block = event.content_block;\n if (block?.type === 'tool_use') {\n currentToolUse = {\n id: block.id ?? '',\n name: block.name ?? '',\n argumentsText: '',\n };\n if (currentToolUse.id && currentToolUse.name) {\n yield {\n type: 'toolCallStart',\n id: currentToolUse.id,\n name: currentToolUse.name,\n };\n }\n }\n break;\n }\n\n case 'content_block_delta': {\n const delta = event.delta;\n if (delta?.type === 'text_delta' && delta.text) {\n yield { type: 'token', text: delta.text };\n } else if (delta?.type === 'input_json_delta' && currentToolUse && delta.partial_json) {\n currentToolUse.argumentsText += delta.partial_json;\n }\n break;\n }\n\n case 'content_block_stop':\n if (currentToolUse && currentToolUse.id && currentToolUse.name) {\n let parsed: unknown = {};\n try {\n parsed = currentToolUse.argumentsText\n ? JSON.parse(currentToolUse.argumentsText)\n : {};\n } catch {\n parsed = {};\n }\n completedToolCalls.push({\n id: currentToolUse.id,\n name: currentToolUse.name,\n arguments: parsed,\n });\n }\n currentToolUse = null;\n break;\n\n case 'message_delta':\n if (event.delta?.stop_reason) {\n stopReason = event.delta.stop_reason;\n }\n if (event.usage?.output_tokens !== undefined) {\n outputTokens = event.usage.output_tokens;\n }\n break;\n\n case 'message_stop':\n // No-op — we synthesize the `end` event after the loop completes.\n break;\n\n default:\n // Ignore unknown event types (forward compat).\n break;\n }\n }\n } catch (err) {\n if (isAbortError(err)) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n throw err;\n }\n\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n // Emit accumulated tool calls before the end event.\n for (const tc of completedToolCalls) {\n yield {\n type: 'toolCall',\n id: tc.id,\n name: tc.name,\n arguments: tc.arguments,\n };\n }\n\n const finishReason = mapStopReason(stopReason, completedToolCalls.length > 0);\n const usage =\n inputTokens !== undefined || outputTokens !== undefined\n ? {\n ...(inputTokens !== undefined ? { inputTokens } : {}),\n ...(outputTokens !== undefined ? { outputTokens } : {}),\n ...(inputTokens !== undefined && outputTokens !== undefined\n ? { totalTokens: inputTokens + outputTokens }\n : {}),\n }\n : undefined;\n\n const endEvent: Extract<LlmEvent, { type: 'end' }> = {\n type: 'end',\n finishReason,\n ...(usage ? { usage } : {}),\n ...(stopReason ? { rawReason: stopReason } : {}),\n };\n yield endEvent;\n }\n\n appendAssistantToolCall(\n history: Message[],\n toolCalls: ReadonlyArray<ToolCallEvent>,\n ): Message[] {\n const wireMessage = {\n role: 'assistant',\n content: toolCalls.map((tc) => ({\n type: 'tool_use',\n id: tc.id,\n name: tc.name,\n input: tc.arguments ?? {},\n })),\n };\n return [\n ...history,\n {\n role: 'assistant',\n content: '',\n vendorRaw: wireMessage,\n },\n ];\n }\n\n appendToolResult(history: Message[], toolCallId: string, result: unknown): Message[] {\n const content = typeof result === 'string' ? result : JSON.stringify(result);\n const wireMessage = {\n role: 'user',\n content: [\n {\n type: 'tool_result',\n tool_use_id: toolCallId,\n content,\n },\n ],\n };\n return [\n ...history,\n {\n role: 'tool',\n content,\n vendorRaw: wireMessage,\n },\n ];\n }\n\n async listAvailableModels(): Promise<ModelInfo[]> {\n const client = this.ensureClient();\n const result = await client.models.list();\n const models: ModelInfo[] = [];\n for (const m of result.data) {\n const known = anthropicManifest.knownModels.find((k) => k.id === m.id);\n if (known) {\n models.push(known);\n } else {\n models.push({\n id: m.id,\n displayName: m.display_name ?? undefined,\n capabilities: defaultClaudeCapabilities(),\n });\n }\n }\n return models;\n }\n\n async warmup(): Promise<void> {\n const client = this.ensureClient();\n await client.models.list().catch(() => undefined);\n }\n\n private ensureClient(): Anthropic {\n if (!this.client) {\n throw new Error('AnthropicAdapter: init() must be called before stream()/listAvailableModels()');\n }\n return this.client;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internal types\n// ---------------------------------------------------------------------------\n\ninterface PendingToolUse {\n id: string;\n name: string;\n argumentsText: string;\n}\n\ninterface CompletedToolCall {\n id: string;\n name: string;\n arguments: unknown;\n}\n\ninterface AnthropicStreamEvent {\n type: string;\n message?: { usage?: { input_tokens?: number } };\n content_block?: { type?: string; id?: string; name?: string };\n delta?: {\n type?: string;\n text?: string;\n partial_json?: string;\n stop_reason?: string;\n };\n usage?: { output_tokens?: number };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildWireMessages(req: PromptRequest): unknown[] {\n const out: unknown[] = [];\n for (const msg of req.messages) {\n if (msg.vendorRaw && typeof msg.vendorRaw === 'object') {\n out.push(msg.vendorRaw);\n } else {\n out.push({ role: msg.role, content: msg.content });\n }\n }\n return out;\n}\n\nfunction formatTools(tools: Tool[]): Array<Record<string, unknown>> {\n return tools.map((t) => ({\n name: t.name,\n description: t.description ?? '',\n input_schema: t.parameters ?? { type: 'object', properties: {} },\n }));\n}\n\nfunction mapStopReason(r: string | undefined, hadToolCalls: boolean): FinishReason {\n if (hadToolCalls) return 'tool';\n switch (r) {\n case 'end_turn':\n case 'stop_sequence':\n return 'stop';\n case 'tool_use':\n return 'tool';\n case 'max_tokens':\n return 'length';\n default:\n return 'stop';\n }\n}\n\nfunction defaultClaudeCapabilities() {\n return {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n };\n}\n\nfunction isAbortError(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false;\n const e = err as { name?: string; code?: string; message?: string };\n return (\n e.name === 'APIUserAbortError' ||\n e.name === 'AbortError' ||\n e.code === 'ABORT_ERR' ||\n (typeof e.message === 'string' && /aborted/i.test(e.message))\n );\n}\n","import type { AdapterManifest, ModelInfo } from '../../types.js';\n\n/**\n * Known Claude models. Model listing via `listAvailableModels()` hits\n * Anthropic's live `/v1/models` endpoint; this curated list drives the\n * admin-UI dropdown and capability validation.\n *\n * All Claude models in this list support tools, streaming, system prompts,\n * and vision. There is no reasoning-only / tool-less variant to special-case\n * the way OpenAI's o1 family does.\n */\nconst ANTHROPIC_KNOWN_MODELS: ModelInfo[] = [\n {\n id: 'claude-opus-4-7',\n displayName: 'Claude Opus 4.7',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n },\n {\n id: 'claude-sonnet-4-6',\n displayName: 'Claude Sonnet 4.6',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n },\n {\n id: 'claude-haiku-4-5-20251001',\n displayName: 'Claude Haiku 4.5',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n },\n {\n id: 'claude-3-7-sonnet-20250219',\n displayName: 'Claude 3.7 Sonnet',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n },\n {\n id: 'claude-3-5-sonnet-20241022',\n displayName: 'Claude 3.5 Sonnet',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n },\n {\n id: 'claude-3-5-haiku-20241022',\n displayName: 'Claude 3.5 Haiku',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n },\n];\n\nexport const anthropicManifest: AdapterManifest = {\n vendor: 'anthropic',\n displayName: 'Anthropic Claude',\n authKinds: [\n {\n kind: 'apiKey',\n displayName: 'API Key',\n fields: [\n {\n name: 'apiKey',\n label: 'API Key',\n type: 'password',\n required: true,\n help: 'Get an API key from https://console.anthropic.com/settings/keys',\n },\n {\n name: 'baseURL',\n label: 'Base URL',\n type: 'url',\n required: false,\n default: 'https://api.anthropic.com',\n help: 'Override for proxies or enterprise deployments.',\n },\n ],\n },\n ],\n knownModels: ANTHROPIC_KNOWN_MODELS,\n supportsModelListing: true,\n docsUrl: 'https://docs.anthropic.com/en/api/overview',\n};\n","import type { AdapterFactory, ApiKeyAuth } from '../../types.js';\nimport { AnthropicAdapter } from './adapter.js';\nimport { anthropicManifest } from './manifest.js';\n\nexport const anthropicFactory: AdapterFactory<ApiKeyAuth> = {\n vendor: anthropicManifest.vendor,\n manifest: anthropicManifest,\n create: () => new AnthropicAdapter(),\n};\n","import { GoogleGenAI } from '@google/genai';\nimport type {\n ClientOptions,\n GoogleApiKeyAuth,\n LlmAdapter,\n LlmEvent,\n Message,\n ModelInfo,\n PromptRequest,\n ToolCallEvent,\n} from '../../types.js';\nimport {\n appendGeminiAssistantToolCall,\n appendGeminiToolResult,\n listGeminiModels,\n streamFromGemini,\n} from './_streaming.js';\nimport { googleManifest } from './manifest.js';\n\n/**\n * Adapter for Google Gemini via AI Studio (`@google/genai`, API key auth).\n *\n * Wire translation lives in `_streaming.ts` and is shared with the\n * Vertex-Gemini adapter — both use the same `@google/genai` SDK and the\n * same on-wire shape; only client construction differs.\n *\n * For service-account auth on Vertex AI, see the `vertex-gemini` adapter.\n */\nexport class GoogleAdapter implements LlmAdapter<GoogleApiKeyAuth> {\n readonly vendor = googleManifest.vendor;\n readonly acceptedAuth = ['googleApiKey'] as const;\n\n private client: GoogleGenAI | undefined;\n\n init(auth: GoogleApiKeyAuth, _client?: ClientOptions): void {\n if (auth.kind !== 'googleApiKey') {\n throw new Error(\n `GoogleAdapter: unsupported auth kind '${(auth as { kind: string }).kind}'`,\n );\n }\n if (!auth.apiKey) {\n throw new Error('GoogleAdapter: apiKey is required');\n }\n this.client = new GoogleGenAI({ apiKey: auth.apiKey });\n }\n\n stream(req: PromptRequest): AsyncIterable<LlmEvent> {\n return streamFromGemini(this.ensureClient(), req);\n }\n\n appendAssistantToolCall(\n history: Message[],\n toolCalls: ReadonlyArray<ToolCallEvent>,\n ): Message[] {\n return appendGeminiAssistantToolCall(history, toolCalls);\n }\n\n appendToolResult(history: Message[], toolCallId: string, result: unknown): Message[] {\n return appendGeminiToolResult(history, toolCallId, result);\n }\n\n async listAvailableModels(): Promise<ModelInfo[]> {\n return listGeminiModels(this.ensureClient(), googleManifest.knownModels);\n }\n\n async warmup(): Promise<void> {\n // @google/genai has no cheap idempotent warmup endpoint. No-op.\n }\n\n private ensureClient(): GoogleGenAI {\n if (!this.client) {\n throw new Error('GoogleAdapter: init() must be called before stream()/listAvailableModels()');\n }\n return this.client;\n }\n}\n","import type { GoogleGenAI } from '@google/genai';\nimport type {\n FinishReason,\n LlmEvent,\n Message,\n ModelInfo,\n PromptRequest,\n Tool,\n} from '../../types.js';\nimport { assertValidRequest } from '../../validate.js';\n\n/**\n * Gemini wire translation, shared between the Google AI Studio adapter\n * and the Vertex-Gemini adapter. Both use the same `@google/genai` SDK\n * with the same on-wire shape — only the client construction differs.\n */\nexport async function* streamFromGemini(\n client: GoogleGenAI,\n req: PromptRequest,\n): AsyncIterable<LlmEvent> {\n assertValidRequest(req);\n\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n const contents = buildWireContents(req);\n const tools = req.tools && req.tools.length > 0 ? formatTools(req.tools) : undefined;\n\n const config: Record<string, unknown> = {};\n if (req.system) {\n config.systemInstruction = { parts: [{ text: req.system }] };\n }\n if (tools) config.tools = tools;\n if (req.temperature !== undefined) config.temperature = req.temperature;\n if (req.maxTokens !== undefined) config.maxOutputTokens = req.maxTokens;\n if (req.signal) config.abortSignal = req.signal;\n\n let stream;\n try {\n stream = await client.models.generateContentStream({\n model: req.model,\n contents: contents as Parameters<typeof client.models.generateContentStream>[0]['contents'],\n config,\n });\n } catch (err) {\n if (isAbortError(err)) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n throw err;\n }\n\n const toolCallCounter = new Map<string, number>();\n const completedToolCalls: Array<{ id: string; name: string; arguments: unknown }> = [];\n let stopReason: string | undefined;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let totalTokens: number | undefined;\n\n try {\n for await (const chunk of stream) {\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n const usage = chunk.usageMetadata;\n if (usage) {\n if (usage.promptTokenCount !== undefined) inputTokens = usage.promptTokenCount;\n if (usage.candidatesTokenCount !== undefined) outputTokens = usage.candidatesTokenCount;\n if (usage.totalTokenCount !== undefined) totalTokens = usage.totalTokenCount;\n }\n\n const candidate = chunk.candidates?.[0];\n if (!candidate?.content?.parts) {\n if (candidate?.finishReason) stopReason = candidate.finishReason;\n continue;\n }\n\n for (const part of candidate.content.parts) {\n if (typeof part.text === 'string' && part.text.length > 0) {\n yield { type: 'token', text: part.text };\n }\n if (part.functionCall) {\n const name = part.functionCall.name ?? '';\n if (!name) continue;\n const count = toolCallCounter.get(name) ?? 0;\n toolCallCounter.set(name, count + 1);\n const id = count === 0 ? name : `${name}#${count}`;\n yield { type: 'toolCallStart', id, name };\n completedToolCalls.push({\n id,\n name,\n arguments: part.functionCall.args ?? {},\n });\n }\n }\n\n if (candidate.finishReason) {\n stopReason = candidate.finishReason;\n }\n }\n } catch (err) {\n if (isAbortError(err)) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n throw err;\n }\n\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n for (const tc of completedToolCalls) {\n yield {\n type: 'toolCall',\n id: tc.id,\n name: tc.name,\n arguments: tc.arguments,\n };\n }\n\n const finishReason = mapFinishReason(stopReason, completedToolCalls.length > 0);\n const usage =\n inputTokens !== undefined || outputTokens !== undefined || totalTokens !== undefined\n ? {\n ...(inputTokens !== undefined ? { inputTokens } : {}),\n ...(outputTokens !== undefined ? { outputTokens } : {}),\n ...(totalTokens !== undefined ? { totalTokens } : {}),\n }\n : undefined;\n\n const endEvent: Extract<LlmEvent, { type: 'end' }> = {\n type: 'end',\n finishReason,\n ...(usage ? { usage } : {}),\n ...(stopReason ? { rawReason: stopReason } : {}),\n };\n yield endEvent;\n}\n\n/**\n * Build an assistant-with-tool-call turn in the Gemini wire shape (role:\n * 'model', parts: [{functionCall, ...}]). Shared between Google AI Studio\n * and Vertex-Gemini adapters.\n */\nexport function appendGeminiAssistantToolCall(\n history: Message[],\n toolCalls: ReadonlyArray<Extract<LlmEvent, { type: 'toolCall' }>>,\n): Message[] {\n const wireMessage = {\n role: 'model',\n parts: toolCalls.map((tc) => ({\n functionCall: {\n name: parseToolName(tc.id),\n args: tc.arguments ?? {},\n },\n })),\n };\n return [\n ...history,\n {\n role: 'assistant',\n content: '',\n vendorRaw: wireMessage,\n },\n ];\n}\n\n/**\n * Build a tool-result message in the Gemini wire shape. Shared between\n * Google AI Studio and Vertex-Gemini adapters.\n */\nexport function appendGeminiToolResult(\n history: Message[],\n toolCallId: string,\n result: unknown,\n): Message[] {\n const name = parseToolName(toolCallId);\n const content = typeof result === 'string' ? result : JSON.stringify(result);\n const wireMessage = {\n role: 'user',\n parts: [\n {\n functionResponse: {\n name,\n response: { result: content },\n },\n },\n ],\n };\n return [\n ...history,\n {\n role: 'tool',\n content,\n vendorRaw: wireMessage,\n },\n ];\n}\n\n/**\n * Call the models.list() pager and return normalised `ModelInfo` records,\n * merging capabilities from a known-models table when possible.\n */\nexport async function listGeminiModels(\n client: GoogleGenAI,\n knownModels: ReadonlyArray<ModelInfo>,\n): Promise<ModelInfo[]> {\n const out: ModelInfo[] = [];\n const pager = await client.models.list();\n for await (const m of pager as AsyncIterable<{ name?: string; displayName?: string }>) {\n const id = stripModelPrefix(m.name ?? '');\n if (!id) continue;\n const known = knownModels.find((k) => k.id === id);\n if (known) {\n out.push(known);\n } else {\n out.push({\n id,\n displayName: m.displayName ?? undefined,\n capabilities: defaultGeminiCapabilities(),\n });\n }\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers (exported for adapter-local reuse only; not public)\n// ---------------------------------------------------------------------------\n\nfunction buildWireContents(req: PromptRequest): unknown[] {\n const out: unknown[] = [];\n for (const msg of req.messages) {\n if (msg.vendorRaw && typeof msg.vendorRaw === 'object') {\n out.push(msg.vendorRaw);\n continue;\n }\n const text = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);\n out.push({\n role: toGeminiRole(msg.role),\n parts: [{ text }],\n });\n }\n return out;\n}\n\nfunction toGeminiRole(role: string): 'user' | 'model' {\n return role === 'assistant' || role === 'model' ? 'model' : 'user';\n}\n\nfunction formatTools(tools: Tool[]): Array<Record<string, unknown>> {\n return [\n {\n functionDeclarations: tools.map((t) => ({\n name: t.name,\n description: t.description ?? '',\n parameters: t.parameters ?? { type: 'object', properties: {} },\n })),\n },\n ];\n}\n\nfunction mapFinishReason(r: string | undefined, hadToolCalls: boolean): FinishReason {\n if (hadToolCalls && (r === 'STOP' || r === 'TOOL_CALLS' || !r)) return 'tool';\n switch (r) {\n case 'STOP':\n return 'stop';\n case 'MAX_TOKENS':\n return 'length';\n case 'SAFETY':\n case 'RECITATION':\n return 'filtered';\n case 'TOOL_CALLS':\n return 'tool';\n default:\n return 'stop';\n }\n}\n\nfunction parseToolName(id: string): string {\n const hashIdx = id.lastIndexOf('#');\n if (hashIdx === -1) return id;\n const suffix = id.slice(hashIdx + 1);\n if (/^\\d+$/.test(suffix)) return id.slice(0, hashIdx);\n return id;\n}\n\nfunction stripModelPrefix(name: string): string {\n return name.startsWith('models/') ? name.slice('models/'.length) : name;\n}\n\nexport function defaultGeminiCapabilities() {\n return {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n };\n}\n\nfunction isAbortError(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false;\n const e = err as { name?: string; code?: string; message?: string };\n return (\n e.name === 'APIUserAbortError' ||\n e.name === 'AbortError' ||\n e.code === 'ABORT_ERR' ||\n (typeof e.message === 'string' && /aborted/i.test(e.message))\n );\n}\n","import type { AdapterManifest, ModelInfo } from '../../types.js';\n\n/**\n * Known Gemini models. Model listing via `listAvailableModels()` hits the\n * live endpoint; this curated list drives the admin-UI dropdown.\n *\n * All Gemini models in this list support tools and streaming. Only the\n * `-lite` flash variants lose vision support.\n */\nconst GOOGLE_KNOWN_MODELS: ModelInfo[] = [\n {\n id: 'gemini-2.5-pro',\n displayName: 'Gemini 2.5 Pro',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'gemini-2.5-flash',\n displayName: 'Gemini 2.5 Flash',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'gemini-2.0-flash',\n displayName: 'Gemini 2.0 Flash',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'gemini-2.0-flash-lite',\n displayName: 'Gemini 2.0 Flash Lite',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'gemini-1.5-pro',\n displayName: 'Gemini 1.5 Pro',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 2_000_000,\n },\n },\n {\n id: 'gemini-1.5-flash',\n displayName: 'Gemini 1.5 Flash',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n];\n\nexport const googleManifest: AdapterManifest = {\n vendor: 'google',\n displayName: 'Google Gemini',\n authKinds: [\n {\n kind: 'googleApiKey',\n displayName: 'API Key',\n fields: [\n {\n name: 'apiKey',\n label: 'API Key',\n type: 'password',\n required: true,\n help: 'Get an API key from https://aistudio.google.com/apikey',\n },\n ],\n },\n ],\n knownModels: GOOGLE_KNOWN_MODELS,\n supportsModelListing: true,\n docsUrl: 'https://ai.google.dev/gemini-api/docs',\n};\n\n","import type { AdapterFactory, GoogleApiKeyAuth } from '../../types.js';\nimport { GoogleAdapter } from './adapter.js';\nimport { googleManifest } from './manifest.js';\n\nexport const googleFactory: AdapterFactory<GoogleApiKeyAuth> = {\n vendor: googleManifest.vendor,\n manifest: googleManifest,\n create: () => new GoogleAdapter(),\n};\n","import { GoogleGenAI } from '@google/genai';\nimport type {\n ClientOptions,\n LlmAdapter,\n LlmEvent,\n Message,\n ModelInfo,\n PromptRequest,\n ToolCallEvent,\n VertexServiceAccountAuth,\n} from '../../types.js';\nimport {\n appendGeminiAssistantToolCall,\n appendGeminiToolResult,\n listGeminiModels,\n streamFromGemini,\n} from '../google/_streaming.js';\nimport { vertexGeminiManifest } from './manifest.js';\n\n/**\n * Adapter for Gemini models running on Vertex AI.\n *\n * Wire shape is identical to the `google` adapter — both use `@google/genai`\n * and speak the same contents/parts protocol. The only differences are:\n * - Client is constructed with `vertexai: true` plus project/location.\n * - Auth uses a GCP service account (pass through `googleAuthOptions`).\n *\n * For third-party models hosted on Vertex (Mistral, Llama, etc.) that speak\n * the OpenAI-compatible protocol, see the `vertex-openai` adapter.\n */\nexport class VertexGeminiAdapter implements LlmAdapter<VertexServiceAccountAuth> {\n readonly vendor = vertexGeminiManifest.vendor;\n readonly acceptedAuth = ['vertexServiceAccount'] as const;\n\n private client: GoogleGenAI | undefined;\n\n init(auth: VertexServiceAccountAuth, _client?: ClientOptions): void {\n if (auth.kind !== 'vertexServiceAccount') {\n throw new Error(\n `VertexGeminiAdapter: unsupported auth kind '${(auth as { kind: string }).kind}'`,\n );\n }\n if (!auth.credentials) {\n throw new Error('VertexGeminiAdapter: service-account credentials are required');\n }\n if (!auth.projectId) {\n throw new Error('VertexGeminiAdapter: projectId is required');\n }\n if (!auth.location) {\n throw new Error('VertexGeminiAdapter: location is required');\n }\n\n this.client = new GoogleGenAI({\n vertexai: true,\n project: auth.projectId,\n location: auth.location,\n googleAuthOptions: {\n credentials: auth.credentials as Record<string, unknown>,\n },\n });\n }\n\n stream(req: PromptRequest): AsyncIterable<LlmEvent> {\n return streamFromGemini(this.ensureClient(), req);\n }\n\n appendAssistantToolCall(\n history: Message[],\n toolCalls: ReadonlyArray<ToolCallEvent>,\n ): Message[] {\n return appendGeminiAssistantToolCall(history, toolCalls);\n }\n\n appendToolResult(history: Message[], toolCallId: string, result: unknown): Message[] {\n return appendGeminiToolResult(history, toolCallId, result);\n }\n\n async listAvailableModels(): Promise<ModelInfo[]> {\n return listGeminiModels(this.ensureClient(), vertexGeminiManifest.knownModels);\n }\n\n async warmup(): Promise<void> {\n // No cheap idempotent warmup endpoint. No-op.\n }\n\n private ensureClient(): GoogleGenAI {\n if (!this.client) {\n throw new Error(\n 'VertexGeminiAdapter: init() must be called before stream()/listAvailableModels()',\n );\n }\n return this.client;\n }\n}\n","import type { AdapterManifest, ModelInfo } from '../../types.js';\n\n/**\n * Known Gemini models available on Vertex AI.\n *\n * Vertex-hosted Gemini models often use the `-001` / `-002` versioning\n * suffix (vs AI Studio's bare id). We list both conventions so the admin-UI\n * dropdown covers common deployments.\n */\nconst VERTEX_GEMINI_KNOWN_MODELS: ModelInfo[] = [\n {\n id: 'gemini-2.5-pro',\n displayName: 'Gemini 2.5 Pro',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'gemini-2.5-flash',\n displayName: 'Gemini 2.5 Flash',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'gemini-2.0-flash',\n displayName: 'Gemini 2.0 Flash',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'gemini-1.5-pro',\n displayName: 'Gemini 1.5 Pro',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 2_000_000,\n },\n },\n {\n id: 'gemini-1.5-flash',\n displayName: 'Gemini 1.5 Flash',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n];\n\nexport const vertexGeminiManifest: AdapterManifest = {\n vendor: 'vertex-gemini',\n displayName: 'Vertex AI — Gemini',\n authKinds: [\n {\n kind: 'vertexServiceAccount',\n displayName: 'Service Account JSON',\n fields: [\n {\n name: 'credentials',\n label: 'Service Account Key (JSON)',\n type: 'json-file',\n required: true,\n help: 'Upload the service account key JSON from Google Cloud Console.',\n },\n {\n name: 'projectId',\n label: 'Project ID',\n type: 'text',\n required: true,\n help: 'GCP project that hosts the Vertex AI deployment.',\n },\n {\n name: 'location',\n label: 'Region',\n type: 'select',\n required: true,\n default: 'us-central1',\n options: [\n { value: 'us-central1', label: 'us-central1' },\n { value: 'us-east1', label: 'us-east1' },\n { value: 'us-east4', label: 'us-east4' },\n { value: 'us-west1', label: 'us-west1' },\n { value: 'us-west4', label: 'us-west4' },\n { value: 'europe-west1', label: 'europe-west1' },\n { value: 'europe-west2', label: 'europe-west2' },\n { value: 'europe-west3', label: 'europe-west3' },\n { value: 'europe-west4', label: 'europe-west4' },\n { value: 'asia-east1', label: 'asia-east1' },\n { value: 'asia-northeast1', label: 'asia-northeast1' },\n { value: 'asia-southeast1', label: 'asia-southeast1' },\n ],\n },\n ],\n },\n ],\n knownModels: VERTEX_GEMINI_KNOWN_MODELS,\n supportsModelListing: true,\n docsUrl: 'https://cloud.google.com/vertex-ai/generative-ai/docs',\n};\n","import type { AdapterFactory, VertexServiceAccountAuth } from '../../types.js';\nimport { VertexGeminiAdapter } from './adapter.js';\nimport { vertexGeminiManifest } from './manifest.js';\n\nexport const vertexGeminiFactory: AdapterFactory<VertexServiceAccountAuth> = {\n vendor: vertexGeminiManifest.vendor,\n manifest: vertexGeminiManifest,\n create: () => new VertexGeminiAdapter(),\n};\n","import OpenAI from 'openai';\nimport { GoogleAuth } from 'google-auth-library';\nimport type {\n ClientOptions,\n LlmAdapter,\n LlmEvent,\n Message,\n ModelInfo,\n PromptRequest,\n ToolCallEvent,\n VertexServiceAccountAuth,\n} from '../../types.js';\nimport {\n appendOpenAIAssistantToolCall,\n appendOpenAIToolResult,\n streamFromOpenAI,\n} from '../openai/_streaming.js';\nimport { vertexOpenAIManifest } from './manifest.js';\n\n/**\n * Adapter for third-party models on Vertex AI (Mistral, Llama, etc.) that\n * expose an OpenAI-compatible endpoint. Shares all wire translation with\n * the native OpenAI adapter; only the client differs — `baseURL` is\n * Vertex-specific and a custom `fetch` wraps each request to inject a GCP\n * Bearer token from a service account.\n */\nexport class VertexOpenAIAdapter implements LlmAdapter<VertexServiceAccountAuth> {\n readonly vendor = vertexOpenAIManifest.vendor;\n readonly acceptedAuth = ['vertexServiceAccount'] as const;\n\n private client: OpenAI | undefined;\n\n init(auth: VertexServiceAccountAuth, client?: ClientOptions): void {\n if (auth.kind !== 'vertexServiceAccount') {\n throw new Error(\n `VertexOpenAIAdapter: unsupported auth kind '${(auth as { kind: string }).kind}'`,\n );\n }\n if (!auth.credentials) {\n throw new Error('VertexOpenAIAdapter: service-account credentials are required');\n }\n if (!auth.projectId) {\n throw new Error('VertexOpenAIAdapter: projectId is required');\n }\n if (!auth.location) {\n throw new Error('VertexOpenAIAdapter: location is required');\n }\n\n // Vertex AI's OpenAI-compatible endpoint is at /v1beta1/ — documented in\n // Google's SDK examples (google-cloud-aiplatform) and Google Cloud docs.\n // A /v1/ variant returns 404; do not use.\n const baseURL =\n `https://${auth.location}-aiplatform.googleapis.com/v1beta1/projects/` +\n `${auth.projectId}/locations/${auth.location}/endpoints/openapi`;\n\n const googleAuth = new GoogleAuth({\n credentials: auth.credentials as Record<string, unknown>,\n scopes: ['https://www.googleapis.com/auth/cloud-platform'],\n });\n\n const authedFetch: typeof fetch = async (input, init) => {\n const googleClient = await googleAuth.getClient();\n const token = await googleClient.getAccessToken();\n const headers = new Headers(init?.headers);\n headers.set('Authorization', `Bearer ${token.token ?? ''}`);\n return fetch(input, { ...init, headers });\n };\n\n this.client = new OpenAI({\n apiKey: 'vertex-ai',\n baseURL,\n fetch: authedFetch as never,\n ...(client?.timeout !== undefined ? { timeout: client.timeout } : {}),\n ...(client?.maxRetries !== undefined ? { maxRetries: client.maxRetries } : {}),\n });\n }\n\n stream(req: PromptRequest): AsyncIterable<LlmEvent> {\n // Vertex AI's Llama MaaS endpoint returns an empty assistant message\n // (zero tokens, finish_reason: stop) when max_tokens is not set. Apply\n // a sensible default so callers don't have to know this quirk.\n return streamFromOpenAI(this.ensureClient(), req, {\n knownModels: vertexOpenAIManifest.knownModels,\n defaultMaxTokens: 4096,\n });\n }\n\n appendAssistantToolCall(\n history: Message[],\n toolCalls: ReadonlyArray<ToolCallEvent>,\n ): Message[] {\n return appendOpenAIAssistantToolCall(history, toolCalls);\n }\n\n appendToolResult(history: Message[], toolCallId: string, result: unknown): Message[] {\n return appendOpenAIToolResult(history, toolCallId, result);\n }\n\n async listAvailableModels(): Promise<ModelInfo[]> {\n // The Vertex OpenAI-compatible endpoint does not expose a models list.\n // Return the curated set from the manifest.\n return [...vertexOpenAIManifest.knownModels];\n }\n\n async warmup(): Promise<void> {\n // No cheap idempotent warmup endpoint. No-op.\n }\n\n private ensureClient(): OpenAI {\n if (!this.client) {\n throw new Error(\n 'VertexOpenAIAdapter: init() must be called before stream()/listAvailableModels()',\n );\n }\n return this.client;\n }\n}\n","import type { AdapterManifest, ModelInfo } from '../../types.js';\n\n/**\n * Known third-party models available via Vertex AI's OpenAI-compatible\n * endpoint. This is NOT an exhaustive list — Vertex offers many publisher\n * models from Mistral, Meta, AI21, etc. — but it covers the common options\n * so the admin-UI dropdown is useful out of the box.\n */\nconst VERTEX_OPENAI_KNOWN_MODELS: ModelInfo[] = [\n {\n id: 'mistral-large',\n displayName: 'Mistral Large (on Vertex)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'mistral-small',\n displayName: 'Mistral Small (on Vertex)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 32_000,\n },\n },\n {\n id: 'meta/llama-3.3-70b-instruct-maas',\n displayName: 'Llama 3.3 70B Instruct (on Vertex)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'meta/llama-3.1-405b-instruct-maas',\n displayName: 'Llama 3.1 405B Instruct (on Vertex)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n];\n\nexport const vertexOpenAIManifest: AdapterManifest = {\n vendor: 'vertex-openai',\n displayName: 'Vertex AI — OpenAI-compatible',\n authKinds: [\n {\n kind: 'vertexServiceAccount',\n displayName: 'Service Account JSON',\n fields: [\n {\n name: 'credentials',\n label: 'Service Account Key (JSON)',\n type: 'json-file',\n required: true,\n help: 'Upload the service account key JSON from Google Cloud Console.',\n },\n {\n name: 'projectId',\n label: 'Project ID',\n type: 'text',\n required: true,\n help: 'GCP project that hosts the Vertex AI deployment.',\n },\n {\n name: 'location',\n label: 'Region',\n type: 'select',\n required: true,\n default: 'us-central1',\n options: [\n { value: 'us-central1', label: 'us-central1' },\n { value: 'us-east4', label: 'us-east4' },\n { value: 'europe-west1', label: 'europe-west1' },\n { value: 'europe-west4', label: 'europe-west4' },\n { value: 'asia-southeast1', label: 'asia-southeast1' },\n ],\n },\n ],\n },\n ],\n knownModels: VERTEX_OPENAI_KNOWN_MODELS,\n // The OpenAI-compatible endpoint on Vertex does not expose a /models list.\n supportsModelListing: false,\n docsUrl: 'https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-openai',\n};\n","import type { AdapterFactory, VertexServiceAccountAuth } from '../../types.js';\nimport { VertexOpenAIAdapter } from './adapter.js';\nimport { vertexOpenAIManifest } from './manifest.js';\n\nexport const vertexOpenAIFactory: AdapterFactory<VertexServiceAccountAuth> = {\n vendor: vertexOpenAIManifest.vendor,\n manifest: vertexOpenAIManifest,\n create: () => new VertexOpenAIAdapter(),\n};\n","import {\n BedrockRuntimeClient,\n ConverseStreamCommand,\n} from '@aws-sdk/client-bedrock-runtime';\nimport type {\n BedrockApiKeyAuth,\n BedrockIamAuth,\n ClientOptions,\n FinishReason,\n LlmAdapter,\n LlmEvent,\n Message,\n ModelInfo,\n PromptRequest,\n Tool,\n ToolCallEvent,\n} from '../../types.js';\nimport { assertValidRequest } from '../../validate.js';\nimport { bedrockManifest } from './manifest.js';\n\ntype BedrockAuthSpec = BedrockApiKeyAuth | BedrockIamAuth;\n\n/**\n * Adapter for AWS Bedrock via the Converse API.\n *\n * Bedrock's Converse wire shape diverges from the other adapters:\n * - Messages use `{role, content: [ContentBlock, ...]}` where content is\n * ALWAYS an array. Text blocks are `{text}`; tool-use blocks are\n * `{toolUse: {toolUseId, name, input}}`; tool results are\n * `{toolResult: {toolUseId, content: [{text}]}}` carried on role `user`.\n * - System prompt is `system: [{text}]` at the top level (array).\n * - Tools go in `toolConfig: {tools: [{toolSpec: {name, description,\n * inputSchema: {json}}}]}`.\n * - Conversations must start with a `user` message; adjacent same-role\n * messages are rejected by the service (the library does not validate —\n * the caller is responsible for ordering).\n * - Streaming events are different too:\n * messageStart → (contentBlockStart → contentBlockDelta* →\n * contentBlockStop)* → messageStop → metadata\n * - Auth has two modes: bedrockApiKey (bearer token) or bedrockIam\n * (accessKeyId + secretAccessKey [+ sessionToken]).\n */\nexport class BedrockAdapter implements LlmAdapter<BedrockAuthSpec> {\n readonly vendor = bedrockManifest.vendor;\n readonly acceptedAuth = ['bedrockApiKey', 'bedrockIam'] as const;\n\n private client: BedrockRuntimeClient | undefined;\n\n init(auth: BedrockAuthSpec, client?: ClientOptions): void {\n if (!auth.region) {\n throw new Error('BedrockAdapter: region is required');\n }\n\n const config: Record<string, unknown> = {\n region: auth.region,\n ...(client?.endpoint ? { endpoint: client.endpoint } : {}),\n ...(client?.maxRetries !== undefined ? { maxAttempts: client.maxRetries + 1 } : {}),\n };\n\n if (auth.kind === 'bedrockApiKey') {\n if (!auth.apiKey) {\n throw new Error('BedrockAdapter: apiKey is required for bedrockApiKey auth');\n }\n // Bedrock API key is a bearer token — must be preferred over SigV4 so\n // it wins against ambient credentials (e.g., EC2 instance role).\n config.token = { token: auth.apiKey };\n config.authSchemePreference = ['httpBearerAuth'];\n } else if (auth.kind === 'bedrockIam') {\n if (!auth.accessKeyId || !auth.secretAccessKey) {\n throw new Error('BedrockAdapter: accessKeyId and secretAccessKey required for bedrockIam auth');\n }\n config.credentials = {\n accessKeyId: auth.accessKeyId,\n secretAccessKey: auth.secretAccessKey,\n ...(auth.sessionToken ? { sessionToken: auth.sessionToken } : {}),\n };\n } else {\n throw new Error(\n `BedrockAdapter: unsupported auth kind '${(auth as { kind: string }).kind}'`,\n );\n }\n\n this.client = new BedrockRuntimeClient(config);\n }\n\n async *stream(req: PromptRequest): AsyncIterable<LlmEvent> {\n assertValidRequest(req);\n const client = this.ensureClient();\n\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n const messages = buildWireMessages(req);\n const tools =\n req.tools && req.tools.length > 0 ? { tools: formatTools(req.tools) } : undefined;\n\n const inferenceConfig: Record<string, unknown> = {};\n if (req.maxTokens !== undefined) inferenceConfig.maxTokens = req.maxTokens;\n if (req.temperature !== undefined) inferenceConfig.temperature = req.temperature;\n\n const commandInput: Record<string, unknown> = {\n modelId: req.model,\n messages,\n };\n if (req.system) commandInput.system = [{ text: req.system }];\n if (tools) commandInput.toolConfig = tools;\n if (Object.keys(inferenceConfig).length > 0) {\n commandInput.inferenceConfig = inferenceConfig;\n }\n\n const command = new ConverseStreamCommand(\n commandInput as unknown as ConstructorParameters<typeof ConverseStreamCommand>[0],\n );\n\n let response;\n try {\n response = await client.send(command, { abortSignal: req.signal });\n } catch (err) {\n if (isAbortError(err)) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n throw err;\n }\n\n if (!response.stream) {\n yield { type: 'end', finishReason: 'stop' };\n return;\n }\n\n let currentToolUse: PendingToolUse | null = null;\n const completedToolCalls: Array<{ id: string; name: string; arguments: unknown }> = [];\n let stopReason: string | undefined;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let totalTokens: number | undefined;\n\n try {\n for await (const event of response.stream as AsyncIterable<BedrockStreamEvent>) {\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n if (event.contentBlockStart) {\n const start = event.contentBlockStart.start;\n if (start?.toolUse) {\n currentToolUse = {\n id: start.toolUse.toolUseId ?? '',\n name: start.toolUse.name ?? '',\n inputText: '',\n };\n if (currentToolUse.id && currentToolUse.name) {\n yield {\n type: 'toolCallStart',\n id: currentToolUse.id,\n name: currentToolUse.name,\n };\n }\n }\n } else if (event.contentBlockDelta) {\n const delta = event.contentBlockDelta.delta;\n if (delta?.text) {\n yield { type: 'token', text: delta.text };\n }\n if (delta?.toolUse && currentToolUse && typeof delta.toolUse.input === 'string') {\n currentToolUse.inputText += delta.toolUse.input;\n }\n } else if (event.contentBlockStop) {\n if (currentToolUse && currentToolUse.id && currentToolUse.name) {\n let parsed: unknown = {};\n try {\n parsed = currentToolUse.inputText ? JSON.parse(currentToolUse.inputText) : {};\n } catch {\n parsed = {};\n }\n completedToolCalls.push({\n id: currentToolUse.id,\n name: currentToolUse.name,\n arguments: parsed,\n });\n }\n currentToolUse = null;\n } else if (event.messageStop) {\n stopReason = event.messageStop.stopReason;\n } else if (event.metadata) {\n if (event.metadata.usage) {\n inputTokens = event.metadata.usage.inputTokens;\n outputTokens = event.metadata.usage.outputTokens;\n totalTokens = event.metadata.usage.totalTokens;\n }\n }\n }\n } catch (err) {\n if (isAbortError(err)) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n throw err;\n }\n\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n for (const tc of completedToolCalls) {\n yield {\n type: 'toolCall',\n id: tc.id,\n name: tc.name,\n arguments: tc.arguments,\n };\n }\n\n const finishReason = mapStopReason(stopReason, completedToolCalls.length > 0);\n const usage =\n inputTokens !== undefined || outputTokens !== undefined || totalTokens !== undefined\n ? {\n ...(inputTokens !== undefined ? { inputTokens } : {}),\n ...(outputTokens !== undefined ? { outputTokens } : {}),\n ...(totalTokens !== undefined ? { totalTokens } : {}),\n }\n : undefined;\n\n const endEvent: Extract<LlmEvent, { type: 'end' }> = {\n type: 'end',\n finishReason,\n ...(usage ? { usage } : {}),\n ...(stopReason ? { rawReason: stopReason } : {}),\n };\n yield endEvent;\n }\n\n appendAssistantToolCall(\n history: Message[],\n toolCalls: ReadonlyArray<ToolCallEvent>,\n ): Message[] {\n const wireMessage = {\n role: 'assistant',\n content: toolCalls.map((tc) => ({\n toolUse: {\n toolUseId: tc.id,\n name: tc.name,\n input: tc.arguments ?? {},\n },\n })),\n };\n return [\n ...history,\n {\n role: 'assistant',\n content: '',\n vendorRaw: wireMessage,\n },\n ];\n }\n\n appendToolResult(history: Message[], toolCallId: string, result: unknown): Message[] {\n const text = typeof result === 'string' ? result : JSON.stringify(result);\n const wireMessage = {\n role: 'user',\n content: [\n {\n toolResult: {\n toolUseId: toolCallId,\n content: [{ text }],\n },\n },\n ],\n };\n return [\n ...history,\n {\n role: 'tool',\n content: text,\n vendorRaw: wireMessage,\n },\n ];\n }\n\n async listAvailableModels(): Promise<ModelInfo[]> {\n // The bedrock-runtime client has no /models endpoint; the control-plane\n // @aws-sdk/client-bedrock package does but we don't pull it in. Return the\n // curated manifest set.\n return [...bedrockManifest.knownModels];\n }\n\n async warmup(): Promise<void> {\n // No cheap idempotent warmup. No-op.\n }\n\n private ensureClient(): BedrockRuntimeClient {\n if (!this.client) {\n throw new Error(\n 'BedrockAdapter: init() must be called before stream()/listAvailableModels()',\n );\n }\n return this.client;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internal types\n// ---------------------------------------------------------------------------\n\ninterface PendingToolUse {\n id: string;\n name: string;\n inputText: string;\n}\n\ninterface BedrockStreamEvent {\n messageStart?: { role?: string };\n contentBlockStart?: {\n start?: {\n toolUse?: { toolUseId?: string; name?: string };\n };\n contentBlockIndex?: number;\n };\n contentBlockDelta?: {\n delta?: {\n text?: string;\n toolUse?: { input?: string };\n };\n contentBlockIndex?: number;\n };\n contentBlockStop?: { contentBlockIndex?: number };\n messageStop?: { stopReason?: string };\n metadata?: {\n usage?: { inputTokens?: number; outputTokens?: number; totalTokens?: number };\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildWireMessages(req: PromptRequest): unknown[] {\n const out: unknown[] = [];\n for (const msg of req.messages) {\n if (msg.vendorRaw && typeof msg.vendorRaw === 'object') {\n out.push(msg.vendorRaw);\n continue;\n }\n // Normalize plain-string messages to Converse's content-block array shape.\n const text = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);\n // Bedrock Converse does not accept role:'tool' — tool results must be\n // carried as content blocks on a role:'user' message. Without vendorRaw\n // we fall back to a text block.\n const role = msg.role === 'tool' ? 'user' : msg.role;\n out.push({\n role,\n content: [{ text }],\n });\n }\n return out;\n}\n\nfunction formatTools(tools: Tool[]): Array<Record<string, unknown>> {\n return tools.map((t) => ({\n toolSpec: {\n name: t.name,\n // Bedrock rejects empty-string descriptions; fall back to a single space.\n description: t.description && t.description.length > 0 ? t.description : ' ',\n inputSchema: {\n json: t.parameters ?? { type: 'object', properties: {} },\n },\n },\n }));\n}\n\nfunction mapStopReason(r: string | undefined, hadToolCalls: boolean): FinishReason {\n if (hadToolCalls) return 'tool';\n switch (r) {\n case 'end_turn':\n case 'stop_sequence':\n return 'stop';\n case 'tool_use':\n return 'tool';\n case 'max_tokens':\n return 'length';\n case 'content_filtered':\n case 'guardrail_intervened':\n return 'filtered';\n default:\n return 'stop';\n }\n}\n\nfunction isAbortError(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false;\n const e = err as { name?: string; code?: string; message?: string };\n return (\n e.name === 'AbortError' ||\n e.name === 'APIUserAbortError' ||\n e.code === 'ABORT_ERR' ||\n (typeof e.message === 'string' && /aborted/i.test(e.message))\n );\n}\n","import type { AdapterManifest, ModelInfo } from '../../types.js';\n\n/**\n * Known Bedrock models spanning the main publisher families available via the\n * Converse API. Model ids on Bedrock include a publisher prefix and version\n * suffix (e.g. `anthropic.claude-3-5-sonnet-20241022-v2:0`).\n *\n * Bedrock also supports cross-region inference profile ids (e.g.\n * `us.anthropic.claude-3-5-sonnet-20241022-v2:0`) — users should enter those\n * directly when needed; the adapter passes `model` through unchanged.\n *\n * Ordering matters: the first entry is used as the default probe model by\n * api-server's GET /LlmCredentials/:sid/test when `supportsModelListing` is\n * false. Amazon Nova Micro is first — AWS's own cheapest-per-token model,\n * broadly available across regions, and (unlike third-party Claude/Llama\n * models) not subject to provider-led \"legacy\" lifecycles that can revoke\n * access. Operators can override via `JAMBONZ_LLM_BEDROCK_PROBE_MODEL`.\n *\n * `deprecated: true` signals a model AWS may reject with\n * `ResourceNotFoundException: \"This Model is marked by provider as Legacy\"`\n * on accounts that haven't invoked it in the last 30 days. The id is kept in\n * the manifest so accounts that *have* been using it can still select it;\n * the webapp should badge/sort deprecated entries accordingly.\n *\n * Claude 4.x ids carry the `us.` cross-region inference profile prefix\n * because on-demand invocation of plain `anthropic.claude-*-4-*` ids is no\n * longer available in most regions — Bedrock requires the profile. Operators\n * in EU/APAC should edit to `eu.`/`apac.` or enter a region-specific id.\n */\nconst BEDROCK_KNOWN_MODELS: ModelInfo[] = [\n {\n id: 'amazon.nova-micro-v1:0',\n displayName: 'Amazon Nova Micro',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'amazon.nova-lite-v1:0',\n displayName: 'Amazon Nova Lite',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 300_000,\n },\n },\n {\n id: 'amazon.nova-pro-v1:0',\n displayName: 'Amazon Nova Pro',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 300_000,\n },\n },\n {\n id: 'us.anthropic.claude-haiku-4-5-20251001-v1:0',\n displayName: 'Claude Haiku 4.5 (on Bedrock)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n },\n {\n id: 'us.anthropic.claude-sonnet-4-5-20250929-v1:0',\n displayName: 'Claude Sonnet 4.5 (on Bedrock)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n },\n {\n id: 'anthropic.claude-3-5-haiku-20241022-v1:0',\n displayName: 'Claude 3.5 Haiku (on Bedrock)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n deprecated: true,\n },\n {\n id: 'anthropic.claude-3-5-sonnet-20240620-v1:0',\n displayName: 'Claude 3.5 Sonnet (on Bedrock)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n deprecated: true,\n },\n {\n id: 'anthropic.claude-3-5-sonnet-20241022-v2:0',\n displayName: 'Claude 3.5 Sonnet v2 (on Bedrock)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n deprecated: true,\n },\n {\n id: 'anthropic.claude-3-7-sonnet-20250219-v1:0',\n displayName: 'Claude 3.7 Sonnet (on Bedrock)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n deprecated: true,\n },\n {\n id: 'meta.llama3-3-70b-instruct-v1:0',\n displayName: 'Llama 3.3 70B Instruct (on Bedrock)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'mistral.mistral-large-2407-v1:0',\n displayName: 'Mistral Large (on Bedrock)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n];\n\n// Common Bedrock regions. Not exhaustive — users can enter others via 'Other'\n// or (later) a free-text region field. The library does not validate against\n// this list; it's purely a UI aid.\nconst BEDROCK_REGIONS: Array<{ value: string; label: string }> = [\n { value: 'us-east-1', label: 'us-east-1 (N. Virginia)' },\n { value: 'us-east-2', label: 'us-east-2 (Ohio)' },\n { value: 'us-west-2', label: 'us-west-2 (Oregon)' },\n { value: 'eu-west-1', label: 'eu-west-1 (Ireland)' },\n { value: 'eu-west-3', label: 'eu-west-3 (Paris)' },\n { value: 'eu-central-1', label: 'eu-central-1 (Frankfurt)' },\n { value: 'ap-northeast-1', label: 'ap-northeast-1 (Tokyo)' },\n { value: 'ap-south-1', label: 'ap-south-1 (Mumbai)' },\n { value: 'ap-southeast-1', label: 'ap-southeast-1 (Singapore)' },\n { value: 'ap-southeast-2', label: 'ap-southeast-2 (Sydney)' },\n { value: 'ca-central-1', label: 'ca-central-1 (Canada)' },\n];\n\nexport const bedrockManifest: AdapterManifest = {\n vendor: 'bedrock',\n displayName: 'AWS Bedrock',\n authKinds: [\n {\n kind: 'bedrockApiKey',\n displayName: 'API Key',\n fields: [\n {\n name: 'apiKey',\n label: 'API Key',\n type: 'password',\n required: true,\n help: 'Bedrock API key (bearer token). Create one in the AWS console under Amazon Bedrock → API keys.',\n },\n {\n name: 'region',\n label: 'Region',\n type: 'select',\n required: true,\n default: 'us-east-1',\n options: BEDROCK_REGIONS,\n },\n ],\n },\n {\n kind: 'bedrockIam',\n displayName: 'IAM Credentials',\n fields: [\n {\n name: 'accessKeyId',\n label: 'Access Key ID',\n type: 'text',\n required: true,\n },\n {\n name: 'secretAccessKey',\n label: 'Secret Access Key',\n type: 'password',\n required: true,\n },\n {\n name: 'sessionToken',\n label: 'Session Token',\n type: 'password',\n required: false,\n help: 'Only required when using temporary credentials (e.g., STS).',\n },\n {\n name: 'region',\n label: 'Region',\n type: 'select',\n required: true,\n default: 'us-east-1',\n options: BEDROCK_REGIONS,\n },\n ],\n },\n ],\n knownModels: BEDROCK_KNOWN_MODELS,\n // The Bedrock runtime client does not expose a `/models` listing — model\n // enumeration lives in `@aws-sdk/client-bedrock` (control plane), which we\n // don't pull in. Return the curated set from the manifest.\n supportsModelListing: false,\n docsUrl: 'https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html',\n};\n","import type {\n AdapterFactory,\n BedrockApiKeyAuth,\n BedrockIamAuth,\n} from '../../types.js';\nimport { BedrockAdapter } from './adapter.js';\nimport { bedrockManifest } from './manifest.js';\n\nexport const bedrockFactory: AdapterFactory<BedrockApiKeyAuth | BedrockIamAuth> = {\n vendor: bedrockManifest.vendor,\n manifest: bedrockManifest,\n create: () => new BedrockAdapter(),\n};\n","/**\n * Central adapter registration.\n *\n * Each bundled vendor adapter is registered here at import time. When a new\n * vendor adapter is added under `src/adapters/<vendor>/`, add a single line\n * below to register its factory.\n *\n * The `_template` directory is intentionally NOT registered — it's a scaffold\n * for contributors to copy, not a live adapter.\n */\n\nimport { registerAdapter } from '../registry.js';\nimport { openAIFactory, deepseekFactory } from './openai/index.js';\nimport { anthropicFactory } from './anthropic/index.js';\nimport { googleFactory } from './google/index.js';\nimport { vertexGeminiFactory } from './vertex-gemini/index.js';\nimport { vertexOpenAIFactory } from './vertex-openai/index.js';\nimport { bedrockFactory } from './bedrock/index.js';\n\nregisterAdapter(openAIFactory);\nregisterAdapter(deepseekFactory);\nregisterAdapter(anthropicFactory);\nregisterAdapter(googleFactory);\nregisterAdapter(vertexGeminiFactory);\nregisterAdapter(vertexOpenAIFactory);\nregisterAdapter(bedrockFactory);\n","import type {\n AuthSpec,\n BedrockApiKeyAuth,\n BedrockIamAuth,\n GoogleApiKeyAuth,\n GoogleServiceAccountAuth,\n ServiceAccountJson,\n VertexServiceAccountAuth,\n} from './types.js';\n\n/**\n * The loose \"DB-shape\" input accepted by `normalizeAuth`.\n *\n * This is the shape produced by jambonz's api-server after decryption, and by\n * feature-server's `credential-mapper.js`. Snake-case is used to match the\n * legacy wire shape; the helper converts to the `AuthSpec` discriminated union.\n *\n * External callers that construct `AuthSpec` directly can skip this helper entirely.\n */\nexport interface RawCredential {\n api_key?: string | null;\n /** Either a JSON string or a parsed object. */\n service_key?: string | ServiceAccountJson | null;\n access_key_id?: string | null;\n secret_access_key?: string | null;\n session_token?: string | null;\n region?: string | null;\n api_url?: string | null;\n project_id?: string | null;\n location?: string | null;\n}\n\n/**\n * Convert a vendor + raw credential into an `AuthSpec` discriminated union member.\n *\n * Supported vendors: openai, deepseek, anthropic, google, vertex (alias for\n * vertex-gemini + vertex-openai — both accept the same auth shape), vertex-gemini,\n * vertex-openai, bedrock.\n *\n * Throws with a clear message if the raw credential is missing required fields.\n */\nexport function normalizeAuth(vendor: string, raw: RawCredential): AuthSpec {\n switch (vendor) {\n case 'openai':\n case 'anthropic':\n return requireApiKey(vendor, raw);\n\n case 'deepseek':\n return {\n ...requireApiKey(vendor, raw),\n baseURL: raw.api_url ?? 'https://api.deepseek.com/v1',\n };\n\n case 'google':\n return normalizeGoogle(raw);\n\n case 'vertex':\n case 'vertex-gemini':\n case 'vertex-openai':\n return normalizeVertex(vendor, raw);\n\n case 'bedrock':\n return normalizeBedrock(raw);\n\n default:\n throw new Error(\n `normalizeAuth: unknown vendor '${vendor}'. ` +\n `If this is a custom adapter, construct the AuthSpec directly.`,\n );\n }\n}\n\nfunction requireApiKey(vendor: string, raw: RawCredential) {\n if (!raw.api_key) {\n throw new Error(`normalizeAuth: vendor '${vendor}' requires 'api_key'`);\n }\n const result: { kind: 'apiKey'; apiKey: string; baseURL?: string } = {\n kind: 'apiKey',\n apiKey: raw.api_key,\n };\n if (raw.api_url) {\n result.baseURL = raw.api_url;\n }\n return result;\n}\n\nfunction normalizeGoogle(raw: RawCredential): GoogleApiKeyAuth | GoogleServiceAccountAuth {\n if (raw.service_key) {\n return {\n kind: 'googleServiceAccount',\n credentials: parseServiceKey(raw.service_key),\n };\n }\n if (raw.api_key) {\n return { kind: 'googleApiKey', apiKey: raw.api_key };\n }\n throw new Error(`normalizeAuth: vendor 'google' requires either 'api_key' or 'service_key'`);\n}\n\nfunction normalizeVertex(vendor: string, raw: RawCredential): VertexServiceAccountAuth {\n if (!raw.service_key) {\n throw new Error(`normalizeAuth: vendor '${vendor}' requires 'service_key'`);\n }\n if (!raw.location) {\n throw new Error(`normalizeAuth: vendor '${vendor}' requires 'location'`);\n }\n const credentials = parseServiceKey(raw.service_key);\n const projectId = raw.project_id ?? credentials.project_id;\n if (!projectId) {\n throw new Error(\n `normalizeAuth: vendor '${vendor}' requires 'project_id' (not present ` +\n `in raw credential or service_key.project_id)`,\n );\n }\n return {\n kind: 'vertexServiceAccount',\n credentials,\n projectId,\n location: raw.location,\n };\n}\n\nfunction normalizeBedrock(raw: RawCredential): BedrockIamAuth | BedrockApiKeyAuth {\n if (!raw.region) {\n throw new Error(`normalizeAuth: vendor 'bedrock' requires 'region'`);\n }\n if (raw.access_key_id && raw.secret_access_key) {\n const result: BedrockIamAuth = {\n kind: 'bedrockIam',\n accessKeyId: raw.access_key_id,\n secretAccessKey: raw.secret_access_key,\n region: raw.region,\n };\n if (raw.session_token) {\n result.sessionToken = raw.session_token;\n }\n return result;\n }\n if (raw.api_key) {\n return {\n kind: 'bedrockApiKey',\n apiKey: raw.api_key,\n region: raw.region,\n };\n }\n throw new Error(\n `normalizeAuth: vendor 'bedrock' requires either (access_key_id + secret_access_key) or api_key`,\n );\n}\n\nfunction parseServiceKey(value: string | ServiceAccountJson): ServiceAccountJson {\n if (typeof value === 'string') {\n try {\n return JSON.parse(value) as ServiceAccountJson;\n } catch {\n throw new Error(`normalizeAuth: 'service_key' is not valid JSON`);\n }\n }\n return value;\n}\n"],"mappings":"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","names":["OpenAI","Anthropic","buildWireMessages","formatTools","isAbortError","formatTools","isAbortError","usage","mapFinishReason","import_genai","import_openai","OpenAI","buildWireMessages","formatTools","isAbortError","mapStopReason"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/registry.ts","../src/adapters/openai/adapter.ts","../src/validate.ts","../src/adapters/openai/_streaming.ts","../src/adapters/openai/manifest.ts","../src/adapters/openai/factory.ts","../src/adapters/anthropic/adapter.ts","../src/adapters/anthropic/manifest.ts","../src/adapters/anthropic/factory.ts","../src/adapters/google/adapter.ts","../src/adapters/google/_streaming.ts","../src/adapters/google/manifest.ts","../src/adapters/google/factory.ts","../src/adapters/vertex-gemini/adapter.ts","../src/adapters/vertex-gemini/manifest.ts","../src/adapters/vertex-gemini/factory.ts","../src/adapters/vertex-openai/adapter.ts","../src/adapters/vertex-openai/manifest.ts","../src/adapters/vertex-openai/factory.ts","../src/adapters/bedrock/adapter.ts","../src/adapters/bedrock/manifest.ts","../src/adapters/bedrock/factory.ts","../src/adapters/index.ts","../src/normalize-auth.ts"],"sourcesContent":["/**\n * @jambonz/llm — voice-oriented LLM adapter library.\n *\n * Public entry point. Importing this module auto-registers all bundled adapters\n * via the side-effectful import of `./adapters/index.js`.\n *\n * Consumers use:\n * - `createLlm({vendor, auth, client?})` to get a ready-to-stream adapter instance.\n * - `getManifest()` to enumerate registered vendors (used by api-server).\n * - `normalizeAuth(vendor, rawCred)` to convert DB-shape creds to AuthSpec.\n * - `registerAdapter(factory)` to add a custom adapter at runtime.\n */\n\n// Side effect: register all bundled adapters. Must come first.\nimport './adapters/index.js';\n\nimport { getAdapterFactory } from './registry.js';\nimport type {\n AuthSpec,\n CreateLlmArgs,\n LlmAdapter,\n} from './types.js';\n\nexport async function createLlm<A extends AuthSpec = AuthSpec>(\n args: CreateLlmArgs<A>,\n): Promise<LlmAdapter<A>> {\n const factory = getAdapterFactory<A>(args.vendor);\n if (!factory.manifest.authKinds.some((k) => k.kind === args.auth.kind)) {\n const accepted = factory.manifest.authKinds.map((k) => k.kind).join(', ');\n throw new Error(\n `Vendor '${args.vendor}' does not accept auth kind '${args.auth.kind}'. ` +\n `Accepted kinds: ${accepted}`,\n );\n }\n const instance = factory.create();\n await Promise.resolve(instance.init(args.auth, args.client));\n return instance;\n}\n\n// Re-export the full public surface.\nexport type {\n AdapterFactory,\n AdapterManifest,\n ApiKeyAuth,\n AuthKind,\n AuthKindSchema,\n AuthSpec,\n BedrockApiKeyAuth,\n BedrockIamAuth,\n ClientOptions,\n ContentBlock,\n CreateLlmArgs,\n FinishReason,\n FormField,\n FormFieldType,\n GoogleApiKeyAuth,\n GoogleServiceAccountAuth,\n JsonSchema,\n LlmAdapter,\n LlmEvent,\n Message,\n ModelCapabilities,\n ModelInfo,\n PromptRequest,\n Role,\n ServiceAccountJson,\n Tool,\n ToolCallEvent,\n Usage,\n VertexServiceAccountAuth,\n} from './types.js';\n\nexport { normalizeAuth } from './normalize-auth.js';\nexport type { RawCredential } from './normalize-auth.js';\n\nexport { assertValidRequest } from './validate.js';\n\nexport {\n getAdapterFactory,\n getManifest,\n listVendors,\n registerAdapter,\n replaceAdapter,\n unregisterAdapter,\n} from './registry.js';\n","import type { AdapterFactory, AdapterManifest, AuthSpec } from './types.js';\n\n/**\n * Module-scope registry of adapter factories, keyed by vendor id.\n *\n * Adapters register themselves at import time via `registerAdapter`. Consumers\n * of the library then call `createLlm({vendor, auth})` and the factory for\n * that vendor is looked up here.\n */\nconst registry = new Map<string, AdapterFactory>();\n\n/**\n * Register an adapter factory. Called once per adapter at module load.\n *\n * Throws if a factory is already registered for the same vendor id — this\n * catches accidental double-registration and typos in `src/adapters/index.ts`.\n *\n * Use `replaceAdapter` if you deliberately need to override a registered adapter\n * (primarily useful in tests).\n */\nexport function registerAdapter(factory: AdapterFactory): void {\n if (registry.has(factory.vendor)) {\n throw new Error(\n `Adapter already registered for vendor '${factory.vendor}'. ` +\n `Use replaceAdapter() if you intended to override.`,\n );\n }\n if (factory.vendor !== factory.manifest.vendor) {\n throw new Error(\n `Adapter factory vendor '${factory.vendor}' does not match ` +\n `manifest.vendor '${factory.manifest.vendor}'.`,\n );\n }\n registry.set(factory.vendor, factory);\n}\n\n/**\n * Replace an already-registered adapter. Intended for test overrides.\n */\nexport function replaceAdapter(factory: AdapterFactory): void {\n registry.set(factory.vendor, factory);\n}\n\n/**\n * Remove an adapter from the registry. Intended for test cleanup.\n */\nexport function unregisterAdapter(vendor: string): void {\n registry.delete(vendor);\n}\n\n/**\n * Get a registered adapter factory. Throws if unknown vendor.\n */\nexport function getAdapterFactory<A extends AuthSpec = AuthSpec>(\n vendor: string,\n): AdapterFactory<A> {\n const factory = registry.get(vendor);\n if (!factory) {\n const known = Array.from(registry.keys()).sort().join(', ') || '(none)';\n throw new Error(\n `Unknown vendor '${vendor}'. Registered vendors: ${known}`,\n );\n }\n return factory as AdapterFactory<A>;\n}\n\n/**\n * List all registered vendor ids, sorted alphabetically.\n */\nexport function listVendors(): string[] {\n return Array.from(registry.keys()).sort();\n}\n\n/**\n * Return an aggregated manifest for all registered adapters. Used by\n * api-server's /llm-vendors/manifest endpoint.\n */\nexport function getManifest(): { vendors: AdapterManifest[] } {\n const vendors = Array.from(registry.values())\n .map((f) => f.manifest)\n .sort((a, b) => a.vendor.localeCompare(b.vendor));\n return { vendors };\n}\n\n/**\n * Test-only: reset the registry. Exposed for unit tests that register/unregister\n * adapters and need a clean slate.\n */\nexport function _resetRegistryForTests(): void {\n registry.clear();\n}\n","import OpenAI from 'openai';\nimport type {\n ApiKeyAuth,\n ClientOptions,\n LlmAdapter,\n LlmEvent,\n Message,\n ModelInfo,\n PromptRequest,\n ToolCallEvent,\n} from '../../types.js';\nimport {\n appendOpenAIAssistantToolCall,\n appendOpenAIToolResult,\n listOpenAICompatibleModels,\n streamFromOpenAI,\n} from './_streaming.js';\nimport { openAIManifest } from './manifest.js';\n\n/**\n * Adapter for OpenAI (and OpenAI-compatible endpoints: DeepSeek, LM Studio,\n * Ollama, vLLM, custom gateways).\n *\n * Wire translation lives in `_streaming.ts` and is shared with the\n * Vertex-OpenAI adapter — both use the same `openai` SDK with the same\n * on-wire shape; only client construction (auth, baseURL, fetch wrapper)\n * differs.\n */\nexport class OpenAIAdapter implements LlmAdapter<ApiKeyAuth> {\n readonly vendor = openAIManifest.vendor;\n readonly acceptedAuth = ['apiKey'] as const;\n\n protected client: OpenAI | undefined;\n\n init(auth: ApiKeyAuth, client?: ClientOptions): void {\n if (!auth.apiKey) {\n throw new Error('OpenAIAdapter: apiKey is required');\n }\n this.client = new OpenAI({\n apiKey: auth.apiKey,\n ...(auth.baseURL ? { baseURL: auth.baseURL } : {}),\n ...(client?.timeout !== undefined ? { timeout: client.timeout } : {}),\n ...(client?.maxRetries !== undefined ? { maxRetries: client.maxRetries } : {}),\n });\n }\n\n stream(req: PromptRequest): AsyncIterable<LlmEvent> {\n return streamFromOpenAI(this.ensureClient(), req, {\n knownModels: openAIManifest.knownModels,\n });\n }\n\n appendAssistantToolCall(\n history: Message[],\n toolCalls: ReadonlyArray<ToolCallEvent>,\n ): Message[] {\n return appendOpenAIAssistantToolCall(history, toolCalls);\n }\n\n appendToolResult(history: Message[], toolCallId: string, result: unknown): Message[] {\n return appendOpenAIToolResult(history, toolCallId, result);\n }\n\n async listAvailableModels(): Promise<ModelInfo[]> {\n return listOpenAICompatibleModels(this.ensureClient(), openAIManifest.knownModels);\n }\n\n async warmup(): Promise<void> {\n const client = this.ensureClient();\n await client.models.list().catch(() => undefined);\n }\n\n protected ensureClient(): OpenAI {\n if (!this.client) {\n throw new Error('OpenAIAdapter: init() must be called before stream()/listAvailableModels()');\n }\n return this.client;\n }\n}\n","import type { PromptRequest } from './types.js';\n\n/**\n * Validate a PromptRequest against the library's universal preconditions.\n *\n * Adapters should call this at the top of `stream()` to get consistent error\n * messages. The contract test-kit's check #18 verifies empty messages are\n * rejected, so adapters that skip this helper must implement the equivalent\n * validation themselves.\n *\n * Rules enforced:\n * - `model` is a non-empty string.\n * - `messages` is a non-empty array.\n * - `messages` does not contain `role: 'system'` turns (use `system` top-level).\n */\nexport function assertValidRequest(req: PromptRequest): void {\n if (!req || typeof req !== 'object') {\n throw new Error('PromptRequest must be an object');\n }\n if (typeof req.model !== 'string' || req.model.length === 0) {\n throw new Error('PromptRequest.model must be a non-empty string');\n }\n if (!Array.isArray(req.messages) || req.messages.length === 0) {\n throw new Error('PromptRequest.messages must be a non-empty array');\n }\n if (req.messages.some((m) => m.role === 'system')) {\n throw new Error(\n 'PromptRequest.messages must not contain role: \\'system\\'. ' +\n 'Pass the system prompt via PromptRequest.system instead.',\n );\n }\n}\n","import type OpenAI from 'openai';\nimport type { ChatCompletionCreateParamsStreaming } from 'openai/resources/chat/completions';\nimport type {\n FinishReason,\n LlmEvent,\n Message,\n ModelCapabilities,\n ModelInfo,\n PromptRequest,\n Tool,\n} from '../../types.js';\nimport { assertValidRequest } from '../../validate.js';\n\n/**\n * OpenAI wire translation, shared between the native OpenAI adapter and the\n * Vertex-OpenAI adapter (which talks to third-party models hosted on Vertex AI\n * via the OpenAI-compatible endpoint).\n */\nexport async function* streamFromOpenAI(\n client: OpenAI,\n req: PromptRequest,\n options: {\n knownModels: ReadonlyArray<ModelInfo>;\n /**\n * Whether to set `stream_options: { include_usage: true }` on the\n * request. Defaults to `true` for OpenAI's native API. Set to `false`\n * for third-party OpenAI-compatible endpoints (e.g. Vertex AI's OpenAI\n * endpoint for partner models) that reject unknown extensions with a\n * 400 error. When disabled, the `end` event's `usage` field is omitted.\n */\n includeStreamOptions?: boolean;\n /**\n * If the caller did not supply `maxTokens`, use this value. Set by the\n * Vertex-OpenAI adapter because Vertex AI's Llama MaaS endpoint returns\n * an empty assistant message (zero tokens, `finish_reason: stop`) when\n * `max_tokens` is omitted. Leave undefined for OpenAI's native API,\n * which defaults correctly on its own.\n */\n defaultMaxTokens?: number;\n },\n): AsyncIterable<LlmEvent> {\n assertValidRequest(req);\n\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n const capabilities = capabilitiesFor(req.model, options.knownModels);\n const useTools = req.tools && req.tools.length > 0 && capabilities.tools;\n\n const messages = buildWireMessages(req);\n const tools = useTools ? formatTools(req.tools!) : undefined;\n\n const body: ChatCompletionCreateParamsStreaming = {\n model: req.model,\n messages: messages as ChatCompletionCreateParamsStreaming['messages'],\n stream: true,\n ...(options.includeStreamOptions !== false\n ? { stream_options: { include_usage: true } }\n : {}),\n };\n if (tools) {\n body.tools = tools as unknown as ChatCompletionCreateParamsStreaming['tools'];\n body.tool_choice = 'auto';\n }\n if (req.temperature !== undefined) body.temperature = req.temperature;\n const effectiveMaxTokens = req.maxTokens ?? options.defaultMaxTokens;\n if (effectiveMaxTokens !== undefined) body.max_tokens = effectiveMaxTokens;\n\n let stream;\n try {\n stream = await client.chat.completions.create(body, { signal: req.signal });\n } catch (err) {\n if (isAbortError(err)) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n throw err;\n }\n\n const pending: Record<number, PendingToolCall> = {};\n const startedIds = new Set<string>();\n const toolCallsEmitted = new Set<string>();\n let usage: { inputTokens?: number; outputTokens?: number; totalTokens?: number } | undefined;\n let finalFinishReason: FinishReason | null = null;\n let finalRawReason: string | undefined;\n\n try {\n for await (const chunk of stream) {\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n if (chunk.usage) {\n usage = {\n ...(chunk.usage.prompt_tokens !== undefined\n ? { inputTokens: chunk.usage.prompt_tokens }\n : {}),\n ...(chunk.usage.completion_tokens !== undefined\n ? { outputTokens: chunk.usage.completion_tokens }\n : {}),\n ...(chunk.usage.total_tokens !== undefined\n ? { totalTokens: chunk.usage.total_tokens }\n : {}),\n };\n }\n\n const choice = chunk.choices?.[0];\n if (!choice) continue;\n\n const delta = choice.delta;\n const finishReason = choice.finish_reason;\n\n if (delta?.content) {\n yield { type: 'token', text: delta.content };\n }\n\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n if (!pending[idx]) {\n pending[idx] = { id: '', name: '', arguments: '' };\n }\n if (tc.id) pending[idx].id += tc.id;\n if (tc.function?.name) pending[idx].name += tc.function.name;\n if (tc.function?.arguments) pending[idx].arguments += tc.function.arguments;\n\n if (pending[idx].id && pending[idx].name && !startedIds.has(pending[idx].id)) {\n startedIds.add(pending[idx].id);\n yield {\n type: 'toolCallStart',\n id: pending[idx].id,\n name: pending[idx].name,\n };\n }\n }\n }\n\n if (finishReason === 'tool_calls') {\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n for (const tc of Object.values(pending)) {\n if (!tc.id || !tc.name) continue;\n if (toolCallsEmitted.has(tc.id)) continue;\n toolCallsEmitted.add(tc.id);\n let args: unknown = {};\n try {\n args = tc.arguments ? JSON.parse(tc.arguments) : {};\n } catch {\n args = {};\n }\n yield {\n type: 'toolCall',\n id: tc.id,\n name: tc.name,\n arguments: args,\n };\n }\n finalFinishReason = 'tool';\n finalRawReason = finishReason;\n } else if (finishReason) {\n finalFinishReason = mapFinishReason(finishReason);\n finalRawReason = finishReason;\n }\n }\n } catch (err) {\n if (isAbortError(err)) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n throw err;\n }\n\n const endEvent: Extract<LlmEvent, { type: 'end' }> = {\n type: 'end',\n finishReason: finalFinishReason ?? 'stop',\n ...(usage ? { usage } : {}),\n ...(finalRawReason ? { rawReason: finalRawReason } : {}),\n };\n yield endEvent;\n}\n\nexport function appendOpenAIAssistantToolCall(\n history: Message[],\n toolCalls: ReadonlyArray<Extract<LlmEvent, { type: 'toolCall' }>>,\n): Message[] {\n const wireMessage = {\n role: 'assistant',\n content: null,\n tool_calls: toolCalls.map((tc) => ({\n id: tc.id,\n type: 'function',\n function: {\n name: tc.name,\n arguments: typeof tc.arguments === 'string'\n ? tc.arguments\n : JSON.stringify(tc.arguments ?? {}),\n },\n })),\n };\n return [\n ...history,\n {\n role: 'assistant',\n content: '',\n vendorRaw: wireMessage,\n },\n ];\n}\n\nexport function appendOpenAIToolResult(\n history: Message[],\n toolCallId: string,\n result: unknown,\n): Message[] {\n const content = typeof result === 'string' ? result : JSON.stringify(result);\n const wireMessage = {\n role: 'tool',\n tool_call_id: toolCallId,\n content,\n };\n return [\n ...history,\n {\n role: 'tool',\n content,\n vendorRaw: wireMessage,\n },\n ];\n}\n\n/**\n * Call `models.list()` and normalise results, merging capabilities from a\n * known-models table when possible.\n */\nexport async function listOpenAICompatibleModels(\n client: OpenAI,\n knownModels: ReadonlyArray<ModelInfo>,\n): Promise<ModelInfo[]> {\n const result = await client.models.list();\n const out: ModelInfo[] = [];\n for (const m of result.data) {\n const known = knownModels.find((k) => k.id === m.id);\n if (known) {\n out.push(known);\n } else {\n out.push({\n id: m.id,\n capabilities: defaultCapabilitiesForUnknown(m.id),\n });\n }\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers (internal)\n// ---------------------------------------------------------------------------\n\ninterface PendingToolCall {\n id: string;\n name: string;\n arguments: string;\n}\n\nfunction buildWireMessages(req: PromptRequest): unknown[] {\n const out: unknown[] = [];\n if (req.system) {\n out.push({ role: 'system', content: req.system });\n }\n for (const msg of req.messages) {\n if (msg.vendorRaw && typeof msg.vendorRaw === 'object') {\n out.push(msg.vendorRaw);\n } else {\n out.push({ role: msg.role, content: msg.content });\n }\n }\n return out;\n}\n\nfunction formatTools(tools: Tool[]): Array<Record<string, unknown>> {\n return tools.map((t) => ({\n type: 'function',\n function: {\n name: t.name,\n description: t.description ?? '',\n parameters: t.parameters ?? { type: 'object', properties: {} },\n },\n }));\n}\n\nfunction capabilitiesFor(\n modelId: string,\n knownModels: ReadonlyArray<ModelInfo>,\n): ModelCapabilities {\n const known = knownModels.find((k) => k.id === modelId);\n if (known) return known.capabilities;\n return defaultCapabilitiesForUnknown(modelId);\n}\n\nexport function defaultCapabilitiesForUnknown(modelId: string): ModelCapabilities {\n const isReasoning = /^o[13]([-/]|$)/i.test(modelId);\n if (isReasoning) {\n return {\n streaming: false,\n tools: false,\n vision: false,\n systemPrompt: false,\n };\n }\n return {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n };\n}\n\nfunction mapFinishReason(r: string): FinishReason {\n switch (r) {\n case 'stop': return 'stop';\n case 'tool_calls': return 'tool';\n case 'function_call': return 'tool';\n case 'length': return 'length';\n case 'content_filter': return 'filtered';\n default: return 'stop';\n }\n}\n\nfunction isAbortError(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false;\n const e = err as { name?: string; code?: string; message?: string };\n return (\n e.name === 'APIUserAbortError' ||\n e.name === 'AbortError' ||\n e.code === 'ABORT_ERR' ||\n (typeof e.message === 'string' && /aborted/i.test(e.message))\n );\n}\n","import type { AdapterManifest, ModelInfo } from '../../types.js';\n\n/**\n * Known OpenAI models with capability flags.\n *\n * Model listing via `listAvailableModels()` hits the live `/v1/models` endpoint,\n * so this curated list is for the admin-UI dropdown and for capability\n * validation (e.g., rejecting tools on reasoning-only models).\n */\nconst OPENAI_KNOWN_MODELS: ModelInfo[] = [\n {\n id: 'gpt-4o',\n displayName: 'GPT-4o',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'gpt-4o-mini',\n displayName: 'GPT-4o mini',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'gpt-4-turbo',\n displayName: 'GPT-4 Turbo',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'gpt-3.5-turbo',\n displayName: 'GPT-3.5 Turbo',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 16_385,\n },\n },\n {\n id: 'o1-preview',\n displayName: 'o1 preview (reasoning)',\n capabilities: {\n streaming: false,\n tools: false,\n vision: false,\n systemPrompt: false,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'o1-mini',\n displayName: 'o1 mini (reasoning)',\n capabilities: {\n streaming: false,\n tools: false,\n vision: false,\n systemPrompt: false,\n maxContextTokens: 128_000,\n },\n },\n];\n\nexport const openAIManifest: AdapterManifest = {\n vendor: 'openai',\n displayName: 'OpenAI',\n authKinds: [\n {\n kind: 'apiKey',\n displayName: 'API Key',\n fields: [\n {\n name: 'apiKey',\n label: 'API Key',\n type: 'password',\n required: true,\n help: 'Get an API key from https://platform.openai.com/api-keys',\n },\n {\n name: 'baseURL',\n label: 'Base URL',\n type: 'url',\n required: false,\n default: 'https://api.openai.com/v1',\n help: 'Override for OpenAI-compatible endpoints (LM Studio, Ollama, vLLM, proxies).',\n },\n ],\n },\n ],\n knownModels: OPENAI_KNOWN_MODELS,\n supportsModelListing: true,\n docsUrl: 'https://platform.openai.com/docs/api-reference',\n};\n","import type { AdapterFactory, AdapterManifest, ApiKeyAuth } from '../../types.js';\nimport { OpenAIAdapter } from './adapter.js';\nimport { openAIManifest } from './manifest.js';\n\nexport const openAIFactory: AdapterFactory<ApiKeyAuth> = {\n vendor: openAIManifest.vendor,\n manifest: openAIManifest,\n create: () => new OpenAIAdapter(),\n};\n\n/**\n * DeepSeek alias factory. Wraps the OpenAI adapter but advertises itself as\n * `deepseek` and ships a DeepSeek-specific manifest (different default\n * `baseURL`, different known models, different docsUrl).\n *\n * Consumers call `createLlm({vendor: 'deepseek', auth: {kind: 'apiKey', apiKey}})`\n * and get the OpenAI wire adapter pointed at the DeepSeek endpoint.\n */\nconst deepseekManifest: AdapterManifest = {\n vendor: 'deepseek',\n displayName: 'DeepSeek',\n authKinds: [\n {\n kind: 'apiKey',\n displayName: 'API Key',\n fields: [\n {\n name: 'apiKey',\n label: 'API Key',\n type: 'password',\n required: true,\n help: 'Get an API key from https://platform.deepseek.com/api_keys',\n },\n {\n name: 'baseURL',\n label: 'Base URL',\n type: 'url',\n required: false,\n default: 'https://api.deepseek.com/v1',\n help: 'Override for self-hosted DeepSeek or proxy endpoints.',\n },\n ],\n },\n ],\n knownModels: [\n {\n id: 'deepseek-v4-flash',\n displayName: 'DeepSeek V4 Flash',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'deepseek-v4-pro',\n displayName: 'DeepSeek V4 Pro',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'deepseek-chat',\n displayName: 'DeepSeek Chat',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 64_000,\n },\n deprecated: true,\n },\n {\n id: 'deepseek-reasoner',\n displayName: 'DeepSeek Reasoner',\n capabilities: {\n streaming: true,\n tools: false,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 64_000,\n },\n deprecated: true,\n },\n ],\n supportsModelListing: true,\n docsUrl: 'https://api-docs.deepseek.com/',\n};\n\nclass DeepSeekAdapter extends OpenAIAdapter {\n readonly vendor = deepseekManifest.vendor;\n\n override init(auth: ApiKeyAuth, client?: Parameters<OpenAIAdapter['init']>[1]): void {\n super.init(\n {\n ...auth,\n baseURL: auth.baseURL ?? 'https://api.deepseek.com/v1',\n },\n client,\n );\n }\n}\n\nexport const deepseekFactory: AdapterFactory<ApiKeyAuth> = {\n vendor: deepseekManifest.vendor,\n manifest: deepseekManifest,\n create: () => new DeepSeekAdapter(),\n};\n","import Anthropic from '@anthropic-ai/sdk';\nimport type {\n ApiKeyAuth,\n ClientOptions,\n FinishReason,\n LlmAdapter,\n LlmEvent,\n Message,\n ModelInfo,\n PromptRequest,\n Tool,\n ToolCallEvent,\n} from '../../types.js';\nimport { assertValidRequest } from '../../validate.js';\nimport { anthropicManifest } from './manifest.js';\n\n/**\n * Adapter for Anthropic Claude.\n *\n * Key wire-shape differences from OpenAI:\n * - `system` is a top-level request parameter, not a message.\n * - Tool schema is `{name, description, input_schema}` (not `parameters`).\n * - Tool results are `{role: 'user', content: [{type: 'tool_result', tool_use_id, content}]}`\n * — note role: 'user', not 'tool'.\n * - Assistant messages with tool calls carry `content: [{type: 'tool_use', id, name, input}]`\n * — content is an array of blocks, not a string or a separate tool_calls array.\n * - Stream events are content-block based (content_block_start/delta/stop + message_*).\n * - `max_tokens` is REQUIRED; we default to 4096 if the caller doesn't set one.\n */\nexport class AnthropicAdapter implements LlmAdapter<ApiKeyAuth> {\n readonly vendor = anthropicManifest.vendor;\n readonly acceptedAuth = ['apiKey'] as const;\n\n private client: Anthropic | undefined;\n\n init(auth: ApiKeyAuth, client?: ClientOptions): void {\n if (!auth.apiKey) {\n throw new Error('AnthropicAdapter: apiKey is required');\n }\n this.client = new Anthropic({\n apiKey: auth.apiKey,\n ...(auth.baseURL ? { baseURL: auth.baseURL } : {}),\n ...(client?.timeout !== undefined ? { timeout: client.timeout } : {}),\n ...(client?.maxRetries !== undefined ? { maxRetries: client.maxRetries } : {}),\n });\n }\n\n async *stream(req: PromptRequest): AsyncIterable<LlmEvent> {\n assertValidRequest(req);\n const client = this.ensureClient();\n\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n const messages = buildWireMessages(req);\n const tools = req.tools && req.tools.length > 0 ? formatTools(req.tools) : undefined;\n\n const body: Record<string, unknown> = {\n model: req.model,\n messages,\n max_tokens: req.maxTokens ?? 4_096,\n stream: true,\n };\n if (req.system) body.system = req.system;\n if (tools) body.tools = tools;\n if (req.temperature !== undefined) body.temperature = req.temperature;\n\n let stream;\n try {\n stream = await client.messages.create(\n body as unknown as Parameters<typeof client.messages.create>[0],\n { signal: req.signal },\n );\n } catch (err) {\n if (isAbortError(err)) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n throw err;\n }\n\n let currentToolUse: PendingToolUse | null = null;\n const completedToolCalls: CompletedToolCall[] = [];\n let stopReason: string | undefined;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n\n try {\n for await (const event of stream as unknown as AsyncIterable<AnthropicStreamEvent>) {\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n switch (event.type) {\n case 'message_start':\n inputTokens = event.message?.usage?.input_tokens;\n break;\n\n case 'content_block_start': {\n const block = event.content_block;\n if (block?.type === 'tool_use') {\n currentToolUse = {\n id: block.id ?? '',\n name: block.name ?? '',\n argumentsText: '',\n };\n if (currentToolUse.id && currentToolUse.name) {\n yield {\n type: 'toolCallStart',\n id: currentToolUse.id,\n name: currentToolUse.name,\n };\n }\n }\n break;\n }\n\n case 'content_block_delta': {\n const delta = event.delta;\n if (delta?.type === 'text_delta' && delta.text) {\n yield { type: 'token', text: delta.text };\n } else if (delta?.type === 'input_json_delta' && currentToolUse && delta.partial_json) {\n currentToolUse.argumentsText += delta.partial_json;\n }\n break;\n }\n\n case 'content_block_stop':\n if (currentToolUse && currentToolUse.id && currentToolUse.name) {\n let parsed: unknown = {};\n try {\n parsed = currentToolUse.argumentsText\n ? JSON.parse(currentToolUse.argumentsText)\n : {};\n } catch {\n parsed = {};\n }\n completedToolCalls.push({\n id: currentToolUse.id,\n name: currentToolUse.name,\n arguments: parsed,\n });\n }\n currentToolUse = null;\n break;\n\n case 'message_delta':\n if (event.delta?.stop_reason) {\n stopReason = event.delta.stop_reason;\n }\n if (event.usage?.output_tokens !== undefined) {\n outputTokens = event.usage.output_tokens;\n }\n break;\n\n case 'message_stop':\n // No-op — we synthesize the `end` event after the loop completes.\n break;\n\n default:\n // Ignore unknown event types (forward compat).\n break;\n }\n }\n } catch (err) {\n if (isAbortError(err)) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n throw err;\n }\n\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n // Emit accumulated tool calls before the end event.\n for (const tc of completedToolCalls) {\n yield {\n type: 'toolCall',\n id: tc.id,\n name: tc.name,\n arguments: tc.arguments,\n };\n }\n\n const finishReason = mapStopReason(stopReason, completedToolCalls.length > 0);\n const usage =\n inputTokens !== undefined || outputTokens !== undefined\n ? {\n ...(inputTokens !== undefined ? { inputTokens } : {}),\n ...(outputTokens !== undefined ? { outputTokens } : {}),\n ...(inputTokens !== undefined && outputTokens !== undefined\n ? { totalTokens: inputTokens + outputTokens }\n : {}),\n }\n : undefined;\n\n const endEvent: Extract<LlmEvent, { type: 'end' }> = {\n type: 'end',\n finishReason,\n ...(usage ? { usage } : {}),\n ...(stopReason ? { rawReason: stopReason } : {}),\n };\n yield endEvent;\n }\n\n appendAssistantToolCall(\n history: Message[],\n toolCalls: ReadonlyArray<ToolCallEvent>,\n ): Message[] {\n const wireMessage = {\n role: 'assistant',\n content: toolCalls.map((tc) => ({\n type: 'tool_use',\n id: tc.id,\n name: tc.name,\n input: tc.arguments ?? {},\n })),\n };\n return [\n ...history,\n {\n role: 'assistant',\n content: '',\n vendorRaw: wireMessage,\n },\n ];\n }\n\n appendToolResult(history: Message[], toolCallId: string, result: unknown): Message[] {\n const content = typeof result === 'string' ? result : JSON.stringify(result);\n const wireMessage = {\n role: 'user',\n content: [\n {\n type: 'tool_result',\n tool_use_id: toolCallId,\n content,\n },\n ],\n };\n return [\n ...history,\n {\n role: 'tool',\n content,\n vendorRaw: wireMessage,\n },\n ];\n }\n\n async listAvailableModels(): Promise<ModelInfo[]> {\n const client = this.ensureClient();\n const result = await client.models.list();\n const models: ModelInfo[] = [];\n for (const m of result.data) {\n const known = anthropicManifest.knownModels.find((k) => k.id === m.id);\n if (known) {\n models.push(known);\n } else {\n models.push({\n id: m.id,\n displayName: m.display_name ?? undefined,\n capabilities: defaultClaudeCapabilities(),\n });\n }\n }\n return models;\n }\n\n async warmup(): Promise<void> {\n const client = this.ensureClient();\n await client.models.list().catch(() => undefined);\n }\n\n private ensureClient(): Anthropic {\n if (!this.client) {\n throw new Error('AnthropicAdapter: init() must be called before stream()/listAvailableModels()');\n }\n return this.client;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internal types\n// ---------------------------------------------------------------------------\n\ninterface PendingToolUse {\n id: string;\n name: string;\n argumentsText: string;\n}\n\ninterface CompletedToolCall {\n id: string;\n name: string;\n arguments: unknown;\n}\n\ninterface AnthropicStreamEvent {\n type: string;\n message?: { usage?: { input_tokens?: number } };\n content_block?: { type?: string; id?: string; name?: string };\n delta?: {\n type?: string;\n text?: string;\n partial_json?: string;\n stop_reason?: string;\n };\n usage?: { output_tokens?: number };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildWireMessages(req: PromptRequest): unknown[] {\n const out: unknown[] = [];\n for (const msg of req.messages) {\n if (msg.vendorRaw && typeof msg.vendorRaw === 'object') {\n out.push(msg.vendorRaw);\n } else {\n out.push({ role: msg.role, content: msg.content });\n }\n }\n return out;\n}\n\nfunction formatTools(tools: Tool[]): Array<Record<string, unknown>> {\n return tools.map((t) => ({\n name: t.name,\n description: t.description ?? '',\n input_schema: t.parameters ?? { type: 'object', properties: {} },\n }));\n}\n\nfunction mapStopReason(r: string | undefined, hadToolCalls: boolean): FinishReason {\n if (hadToolCalls) return 'tool';\n switch (r) {\n case 'end_turn':\n case 'stop_sequence':\n return 'stop';\n case 'tool_use':\n return 'tool';\n case 'max_tokens':\n return 'length';\n default:\n return 'stop';\n }\n}\n\nfunction defaultClaudeCapabilities() {\n return {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n };\n}\n\nfunction isAbortError(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false;\n const e = err as { name?: string; code?: string; message?: string };\n return (\n e.name === 'APIUserAbortError' ||\n e.name === 'AbortError' ||\n e.code === 'ABORT_ERR' ||\n (typeof e.message === 'string' && /aborted/i.test(e.message))\n );\n}\n","import type { AdapterManifest, ModelInfo } from '../../types.js';\n\n/**\n * Known Claude models. Model listing via `listAvailableModels()` hits\n * Anthropic's live `/v1/models` endpoint; this curated list drives the\n * admin-UI dropdown and capability validation.\n *\n * All Claude models in this list support tools, streaming, system prompts,\n * and vision. There is no reasoning-only / tool-less variant to special-case\n * the way OpenAI's o1 family does.\n */\nconst ANTHROPIC_KNOWN_MODELS: ModelInfo[] = [\n {\n id: 'claude-opus-4-7',\n displayName: 'Claude Opus 4.7',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n },\n {\n id: 'claude-sonnet-4-6',\n displayName: 'Claude Sonnet 4.6',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n },\n {\n id: 'claude-haiku-4-5-20251001',\n displayName: 'Claude Haiku 4.5',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n },\n {\n id: 'claude-3-7-sonnet-20250219',\n displayName: 'Claude 3.7 Sonnet',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n },\n {\n id: 'claude-3-5-sonnet-20241022',\n displayName: 'Claude 3.5 Sonnet',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n },\n {\n id: 'claude-3-5-haiku-20241022',\n displayName: 'Claude 3.5 Haiku',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n },\n];\n\nexport const anthropicManifest: AdapterManifest = {\n vendor: 'anthropic',\n displayName: 'Anthropic Claude',\n authKinds: [\n {\n kind: 'apiKey',\n displayName: 'API Key',\n fields: [\n {\n name: 'apiKey',\n label: 'API Key',\n type: 'password',\n required: true,\n help: 'Get an API key from https://console.anthropic.com/settings/keys',\n },\n {\n name: 'baseURL',\n label: 'Base URL',\n type: 'url',\n required: false,\n default: 'https://api.anthropic.com',\n help: 'Override for proxies or enterprise deployments.',\n },\n ],\n },\n ],\n knownModels: ANTHROPIC_KNOWN_MODELS,\n supportsModelListing: true,\n docsUrl: 'https://docs.anthropic.com/en/api/overview',\n};\n","import type { AdapterFactory, ApiKeyAuth } from '../../types.js';\nimport { AnthropicAdapter } from './adapter.js';\nimport { anthropicManifest } from './manifest.js';\n\nexport const anthropicFactory: AdapterFactory<ApiKeyAuth> = {\n vendor: anthropicManifest.vendor,\n manifest: anthropicManifest,\n create: () => new AnthropicAdapter(),\n};\n","import { GoogleGenAI } from '@google/genai';\nimport type {\n ClientOptions,\n GoogleApiKeyAuth,\n LlmAdapter,\n LlmEvent,\n Message,\n ModelInfo,\n PromptRequest,\n ToolCallEvent,\n} from '../../types.js';\nimport {\n appendGeminiAssistantToolCall,\n appendGeminiToolResult,\n listGeminiModels,\n streamFromGemini,\n} from './_streaming.js';\nimport { googleManifest } from './manifest.js';\n\n/**\n * Adapter for Google Gemini via AI Studio (`@google/genai`, API key auth).\n *\n * Wire translation lives in `_streaming.ts` and is shared with the\n * Vertex-Gemini adapter — both use the same `@google/genai` SDK and the\n * same on-wire shape; only client construction differs.\n *\n * For service-account auth on Vertex AI, see the `vertex-gemini` adapter.\n */\nexport class GoogleAdapter implements LlmAdapter<GoogleApiKeyAuth> {\n readonly vendor = googleManifest.vendor;\n readonly acceptedAuth = ['googleApiKey'] as const;\n\n private client: GoogleGenAI | undefined;\n\n init(auth: GoogleApiKeyAuth, _client?: ClientOptions): void {\n if (auth.kind !== 'googleApiKey') {\n throw new Error(\n `GoogleAdapter: unsupported auth kind '${(auth as { kind: string }).kind}'`,\n );\n }\n if (!auth.apiKey) {\n throw new Error('GoogleAdapter: apiKey is required');\n }\n this.client = new GoogleGenAI({ apiKey: auth.apiKey });\n }\n\n stream(req: PromptRequest): AsyncIterable<LlmEvent> {\n return streamFromGemini(this.ensureClient(), req);\n }\n\n appendAssistantToolCall(\n history: Message[],\n toolCalls: ReadonlyArray<ToolCallEvent>,\n ): Message[] {\n return appendGeminiAssistantToolCall(history, toolCalls);\n }\n\n appendToolResult(history: Message[], toolCallId: string, result: unknown): Message[] {\n return appendGeminiToolResult(history, toolCallId, result);\n }\n\n async listAvailableModels(): Promise<ModelInfo[]> {\n return listGeminiModels(this.ensureClient(), googleManifest.knownModels);\n }\n\n async warmup(): Promise<void> {\n // @google/genai has no cheap idempotent warmup endpoint. No-op.\n }\n\n private ensureClient(): GoogleGenAI {\n if (!this.client) {\n throw new Error('GoogleAdapter: init() must be called before stream()/listAvailableModels()');\n }\n return this.client;\n }\n}\n","import type { GoogleGenAI } from '@google/genai';\nimport type {\n FinishReason,\n LlmEvent,\n Message,\n ModelInfo,\n PromptRequest,\n Tool,\n} from '../../types.js';\nimport { assertValidRequest } from '../../validate.js';\n\n/**\n * Gemini wire translation, shared between the Google AI Studio adapter\n * and the Vertex-Gemini adapter. Both use the same `@google/genai` SDK\n * with the same on-wire shape — only the client construction differs.\n */\nexport async function* streamFromGemini(\n client: GoogleGenAI,\n req: PromptRequest,\n): AsyncIterable<LlmEvent> {\n assertValidRequest(req);\n\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n const contents = buildWireContents(req);\n const tools = req.tools && req.tools.length > 0 ? formatTools(req.tools) : undefined;\n\n const config: Record<string, unknown> = {};\n if (req.system) {\n config.systemInstruction = { parts: [{ text: req.system }] };\n }\n if (tools) config.tools = tools;\n if (req.temperature !== undefined) config.temperature = req.temperature;\n if (req.maxTokens !== undefined) config.maxOutputTokens = req.maxTokens;\n if (req.signal) config.abortSignal = req.signal;\n\n let stream;\n try {\n stream = await client.models.generateContentStream({\n model: req.model,\n contents: contents as Parameters<typeof client.models.generateContentStream>[0]['contents'],\n config,\n });\n } catch (err) {\n if (isAbortError(err)) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n throw err;\n }\n\n const toolCallCounter = new Map<string, number>();\n const completedToolCalls: Array<{ id: string; name: string; arguments: unknown }> = [];\n let stopReason: string | undefined;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let totalTokens: number | undefined;\n\n try {\n for await (const chunk of stream) {\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n const usage = chunk.usageMetadata;\n if (usage) {\n if (usage.promptTokenCount !== undefined) inputTokens = usage.promptTokenCount;\n if (usage.candidatesTokenCount !== undefined) outputTokens = usage.candidatesTokenCount;\n if (usage.totalTokenCount !== undefined) totalTokens = usage.totalTokenCount;\n }\n\n const candidate = chunk.candidates?.[0];\n if (!candidate?.content?.parts) {\n if (candidate?.finishReason) stopReason = candidate.finishReason;\n continue;\n }\n\n for (const part of candidate.content.parts) {\n if (typeof part.text === 'string' && part.text.length > 0) {\n yield { type: 'token', text: part.text };\n }\n if (part.functionCall) {\n const name = part.functionCall.name ?? '';\n if (!name) continue;\n const count = toolCallCounter.get(name) ?? 0;\n toolCallCounter.set(name, count + 1);\n const id = count === 0 ? name : `${name}#${count}`;\n yield { type: 'toolCallStart', id, name };\n completedToolCalls.push({\n id,\n name,\n arguments: part.functionCall.args ?? {},\n });\n }\n }\n\n if (candidate.finishReason) {\n stopReason = candidate.finishReason;\n }\n }\n } catch (err) {\n if (isAbortError(err)) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n throw err;\n }\n\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n for (const tc of completedToolCalls) {\n yield {\n type: 'toolCall',\n id: tc.id,\n name: tc.name,\n arguments: tc.arguments,\n };\n }\n\n const finishReason = mapFinishReason(stopReason, completedToolCalls.length > 0);\n const usage =\n inputTokens !== undefined || outputTokens !== undefined || totalTokens !== undefined\n ? {\n ...(inputTokens !== undefined ? { inputTokens } : {}),\n ...(outputTokens !== undefined ? { outputTokens } : {}),\n ...(totalTokens !== undefined ? { totalTokens } : {}),\n }\n : undefined;\n\n const endEvent: Extract<LlmEvent, { type: 'end' }> = {\n type: 'end',\n finishReason,\n ...(usage ? { usage } : {}),\n ...(stopReason ? { rawReason: stopReason } : {}),\n };\n yield endEvent;\n}\n\n/**\n * Build an assistant-with-tool-call turn in the Gemini wire shape (role:\n * 'model', parts: [{functionCall, ...}]). Shared between Google AI Studio\n * and Vertex-Gemini adapters.\n */\nexport function appendGeminiAssistantToolCall(\n history: Message[],\n toolCalls: ReadonlyArray<Extract<LlmEvent, { type: 'toolCall' }>>,\n): Message[] {\n const wireMessage = {\n role: 'model',\n parts: toolCalls.map((tc) => ({\n functionCall: {\n name: parseToolName(tc.id),\n args: tc.arguments ?? {},\n },\n })),\n };\n return [\n ...history,\n {\n role: 'assistant',\n content: '',\n vendorRaw: wireMessage,\n },\n ];\n}\n\n/**\n * Build a tool-result message in the Gemini wire shape. Shared between\n * Google AI Studio and Vertex-Gemini adapters.\n */\nexport function appendGeminiToolResult(\n history: Message[],\n toolCallId: string,\n result: unknown,\n): Message[] {\n const name = parseToolName(toolCallId);\n const content = typeof result === 'string' ? result : JSON.stringify(result);\n const wireMessage = {\n role: 'user',\n parts: [\n {\n functionResponse: {\n name,\n response: { result: content },\n },\n },\n ],\n };\n return [\n ...history,\n {\n role: 'tool',\n content,\n vendorRaw: wireMessage,\n },\n ];\n}\n\n/**\n * Call the models.list() pager and return normalised `ModelInfo` records,\n * merging capabilities from a known-models table when possible.\n */\nexport async function listGeminiModels(\n client: GoogleGenAI,\n knownModels: ReadonlyArray<ModelInfo>,\n): Promise<ModelInfo[]> {\n const out: ModelInfo[] = [];\n const pager = await client.models.list();\n for await (const m of pager as AsyncIterable<{ name?: string; displayName?: string }>) {\n const id = stripModelPrefix(m.name ?? '');\n if (!id) continue;\n const known = knownModels.find((k) => k.id === id);\n if (known) {\n out.push(known);\n } else {\n out.push({\n id,\n displayName: m.displayName ?? undefined,\n capabilities: defaultGeminiCapabilities(),\n });\n }\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers (exported for adapter-local reuse only; not public)\n// ---------------------------------------------------------------------------\n\nfunction buildWireContents(req: PromptRequest): unknown[] {\n const out: unknown[] = [];\n for (const msg of req.messages) {\n if (msg.vendorRaw && typeof msg.vendorRaw === 'object') {\n out.push(msg.vendorRaw);\n continue;\n }\n const text = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);\n out.push({\n role: toGeminiRole(msg.role),\n parts: [{ text }],\n });\n }\n return out;\n}\n\nfunction toGeminiRole(role: string): 'user' | 'model' {\n return role === 'assistant' || role === 'model' ? 'model' : 'user';\n}\n\nfunction formatTools(tools: Tool[]): Array<Record<string, unknown>> {\n return [\n {\n functionDeclarations: tools.map((t) => ({\n name: t.name,\n description: t.description ?? '',\n parameters: t.parameters ?? { type: 'object', properties: {} },\n })),\n },\n ];\n}\n\nfunction mapFinishReason(r: string | undefined, hadToolCalls: boolean): FinishReason {\n if (hadToolCalls && (r === 'STOP' || r === 'TOOL_CALLS' || !r)) return 'tool';\n switch (r) {\n case 'STOP':\n return 'stop';\n case 'MAX_TOKENS':\n return 'length';\n case 'SAFETY':\n case 'RECITATION':\n return 'filtered';\n case 'TOOL_CALLS':\n return 'tool';\n default:\n return 'stop';\n }\n}\n\nfunction parseToolName(id: string): string {\n const hashIdx = id.lastIndexOf('#');\n if (hashIdx === -1) return id;\n const suffix = id.slice(hashIdx + 1);\n if (/^\\d+$/.test(suffix)) return id.slice(0, hashIdx);\n return id;\n}\n\nfunction stripModelPrefix(name: string): string {\n return name.startsWith('models/') ? name.slice('models/'.length) : name;\n}\n\nexport function defaultGeminiCapabilities() {\n return {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n };\n}\n\nfunction isAbortError(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false;\n const e = err as { name?: string; code?: string; message?: string };\n return (\n e.name === 'APIUserAbortError' ||\n e.name === 'AbortError' ||\n e.code === 'ABORT_ERR' ||\n (typeof e.message === 'string' && /aborted/i.test(e.message))\n );\n}\n","import type { AdapterManifest, ModelInfo } from '../../types.js';\n\n/**\n * Known Gemini models. Model listing via `listAvailableModels()` hits the\n * live endpoint; this curated list drives the admin-UI dropdown.\n *\n * All Gemini models in this list support tools and streaming. Only the\n * `-lite` flash variants lose vision support.\n */\nconst GOOGLE_KNOWN_MODELS: ModelInfo[] = [\n {\n id: 'gemini-2.5-pro',\n displayName: 'Gemini 2.5 Pro',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'gemini-2.5-flash',\n displayName: 'Gemini 2.5 Flash',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'gemini-2.0-flash',\n displayName: 'Gemini 2.0 Flash',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'gemini-2.0-flash-lite',\n displayName: 'Gemini 2.0 Flash Lite',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'gemini-1.5-pro',\n displayName: 'Gemini 1.5 Pro',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 2_000_000,\n },\n },\n {\n id: 'gemini-1.5-flash',\n displayName: 'Gemini 1.5 Flash',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n];\n\nexport const googleManifest: AdapterManifest = {\n vendor: 'google',\n displayName: 'Google Gemini',\n authKinds: [\n {\n kind: 'googleApiKey',\n displayName: 'API Key',\n fields: [\n {\n name: 'apiKey',\n label: 'API Key',\n type: 'password',\n required: true,\n help: 'Get an API key from https://aistudio.google.com/apikey',\n },\n ],\n },\n ],\n knownModels: GOOGLE_KNOWN_MODELS,\n supportsModelListing: true,\n docsUrl: 'https://ai.google.dev/gemini-api/docs',\n};\n\n","import type { AdapterFactory, GoogleApiKeyAuth } from '../../types.js';\nimport { GoogleAdapter } from './adapter.js';\nimport { googleManifest } from './manifest.js';\n\nexport const googleFactory: AdapterFactory<GoogleApiKeyAuth> = {\n vendor: googleManifest.vendor,\n manifest: googleManifest,\n create: () => new GoogleAdapter(),\n};\n","import { GoogleGenAI } from '@google/genai';\nimport type {\n ClientOptions,\n LlmAdapter,\n LlmEvent,\n Message,\n ModelInfo,\n PromptRequest,\n ToolCallEvent,\n VertexServiceAccountAuth,\n} from '../../types.js';\nimport {\n appendGeminiAssistantToolCall,\n appendGeminiToolResult,\n listGeminiModels,\n streamFromGemini,\n} from '../google/_streaming.js';\nimport { vertexGeminiManifest } from './manifest.js';\n\n/**\n * Adapter for Gemini models running on Vertex AI.\n *\n * Wire shape is identical to the `google` adapter — both use `@google/genai`\n * and speak the same contents/parts protocol. The only differences are:\n * - Client is constructed with `vertexai: true` plus project/location.\n * - Auth uses a GCP service account (pass through `googleAuthOptions`).\n *\n * For third-party models hosted on Vertex (Mistral, Llama, etc.) that speak\n * the OpenAI-compatible protocol, see the `vertex-openai` adapter.\n */\nexport class VertexGeminiAdapter implements LlmAdapter<VertexServiceAccountAuth> {\n readonly vendor = vertexGeminiManifest.vendor;\n readonly acceptedAuth = ['vertexServiceAccount'] as const;\n\n private client: GoogleGenAI | undefined;\n\n init(auth: VertexServiceAccountAuth, _client?: ClientOptions): void {\n if (auth.kind !== 'vertexServiceAccount') {\n throw new Error(\n `VertexGeminiAdapter: unsupported auth kind '${(auth as { kind: string }).kind}'`,\n );\n }\n if (!auth.credentials) {\n throw new Error('VertexGeminiAdapter: service-account credentials are required');\n }\n if (!auth.projectId) {\n throw new Error('VertexGeminiAdapter: projectId is required');\n }\n if (!auth.location) {\n throw new Error('VertexGeminiAdapter: location is required');\n }\n\n this.client = new GoogleGenAI({\n vertexai: true,\n project: auth.projectId,\n location: auth.location,\n googleAuthOptions: {\n credentials: auth.credentials as Record<string, unknown>,\n },\n });\n }\n\n stream(req: PromptRequest): AsyncIterable<LlmEvent> {\n return streamFromGemini(this.ensureClient(), req);\n }\n\n appendAssistantToolCall(\n history: Message[],\n toolCalls: ReadonlyArray<ToolCallEvent>,\n ): Message[] {\n return appendGeminiAssistantToolCall(history, toolCalls);\n }\n\n appendToolResult(history: Message[], toolCallId: string, result: unknown): Message[] {\n return appendGeminiToolResult(history, toolCallId, result);\n }\n\n async listAvailableModels(): Promise<ModelInfo[]> {\n return listGeminiModels(this.ensureClient(), vertexGeminiManifest.knownModels);\n }\n\n async warmup(): Promise<void> {\n // No cheap idempotent warmup endpoint. No-op.\n }\n\n private ensureClient(): GoogleGenAI {\n if (!this.client) {\n throw new Error(\n 'VertexGeminiAdapter: init() must be called before stream()/listAvailableModels()',\n );\n }\n return this.client;\n }\n}\n","import type { AdapterManifest, ModelInfo } from '../../types.js';\n\n/**\n * Known Gemini models available on Vertex AI.\n *\n * Vertex-hosted Gemini models often use the `-001` / `-002` versioning\n * suffix (vs AI Studio's bare id). We list both conventions so the admin-UI\n * dropdown covers common deployments.\n */\nconst VERTEX_GEMINI_KNOWN_MODELS: ModelInfo[] = [\n {\n id: 'gemini-2.5-pro',\n displayName: 'Gemini 2.5 Pro',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'gemini-2.5-flash',\n displayName: 'Gemini 2.5 Flash',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'gemini-2.0-flash',\n displayName: 'Gemini 2.0 Flash',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'gemini-1.5-pro',\n displayName: 'Gemini 1.5 Pro',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 2_000_000,\n },\n },\n {\n id: 'gemini-1.5-flash',\n displayName: 'Gemini 1.5 Flash',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n];\n\nexport const vertexGeminiManifest: AdapterManifest = {\n vendor: 'vertex-gemini',\n displayName: 'Vertex AI — Gemini',\n authKinds: [\n {\n kind: 'vertexServiceAccount',\n displayName: 'Service Account JSON',\n fields: [\n {\n name: 'credentials',\n label: 'Service Account Key (JSON)',\n type: 'json-file',\n required: true,\n help: 'Upload the service account key JSON from Google Cloud Console.',\n },\n {\n name: 'projectId',\n label: 'Project ID',\n type: 'text',\n required: true,\n help: 'GCP project that hosts the Vertex AI deployment.',\n },\n {\n name: 'location',\n label: 'Region',\n type: 'select',\n required: true,\n default: 'us-central1',\n options: [\n { value: 'us-central1', label: 'us-central1' },\n { value: 'us-east1', label: 'us-east1' },\n { value: 'us-east4', label: 'us-east4' },\n { value: 'us-west1', label: 'us-west1' },\n { value: 'us-west4', label: 'us-west4' },\n { value: 'europe-west1', label: 'europe-west1' },\n { value: 'europe-west2', label: 'europe-west2' },\n { value: 'europe-west3', label: 'europe-west3' },\n { value: 'europe-west4', label: 'europe-west4' },\n { value: 'asia-east1', label: 'asia-east1' },\n { value: 'asia-northeast1', label: 'asia-northeast1' },\n { value: 'asia-southeast1', label: 'asia-southeast1' },\n ],\n },\n ],\n },\n ],\n knownModels: VERTEX_GEMINI_KNOWN_MODELS,\n supportsModelListing: true,\n docsUrl: 'https://cloud.google.com/vertex-ai/generative-ai/docs',\n};\n","import type { AdapterFactory, VertexServiceAccountAuth } from '../../types.js';\nimport { VertexGeminiAdapter } from './adapter.js';\nimport { vertexGeminiManifest } from './manifest.js';\n\nexport const vertexGeminiFactory: AdapterFactory<VertexServiceAccountAuth> = {\n vendor: vertexGeminiManifest.vendor,\n manifest: vertexGeminiManifest,\n create: () => new VertexGeminiAdapter(),\n};\n","import OpenAI from 'openai';\nimport { GoogleAuth } from 'google-auth-library';\nimport type {\n ClientOptions,\n LlmAdapter,\n LlmEvent,\n Message,\n ModelInfo,\n PromptRequest,\n ToolCallEvent,\n VertexServiceAccountAuth,\n} from '../../types.js';\nimport {\n appendOpenAIAssistantToolCall,\n appendOpenAIToolResult,\n streamFromOpenAI,\n} from '../openai/_streaming.js';\nimport { vertexOpenAIManifest } from './manifest.js';\n\n/**\n * Adapter for third-party models on Vertex AI (Mistral, Llama, etc.) that\n * expose an OpenAI-compatible endpoint. Shares all wire translation with\n * the native OpenAI adapter; only the client differs — `baseURL` is\n * Vertex-specific and a custom `fetch` wraps each request to inject a GCP\n * Bearer token from a service account.\n */\nexport class VertexOpenAIAdapter implements LlmAdapter<VertexServiceAccountAuth> {\n readonly vendor = vertexOpenAIManifest.vendor;\n readonly acceptedAuth = ['vertexServiceAccount'] as const;\n\n private client: OpenAI | undefined;\n\n init(auth: VertexServiceAccountAuth, client?: ClientOptions): void {\n if (auth.kind !== 'vertexServiceAccount') {\n throw new Error(\n `VertexOpenAIAdapter: unsupported auth kind '${(auth as { kind: string }).kind}'`,\n );\n }\n if (!auth.credentials) {\n throw new Error('VertexOpenAIAdapter: service-account credentials are required');\n }\n if (!auth.projectId) {\n throw new Error('VertexOpenAIAdapter: projectId is required');\n }\n if (!auth.location) {\n throw new Error('VertexOpenAIAdapter: location is required');\n }\n\n // Vertex AI's OpenAI-compatible endpoint is at /v1beta1/ — documented in\n // Google's SDK examples (google-cloud-aiplatform) and Google Cloud docs.\n // A /v1/ variant returns 404; do not use.\n const baseURL =\n `https://${auth.location}-aiplatform.googleapis.com/v1beta1/projects/` +\n `${auth.projectId}/locations/${auth.location}/endpoints/openapi`;\n\n const googleAuth = new GoogleAuth({\n credentials: auth.credentials as Record<string, unknown>,\n scopes: ['https://www.googleapis.com/auth/cloud-platform'],\n });\n\n const authedFetch: typeof fetch = async (input, init) => {\n const googleClient = await googleAuth.getClient();\n const token = await googleClient.getAccessToken();\n const headers = new Headers(init?.headers);\n headers.set('Authorization', `Bearer ${token.token ?? ''}`);\n return fetch(input, { ...init, headers });\n };\n\n this.client = new OpenAI({\n apiKey: 'vertex-ai',\n baseURL,\n fetch: authedFetch as never,\n ...(client?.timeout !== undefined ? { timeout: client.timeout } : {}),\n ...(client?.maxRetries !== undefined ? { maxRetries: client.maxRetries } : {}),\n });\n }\n\n stream(req: PromptRequest): AsyncIterable<LlmEvent> {\n // Vertex AI's Llama MaaS endpoint returns an empty assistant message\n // (zero tokens, finish_reason: stop) when max_tokens is not set. Apply\n // a sensible default so callers don't have to know this quirk.\n return streamFromOpenAI(this.ensureClient(), req, {\n knownModels: vertexOpenAIManifest.knownModels,\n defaultMaxTokens: 4096,\n });\n }\n\n appendAssistantToolCall(\n history: Message[],\n toolCalls: ReadonlyArray<ToolCallEvent>,\n ): Message[] {\n return appendOpenAIAssistantToolCall(history, toolCalls);\n }\n\n appendToolResult(history: Message[], toolCallId: string, result: unknown): Message[] {\n return appendOpenAIToolResult(history, toolCallId, result);\n }\n\n async listAvailableModels(): Promise<ModelInfo[]> {\n // The Vertex OpenAI-compatible endpoint does not expose a models list.\n // Return the curated set from the manifest.\n return [...vertexOpenAIManifest.knownModels];\n }\n\n async warmup(): Promise<void> {\n // No cheap idempotent warmup endpoint. No-op.\n }\n\n private ensureClient(): OpenAI {\n if (!this.client) {\n throw new Error(\n 'VertexOpenAIAdapter: init() must be called before stream()/listAvailableModels()',\n );\n }\n return this.client;\n }\n}\n","import type { AdapterManifest, ModelInfo } from '../../types.js';\n\n/**\n * Known third-party models available via Vertex AI's OpenAI-compatible\n * endpoint. This is NOT an exhaustive list — Vertex offers many publisher\n * models from Mistral, Meta, AI21, etc. — but it covers the common options\n * so the admin-UI dropdown is useful out of the box.\n */\nconst VERTEX_OPENAI_KNOWN_MODELS: ModelInfo[] = [\n {\n id: 'mistral-large',\n displayName: 'Mistral Large (on Vertex)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'mistral-small',\n displayName: 'Mistral Small (on Vertex)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 32_000,\n },\n },\n {\n id: 'meta/llama-3.3-70b-instruct-maas',\n displayName: 'Llama 3.3 70B Instruct (on Vertex)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'meta/llama-3.1-405b-instruct-maas',\n displayName: 'Llama 3.1 405B Instruct (on Vertex)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n];\n\nexport const vertexOpenAIManifest: AdapterManifest = {\n vendor: 'vertex-openai',\n displayName: 'Vertex AI — OpenAI-compatible',\n authKinds: [\n {\n kind: 'vertexServiceAccount',\n displayName: 'Service Account JSON',\n fields: [\n {\n name: 'credentials',\n label: 'Service Account Key (JSON)',\n type: 'json-file',\n required: true,\n help: 'Upload the service account key JSON from Google Cloud Console.',\n },\n {\n name: 'projectId',\n label: 'Project ID',\n type: 'text',\n required: true,\n help: 'GCP project that hosts the Vertex AI deployment.',\n },\n {\n name: 'location',\n label: 'Region',\n type: 'select',\n required: true,\n default: 'us-central1',\n options: [\n { value: 'us-central1', label: 'us-central1' },\n { value: 'us-east4', label: 'us-east4' },\n { value: 'europe-west1', label: 'europe-west1' },\n { value: 'europe-west4', label: 'europe-west4' },\n { value: 'asia-southeast1', label: 'asia-southeast1' },\n ],\n },\n ],\n },\n ],\n knownModels: VERTEX_OPENAI_KNOWN_MODELS,\n // The OpenAI-compatible endpoint on Vertex does not expose a /models list.\n supportsModelListing: false,\n docsUrl: 'https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-openai',\n};\n","import type { AdapterFactory, VertexServiceAccountAuth } from '../../types.js';\nimport { VertexOpenAIAdapter } from './adapter.js';\nimport { vertexOpenAIManifest } from './manifest.js';\n\nexport const vertexOpenAIFactory: AdapterFactory<VertexServiceAccountAuth> = {\n vendor: vertexOpenAIManifest.vendor,\n manifest: vertexOpenAIManifest,\n create: () => new VertexOpenAIAdapter(),\n};\n","import {\n BedrockRuntimeClient,\n ConverseStreamCommand,\n} from '@aws-sdk/client-bedrock-runtime';\nimport type {\n BedrockApiKeyAuth,\n BedrockIamAuth,\n ClientOptions,\n FinishReason,\n LlmAdapter,\n LlmEvent,\n Message,\n ModelInfo,\n PromptRequest,\n Tool,\n ToolCallEvent,\n} from '../../types.js';\nimport { assertValidRequest } from '../../validate.js';\nimport { bedrockManifest } from './manifest.js';\n\ntype BedrockAuthSpec = BedrockApiKeyAuth | BedrockIamAuth;\n\n/**\n * Adapter for AWS Bedrock via the Converse API.\n *\n * Bedrock's Converse wire shape diverges from the other adapters:\n * - Messages use `{role, content: [ContentBlock, ...]}` where content is\n * ALWAYS an array. Text blocks are `{text}`; tool-use blocks are\n * `{toolUse: {toolUseId, name, input}}`; tool results are\n * `{toolResult: {toolUseId, content: [{text}]}}` carried on role `user`.\n * - System prompt is `system: [{text}]` at the top level (array).\n * - Tools go in `toolConfig: {tools: [{toolSpec: {name, description,\n * inputSchema: {json}}}]}`.\n * - Conversations must start with a `user` message; adjacent same-role\n * messages are rejected by the service (the library does not validate —\n * the caller is responsible for ordering).\n * - Streaming events are different too:\n * messageStart → (contentBlockStart → contentBlockDelta* →\n * contentBlockStop)* → messageStop → metadata\n * - Auth has two modes: bedrockApiKey (bearer token) or bedrockIam\n * (accessKeyId + secretAccessKey [+ sessionToken]).\n */\nexport class BedrockAdapter implements LlmAdapter<BedrockAuthSpec> {\n readonly vendor = bedrockManifest.vendor;\n readonly acceptedAuth = ['bedrockApiKey', 'bedrockIam'] as const;\n\n private client: BedrockRuntimeClient | undefined;\n\n init(auth: BedrockAuthSpec, client?: ClientOptions): void {\n if (!auth.region) {\n throw new Error('BedrockAdapter: region is required');\n }\n\n const config: Record<string, unknown> = {\n region: auth.region,\n ...(client?.endpoint ? { endpoint: client.endpoint } : {}),\n ...(client?.maxRetries !== undefined ? { maxAttempts: client.maxRetries + 1 } : {}),\n };\n\n if (auth.kind === 'bedrockApiKey') {\n if (!auth.apiKey) {\n throw new Error('BedrockAdapter: apiKey is required for bedrockApiKey auth');\n }\n // Bedrock API key is a bearer token — must be preferred over SigV4 so\n // it wins against ambient credentials (e.g., EC2 instance role).\n config.token = { token: auth.apiKey };\n config.authSchemePreference = ['httpBearerAuth'];\n } else if (auth.kind === 'bedrockIam') {\n if (!auth.accessKeyId || !auth.secretAccessKey) {\n throw new Error('BedrockAdapter: accessKeyId and secretAccessKey required for bedrockIam auth');\n }\n config.credentials = {\n accessKeyId: auth.accessKeyId,\n secretAccessKey: auth.secretAccessKey,\n ...(auth.sessionToken ? { sessionToken: auth.sessionToken } : {}),\n };\n } else {\n throw new Error(\n `BedrockAdapter: unsupported auth kind '${(auth as { kind: string }).kind}'`,\n );\n }\n\n this.client = new BedrockRuntimeClient(config);\n }\n\n async *stream(req: PromptRequest): AsyncIterable<LlmEvent> {\n assertValidRequest(req);\n const client = this.ensureClient();\n\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n const messages = buildWireMessages(req);\n const tools =\n req.tools && req.tools.length > 0 ? { tools: formatTools(req.tools) } : undefined;\n\n const inferenceConfig: Record<string, unknown> = {};\n if (req.maxTokens !== undefined) inferenceConfig.maxTokens = req.maxTokens;\n if (req.temperature !== undefined) inferenceConfig.temperature = req.temperature;\n\n const commandInput: Record<string, unknown> = {\n modelId: req.model,\n messages,\n };\n if (req.system) commandInput.system = [{ text: req.system }];\n if (tools) commandInput.toolConfig = tools;\n if (Object.keys(inferenceConfig).length > 0) {\n commandInput.inferenceConfig = inferenceConfig;\n }\n\n const command = new ConverseStreamCommand(\n commandInput as unknown as ConstructorParameters<typeof ConverseStreamCommand>[0],\n );\n\n let response;\n try {\n response = await client.send(command, { abortSignal: req.signal });\n } catch (err) {\n if (isAbortError(err)) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n throw err;\n }\n\n if (!response.stream) {\n yield { type: 'end', finishReason: 'stop' };\n return;\n }\n\n let currentToolUse: PendingToolUse | null = null;\n const completedToolCalls: Array<{ id: string; name: string; arguments: unknown }> = [];\n let stopReason: string | undefined;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let totalTokens: number | undefined;\n\n try {\n for await (const event of response.stream as AsyncIterable<BedrockStreamEvent>) {\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n if (event.contentBlockStart) {\n const start = event.contentBlockStart.start;\n if (start?.toolUse) {\n currentToolUse = {\n id: start.toolUse.toolUseId ?? '',\n name: start.toolUse.name ?? '',\n inputText: '',\n };\n if (currentToolUse.id && currentToolUse.name) {\n yield {\n type: 'toolCallStart',\n id: currentToolUse.id,\n name: currentToolUse.name,\n };\n }\n }\n } else if (event.contentBlockDelta) {\n const delta = event.contentBlockDelta.delta;\n if (delta?.text) {\n yield { type: 'token', text: delta.text };\n }\n if (delta?.toolUse && currentToolUse && typeof delta.toolUse.input === 'string') {\n currentToolUse.inputText += delta.toolUse.input;\n }\n } else if (event.contentBlockStop) {\n if (currentToolUse && currentToolUse.id && currentToolUse.name) {\n let parsed: unknown = {};\n try {\n parsed = currentToolUse.inputText ? JSON.parse(currentToolUse.inputText) : {};\n } catch {\n parsed = {};\n }\n completedToolCalls.push({\n id: currentToolUse.id,\n name: currentToolUse.name,\n arguments: parsed,\n });\n }\n currentToolUse = null;\n } else if (event.messageStop) {\n stopReason = event.messageStop.stopReason;\n } else if (event.metadata) {\n if (event.metadata.usage) {\n inputTokens = event.metadata.usage.inputTokens;\n outputTokens = event.metadata.usage.outputTokens;\n totalTokens = event.metadata.usage.totalTokens;\n }\n }\n }\n } catch (err) {\n if (isAbortError(err)) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n throw err;\n }\n\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n for (const tc of completedToolCalls) {\n yield {\n type: 'toolCall',\n id: tc.id,\n name: tc.name,\n arguments: tc.arguments,\n };\n }\n\n const finishReason = mapStopReason(stopReason, completedToolCalls.length > 0);\n const usage =\n inputTokens !== undefined || outputTokens !== undefined || totalTokens !== undefined\n ? {\n ...(inputTokens !== undefined ? { inputTokens } : {}),\n ...(outputTokens !== undefined ? { outputTokens } : {}),\n ...(totalTokens !== undefined ? { totalTokens } : {}),\n }\n : undefined;\n\n const endEvent: Extract<LlmEvent, { type: 'end' }> = {\n type: 'end',\n finishReason,\n ...(usage ? { usage } : {}),\n ...(stopReason ? { rawReason: stopReason } : {}),\n };\n yield endEvent;\n }\n\n appendAssistantToolCall(\n history: Message[],\n toolCalls: ReadonlyArray<ToolCallEvent>,\n ): Message[] {\n const wireMessage = {\n role: 'assistant',\n content: toolCalls.map((tc) => ({\n toolUse: {\n toolUseId: tc.id,\n name: tc.name,\n input: tc.arguments ?? {},\n },\n })),\n };\n return [\n ...history,\n {\n role: 'assistant',\n content: '',\n vendorRaw: wireMessage,\n },\n ];\n }\n\n appendToolResult(history: Message[], toolCallId: string, result: unknown): Message[] {\n const text = typeof result === 'string' ? result : JSON.stringify(result);\n const wireMessage = {\n role: 'user',\n content: [\n {\n toolResult: {\n toolUseId: toolCallId,\n content: [{ text }],\n },\n },\n ],\n };\n return [\n ...history,\n {\n role: 'tool',\n content: text,\n vendorRaw: wireMessage,\n },\n ];\n }\n\n async listAvailableModels(): Promise<ModelInfo[]> {\n // The bedrock-runtime client has no /models endpoint; the control-plane\n // @aws-sdk/client-bedrock package does but we don't pull it in. Return the\n // curated manifest set.\n return [...bedrockManifest.knownModels];\n }\n\n async warmup(): Promise<void> {\n // No cheap idempotent warmup. No-op.\n }\n\n private ensureClient(): BedrockRuntimeClient {\n if (!this.client) {\n throw new Error(\n 'BedrockAdapter: init() must be called before stream()/listAvailableModels()',\n );\n }\n return this.client;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internal types\n// ---------------------------------------------------------------------------\n\ninterface PendingToolUse {\n id: string;\n name: string;\n inputText: string;\n}\n\ninterface BedrockStreamEvent {\n messageStart?: { role?: string };\n contentBlockStart?: {\n start?: {\n toolUse?: { toolUseId?: string; name?: string };\n };\n contentBlockIndex?: number;\n };\n contentBlockDelta?: {\n delta?: {\n text?: string;\n toolUse?: { input?: string };\n };\n contentBlockIndex?: number;\n };\n contentBlockStop?: { contentBlockIndex?: number };\n messageStop?: { stopReason?: string };\n metadata?: {\n usage?: { inputTokens?: number; outputTokens?: number; totalTokens?: number };\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildWireMessages(req: PromptRequest): unknown[] {\n const out: unknown[] = [];\n for (const msg of req.messages) {\n if (msg.vendorRaw && typeof msg.vendorRaw === 'object') {\n out.push(msg.vendorRaw);\n continue;\n }\n // Normalize plain-string messages to Converse's content-block array shape.\n const text = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);\n // Bedrock Converse does not accept role:'tool' — tool results must be\n // carried as content blocks on a role:'user' message. Without vendorRaw\n // we fall back to a text block.\n const role = msg.role === 'tool' ? 'user' : msg.role;\n out.push({\n role,\n content: [{ text }],\n });\n }\n return out;\n}\n\nfunction formatTools(tools: Tool[]): Array<Record<string, unknown>> {\n return tools.map((t) => ({\n toolSpec: {\n name: t.name,\n // Bedrock rejects empty-string descriptions; fall back to a single space.\n description: t.description && t.description.length > 0 ? t.description : ' ',\n inputSchema: {\n json: t.parameters ?? { type: 'object', properties: {} },\n },\n },\n }));\n}\n\nfunction mapStopReason(r: string | undefined, hadToolCalls: boolean): FinishReason {\n if (hadToolCalls) return 'tool';\n switch (r) {\n case 'end_turn':\n case 'stop_sequence':\n return 'stop';\n case 'tool_use':\n return 'tool';\n case 'max_tokens':\n return 'length';\n case 'content_filtered':\n case 'guardrail_intervened':\n return 'filtered';\n default:\n return 'stop';\n }\n}\n\nfunction isAbortError(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false;\n const e = err as { name?: string; code?: string; message?: string };\n return (\n e.name === 'AbortError' ||\n e.name === 'APIUserAbortError' ||\n e.code === 'ABORT_ERR' ||\n (typeof e.message === 'string' && /aborted/i.test(e.message))\n );\n}\n","import type { AdapterManifest, ModelInfo } from '../../types.js';\n\n/**\n * Known Bedrock models spanning the main publisher families available via the\n * Converse API. Model ids on Bedrock include a publisher prefix and version\n * suffix (e.g. `anthropic.claude-3-5-sonnet-20241022-v2:0`).\n *\n * Bedrock also supports cross-region inference profile ids (e.g.\n * `us.anthropic.claude-3-5-sonnet-20241022-v2:0`) — users should enter those\n * directly when needed; the adapter passes `model` through unchanged.\n *\n * Ordering matters: the first entry is used as the default probe model by\n * api-server's GET /LlmCredentials/:sid/test when `supportsModelListing` is\n * false. Amazon Nova Micro is first — AWS's own cheapest-per-token model,\n * broadly available across regions, and (unlike third-party Claude/Llama\n * models) not subject to provider-led \"legacy\" lifecycles that can revoke\n * access. Operators can override via `JAMBONZ_LLM_BEDROCK_PROBE_MODEL`.\n *\n * `deprecated: true` signals a model AWS may reject with\n * `ResourceNotFoundException: \"This Model is marked by provider as Legacy\"`\n * on accounts that haven't invoked it in the last 30 days. The id is kept in\n * the manifest so accounts that *have* been using it can still select it;\n * the webapp should badge/sort deprecated entries accordingly.\n *\n * Claude 4.x ids carry the `us.` cross-region inference profile prefix\n * because on-demand invocation of plain `anthropic.claude-*-4-*` ids is no\n * longer available in most regions — Bedrock requires the profile. Operators\n * in EU/APAC should edit to `eu.`/`apac.` or enter a region-specific id.\n */\nconst BEDROCK_KNOWN_MODELS: ModelInfo[] = [\n {\n id: 'amazon.nova-micro-v1:0',\n displayName: 'Amazon Nova Micro',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'amazon.nova-lite-v1:0',\n displayName: 'Amazon Nova Lite',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 300_000,\n },\n },\n {\n id: 'amazon.nova-pro-v1:0',\n displayName: 'Amazon Nova Pro',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 300_000,\n },\n },\n {\n id: 'us.anthropic.claude-haiku-4-5-20251001-v1:0',\n displayName: 'Claude Haiku 4.5 (on Bedrock)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n },\n {\n id: 'us.anthropic.claude-sonnet-4-5-20250929-v1:0',\n displayName: 'Claude Sonnet 4.5 (on Bedrock)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n },\n {\n id: 'anthropic.claude-3-5-haiku-20241022-v1:0',\n displayName: 'Claude 3.5 Haiku (on Bedrock)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n deprecated: true,\n },\n {\n id: 'anthropic.claude-3-5-sonnet-20240620-v1:0',\n displayName: 'Claude 3.5 Sonnet (on Bedrock)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n deprecated: true,\n },\n {\n id: 'anthropic.claude-3-5-sonnet-20241022-v2:0',\n displayName: 'Claude 3.5 Sonnet v2 (on Bedrock)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n deprecated: true,\n },\n {\n id: 'anthropic.claude-3-7-sonnet-20250219-v1:0',\n displayName: 'Claude 3.7 Sonnet (on Bedrock)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n deprecated: true,\n },\n {\n id: 'meta.llama3-3-70b-instruct-v1:0',\n displayName: 'Llama 3.3 70B Instruct (on Bedrock)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'mistral.mistral-large-2407-v1:0',\n displayName: 'Mistral Large (on Bedrock)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n];\n\n// Common Bedrock regions. Not exhaustive — users can enter others via 'Other'\n// or (later) a free-text region field. The library does not validate against\n// this list; it's purely a UI aid.\nconst BEDROCK_REGIONS: Array<{ value: string; label: string }> = [\n { value: 'us-east-1', label: 'us-east-1 (N. Virginia)' },\n { value: 'us-east-2', label: 'us-east-2 (Ohio)' },\n { value: 'us-west-2', label: 'us-west-2 (Oregon)' },\n { value: 'eu-west-1', label: 'eu-west-1 (Ireland)' },\n { value: 'eu-west-3', label: 'eu-west-3 (Paris)' },\n { value: 'eu-central-1', label: 'eu-central-1 (Frankfurt)' },\n { value: 'ap-northeast-1', label: 'ap-northeast-1 (Tokyo)' },\n { value: 'ap-south-1', label: 'ap-south-1 (Mumbai)' },\n { value: 'ap-southeast-1', label: 'ap-southeast-1 (Singapore)' },\n { value: 'ap-southeast-2', label: 'ap-southeast-2 (Sydney)' },\n { value: 'ca-central-1', label: 'ca-central-1 (Canada)' },\n];\n\nexport const bedrockManifest: AdapterManifest = {\n vendor: 'bedrock',\n displayName: 'AWS Bedrock',\n authKinds: [\n {\n kind: 'bedrockApiKey',\n displayName: 'API Key',\n fields: [\n {\n name: 'apiKey',\n label: 'API Key',\n type: 'password',\n required: true,\n help: 'Bedrock API key (bearer token). Create one in the AWS console under Amazon Bedrock → API keys.',\n },\n {\n name: 'region',\n label: 'Region',\n type: 'select',\n required: true,\n default: 'us-east-1',\n options: BEDROCK_REGIONS,\n },\n ],\n },\n {\n kind: 'bedrockIam',\n displayName: 'IAM Credentials',\n fields: [\n {\n name: 'accessKeyId',\n label: 'Access Key ID',\n type: 'text',\n required: true,\n },\n {\n name: 'secretAccessKey',\n label: 'Secret Access Key',\n type: 'password',\n required: true,\n },\n {\n name: 'sessionToken',\n label: 'Session Token',\n type: 'password',\n required: false,\n help: 'Only required when using temporary credentials (e.g., STS).',\n },\n {\n name: 'region',\n label: 'Region',\n type: 'select',\n required: true,\n default: 'us-east-1',\n options: BEDROCK_REGIONS,\n },\n ],\n },\n ],\n knownModels: BEDROCK_KNOWN_MODELS,\n // The Bedrock runtime client does not expose a `/models` listing — model\n // enumeration lives in `@aws-sdk/client-bedrock` (control plane), which we\n // don't pull in. Return the curated set from the manifest.\n supportsModelListing: false,\n docsUrl: 'https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html',\n};\n","import type {\n AdapterFactory,\n BedrockApiKeyAuth,\n BedrockIamAuth,\n} from '../../types.js';\nimport { BedrockAdapter } from './adapter.js';\nimport { bedrockManifest } from './manifest.js';\n\nexport const bedrockFactory: AdapterFactory<BedrockApiKeyAuth | BedrockIamAuth> = {\n vendor: bedrockManifest.vendor,\n manifest: bedrockManifest,\n create: () => new BedrockAdapter(),\n};\n","/**\n * Central adapter registration.\n *\n * Each bundled vendor adapter is registered here at import time. When a new\n * vendor adapter is added under `src/adapters/<vendor>/`, add a single line\n * below to register its factory.\n *\n * The `_template` directory is intentionally NOT registered — it's a scaffold\n * for contributors to copy, not a live adapter.\n */\n\nimport { registerAdapter } from '../registry.js';\nimport { openAIFactory, deepseekFactory } from './openai/index.js';\nimport { anthropicFactory } from './anthropic/index.js';\nimport { googleFactory } from './google/index.js';\nimport { vertexGeminiFactory } from './vertex-gemini/index.js';\nimport { vertexOpenAIFactory } from './vertex-openai/index.js';\nimport { bedrockFactory } from './bedrock/index.js';\n\nregisterAdapter(openAIFactory);\nregisterAdapter(deepseekFactory);\nregisterAdapter(anthropicFactory);\nregisterAdapter(googleFactory);\nregisterAdapter(vertexGeminiFactory);\nregisterAdapter(vertexOpenAIFactory);\nregisterAdapter(bedrockFactory);\n","import type {\n AuthSpec,\n BedrockApiKeyAuth,\n BedrockIamAuth,\n GoogleApiKeyAuth,\n GoogleServiceAccountAuth,\n ServiceAccountJson,\n VertexServiceAccountAuth,\n} from './types.js';\n\n/**\n * The loose \"DB-shape\" input accepted by `normalizeAuth`.\n *\n * This is the shape produced by jambonz's api-server after decryption, and by\n * feature-server's `credential-mapper.js`. Snake-case is used to match the\n * legacy wire shape; the helper converts to the `AuthSpec` discriminated union.\n *\n * External callers that construct `AuthSpec` directly can skip this helper entirely.\n */\nexport interface RawCredential {\n api_key?: string | null;\n /** Either a JSON string or a parsed object. */\n service_key?: string | ServiceAccountJson | null;\n access_key_id?: string | null;\n secret_access_key?: string | null;\n session_token?: string | null;\n region?: string | null;\n api_url?: string | null;\n project_id?: string | null;\n location?: string | null;\n}\n\n/**\n * Convert a vendor + raw credential into an `AuthSpec` discriminated union member.\n *\n * Supported vendors: openai, deepseek, anthropic, google, vertex (alias for\n * vertex-gemini + vertex-openai — both accept the same auth shape), vertex-gemini,\n * vertex-openai, bedrock.\n *\n * Throws with a clear message if the raw credential is missing required fields.\n */\nexport function normalizeAuth(vendor: string, raw: RawCredential): AuthSpec {\n switch (vendor) {\n case 'openai':\n case 'anthropic':\n return requireApiKey(vendor, raw);\n\n case 'deepseek':\n return {\n ...requireApiKey(vendor, raw),\n baseURL: raw.api_url ?? 'https://api.deepseek.com/v1',\n };\n\n case 'google':\n return normalizeGoogle(raw);\n\n case 'vertex':\n case 'vertex-gemini':\n case 'vertex-openai':\n return normalizeVertex(vendor, raw);\n\n case 'bedrock':\n return normalizeBedrock(raw);\n\n default:\n throw new Error(\n `normalizeAuth: unknown vendor '${vendor}'. ` +\n `If this is a custom adapter, construct the AuthSpec directly.`,\n );\n }\n}\n\nfunction requireApiKey(vendor: string, raw: RawCredential) {\n if (!raw.api_key) {\n throw new Error(`normalizeAuth: vendor '${vendor}' requires 'api_key'`);\n }\n const result: { kind: 'apiKey'; apiKey: string; baseURL?: string } = {\n kind: 'apiKey',\n apiKey: raw.api_key,\n };\n if (raw.api_url) {\n result.baseURL = raw.api_url;\n }\n return result;\n}\n\nfunction normalizeGoogle(raw: RawCredential): GoogleApiKeyAuth | GoogleServiceAccountAuth {\n if (raw.service_key) {\n return {\n kind: 'googleServiceAccount',\n credentials: parseServiceKey(raw.service_key),\n };\n }\n if (raw.api_key) {\n return { kind: 'googleApiKey', apiKey: raw.api_key };\n }\n throw new Error(`normalizeAuth: vendor 'google' requires either 'api_key' or 'service_key'`);\n}\n\nfunction normalizeVertex(vendor: string, raw: RawCredential): VertexServiceAccountAuth {\n if (!raw.service_key) {\n throw new Error(`normalizeAuth: vendor '${vendor}' requires 'service_key'`);\n }\n if (!raw.location) {\n throw new Error(`normalizeAuth: vendor '${vendor}' requires 'location'`);\n }\n const credentials = parseServiceKey(raw.service_key);\n const projectId = raw.project_id ?? credentials.project_id;\n if (!projectId) {\n throw new Error(\n `normalizeAuth: vendor '${vendor}' requires 'project_id' (not present ` +\n `in raw credential or service_key.project_id)`,\n );\n }\n return {\n kind: 'vertexServiceAccount',\n credentials,\n projectId,\n location: raw.location,\n };\n}\n\nfunction normalizeBedrock(raw: RawCredential): BedrockIamAuth | BedrockApiKeyAuth {\n if (!raw.region) {\n throw new Error(`normalizeAuth: vendor 'bedrock' requires 'region'`);\n }\n if (raw.access_key_id && raw.secret_access_key) {\n const result: BedrockIamAuth = {\n kind: 'bedrockIam',\n accessKeyId: raw.access_key_id,\n secretAccessKey: raw.secret_access_key,\n region: raw.region,\n };\n if (raw.session_token) {\n result.sessionToken = raw.session_token;\n }\n return result;\n }\n if (raw.api_key) {\n return {\n kind: 'bedrockApiKey',\n apiKey: raw.api_key,\n region: raw.region,\n };\n }\n throw new Error(\n `normalizeAuth: vendor 'bedrock' requires either (access_key_id + secret_access_key) or api_key`,\n );\n}\n\nfunction parseServiceKey(value: string | ServiceAccountJson): ServiceAccountJson {\n if (typeof value === 'string') {\n try {\n return JSON.parse(value) as ServiceAccountJson;\n } catch {\n throw new Error(`normalizeAuth: 'service_key' is not valid JSON`);\n }\n }\n return value;\n}\n"],"mappings":"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","names":["OpenAI","Anthropic","buildWireMessages","formatTools","isAbortError","formatTools","isAbortError","usage","mapFinishReason","import_genai","import_openai","OpenAI","buildWireMessages","formatTools","isAbortError","mapStopReason"]}
|