@jambonz/llm 0.5.5 → 0.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +97 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +97 -0
- package/dist/index.js.map +1 -1
- package/dist/test-kit/index.cjs +96 -0
- package/dist/test-kit/index.cjs.map +1 -1
- package/dist/test-kit/index.js +96 -0
- package/dist/test-kit/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/test-kit/index.ts","../../src/test-kit/runner.ts","../../src/registry.ts","../../src/adapters/openai/adapter.ts","../../src/validate.ts","../../src/adapters/openai/_streaming.ts","../../src/adapters/_metadata.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/azure-openai/adapter.ts","../../src/adapters/azure-openai/manifest.ts","../../src/adapters/azure-openai/factory.ts","../../src/adapters/groq/manifest.ts","../../src/adapters/groq/adapter.ts","../../src/adapters/groq/factory.ts","../../src/adapters/huggingface/manifest.ts","../../src/adapters/huggingface/adapter.ts","../../src/adapters/huggingface/factory.ts","../../src/adapters/index.ts","../../src/index.ts","../../src/test-kit/fake-adapter.ts"],"sourcesContent":["/**\n * @jambonz/llm test-kit — contract tests for vendor adapters.\n *\n * Usage from an adapter's test file:\n *\n * import { runContractTests } from '@jambonz/llm/test-kit';\n * import { myAdapterHarness } from './harness.js';\n *\n * runContractTests(myAdapterHarness);\n *\n * The kit registers vitest describe/it blocks internally; importing this\n * module only exposes the runner and harness types.\n */\n\nexport { runContractTests } from './runner.js';\nexport type { CapturedRequest, ContractHarness, ContractScenario } from './types.js';\n\n// Reference fake adapter + harness, used by the kit's own self-check.\n// External adapter authors don't need these — they build a harness for their\n// vendor. But they may find the fake useful as a reference.\nexport { FakeAdapter, createFakeHarness, fakeManifest } from './fake-adapter.js';\nexport type { FakeHarness } from './fake-adapter.js';\n","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 { makeMetadataExtractor } from '../_metadata.js';\nimport { openAIManifest } from './manifest.js';\n\n/**\n * OpenAI response-header diagnostics surfaced as `vendorMetadata` on the\n * `end` event. `request_id` is essential for support tickets;\n * `processing_ms` separates vendor inference time from network time;\n * the rate-limit headers help operators spot when an account is trending\n * toward exhaustion within a single call.\n */\nconst OPENAI_METADATA_EXTRACTOR = makeMetadataExtractor([\n { header: 'x-request-id', key: 'request_id' },\n { header: 'openai-processing-ms', key: 'processing_ms', numeric: true },\n { header: 'x-ratelimit-remaining-requests', key: 'requests_remaining', numeric: true },\n { header: 'x-ratelimit-remaining-tokens', key: 'tokens_remaining', numeric: true },\n]);\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: this.knownModels(),\n vendorMetadataExtractor: OPENAI_METADATA_EXTRACTOR,\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(), this.knownModels());\n }\n\n /**\n * Capability table used to enrich both `stream()` (for tools/vision gating)\n * and `listAvailableModels()` (for filling capability flags on live entries).\n * Subclasses backed by the same OpenAI wire (DeepSeek, Baseten, …) override\n * this so their own manifest entries are consulted instead of OpenAI's.\n */\n protected knownModels(): ReadonlyArray<ModelInfo> {\n return 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 * Which wire parameter to use for the max-output cap. Defaults to a\n * per-request heuristic on `req.model` (see {@link needsMaxCompletionTokens}):\n * OpenAI's o-series reasoning models and gpt-5 family require\n * `max_completion_tokens`; everything else uses legacy `max_tokens`.\n *\n * Override when:\n * - The model id doesn't reflect the underlying model (Azure OpenAI\n * deployment names are arbitrary) — pass `'max_completion_tokens'`.\n * - Talking to an older OpenAI-compat endpoint that only knows\n * `max_tokens` (Vertex Llama MaaS, some local servers) — pass\n * `'max_tokens'` to pin the legacy name.\n */\n tokensParam?: 'max_tokens' | 'max_completion_tokens';\n /**\n * Optional adapter-supplied extractor that pulls vendor-specific\n * diagnostic data off the upstream HTTP response headers (request\n * id, rate-limit remaining, routing info, etc.) and returns it as\n * a flat key/value record.\n *\n * Called once per stream after the underlying `Response` is\n * available (via the OpenAI SDK's `.withResponse()` pattern). The\n * returned record is attached to the `end` event as\n * `vendorMetadata` if non-empty. Each adapter declares its own\n * allowlist — see the `huggingface`, `azure-openai`, `groq` etc.\n * adapters for examples.\n */\n vendorMetadataExtractor?: (\n headers: Headers,\n ) => Record<string, string | 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) {\n const param =\n options.tokensParam ??\n (needsMaxCompletionTokens(req.model) ? 'max_completion_tokens' : 'max_tokens');\n (body as unknown as Record<string, unknown>)[param] = effectiveMaxTokens;\n }\n\n // hrtime markers for client-side timing breakdown attached to the end event:\n // t0 = before SDK call\n // t1 = response headers received (after withResponse resolves)\n // t2 = first content token yielded back to caller\n // `clientTiming` is omitted when t1 was never reached (error before headers).\n const t0 = process.hrtime.bigint();\n let t1: bigint | undefined;\n let t2: bigint | undefined;\n\n let stream;\n let responseHeaders: Headers | undefined;\n try {\n // Production: `.withResponse()` on the OpenAI SDK's APIPromise surfaces\n // the underlying HTTP `Response` so adapters that supply a\n // `vendorMetadataExtractor` can read response headers. Test mocks\n // typically return the stream directly (no APIPromise wrapper); fall\n // through to a plain await when `.withResponse` isn't present, so\n // existing test infrastructure keeps working unchanged.\n const apiPromise = client.chat.completions.create(body, { signal: req.signal });\n const maybeWithResponse = (apiPromise as unknown as {\n withResponse?: () => Promise<{\n data: Awaited<typeof apiPromise>;\n response: { headers?: Headers };\n }>;\n }).withResponse;\n if (typeof maybeWithResponse === 'function') {\n const result = await maybeWithResponse.call(apiPromise);\n stream = result.data;\n responseHeaders = result.response?.headers;\n } else {\n stream = await apiPromise;\n }\n t1 = process.hrtime.bigint();\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 let sawContent = false;\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 // Some OpenAI-compatible backends report failures as a single SSE event\n // carrying a top-level `error` (instead of a non-2xx status the SDK would\n // throw on). Surface it rather than silently ending with no output.\n const chunkError = (chunk as { error?: unknown }).error;\n if (chunkError) {\n const message =\n chunkError && typeof chunkError === 'object' && 'message' in chunkError\n ? String((chunkError as { message?: unknown }).message)\n : JSON.stringify(chunkError);\n throw new Error(`OpenAI-compatible stream returned an error: ${message}`);\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 if (t2 === undefined) t2 = process.hrtime.bigint();\n sawContent = true;\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 // A valid completion stream always emits at least a finish_reason. If we got\n // through the whole stream with no content, no tool calls, no usage, and no\n // finish reason, the response was not a real completion — typically a\n // misconfigured base URL or a vendor error returned inside an HTTP 200 body\n // (which the SDK does not treat as an error). Fail loudly instead of\n // returning a silent empty turn that a caller would forward to TTS.\n const producedNothing =\n finalFinishReason === null &&\n !sawContent &&\n toolCallsEmitted.size === 0 &&\n startedIds.size === 0 &&\n usage === undefined;\n if (producedNothing) {\n throw new Error(\n 'OpenAI-compatible stream produced no data (no content, tool calls, usage, or finish ' +\n 'reason). This usually means a misconfigured base URL or a vendor error returned in an ' +\n 'HTTP 200 body. Verify the base URL and credentials.',\n );\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\n if (options.vendorMetadataExtractor && responseHeaders) {\n const metadata = options.vendorMetadataExtractor(responseHeaders);\n if (metadata && Object.keys(metadata).length > 0) {\n endEvent.vendorMetadata = metadata;\n }\n }\n\n if (t1 !== undefined) {\n const t3 = process.hrtime.bigint();\n endEvent.clientTiming = {\n requestToHeadersMs: Number(t1 - t0) / 1e6,\n ...(t2 !== undefined\n ? { headersToFirstTokenMs: Number(t2 - t1) / 1e6 }\n : {}),\n totalMs: Number(t3 - t0) / 1e6,\n };\n }\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\n/**\n * Does this model id require `max_completion_tokens` instead of legacy\n * `max_tokens`? OpenAI's reasoning family (o1, o3, o4) and gpt-5 dropped\n * `max_tokens` and return a 400 `Unsupported parameter` when it's sent.\n * Older chat models (gpt-4, gpt-4o, gpt-3.5-turbo) still accept `max_tokens`,\n * so we only switch when the model id matches the newer prefixes.\n *\n * Exposed so adapter authors (and tests) can rely on the same heuristic.\n */\nexport function needsMaxCompletionTokens(modelId: string): boolean {\n return /^(o\\d|gpt-5)/i.test(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","/**\n * Shared helpers for vendor-metadata extractors.\n *\n * Each adapter that wants to surface response-header diagnostics (request\n * id, rate-limit remaining, routing/region, vendor processing time, cache\n * counts) declares an allowlist of `header-name` → `output-key` pairs\n * here. The extractor walks the allowlist, reads each header, parses\n * numeric values, and returns a flat record. Empty/absent headers are\n * dropped — never emit `null`.\n *\n * Output shape is `Record<string, string | number>` so consumers\n * (feature-server, webapp) can render it as a key/value table without\n * per-vendor knowledge.\n */\n\nexport interface MetadataField {\n /** Lowercase HTTP header name to read. */\n header: string;\n /** Key under which the value is exposed in `vendorMetadata`. */\n key: string;\n /** Parse numeric values to `number` instead of leaving as `string`. */\n numeric?: boolean;\n}\n\n/**\n * Build a `vendorMetadataExtractor` from a static field list. Adapters\n * import this and pass the result to `streamFromOpenAI` (or call directly\n * for native-SDK adapters).\n */\nexport function makeMetadataExtractor(\n fields: ReadonlyArray<MetadataField>,\n): (headers: Headers) => Record<string, string | number> {\n return (headers: Headers) => {\n const out: Record<string, string | number> = {};\n for (const f of fields) {\n const raw = headers.get(f.header);\n if (raw === null || raw === undefined || raw === '') continue;\n if (f.numeric) {\n const n = Number(raw);\n if (Number.isFinite(n)) out[f.key] = n;\n } else {\n out[f.key] = raw;\n }\n }\n return out;\n };\n}\n\n/**\n * Convenience: run the extractor against a generic header source (a\n * `Headers` instance, a record, or AWS-SDK-style `httpHeaders`) by\n * normalizing first. Used by native-SDK adapters whose response shapes\n * don't expose a real `Headers` object.\n */\nexport function extractMetadata(\n fields: ReadonlyArray<MetadataField>,\n headers: Record<string, string | string[] | undefined> | Headers,\n): Record<string, string | number> {\n const headersInstance =\n headers instanceof Headers ? headers : recordToHeaders(headers);\n return makeMetadataExtractor(fields)(headersInstance);\n}\n\nfunction recordToHeaders(\n record: Record<string, string | string[] | undefined>,\n): Headers {\n const h = new Headers();\n for (const [name, value] of Object.entries(record)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n for (const v of value) h.append(name, v);\n } else {\n h.set(name, value);\n }\n }\n return h;\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 protected override knownModels() {\n return deepseekManifest.knownModels;\n }\n}\n\nexport const deepseekFactory: AdapterFactory<ApiKeyAuth> = {\n vendor: deepseekManifest.vendor,\n manifest: deepseekManifest,\n create: () => new DeepSeekAdapter(),\n};\n\n/**\n * Baseten alias factory. Wraps the OpenAI adapter but advertises itself as\n * `baseten` and ships a Baseten-specific manifest (different default\n * `baseURL`, different known models, different docsUrl).\n *\n * Baseten exposes two OpenAI-compatible surfaces:\n * - Model APIs (default): `https://inference.baseten.co/v1` — shared,\n * curated catalog (DeepSeek, GLM, Kimi, GPT-OSS, etc.). `/v1/models`\n * returns the live catalog.\n * - Bridge / Direct: `https://bridge.baseten.co/v1/direct` — routes to a\n * user's dedicated deployment. Users override `baseURL` for this case.\n *\n * Consumers call `createLlm({vendor: 'baseten', auth: {kind: 'apiKey', apiKey}})`\n * and get the OpenAI wire adapter pointed at the Baseten endpoint.\n */\nconst basetenManifest: AdapterManifest = {\n vendor: 'baseten',\n displayName: 'Baseten',\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://app.baseten.co/settings/api_keys',\n },\n {\n name: 'baseURL',\n label: 'Base URL',\n type: 'url',\n required: false,\n default: 'https://inference.baseten.co/v1',\n help: 'Defaults to Baseten Model APIs. Set to https://bridge.baseten.co/v1/direct to route to a dedicated deployment.',\n },\n ],\n },\n ],\n knownModels: [\n {\n id: 'deepseek-ai/DeepSeek-V3.1',\n displayName: 'DeepSeek V3.1',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 163_840,\n },\n },\n {\n id: 'deepseek-ai/DeepSeek-V4-Pro',\n displayName: 'DeepSeek V4 Pro',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 131_072,\n },\n },\n {\n id: 'zai-org/GLM-4.7',\n displayName: 'GLM 4.7',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n },\n {\n id: 'zai-org/GLM-5',\n displayName: 'GLM 5',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 202_800,\n },\n },\n {\n id: 'moonshotai/Kimi-K2.5',\n displayName: 'Kimi K2.5',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 262_000,\n },\n },\n {\n id: 'moonshotai/Kimi-K2.6',\n displayName: 'Kimi K2.6',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 262_000,\n },\n },\n {\n id: 'MiniMaxAI/MiniMax-M2.5',\n displayName: 'MiniMax M2.5',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 204_000,\n },\n },\n {\n id: 'nvidia/Nemotron-120B-A12B',\n displayName: 'Nemotron Super',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 202_800,\n },\n },\n {\n id: 'openai/gpt-oss-120b',\n displayName: 'OpenAI GPT 120B',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_072,\n },\n },\n ],\n supportsModelListing: true,\n docsUrl: 'https://docs.baseten.co/inference/model-apis/overview',\n};\n\nclass BasetenAdapter extends OpenAIAdapter {\n readonly vendor = basetenManifest.vendor;\n\n override init(auth: ApiKeyAuth, client?: Parameters<OpenAIAdapter['init']>[1]): void {\n super.init(\n {\n ...auth,\n baseURL: auth.baseURL ?? 'https://inference.baseten.co/v1',\n },\n client,\n );\n }\n\n protected override knownModels() {\n return basetenManifest.knownModels;\n }\n}\n\nexport const basetenFactory: AdapterFactory<ApiKeyAuth> = {\n vendor: basetenManifest.vendor,\n manifest: basetenManifest,\n create: () => new BasetenAdapter(),\n};\n\n/**\n * Moonshot (Kimi) alias factory. Moonshot exposes an OpenAI-compatible\n * Chat Completions surface; the only differences from OpenAI are the default\n * `baseURL` and the model catalog.\n *\n * Note: Moonshot serves a global endpoint (`api.moonshot.ai`) and a China\n * endpoint (`api.moonshot.cn`). We default to the global one; users override\n * `baseURL` for `.cn`. Moonshot only accepts the `tools` calling format (the\n * deprecated `functions` param is unsupported), which is what we already emit.\n *\n * Consumers call `createLlm({vendor: 'moonshot', auth: {kind: 'apiKey', apiKey}})`.\n */\nconst moonshotManifest: AdapterManifest = {\n vendor: 'moonshot',\n displayName: 'Moonshot (Kimi)',\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.moonshot.ai/console/api-keys',\n },\n {\n name: 'baseURL',\n label: 'Base URL',\n type: 'url',\n required: false,\n default: 'https://api.moonshot.ai/v1',\n help: 'Defaults to the global endpoint. Set to https://api.moonshot.cn/v1 for the China endpoint.',\n },\n ],\n },\n ],\n knownModels: [\n {\n id: 'kimi-k2.6',\n displayName: 'Kimi K2.6',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 262_144,\n },\n },\n {\n id: 'kimi-k2.5',\n displayName: 'Kimi K2.5',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 262_144,\n },\n },\n ],\n supportsModelListing: true,\n docsUrl: 'https://platform.moonshot.ai/docs',\n};\n\nclass MoonshotAdapter extends OpenAIAdapter {\n readonly vendor = moonshotManifest.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.moonshot.ai/v1',\n },\n client,\n );\n }\n\n protected override knownModels() {\n return moonshotManifest.knownModels;\n }\n}\n\nexport const moonshotFactory: AdapterFactory<ApiKeyAuth> = {\n vendor: moonshotManifest.vendor,\n manifest: moonshotManifest,\n create: () => new MoonshotAdapter(),\n};\n\n/**\n * Z.ai (GLM) alias factory. Z.ai's `/api/paas/v4` surface is OpenAI-compatible\n * for chat completions (it accepts the OpenAI request shape and is what the\n * OpenAI SDK should target as its baseURL). Note there is NO OpenAI-style\n * `/models` listing endpoint, so `supportsModelListing` is false and we serve\n * the static known-models list.\n *\n * Note: Coding-Plan subscriptions are served from a *different* endpoint\n * (`https://api.z.ai/api/coding/paas/v4`), not the general one. Users on a\n * Coding Plan must override `baseURL` accordingly.\n *\n * Consumers call `createLlm({vendor: 'zai', auth: {kind: 'apiKey', apiKey}})`.\n */\nconst zaiManifest: AdapterManifest = {\n vendor: 'zai',\n displayName: 'Z.ai (GLM)',\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://z.ai/manage-apikey/apikey-list',\n },\n {\n name: 'baseURL',\n label: 'Base URL',\n type: 'url',\n required: false,\n default: 'https://api.z.ai/api/paas/v4',\n help: 'Defaults to the general API. Coding-Plan keys must use https://api.z.ai/api/coding/paas/v4.',\n },\n ],\n },\n ],\n knownModels: [\n {\n id: 'glm-5.2',\n displayName: 'GLM-5.2',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'glm-4.7',\n displayName: 'GLM-4.7',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n },\n ],\n supportsModelListing: false,\n docsUrl: 'https://docs.z.ai/',\n};\n\nclass ZaiAdapter extends OpenAIAdapter {\n readonly vendor = zaiManifest.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.z.ai/api/paas/v4',\n },\n client,\n );\n }\n\n protected override knownModels() {\n return zaiManifest.knownModels;\n }\n}\n\nexport const zaiFactory: AdapterFactory<ApiKeyAuth> = {\n vendor: zaiManifest.vendor,\n manifest: zaiManifest,\n create: () => new ZaiAdapter(),\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 { makeMetadataExtractor } from '../_metadata.js';\nimport { anthropicManifest } from './manifest.js';\n\n/**\n * Anthropic response-header diagnostics. `request-id` is the support-ticket\n * id; the rate-limit headers help operators see when an account is\n * approaching limits across turns within a call.\n */\nconst ANTHROPIC_METADATA_EXTRACTOR = makeMetadataExtractor([\n { header: 'request-id', key: 'request_id' },\n { header: 'anthropic-ratelimit-requests-remaining', key: 'requests_remaining', numeric: true },\n { header: 'anthropic-ratelimit-input-tokens-remaining', key: 'input_tokens_remaining', numeric: true },\n { header: 'anthropic-ratelimit-output-tokens-remaining', key: 'output_tokens_remaining', numeric: true },\n]);\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 let responseHeaders: Headers | undefined;\n try {\n // Production: `.withResponse()` on the Anthropic SDK's APIPromise\n // exposes the underlying HTTP `Response` for header diagnostics.\n // Test mocks return the stream directly with no APIPromise wrapper;\n // fall through to plain await when `.withResponse` isn't present.\n const apiPromise = client.messages.create(\n body as unknown as Parameters<typeof client.messages.create>[0],\n { signal: req.signal },\n );\n const maybeWithResponse = (apiPromise as unknown as {\n withResponse?: () => Promise<{\n data: Awaited<typeof apiPromise>;\n response: { headers?: Headers };\n }>;\n }).withResponse;\n if (typeof maybeWithResponse === 'function') {\n const result = await maybeWithResponse.call(apiPromise);\n stream = result.data;\n responseHeaders = result.response?.headers;\n } else {\n stream = await apiPromise;\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\n if (responseHeaders) {\n const metadata = ANTHROPIC_METADATA_EXTRACTOR(responseHeaders);\n if (Object.keys(metadata).length > 0) {\n endEvent.vendorMetadata = metadata;\n }\n }\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 { makeMetadataExtractor } from '../_metadata.js';\nimport { vertexOpenAIManifest } from './manifest.js';\n\n/**\n * Vertex partner-model response-header diagnostics. Sparse —\n * Google's compat layer mostly returns standard request id and\n * little else useful for client-side observability.\n */\nconst VERTEX_OPENAI_METADATA_EXTRACTOR = makeMetadataExtractor([\n { header: 'x-request-id', key: 'request_id' },\n]);\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 const response = await fetch(input, { ...init, headers });\n if (!response.ok) {\n return surfaceErrorBody(response, input);\n }\n return response;\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 // Pin legacy `max_tokens`: Vertex's OpenAI-compat partner-model\n // endpoint predates `max_completion_tokens` and may not recognize it.\n // The model-id heuristic wouldn't catch a partner model named in the\n // OpenAI style (unlikely today, but defensive).\n tokensParam: 'max_tokens',\n vendorMetadataExtractor: VERTEX_OPENAI_METADATA_EXTRACTOR,\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\n/**\n * On a non-2xx response, read the Vertex error body and reconstruct the\n * Response so the OpenAI SDK can include the body in its thrown error.\n *\n * Why this is necessary: the OpenAI SDK v6 drops the body on some error\n * responses (the ones delivered gzipped, which Vertex does) — callers see\n * \"404 status code (no body)\" with no indication of root cause. Vertex's\n * real body for the model-in-wrong-region case carries useful text naming\n * the model and region. Reading the body here (before the SDK's parser gets\n * it) lets us pass it through as plain text; the SDK then surfaces it\n * verbatim in `err.message`.\n */\nasync function surfaceErrorBody(\n response: Response,\n input: Parameters<typeof fetch>[0],\n): Promise<Response> {\n let body = '';\n try {\n body = await response.text();\n } catch {\n // Body already consumed or unreadable — fall through with empty body.\n }\n\n const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;\n const hint =\n response.status === 404 && !body\n ? ' (no body returned — most commonly means the requested model is not hosted in this region; ' +\n 'check Google\\'s partner-model availability matrix)'\n : '';\n\n // Log so operators see the full vendor text in api-server / feature-server\n // logs regardless of how the thrown error is formatted downstream.\n if (typeof console !== 'undefined' && console.warn) {\n console.warn(\n `[vertex-openai] ${response.status} ${response.statusText} from ${url}: ` +\n `${body || '(empty body)'}${hint}`,\n );\n }\n\n // Vertex wraps errors in a single-element JSON array: `[{error: {...}}]`.\n // The OpenAI SDK expects a bare object `{error: {...}}`, so when parsing\n // the array it fails to find `.error` and throws \"no body\". Unwrap the\n // array so the SDK's error.message carries the vendor's own text.\n const normalizedBody = unwrapVertexErrorArray(body) + hint;\n\n // Drop encoding headers so the SDK doesn't try to decompress plain text.\n const headers = new Headers(response.headers);\n headers.delete('content-encoding');\n headers.delete('content-length');\n\n return new Response(normalizedBody, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\nfunction unwrapVertexErrorArray(body: string): string {\n if (!body) return body;\n const trimmed = body.trim();\n if (!trimmed.startsWith('[')) return body;\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed) && parsed.length === 1 && parsed[0]?.error) {\n return JSON.stringify(parsed[0]);\n }\n } catch {\n // not JSON; leave as-is\n }\n return body;\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 // Same region set as vertex-gemini plus us-east5 (where Google\n // hosts Llama partner models). Partner-model availability varies\n // per region; Google's docs for each model are the source of truth.\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-east5', label: 'us-east5' },\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_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 { extractMetadata } from '../_metadata.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\n // Bedrock-specific response-header diagnostics. AWS surfaces them on\n // `response.$metadata.httpHeaders` rather than a standards-compliant\n // `Headers` instance — and the AWS SDK's TypeScript types don't include\n // the field, so cast through unknown. Useful signals:\n // `x-amzn-bedrock-invocation-latency` (vendor-side latency),\n // `x-amzn-bedrock-cache-{read,write}-input-token-count` (prompt-cache\n // effectiveness), `x-amzn-bedrock-trace-id` (support tickets).\n const httpHeaders = (response.$metadata as unknown as\n | { httpHeaders?: Record<string, string> }\n | undefined)?.httpHeaders;\n if (httpHeaders) {\n const metadata = extractMetadata(\n [\n { header: 'x-amzn-bedrock-invocation-latency', key: 'invocation_latency_ms', numeric: true },\n { header: 'x-amzn-bedrock-cache-read-input-token-count', key: 'cache_read_input_tokens', numeric: true },\n { header: 'x-amzn-bedrock-cache-write-input-token-count', key: 'cache_write_input_tokens', numeric: true },\n { header: 'x-amzn-bedrock-trace-id', key: 'trace_id' },\n ],\n httpHeaders,\n );\n if (Object.keys(metadata).length > 0) {\n endEvent.vendorMetadata = metadata;\n }\n }\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 deprecated: true,\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","import { AzureOpenAI } from 'openai';\nimport type {\n AzureOpenAIApiKeyAuth,\n ClientOptions,\n LlmAdapter,\n LlmEvent,\n Message,\n ModelInfo,\n PromptRequest,\n ToolCallEvent,\n} from '../../types.js';\nimport {\n appendOpenAIAssistantToolCall,\n appendOpenAIToolResult,\n streamFromOpenAI,\n} from '../openai/_streaming.js';\nimport { makeMetadataExtractor } from '../_metadata.js';\nimport { azureOpenAIManifest } from './manifest.js';\n\n/**\n * Azure OpenAI response-header diagnostics.\n *\n * `x-ms-region` confirms which datacenter served (operators sometimes\n * provision multi-region deployments and want to verify routing).\n * `x-ms-deployment-name` confirms the deployment that served — useful\n * because Azure deployment names are arbitrary user strings and a\n * misconfigured credential could be pointed at a different deployment\n * than expected. `apim-request-id` is for support tickets;\n * `azureml-model-session` is the underlying model session id.\n */\nconst AZURE_OPENAI_METADATA_EXTRACTOR = makeMetadataExtractor([\n { header: 'x-ms-region', key: 'region' },\n { header: 'x-ms-deployment-name', key: 'deployment' },\n { header: 'apim-request-id', key: 'request_id' },\n { header: 'azureml-model-session', key: 'model_session' },\n { header: 'x-ratelimit-remaining-requests', key: 'requests_remaining', numeric: true },\n { header: 'x-ratelimit-remaining-tokens', key: 'tokens_remaining', numeric: true },\n]);\n\n/**\n * Adapter for Azure OpenAI Service.\n *\n * Azure speaks an OpenAI-compatible wire protocol for chat completions, so the\n * adapter reuses `streamFromOpenAI` / `appendOpenAI*` from the OpenAI adapter.\n * What differs is client construction:\n * - Auth is an `api-key` header, not `Authorization: Bearer`.\n * - The URL embeds the *deployment* name, not the model id:\n * `https://{endpoint}/openai/deployments/{deployment}/chat/completions?api-version={version}`\n * - The `model` field on the wire is ignored by Azure — the deployment in the\n * URL determines which model runs.\n *\n * The `AzureOpenAI` class exported from the `openai` SDK handles all three\n * quirks for us. It extends `OpenAI`, so passing it to `streamFromOpenAI()`\n * works without translation.\n */\nexport class AzureOpenAIAdapter implements LlmAdapter<AzureOpenAIApiKeyAuth> {\n readonly vendor = azureOpenAIManifest.vendor;\n readonly acceptedAuth = ['azureOpenAIApiKey'] as const;\n\n private client: AzureOpenAI | undefined;\n\n init(auth: AzureOpenAIApiKeyAuth, client?: ClientOptions): void {\n if (auth.kind !== 'azureOpenAIApiKey') {\n throw new Error(\n `AzureOpenAIAdapter: unsupported auth kind '${(auth as { kind: string }).kind}'`,\n );\n }\n if (!auth.apiKey) {\n throw new Error('AzureOpenAIAdapter: apiKey is required');\n }\n if (!auth.endpoint) {\n throw new Error('AzureOpenAIAdapter: endpoint is required');\n }\n if (!auth.deployment) {\n throw new Error('AzureOpenAIAdapter: deployment is required');\n }\n if (!auth.apiVersion) {\n throw new Error('AzureOpenAIAdapter: apiVersion is required');\n }\n\n this.client = new AzureOpenAI({\n apiKey: auth.apiKey,\n endpoint: auth.endpoint,\n apiVersion: auth.apiVersion,\n deployment: auth.deployment,\n ...(client?.timeout !== undefined ? { timeout: client.timeout } : {}),\n ...(client?.maxRetries !== undefined ? { maxRetries: client.maxRetries } : {}),\n });\n }\n\n stream(req: PromptRequest): AsyncIterable<LlmEvent> {\n // Azure deployment names are arbitrary user strings (e.g. `prod-gpt-4o`,\n // `my-assistant`, `gpt-5.4-mini`) — the model-id heuristic in\n // streamFromOpenAI can't see the underlying model, so pin the newer\n // parameter name. Microsoft's current Azure OpenAI backend accepts\n // `max_completion_tokens` for gpt-4o-family and requires it for\n // gpt-5-family / o-series reasoning models.\n return streamFromOpenAI(this.ensureClient(), req, {\n knownModels: azureOpenAIManifest.knownModels,\n tokensParam: 'max_completion_tokens',\n vendorMetadataExtractor: AZURE_OPENAI_METADATA_EXTRACTOR,\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 // Azure's data-plane API doesn't expose a list-models endpoint; deployment\n // listing lives on the control plane (ARM) and requires AAD. Return the\n // manifest's curated set.\n return [...azureOpenAIManifest.knownModels];\n }\n\n async testCredential(): Promise<void> {\n // No cheap authenticated GET available on the data plane — `/models` on\n // Azure returns the account's deployments only if the key has the right\n // role, and is 404 on many configurations. A minimal chat-completions\n // call is the reliable probe: success proves the api-key authenticates\n // AND that the endpoint+deployment+api-version combination resolves.\n const client = this.ensureClient();\n await client.chat.completions.create({\n // Azure ignores `model` when a deployment is in the URL, but the SDK\n // still requires it as a parameter.\n model: 'probe',\n messages: [{ role: 'user', content: 'ping' }],\n // Use `max_completion_tokens` (not legacy `max_tokens`): gpt-5 family\n // and o-series reasoning models return 400 on the legacy parameter.\n // The newer name is a superset — also accepted by gpt-4o, gpt-4-turbo,\n // and gpt-3.5-turbo deployments — so it's the safe choice for a probe\n // that has to work regardless of the underlying deployment model.\n //\n // 256 (not 1): reasoning models consume reasoning tokens BEFORE\n // visible output, all counted against this cap. With 1 the model\n // can't produce any output and Azure returns\n // `400 Could not finish the message because max_tokens or model\n // output limit was reached`. 256 is comfortable headroom for\n // reasoning + a \"pong\"-sized reply on every model we ship in the\n // manifest, while still bounded so the probe can't run away on a\n // misconfigured deployment.\n max_completion_tokens: 256,\n stream: false,\n } as Parameters<typeof client.chat.completions.create>[0]);\n }\n\n async warmup(): Promise<void> {\n // No idempotent cheap endpoint on the data plane. No-op.\n }\n\n private ensureClient(): AzureOpenAI {\n if (!this.client) {\n throw new Error(\n 'AzureOpenAIAdapter: 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 models that customers commonly deploy to Azure OpenAI Service.\n *\n * Unlike `api.openai.com`, Azure doesn't pick the model from the `model`\n * request field — the deployment name in the URL determines which model runs.\n * The manifest's model list is therefore keyed by the underlying *model* so\n * capability flags can be looked up by whichever model the user's deployment\n * points at. Common Azure deployment names mirror the model id (e.g. a\n * deployment called `gpt-4o` running `gpt-4o`), but customers may use arbitrary\n * names like `prod-chat` or `my-assistant` — that's fine; capability flags\n * default to something reasonable if the deployment name doesn't match.\n *\n * Azure's fine-tune deployments and private-preview model ids are out of scope.\n */\nconst AZURE_OPENAI_KNOWN_MODELS: ModelInfo[] = [\n {\n id: 'gpt-4o',\n displayName: 'GPT-4o (on Azure)',\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 (on Azure)',\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 (on Azure)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n // Azure spells it `gpt-35-turbo` (no dot). Keep their spelling for the id\n // so capability lookups against deployment names that echo the Azure id\n // hit.\n id: 'gpt-35-turbo',\n displayName: 'GPT-3.5 Turbo (on Azure)',\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 (on Azure)',\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 (on Azure)',\n capabilities: {\n streaming: false,\n tools: false,\n vision: false,\n systemPrompt: false,\n maxContextTokens: 128_000,\n },\n },\n];\n\nexport const azureOpenAIManifest: AdapterManifest = {\n vendor: 'azure-openai',\n displayName: 'Azure OpenAI',\n authKinds: [\n {\n kind: 'azureOpenAIApiKey',\n displayName: 'API Key',\n fields: [\n {\n name: 'apiKey',\n label: 'API Key',\n type: 'password',\n required: true,\n help:\n 'In Azure AI Foundry, open the deployment and copy the Key from ' +\n 'the Endpoint panel (eye icon to reveal). Same key is shown in ' +\n 'the Azure portal under your OpenAI resource → Keys and Endpoint.',\n },\n {\n name: 'endpoint',\n label: 'Endpoint',\n type: 'url',\n required: true,\n help:\n 'Resource hostname only — no path, no query string. Example: ' +\n 'https://my-resource.openai.azure.com. The Foundry deployment ' +\n 'page shows a Target URI like ' +\n 'https://my-resource.openai.azure.com/openai/responses?api-version=… ' +\n 'Strip everything from /openai/ onward and paste only the part ' +\n 'before it.',\n },\n {\n name: 'deployment',\n label: 'Deployment Name',\n type: 'text',\n required: true,\n help:\n 'The Name shown at the top of the deployment page in Azure AI ' +\n 'Foundry (also under Deployment info → Name). NOT the underlying ' +\n 'model id — deployments can be named anything you chose at create time.',\n },\n {\n name: 'apiVersion',\n label: 'API Version',\n type: 'text',\n required: true,\n default: '2025-03-01-preview',\n help:\n 'Data-plane api-version. Visible in Foundry as the ?api-version=… ' +\n 'query string in the Target URI, or the api_version=… line in the ' +\n 'Python sample. The default 2025-03-01-preview is the minimum that ' +\n 'works with gpt-5 / o-series deployments — Azure routes those ' +\n 'through the Responses API internally and rejects older versions.',\n },\n ],\n },\n ],\n knownModels: AZURE_OPENAI_KNOWN_MODELS,\n // Azure's list-deployments endpoint is on the control plane (ARM) and\n // requires AAD credentials the data-plane API key doesn't carry. Return\n // the curated set from the manifest.\n supportsModelListing: false,\n docsUrl: 'https://learn.microsoft.com/en-us/azure/ai-services/openai/reference',\n};\n","import type { AdapterFactory, AzureOpenAIApiKeyAuth } from '../../types.js';\nimport { AzureOpenAIAdapter } from './adapter.js';\nimport { azureOpenAIManifest } from './manifest.js';\n\nexport const azureOpenAIFactory: AdapterFactory<AzureOpenAIApiKeyAuth> = {\n vendor: azureOpenAIManifest.vendor,\n manifest: azureOpenAIManifest,\n create: () => new AzureOpenAIAdapter(),\n};\n","import type { AdapterManifest, ModelInfo } from '../../types.js';\n\n/**\n * Curated production-recommended Groq models. The live `/openai/v1/models`\n * endpoint returns the full catalog (which churns frequently); this list\n * seeds the admin-UI dropdown and capability flags.\n *\n * All entries here are tool-capable — Groq's catalog also includes\n * vision-only and safety-classifier models that we deliberately exclude\n * from the curated set because they don't make sense as the primary LLM\n * for a voice agent.\n */\nconst GROQ_KNOWN_MODELS: ModelInfo[] = [\n {\n id: 'llama-3.3-70b-versatile',\n displayName: 'Llama 3.3 70B Versatile (Groq)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'llama-3.1-8b-instant',\n displayName: 'Llama 3.1 8B Instant (Groq)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'gemma2-9b-it',\n displayName: 'Gemma 2 9B (Groq)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 8_192,\n },\n },\n];\n\nexport const groqManifest: AdapterManifest = {\n vendor: 'groq',\n displayName: 'Groq',\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.groq.com/keys (sign in first if needed)',\n },\n {\n name: 'baseURL',\n label: 'Base URL',\n type: 'url',\n required: false,\n default: 'https://api.groq.com/openai/v1',\n help:\n 'Override only for proxies. Default points at Groq\\'s production endpoint.',\n },\n ],\n },\n ],\n knownModels: GROQ_KNOWN_MODELS,\n // Groq exposes /openai/v1/models with the same auth as chat completions.\n supportsModelListing: true,\n docsUrl: 'https://console.groq.com/docs/api-reference',\n};\n","import { OpenAIAdapter } from '../openai/adapter.js';\nimport { streamFromOpenAI } from '../openai/_streaming.js';\nimport type { ApiKeyAuth, ClientOptions, LlmEvent, PromptRequest } from '../../types.js';\nimport { makeMetadataExtractor } from '../_metadata.js';\nimport { groqManifest } from './manifest.js';\n\n/**\n * Groq response-header diagnostics. `x-groq-region` names the Groq\n * datacenter that served the request — useful for latency analysis.\n * `openai-processing-ms` is forwarded by Groq (they're OpenAI-wire-\n * compatible) and reports their server-side processing time, which\n * can be compared against wall-clock to spot infrastructure queueing\n * not counted in the model-server timer. Rate-limit headers help\n * operators spot when a workload is trending toward exhaustion\n * across turns within a call.\n */\nconst GROQ_METADATA_EXTRACTOR = makeMetadataExtractor([\n { header: 'x-request-id', key: 'request_id' },\n { header: 'x-groq-region', key: 'region' },\n { header: 'openai-processing-ms', key: 'processing_ms', numeric: true },\n { header: 'x-ratelimit-remaining-requests', key: 'requests_remaining', numeric: true },\n { header: 'x-ratelimit-remaining-tokens', key: 'tokens_remaining', numeric: true },\n]);\n\n/**\n * Adapter for Groq.\n *\n * Groq's chat-completions endpoint is OpenAI-wire-compatible — same request\n * shape, same streaming SSE, same tool-call format. The adapter is therefore\n * a thin subclass of `OpenAIAdapter` that defaults the `baseURL` to\n * `https://api.groq.com/openai/v1`. All wire translation, tool-call\n * accumulation, abort handling, and history round-tripping live in the\n * shared `streamFromOpenAI` helper.\n *\n * Why a separate class (vs. an inline alias like `DeepSeekAdapter` in\n * openai/factory.ts): keeps the manifest, README, and any future\n * Groq-specific quirks co-located in `src/adapters/groq/`. The DeepSeek\n * inline alias is a legacy shape; new vendors get their own directory.\n */\nexport class GroqAdapter extends OpenAIAdapter {\n override readonly vendor = groqManifest.vendor;\n\n override init(auth: ApiKeyAuth, client?: ClientOptions): void {\n super.init(\n {\n ...auth,\n baseURL: auth.baseURL ?? 'https://api.groq.com/openai/v1',\n },\n client,\n );\n }\n\n override stream(req: PromptRequest): AsyncIterable<LlmEvent> {\n // Override so we can pass Groq's own metadata extractor; otherwise\n // we'd inherit OpenAI's, which misses `x-groq-region`.\n return streamFromOpenAI(this.ensureClient(), req, {\n knownModels: groqManifest.knownModels,\n vendorMetadataExtractor: GROQ_METADATA_EXTRACTOR,\n });\n }\n}\n","import type { AdapterFactory, ApiKeyAuth } from '../../types.js';\nimport { GroqAdapter } from './adapter.js';\nimport { groqManifest } from './manifest.js';\n\nexport const groqFactory: AdapterFactory<ApiKeyAuth> = {\n vendor: groqManifest.vendor,\n manifest: groqManifest,\n create: () => new GroqAdapter(),\n};\n","import type { AdapterManifest, ModelInfo } from '../../types.js';\n\n/**\n * Curated HuggingFace Inference Providers `knownModels`.\n *\n * Keyed by canonical HF model id (`<org>/<model>`). Customers can append a\n * `:provider-name` (`:fireworks-ai`, `:cerebras`, `:nebius`, etc.) or\n * `:fastest` suffix at request time to influence routing — those suffixed\n * variants are NOT enumerated here because the suffixed id is just a\n * routing hint, not a different model. The library's\n * `defaultCapabilitiesForUnknown` returns sensible defaults for any\n * suffixed id the heuristic doesn't recognize.\n *\n * The full live catalog is available via `listAvailableModels()` against\n * `/v1/models` — this list seeds the admin-UI dropdown with the most\n * common picks.\n */\nconst HF_KNOWN_MODELS: ModelInfo[] = [\n {\n id: 'meta-llama/Llama-3.3-70B-Instruct',\n displayName: 'Llama 3.3 70B Instruct (HF Providers)',\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/Llama-3.1-8B-Instruct',\n displayName: 'Llama 3.1 8B Instruct (HF Providers)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'Qwen/Qwen2.5-72B-Instruct',\n displayName: 'Qwen 2.5 72B Instruct (HF Providers)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'mistralai/Mistral-7B-Instruct-v0.3',\n displayName: 'Mistral 7B Instruct v0.3 (HF Providers)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 32_000,\n },\n },\n {\n id: 'deepseek-ai/DeepSeek-V3',\n displayName: 'DeepSeek V3 (HF Providers)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 64_000,\n },\n },\n];\n\nexport const huggingfaceManifest: AdapterManifest = {\n vendor: 'huggingface',\n displayName: 'HuggingFace Inference Providers',\n authKinds: [\n {\n kind: 'apiKey',\n displayName: 'API Key',\n fields: [\n {\n name: 'apiKey',\n label: 'HuggingFace Token',\n type: 'password',\n required: true,\n help:\n 'Get a token from https://huggingface.co/settings/tokens (Read scope is sufficient). ' +\n 'Inference Providers requires a credit balance — claim the free monthly tier or attach ' +\n 'a payment method at https://huggingface.co/billing.',\n },\n {\n name: 'baseURL',\n label: 'Base URL',\n type: 'url',\n required: false,\n default: 'https://router.huggingface.co/v1',\n help: 'Override only for proxies. Default is the HF Providers router endpoint.',\n },\n ],\n },\n ],\n knownModels: HF_KNOWN_MODELS,\n // The HF router exposes /v1/models with the same Bearer auth.\n supportsModelListing: true,\n docsUrl: 'https://huggingface.co/docs/inference-providers',\n};\n","import { OpenAIAdapter } from '../openai/adapter.js';\nimport { streamFromOpenAI } from '../openai/_streaming.js';\nimport type { ApiKeyAuth, ClientOptions, LlmEvent, PromptRequest } from '../../types.js';\nimport { makeMetadataExtractor } from '../_metadata.js';\nimport { huggingfaceManifest } from './manifest.js';\n\n/**\n * HuggingFace Inference Providers response-header diagnostics.\n *\n * `x-inference-provider` is the killer signal — names the actual\n * backend (Groq, Cerebras, Together, Fireworks, etc.) that served\n * the request. Useful for diagnosing latency anomalies and confirming\n * provider routing for `:fastest` / `:provider-name` model suffixes.\n */\nconst HUGGINGFACE_METADATA_EXTRACTOR = makeMetadataExtractor([\n { header: 'x-inference-provider', key: 'provider' },\n { header: 'x-request-id', key: 'request_id' },\n]);\n\n/**\n * Adapter for HuggingFace Inference Providers.\n *\n * HF Providers is a multi-provider broker: one HF token at\n * https://router.huggingface.co/v1 routes requests to whichever inference\n * shop hosts the requested model — Groq, Together, Fireworks, Cerebras,\n * Nebius, Hyperbolic, SambaNova, etc. The wire is OpenAI-compatible (chat\n * completions, streaming, tools, Bearer auth), so the adapter is a thin\n * subclass of `OpenAIAdapter` that defaults the `baseURL`.\n *\n * Model field syntax: customers pass canonical HF model ids\n * (`meta-llama/Llama-3.3-70B-Instruct`). They MAY append a routing\n * hint:\n * - `:fireworks-ai`, `:cerebras`, `:groq`, etc. — pin a specific provider\n * - `:fastest` — let HF route to the fastest available backend\n * Suffixes pass through to HF unchanged. The library's capability lookup\n * falls back to `defaultCapabilitiesForUnknown` for suffixed ids.\n */\nexport class HuggingfaceAdapter extends OpenAIAdapter {\n override readonly vendor = huggingfaceManifest.vendor;\n\n override init(auth: ApiKeyAuth, client?: ClientOptions): void {\n super.init(\n {\n ...auth,\n baseURL: auth.baseURL ?? 'https://router.huggingface.co/v1',\n },\n client,\n );\n }\n\n override stream(req: PromptRequest): AsyncIterable<LlmEvent> {\n return streamFromOpenAI(this.ensureClient(), req, {\n knownModels: huggingfaceManifest.knownModels,\n vendorMetadataExtractor: HUGGINGFACE_METADATA_EXTRACTOR,\n });\n }\n}\n","import type { AdapterFactory, ApiKeyAuth } from '../../types.js';\nimport { HuggingfaceAdapter } from './adapter.js';\nimport { huggingfaceManifest } from './manifest.js';\n\nexport const huggingfaceFactory: AdapterFactory<ApiKeyAuth> = {\n vendor: huggingfaceManifest.vendor,\n manifest: huggingfaceManifest,\n create: () => new HuggingfaceAdapter(),\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 {\n openAIFactory,\n deepseekFactory,\n basetenFactory,\n moonshotFactory,\n zaiFactory,\n} 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';\nimport { azureOpenAIFactory } from './azure-openai/index.js';\nimport { groqFactory } from './groq/index.js';\nimport { huggingfaceFactory } from './huggingface/index.js';\n\nregisterAdapter(openAIFactory);\nregisterAdapter(deepseekFactory);\nregisterAdapter(basetenFactory);\nregisterAdapter(moonshotFactory);\nregisterAdapter(zaiFactory);\nregisterAdapter(anthropicFactory);\nregisterAdapter(googleFactory);\nregisterAdapter(vertexGeminiFactory);\nregisterAdapter(vertexOpenAIFactory);\nregisterAdapter(bedrockFactory);\nregisterAdapter(azureOpenAIFactory);\nregisterAdapter(groqFactory);\nregisterAdapter(huggingfaceFactory);\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 * - `pickAuthKind(vendor, rawCred)` to pick the right manifest authKind for\n * a raw credential (used by api-server's `encryptCredential`).\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 AzureOpenAIApiKeyAuth,\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 { pickAuthKind } from './pick-auth-kind.js';\nexport type { RawCredentialLoose } from './pick-auth-kind.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":["OpenAI","Anthropic","buildWireMessages","formatTools","isAbortError","formatTools","isAbortError","usage","mapFinishReason","import_genai","import_openai","init","OpenAI","buildWireMessages","formatTools","isAbortError","mapStopReason","import_openai"]}
|
|
1
|
+
{"version":3,"sources":["../../src/test-kit/index.ts","../../src/test-kit/runner.ts","../../src/registry.ts","../../src/adapters/openai/adapter.ts","../../src/validate.ts","../../src/adapters/openai/_streaming.ts","../../src/adapters/_metadata.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/azure-openai/adapter.ts","../../src/adapters/azure-openai/manifest.ts","../../src/adapters/azure-openai/factory.ts","../../src/adapters/groq/manifest.ts","../../src/adapters/groq/adapter.ts","../../src/adapters/groq/factory.ts","../../src/adapters/huggingface/manifest.ts","../../src/adapters/huggingface/adapter.ts","../../src/adapters/huggingface/factory.ts","../../src/adapters/index.ts","../../src/index.ts","../../src/test-kit/fake-adapter.ts"],"sourcesContent":["/**\n * @jambonz/llm test-kit — contract tests for vendor adapters.\n *\n * Usage from an adapter's test file:\n *\n * import { runContractTests } from '@jambonz/llm/test-kit';\n * import { myAdapterHarness } from './harness.js';\n *\n * runContractTests(myAdapterHarness);\n *\n * The kit registers vitest describe/it blocks internally; importing this\n * module only exposes the runner and harness types.\n */\n\nexport { runContractTests } from './runner.js';\nexport type { CapturedRequest, ContractHarness, ContractScenario } from './types.js';\n\n// Reference fake adapter + harness, used by the kit's own self-check.\n// External adapter authors don't need these — they build a harness for their\n// vendor. But they may find the fake useful as a reference.\nexport { FakeAdapter, createFakeHarness, fakeManifest } from './fake-adapter.js';\nexport type { FakeHarness } from './fake-adapter.js';\n","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 { makeMetadataExtractor } from '../_metadata.js';\nimport { openAIManifest } from './manifest.js';\n\n/**\n * OpenAI response-header diagnostics surfaced as `vendorMetadata` on the\n * `end` event. `request_id` is essential for support tickets;\n * `processing_ms` separates vendor inference time from network time;\n * the rate-limit headers help operators spot when an account is trending\n * toward exhaustion within a single call.\n */\nconst OPENAI_METADATA_EXTRACTOR = makeMetadataExtractor([\n { header: 'x-request-id', key: 'request_id' },\n { header: 'openai-processing-ms', key: 'processing_ms', numeric: true },\n { header: 'x-ratelimit-remaining-requests', key: 'requests_remaining', numeric: true },\n { header: 'x-ratelimit-remaining-tokens', key: 'tokens_remaining', numeric: true },\n]);\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: this.knownModels(),\n vendorMetadataExtractor: OPENAI_METADATA_EXTRACTOR,\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(), this.knownModels());\n }\n\n /**\n * Capability table used to enrich both `stream()` (for tools/vision gating)\n * and `listAvailableModels()` (for filling capability flags on live entries).\n * Subclasses backed by the same OpenAI wire (DeepSeek, Baseten, …) override\n * this so their own manifest entries are consulted instead of OpenAI's.\n */\n protected knownModels(): ReadonlyArray<ModelInfo> {\n return 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 * Which wire parameter to use for the max-output cap. Defaults to a\n * per-request heuristic on `req.model` (see {@link needsMaxCompletionTokens}):\n * OpenAI's o-series reasoning models and gpt-5 family require\n * `max_completion_tokens`; everything else uses legacy `max_tokens`.\n *\n * Override when:\n * - The model id doesn't reflect the underlying model (Azure OpenAI\n * deployment names are arbitrary) — pass `'max_completion_tokens'`.\n * - Talking to an older OpenAI-compat endpoint that only knows\n * `max_tokens` (Vertex Llama MaaS, some local servers) — pass\n * `'max_tokens'` to pin the legacy name.\n */\n tokensParam?: 'max_tokens' | 'max_completion_tokens';\n /**\n * Optional adapter-supplied extractor that pulls vendor-specific\n * diagnostic data off the upstream HTTP response headers (request\n * id, rate-limit remaining, routing info, etc.) and returns it as\n * a flat key/value record.\n *\n * Called once per stream after the underlying `Response` is\n * available (via the OpenAI SDK's `.withResponse()` pattern). The\n * returned record is attached to the `end` event as\n * `vendorMetadata` if non-empty. Each adapter declares its own\n * allowlist — see the `huggingface`, `azure-openai`, `groq` etc.\n * adapters for examples.\n */\n vendorMetadataExtractor?: (\n headers: Headers,\n ) => Record<string, string | 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) {\n const param =\n options.tokensParam ??\n (needsMaxCompletionTokens(req.model) ? 'max_completion_tokens' : 'max_tokens');\n (body as unknown as Record<string, unknown>)[param] = effectiveMaxTokens;\n }\n\n // hrtime markers for client-side timing breakdown attached to the end event:\n // t0 = before SDK call\n // t1 = response headers received (after withResponse resolves)\n // t2 = first content token yielded back to caller\n // `clientTiming` is omitted when t1 was never reached (error before headers).\n const t0 = process.hrtime.bigint();\n let t1: bigint | undefined;\n let t2: bigint | undefined;\n\n let stream;\n let responseHeaders: Headers | undefined;\n try {\n // Production: `.withResponse()` on the OpenAI SDK's APIPromise surfaces\n // the underlying HTTP `Response` so adapters that supply a\n // `vendorMetadataExtractor` can read response headers. Test mocks\n // typically return the stream directly (no APIPromise wrapper); fall\n // through to a plain await when `.withResponse` isn't present, so\n // existing test infrastructure keeps working unchanged.\n const apiPromise = client.chat.completions.create(body, { signal: req.signal });\n const maybeWithResponse = (apiPromise as unknown as {\n withResponse?: () => Promise<{\n data: Awaited<typeof apiPromise>;\n response: { headers?: Headers };\n }>;\n }).withResponse;\n if (typeof maybeWithResponse === 'function') {\n const result = await maybeWithResponse.call(apiPromise);\n stream = result.data;\n responseHeaders = result.response?.headers;\n } else {\n stream = await apiPromise;\n }\n t1 = process.hrtime.bigint();\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 let sawContent = false;\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 // Some OpenAI-compatible backends report failures as a single SSE event\n // carrying a top-level `error` (instead of a non-2xx status the SDK would\n // throw on). Surface it rather than silently ending with no output.\n const chunkError = (chunk as { error?: unknown }).error;\n if (chunkError) {\n const message =\n chunkError && typeof chunkError === 'object' && 'message' in chunkError\n ? String((chunkError as { message?: unknown }).message)\n : JSON.stringify(chunkError);\n throw new Error(`OpenAI-compatible stream returned an error: ${message}`);\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 if (t2 === undefined) t2 = process.hrtime.bigint();\n sawContent = true;\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 // A valid completion stream always emits at least a finish_reason. If we got\n // through the whole stream with no content, no tool calls, no usage, and no\n // finish reason, the response was not a real completion — typically a\n // misconfigured base URL or a vendor error returned inside an HTTP 200 body\n // (which the SDK does not treat as an error). Fail loudly instead of\n // returning a silent empty turn that a caller would forward to TTS.\n const producedNothing =\n finalFinishReason === null &&\n !sawContent &&\n toolCallsEmitted.size === 0 &&\n startedIds.size === 0 &&\n usage === undefined;\n if (producedNothing) {\n throw new Error(\n 'OpenAI-compatible stream produced no data (no content, tool calls, usage, or finish ' +\n 'reason). This usually means a misconfigured base URL or a vendor error returned in an ' +\n 'HTTP 200 body. Verify the base URL and credentials.',\n );\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\n if (options.vendorMetadataExtractor && responseHeaders) {\n const metadata = options.vendorMetadataExtractor(responseHeaders);\n if (metadata && Object.keys(metadata).length > 0) {\n endEvent.vendorMetadata = metadata;\n }\n }\n\n if (t1 !== undefined) {\n const t3 = process.hrtime.bigint();\n endEvent.clientTiming = {\n requestToHeadersMs: Number(t1 - t0) / 1e6,\n ...(t2 !== undefined\n ? { headersToFirstTokenMs: Number(t2 - t1) / 1e6 }\n : {}),\n totalMs: Number(t3 - t0) / 1e6,\n };\n }\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\n/**\n * Does this model id require `max_completion_tokens` instead of legacy\n * `max_tokens`? OpenAI's reasoning family (o1, o3, o4) and gpt-5 dropped\n * `max_tokens` and return a 400 `Unsupported parameter` when it's sent.\n * Older chat models (gpt-4, gpt-4o, gpt-3.5-turbo) still accept `max_tokens`,\n * so we only switch when the model id matches the newer prefixes.\n *\n * Exposed so adapter authors (and tests) can rely on the same heuristic.\n */\nexport function needsMaxCompletionTokens(modelId: string): boolean {\n return /^(o\\d|gpt-5)/i.test(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","/**\n * Shared helpers for vendor-metadata extractors.\n *\n * Each adapter that wants to surface response-header diagnostics (request\n * id, rate-limit remaining, routing/region, vendor processing time, cache\n * counts) declares an allowlist of `header-name` → `output-key` pairs\n * here. The extractor walks the allowlist, reads each header, parses\n * numeric values, and returns a flat record. Empty/absent headers are\n * dropped — never emit `null`.\n *\n * Output shape is `Record<string, string | number>` so consumers\n * (feature-server, webapp) can render it as a key/value table without\n * per-vendor knowledge.\n */\n\nexport interface MetadataField {\n /** Lowercase HTTP header name to read. */\n header: string;\n /** Key under which the value is exposed in `vendorMetadata`. */\n key: string;\n /** Parse numeric values to `number` instead of leaving as `string`. */\n numeric?: boolean;\n}\n\n/**\n * Build a `vendorMetadataExtractor` from a static field list. Adapters\n * import this and pass the result to `streamFromOpenAI` (or call directly\n * for native-SDK adapters).\n */\nexport function makeMetadataExtractor(\n fields: ReadonlyArray<MetadataField>,\n): (headers: Headers) => Record<string, string | number> {\n return (headers: Headers) => {\n const out: Record<string, string | number> = {};\n for (const f of fields) {\n const raw = headers.get(f.header);\n if (raw === null || raw === undefined || raw === '') continue;\n if (f.numeric) {\n const n = Number(raw);\n if (Number.isFinite(n)) out[f.key] = n;\n } else {\n out[f.key] = raw;\n }\n }\n return out;\n };\n}\n\n/**\n * Convenience: run the extractor against a generic header source (a\n * `Headers` instance, a record, or AWS-SDK-style `httpHeaders`) by\n * normalizing first. Used by native-SDK adapters whose response shapes\n * don't expose a real `Headers` object.\n */\nexport function extractMetadata(\n fields: ReadonlyArray<MetadataField>,\n headers: Record<string, string | string[] | undefined> | Headers,\n): Record<string, string | number> {\n const headersInstance =\n headers instanceof Headers ? headers : recordToHeaders(headers);\n return makeMetadataExtractor(fields)(headersInstance);\n}\n\nfunction recordToHeaders(\n record: Record<string, string | string[] | undefined>,\n): Headers {\n const h = new Headers();\n for (const [name, value] of Object.entries(record)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n for (const v of value) h.append(name, v);\n } else {\n h.set(name, value);\n }\n }\n return h;\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 protected override knownModels() {\n return deepseekManifest.knownModels;\n }\n}\n\nexport const deepseekFactory: AdapterFactory<ApiKeyAuth> = {\n vendor: deepseekManifest.vendor,\n manifest: deepseekManifest,\n create: () => new DeepSeekAdapter(),\n};\n\n/**\n * Baseten alias factory. Wraps the OpenAI adapter but advertises itself as\n * `baseten` and ships a Baseten-specific manifest (different default\n * `baseURL`, different known models, different docsUrl).\n *\n * Baseten exposes two OpenAI-compatible surfaces:\n * - Model APIs (default): `https://inference.baseten.co/v1` — shared,\n * curated catalog (DeepSeek, GLM, Kimi, GPT-OSS, etc.). `/v1/models`\n * returns the live catalog.\n * - Bridge / Direct: `https://bridge.baseten.co/v1/direct` — routes to a\n * user's dedicated deployment. Users override `baseURL` for this case.\n *\n * Consumers call `createLlm({vendor: 'baseten', auth: {kind: 'apiKey', apiKey}})`\n * and get the OpenAI wire adapter pointed at the Baseten endpoint.\n */\nconst basetenManifest: AdapterManifest = {\n vendor: 'baseten',\n displayName: 'Baseten',\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://app.baseten.co/settings/api_keys',\n },\n {\n name: 'baseURL',\n label: 'Base URL',\n type: 'url',\n required: false,\n default: 'https://inference.baseten.co/v1',\n help: 'Defaults to Baseten Model APIs. Set to https://bridge.baseten.co/v1/direct to route to a dedicated deployment.',\n },\n ],\n },\n ],\n knownModels: [\n {\n id: 'deepseek-ai/DeepSeek-V3.1',\n displayName: 'DeepSeek V3.1',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 163_840,\n },\n },\n {\n id: 'deepseek-ai/DeepSeek-V4-Pro',\n displayName: 'DeepSeek V4 Pro',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 131_072,\n },\n },\n {\n id: 'zai-org/GLM-4.7',\n displayName: 'GLM 4.7',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n },\n {\n id: 'zai-org/GLM-5',\n displayName: 'GLM 5',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 202_800,\n },\n },\n {\n id: 'moonshotai/Kimi-K2.5',\n displayName: 'Kimi K2.5',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 262_000,\n },\n },\n {\n id: 'moonshotai/Kimi-K2.6',\n displayName: 'Kimi K2.6',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 262_000,\n },\n },\n {\n id: 'MiniMaxAI/MiniMax-M2.5',\n displayName: 'MiniMax M2.5',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 204_000,\n },\n },\n {\n id: 'nvidia/Nemotron-120B-A12B',\n displayName: 'Nemotron Super',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 202_800,\n },\n },\n {\n id: 'openai/gpt-oss-120b',\n displayName: 'OpenAI GPT 120B',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_072,\n },\n },\n ],\n supportsModelListing: true,\n docsUrl: 'https://docs.baseten.co/inference/model-apis/overview',\n};\n\nclass BasetenAdapter extends OpenAIAdapter {\n readonly vendor = basetenManifest.vendor;\n\n override init(auth: ApiKeyAuth, client?: Parameters<OpenAIAdapter['init']>[1]): void {\n super.init(\n {\n ...auth,\n baseURL: auth.baseURL ?? 'https://inference.baseten.co/v1',\n },\n client,\n );\n }\n\n protected override knownModels() {\n return basetenManifest.knownModels;\n }\n}\n\nexport const basetenFactory: AdapterFactory<ApiKeyAuth> = {\n vendor: basetenManifest.vendor,\n manifest: basetenManifest,\n create: () => new BasetenAdapter(),\n};\n\n/**\n * Moonshot (Kimi) alias factory. Moonshot exposes an OpenAI-compatible\n * Chat Completions surface; the only differences from OpenAI are the default\n * `baseURL` and the model catalog.\n *\n * Note: Moonshot serves a global endpoint (`api.moonshot.ai`) and a China\n * endpoint (`api.moonshot.cn`). We default to the global one; users override\n * `baseURL` for `.cn`. Moonshot only accepts the `tools` calling format (the\n * deprecated `functions` param is unsupported), which is what we already emit.\n *\n * Consumers call `createLlm({vendor: 'moonshot', auth: {kind: 'apiKey', apiKey}})`.\n */\nconst moonshotManifest: AdapterManifest = {\n vendor: 'moonshot',\n displayName: 'Moonshot (Kimi)',\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.moonshot.ai/console/api-keys',\n },\n {\n name: 'baseURL',\n label: 'Base URL',\n type: 'url',\n required: false,\n default: 'https://api.moonshot.ai/v1',\n help: 'Defaults to the global endpoint. Set to https://api.moonshot.cn/v1 for the China endpoint.',\n },\n ],\n },\n ],\n knownModels: [\n {\n id: 'kimi-k2.6',\n displayName: 'Kimi K2.6',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 262_144,\n },\n },\n {\n id: 'kimi-k2.5',\n displayName: 'Kimi K2.5',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 262_144,\n },\n },\n ],\n supportsModelListing: true,\n docsUrl: 'https://platform.moonshot.ai/docs',\n};\n\nclass MoonshotAdapter extends OpenAIAdapter {\n readonly vendor = moonshotManifest.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.moonshot.ai/v1',\n },\n client,\n );\n }\n\n protected override knownModels() {\n return moonshotManifest.knownModels;\n }\n}\n\nexport const moonshotFactory: AdapterFactory<ApiKeyAuth> = {\n vendor: moonshotManifest.vendor,\n manifest: moonshotManifest,\n create: () => new MoonshotAdapter(),\n};\n\n/**\n * Z.ai (GLM) alias factory. Z.ai's `/api/paas/v4` surface is OpenAI-compatible\n * for chat completions (it accepts the OpenAI request shape and is what the\n * OpenAI SDK should target as its baseURL). Note there is NO OpenAI-style\n * `/models` listing endpoint, so `supportsModelListing` is false and we serve\n * the static known-models list.\n *\n * Note: Coding-Plan subscriptions are served from a *different* endpoint\n * (`https://api.z.ai/api/coding/paas/v4`), not the general one. Users on a\n * Coding Plan must override `baseURL` accordingly.\n *\n * Consumers call `createLlm({vendor: 'zai', auth: {kind: 'apiKey', apiKey}})`.\n */\nconst zaiManifest: AdapterManifest = {\n vendor: 'zai',\n displayName: 'Z.ai (GLM)',\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://z.ai/manage-apikey/apikey-list',\n },\n {\n name: 'baseURL',\n label: 'Base URL',\n type: 'url',\n required: false,\n default: 'https://api.z.ai/api/paas/v4',\n help: 'Defaults to the general API. Coding-Plan keys must use https://api.z.ai/api/coding/paas/v4.',\n },\n ],\n },\n ],\n knownModels: [\n {\n id: 'glm-5.2',\n displayName: 'GLM-5.2',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'glm-4.7',\n displayName: 'GLM-4.7',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 200_000,\n },\n },\n ],\n supportsModelListing: false,\n docsUrl: 'https://docs.z.ai/',\n};\n\nclass ZaiAdapter extends OpenAIAdapter {\n readonly vendor = zaiManifest.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.z.ai/api/paas/v4',\n },\n client,\n );\n }\n\n protected override knownModels() {\n return zaiManifest.knownModels;\n }\n}\n\nexport const zaiFactory: AdapterFactory<ApiKeyAuth> = {\n vendor: zaiManifest.vendor,\n manifest: zaiManifest,\n create: () => new ZaiAdapter(),\n};\n\n/**\n * xAI (Grok) alias factory. xAI serves an OpenAI-compatible Chat Completions\n * surface; the only differences from OpenAI are the default `baseURL` and\n * the model catalog.\n *\n * Consumers call `createLlm({vendor: 'xai', auth: {kind: 'apiKey', apiKey}})`.\n */\nconst xaiManifest: AdapterManifest = {\n vendor: 'xai',\n displayName: 'xAI (Grok)',\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.x.ai/team/default/api-keys',\n },\n {\n name: 'baseURL',\n label: 'Base URL',\n type: 'url',\n required: false,\n default: 'https://api.x.ai/v1',\n help: 'Override for proxy endpoints. Defaults to xAI production.',\n },\n ],\n },\n ],\n knownModels: [\n {\n id: 'grok-4.3',\n displayName: 'Grok 4.3',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'grok-4.20-0309-reasoning',\n displayName: 'Grok 4.20 (Reasoning)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'grok-4.20-0309-non-reasoning',\n displayName: 'Grok 4.20 (Non-Reasoning)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n {\n id: 'grok-4.20-multi-agent-0309',\n displayName: 'Grok 4.20 Multi-Agent',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 1_000_000,\n },\n },\n ],\n supportsModelListing: true,\n docsUrl: 'https://docs.x.ai/',\n};\n\nclass XaiAdapter extends OpenAIAdapter {\n readonly vendor = xaiManifest.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.x.ai/v1',\n },\n client,\n );\n }\n\n protected override knownModels() {\n return xaiManifest.knownModels;\n }\n}\n\nexport const xaiFactory: AdapterFactory<ApiKeyAuth> = {\n vendor: xaiManifest.vendor,\n manifest: xaiManifest,\n create: () => new XaiAdapter(),\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 { makeMetadataExtractor } from '../_metadata.js';\nimport { anthropicManifest } from './manifest.js';\n\n/**\n * Anthropic response-header diagnostics. `request-id` is the support-ticket\n * id; the rate-limit headers help operators see when an account is\n * approaching limits across turns within a call.\n */\nconst ANTHROPIC_METADATA_EXTRACTOR = makeMetadataExtractor([\n { header: 'request-id', key: 'request_id' },\n { header: 'anthropic-ratelimit-requests-remaining', key: 'requests_remaining', numeric: true },\n { header: 'anthropic-ratelimit-input-tokens-remaining', key: 'input_tokens_remaining', numeric: true },\n { header: 'anthropic-ratelimit-output-tokens-remaining', key: 'output_tokens_remaining', numeric: true },\n]);\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 let responseHeaders: Headers | undefined;\n try {\n // Production: `.withResponse()` on the Anthropic SDK's APIPromise\n // exposes the underlying HTTP `Response` for header diagnostics.\n // Test mocks return the stream directly with no APIPromise wrapper;\n // fall through to plain await when `.withResponse` isn't present.\n const apiPromise = client.messages.create(\n body as unknown as Parameters<typeof client.messages.create>[0],\n { signal: req.signal },\n );\n const maybeWithResponse = (apiPromise as unknown as {\n withResponse?: () => Promise<{\n data: Awaited<typeof apiPromise>;\n response: { headers?: Headers };\n }>;\n }).withResponse;\n if (typeof maybeWithResponse === 'function') {\n const result = await maybeWithResponse.call(apiPromise);\n stream = result.data;\n responseHeaders = result.response?.headers;\n } else {\n stream = await apiPromise;\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\n if (responseHeaders) {\n const metadata = ANTHROPIC_METADATA_EXTRACTOR(responseHeaders);\n if (Object.keys(metadata).length > 0) {\n endEvent.vendorMetadata = metadata;\n }\n }\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 { makeMetadataExtractor } from '../_metadata.js';\nimport { vertexOpenAIManifest } from './manifest.js';\n\n/**\n * Vertex partner-model response-header diagnostics. Sparse —\n * Google's compat layer mostly returns standard request id and\n * little else useful for client-side observability.\n */\nconst VERTEX_OPENAI_METADATA_EXTRACTOR = makeMetadataExtractor([\n { header: 'x-request-id', key: 'request_id' },\n]);\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 const response = await fetch(input, { ...init, headers });\n if (!response.ok) {\n return surfaceErrorBody(response, input);\n }\n return response;\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 // Pin legacy `max_tokens`: Vertex's OpenAI-compat partner-model\n // endpoint predates `max_completion_tokens` and may not recognize it.\n // The model-id heuristic wouldn't catch a partner model named in the\n // OpenAI style (unlikely today, but defensive).\n tokensParam: 'max_tokens',\n vendorMetadataExtractor: VERTEX_OPENAI_METADATA_EXTRACTOR,\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\n/**\n * On a non-2xx response, read the Vertex error body and reconstruct the\n * Response so the OpenAI SDK can include the body in its thrown error.\n *\n * Why this is necessary: the OpenAI SDK v6 drops the body on some error\n * responses (the ones delivered gzipped, which Vertex does) — callers see\n * \"404 status code (no body)\" with no indication of root cause. Vertex's\n * real body for the model-in-wrong-region case carries useful text naming\n * the model and region. Reading the body here (before the SDK's parser gets\n * it) lets us pass it through as plain text; the SDK then surfaces it\n * verbatim in `err.message`.\n */\nasync function surfaceErrorBody(\n response: Response,\n input: Parameters<typeof fetch>[0],\n): Promise<Response> {\n let body = '';\n try {\n body = await response.text();\n } catch {\n // Body already consumed or unreadable — fall through with empty body.\n }\n\n const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;\n const hint =\n response.status === 404 && !body\n ? ' (no body returned — most commonly means the requested model is not hosted in this region; ' +\n 'check Google\\'s partner-model availability matrix)'\n : '';\n\n // Log so operators see the full vendor text in api-server / feature-server\n // logs regardless of how the thrown error is formatted downstream.\n if (typeof console !== 'undefined' && console.warn) {\n console.warn(\n `[vertex-openai] ${response.status} ${response.statusText} from ${url}: ` +\n `${body || '(empty body)'}${hint}`,\n );\n }\n\n // Vertex wraps errors in a single-element JSON array: `[{error: {...}}]`.\n // The OpenAI SDK expects a bare object `{error: {...}}`, so when parsing\n // the array it fails to find `.error` and throws \"no body\". Unwrap the\n // array so the SDK's error.message carries the vendor's own text.\n const normalizedBody = unwrapVertexErrorArray(body) + hint;\n\n // Drop encoding headers so the SDK doesn't try to decompress plain text.\n const headers = new Headers(response.headers);\n headers.delete('content-encoding');\n headers.delete('content-length');\n\n return new Response(normalizedBody, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\nfunction unwrapVertexErrorArray(body: string): string {\n if (!body) return body;\n const trimmed = body.trim();\n if (!trimmed.startsWith('[')) return body;\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed) && parsed.length === 1 && parsed[0]?.error) {\n return JSON.stringify(parsed[0]);\n }\n } catch {\n // not JSON; leave as-is\n }\n return body;\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 // Same region set as vertex-gemini plus us-east5 (where Google\n // hosts Llama partner models). Partner-model availability varies\n // per region; Google's docs for each model are the source of truth.\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-east5', label: 'us-east5' },\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_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 { extractMetadata } from '../_metadata.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\n // Bedrock-specific response-header diagnostics. AWS surfaces them on\n // `response.$metadata.httpHeaders` rather than a standards-compliant\n // `Headers` instance — and the AWS SDK's TypeScript types don't include\n // the field, so cast through unknown. Useful signals:\n // `x-amzn-bedrock-invocation-latency` (vendor-side latency),\n // `x-amzn-bedrock-cache-{read,write}-input-token-count` (prompt-cache\n // effectiveness), `x-amzn-bedrock-trace-id` (support tickets).\n const httpHeaders = (response.$metadata as unknown as\n | { httpHeaders?: Record<string, string> }\n | undefined)?.httpHeaders;\n if (httpHeaders) {\n const metadata = extractMetadata(\n [\n { header: 'x-amzn-bedrock-invocation-latency', key: 'invocation_latency_ms', numeric: true },\n { header: 'x-amzn-bedrock-cache-read-input-token-count', key: 'cache_read_input_tokens', numeric: true },\n { header: 'x-amzn-bedrock-cache-write-input-token-count', key: 'cache_write_input_tokens', numeric: true },\n { header: 'x-amzn-bedrock-trace-id', key: 'trace_id' },\n ],\n httpHeaders,\n );\n if (Object.keys(metadata).length > 0) {\n endEvent.vendorMetadata = metadata;\n }\n }\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 deprecated: true,\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","import { AzureOpenAI } from 'openai';\nimport type {\n AzureOpenAIApiKeyAuth,\n ClientOptions,\n LlmAdapter,\n LlmEvent,\n Message,\n ModelInfo,\n PromptRequest,\n ToolCallEvent,\n} from '../../types.js';\nimport {\n appendOpenAIAssistantToolCall,\n appendOpenAIToolResult,\n streamFromOpenAI,\n} from '../openai/_streaming.js';\nimport { makeMetadataExtractor } from '../_metadata.js';\nimport { azureOpenAIManifest } from './manifest.js';\n\n/**\n * Azure OpenAI response-header diagnostics.\n *\n * `x-ms-region` confirms which datacenter served (operators sometimes\n * provision multi-region deployments and want to verify routing).\n * `x-ms-deployment-name` confirms the deployment that served — useful\n * because Azure deployment names are arbitrary user strings and a\n * misconfigured credential could be pointed at a different deployment\n * than expected. `apim-request-id` is for support tickets;\n * `azureml-model-session` is the underlying model session id.\n */\nconst AZURE_OPENAI_METADATA_EXTRACTOR = makeMetadataExtractor([\n { header: 'x-ms-region', key: 'region' },\n { header: 'x-ms-deployment-name', key: 'deployment' },\n { header: 'apim-request-id', key: 'request_id' },\n { header: 'azureml-model-session', key: 'model_session' },\n { header: 'x-ratelimit-remaining-requests', key: 'requests_remaining', numeric: true },\n { header: 'x-ratelimit-remaining-tokens', key: 'tokens_remaining', numeric: true },\n]);\n\n/**\n * Adapter for Azure OpenAI Service.\n *\n * Azure speaks an OpenAI-compatible wire protocol for chat completions, so the\n * adapter reuses `streamFromOpenAI` / `appendOpenAI*` from the OpenAI adapter.\n * What differs is client construction:\n * - Auth is an `api-key` header, not `Authorization: Bearer`.\n * - The URL embeds the *deployment* name, not the model id:\n * `https://{endpoint}/openai/deployments/{deployment}/chat/completions?api-version={version}`\n * - The `model` field on the wire is ignored by Azure — the deployment in the\n * URL determines which model runs.\n *\n * The `AzureOpenAI` class exported from the `openai` SDK handles all three\n * quirks for us. It extends `OpenAI`, so passing it to `streamFromOpenAI()`\n * works without translation.\n */\nexport class AzureOpenAIAdapter implements LlmAdapter<AzureOpenAIApiKeyAuth> {\n readonly vendor = azureOpenAIManifest.vendor;\n readonly acceptedAuth = ['azureOpenAIApiKey'] as const;\n\n private client: AzureOpenAI | undefined;\n\n init(auth: AzureOpenAIApiKeyAuth, client?: ClientOptions): void {\n if (auth.kind !== 'azureOpenAIApiKey') {\n throw new Error(\n `AzureOpenAIAdapter: unsupported auth kind '${(auth as { kind: string }).kind}'`,\n );\n }\n if (!auth.apiKey) {\n throw new Error('AzureOpenAIAdapter: apiKey is required');\n }\n if (!auth.endpoint) {\n throw new Error('AzureOpenAIAdapter: endpoint is required');\n }\n if (!auth.deployment) {\n throw new Error('AzureOpenAIAdapter: deployment is required');\n }\n if (!auth.apiVersion) {\n throw new Error('AzureOpenAIAdapter: apiVersion is required');\n }\n\n this.client = new AzureOpenAI({\n apiKey: auth.apiKey,\n endpoint: auth.endpoint,\n apiVersion: auth.apiVersion,\n deployment: auth.deployment,\n ...(client?.timeout !== undefined ? { timeout: client.timeout } : {}),\n ...(client?.maxRetries !== undefined ? { maxRetries: client.maxRetries } : {}),\n });\n }\n\n stream(req: PromptRequest): AsyncIterable<LlmEvent> {\n // Azure deployment names are arbitrary user strings (e.g. `prod-gpt-4o`,\n // `my-assistant`, `gpt-5.4-mini`) — the model-id heuristic in\n // streamFromOpenAI can't see the underlying model, so pin the newer\n // parameter name. Microsoft's current Azure OpenAI backend accepts\n // `max_completion_tokens` for gpt-4o-family and requires it for\n // gpt-5-family / o-series reasoning models.\n return streamFromOpenAI(this.ensureClient(), req, {\n knownModels: azureOpenAIManifest.knownModels,\n tokensParam: 'max_completion_tokens',\n vendorMetadataExtractor: AZURE_OPENAI_METADATA_EXTRACTOR,\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 // Azure's data-plane API doesn't expose a list-models endpoint; deployment\n // listing lives on the control plane (ARM) and requires AAD. Return the\n // manifest's curated set.\n return [...azureOpenAIManifest.knownModels];\n }\n\n async testCredential(): Promise<void> {\n // No cheap authenticated GET available on the data plane — `/models` on\n // Azure returns the account's deployments only if the key has the right\n // role, and is 404 on many configurations. A minimal chat-completions\n // call is the reliable probe: success proves the api-key authenticates\n // AND that the endpoint+deployment+api-version combination resolves.\n const client = this.ensureClient();\n await client.chat.completions.create({\n // Azure ignores `model` when a deployment is in the URL, but the SDK\n // still requires it as a parameter.\n model: 'probe',\n messages: [{ role: 'user', content: 'ping' }],\n // Use `max_completion_tokens` (not legacy `max_tokens`): gpt-5 family\n // and o-series reasoning models return 400 on the legacy parameter.\n // The newer name is a superset — also accepted by gpt-4o, gpt-4-turbo,\n // and gpt-3.5-turbo deployments — so it's the safe choice for a probe\n // that has to work regardless of the underlying deployment model.\n //\n // 256 (not 1): reasoning models consume reasoning tokens BEFORE\n // visible output, all counted against this cap. With 1 the model\n // can't produce any output and Azure returns\n // `400 Could not finish the message because max_tokens or model\n // output limit was reached`. 256 is comfortable headroom for\n // reasoning + a \"pong\"-sized reply on every model we ship in the\n // manifest, while still bounded so the probe can't run away on a\n // misconfigured deployment.\n max_completion_tokens: 256,\n stream: false,\n } as Parameters<typeof client.chat.completions.create>[0]);\n }\n\n async warmup(): Promise<void> {\n // No idempotent cheap endpoint on the data plane. No-op.\n }\n\n private ensureClient(): AzureOpenAI {\n if (!this.client) {\n throw new Error(\n 'AzureOpenAIAdapter: 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 models that customers commonly deploy to Azure OpenAI Service.\n *\n * Unlike `api.openai.com`, Azure doesn't pick the model from the `model`\n * request field — the deployment name in the URL determines which model runs.\n * The manifest's model list is therefore keyed by the underlying *model* so\n * capability flags can be looked up by whichever model the user's deployment\n * points at. Common Azure deployment names mirror the model id (e.g. a\n * deployment called `gpt-4o` running `gpt-4o`), but customers may use arbitrary\n * names like `prod-chat` or `my-assistant` — that's fine; capability flags\n * default to something reasonable if the deployment name doesn't match.\n *\n * Azure's fine-tune deployments and private-preview model ids are out of scope.\n */\nconst AZURE_OPENAI_KNOWN_MODELS: ModelInfo[] = [\n {\n id: 'gpt-4o',\n displayName: 'GPT-4o (on Azure)',\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 (on Azure)',\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 (on Azure)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: true,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n // Azure spells it `gpt-35-turbo` (no dot). Keep their spelling for the id\n // so capability lookups against deployment names that echo the Azure id\n // hit.\n id: 'gpt-35-turbo',\n displayName: 'GPT-3.5 Turbo (on Azure)',\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 (on Azure)',\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 (on Azure)',\n capabilities: {\n streaming: false,\n tools: false,\n vision: false,\n systemPrompt: false,\n maxContextTokens: 128_000,\n },\n },\n];\n\nexport const azureOpenAIManifest: AdapterManifest = {\n vendor: 'azure-openai',\n displayName: 'Azure OpenAI',\n authKinds: [\n {\n kind: 'azureOpenAIApiKey',\n displayName: 'API Key',\n fields: [\n {\n name: 'apiKey',\n label: 'API Key',\n type: 'password',\n required: true,\n help:\n 'In Azure AI Foundry, open the deployment and copy the Key from ' +\n 'the Endpoint panel (eye icon to reveal). Same key is shown in ' +\n 'the Azure portal under your OpenAI resource → Keys and Endpoint.',\n },\n {\n name: 'endpoint',\n label: 'Endpoint',\n type: 'url',\n required: true,\n help:\n 'Resource hostname only — no path, no query string. Example: ' +\n 'https://my-resource.openai.azure.com. The Foundry deployment ' +\n 'page shows a Target URI like ' +\n 'https://my-resource.openai.azure.com/openai/responses?api-version=… ' +\n 'Strip everything from /openai/ onward and paste only the part ' +\n 'before it.',\n },\n {\n name: 'deployment',\n label: 'Deployment Name',\n type: 'text',\n required: true,\n help:\n 'The Name shown at the top of the deployment page in Azure AI ' +\n 'Foundry (also under Deployment info → Name). NOT the underlying ' +\n 'model id — deployments can be named anything you chose at create time.',\n },\n {\n name: 'apiVersion',\n label: 'API Version',\n type: 'text',\n required: true,\n default: '2025-03-01-preview',\n help:\n 'Data-plane api-version. Visible in Foundry as the ?api-version=… ' +\n 'query string in the Target URI, or the api_version=… line in the ' +\n 'Python sample. The default 2025-03-01-preview is the minimum that ' +\n 'works with gpt-5 / o-series deployments — Azure routes those ' +\n 'through the Responses API internally and rejects older versions.',\n },\n ],\n },\n ],\n knownModels: AZURE_OPENAI_KNOWN_MODELS,\n // Azure's list-deployments endpoint is on the control plane (ARM) and\n // requires AAD credentials the data-plane API key doesn't carry. Return\n // the curated set from the manifest.\n supportsModelListing: false,\n docsUrl: 'https://learn.microsoft.com/en-us/azure/ai-services/openai/reference',\n};\n","import type { AdapterFactory, AzureOpenAIApiKeyAuth } from '../../types.js';\nimport { AzureOpenAIAdapter } from './adapter.js';\nimport { azureOpenAIManifest } from './manifest.js';\n\nexport const azureOpenAIFactory: AdapterFactory<AzureOpenAIApiKeyAuth> = {\n vendor: azureOpenAIManifest.vendor,\n manifest: azureOpenAIManifest,\n create: () => new AzureOpenAIAdapter(),\n};\n","import type { AdapterManifest, ModelInfo } from '../../types.js';\n\n/**\n * Curated production-recommended Groq models. The live `/openai/v1/models`\n * endpoint returns the full catalog (which churns frequently); this list\n * seeds the admin-UI dropdown and capability flags.\n *\n * All entries here are tool-capable — Groq's catalog also includes\n * vision-only and safety-classifier models that we deliberately exclude\n * from the curated set because they don't make sense as the primary LLM\n * for a voice agent.\n */\nconst GROQ_KNOWN_MODELS: ModelInfo[] = [\n {\n id: 'llama-3.3-70b-versatile',\n displayName: 'Llama 3.3 70B Versatile (Groq)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'llama-3.1-8b-instant',\n displayName: 'Llama 3.1 8B Instant (Groq)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'gemma2-9b-it',\n displayName: 'Gemma 2 9B (Groq)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 8_192,\n },\n },\n];\n\nexport const groqManifest: AdapterManifest = {\n vendor: 'groq',\n displayName: 'Groq',\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.groq.com/keys (sign in first if needed)',\n },\n {\n name: 'baseURL',\n label: 'Base URL',\n type: 'url',\n required: false,\n default: 'https://api.groq.com/openai/v1',\n help:\n 'Override only for proxies. Default points at Groq\\'s production endpoint.',\n },\n ],\n },\n ],\n knownModels: GROQ_KNOWN_MODELS,\n // Groq exposes /openai/v1/models with the same auth as chat completions.\n supportsModelListing: true,\n docsUrl: 'https://console.groq.com/docs/api-reference',\n};\n","import { OpenAIAdapter } from '../openai/adapter.js';\nimport { streamFromOpenAI } from '../openai/_streaming.js';\nimport type { ApiKeyAuth, ClientOptions, LlmEvent, PromptRequest } from '../../types.js';\nimport { makeMetadataExtractor } from '../_metadata.js';\nimport { groqManifest } from './manifest.js';\n\n/**\n * Groq response-header diagnostics. `x-groq-region` names the Groq\n * datacenter that served the request — useful for latency analysis.\n * `openai-processing-ms` is forwarded by Groq (they're OpenAI-wire-\n * compatible) and reports their server-side processing time, which\n * can be compared against wall-clock to spot infrastructure queueing\n * not counted in the model-server timer. Rate-limit headers help\n * operators spot when a workload is trending toward exhaustion\n * across turns within a call.\n */\nconst GROQ_METADATA_EXTRACTOR = makeMetadataExtractor([\n { header: 'x-request-id', key: 'request_id' },\n { header: 'x-groq-region', key: 'region' },\n { header: 'openai-processing-ms', key: 'processing_ms', numeric: true },\n { header: 'x-ratelimit-remaining-requests', key: 'requests_remaining', numeric: true },\n { header: 'x-ratelimit-remaining-tokens', key: 'tokens_remaining', numeric: true },\n]);\n\n/**\n * Adapter for Groq.\n *\n * Groq's chat-completions endpoint is OpenAI-wire-compatible — same request\n * shape, same streaming SSE, same tool-call format. The adapter is therefore\n * a thin subclass of `OpenAIAdapter` that defaults the `baseURL` to\n * `https://api.groq.com/openai/v1`. All wire translation, tool-call\n * accumulation, abort handling, and history round-tripping live in the\n * shared `streamFromOpenAI` helper.\n *\n * Why a separate class (vs. an inline alias like `DeepSeekAdapter` in\n * openai/factory.ts): keeps the manifest, README, and any future\n * Groq-specific quirks co-located in `src/adapters/groq/`. The DeepSeek\n * inline alias is a legacy shape; new vendors get their own directory.\n */\nexport class GroqAdapter extends OpenAIAdapter {\n override readonly vendor = groqManifest.vendor;\n\n override init(auth: ApiKeyAuth, client?: ClientOptions): void {\n super.init(\n {\n ...auth,\n baseURL: auth.baseURL ?? 'https://api.groq.com/openai/v1',\n },\n client,\n );\n }\n\n override stream(req: PromptRequest): AsyncIterable<LlmEvent> {\n // Override so we can pass Groq's own metadata extractor; otherwise\n // we'd inherit OpenAI's, which misses `x-groq-region`.\n return streamFromOpenAI(this.ensureClient(), req, {\n knownModels: groqManifest.knownModels,\n vendorMetadataExtractor: GROQ_METADATA_EXTRACTOR,\n });\n }\n}\n","import type { AdapterFactory, ApiKeyAuth } from '../../types.js';\nimport { GroqAdapter } from './adapter.js';\nimport { groqManifest } from './manifest.js';\n\nexport const groqFactory: AdapterFactory<ApiKeyAuth> = {\n vendor: groqManifest.vendor,\n manifest: groqManifest,\n create: () => new GroqAdapter(),\n};\n","import type { AdapterManifest, ModelInfo } from '../../types.js';\n\n/**\n * Curated HuggingFace Inference Providers `knownModels`.\n *\n * Keyed by canonical HF model id (`<org>/<model>`). Customers can append a\n * `:provider-name` (`:fireworks-ai`, `:cerebras`, `:nebius`, etc.) or\n * `:fastest` suffix at request time to influence routing — those suffixed\n * variants are NOT enumerated here because the suffixed id is just a\n * routing hint, not a different model. The library's\n * `defaultCapabilitiesForUnknown` returns sensible defaults for any\n * suffixed id the heuristic doesn't recognize.\n *\n * The full live catalog is available via `listAvailableModels()` against\n * `/v1/models` — this list seeds the admin-UI dropdown with the most\n * common picks.\n */\nconst HF_KNOWN_MODELS: ModelInfo[] = [\n {\n id: 'meta-llama/Llama-3.3-70B-Instruct',\n displayName: 'Llama 3.3 70B Instruct (HF Providers)',\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/Llama-3.1-8B-Instruct',\n displayName: 'Llama 3.1 8B Instruct (HF Providers)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'Qwen/Qwen2.5-72B-Instruct',\n displayName: 'Qwen 2.5 72B Instruct (HF Providers)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 128_000,\n },\n },\n {\n id: 'mistralai/Mistral-7B-Instruct-v0.3',\n displayName: 'Mistral 7B Instruct v0.3 (HF Providers)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 32_000,\n },\n },\n {\n id: 'deepseek-ai/DeepSeek-V3',\n displayName: 'DeepSeek V3 (HF Providers)',\n capabilities: {\n streaming: true,\n tools: true,\n vision: false,\n systemPrompt: true,\n maxContextTokens: 64_000,\n },\n },\n];\n\nexport const huggingfaceManifest: AdapterManifest = {\n vendor: 'huggingface',\n displayName: 'HuggingFace Inference Providers',\n authKinds: [\n {\n kind: 'apiKey',\n displayName: 'API Key',\n fields: [\n {\n name: 'apiKey',\n label: 'HuggingFace Token',\n type: 'password',\n required: true,\n help:\n 'Get a token from https://huggingface.co/settings/tokens (Read scope is sufficient). ' +\n 'Inference Providers requires a credit balance — claim the free monthly tier or attach ' +\n 'a payment method at https://huggingface.co/billing.',\n },\n {\n name: 'baseURL',\n label: 'Base URL',\n type: 'url',\n required: false,\n default: 'https://router.huggingface.co/v1',\n help: 'Override only for proxies. Default is the HF Providers router endpoint.',\n },\n ],\n },\n ],\n knownModels: HF_KNOWN_MODELS,\n // The HF router exposes /v1/models with the same Bearer auth.\n supportsModelListing: true,\n docsUrl: 'https://huggingface.co/docs/inference-providers',\n};\n","import { OpenAIAdapter } from '../openai/adapter.js';\nimport { streamFromOpenAI } from '../openai/_streaming.js';\nimport type { ApiKeyAuth, ClientOptions, LlmEvent, PromptRequest } from '../../types.js';\nimport { makeMetadataExtractor } from '../_metadata.js';\nimport { huggingfaceManifest } from './manifest.js';\n\n/**\n * HuggingFace Inference Providers response-header diagnostics.\n *\n * `x-inference-provider` is the killer signal — names the actual\n * backend (Groq, Cerebras, Together, Fireworks, etc.) that served\n * the request. Useful for diagnosing latency anomalies and confirming\n * provider routing for `:fastest` / `:provider-name` model suffixes.\n */\nconst HUGGINGFACE_METADATA_EXTRACTOR = makeMetadataExtractor([\n { header: 'x-inference-provider', key: 'provider' },\n { header: 'x-request-id', key: 'request_id' },\n]);\n\n/**\n * Adapter for HuggingFace Inference Providers.\n *\n * HF Providers is a multi-provider broker: one HF token at\n * https://router.huggingface.co/v1 routes requests to whichever inference\n * shop hosts the requested model — Groq, Together, Fireworks, Cerebras,\n * Nebius, Hyperbolic, SambaNova, etc. The wire is OpenAI-compatible (chat\n * completions, streaming, tools, Bearer auth), so the adapter is a thin\n * subclass of `OpenAIAdapter` that defaults the `baseURL`.\n *\n * Model field syntax: customers pass canonical HF model ids\n * (`meta-llama/Llama-3.3-70B-Instruct`). They MAY append a routing\n * hint:\n * - `:fireworks-ai`, `:cerebras`, `:groq`, etc. — pin a specific provider\n * - `:fastest` — let HF route to the fastest available backend\n * Suffixes pass through to HF unchanged. The library's capability lookup\n * falls back to `defaultCapabilitiesForUnknown` for suffixed ids.\n */\nexport class HuggingfaceAdapter extends OpenAIAdapter {\n override readonly vendor = huggingfaceManifest.vendor;\n\n override init(auth: ApiKeyAuth, client?: ClientOptions): void {\n super.init(\n {\n ...auth,\n baseURL: auth.baseURL ?? 'https://router.huggingface.co/v1',\n },\n client,\n );\n }\n\n override stream(req: PromptRequest): AsyncIterable<LlmEvent> {\n return streamFromOpenAI(this.ensureClient(), req, {\n knownModels: huggingfaceManifest.knownModels,\n vendorMetadataExtractor: HUGGINGFACE_METADATA_EXTRACTOR,\n });\n }\n}\n","import type { AdapterFactory, ApiKeyAuth } from '../../types.js';\nimport { HuggingfaceAdapter } from './adapter.js';\nimport { huggingfaceManifest } from './manifest.js';\n\nexport const huggingfaceFactory: AdapterFactory<ApiKeyAuth> = {\n vendor: huggingfaceManifest.vendor,\n manifest: huggingfaceManifest,\n create: () => new HuggingfaceAdapter(),\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 {\n openAIFactory,\n deepseekFactory,\n basetenFactory,\n moonshotFactory,\n zaiFactory,\n xaiFactory,\n} 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';\nimport { azureOpenAIFactory } from './azure-openai/index.js';\nimport { groqFactory } from './groq/index.js';\nimport { huggingfaceFactory } from './huggingface/index.js';\n\nregisterAdapter(openAIFactory);\nregisterAdapter(deepseekFactory);\nregisterAdapter(basetenFactory);\nregisterAdapter(moonshotFactory);\nregisterAdapter(zaiFactory);\nregisterAdapter(xaiFactory);\nregisterAdapter(anthropicFactory);\nregisterAdapter(googleFactory);\nregisterAdapter(vertexGeminiFactory);\nregisterAdapter(vertexOpenAIFactory);\nregisterAdapter(bedrockFactory);\nregisterAdapter(azureOpenAIFactory);\nregisterAdapter(groqFactory);\nregisterAdapter(huggingfaceFactory);\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 * - `pickAuthKind(vendor, rawCred)` to pick the right manifest authKind for\n * a raw credential (used by api-server's `encryptCredential`).\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 AzureOpenAIApiKeyAuth,\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 { pickAuthKind } from './pick-auth-kind.js';\nexport type { RawCredentialLoose } from './pick-auth-kind.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":["OpenAI","Anthropic","buildWireMessages","formatTools","isAbortError","formatTools","isAbortError","usage","mapFinishReason","import_genai","import_openai","init","OpenAI","buildWireMessages","formatTools","isAbortError","mapStopReason","import_openai"]}
|