@jambonz/llm 0.2.6 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/index.cjs +39 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +42 -2
- package/dist/index.js.map +1 -1
- package/dist/test-kit/index.cjs +47 -2
- package/dist/test-kit/index.cjs.map +1 -1
- package/dist/test-kit/index.d.cts +2 -1
- package/dist/test-kit/index.d.ts +2 -1
- package/dist/test-kit/index.js +50 -2
- package/dist/test-kit/index.js.map +1 -1
- package/dist/{types-bq1XMi_T.d.cts → types-4d2QrlAe.d.cts} +22 -0
- package/dist/{types-bq1XMi_T.d.ts → types-4d2QrlAe.d.ts} +22 -0
- package/package.json +3 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/test-kit/runner.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/index.ts","../../src/test-kit/fake-adapter.ts"],"sourcesContent":["import { afterEach, beforeEach, describe, expect, it } from 'vitest';\nimport {\n _resetRegistryForTests,\n registerAdapter,\n} from '../registry.js';\nimport { createLlm } from '../index.js';\nimport type {\n FinishReason,\n LlmAdapter,\n LlmEvent,\n Message,\n PromptRequest,\n} from '../types.js';\nimport type { ContractHarness } from './types.js';\n\nconst VALID_FINISH_REASONS: ReadonlyArray<FinishReason> = [\n 'stop',\n 'tool',\n 'length',\n 'filtered',\n 'error',\n 'aborted',\n];\n\nconst VALID_FORM_FIELD_TYPES = ['text', 'password', 'url', 'json-file', 'select'];\n\n/**\n * Run the 20 contract checks against a vendor adapter via its harness.\n *\n * Call at the top level of a test file; registers vitest `describe`/`it` blocks\n * that exercise every aspect of the adapter contract. Adapters that pass this\n * suite are merge-ready for the library.\n *\n * The suite registers the harness's factory in the library registry for the\n * duration of the run; existing registrations are preserved after cleanup.\n */\nexport function runContractTests(harness: ContractHarness): void {\n describe(`contract: ${harness.vendor}`, () => {\n beforeEach(() => {\n _resetRegistryForTests();\n registerAdapter(harness.factory);\n });\n\n afterEach(async () => {\n await harness.cleanup();\n _resetRegistryForTests();\n });\n\n // -----------------------------------------------------------------------\n // Structural checks — no vendor mocking required.\n // -----------------------------------------------------------------------\n\n it('[1] manifest is well-formed', () => {\n const m = harness.factory.manifest;\n expect(m.vendor).toMatch(/^[a-z][a-z0-9-]*$/);\n expect(m.displayName.length).toBeGreaterThan(0);\n expect(m.authKinds.length).toBeGreaterThan(0);\n for (const ak of m.authKinds) {\n expect(ak.displayName.length).toBeGreaterThan(0);\n for (const field of ak.fields) {\n expect(field.name.length).toBeGreaterThan(0);\n expect(field.label.length).toBeGreaterThan(0);\n expect(VALID_FORM_FIELD_TYPES).toContain(field.type);\n if (field.type === 'select') {\n expect(field.options?.length ?? 0).toBeGreaterThan(0);\n }\n }\n }\n expect(m.knownModels.length).toBeGreaterThan(0);\n for (const model of m.knownModels) {\n expect(model.id.length).toBeGreaterThan(0);\n expect(typeof model.capabilities.streaming).toBe('boolean');\n expect(typeof model.capabilities.tools).toBe('boolean');\n expect(typeof model.capabilities.vision).toBe('boolean');\n expect(typeof model.capabilities.systemPrompt).toBe('boolean');\n }\n expect(typeof m.supportsModelListing).toBe('boolean');\n });\n\n it('[2] createLlm returns an adapter with matching vendor id', async () => {\n const firstKind = harness.factory.manifest.authKinds[0]!.kind;\n const adapter = await createLlm({\n vendor: harness.vendor,\n auth: harness.authFor(firstKind),\n });\n expect(adapter.vendor).toBe(harness.vendor);\n });\n\n it('[3] init() accepts each declared auth kind', async () => {\n for (const ak of harness.factory.manifest.authKinds) {\n await expect(\n createLlm({ vendor: harness.vendor, auth: harness.authFor(ak.kind) }),\n ).resolves.toBeDefined();\n }\n });\n\n if (harness.unsupportedAuth) {\n it('[4] init() rejects an unsupported auth kind', async () => {\n await expect(\n createLlm({\n vendor: harness.vendor,\n auth: harness.unsupportedAuth!,\n }),\n ).rejects.toThrow();\n });\n }\n\n it('[18] empty messages array is rejected with a clear error', async () => {\n const adapter = await init(harness);\n await expect(\n drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: [],\n }),\n ).rejects.toThrowError(/messages/i);\n });\n\n // -----------------------------------------------------------------------\n // Behavioral checks — require vendor mocking via the harness.\n // -----------------------------------------------------------------------\n\n it('[5,6,7] stream emits exactly one end event, as the last event, with a valid finishReason', async () => {\n await harness.mockScenario('simple-stream');\n const adapter = await init(harness);\n const events = await drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: [{ role: 'user', content: 'hello' }],\n });\n const endIndexes = events\n .map((e, i) => (e.type === 'end' ? i : -1))\n .filter((i) => i >= 0);\n expect(endIndexes).toHaveLength(1);\n expect(endIndexes[0]).toBe(events.length - 1);\n const end = events[events.length - 1] as Extract<LlmEvent, { type: 'end' }>;\n expect(VALID_FINISH_REASONS).toContain(end.finishReason);\n });\n\n it('[8] tokens stream incrementally (at least two chunks)', async () => {\n await harness.mockScenario('simple-stream');\n const adapter = await init(harness);\n const events = await drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: [{ role: 'user', content: 'hello' }],\n });\n const tokens = events.filter((e) => e.type === 'token');\n expect(tokens.length).toBeGreaterThanOrEqual(2);\n });\n\n it('[9] pre-fired AbortSignal yields end(aborted) within 500ms', async () => {\n await harness.mockScenario('simple-stream');\n const adapter = await init(harness);\n const controller = new AbortController();\n controller.abort();\n const start = Date.now();\n const events = await drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: [{ role: 'user', content: 'hello' }],\n signal: controller.signal,\n });\n const elapsed = Date.now() - start;\n expect(elapsed).toBeLessThan(500);\n const end = events[events.length - 1] as Extract<LlmEvent, { type: 'end' }>;\n expect(end.type).toBe('end');\n expect(end.finishReason).toBe('aborted');\n // No token events should precede the end event when the abort was pre-fired.\n expect(events.filter((e) => e.type === 'token').length).toBe(0);\n });\n\n it('[10] mid-stream abort prevents any pending toolCall from firing', async () => {\n await harness.mockScenario('long-stream-with-pending-tool');\n const adapter = await init(harness);\n const controller = new AbortController();\n const events: LlmEvent[] = [];\n // Abort after the first token arrives.\n let aborted = false;\n for await (const evt of adapter.stream({\n model: harness.toolCapableModel,\n messages: [{ role: 'user', content: 'go' }],\n signal: controller.signal,\n })) {\n events.push(evt);\n if (!aborted && evt.type === 'token') {\n controller.abort();\n aborted = true;\n }\n }\n const end = events[events.length - 1] as Extract<LlmEvent, { type: 'end' }>;\n expect(end.type).toBe('end');\n expect(end.finishReason).toBe('aborted');\n expect(events.filter((e) => e.type === 'toolCall')).toHaveLength(0);\n });\n\n it('[11] tool-capable request yields a well-formed toolCall event', async () => {\n await harness.mockScenario('tool-call');\n const adapter = await init(harness);\n const events = await drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: [{ role: 'user', content: 'call the tool' }],\n tools: [\n {\n name: 'test_tool',\n description: 'A test tool',\n parameters: { type: 'object', properties: {} },\n },\n ],\n });\n const toolCalls = events.filter(\n (e): e is Extract<LlmEvent, { type: 'toolCall' }> => e.type === 'toolCall',\n );\n expect(toolCalls.length).toBeGreaterThanOrEqual(1);\n const tc = toolCalls[0]!;\n expect(typeof tc.id).toBe('string');\n expect(tc.id.length).toBeGreaterThan(0);\n expect(typeof tc.name).toBe('string');\n expect(tc.name.length).toBeGreaterThan(0);\n expect(tc.arguments).toBeDefined();\n });\n\n if (harness.emitsToolCallStart) {\n it('[12] every toolCallStart precedes its matching toolCall with the same id', async () => {\n await harness.mockScenario('tool-call-after-tokens');\n const adapter = await init(harness);\n const events = await drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: [{ role: 'user', content: 'hi' }],\n tools: [\n {\n name: 'test_tool',\n description: 'A test tool',\n parameters: { type: 'object', properties: {} },\n },\n ],\n });\n const startIndexById = new Map<string, number>();\n for (let i = 0; i < events.length; i++) {\n const evt = events[i]!;\n if (evt.type === 'toolCallStart') {\n startIndexById.set(evt.id, i);\n } else if (evt.type === 'toolCall') {\n const startIndex = startIndexById.get(evt.id);\n expect(startIndex, `missing toolCallStart for id ${evt.id}`).toBeDefined();\n expect(startIndex!).toBeLessThan(i);\n }\n }\n });\n }\n\n it('[13] appendToolResult produces a history that re-streams without throwing', async () => {\n await harness.mockScenario('tool-call');\n const adapter = await init(harness);\n const events = await drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: [{ role: 'user', content: 'call it' }],\n tools: [\n { name: 'test_tool', description: 'x', parameters: { type: 'object' } },\n ],\n });\n const tc = events.find(\n (e): e is Extract<LlmEvent, { type: 'toolCall' }> => e.type === 'toolCall',\n );\n expect(tc).toBeDefined();\n const baseHistory: Message[] = [{ role: 'user', content: 'call it' }];\n const afterAssistant = adapter.appendAssistantToolCall(baseHistory, [tc!]);\n expect(afterAssistant.length).toBe(baseHistory.length + 1);\n const withResult = adapter.appendToolResult(afterAssistant, tc!.id, { ok: true });\n expect(withResult.length).toBe(afterAssistant.length + 1);\n // Re-submit — must not throw.\n await harness.mockScenario('simple-stream');\n await expect(\n drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: withResult,\n }),\n ).resolves.toBeDefined();\n });\n\n it('[14] appendToolResult is deterministic for the same inputs', async () => {\n const adapter = await init(harness);\n const history: Message[] = [{ role: 'user', content: 'hi' }];\n const a = adapter.appendToolResult(history, 'tc_1', { a: 1 });\n const b = adapter.appendToolResult(history, 'tc_1', { a: 1 });\n expect(JSON.stringify(a)).toBe(JSON.stringify(b));\n });\n\n it('[15] listAvailableModels returns a non-empty list', async () => {\n await harness.mockScenario('list-models');\n const adapter = await init(harness);\n const models = await adapter.listAvailableModels();\n expect(models.length).toBeGreaterThan(0);\n for (const m of models) {\n expect(m.id.length).toBeGreaterThan(0);\n expect(typeof m.capabilities.tools).toBe('boolean');\n }\n });\n\n if (harness.nonToolCapableModel) {\n it('[16] non-tool-capable model with tools declared either fails fast or runs without tool calls', async () => {\n await harness.mockScenario('simple-stream');\n const adapter = await init(harness);\n const run = async () =>\n drainStream(adapter, {\n model: harness.nonToolCapableModel!,\n messages: [{ role: 'user', content: 'hi' }],\n tools: [\n { name: 'test_tool', description: 'x', parameters: { type: 'object' } },\n ],\n });\n try {\n const events = await run();\n // Allowed: ran to completion but emitted no tool calls.\n expect(events.filter((e) => e.type === 'toolCall')).toHaveLength(0);\n const end = events[events.length - 1] as Extract<LlmEvent, { type: 'end' }>;\n expect(end.finishReason).not.toBe('error');\n } catch (err) {\n // Also allowed: fails fast with a clear error.\n expect(err).toBeInstanceOf(Error);\n }\n });\n }\n\n it('[17] system prompt is present in the upstream request', async () => {\n await harness.mockScenario('simple-stream');\n const adapter = await init(harness);\n await drainStream(adapter, {\n model: harness.toolCapableModel,\n system: 'You are a test agent.',\n messages: [{ role: 'user', content: 'hi' }],\n });\n const captured = harness.getCapturedRequest();\n expect(captured).not.toBeNull();\n expect(captured!.system).toBe('You are a test agent.');\n });\n\n it('[19] multi-turn conversation is preserved in the upstream request', async () => {\n await harness.mockScenario('simple-stream');\n const adapter = await init(harness);\n const messages: Message[] = [\n { role: 'user', content: 'first' },\n { role: 'assistant', content: 'one' },\n { role: 'user', content: 'second' },\n { role: 'assistant', content: 'two' },\n { role: 'user', content: 'third' },\n ];\n await drainStream(adapter, { model: harness.toolCapableModel, messages });\n const captured = harness.getCapturedRequest();\n expect(captured).not.toBeNull();\n expect(captured!.messageCount).toBe(messages.length);\n });\n\n it('[20] vendorRaw on an assistant message round-trips through the next request', async () => {\n await harness.mockScenario('tool-call');\n const adapter = await init(harness);\n const first = await drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: [{ role: 'user', content: 'go' }],\n tools: [\n { name: 'test_tool', description: 'x', parameters: { type: 'object' } },\n ],\n });\n const tc = first.find(\n (e): e is Extract<LlmEvent, { type: 'toolCall' }> => e.type === 'toolCall',\n );\n expect(tc).toBeDefined();\n\n const afterAssistant = adapter.appendAssistantToolCall(\n [{ role: 'user', content: 'go' }],\n [tc!],\n );\n const withResult = adapter.appendToolResult(afterAssistant, tc!.id, { ok: true });\n\n await harness.mockScenario('simple-stream');\n await drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: withResult,\n });\n const captured = harness.getCapturedRequest();\n expect(captured).not.toBeNull();\n expect(captured!.vendorRawHonored).toBe(true);\n });\n\n it('[21] appendAssistantToolCall output + appendToolResult re-stream preserves tool-call id on wire', async () => {\n await harness.mockScenario('tool-call');\n const adapter = await init(harness);\n const first = await drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: [{ role: 'user', content: 'go' }],\n tools: [\n { name: 'test_tool', description: 'x', parameters: { type: 'object' } },\n ],\n });\n const tc = first.find(\n (e): e is Extract<LlmEvent, { type: 'toolCall' }> => e.type === 'toolCall',\n );\n expect(tc).toBeDefined();\n\n const history = adapter.appendAssistantToolCall(\n [{ role: 'user', content: 'go' }],\n [tc!],\n );\n // The appended message must carry vendorRaw in a shape the same adapter\n // accepts back on stream(). If vendorRaw is undefined, the adapter would\n // have to reconstruct from role/content only — which is the regression\n // this check catches.\n const appended = history[history.length - 1]!;\n expect(appended.role).toBe('assistant');\n expect(appended.vendorRaw).toBeDefined();\n });\n });\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nasync function init(harness: ContractHarness): Promise<LlmAdapter> {\n const kind = harness.factory.manifest.authKinds[0]!.kind;\n return createLlm({ vendor: harness.vendor, auth: harness.authFor(kind) });\n}\n\nasync function drainStream(adapter: LlmAdapter, req: PromptRequest): Promise<LlmEvent[]> {\n const events: LlmEvent[] = [];\n for await (const evt of adapter.stream(req)) {\n events.push(evt);\n }\n return events;\n}\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","/**\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 {\n AdapterFactory,\n AdapterManifest,\n ApiKeyAuth,\n AuthKind,\n AuthSpec,\n ClientOptions,\n LlmAdapter,\n LlmEvent,\n Message,\n ModelInfo,\n PromptRequest,\n ToolCallEvent,\n} from '../types.js';\nimport { assertValidRequest } from '../validate.js';\nimport type { CapturedRequest, ContractHarness, ContractScenario } from './types.js';\n\n/**\n * Shared mutable state between the harness and the fake adapter instance.\n * The harness writes to it (via mockScenario/cleanup), the adapter reads it\n * during stream() / listAvailableModels() to decide what to produce.\n */\ninterface FakeState {\n scenario: ContractScenario | null;\n captured: CapturedRequest | null;\n}\n\n/**\n * Reference fake adapter used by the test-kit to verify itself.\n *\n * Produces canned events for each `ContractScenario`. Does not talk to any\n * real vendor. Used by `test/test-kit/self-check.test.ts` to prove that a\n * correctly-behaving adapter passes all 20 contract checks.\n *\n * Anybody implementing a real adapter can read this as a minimal reference —\n * it shows exactly what the library expects on the wire.\n */\nexport class FakeAdapter implements LlmAdapter<ApiKeyAuth> {\n readonly vendor = fakeManifest.vendor;\n readonly acceptedAuth = ['apiKey'] as const;\n private initialized = false;\n\n constructor(private readonly state: FakeState) {}\n\n init(auth: ApiKeyAuth, _client?: ClientOptions): void {\n if (auth.kind !== 'apiKey') {\n throw new Error(`FakeAdapter: unsupported auth kind '${(auth as AuthSpec).kind}'`);\n }\n if (!auth.apiKey) {\n throw new Error('FakeAdapter: apiKey is required');\n }\n this.initialized = true;\n }\n\n async *stream(req: PromptRequest): AsyncIterable<LlmEvent> {\n this.ensureInitialized();\n assertValidRequest(req);\n this.capture(req);\n\n const scenario = this.state.scenario ?? 'simple-stream';\n\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n switch (scenario) {\n case 'simple-stream':\n yield* simpleStream(req.signal);\n return;\n case 'tool-call':\n yield* toolCallOnly(req.signal);\n return;\n case 'tool-call-after-tokens':\n yield* toolCallAfterTokens(req.signal);\n return;\n case 'long-stream':\n yield* longStream(req.signal);\n return;\n case 'long-stream-with-pending-tool':\n yield* longStreamWithPendingTool(req.signal);\n return;\n case 'list-models':\n // listAvailableModels handles this — stream just behaves like simple.\n yield* simpleStream(req.signal);\n return;\n default:\n throw new Error(`FakeAdapter: unknown scenario '${scenario}'`);\n }\n }\n\n appendAssistantToolCall(\n history: Message[],\n toolCalls: ReadonlyArray<ToolCallEvent>,\n ): Message[] {\n return [\n ...history,\n {\n role: 'assistant',\n content: '',\n vendorRaw: {\n role: 'assistant',\n toolCalls: toolCalls.map((tc) => ({\n id: tc.id,\n name: tc.name,\n arguments: tc.arguments,\n })),\n },\n },\n ];\n }\n\n appendToolResult(history: Message[], toolCallId: string, result: unknown): Message[] {\n const content = typeof result === 'string' ? result : JSON.stringify(result);\n return [\n ...history,\n {\n role: 'tool',\n content,\n vendorRaw: { tool_call_id: toolCallId },\n },\n ];\n }\n\n async listAvailableModels(): Promise<ModelInfo[]> {\n this.ensureInitialized();\n return fakeManifest.knownModels;\n }\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new Error('FakeAdapter: init() must be called before stream()/listAvailableModels()');\n }\n }\n\n private capture(req: PromptRequest): void {\n this.state.captured = {\n messageCount: req.messages.length,\n vendorRawHonored: req.messages.some((m) => m.vendorRaw !== undefined),\n ...(req.system !== undefined ? { system: req.system } : {}),\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Scenario generators\n// ---------------------------------------------------------------------------\n\nasync function* simpleStream(signal: AbortSignal | undefined): AsyncIterable<LlmEvent> {\n const chunks = ['Hello', ', ', 'world', '!'];\n for (const text of chunks) {\n if (signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n yield { type: 'token', text };\n }\n yield { type: 'end', finishReason: 'stop', usage: { inputTokens: 5, outputTokens: 4 } };\n}\n\nasync function* toolCallOnly(signal: AbortSignal | undefined): AsyncIterable<LlmEvent> {\n if (signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n yield { type: 'toolCallStart', id: 'call_fake_1', name: 'test_tool' };\n yield {\n type: 'toolCall',\n id: 'call_fake_1',\n name: 'test_tool',\n arguments: { foo: 'bar' },\n };\n yield { type: 'end', finishReason: 'tool' };\n}\n\nasync function* toolCallAfterTokens(signal: AbortSignal | undefined): AsyncIterable<LlmEvent> {\n const tokens = ['Let ', 'me ', 'check'];\n for (const text of tokens) {\n if (signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n yield { type: 'token', text };\n }\n if (signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n yield { type: 'toolCallStart', id: 'call_fake_2', name: 'test_tool' };\n yield {\n type: 'toolCall',\n id: 'call_fake_2',\n name: 'test_tool',\n arguments: { q: 'hello' },\n };\n yield { type: 'end', finishReason: 'tool' };\n}\n\nasync function* longStream(signal: AbortSignal | undefined): AsyncIterable<LlmEvent> {\n for (let i = 0; i < 12; i++) {\n if (signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n yield { type: 'token', text: `chunk-${i} ` };\n await sleep(20);\n }\n yield { type: 'end', finishReason: 'stop' };\n}\n\nasync function* longStreamWithPendingTool(\n signal: AbortSignal | undefined,\n): AsyncIterable<LlmEvent> {\n for (let i = 0; i < 5; i++) {\n if (signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n yield { type: 'token', text: `chunk-${i} ` };\n await sleep(25);\n }\n // Would emit a tool call next, but check abort first — on abort, the tool\n // call is NOT emitted. That's the contract check 10 verifies.\n if (signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n yield { type: 'toolCallStart', id: 'call_fake_3', name: 'test_tool' };\n yield {\n type: 'toolCall',\n id: 'call_fake_3',\n name: 'test_tool',\n arguments: { q: 'never-reached' },\n };\n yield { type: 'end', finishReason: 'tool' };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// ---------------------------------------------------------------------------\n// Manifest\n// ---------------------------------------------------------------------------\n\nexport const fakeManifest: AdapterManifest = {\n vendor: 'fake',\n displayName: 'Fake (test-kit reference)',\n authKinds: [\n {\n kind: 'apiKey',\n displayName: 'API Key',\n fields: [\n { name: 'apiKey', label: 'API Key', type: 'password', required: true },\n ],\n },\n ],\n knownModels: [\n {\n id: 'fake-tool-model',\n displayName: 'Fake Tool-Capable Model',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 8_000,\n },\n },\n {\n id: 'fake-plain-model',\n displayName: 'Fake Plain Model (no tools)',\n capabilities: {\n streaming: true,\n tools: false,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 4_000,\n },\n },\n ],\n supportsModelListing: true,\n};\n\n// ---------------------------------------------------------------------------\n// Factory + harness builder\n// ---------------------------------------------------------------------------\n\nexport interface FakeHarness extends ContractHarness {\n /** Expose the factory so callers can register if needed. */\n factory: AdapterFactory;\n}\n\n/**\n * Build a ContractHarness for the fake adapter. Used by the kit's self-check\n * test. External contributors don't use this — they build their own harness\n * against their adapter.\n */\nexport function createFakeHarness(): FakeHarness {\n const state: FakeState = { scenario: null, captured: null };\n\n const factory: AdapterFactory<ApiKeyAuth> = {\n vendor: fakeManifest.vendor,\n manifest: fakeManifest,\n create: () => new FakeAdapter(state),\n };\n\n return {\n vendor: fakeManifest.vendor,\n factory,\n authFor: (kind: AuthKind): AuthSpec => {\n if (kind === 'apiKey') return { kind: 'apiKey', apiKey: 'sk-fake' };\n throw new Error(`FakeHarness: asked for unsupported authFor kind '${kind}'`);\n },\n unsupportedAuth: {\n kind: 'bedrockIam',\n accessKeyId: 'x',\n secretAccessKey: 'y',\n region: 'us-east-1',\n },\n mockScenario(scenario) {\n state.scenario = scenario;\n state.captured = null;\n },\n cleanup() {\n state.scenario = null;\n state.captured = null;\n },\n getCapturedRequest() {\n return state.captured;\n },\n toolCapableModel: 'fake-tool-model',\n nonToolCapableModel: 'fake-plain-model',\n emitsToolCallStart: true,\n };\n}\n"],"mappings":"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","names":["buildWireMessages","formatTools","isAbortError","formatTools","isAbortError","usage","mapFinishReason","GoogleGenAI","GoogleGenAI","OpenAI","init","OpenAI","buildWireMessages","formatTools","isAbortError","mapStopReason"]}
|
|
1
|
+
{"version":3,"sources":["../../src/test-kit/runner.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/index.ts","../../src/test-kit/fake-adapter.ts"],"sourcesContent":["import { afterEach, beforeEach, describe, expect, it } from 'vitest';\nimport {\n _resetRegistryForTests,\n registerAdapter,\n} from '../registry.js';\nimport { createLlm } from '../index.js';\nimport type {\n FinishReason,\n LlmAdapter,\n LlmEvent,\n Message,\n PromptRequest,\n} from '../types.js';\nimport type { ContractHarness } from './types.js';\n\nconst VALID_FINISH_REASONS: ReadonlyArray<FinishReason> = [\n 'stop',\n 'tool',\n 'length',\n 'filtered',\n 'error',\n 'aborted',\n];\n\nconst VALID_FORM_FIELD_TYPES = ['text', 'password', 'url', 'json-file', 'select'];\n\n/**\n * Run the 20 contract checks against a vendor adapter via its harness.\n *\n * Call at the top level of a test file; registers vitest `describe`/`it` blocks\n * that exercise every aspect of the adapter contract. Adapters that pass this\n * suite are merge-ready for the library.\n *\n * The suite registers the harness's factory in the library registry for the\n * duration of the run; existing registrations are preserved after cleanup.\n */\nexport function runContractTests(harness: ContractHarness): void {\n describe(`contract: ${harness.vendor}`, () => {\n beforeEach(() => {\n _resetRegistryForTests();\n registerAdapter(harness.factory);\n });\n\n afterEach(async () => {\n await harness.cleanup();\n _resetRegistryForTests();\n });\n\n // -----------------------------------------------------------------------\n // Structural checks — no vendor mocking required.\n // -----------------------------------------------------------------------\n\n it('[1] manifest is well-formed', () => {\n const m = harness.factory.manifest;\n expect(m.vendor).toMatch(/^[a-z][a-z0-9-]*$/);\n expect(m.displayName.length).toBeGreaterThan(0);\n expect(m.authKinds.length).toBeGreaterThan(0);\n for (const ak of m.authKinds) {\n expect(ak.displayName.length).toBeGreaterThan(0);\n for (const field of ak.fields) {\n expect(field.name.length).toBeGreaterThan(0);\n expect(field.label.length).toBeGreaterThan(0);\n expect(VALID_FORM_FIELD_TYPES).toContain(field.type);\n if (field.type === 'select') {\n expect(field.options?.length ?? 0).toBeGreaterThan(0);\n }\n }\n }\n expect(m.knownModels.length).toBeGreaterThan(0);\n for (const model of m.knownModels) {\n expect(model.id.length).toBeGreaterThan(0);\n expect(typeof model.capabilities.streaming).toBe('boolean');\n expect(typeof model.capabilities.tools).toBe('boolean');\n expect(typeof model.capabilities.vision).toBe('boolean');\n expect(typeof model.capabilities.systemPrompt).toBe('boolean');\n }\n expect(typeof m.supportsModelListing).toBe('boolean');\n });\n\n it('[2] createLlm returns an adapter with matching vendor id', async () => {\n const firstKind = harness.factory.manifest.authKinds[0]!.kind;\n const adapter = await createLlm({\n vendor: harness.vendor,\n auth: harness.authFor(firstKind),\n });\n expect(adapter.vendor).toBe(harness.vendor);\n });\n\n it('[3] init() accepts each declared auth kind', async () => {\n for (const ak of harness.factory.manifest.authKinds) {\n await expect(\n createLlm({ vendor: harness.vendor, auth: harness.authFor(ak.kind) }),\n ).resolves.toBeDefined();\n }\n });\n\n if (harness.unsupportedAuth) {\n it('[4] init() rejects an unsupported auth kind', async () => {\n await expect(\n createLlm({\n vendor: harness.vendor,\n auth: harness.unsupportedAuth!,\n }),\n ).rejects.toThrow();\n });\n }\n\n it('[18] empty messages array is rejected with a clear error', async () => {\n const adapter = await init(harness);\n await expect(\n drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: [],\n }),\n ).rejects.toThrowError(/messages/i);\n });\n\n // -----------------------------------------------------------------------\n // Behavioral checks — require vendor mocking via the harness.\n // -----------------------------------------------------------------------\n\n it('[5,6,7] stream emits exactly one end event, as the last event, with a valid finishReason', async () => {\n await harness.mockScenario('simple-stream');\n const adapter = await init(harness);\n const events = await drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: [{ role: 'user', content: 'hello' }],\n });\n const endIndexes = events\n .map((e, i) => (e.type === 'end' ? i : -1))\n .filter((i) => i >= 0);\n expect(endIndexes).toHaveLength(1);\n expect(endIndexes[0]).toBe(events.length - 1);\n const end = events[events.length - 1] as Extract<LlmEvent, { type: 'end' }>;\n expect(VALID_FINISH_REASONS).toContain(end.finishReason);\n });\n\n it('[8] tokens stream incrementally (at least two chunks)', async () => {\n await harness.mockScenario('simple-stream');\n const adapter = await init(harness);\n const events = await drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: [{ role: 'user', content: 'hello' }],\n });\n const tokens = events.filter((e) => e.type === 'token');\n expect(tokens.length).toBeGreaterThanOrEqual(2);\n });\n\n it('[9] pre-fired AbortSignal yields end(aborted) within 500ms', async () => {\n await harness.mockScenario('simple-stream');\n const adapter = await init(harness);\n const controller = new AbortController();\n controller.abort();\n const start = Date.now();\n const events = await drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: [{ role: 'user', content: 'hello' }],\n signal: controller.signal,\n });\n const elapsed = Date.now() - start;\n expect(elapsed).toBeLessThan(500);\n const end = events[events.length - 1] as Extract<LlmEvent, { type: 'end' }>;\n expect(end.type).toBe('end');\n expect(end.finishReason).toBe('aborted');\n // No token events should precede the end event when the abort was pre-fired.\n expect(events.filter((e) => e.type === 'token').length).toBe(0);\n });\n\n it('[10] mid-stream abort prevents any pending toolCall from firing', async () => {\n await harness.mockScenario('long-stream-with-pending-tool');\n const adapter = await init(harness);\n const controller = new AbortController();\n const events: LlmEvent[] = [];\n // Abort after the first token arrives.\n let aborted = false;\n for await (const evt of adapter.stream({\n model: harness.toolCapableModel,\n messages: [{ role: 'user', content: 'go' }],\n signal: controller.signal,\n })) {\n events.push(evt);\n if (!aborted && evt.type === 'token') {\n controller.abort();\n aborted = true;\n }\n }\n const end = events[events.length - 1] as Extract<LlmEvent, { type: 'end' }>;\n expect(end.type).toBe('end');\n expect(end.finishReason).toBe('aborted');\n expect(events.filter((e) => e.type === 'toolCall')).toHaveLength(0);\n });\n\n it('[11] tool-capable request yields a well-formed toolCall event', async () => {\n await harness.mockScenario('tool-call');\n const adapter = await init(harness);\n const events = await drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: [{ role: 'user', content: 'call the tool' }],\n tools: [\n {\n name: 'test_tool',\n description: 'A test tool',\n parameters: { type: 'object', properties: {} },\n },\n ],\n });\n const toolCalls = events.filter(\n (e): e is Extract<LlmEvent, { type: 'toolCall' }> => e.type === 'toolCall',\n );\n expect(toolCalls.length).toBeGreaterThanOrEqual(1);\n const tc = toolCalls[0]!;\n expect(typeof tc.id).toBe('string');\n expect(tc.id.length).toBeGreaterThan(0);\n expect(typeof tc.name).toBe('string');\n expect(tc.name.length).toBeGreaterThan(0);\n expect(tc.arguments).toBeDefined();\n });\n\n if (harness.emitsToolCallStart) {\n it('[12] every toolCallStart precedes its matching toolCall with the same id', async () => {\n await harness.mockScenario('tool-call-after-tokens');\n const adapter = await init(harness);\n const events = await drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: [{ role: 'user', content: 'hi' }],\n tools: [\n {\n name: 'test_tool',\n description: 'A test tool',\n parameters: { type: 'object', properties: {} },\n },\n ],\n });\n const startIndexById = new Map<string, number>();\n for (let i = 0; i < events.length; i++) {\n const evt = events[i]!;\n if (evt.type === 'toolCallStart') {\n startIndexById.set(evt.id, i);\n } else if (evt.type === 'toolCall') {\n const startIndex = startIndexById.get(evt.id);\n expect(startIndex, `missing toolCallStart for id ${evt.id}`).toBeDefined();\n expect(startIndex!).toBeLessThan(i);\n }\n }\n });\n }\n\n it('[13] appendToolResult produces a history that re-streams without throwing', async () => {\n await harness.mockScenario('tool-call');\n const adapter = await init(harness);\n const events = await drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: [{ role: 'user', content: 'call it' }],\n tools: [\n { name: 'test_tool', description: 'x', parameters: { type: 'object' } },\n ],\n });\n const tc = events.find(\n (e): e is Extract<LlmEvent, { type: 'toolCall' }> => e.type === 'toolCall',\n );\n expect(tc).toBeDefined();\n const baseHistory: Message[] = [{ role: 'user', content: 'call it' }];\n const afterAssistant = adapter.appendAssistantToolCall(baseHistory, [tc!]);\n expect(afterAssistant.length).toBe(baseHistory.length + 1);\n const withResult = adapter.appendToolResult(afterAssistant, tc!.id, { ok: true });\n expect(withResult.length).toBe(afterAssistant.length + 1);\n // Re-submit — must not throw.\n await harness.mockScenario('simple-stream');\n await expect(\n drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: withResult,\n }),\n ).resolves.toBeDefined();\n });\n\n it('[14] appendToolResult is deterministic for the same inputs', async () => {\n const adapter = await init(harness);\n const history: Message[] = [{ role: 'user', content: 'hi' }];\n const a = adapter.appendToolResult(history, 'tc_1', { a: 1 });\n const b = adapter.appendToolResult(history, 'tc_1', { a: 1 });\n expect(JSON.stringify(a)).toBe(JSON.stringify(b));\n });\n\n it('[15] listAvailableModels returns a non-empty list', async () => {\n await harness.mockScenario('list-models');\n const adapter = await init(harness);\n const models = await adapter.listAvailableModels();\n expect(models.length).toBeGreaterThan(0);\n for (const m of models) {\n expect(m.id.length).toBeGreaterThan(0);\n expect(typeof m.capabilities.tools).toBe('boolean');\n }\n });\n\n it('[15a] testCredential resolves on a valid auth probe', async () => {\n // Same scenario as list-models: the mock simulates a successful\n // authenticated vendor call. Adapters implement testCredential() either\n // via listAvailableModels (when supported) or a vendor-specific cheap\n // auth probe (Vertex-OpenAI token mint, etc.). Either way, the mocked\n // \"everything works\" scenario should resolve without throwing.\n await harness.mockScenario('list-models');\n const adapter = await init(harness);\n await expect(adapter.testCredential()).resolves.not.toThrow();\n });\n\n if (harness.nonToolCapableModel) {\n it('[16] non-tool-capable model with tools declared either fails fast or runs without tool calls', async () => {\n await harness.mockScenario('simple-stream');\n const adapter = await init(harness);\n const run = async () =>\n drainStream(adapter, {\n model: harness.nonToolCapableModel!,\n messages: [{ role: 'user', content: 'hi' }],\n tools: [\n { name: 'test_tool', description: 'x', parameters: { type: 'object' } },\n ],\n });\n try {\n const events = await run();\n // Allowed: ran to completion but emitted no tool calls.\n expect(events.filter((e) => e.type === 'toolCall')).toHaveLength(0);\n const end = events[events.length - 1] as Extract<LlmEvent, { type: 'end' }>;\n expect(end.finishReason).not.toBe('error');\n } catch (err) {\n // Also allowed: fails fast with a clear error.\n expect(err).toBeInstanceOf(Error);\n }\n });\n }\n\n it('[17] system prompt is present in the upstream request', async () => {\n await harness.mockScenario('simple-stream');\n const adapter = await init(harness);\n await drainStream(adapter, {\n model: harness.toolCapableModel,\n system: 'You are a test agent.',\n messages: [{ role: 'user', content: 'hi' }],\n });\n const captured = harness.getCapturedRequest();\n expect(captured).not.toBeNull();\n expect(captured!.system).toBe('You are a test agent.');\n });\n\n it('[19] multi-turn conversation is preserved in the upstream request', async () => {\n await harness.mockScenario('simple-stream');\n const adapter = await init(harness);\n const messages: Message[] = [\n { role: 'user', content: 'first' },\n { role: 'assistant', content: 'one' },\n { role: 'user', content: 'second' },\n { role: 'assistant', content: 'two' },\n { role: 'user', content: 'third' },\n ];\n await drainStream(adapter, { model: harness.toolCapableModel, messages });\n const captured = harness.getCapturedRequest();\n expect(captured).not.toBeNull();\n expect(captured!.messageCount).toBe(messages.length);\n });\n\n it('[20] vendorRaw on an assistant message round-trips through the next request', async () => {\n await harness.mockScenario('tool-call');\n const adapter = await init(harness);\n const first = await drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: [{ role: 'user', content: 'go' }],\n tools: [\n { name: 'test_tool', description: 'x', parameters: { type: 'object' } },\n ],\n });\n const tc = first.find(\n (e): e is Extract<LlmEvent, { type: 'toolCall' }> => e.type === 'toolCall',\n );\n expect(tc).toBeDefined();\n\n const afterAssistant = adapter.appendAssistantToolCall(\n [{ role: 'user', content: 'go' }],\n [tc!],\n );\n const withResult = adapter.appendToolResult(afterAssistant, tc!.id, { ok: true });\n\n await harness.mockScenario('simple-stream');\n await drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: withResult,\n });\n const captured = harness.getCapturedRequest();\n expect(captured).not.toBeNull();\n expect(captured!.vendorRawHonored).toBe(true);\n });\n\n it('[21] appendAssistantToolCall output + appendToolResult re-stream preserves tool-call id on wire', async () => {\n await harness.mockScenario('tool-call');\n const adapter = await init(harness);\n const first = await drainStream(adapter, {\n model: harness.toolCapableModel,\n messages: [{ role: 'user', content: 'go' }],\n tools: [\n { name: 'test_tool', description: 'x', parameters: { type: 'object' } },\n ],\n });\n const tc = first.find(\n (e): e is Extract<LlmEvent, { type: 'toolCall' }> => e.type === 'toolCall',\n );\n expect(tc).toBeDefined();\n\n const history = adapter.appendAssistantToolCall(\n [{ role: 'user', content: 'go' }],\n [tc!],\n );\n // The appended message must carry vendorRaw in a shape the same adapter\n // accepts back on stream(). If vendorRaw is undefined, the adapter would\n // have to reconstruct from role/content only — which is the regression\n // this check catches.\n const appended = history[history.length - 1]!;\n expect(appended.role).toBe('assistant');\n expect(appended.vendorRaw).toBeDefined();\n });\n });\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nasync function init(harness: ContractHarness): Promise<LlmAdapter> {\n const kind = harness.factory.manifest.authKinds[0]!.kind;\n return createLlm({ vendor: harness.vendor, auth: harness.authFor(kind) });\n}\n\nasync function drainStream(adapter: LlmAdapter, req: PromptRequest): Promise<LlmEvent[]> {\n const events: LlmEvent[] = [];\n for await (const evt of adapter.stream(req)) {\n events.push(evt);\n }\n return events;\n}\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 testCredential(): Promise<void> {\n // /v1/models is the cheapest authenticated GET on the OpenAI API.\n // Works for OpenAI proper and most compatible backends (DeepSeek included).\n await this.ensureClient().models.list();\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 testCredential(): Promise<void> {\n // Anthropic's /v1/models is authenticated and costs nothing.\n await this.ensureClient().models.list();\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 testCredential(): Promise<void> {\n // Model listing authenticates; no stream needed.\n await 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 testCredential(): Promise<void> {\n // Listing models authenticates via the service-account bearer.\n await 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 private googleAuth: GoogleAuth | 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 this.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 this.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 testCredential(): Promise<void> {\n // The OpenAI-compat endpoint has no list-models or other zero-cost\n // authenticated endpoint. Chat probes against a specific model are a\n // bad proxy: they require that partner model (Mistral, Llama, …) to be\n // granted in the caller's GCP project, which is independent of whether\n // the service-account credentials themselves are valid.\n //\n // Minting a Google access token from the service-account is sufficient\n // and vendor-appropriate: it verifies the credential JSON is well-formed,\n // the service account exists, and the key is active. If the token mints\n // but the caller hasn't enabled Vertex AI or a specific partner model in\n // the project, the first stream() call will tell them — credential\n // validity and model entitlement are properly separated concerns.\n if (!this.googleAuth) {\n throw new Error('VertexOpenAIAdapter: init() must be called before testCredential()');\n }\n const googleClient = await this.googleAuth.getClient();\n const token = await googleClient.getAccessToken();\n if (!token.token) {\n throw new Error('VertexOpenAIAdapter: service account did not mint an access token');\n }\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 {\n BedrockClient,\n ListFoundationModelsCommand,\n} from '@aws-sdk/client-bedrock';\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 private controlClientConfig: Record<string, unknown> | 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 // Stash the same config so testCredential can spin up a control-plane\n // client on demand. `@aws-sdk/client-bedrock` accepts the same auth\n // shape as the runtime client.\n this.controlClientConfig = 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. We don't call the\n // control-plane client here because listFoundationModels returns every\n // model AWS offers, not models the account has access to — that distinction\n // is what `ModelInfo.deprecated` surfaces in the manifest.\n return [...bedrockManifest.knownModels];\n }\n\n async testCredential(): Promise<void> {\n // Use the control-plane client (`@aws-sdk/client-bedrock`) with the same\n // credential config as the runtime client. `ListFoundationModels` is the\n // cheapest authenticated GET and works regardless of which specific\n // models the account has granted — an auth check, not an access check.\n if (!this.controlClientConfig) {\n throw new Error('BedrockAdapter: init() must be called before testCredential()');\n }\n const control = new BedrockClient(this.controlClientConfig);\n try {\n await control.send(new ListFoundationModelsCommand({}));\n } finally {\n control.destroy();\n }\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 *\n * FORMAT CONTRACT: `scripts/check-bedrock-models.ts --write` edits this file\n * in place by text substitution. Each entry MUST preserve the current shape:\n * an object literal whose first line is ` id: '<id>',` (two-space indent\n * plus trailing comma) and whose closing brace is on a line with exactly two\n * spaces of indent. If you restructure this array (e.g. move to JSON import),\n * update the script's edit strategy.\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","/**\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 {\n AdapterFactory,\n AdapterManifest,\n ApiKeyAuth,\n AuthKind,\n AuthSpec,\n ClientOptions,\n LlmAdapter,\n LlmEvent,\n Message,\n ModelInfo,\n PromptRequest,\n ToolCallEvent,\n} from '../types.js';\nimport { assertValidRequest } from '../validate.js';\nimport type { CapturedRequest, ContractHarness, ContractScenario } from './types.js';\n\n/**\n * Shared mutable state between the harness and the fake adapter instance.\n * The harness writes to it (via mockScenario/cleanup), the adapter reads it\n * during stream() / listAvailableModels() to decide what to produce.\n */\ninterface FakeState {\n scenario: ContractScenario | null;\n captured: CapturedRequest | null;\n}\n\n/**\n * Reference fake adapter used by the test-kit to verify itself.\n *\n * Produces canned events for each `ContractScenario`. Does not talk to any\n * real vendor. Used by `test/test-kit/self-check.test.ts` to prove that a\n * correctly-behaving adapter passes all 20 contract checks.\n *\n * Anybody implementing a real adapter can read this as a minimal reference —\n * it shows exactly what the library expects on the wire.\n */\nexport class FakeAdapter implements LlmAdapter<ApiKeyAuth> {\n readonly vendor = fakeManifest.vendor;\n readonly acceptedAuth = ['apiKey'] as const;\n private initialized = false;\n\n constructor(private readonly state: FakeState) {}\n\n init(auth: ApiKeyAuth, _client?: ClientOptions): void {\n if (auth.kind !== 'apiKey') {\n throw new Error(`FakeAdapter: unsupported auth kind '${(auth as AuthSpec).kind}'`);\n }\n if (!auth.apiKey) {\n throw new Error('FakeAdapter: apiKey is required');\n }\n this.initialized = true;\n }\n\n async *stream(req: PromptRequest): AsyncIterable<LlmEvent> {\n this.ensureInitialized();\n assertValidRequest(req);\n this.capture(req);\n\n const scenario = this.state.scenario ?? 'simple-stream';\n\n if (req.signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n\n switch (scenario) {\n case 'simple-stream':\n yield* simpleStream(req.signal);\n return;\n case 'tool-call':\n yield* toolCallOnly(req.signal);\n return;\n case 'tool-call-after-tokens':\n yield* toolCallAfterTokens(req.signal);\n return;\n case 'long-stream':\n yield* longStream(req.signal);\n return;\n case 'long-stream-with-pending-tool':\n yield* longStreamWithPendingTool(req.signal);\n return;\n case 'list-models':\n // listAvailableModels handles this — stream just behaves like simple.\n yield* simpleStream(req.signal);\n return;\n default:\n throw new Error(`FakeAdapter: unknown scenario '${scenario}'`);\n }\n }\n\n appendAssistantToolCall(\n history: Message[],\n toolCalls: ReadonlyArray<ToolCallEvent>,\n ): Message[] {\n return [\n ...history,\n {\n role: 'assistant',\n content: '',\n vendorRaw: {\n role: 'assistant',\n toolCalls: toolCalls.map((tc) => ({\n id: tc.id,\n name: tc.name,\n arguments: tc.arguments,\n })),\n },\n },\n ];\n }\n\n appendToolResult(history: Message[], toolCallId: string, result: unknown): Message[] {\n const content = typeof result === 'string' ? result : JSON.stringify(result);\n return [\n ...history,\n {\n role: 'tool',\n content,\n vendorRaw: { tool_call_id: toolCallId },\n },\n ];\n }\n\n async listAvailableModels(): Promise<ModelInfo[]> {\n this.ensureInitialized();\n return fakeManifest.knownModels;\n }\n\n async testCredential(): Promise<void> {\n this.ensureInitialized();\n }\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new Error('FakeAdapter: init() must be called before stream()/listAvailableModels()');\n }\n }\n\n private capture(req: PromptRequest): void {\n this.state.captured = {\n messageCount: req.messages.length,\n vendorRawHonored: req.messages.some((m) => m.vendorRaw !== undefined),\n ...(req.system !== undefined ? { system: req.system } : {}),\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Scenario generators\n// ---------------------------------------------------------------------------\n\nasync function* simpleStream(signal: AbortSignal | undefined): AsyncIterable<LlmEvent> {\n const chunks = ['Hello', ', ', 'world', '!'];\n for (const text of chunks) {\n if (signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n yield { type: 'token', text };\n }\n yield { type: 'end', finishReason: 'stop', usage: { inputTokens: 5, outputTokens: 4 } };\n}\n\nasync function* toolCallOnly(signal: AbortSignal | undefined): AsyncIterable<LlmEvent> {\n if (signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n yield { type: 'toolCallStart', id: 'call_fake_1', name: 'test_tool' };\n yield {\n type: 'toolCall',\n id: 'call_fake_1',\n name: 'test_tool',\n arguments: { foo: 'bar' },\n };\n yield { type: 'end', finishReason: 'tool' };\n}\n\nasync function* toolCallAfterTokens(signal: AbortSignal | undefined): AsyncIterable<LlmEvent> {\n const tokens = ['Let ', 'me ', 'check'];\n for (const text of tokens) {\n if (signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n yield { type: 'token', text };\n }\n if (signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n yield { type: 'toolCallStart', id: 'call_fake_2', name: 'test_tool' };\n yield {\n type: 'toolCall',\n id: 'call_fake_2',\n name: 'test_tool',\n arguments: { q: 'hello' },\n };\n yield { type: 'end', finishReason: 'tool' };\n}\n\nasync function* longStream(signal: AbortSignal | undefined): AsyncIterable<LlmEvent> {\n for (let i = 0; i < 12; i++) {\n if (signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n yield { type: 'token', text: `chunk-${i} ` };\n await sleep(20);\n }\n yield { type: 'end', finishReason: 'stop' };\n}\n\nasync function* longStreamWithPendingTool(\n signal: AbortSignal | undefined,\n): AsyncIterable<LlmEvent> {\n for (let i = 0; i < 5; i++) {\n if (signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n yield { type: 'token', text: `chunk-${i} ` };\n await sleep(25);\n }\n // Would emit a tool call next, but check abort first — on abort, the tool\n // call is NOT emitted. That's the contract check 10 verifies.\n if (signal?.aborted) {\n yield { type: 'end', finishReason: 'aborted' };\n return;\n }\n yield { type: 'toolCallStart', id: 'call_fake_3', name: 'test_tool' };\n yield {\n type: 'toolCall',\n id: 'call_fake_3',\n name: 'test_tool',\n arguments: { q: 'never-reached' },\n };\n yield { type: 'end', finishReason: 'tool' };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// ---------------------------------------------------------------------------\n// Manifest\n// ---------------------------------------------------------------------------\n\nexport const fakeManifest: AdapterManifest = {\n vendor: 'fake',\n displayName: 'Fake (test-kit reference)',\n authKinds: [\n {\n kind: 'apiKey',\n displayName: 'API Key',\n fields: [\n { name: 'apiKey', label: 'API Key', type: 'password', required: true },\n ],\n },\n ],\n knownModels: [\n {\n id: 'fake-tool-model',\n displayName: 'Fake Tool-Capable Model',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 8_000,\n },\n },\n {\n id: 'fake-plain-model',\n displayName: 'Fake Plain Model (no tools)',\n capabilities: {\n streaming: true,\n tools: false,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 4_000,\n },\n },\n ],\n supportsModelListing: true,\n};\n\n// ---------------------------------------------------------------------------\n// Factory + harness builder\n// ---------------------------------------------------------------------------\n\nexport interface FakeHarness extends ContractHarness {\n /** Expose the factory so callers can register if needed. */\n factory: AdapterFactory;\n}\n\n/**\n * Build a ContractHarness for the fake adapter. Used by the kit's self-check\n * test. External contributors don't use this — they build their own harness\n * against their adapter.\n */\nexport function createFakeHarness(): FakeHarness {\n const state: FakeState = { scenario: null, captured: null };\n\n const factory: AdapterFactory<ApiKeyAuth> = {\n vendor: fakeManifest.vendor,\n manifest: fakeManifest,\n create: () => new FakeAdapter(state),\n };\n\n return {\n vendor: fakeManifest.vendor,\n factory,\n authFor: (kind: AuthKind): AuthSpec => {\n if (kind === 'apiKey') return { kind: 'apiKey', apiKey: 'sk-fake' };\n throw new Error(`FakeHarness: asked for unsupported authFor kind '${kind}'`);\n },\n unsupportedAuth: {\n kind: 'bedrockIam',\n accessKeyId: 'x',\n secretAccessKey: 'y',\n region: 'us-east-1',\n },\n mockScenario(scenario) {\n state.scenario = scenario;\n state.captured = null;\n },\n cleanup() {\n state.scenario = null;\n state.captured = null;\n },\n getCapturedRequest() {\n return state.captured;\n },\n toolCapableModel: 'fake-tool-model',\n nonToolCapableModel: 'fake-plain-model',\n emitsToolCallStart: true,\n };\n}\n"],"mappings":"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","names":["buildWireMessages","formatTools","isAbortError","formatTools","isAbortError","usage","mapFinishReason","GoogleGenAI","GoogleGenAI","OpenAI","init","OpenAI","buildWireMessages","formatTools","isAbortError","mapStopReason"]}
|