@nemesis-oss/ollama-sdk 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +23 -2
  3. package/dist/{compose-DfAqKAFj.d.ts → compose-DLStUfaF.d.ts} +2 -2
  4. package/dist/{compose-BR70yb4W.d.cts → compose-DS-UWFx8.d.cts} +2 -2
  5. package/dist/generated-api.cjs +54 -11
  6. package/dist/generated-api.cjs.map +1 -1
  7. package/dist/generated-api.d.cts +4 -3
  8. package/dist/generated-api.d.ts +4 -3
  9. package/dist/generated-api.js +54 -11
  10. package/dist/generated-api.js.map +1 -1
  11. package/dist/generated-models-schemas.cjs +192 -192
  12. package/dist/generated-models-schemas.cjs.map +1 -1
  13. package/dist/generated-models-schemas.js +192 -192
  14. package/dist/generated-models-schemas.js.map +1 -1
  15. package/dist/generated-runtime.cjs +229 -9
  16. package/dist/generated-runtime.cjs.map +1 -1
  17. package/dist/generated-runtime.d.cts +35 -2
  18. package/dist/generated-runtime.d.ts +35 -2
  19. package/dist/generated-runtime.js +228 -10
  20. package/dist/generated-runtime.js.map +1 -1
  21. package/dist/index.cjs +403 -145
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.cts +8 -8
  24. package/dist/index.d.ts +8 -8
  25. package/dist/index.js +403 -146
  26. package/dist/index.js.map +1 -1
  27. package/dist/mcp/tools.json +19 -70
  28. package/dist/mcp-generated.cjs +54 -11
  29. package/dist/mcp-generated.cjs.map +1 -1
  30. package/dist/mcp-generated.d.cts +4 -3
  31. package/dist/mcp-generated.d.ts +4 -3
  32. package/dist/mcp-generated.js +54 -11
  33. package/dist/mcp-generated.js.map +1 -1
  34. package/dist/mcp-http.d.cts +1 -1
  35. package/dist/mcp-http.d.ts +1 -1
  36. package/dist/mcp-stdio.d.cts +1 -1
  37. package/dist/mcp-stdio.d.ts +1 -1
  38. package/dist/{index-DIQ8NUbU.d.ts → runtime-CVQkbYgF.d.ts} +40 -2
  39. package/dist/{index-2RIErNT5.d.cts → runtime-IxRpUBjN.d.cts} +40 -2
  40. package/dist/skills.cjs.map +1 -1
  41. package/dist/skills.d.cts +3 -3
  42. package/dist/skills.d.ts +3 -3
  43. package/dist/skills.js.map +1 -1
  44. package/dist/{types-BQhgW-du.d.cts → types-5PAjLoCp.d.cts} +1 -1
  45. package/dist/{types-BQhgW-du.d.ts → types-5PAjLoCp.d.ts} +1 -1
  46. package/dist/{types-B9_axjum.d.cts → types-MOsWXEE7.d.cts} +1 -1
  47. package/dist/{types-B9_axjum.d.ts → types-MOsWXEE7.d.ts} +1 -1
  48. package/package.json +1 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/errors.ts","../src/logger.ts","../src/providers/endpoint-registry.ts","../src/middleware.ts","../src/streaming/ndjson.ts","../src/streaming/sse.ts","../src/telemetry/tracer.ts","../src/transport/http.ts","../src/providers/health-check.ts","../src/capabilities/capabilities.ts","../src/schema/zod.ts","../src/usage.ts","../src/tools/tool-call-id.ts","../src/streaming/stream.ts","../src/streaming/normalize.ts","../src/transport/backoff.ts","../src/transport/retry.ts","../src/transport/timeout.ts","../src/models-client.ts","../src/integrations/openai.ts","../src/integrations/anthropic.ts","../src/generated/runtime/runtime.ts","../src/utils.ts","../src/client.ts","../src/streaming/adapters.ts","../src/quota.ts","../src/tools/define-tool.ts","../src/tools/registry.ts","../src/mcp/json-schema.ts","../src/mcp/mcp-tools.ts","../src/mcp/bridge.ts","../src/skills/frontmatter.ts","../src/skills/compose.ts","../src/agent/agent.ts"],"names":["message","dispatch","response","controller","z"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Configuration options and constants for OllamaClient.\n */\n\nimport type { Logger, RequestLifecycleHook } from './logger.js';\nimport type { Middleware } from './middleware.js';\nimport type { RetryConfig } from './transport/retry.js';\nimport type { FetchLike } from './transport/http.js';\nimport type { EndpointRegistryOptions, OllamaEndpoint } from './providers/endpoint-registry.js';\n\nexport const DEFAULT_BASE_URL = 'http://localhost:11434';\nexport const DEFAULT_TIMEOUT_MS = 30_000;\n/**\n * Fixed host for Ollama's hosted web tools (`/api/web_search`, `/api/web_fetch`) — see\n * `OllamaClient.webSearch`/`webFetch`. These are an Ollama Cloud service reachable only\n * at this host, independent of any locally-configured `baseUrl`/`endpoints`.\n */\nexport const OLLAMA_CLOUD_BASE_URL = 'https://ollama.com';\n\n/**\n * Reads a process environment variable, if any. Guarded with `typeof process` rather\n * than importing `node:process` so this stays safe to call from Edge Runtimes (Cloudflare\n * Workers, Vercel Edge) where `process` doesn't exist — it just returns `undefined` there.\n */\nfunction readEnv(name: string): string | undefined {\n return typeof process !== 'undefined' && process.env ? process.env[name] : undefined;\n}\n\n/**\n * Resolves the default single-endpoint `baseUrl`, falling back to the `OLLAMA_HOST`\n * environment variable (the same one the official `ollama` CLI and client libraries\n * read) before `DEFAULT_BASE_URL`. Explicit `config.baseUrl` always wins.\n */\nexport function resolveBaseUrl(configBaseUrl?: string | undefined): string {\n return configBaseUrl ?? readEnv('OLLAMA_HOST') ?? DEFAULT_BASE_URL;\n}\n\n/**\n * Resolves the default single-endpoint `apiKey`, falling back to the `OLLAMA_API_KEY`\n * environment variable before leaving it unset. Explicit `config.apiKey` always wins.\n */\nexport function resolveApiKey(configApiKey?: string | undefined): string | undefined {\n return configApiKey ?? readEnv('OLLAMA_API_KEY');\n}\n\n/** One named credential for the `credentials`/`modelBindings` config shape. */\nexport interface OllamaCredentialConfig {\n readonly apiKey: string;\n /** Overrides `OllamaClientConfig.baseUrl` for requests made with this credential. */\n readonly baseUrl?: string | undefined;\n readonly headers?: Record<string, string> | undefined;\n}\n\n/**\n * Builds synthetic `OllamaEndpoint`s (named `credential:<id>`) from `config.credentials` +\n * `config.modelBindings` — an ergonomic, map-based alternative to writing out `endpoints`\n * with per-entry `models` allow-lists directly. Both shapes feed the same\n * `EndpointRegistry`/`executeWithFailover` routing engine; this is pure config sugar, not\n * a separate routing mechanism. Returns `[]` if `config.credentials` is unset.\n *\n * A model bound to one credential (`modelBindings: { \"minimax-m3\": \"coder\" }`) scopes that\n * credential to only that model, same as `OllamaEndpoint.models`. A model bound to several\n * credentials (`modelBindings: { \"gpt-oss:120b\": [\"key1\", \"key2\"] }`) makes ordinary\n * endpoint failover apply between them. `config.defaultCredential`, if set, is given a\n * lower priority than explicitly-bound credentials and no `models` restriction, so it acts\n * as a catch-all for any model without an explicit binding without ever pre-empting one\n * that has.\n */\nexport function resolveCredentialEndpoints(\n config: Pick<OllamaClientConfig, 'credentials' | 'modelBindings' | 'defaultCredential' | 'baseUrl'>,\n): readonly OllamaEndpoint[] {\n if (config.credentials === undefined) return [];\n\n const modelsByCredential = new Map<string, string[]>();\n for (const [model, bound] of Object.entries(config.modelBindings ?? {})) {\n for (const id of typeof bound === 'string' ? [bound] : bound) {\n if (!(id in config.credentials)) {\n throw new Error(\n `modelBindings[\"${model}\"] references unknown credential \"${id}\" — it isn't ` +\n `in \\`credentials\\`. Known credentials: ${Object.keys(config.credentials).join(', ') || '(none)'}.`,\n );\n }\n const list = modelsByCredential.get(id) ?? [];\n list.push(model);\n modelsByCredential.set(id, list);\n }\n }\n\n return Object.entries(config.credentials).map(([id, credential]) => {\n const isDefault = id === config.defaultCredential;\n const boundModels = isDefault ? undefined : modelsByCredential.get(id);\n return {\n name: `credential:${id}`,\n baseUrl: resolveBaseUrl(credential.baseUrl ?? config.baseUrl),\n apiKey: credential.apiKey,\n ...(credential.headers !== undefined ? { headers: credential.headers } : {}),\n ...(boundModels !== undefined ? { models: boundModels } : {}),\n priority: isDefault ? -1 : 0,\n };\n });\n}\n\nexport const DEFAULT_FAILOVER_CODES: readonly string[] = [\n 'network_error',\n 'timeout',\n 'server_error',\n 'rate_limited',\n 'auth_error',\n // A candidate endpoint rejected the request pre-flight for a known-unsupported\n // capability (e.g. structured output against Ollama Cloud) — try the next candidate\n // rather than failing outright; see OllamaUnsupportedCapabilityError.\n 'unsupported_capability',\n];\n\nexport interface OllamaClientConfig {\n /**\n * Base URL of a single Ollama server. Ignored if `endpoints` is provided. Falls back to\n * the `OLLAMA_HOST` environment variable (when set and running under Node), then\n * `http://localhost:11434`.\n */\n readonly baseUrl?: string;\n /**\n * Bearer token sent as `Authorization: Bearer <apiKey>` for a single-endpoint setup.\n * Falls back to the `OLLAMA_API_KEY` environment variable (when set and running under\n * Node).\n */\n readonly apiKey?: string;\n /** Static headers merged into every request. */\n readonly headers?: Record<string, string>;\n /**\n * Multiple named endpoints for rotation and automatic failover. Each endpoint may\n * carry its own `apiKey` and, via `models`, be scoped to only the models that\n * credential is entitled to — see `OllamaEndpoint.models` for routing several\n * per-model Ollama Cloud API keys through a single client.\n */\n readonly endpoints?: readonly OllamaEndpoint[];\n /**\n * Named credentials, keyed by an id you choose — an ergonomic alternative to writing\n * out `endpoints` by hand for the common \"several Ollama Cloud API keys, each entitled\n * to different models\" shape. Combine with `modelBindings` to scope each credential to\n * the models it's authorized for; a credential with no binding (or set as\n * `defaultCredential`) is eligible for every model, same as an `OllamaEndpoint` with no\n * `models`. Merges additively with `endpoints` if both are given.\n */\n readonly credentials?: Readonly<Record<string, OllamaCredentialConfig>>;\n /**\n * Maps a model name to the `credentials` id (or ids, for several keys authorized for\n * the same model — ordinary failover applies between them) that may serve it. Has no\n * effect without `credentials`. Referencing an id not present in `credentials` throws\n * at construction time.\n */\n readonly modelBindings?: Readonly<Record<string, string | readonly string[]>>;\n /**\n * The `credentials` id to fall back to for a model with no entry in `modelBindings`.\n * Unset means such a model has no synthesized-from-`credentials` route — it still\n * routes normally through any plain `endpoints` entry without a `models` restriction.\n */\n readonly defaultCredential?: string | undefined;\n /**\n * Tuning options for the endpoint circuit breaker, and candidate selection ordering —\n * pass `{ strategy: 'round-robin' }` to spread requests across a pool of same-priority\n * endpoints/credentials (e.g. several unbound `credentials`) instead of always\n * preferring the first one, or `{ strategy: 'least-connections' }` to route each\n * request to whichever candidate currently has the fewest requests in flight (e.g.\n * several free-tier Ollama Cloud accounts, each capped at 1 concurrent request — this\n * deterministically spreads concurrent `Promise.all`-style calls one-per-account rather\n * than risking two landing on the same still-busy one), and `maxConcurrentPerEndpoint`\n * to cap that at an exact number and queue (rather than overrun a saturated candidate)\n * once every eligible one is at capacity — e.g. `{ strategy: 'least-connections',\n * maxConcurrentPerEndpoint: 1 }` for accounts that only allow one request at a time.\n * See `EndpointRegistryOptions`.\n */\n readonly endpointHealth?: EndpointRegistryOptions;\n /** Error codes that trigger failover to the next candidate endpoint. */\n readonly failoverOn?: readonly string[];\n /** Default per-request timeout in milliseconds (default 30_000ms). */\n readonly timeoutMs?: number;\n /** Retry configuration or retry count override. */\n readonly retries?: number | Partial<RetryConfig>;\n /** Custom fetch implementation (defaults to globalThis.fetch). */\n readonly fetch?: FetchLike;\n /** Request/Response middleware list. */\n readonly middleware?: readonly Middleware[];\n /** Structured logger. */\n readonly logger?: Logger;\n /** Enables console debug logger if true. */\n readonly debug?: boolean;\n /** Request lifecycle hook for telemetry/metrics. */\n readonly onLifecycleEvent?: RequestLifecycleHook;\n}\n","/**\n * Structured, typed error hierarchy for OllamaClient.\n */\n\nexport interface OllamaErrorRequestContext {\n readonly method?: string | undefined;\n readonly url?: string | undefined;\n readonly model?: string | undefined;\n}\n\nexport interface OllamaErrorResponseContext {\n readonly status?: number | undefined;\n readonly headers?: Record<string, string> | undefined;\n readonly body?: unknown;\n}\n\nexport interface OllamaClientErrorOptions extends ErrorOptions {\n readonly code: string;\n readonly status?: number | undefined;\n readonly retryable?: boolean | undefined;\n readonly request?: OllamaErrorRequestContext | undefined;\n readonly response?: OllamaErrorResponseContext | undefined;\n}\n\nexport class OllamaClientError extends Error {\n readonly code: string;\n readonly status?: number | undefined;\n readonly retryable: boolean;\n readonly request?: OllamaErrorRequestContext | undefined;\n readonly response?: OllamaErrorResponseContext | undefined;\n\n constructor(message: string, options: OllamaClientErrorOptions) {\n super(message, { cause: options.cause });\n this.name = this.constructor.name;\n this.code = options.code;\n this.status = options.status;\n this.retryable = options.retryable ?? false;\n this.request = options.request;\n this.response = options.response;\n }\n}\n\nexport class OllamaNetworkError extends OllamaClientError {\n constructor(\n message: string,\n options?: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> | undefined,\n ) {\n super(message, { ...options, code: 'network_error', retryable: true });\n }\n}\n\nexport class OllamaTimeoutError extends OllamaClientError {\n readonly timeoutMs?: number | undefined;\n constructor(\n message: string,\n options?:\n | (Omit<OllamaClientErrorOptions, 'code' | 'retryable'> & { timeoutMs?: number | undefined })\n | undefined,\n ) {\n super(message, { ...options, code: 'timeout', retryable: true });\n this.timeoutMs = options?.timeoutMs;\n }\n}\n\nexport class OllamaAuthError extends OllamaClientError {\n constructor(\n message: string,\n options?: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> | undefined,\n ) {\n super(message, { ...options, code: 'auth_error', retryable: false });\n }\n}\n\nexport class OllamaNotFoundError extends OllamaClientError {\n constructor(\n message: string,\n options?: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> | undefined,\n ) {\n super(message, { ...options, code: 'not_found', retryable: false });\n }\n}\n\nexport class OllamaRateLimitError extends OllamaClientError {\n readonly retryAfterMs?: number | undefined;\n constructor(\n message: string,\n options?:\n | (Omit<OllamaClientErrorOptions, 'code' | 'retryable'> & {\n retryAfterMs?: number | undefined;\n })\n | undefined,\n ) {\n super(message, { ...options, code: 'rate_limited', retryable: true });\n this.retryAfterMs = options?.retryAfterMs;\n }\n}\n\n/**\n * Thrown client-side, before a network request is made, by `QuotaManager.assertCanProceed`\n * (see `src/quota.ts`) when issuing the request would exceed a configured usage budget for\n * one of its rolling windows. This is distinct from `OllamaRateLimitError`, which reflects\n * the server's own 429 response — Ollama Cloud does not expose account-level quota via the\n * API, so `QuotaManager` tracks usage against budgets the caller configures locally and\n * fails fast rather than waiting for the server to reject the request.\n */\nexport class OllamaQuotaExceededError extends OllamaClientError {\n readonly windowId: string;\n readonly resetAt: number;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> & {\n windowId: string;\n resetAt: number;\n },\n ) {\n super(message, { ...options, code: 'quota_exceeded', retryable: false });\n this.windowId = options.windowId;\n this.resetAt = options.resetAt;\n }\n}\n\nexport class OllamaServerError extends OllamaClientError {\n constructor(\n message: string,\n options?: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> | undefined,\n ) {\n super(message, { ...options, code: 'server_error', retryable: true });\n }\n}\n\nexport class OllamaAbortError extends OllamaClientError {\n constructor(\n message: string,\n options?: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> | undefined,\n ) {\n super(message, { ...options, code: 'aborted', retryable: false });\n }\n}\n\nexport class OllamaToolValidationError extends OllamaClientError {\n readonly toolName: string;\n readonly issues?: unknown;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code'> & { toolName: string; issues?: unknown },\n ) {\n super(message, { ...options, code: 'tool_validation_error', retryable: false });\n this.toolName = options.toolName;\n this.issues = options.issues;\n }\n}\n\nexport class OllamaToolTimeoutError extends OllamaClientError {\n readonly toolName: string;\n readonly timeoutMs: number;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> & {\n toolName: string;\n timeoutMs: number;\n },\n ) {\n super(message, { ...options, code: 'tool_timeout', retryable: false });\n this.toolName = options.toolName;\n this.timeoutMs = options.timeoutMs;\n }\n}\n\n/**\n * Thrown client-side, before a network request is made, when a request asks for a\n * capability an endpoint is known not to support (e.g. structured output `format` against\n * an Ollama Cloud endpoint — see `ModelCapabilities.supportsStructuredOutputRequest` in\n * `src/capabilities/capabilities.ts`). Its `code` is included in `DEFAULT_FAILOVER_CODES`\n * by default, so in a multi-endpoint setup it causes failover to the next candidate rather\n * than failing outright — it only surfaces to the caller if every candidate is rejected.\n */\nexport class OllamaUnsupportedCapabilityError extends OllamaClientError {\n readonly capability: string;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> & { capability: string },\n ) {\n super(message, { ...options, code: 'unsupported_capability', retryable: false });\n this.capability = options.capability;\n }\n}\n\n/**\n * Thrown client-side, before any network call, when `config.endpoints` uses\n * `OllamaEndpoint.models` to scope endpoints/credentials to specific models and the\n * requested `model` isn't in any configured endpoint's allow-list. This is a routing\n * misconfiguration, not a connectivity problem — the SDK deliberately does not \"probe\"\n * unauthorized endpoints to find one that happens to work (that would burn quota on keys\n * that were never entitled to the model and produce non-deterministic startup behavior).\n */\nexport class OllamaModelRoutingError extends OllamaClientError {\n readonly model: string;\n readonly availableModels: readonly string[];\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> & {\n model: string;\n availableModels: readonly string[];\n },\n ) {\n super(message, { ...options, code: 'model_routing_error', retryable: false });\n this.model = options.model;\n this.availableModels = options.availableModels;\n }\n}\n\n/**\n * Thrown before an agent tool loop starts when the selected model's /api/show metadata\n * does not advertise a capability required by the loop.\n */\nexport class OllamaIncompatibleModelError extends OllamaClientError {\n readonly model: string;\n readonly capability: string;\n readonly reportedCapabilities: readonly string[];\n\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> & {\n model: string;\n capability: string;\n reportedCapabilities: readonly string[];\n },\n ) {\n super(message, { ...options, code: 'incompatible_model', retryable: false });\n this.model = options.model;\n this.capability = options.capability;\n this.reportedCapabilities = options.reportedCapabilities;\n }\n}\nexport class OllamaAgentMaxToolCallsError extends OllamaClientError {\n readonly maxToolCalls: number;\n readonly toolCallsExecuted: number;\n\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code'> & {\n maxToolCalls: number;\n toolCallsExecuted: number;\n },\n ) {\n super(message, { ...options, code: 'agent_max_tool_calls_exceeded', retryable: false });\n this.maxToolCalls = options.maxToolCalls;\n this.toolCallsExecuted = options.toolCallsExecuted;\n }\n}\n\nexport class OllamaAgentMaxIterationsError extends OllamaClientError {\n readonly maxIterations: number;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code'> & { maxIterations: number },\n ) {\n super(message, { ...options, code: 'agent_max_iterations_exceeded', retryable: false });\n this.maxIterations = options.maxIterations;\n }\n}\n\nexport class OllamaMcpError extends OllamaClientError {\n readonly mcpMethod: 'listTools' | 'callTool';\n readonly toolName?: string | undefined;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code'> & {\n mcpMethod: 'listTools' | 'callTool';\n toolName?: string | undefined;\n },\n ) {\n super(message, { ...options, code: 'mcp_error', retryable: options.retryable ?? false });\n this.mcpMethod = options.mcpMethod;\n this.toolName = options.toolName;\n }\n}\n\nexport class OllamaSkillNotFoundError extends OllamaClientError {\n readonly skillName: string;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code'> & { skillName: string },\n ) {\n super(message, { ...options, code: 'skill_not_found', retryable: false });\n this.skillName = options.skillName;\n }\n}\n\nexport class OllamaSkillInvalidError extends OllamaClientError {\n readonly skillName: string;\n readonly path?: string | undefined;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code'> & {\n skillName: string;\n path?: string | undefined;\n },\n ) {\n super(message, { ...options, code: 'skill_invalid', retryable: false });\n this.skillName = options.skillName;\n this.path = options.path;\n }\n}\n\nexport class OllamaGenericClientError extends OllamaClientError {\n constructor(message: string, options?: Omit<OllamaClientErrorOptions, 'code'> | undefined) {\n super(message, { ...options, code: 'client_error' });\n }\n}\n\nfunction isDomAbortError(error: unknown): error is DOMException {\n return (\n typeof DOMException !== 'undefined' &&\n error instanceof DOMException &&\n error.name === 'AbortError'\n );\n}\n\nfunction statusToError(\n status: number,\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code' | 'status'>,\n): OllamaClientError {\n if (status === 401 || status === 403) {\n return new OllamaAuthError(message, { ...options, status });\n }\n if (status === 404) {\n return new OllamaNotFoundError(message, { ...options, status });\n }\n if (status === 429) {\n return new OllamaRateLimitError(message, { ...options, status });\n }\n if (status >= 500) {\n return new OllamaServerError(message, { ...options, status });\n }\n return new OllamaGenericClientError(message, { ...options, status });\n}\n\n/**\n * Maps arbitrary thrown exceptions into structured OllamaClientError instances.\n */\nexport function mapError(\n error: unknown,\n context: {\n request?: OllamaErrorRequestContext | undefined;\n response?: OllamaErrorResponseContext | undefined;\n } = {},\n): OllamaClientError {\n if (error instanceof OllamaClientError) {\n return error;\n }\n if (isDomAbortError(error)) {\n return new OllamaAbortError(error.message || 'Request was aborted', {\n cause: error,\n request: context.request,\n });\n }\n if (error instanceof TypeError) {\n return new OllamaNetworkError(error.message || 'Network request failed', {\n cause: error,\n request: context.request,\n });\n }\n if (context.response?.status !== undefined) {\n const message = error instanceof Error ? error.message : String(error);\n return statusToError(context.response.status, message, {\n cause: error,\n request: context.request,\n response: context.response,\n });\n }\n const message = error instanceof Error ? error.message : String(error);\n return new OllamaGenericClientError(message, {\n cause: error,\n request: context.request,\n response: context.response,\n });\n}\n","/**\n * Structured logger and request lifecycle interfaces.\n */\n\nexport interface LogFn {\n (message: string, context?: Record<string, unknown>): void;\n}\n\nexport interface Logger {\n readonly debug: LogFn;\n readonly info: LogFn;\n readonly warn: LogFn;\n readonly error: LogFn;\n}\n\nexport interface LifecycleStartEvent {\n readonly type: 'start';\n readonly requestId: string;\n readonly method: string;\n readonly url: string;\n readonly timestamp: number;\n}\n\nexport interface LifecycleSuccessEvent {\n readonly type: 'success';\n readonly requestId: string;\n readonly durationMs: number;\n readonly status: number;\n readonly timestamp: number;\n}\n\nexport interface LifecycleRetryEvent {\n readonly type: 'retry';\n readonly requestId: string;\n readonly attempt: number;\n readonly error: Error;\n readonly delayMs: number;\n readonly timestamp: number;\n}\n\nexport interface LifecycleErrorEvent {\n readonly type: 'error';\n readonly requestId: string;\n readonly durationMs: number;\n readonly error: Error;\n readonly timestamp: number;\n}\n\nexport type RequestLifecycleEvent =\n LifecycleStartEvent | LifecycleSuccessEvent | LifecycleRetryEvent | LifecycleErrorEvent;\n\nexport interface RequestLifecycleHook {\n (event: RequestLifecycleEvent): void;\n}\n\nexport const NOOP_LOGGER: Logger = {\n debug: () => undefined,\n info: () => undefined,\n warn: () => undefined,\n error: () => undefined,\n};\n\nexport function createConsoleLogger(prefix = '[@nemesis-oss/ollama-sdk]'): Logger {\n return {\n debug: (msg, ctx) => console.debug(`${prefix} ${msg}`, ctx ?? ''),\n info: (msg, ctx) => console.info(`${prefix} ${msg}`, ctx ?? ''),\n warn: (msg, ctx) => console.warn(`${prefix} ${msg}`, ctx ?? ''),\n error: (msg, ctx) => console.error(`${prefix} ${msg}`, ctx ?? ''),\n };\n}\n","/**\n * Multi-endpoint registry with priority routing and circuit breaker failover.\n */\n\nimport { OllamaAbortError } from '../errors.js';\n\nexport interface OllamaEndpoint {\n readonly name: string;\n readonly baseUrl: string;\n readonly apiKey?: string | undefined;\n readonly headers?: Record<string, string> | undefined;\n readonly priority?: number | undefined;\n /**\n * Restricts this endpoint/credential to a specific set of models — for the common case\n * of several Ollama Cloud API keys, each entitled to a different model. When set,\n * `EndpointRegistry.candidates(model)` only returns this endpoint for a request whose\n * `model` is in the list, so cross-endpoint failover never retries a request against a\n * credential that isn't authorized for the requested model. Omit (the default) to make\n * the endpoint eligible for every model, preserving prior behavior.\n */\n readonly models?: readonly string[] | undefined;\n}\n\nexport interface EndpointHealth {\n readonly endpoint: OllamaEndpoint;\n readonly failureCount: number;\n readonly lastFailureTimestamp?: number | undefined;\n readonly isCoolingDown: boolean;\n /** In-flight requests currently attempting this endpoint — see `acquire`/`release`. */\n readonly activeRequests: number;\n}\n\nexport interface EndpointRegistryOptions {\n readonly failureThreshold?: number | undefined;\n readonly cooldownMs?: number | undefined;\n readonly now?: (() => number) | undefined;\n /**\n * How candidates that share the same `priority` are ordered within `candidates()`.\n * `'priority'` (the default) keeps them in registration order, so the same candidate is\n * always tried first while it stays healthy. `'round-robin'` rotates each same-priority\n * group by one position per `candidates()` call — i.e. per `chat`/`generate`/etc. call —\n * so consecutive requests spread across a pool of interchangeable endpoints/credentials\n * instead of always preferring the first one (the common case: several Ollama Cloud keys\n * registered with no `models` restriction, meant to be used interchangeably). Endpoints\n * at different priorities are unaffected either way — a higher-priority one is still\n * always tried first, and failover to the rest of the group still applies if the\n * rotated-to-front candidate fails.\n *\n * `'least-connections'` instead orders each same-priority group by ascending in-flight\n * request count (tracked via `acquire`/`release`, ties broken by registration order),\n * so a request always prefers whichever candidate currently has the fewest requests\n * still in progress. Unlike `'round-robin'`, this remains correct under uneven or\n * overlapping request durations — e.g. several Ollama Cloud accounts each limited to 1\n * concurrent request: firing several requests at once (`Promise.all`) deterministically\n * lands each on a different account rather than risking two landing on the same\n * still-busy one, because `candidates()` and the subsequent `acquire()` for the chosen\n * candidate run synchronously with no `await` in between — JS's single-threaded\n * execution means no two concurrent calls can observe the same \"0 active\" snapshot for\n * the same candidate.\n */\n readonly strategy?: 'priority' | 'round-robin' | 'least-connections' | undefined;\n /**\n * Caps in-flight requests per endpoint (tracked via `acquire`/`release`). Unset (the\n * default) means no cap — candidates are never treated as saturated. When set, a\n * request whose every otherwise-eligible candidate is already at this cap waits\n * (`waitForCapacity`, FIFO per candidate) for one of them to free up, instead of being\n * sent to an already-saturated candidate. Pairs naturally with `strategy:\n * 'least-connections'` for a pool of accounts each limited to N concurrent requests —\n * e.g. `maxConcurrentPerEndpoint: 1` for several Ollama Cloud free-tier accounts, so\n * `N + 1` concurrent calls against `N` such accounts run `N` immediately and queue the\n * rest, rather than the `(N+1)`th overrunning whichever account looks \"least busy\" at\n * that instant. Waiting is bounded by the request's own timeout/`AbortSignal`, same as\n * any other in-flight request — it never blocks indefinitely on its own.\n */\n readonly maxConcurrentPerEndpoint?: number | undefined;\n}\n\ninterface CapacityWaiter {\n readonly names: readonly string[];\n readonly resolve: () => void;\n cleanup: () => void;\n}\n\nexport class EndpointRegistry {\n private readonly endpoints: readonly OllamaEndpoint[];\n private readonly failureCounts = new Map<string, number>();\n private readonly lastFailures = new Map<string, number>();\n private readonly failureThreshold: number;\n private readonly cooldownMs: number;\n private readonly now: () => number;\n private readonly strategy: 'priority' | 'round-robin' | 'least-connections';\n private roundRobinCounter = 0;\n private readonly activeCounts = new Map<string, number>();\n private readonly maxConcurrentPerEndpoint: number | undefined;\n private readonly waiters: CapacityWaiter[] = [];\n\n constructor(endpoints: readonly OllamaEndpoint[], options: EndpointRegistryOptions = {}) {\n this.endpoints =\n endpoints.length > 0 ? endpoints : [{ name: 'default', baseUrl: 'http://localhost:11434' }];\n this.failureThreshold = options.failureThreshold ?? 3;\n this.cooldownMs = options.cooldownMs ?? 30_000;\n this.now = options.now ?? Date.now;\n this.strategy = options.strategy ?? 'priority';\n this.maxConcurrentPerEndpoint = options.maxConcurrentPerEndpoint;\n }\n\n /**\n * Marks one more request as in-flight against `name`. Callers (`OllamaClient`) must\n * pair every `acquire` with a `release` once that attempt finishes, success or not —\n * see `OllamaClient.executeWithFailover`. Only affects candidate ordering when\n * `strategy` is `'least-connections'`; harmless (just bookkeeping) otherwise, and\n * always reflected in `status()`'s `activeRequests`.\n */\n acquire(name: string): void {\n this.activeCounts.set(name, (this.activeCounts.get(name) ?? 0) + 1);\n }\n\n /** Releases one in-flight request marked via `acquire`, waking one waiter for `name` if any. */\n release(name: string): void {\n const next = (this.activeCounts.get(name) ?? 0) - 1;\n if (next <= 0) {\n this.activeCounts.delete(name);\n } else {\n this.activeCounts.set(name, next);\n }\n const idx = this.waiters.findIndex((w) => w.names.includes(name));\n if (idx !== -1) {\n const [waiter] = this.waiters.splice(idx, 1);\n waiter?.cleanup();\n waiter?.resolve();\n }\n }\n\n /**\n * `candidates` filtered down to those currently under `maxConcurrentPerEndpoint` (all\n * of them, unchanged, if that option is unset).\n */\n filterWithCapacity(candidates: readonly OllamaEndpoint[]): OllamaEndpoint[] {\n const cap = this.maxConcurrentPerEndpoint;\n if (cap === undefined) return [...candidates];\n return candidates.filter((ep) => (this.activeCounts.get(ep.name) ?? 0) < cap);\n }\n\n /**\n * Resolves once any endpoint named in `names` has spare capacity under\n * `maxConcurrentPerEndpoint` (a no-op resolve if that option is unset, or if one\n * already does). Otherwise queues (FIFO per name) until a matching `release()` frees a\n * slot, or rejects if `signal` aborts first — mirroring whatever aborted it\n * (`OllamaTimeoutError`/the caller's own abort reason) so callers see the same error\n * shape as any other in-flight request that times out or is cancelled. FIFO order is\n * best-effort (a newly-arriving request can still win a race for a slot that just\n * freed) — the capacity cap itself, not fairness, is the guarantee this exists for.\n */\n waitForCapacity(names: readonly string[], signal?: AbortSignal): Promise<void> {\n const cap = this.maxConcurrentPerEndpoint;\n if (cap === undefined) return Promise.resolve();\n if (names.some((n) => (this.activeCounts.get(n) ?? 0) < cap)) return Promise.resolve();\n\n return new Promise<void>((resolve, reject) => {\n const waiter: CapacityWaiter = { names, resolve, cleanup: () => undefined };\n const onAbort = (): void => {\n const idx = this.waiters.indexOf(waiter);\n if (idx !== -1) this.waiters.splice(idx, 1);\n reject(\n signal?.reason instanceof Error\n ? signal.reason\n : new OllamaAbortError('Aborted while waiting for endpoint capacity'),\n );\n };\n if (signal !== undefined) {\n if (signal.aborted) {\n onAbort();\n return;\n }\n signal.addEventListener('abort', onAbort, { once: true });\n waiter.cleanup = () => signal.removeEventListener('abort', onAbort);\n }\n this.waiters.push(waiter);\n });\n }\n\n /**\n * Rotates each same-`priority` group in `sorted` (already sorted highest-priority-first)\n * by one position further per call, wrapping around within the group. Priority tiers\n * themselves are never reordered — only candidates that were already tied.\n */\n private applyRoundRobin(sorted: readonly OllamaEndpoint[]): OllamaEndpoint[] {\n const offset = this.roundRobinCounter++;\n const result: OllamaEndpoint[] = [];\n let i = 0;\n while (i < sorted.length) {\n const priority = sorted[i]?.priority ?? 0;\n let j = i + 1;\n while (j < sorted.length && (sorted[j]?.priority ?? 0) === priority) j++;\n const tier = sorted.slice(i, j);\n const rotation = offset % tier.length;\n result.push(...tier.slice(rotation), ...tier.slice(0, rotation));\n i = j;\n }\n return result;\n }\n\n /**\n * Reorders each same-`priority` group in `sorted` by ascending in-flight request count\n * (from `acquire`/`release`); a stable sort, so candidates tied on active count keep\n * their relative (priority-then-registration) order. Priority tiers themselves are\n * never reordered.\n */\n private applyLeastConnections(sorted: readonly OllamaEndpoint[]): OllamaEndpoint[] {\n const result: OllamaEndpoint[] = [];\n let i = 0;\n while (i < sorted.length) {\n const priority = sorted[i]?.priority ?? 0;\n let j = i + 1;\n while (j < sorted.length && (sorted[j]?.priority ?? 0) === priority) j++;\n const tier = [...sorted.slice(i, j)].sort(\n (a, b) => (this.activeCounts.get(a.name) ?? 0) - (this.activeCounts.get(b.name) ?? 0),\n );\n result.push(...tier);\n i = j;\n }\n return result;\n }\n\n /**\n * Endpoints eligible for `model`, sorted healthy-first-by-priority (falling back to\n * soonest-to-recover if every eligible endpoint is cooling down); same-priority\n * candidates are further reordered per `options.strategy` (see\n * `EndpointRegistryOptions.strategy`). When `model` is given, endpoints whose `models`\n * allow-list doesn't include it are excluded entirely — see `OllamaEndpoint.models`.\n * Omit `model` to consider every configured endpoint, regardless of any `models`\n * restriction (used for non-model-scoped operations).\n */\n candidates(model?: string): OllamaEndpoint[] {\n const currentTime = this.now();\n const scoped =\n model === undefined\n ? this.endpoints\n : this.endpoints.filter((ep) => ep.models === undefined || ep.models.includes(model));\n const healthy: OllamaEndpoint[] = [];\n const coolingDown: Array<{ endpoint: OllamaEndpoint; recoveredAt: number }> = [];\n\n for (const ep of scoped) {\n const failures = this.failureCounts.get(ep.name) ?? 0;\n const lastFail = this.lastFailures.get(ep.name) ?? 0;\n const isCooling =\n failures >= this.failureThreshold && currentTime - lastFail < this.cooldownMs;\n\n if (!isCooling) {\n healthy.push(ep);\n } else {\n coolingDown.push({ endpoint: ep, recoveredAt: lastFail + this.cooldownMs });\n }\n }\n\n if (healthy.length > 0) {\n const sorted = healthy.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n if (this.strategy === 'round-robin') return this.applyRoundRobin(sorted);\n if (this.strategy === 'least-connections') return this.applyLeastConnections(sorted);\n return sorted;\n }\n\n // Fail-open: sort by soonest-to-recover\n return coolingDown.sort((a, b) => a.recoveredAt - b.recoveredAt).map((c) => c.endpoint);\n }\n\n reportSuccess(name: string): void {\n this.failureCounts.delete(name);\n this.lastFailures.delete(name);\n }\n\n reportFailure(name: string): void {\n const current = (this.failureCounts.get(name) ?? 0) + 1;\n this.failureCounts.set(name, current);\n this.lastFailures.set(name, this.now());\n }\n\n list(): readonly OllamaEndpoint[] {\n return this.endpoints;\n }\n\n /** True if any configured endpoint restricts itself to a `models` allow-list. */\n hasModelScopedEndpoints(): boolean {\n return this.endpoints.some((ep) => ep.models !== undefined);\n }\n\n status(): EndpointHealth[] {\n const currentTime = this.now();\n return this.endpoints.map((ep) => {\n const failures = this.failureCounts.get(ep.name) ?? 0;\n const lastFail = this.lastFailures.get(ep.name);\n const isCoolingDown =\n failures >= this.failureThreshold &&\n lastFail !== undefined &&\n currentTime - lastFail < this.cooldownMs;\n\n return {\n endpoint: ep,\n failureCount: failures,\n ...(lastFail !== undefined ? { lastFailureTimestamp: lastFail } : {}),\n isCoolingDown,\n activeRequests: this.activeCounts.get(ep.name) ?? 0,\n };\n });\n }\n}\n","/**\n * Request/response middleware pipeline.\n */\n\nexport interface RequestContext {\n readonly url: string;\n readonly method: string;\n readonly headers: Record<string, string>;\n readonly body?: unknown;\n readonly signal?: AbortSignal;\n}\n\nexport interface ResponseContext {\n readonly status: number;\n readonly headers: Record<string, string>;\n readonly body: unknown;\n}\n\nexport type NextFunction = () => Promise<ResponseContext>;\n\nexport interface MiddlewareContext {\n readonly request: RequestContext;\n readonly next: NextFunction;\n}\n\nexport interface Middleware {\n (ctx: MiddlewareContext): Promise<ResponseContext>;\n}\n\nexport function composeMiddleware(\n middlewares: readonly Middleware[],\n finalHandler: (req: RequestContext) => Promise<ResponseContext>,\n): (req: RequestContext) => Promise<ResponseContext> {\n return function runPipeline(initialRequest: RequestContext): Promise<ResponseContext> {\n let index = -1;\n\n function dispatch(i: number, currentRequest: RequestContext): Promise<ResponseContext> {\n if (i <= index) {\n return Promise.reject(new Error('next() called multiple times in middleware'));\n }\n index = i;\n const fn = middlewares[i];\n if (i === middlewares.length || !fn) {\n return finalHandler(currentRequest);\n }\n return fn({\n request: currentRequest,\n next: () => dispatch(i + 1, currentRequest),\n });\n }\n\n return dispatch(0, initialRequest);\n };\n}\n","/**\n * NDJSON (newline-delimited JSON) stream reader for native fetch Response bodies.\n */\n\nimport { OllamaGenericClientError } from '../errors.js';\n\n/**\n * Parses a byte stream from fetch body into an async generator of typed JSON chunks.\n */\nexport async function* parseNdjsonStream<T>(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<T, void, undefined> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n // Keep the last partial line in buffer\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n yield JSON.parse(trimmed) as T;\n } catch (err) {\n throw new OllamaGenericClientError(`Failed to parse stream JSON chunk: ${trimmed}`, {\n cause: err,\n });\n }\n }\n }\n\n if (buffer.trim()) {\n yield JSON.parse(buffer.trim()) as T;\n }\n } finally {\n try {\n await reader.cancel();\n } catch {\n // The stream may already be closed or errored.\n }\n reader.releaseLock();\n }\n}\n","/**\n * Server-Sent Events (SSE) parser for OpenAI/Anthropic-compatible streaming endpoints.\n *\n * Implements standard event-stream field rules without coupling the parser to\n * any provider-specific event schema.\n */\n\nexport interface SseEvent {\n /** Event type; omitted when the server emitted no explicit event field. */\n readonly event?: string | undefined;\n /** Event data with consecutive data fields joined by a newline. */\n readonly data: string;\n /** Last event id associated with this dispatch, when present. */\n readonly id?: string | undefined;\n /** Reconnection delay requested by the server, in milliseconds, when valid. */\n readonly retry?: number | undefined;\n}\n\nfunction dispatch(\n event: string | undefined,\n data: string[],\n id: string | undefined,\n retry: number | undefined,\n): SseEvent | undefined {\n if (data.length === 0) return undefined;\n\n const joined = data.join('\\n');\n return {\n ...(event !== undefined ? { event } : {}),\n data: joined.endsWith('\\n') ? joined.slice(0, -1) : joined,\n ...(id !== undefined ? { id } : {}),\n ...(retry !== undefined ? { retry } : {}),\n };\n}\n\n/**\n * Parses an SSE byte stream into discrete events.\n *\n * Supports CRLF, CR, and LF line endings; comments; repeated data fields;\n * event/id/retry fields; UTF-8 chunks split across arbitrary byte boundaries;\n * and a terminal event without a trailing blank line.\n */\nexport async function* parseSseStream(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<SseEvent, void, undefined> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n\n let buffer = '';\n let eventType: string | undefined;\n let data: string[] = [];\n let lastEventId: string | undefined;\n let retry: number | undefined;\n\n const processLine = (line: string): SseEvent | undefined => {\n if (line.length === 0) {\n const event = dispatch(eventType, data, lastEventId, retry);\n eventType = undefined;\n data = [];\n retry = undefined;\n return event;\n }\n\n if (line.startsWith(':')) return undefined;\n\n const separator = line.indexOf(':');\n const field = separator === -1 ? line : line.slice(0, separator);\n let value = separator === -1 ? '' : line.slice(separator + 1);\n if (value.startsWith(' ')) value = value.slice(1);\n\n switch (field) {\n case 'event':\n eventType = value;\n break;\n case 'data':\n data.push(value);\n break;\n case 'id':\n if (!value.includes('\\0')) lastEventId = value;\n break;\n case 'retry': {\n if (/^\\d+$/.test(value)) {\n const parsed = Number(value);\n if (Number.isSafeInteger(parsed)) retry = parsed;\n }\n break;\n }\n default:\n break;\n }\n\n return undefined;\n };\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const lf = buffer.indexOf('\\n');\n const cr = buffer.indexOf('\\r');\n if (lf === -1 && cr === -1) break;\n // A CR may be the first half of a CRLF sequence split across two network chunks.\n if (cr !== -1 && lf === -1 && cr === buffer.length - 1) break;\n\n const lineEnd = lf === -1 ? cr : cr === -1 ? lf : Math.min(lf, cr);\n let separatorLength = 1;\n\n if (buffer[lineEnd] === '\\r' && buffer[lineEnd + 1] === '\\n') {\n separatorLength = 2;\n }\n\n const line = buffer.slice(0, lineEnd);\n buffer = buffer.slice(lineEnd + separatorLength);\n\n const event = processLine(line);\n if (event) yield event;\n }\n }\n\n buffer += decoder.decode();\n if (buffer.length > 0) {\n const event = processLine(buffer);\n if (event) yield event;\n }\n\n const terminal = dispatch(eventType, data, lastEventId, retry);\n if (terminal) yield terminal;\n } finally {\n try {\n await reader.cancel();\n } catch {\n // The stream may already be closed or errored.\n }\n reader.releaseLock();\n }\n}\n","/**\n * Optional OpenTelemetry tracing.\n *\n * `@opentelemetry/api` is an optional peer dependency. When it isn't installed, or when\n * the host process hasn't registered a global TracerProvider, `withSpan` degrades to\n * invoking its callback directly — no spans, no exporters, nothing beyond one cached\n * dynamic `import()` attempt. Once a consumer wires up an OpenTelemetry SDK, spans for\n * HTTP requests, endpoint failover attempts, agent turns, and tool calls appear\n * automatically without any configuration on this SDK's side.\n */\n\nimport type * as Otel from '@opentelemetry/api';\n\nexport type SpanAttributeValue = string | number | boolean;\nexport type SpanAttributes = Record<string, SpanAttributeValue | undefined>;\n\nconst INSTRUMENTATION_NAME = '@nemesis-oss/ollama-sdk';\nconst INSTRUMENTATION_VERSION = '1.0.0';\n\nlet apiPromise: Promise<typeof Otel | undefined> | undefined;\n\nfunction loadApi(): Promise<typeof Otel | undefined> {\n apiPromise ??= import('@opentelemetry/api').catch(() => undefined);\n return apiPromise;\n}\n\nfunction cleanAttributes(attributes: SpanAttributes): Record<string, SpanAttributeValue> {\n const clean: Record<string, SpanAttributeValue> = {};\n for (const [key, value] of Object.entries(attributes)) {\n if (value !== undefined) {\n clean[key] = value;\n }\n }\n return clean;\n}\n\n/**\n * Runs `fn` inside an active OpenTelemetry span named `name`, when OpenTelemetry is\n * available. `fn` receives the live span (to add events/attributes as work proceeds) or\n * `undefined` when tracing is a no-op. Exceptions from `fn` are recorded on the span,\n * marked as an error status, and re-thrown unchanged; the span always ends.\n *\n * On success the span status is left `Unset` rather than forced to `Ok` — per the\n * OpenTelemetry spec, `Ok` is final and silently suppresses any later `Error` status.\n * Some call sites (e.g. tool execution, which reports failure via a return value rather\n * than a throw) need to mark a successfully-*returned* span as an error after the fact,\n * via `setSpanError`; leaving success as `Unset` keeps that possible. Backends treat\n * `Unset` the same as `Ok` for filtering purposes.\n */\nexport async function withSpan<T>(\n name: string,\n attributes: SpanAttributes,\n fn: (span: Otel.Span | undefined) => Promise<T>,\n): Promise<T> {\n const api = await loadApi();\n if (!api) {\n return fn(undefined);\n }\n\n const tracer = api.trace.getTracer(INSTRUMENTATION_NAME, INSTRUMENTATION_VERSION);\n return tracer.startActiveSpan(name, async (span) => {\n span.setAttributes(cleanAttributes(attributes));\n try {\n return await fn(span);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n span.recordException(error);\n span.setStatus({ code: api.SpanStatusCode.ERROR, message: error.message });\n throw error;\n } finally {\n span.end();\n }\n });\n}\n\n/** Adds an attribute/event to `span` if tracing is active; a cheap no-op otherwise. */\nexport function addSpanEvent(\n span: Otel.Span | undefined,\n name: string,\n attributes?: SpanAttributes,\n): void {\n span?.addEvent(name, attributes ? cleanAttributes(attributes) : undefined);\n}\n\n/**\n * Marks a span as failed without throwing — for operations (like tool execution) that\n * report failure through a return value rather than an exception. No-ops when tracing\n * is inactive.\n */\nexport async function setSpanError(span: Otel.Span | undefined, error: Error): Promise<void> {\n if (!span) {\n return;\n }\n const api = await loadApi();\n span.recordException(error);\n span.setStatus({ code: api?.SpanStatusCode.ERROR ?? 2, message: error.message });\n}\n\n// --- Semantic convention attribute keys used by this SDK's instrumentation ---\n// https://opentelemetry.io/docs/specs/semconv/http/http-spans/\nexport const ATTR_HTTP_REQUEST_METHOD = 'http.request.method';\nexport const ATTR_URL_FULL = 'url.full';\nexport const ATTR_SERVER_ADDRESS = 'server.address';\nexport const ATTR_SERVER_PORT = 'server.port';\nexport const ATTR_HTTP_RESPONSE_STATUS_CODE = 'http.response.status_code';\n\n// https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/\nexport const ATTR_GEN_AI_SYSTEM = 'gen_ai.system';\nexport const ATTR_GEN_AI_OPERATION_NAME = 'gen_ai.operation.name';\nexport const ATTR_GEN_AI_REQUEST_MODEL = 'gen_ai.request.model';\nexport const ATTR_GEN_AI_RESPONSE_MODEL = 'gen_ai.response.model';\nexport const ATTR_GEN_AI_USAGE_INPUT_TOKENS = 'gen_ai.usage.input_tokens';\nexport const ATTR_GEN_AI_USAGE_OUTPUT_TOKENS = 'gen_ai.usage.output_tokens';\nexport const ATTR_GEN_AI_TOOL_NAME = 'gen_ai.tool.name';\nexport const ATTR_GEN_AI_TOOL_CALL_ID = 'gen_ai.tool.call.id';\n\n// Attributes specific to this SDK's failover/agent model (no matching semconv entry).\nexport const ATTR_OLLAMA_ENDPOINT_NAME = 'ollama.endpoint.name';\nexport const ATTR_OLLAMA_ENDPOINT_ATTEMPT = 'ollama.endpoint.attempt';\nexport const ATTR_OLLAMA_AGENT_MAX_ITERATIONS = 'ollama.agent.max_iterations';\nexport const ATTR_OLLAMA_AGENT_ITERATION = 'ollama.agent.iteration';\nexport const GEN_AI_SYSTEM_OLLAMA = 'ollama';\n","/**\n * Native fetch HTTP transport client for Ollama API.\n */\n\nimport { mapError } from '../errors.js';\nimport { composeMiddleware, type Middleware, type RequestContext } from '../middleware.js';\nimport type { RequestLifecycleHook } from '../logger.js';\nimport { parseNdjsonStream } from '../streaming/ndjson.js';\nimport { parseSseStream, type SseEvent } from '../streaming/sse.js';\nimport type { AbortableAsyncIterable } from '../streaming/types.js';\nimport {\n withSpan,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_URL_FULL,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n type SpanAttributes,\n} from '../telemetry/index.js';\n\n/** Collapses path segments with high-cardinality values (e.g. blob digests) for span names. */\nfunction routeTemplate(path: string): string {\n return path.replace(/^\\/api\\/blobs\\/.+$/, '/api/blobs/{digest}');\n}\n\nfunction httpSpanAttributes(method: string, url: string): SpanAttributes {\n const target = new URL(url);\n return {\n [ATTR_HTTP_REQUEST_METHOD]: method,\n [ATTR_URL_FULL]: url,\n [ATTR_SERVER_ADDRESS]: target.hostname,\n [ATTR_SERVER_PORT]: target.port ? Number(target.port) : undefined,\n };\n}\n\nexport type FetchLike = typeof globalThis.fetch;\nexport type BinaryBody = Uint8Array | ArrayBuffer | string | Blob | ReadableStream<Uint8Array>;\nexport type HttpBody = unknown;\n\nlet requestSequence = 0;\n\nfunction createRequestId(): string {\n requestSequence += 1;\n return `ollama-http-${requestSequence}`;\n}\n\nfunction sameHeaders(actual: Record<string, string>, expected: Headers): boolean {\n const actualEntries = Object.fromEntries(\n Object.entries(actual).map(([key, value]) => [key.toLowerCase(), value]),\n );\n const expectedEntries = Object.fromEntries(expected.entries());\n const actualKeys = Object.keys(actualEntries);\n const expectedKeys = Object.keys(expectedEntries);\n return (\n actualKeys.length === expectedKeys.length &&\n expectedKeys.every((key) => actualEntries[key] === expectedEntries[key])\n );\n}\n\nexport interface HttpClientOptions {\n readonly baseUrl: string;\n readonly apiKey?: string | undefined;\n readonly headers?: Record<string, string> | undefined;\n readonly fetch?: FetchLike | undefined;\n readonly middleware?: readonly Middleware[] | undefined;\n readonly onLifecycleEvent?: RequestLifecycleHook | undefined;\n /** Reuse a logical request id across endpoint failover/retry attempts. */\n readonly requestId?: string | undefined;\n}\n\nexport interface HttpRequestOptions {\n readonly path: string;\n readonly method?: 'GET' | 'POST' | 'DELETE' | 'HEAD' | undefined;\n readonly body?: HttpBody;\n readonly rawBody?: BinaryBody | undefined;\n readonly headers?: Record<string, string> | undefined;\n readonly signal?: AbortSignal | undefined;\n /**\n * When `true`, return the raw {@link Response} object instead of parsing\n * the body as JSON. Used by callers that need direct access to the\n * streaming body (e.g. {@link src/generated/runtime/runtime.ts} for\n * NDJSON streaming through the runtime seam).\n *\n * The returned `Response` is the same one middleware/retry/telemetry\n * have already processed, so this option does NOT bypass any of the\n * transport-layer concerns.\n */\n readonly raw?: boolean | undefined;\n}\n\nexport class HttpClient {\n readonly baseUrl: string;\n private readonly apiKey?: string | undefined;\n private readonly defaultHeaders: Record<string, string>;\n private readonly fetchImpl: FetchLike;\n private readonly middleware: readonly Middleware[];\n private readonly onLifecycleEvent: RequestLifecycleHook | undefined;\n private readonly requestId?: string | undefined;\n\n constructor(options: HttpClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '');\n this.apiKey = options.apiKey;\n this.defaultHeaders = options.headers ?? {};\n this.fetchImpl = options.fetch ?? globalThis.fetch;\n this.middleware = options.middleware ?? [];\n this.onLifecycleEvent = options.onLifecycleEvent;\n this.requestId = options.requestId;\n }\n\n private buildHeaders(customHeaders?: Record<string, string> | undefined): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders,\n ...customHeaders,\n };\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n return headers;\n }\n\n private async fetchWithMiddleware(request: RequestContext): Promise<Response> {\n const requestId = this.requestId ?? createRequestId();\n const startedAt = Date.now();\n let rawResponse: unknown;\n this.onLifecycleEvent?.({\n type: 'start',\n requestId,\n method: request.method,\n url: request.url,\n timestamp: startedAt,\n });\n\n const finalHandler = async (req: RequestContext): Promise<{\n status: number;\n headers: Record<string, string>;\n body: Response;\n }> => {\n const init: RequestInit = {\n method: req.method,\n headers: req.headers,\n ...(req.body !== undefined ? { body: req.body as NonNullable<RequestInit['body']> } : {}),\n ...(req.signal !== undefined ? { signal: req.signal } : {}),\n };\n const response = await this.fetchImpl(req.url, init);\n rawResponse = response;\n const responseHeaders =\n response.headers && typeof response.headers.entries === 'function'\n ? Object.fromEntries(response.headers.entries())\n : {};\n return {\n status: response.status,\n headers: responseHeaders,\n body: response,\n };\n };\n\n try {\n if (this.middleware.length === 0) {\n const response = await this.fetchImpl(request.url, {\n method: request.method,\n headers: request.headers,\n ...(request.body !== undefined\n ? { body: request.body as NonNullable<RequestInit['body']> }\n : {}),\n ...(request.signal !== undefined ? { signal: request.signal } : {}),\n });\n if (response.status >= 200 && response.status < 300) {\n this.onLifecycleEvent?.({\n type: 'success',\n requestId,\n durationMs: Date.now() - startedAt,\n status: response.status,\n timestamp: Date.now(),\n });\n } else {\n this.onLifecycleEvent?.({\n type: 'error',\n requestId,\n durationMs: Date.now() - startedAt,\n error: mapError(new Error(`HTTP ${response.status}`), {\n request: { method: request.method, url: request.url },\n response: { status: response.status },\n }),\n timestamp: Date.now(),\n });\n }\n return response;\n }\n\n const pipeline = composeMiddleware(this.middleware, finalHandler);\n const context = await pipeline(request);\n\n let response: Response;\n if (rawResponse !== undefined && context.body === rawResponse) {\n response = rawResponse as Response;\n if (\n context.status !== response.status ||\n !sameHeaders(context.headers, response.headers)\n ) {\n const cloned = response.clone();\n response = new Response(cloned.body, {\n status: context.status,\n headers: context.headers,\n });\n }\n } else if (context.body instanceof Response) {\n if (\n context.status === context.body.status &&\n sameHeaders(context.headers, context.body.headers)\n ) {\n response = context.body;\n } else {\n const cloned = context.body.clone();\n response = new Response(cloned.body, {\n status: context.status,\n headers: context.headers,\n });\n }\n } else if (\n context.body === undefined ||\n typeof context.body === 'string' ||\n context.body instanceof ArrayBuffer ||\n ArrayBuffer.isView(context.body) ||\n context.body instanceof Blob ||\n context.body instanceof ReadableStream\n ) {\n response = new Response(context.body as RequestInit['body'], {\n status: context.status,\n headers: context.headers,\n });\n } else {\n response = new Response(JSON.stringify(context.body), {\n status: context.status,\n headers: context.headers,\n });\n }\n\n if (context.status >= 200 && context.status < 300) {\n this.onLifecycleEvent?.({\n type: 'success',\n requestId,\n durationMs: Date.now() - startedAt,\n status: context.status,\n timestamp: Date.now(),\n });\n } else {\n this.onLifecycleEvent?.({\n type: 'error',\n requestId,\n durationMs: Date.now() - startedAt,\n error: mapError(new Error(`HTTP ${context.status}`), {\n request: { method: request.method, url: request.url },\n response: { status: context.status, headers: context.headers },\n }),\n timestamp: Date.now(),\n });\n }\n return response;\n } catch (error) {\n const mapped = mapError(error, {\n request: { method: request.method, url: request.url },\n });\n this.onLifecycleEvent?.({\n type: 'error',\n requestId,\n durationMs: Date.now() - startedAt,\n error: mapped,\n timestamp: Date.now(),\n });\n throw mapped;\n }\n }\n\n async request<T>(options: HttpRequestOptions): Promise<T> {\n const url = `${this.baseUrl}${options.path}`;\n const method =\n options.method ??\n (options.body !== undefined || options.rawBody !== undefined ? 'POST' : 'GET');\n const headers = this.buildHeaders(options.headers);\n\n if (options.rawBody !== undefined && !options.headers?.['Content-Type']) {\n delete headers['Content-Type'];\n }\n\n return withSpan(\n `${method} ${routeTemplate(options.path)}`,\n httpSpanAttributes(method, url),\n async (span) => {\n try {\n const bodyInit =\n options.rawBody !== undefined\n ? (options.rawBody as never)\n : options.body !== undefined\n ? JSON.stringify(options.body)\n : undefined;\n\n const response = await this.fetchWithMiddleware({\n url,\n method,\n headers,\n ...(bodyInit !== undefined ? { body: bodyInit } : {}),\n ...(options.signal !== undefined ? { signal: options.signal } : {}),\n });\n span?.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, response.status);\n\n if (!response.ok) {\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n errorBody = await response.text();\n }\n const message =\n typeof errorBody === 'object' && errorBody !== null && 'error' in errorBody\n ? String((errorBody as { error: unknown }).error)\n : `HTTP ${response.status} ${response.statusText}`;\n\n throw mapError(new Error(message), {\n request: { method, url },\n response: { status: response.status, body: errorBody },\n });\n }\n\n if (options.method === 'HEAD' || response.status === 204) {\n return undefined as T;\n }\n\n // Raw mode: return the Response object directly so callers can\n // access the streaming body. Middleware, retry, telemetry, and\n // error-mapping have already run by this point.\n if (options.raw === true) {\n return response as unknown as T;\n }\n\n if (typeof response.text === 'function') {\n const text = await response.text();\n return (text ? JSON.parse(text) : undefined) as T;\n }\n if (typeof response.json === 'function') {\n return (await response.json()) as T;\n }\n return undefined as T;\n } catch (err) {\n throw mapError(err, { request: { method, url } });\n }\n },\n );\n }\n\n /**\n * Opens an event-stream response and exposes parsed SSE events.\n *\n * This is intentionally schema-agnostic so OpenAI and Anthropic compatibility layers\n * can decode their provider-specific event payloads without duplicating transport logic.\n */\n async requestSseStream(options: HttpRequestOptions): Promise<AbortableAsyncIterable<SseEvent>> {\n const url = `${this.baseUrl}${options.path}`;\n const method = options.method ?? 'POST';\n const headers = {\n ...this.buildHeaders(options.headers),\n Accept: 'text/event-stream',\n };\n\n return withSpan(\n `${method} ${routeTemplate(options.path)}`,\n httpSpanAttributes(method, url),\n async (span) => {\n try {\n const controller = new AbortController();\n const removeAbortListener =\n options.signal !== undefined\n ? (() => {\n if (options.signal.aborted) {\n controller.abort(options.signal.reason);\n } else {\n const onAbort = (): void => controller.abort(options.signal?.reason);\n options.signal.addEventListener('abort', onAbort, { once: true });\n return () => options.signal?.removeEventListener('abort', onAbort);\n }\n return undefined;\n })()\n : undefined;\n\n const response = await this.fetchWithMiddleware({\n url,\n method,\n headers,\n ...(options.body !== undefined ? { body: JSON.stringify(options.body) } : {}),\n signal: controller.signal,\n });\n span?.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, response.status);\n\n if (!response.ok) {\n removeAbortListener?.();\n const errorText = await response.text();\n throw mapError(new Error(errorText || `HTTP ${response.status}`), {\n request: { method, url },\n response: { status: response.status, body: errorText },\n });\n }\n\n if (!response.body) {\n removeAbortListener?.();\n throw mapError(new Error('Response body is null, cannot stream SSE'), {\n request: { method, url },\n });\n }\n\n const stream = (async function* (): AsyncGenerator<SseEvent, void, undefined> {\n try {\n yield* parseSseStream(response.body!);\n } finally {\n removeAbortListener?.();\n }\n })();\n\n return {\n [Symbol.asyncIterator]() {\n return stream[Symbol.asyncIterator]();\n },\n abort: () => {\n removeAbortListener?.();\n controller.abort();\n },\n } as AbortableAsyncIterable<SseEvent>;\n } catch (err) {\n throw mapError(err, { request: { method, url } });\n }\n },\n );\n }\n\n async requestStream<T>(options: HttpRequestOptions): Promise<AbortableAsyncIterable<T>> {\n const url = `${this.baseUrl}${options.path}`;\n const method = options.method ?? 'POST';\n const headers = this.buildHeaders(options.headers);\n\n return withSpan(\n `${method} ${routeTemplate(options.path)}`,\n httpSpanAttributes(method, url),\n async (span) => {\n try {\n const controller = new AbortController();\n const removeAbortListener =\n options.signal !== undefined\n ? (() => {\n if (options.signal.aborted) {\n controller.abort(options.signal.reason);\n } else {\n const onAbort = (): void => controller.abort(options.signal?.reason);\n options.signal.addEventListener('abort', onAbort, { once: true });\n return () => options.signal?.removeEventListener('abort', onAbort);\n }\n return undefined;\n })()\n : undefined;\n\n const response = await this.fetchWithMiddleware({\n url,\n method,\n headers,\n ...(options.body !== undefined ? { body: JSON.stringify(options.body) } : {}),\n signal: controller.signal,\n });\n span?.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, response.status);\n\n if (!response.ok) {\n removeAbortListener?.();\n const errorText = await response.text();\n throw mapError(new Error(errorText || `HTTP ${response.status}`), {\n request: { method, url },\n response: { status: response.status, body: errorText },\n });\n }\n\n if (!response.body) {\n removeAbortListener?.();\n throw mapError(new Error('Response body is null, cannot stream'), {\n request: { method, url },\n });\n }\n\n const stream = parseNdjsonStream<T>(response.body);\n const abortable: AbortableAsyncIterable<T> = {\n [Symbol.asyncIterator]() {\n return (async function* (): AsyncGenerator<T, void, undefined> {\n try {\n yield* stream;\n } finally {\n removeAbortListener?.();\n }\n })()[Symbol.asyncIterator]();\n },\n abort: () => {\n removeAbortListener?.();\n controller.abort();\n },\n };\n return abortable;\n } catch (err) {\n throw mapError(err, { request: { method, url } });\n }\n },\n );\n }\n}\n","/**\n * Active endpoint health pinging utility.\n */\n\nimport { HttpClient, type FetchLike } from '../transport/http.js';\nimport type { OllamaEndpoint } from './endpoint-registry.js';\nimport type { Middleware } from '../middleware.js';\nimport type { RequestLifecycleHook } from '../logger.js';\nimport type { VersionResponse } from '../types.js';\n\nexport interface EndpointHealthCheckResult {\n readonly name: string;\n readonly baseUrl: string;\n readonly reachable: boolean;\n readonly latencyMs: number;\n readonly version?: string;\n readonly error?: string;\n}\n\nexport async function checkEndpointHealth(\n endpoint: OllamaEndpoint,\n fetchImpl?: FetchLike,\n timeoutMs = 5000,\n middleware?: readonly Middleware[] | undefined,\n onLifecycleEvent?: RequestLifecycleHook | undefined,\n): Promise<EndpointHealthCheckResult> {\n const client = new HttpClient({\n baseUrl: endpoint.baseUrl,\n apiKey: endpoint.apiKey,\n headers: endpoint.headers,\n fetch: fetchImpl,\n middleware,\n onLifecycleEvent,\n });\n\n const startTime = Date.now();\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const res = await client.request<VersionResponse>({\n path: '/api/version',\n method: 'GET',\n signal: controller.signal,\n });\n const latencyMs = Date.now() - startTime;\n return {\n name: endpoint.name,\n baseUrl: endpoint.baseUrl,\n reachable: true,\n latencyMs,\n version: res.version,\n };\n } catch (err) {\n const latencyMs = Date.now() - startTime;\n return {\n name: endpoint.name,\n baseUrl: endpoint.baseUrl,\n reachable: false,\n latencyMs,\n error: err instanceof Error ? err.message : String(err),\n };\n } finally {\n clearTimeout(timer);\n }\n}\n","/**\n * Model capability detection and runtime environment inference.\n */\n\nimport { HttpClient } from '../transport/http.js';\nimport type { ListResponse, ModelResponse, ShowResponse, ThinkingMetadata } from '../types.js';\n\nexport type RuntimeMode = 'local' | 'cloud' | 'unknown';\n\nexport interface ModelCapabilities {\n readonly model: string;\n readonly reported: readonly string[];\n readonly supportsTools: boolean;\n readonly supportsVision: boolean;\n readonly supportsEmbedding: boolean;\n readonly supportsCompletion: boolean;\n readonly supportsThinking: boolean;\n /** Model-defined thinking values and default, when /api/show reports them. */\n readonly thinking?: ThinkingMetadata | undefined;\n readonly supportsStreaming: true;\n /** Maximum model context length reported by /api/show model_info, when available. */\n readonly contextLength?: number | undefined;\n /**\n * Best-effort inference, not a guarantee: Ollama's `/api/show` does not report structured\n * output support as a queryable capability, so this is inferred from {@link inferRuntimeMode}\n * — `false` for `cloud`, since Ollama Cloud does not currently support structured outputs;\n * `true` for `local`/`unknown`. A locally-hosted model that genuinely can't follow a JSON\n * schema will still report `true` here; the request itself is the only reliable way to find\n * out. `OllamaClient.chat`/`generate` apply this same inference as a fail-fast pre-flight\n * guard whenever `format` is set, throwing `OllamaUnsupportedCapabilityError` rather than\n * making a network call that Ollama Cloud is known to reject.\n */\n readonly supportsStructuredOutputRequest: boolean;\n}\n\nexport function inferRuntimeMode(baseUrl: string): RuntimeMode {\n try {\n const url = new URL(baseUrl);\n const host = url.hostname.toLowerCase();\n if (\n host === 'localhost' ||\n host === '127.0.0.1' ||\n host === '::1' ||\n host.endsWith('.local') ||\n host.startsWith('192.168.') ||\n host.startsWith('10.')\n ) {\n return 'local';\n }\n return 'cloud';\n } catch {\n return 'unknown';\n }\n}\n\nfunction extractContextLength(modelInfo?: Record<string, unknown>): number | undefined {\n if (!modelInfo) return undefined;\n for (const [key, value] of Object.entries(modelInfo)) {\n if (\n key.endsWith('.context_length') &&\n typeof value === 'number' &&\n Number.isFinite(value) &&\n value > 0\n ) {\n return value;\n }\n }\n return undefined;\n}\n\nexport async function detectModelCapabilities(\n http: HttpClient,\n model: string,\n signal?: AbortSignal,\n): Promise<ModelCapabilities> {\n const showRes = await http.request<ShowResponse>({\n path: '/api/show',\n body: { model },\n ...(signal !== undefined ? { signal } : {}),\n });\n\n const reported = showRes.capabilities ?? [];\n const reportedSet = new Set(reported.map((c) => c.toLowerCase()));\n\n const contextLength = extractContextLength(showRes.model_info);\n\n return {\n model,\n reported,\n supportsTools: reportedSet.has('tools'),\n supportsVision: reportedSet.has('vision'),\n supportsEmbedding: reportedSet.has('embedding'),\n supportsCompletion: reportedSet.has('completion') || !reportedSet.has('embedding'),\n supportsThinking: reportedSet.has('thinking'),\n ...(showRes.thinking !== undefined ? { thinking: showRes.thinking } : {}),\n ...(contextLength !== undefined ? { contextLength } : {}),\n supportsStreaming: true,\n supportsStructuredOutputRequest: inferRuntimeMode(http.baseUrl) !== 'cloud',\n };\n}\n\nexport async function listAvailableModels(http: HttpClient): Promise<ModelResponse[]> {\n const res = await http.request<ListResponse>({\n path: '/api/tags',\n method: 'GET',\n });\n return [...res.models];\n}\n","/**\n * Zod schema conversion to JSON Schema for Ollama structured outputs.\n */\n\nimport { z } from 'zod';\nimport { OllamaToolValidationError } from '../errors.js';\n\nexport type SupportedSchema<T = unknown> = z.ZodType<T>;\n\nfunction extractJsonSubstring(text: string): string {\n const trimmed = text.trim();\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n return trimmed;\n }\n const match = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/);\n if (match && match[1]) {\n return match[1].trim();\n }\n const firstBrace = trimmed.indexOf('{');\n const lastBrace = trimmed.lastIndexOf('}');\n if (firstBrace !== -1 && lastBrace > firstBrace) {\n return trimmed.slice(firstBrace, lastBrace + 1);\n }\n return trimmed;\n}\n\n/**\n * Best-effort structural JSON Schema conversion for Zod v3 schemas, which lack a\n * native `toJSONSchema` API. Walks the internal `_def` shape that v3 exposes.\n */\nexport function zodV3ToJsonSchema(schema: unknown): Record<string, unknown> {\n const def = (schema as { _def?: { typeName?: string; [key: string]: unknown } })._def;\n if (!def) {\n return { type: 'object' };\n }\n\n switch (def['typeName']) {\n case 'ZodObject': {\n const shape = (def['shape'] as () => Record<string, unknown>)();\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = zodV3ToJsonSchema(value);\n if (!isZodV3Optional(value)) {\n required.push(key);\n }\n }\n return {\n type: 'object',\n properties,\n ...(required.length > 0 ? { required } : {}),\n };\n }\n case 'ZodString':\n return { type: 'string' };\n case 'ZodNumber':\n return { type: 'number' };\n case 'ZodBoolean':\n return { type: 'boolean' };\n case 'ZodDate':\n return { type: 'string', format: 'date-time' };\n case 'ZodArray':\n return { type: 'array', items: zodV3ToJsonSchema(def['type']) };\n case 'ZodEnum':\n return { type: 'string', enum: def['values'] };\n case 'ZodNativeEnum':\n return { enum: Object.values(def['values'] as Record<string, unknown>) };\n case 'ZodLiteral':\n return { const: def['value'] };\n case 'ZodOptional':\n case 'ZodNullable':\n case 'ZodDefault':\n return zodV3ToJsonSchema(def['innerType']);\n case 'ZodEffects':\n return zodV3ToJsonSchema(def['schema']);\n case 'ZodUnion':\n return { anyOf: (def['options'] as unknown[]).map((option) => zodV3ToJsonSchema(option)) };\n case 'ZodRecord':\n return { type: 'object', additionalProperties: zodV3ToJsonSchema(def['valueType']) };\n default:\n return { type: 'object' };\n }\n}\n\nfunction isZodV3Optional(schema: unknown): boolean {\n const typeName = (schema as { _def?: { typeName?: string } })._def?.typeName;\n return typeName === 'ZodOptional' || typeName === 'ZodDefault';\n}\n\n/**\n * Converts a Zod schema into a JSON Schema object accepted by Ollama's `format` parameter.\n *\n * Uses Zod v4's native `z.toJSONSchema` when available, falling back to a structural\n * walk of Zod v3's internal `_def` shape so both major versions work as peer dependencies.\n */\nexport function zodToJsonSchema<T>(schema: z.ZodType<T>): Record<string, unknown> {\n if (\n typeof (z as { toJSONSchema?: (s: z.ZodType<T>) => Record<string, unknown> }).toJSONSchema ===\n 'function'\n ) {\n return (\n z as unknown as { toJSONSchema: (s: z.ZodType<T>) => Record<string, unknown> }\n ).toJSONSchema(schema);\n }\n\n return zodV3ToJsonSchema(schema);\n}\n\n/**\n * Parses and validates a JSON output string against a Zod schema.\n */\nexport function parseStructuredOutput<T>(\n rawJson: string,\n schema: z.ZodType<T>,\n toolName = 'structured_output',\n): T {\n let parsed: unknown;\n const jsonStr = extractJsonSubstring(rawJson);\n try {\n parsed = JSON.parse(jsonStr);\n } catch (err) {\n throw new OllamaToolValidationError(`Failed to parse structured output as JSON: ${rawJson}`, {\n toolName,\n cause: err,\n });\n }\n\n const result = schema.safeParse(parsed);\n if (!result.success) {\n throw new OllamaToolValidationError(`Structured output failed schema validation`, {\n toolName,\n issues: result.error.issues,\n cause: result.error,\n });\n }\n\n return result.data;\n}\n","/**\n * Token usage and duration calculation utilities.\n */\n\nexport const NANOS_PER_MS = 1_000_000;\nexport const NANOS_PER_SECOND = 1_000_000_000;\n\nexport interface TokenUsage {\n readonly promptTokens: number;\n /** Prompt tokens read from Ollama's KV cache. */\n readonly cachedPromptTokens?: number | undefined;\n readonly completionTokens: number;\n readonly totalTokens: number;\n readonly tokensPerSecond?: number | undefined;\n readonly loadDurationMs?: number | undefined;\n readonly promptEvalDurationMs?: number | undefined;\n readonly evalDurationMs?: number | undefined;\n readonly totalDurationMs?: number | undefined;\n}\n\nexport interface RawUsageSource {\n readonly prompt_eval_count?: number | undefined;\n readonly prompt_eval_cached_count?: number | undefined;\n readonly eval_count?: number | undefined;\n readonly total_duration?: number | undefined;\n readonly load_duration?: number | undefined;\n readonly prompt_eval_duration?: number | undefined;\n readonly eval_duration?: number | undefined;\n}\n\n/**\n * Extracts and normalizes token usage metrics from an Ollama response.\n */\nexport function extractUsage(raw: RawUsageSource): TokenUsage {\n const promptTokens = raw.prompt_eval_count ?? 0;\n const completionTokens = raw.eval_count ?? 0;\n const totalTokens = promptTokens + completionTokens;\n\n let tokensPerSecond: number | undefined;\n if (raw.eval_count && raw.eval_duration && raw.eval_duration > 0) {\n tokensPerSecond = Number(((raw.eval_count / raw.eval_duration) * NANOS_PER_SECOND).toFixed(2));\n }\n\n return {\n promptTokens,\n ...(raw.prompt_eval_cached_count !== undefined\n ? { cachedPromptTokens: raw.prompt_eval_cached_count }\n : {}),\n completionTokens,\n totalTokens,\n ...(tokensPerSecond !== undefined ? { tokensPerSecond } : {}),\n ...(raw.load_duration !== undefined\n ? { loadDurationMs: raw.load_duration / NANOS_PER_MS }\n : {}),\n ...(raw.prompt_eval_duration !== undefined\n ? { promptEvalDurationMs: raw.prompt_eval_duration / NANOS_PER_MS }\n : {}),\n ...(raw.eval_duration !== undefined\n ? { evalDurationMs: raw.eval_duration / NANOS_PER_MS }\n : {}),\n ...(raw.total_duration !== undefined\n ? { totalDurationMs: raw.total_duration / NANOS_PER_MS }\n : {}),\n };\n}\n","/**\n * Synthetic tool-call ID generation.\n *\n * Ollama's native `/api/chat` protocol does not assign an identifier to a tool call —\n * see the {@link ToolCall} docs in `../types.js`. To let consumers correlate a tool\n * result back to its call the way OpenAI's `tool_call_id` does (useful for logging,\n * OpenAI-shaped transcripts, or just not having to track array position by hand), the\n * SDK synthesizes a stable client-side `id` the first time it sees a tool call that\n * doesn't already have one, and reuses that same id everywhere that call is referenced\n * (the streamed `tool_call` event, the final aggregated message, `ToolExecutionResult`,\n * and the `role: 'tool'` history entry `Agent` appends). It has no meaning to Ollama or\n * the model itself — it's purely a client-side bookkeeping aid.\n *\n * Uses the global Web Crypto `crypto.randomUUID()` (available in Node 20+, browsers, and\n * every Edge runtime this SDK targets) rather than `node:crypto`, which would break Edge\n * Runtime compatibility (see ADR 0006).\n */\n\nimport type { ToolCall } from '../types.js';\n\nexport function generateToolCallId(): string {\n return `call_${crypto.randomUUID()}`;\n}\n\n/**\n * Returns `toolCalls` with every entry guaranteed to have an `id`, generating one for any\n * entry that lacks it. Entries that already have an `id` (e.g. re-processed calls) are\n * left untouched so ids stay stable across repeated calls on the same data.\n */\nexport function ensureToolCallIds(\n toolCalls: readonly ToolCall[] | undefined,\n): readonly ToolCall[] | undefined {\n if (!toolCalls || toolCalls.length === 0) {\n return toolCalls;\n }\n return toolCalls.map((tc) => (tc.id !== undefined ? tc : { ...tc, id: generateToolCallId() }));\n}\n","/**\n * Dual-mode (AsyncIterator and EventEmitter-like) stream wrapper.\n */\n\nimport { mapError, OllamaAbortError, type OllamaClientError } from '../errors.js';\nimport type { AbortableAsyncIterable, OllamaStreamEvent, OllamaStreamEventType } from './types.js';\n\ntype ChunkMapper<TChunk, TFinal> = (\n chunk: TChunk,\n accumulated: TFinal,\n) => Array<OllamaStreamEvent<TChunk, TFinal>>;\n\ntype Aggregator<TChunk, TFinal> = (accumulated: TFinal, chunk: TChunk) => TFinal;\n\ntype Listener<TChunk, TFinal> = (event: OllamaStreamEvent<TChunk, TFinal>) => void;\n\nexport class OllamaStream<TChunk, TFinal> implements AsyncIterable<\n OllamaStreamEvent<TChunk, TFinal>\n> {\n private mode: 'unconsumed' | 'iterator' | 'events' = 'unconsumed';\n private readonly listeners = new Map<string, Set<Listener<TChunk, TFinal>>>();\n private readonly finalResultPromise: Promise<TFinal>;\n private resolveFinal!: (value: TFinal) => void;\n private rejectFinal!: (reason: OllamaClientError) => void;\n private removeAbortListener: (() => void) | undefined;\n\n constructor(\n private readonly source: AbortableAsyncIterable<TChunk>,\n private readonly mapChunk: ChunkMapper<TChunk, TFinal>,\n private readonly aggregate: Aggregator<TChunk, TFinal>,\n private readonly initial: TFinal,\n signal?: AbortSignal,\n ) {\n this.finalResultPromise = new Promise<TFinal>((resolve, reject) => {\n this.resolveFinal = resolve;\n this.rejectFinal = reject;\n });\n\n if (signal !== undefined) {\n const onAbort = (): void => this.abort();\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener('abort', onAbort, { once: true });\n this.removeAbortListener = () => signal.removeEventListener('abort', onAbort);\n }\n }\n }\n\n get finalResult(): Promise<TFinal> {\n return this.finalResultPromise;\n }\n\n abort(): void {\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n this.source.abort?.();\n this.rejectFinal(new OllamaAbortError('Ollama stream aborted'));\n }\n\n on<TType extends OllamaStreamEventType>(\n type: TType,\n listener: (event: Extract<OllamaStreamEvent<TChunk, TFinal>, { type: TType }>) => void,\n ): () => void {\n if (this.mode === 'iterator') {\n throw new Error(\n 'Cannot register event listeners: this stream is already being consumed via async iteration.',\n );\n }\n\n const genericListener = listener as Listener<TChunk, TFinal>;\n let set = this.listeners.get(type);\n if (!set) {\n set = new Set();\n this.listeners.set(type, set);\n }\n set.add(genericListener);\n\n if (this.mode !== 'events') {\n this.mode = 'events';\n void this.pump();\n }\n\n return () => {\n set?.delete(genericListener);\n };\n }\n\n private emit(event: OllamaStreamEvent<TChunk, TFinal>): void {\n for (const listener of this.listeners.get(event.type) ?? []) {\n listener(event);\n }\n }\n\n private async pump(): Promise<void> {\n let accumulated = this.initial;\n try {\n for await (const chunk of this.source) {\n accumulated = this.aggregate(accumulated, chunk);\n for (const event of this.mapChunk(chunk, accumulated)) {\n this.emit(event);\n if (event.type === 'done') {\n this.resolveFinal(event.data.result);\n }\n }\n }\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n } catch (error) {\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n const mapped = mapError(error);\n this.emit({ type: 'error', data: { error: mapped } });\n this.rejectFinal(mapped);\n }\n }\n\n async *[Symbol.asyncIterator](): AsyncGenerator<\n OllamaStreamEvent<TChunk, TFinal>,\n void,\n undefined\n > {\n if (this.mode === 'events') {\n throw new Error(\n 'Cannot use async iteration: this stream already has event listeners registered via .on().',\n );\n }\n this.mode = 'iterator';\n let accumulated = this.initial;\n let completed = false;\n try {\n for await (const chunk of this.source) {\n accumulated = this.aggregate(accumulated, chunk);\n const events = this.mapChunk(chunk, accumulated);\n for (const event of events) {\n if (event.type === 'done') {\n completed = true;\n this.resolveFinal(event.data.result);\n }\n yield event;\n }\n }\n } catch (error) {\n const mapped = mapError(error);\n this.rejectFinal(mapped);\n yield { type: 'error', data: { error: mapped } };\n } finally {\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n if (!completed) {\n this.source.abort?.();\n this.rejectFinal(new OllamaAbortError('Ollama stream ended before completion'));\n }\n }\n }\n}\n","/**\n * Normalization mappers and aggregators for Ollama streaming responses.\n */\n\nimport type { ChatResponse, GenerateResponse, ProgressResponse } from '../types.js';\nimport { extractUsage, NANOS_PER_MS } from '../usage.js';\nimport { ensureToolCallIds } from '../tools/tool-call-id.js';\nimport { OllamaStream } from './stream.js';\nimport type {\n AbortableAsyncIterable,\n ChatStreamResult,\n GenerateStreamResult,\n OllamaStreamEvent,\n ProgressStreamResult,\n} from './types.js';\n\nfunction aggregateChat(accumulated: ChatStreamResult, chunk: ChatResponse): ChatStreamResult {\n const message = chunk.message ?? { role: 'assistant', content: '' };\n return {\n message: {\n role: message.role || accumulated.message.role,\n content: accumulated.message.content + (message.content ?? ''),\n thinking:\n message.thinking !== undefined\n ? (accumulated.message.thinking ?? '') + message.thinking\n : accumulated.message.thinking,\n tool_calls: message.tool_calls?.length\n ? [...(accumulated.message.tool_calls ?? []), ...message.tool_calls]\n : accumulated.message.tool_calls,\n },\n model: chunk.model,\n done: chunk.done,\n doneReason: chunk.done ? chunk.done_reason : accumulated.doneReason,\n totalDurationMs:\n chunk.done && chunk.total_duration !== undefined\n ? chunk.total_duration / NANOS_PER_MS\n : accumulated.totalDurationMs,\n usage: chunk.done ? extractUsage(chunk) : accumulated.usage,\n raw: chunk,\n };\n}\n\nfunction mapChatChunk(\n chunk: ChatResponse,\n aggregated: ChatStreamResult,\n): Array<OllamaStreamEvent<ChatResponse, ChatStreamResult>> {\n const events: Array<OllamaStreamEvent<ChatResponse, ChatStreamResult>> = [];\n const message = chunk.message;\n\n if (message?.thinking) {\n events.push({ type: 'thinking', data: { delta: message.thinking } });\n }\n for (const toolCall of message?.tool_calls ?? []) {\n events.push({ type: 'tool_call', data: { toolCall } });\n }\n if (message?.content) {\n events.push({ type: 'token', data: { delta: message.content, role: message.role } });\n }\n events.push({ type: 'message', data: { chunk } });\n if (chunk.done) {\n events.push({ type: 'done', data: { result: aggregated } });\n }\n return events;\n}\n\n/**\n * Wraps `source` so every chunk's `message.tool_calls` carries a stable client-synthesized\n * `id` (see `../tools/tool-call-id.js`) before it reaches either the aggregator or the\n * per-chunk event mapper — both read the same chunk object, so ids must be assigned exactly\n * once here rather than independently in each, or the streamed `tool_call` event and the\n * final aggregated message would end up with two different ids for the same call.\n */\nfunction withStableToolCallIds(\n source: AbortableAsyncIterable<ChatResponse>,\n): AbortableAsyncIterable<ChatResponse> {\n async function* generator(): AsyncGenerator<ChatResponse, void, undefined> {\n for await (const chunk of source) {\n const toolCalls = chunk.message?.tool_calls;\n if (!toolCalls?.length) {\n yield chunk;\n continue;\n }\n yield { ...chunk, message: { ...chunk.message, tool_calls: ensureToolCallIds(toolCalls) } };\n }\n }\n return Object.assign(generator(), { abort: source.abort });\n}\n\nexport function normalizeChatStream(\n source: AbortableAsyncIterable<ChatResponse>,\n signal?: AbortSignal,\n): OllamaStream<ChatResponse, ChatStreamResult> {\n const initial: ChatStreamResult = {\n message: { role: 'assistant', content: '' },\n model: '',\n done: false,\n };\n return new OllamaStream(withStableToolCallIds(source), mapChatChunk, aggregateChat, initial, signal);\n}\n\nfunction aggregateGenerate(\n accumulated: GenerateStreamResult,\n chunk: GenerateResponse,\n): GenerateStreamResult {\n return {\n response: accumulated.response + (chunk.response ?? ''),\n model: chunk.model,\n done: chunk.done,\n doneReason: chunk.done ? chunk.done_reason : accumulated.doneReason,\n totalDurationMs:\n chunk.done && chunk.total_duration !== undefined\n ? chunk.total_duration / NANOS_PER_MS\n : accumulated.totalDurationMs,\n usage: chunk.done ? extractUsage(chunk) : accumulated.usage,\n thinking:\n chunk.thinking !== undefined\n ? (accumulated.thinking ?? '') + chunk.thinking\n : accumulated.thinking,\n image: chunk.image ?? accumulated.image,\n completed: chunk.completed ?? accumulated.completed,\n total: chunk.total ?? accumulated.total,\n raw: chunk,\n };\n}\n\nfunction mapGenerateChunk(\n chunk: GenerateResponse,\n aggregated: GenerateStreamResult,\n): Array<OllamaStreamEvent<GenerateResponse, GenerateStreamResult>> {\n const events: Array<OllamaStreamEvent<GenerateResponse, GenerateStreamResult>> = [];\n\n if (chunk.thinking) {\n events.push({ type: 'thinking', data: { delta: chunk.thinking } });\n }\n if (chunk.response) {\n events.push({ type: 'token', data: { delta: chunk.response, role: 'assistant' } });\n }\n events.push({ type: 'message', data: { chunk } });\n if (chunk.done) {\n events.push({ type: 'done', data: { result: aggregated } });\n }\n return events;\n}\n\nexport function normalizeGenerateStream(\n source: AbortableAsyncIterable<GenerateResponse>,\n signal?: AbortSignal,\n): OllamaStream<GenerateResponse, GenerateStreamResult> {\n const initial: GenerateStreamResult = { response: '', model: '', done: false };\n return new OllamaStream(source, mapGenerateChunk, aggregateGenerate, initial, signal);\n}\n\nfunction aggregateProgress(\n _accumulated: ProgressStreamResult,\n chunk: ProgressResponse,\n): ProgressStreamResult {\n return {\n status: chunk.status,\n completed: chunk.completed,\n total: chunk.total,\n done: chunk.status === 'success',\n raw: chunk,\n };\n}\n\nfunction mapProgressChunk(\n chunk: ProgressResponse,\n aggregated: ProgressStreamResult,\n): Array<OllamaStreamEvent<ProgressResponse, ProgressStreamResult>> {\n const events: Array<OllamaStreamEvent<ProgressResponse, ProgressStreamResult>> = [\n { type: 'message', data: { chunk } },\n ];\n if (chunk.status === 'success') {\n events.push({ type: 'done', data: { result: aggregated } });\n }\n return events;\n}\n\nexport function normalizeProgressStream(\n source: AbortableAsyncIterable<ProgressResponse>,\n signal?: AbortSignal,\n): OllamaStream<ProgressResponse, ProgressStreamResult> {\n const initial: ProgressStreamResult = { status: '', done: false };\n return new OllamaStream(source, mapProgressChunk, aggregateProgress, initial, signal);\n}\n","/**\n * Exponential backoff with full jitter calculation.\n */\n\nexport interface BackoffOptions {\n readonly initialDelayMs: number;\n readonly maxDelayMs: number;\n readonly backoffFactor: number;\n}\n\nexport const DEFAULT_BACKOFF: BackoffOptions = {\n initialDelayMs: 500,\n maxDelayMs: 30_000,\n backoffFactor: 2,\n};\n\n/**\n * Calculates exponential backoff with full jitter for attempt (0-indexed).\n */\nexport function calculateBackoff(\n attempt: number,\n options: BackoffOptions = DEFAULT_BACKOFF,\n): number {\n const exponential = options.initialDelayMs * Math.pow(options.backoffFactor, attempt);\n const ceiling = Math.min(exponential, options.maxDelayMs);\n // Full jitter: random duration between 0 and ceiling\n return Math.floor(Math.random() * (ceiling + 1));\n}\n","/**\n * Retry policy and execution runner.\n */\n\nimport { OllamaAbortError, OllamaClientError } from '../errors.js';\nimport { calculateBackoff, type BackoffOptions, DEFAULT_BACKOFF } from './backoff.js';\n\nexport interface RetryConfig {\n readonly maxRetries: number;\n readonly backoff: BackoffOptions;\n readonly shouldRetry?: (error: Error, attempt: number) => boolean;\n readonly onRetry?: (error: Error, attempt: number, delayMs: number) => void;\n}\n\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 3,\n backoff: DEFAULT_BACKOFF,\n};\n\nfunction isRetryableDefault(error: Error): boolean {\n if (error instanceof OllamaClientError) {\n return error.retryable;\n }\n return false;\n}\n\nfunction abortError(\n signal: AbortSignal | undefined,\n fallbackMessage: string,\n): OllamaAbortError | OllamaClientError {\n const reason = signal?.reason;\n if (reason instanceof OllamaClientError) return reason;\n return new OllamaAbortError(\n reason instanceof Error && reason.message ? reason.message : fallbackMessage,\n { cause: reason },\n );\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(abortError(signal, 'Retry backoff aborted'));\n return;\n }\n\n const timerId = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = (): void => {\n if (timerId !== undefined) clearTimeout(timerId);\n signal?.removeEventListener('abort', onAbort);\n reject(abortError(signal, 'Retry backoff aborted'));\n };\n\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/**\n * Executes an async operation with retries according to config.\n */\nexport async function withRetry<T>(\n operation: (attempt: number) => Promise<T>,\n config: RetryConfig = DEFAULT_RETRY_CONFIG,\n signal?: AbortSignal,\n): Promise<T> {\n let attempt = 0;\n while (true) {\n try {\n return await operation(attempt);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n const shouldRetry = config.shouldRetry ?? isRetryableDefault;\n if (attempt >= config.maxRetries || !shouldRetry(error, attempt)) {\n throw error;\n }\n const delayMs = calculateBackoff(attempt, config.backoff);\n config.onRetry?.(error, attempt, delayMs);\n await sleep(delayMs, signal);\n attempt += 1;\n }\n }\n}\n","/**\n * AbortSignal and timeout management for HTTP requests.\n */\n\nimport { OllamaTimeoutError } from '../errors.js';\n\nexport interface TimeoutSignal {\n readonly signal: AbortSignal;\n readonly cancel: () => void;\n}\n\n/**\n * Combines an optional timeout with an optional caller-provided AbortSignal.\n */\nexport function createTimeoutSignal(timeoutMs?: number, userSignal?: AbortSignal): TimeoutSignal {\n if (!timeoutMs && !userSignal) {\n const controller = new AbortController();\n return { signal: controller.signal, cancel: () => undefined };\n }\n\n const controller = new AbortController();\n let timerId: ReturnType<typeof setTimeout> | undefined;\n\n if (timeoutMs && timeoutMs > 0) {\n timerId = setTimeout(() => {\n controller.abort(\n new OllamaTimeoutError(`Request timed out after ${timeoutMs}ms`, { timeoutMs }),\n );\n }, timeoutMs);\n }\n\n const onUserAbort = (): void => {\n if (timerId) clearTimeout(timerId);\n controller.abort(userSignal?.reason);\n };\n\n if (userSignal) {\n if (userSignal.aborted) {\n if (timerId) clearTimeout(timerId);\n controller.abort(userSignal.reason);\n } else {\n userSignal.addEventListener('abort', onUserAbort, { once: true });\n }\n }\n\n const cancel = (): void => {\n if (timerId) clearTimeout(timerId);\n if (userSignal) {\n userSignal.removeEventListener('abort', onUserAbort);\n }\n };\n\n return { signal: controller.signal, cancel };\n}\n","/**\n * Model and blob management operations.\n */\n\nimport { listAvailableModels } from './capabilities/capabilities.js';\nimport { normalizeProgressStream } from './streaming/normalize.js';\nimport type { OllamaStream } from './streaming/stream.js';\nimport type { ProgressStreamResult } from './streaming/types.js';\nimport type { BinaryBody } from './transport/http.js';\nimport type { RequestRunner } from './transport/runner.js';\nimport type {\n CopyRequestOptions,\n CreateRequestOptions,\n DeleteRequestOptions,\n ModelResponse,\n ProgressResponse,\n PsResponse,\n PullRequestOptions,\n PushRequestOptions,\n ShowRequestOptions,\n ShowResponse,\n StatusResponse,\n VersionResponse,\n} from './types.js';\n\n/**\n * Every operation here targets one specific Ollama server's local model catalog or blob\n * store — unlike `chat`/`generate`/`embed`, a different endpoint isn't an interchangeable\n * substitute; it's a different catalog/store entirely. `singleEndpoint: true` disables\n * `OllamaClient`'s cross-endpoint failover for these calls (same-endpoint retry via\n * `withRetry` still applies), so a multi-endpoint setup never silently lists/mutates the\n * wrong server just because the intended one had a transient failure. See ADR 0008.\n */\nexport class ModelsClient {\n constructor(private readonly runner: RequestRunner) {}\n\n list(): Promise<ModelResponse[]> {\n return this.runner((http) => listAvailableModels(http), { singleEndpoint: true });\n }\n\n show(request: ShowRequestOptions): Promise<ShowResponse> {\n return this.runner(\n (http, signal) => http.request<ShowResponse>({ path: '/api/show', body: request, signal }),\n { ...request, singleEndpoint: true },\n );\n }\n\n pull(\n request: PullRequestOptions & { stream: true },\n ): Promise<OllamaStream<ProgressResponse, ProgressStreamResult>>;\n pull(request: PullRequestOptions & { stream?: false | undefined }): Promise<ProgressResponse>;\n pull(\n request: PullRequestOptions,\n ): Promise<ProgressResponse | OllamaStream<ProgressResponse, ProgressStreamResult>>;\n async pull(\n request: PullRequestOptions,\n ): Promise<ProgressResponse | OllamaStream<ProgressResponse, ProgressStreamResult>> {\n if (request.stream) {\n return this.runner(\n async (http, signal) => {\n const stream = await http.requestStream<ProgressResponse>({\n path: '/api/pull',\n body: { ...request, stream: true },\n signal,\n });\n return normalizeProgressStream(stream, signal);\n },\n { ...request, singleEndpoint: true, holdUntil: (stream) => stream.finalResult },\n );\n }\n return this.runner(\n (http, signal) =>\n http.request<ProgressResponse>({\n path: '/api/pull',\n body: { ...request, stream: false },\n signal,\n }),\n { ...request, singleEndpoint: true },\n );\n }\n\n push(\n request: PushRequestOptions & { stream: true },\n ): Promise<OllamaStream<ProgressResponse, ProgressStreamResult>>;\n push(request: PushRequestOptions & { stream?: false | undefined }): Promise<ProgressResponse>;\n push(\n request: PushRequestOptions,\n ): Promise<ProgressResponse | OllamaStream<ProgressResponse, ProgressStreamResult>>;\n async push(\n request: PushRequestOptions,\n ): Promise<ProgressResponse | OllamaStream<ProgressResponse, ProgressStreamResult>> {\n if (request.stream) {\n return this.runner(\n async (http, signal) => {\n const stream = await http.requestStream<ProgressResponse>({\n path: '/api/push',\n body: { ...request, stream: true },\n signal,\n });\n return normalizeProgressStream(stream, signal);\n },\n { ...request, singleEndpoint: true, holdUntil: (stream) => stream.finalResult },\n );\n }\n return this.runner(\n (http, signal) =>\n http.request<ProgressResponse>({\n path: '/api/push',\n body: { ...request, stream: false },\n signal,\n }),\n { ...request, singleEndpoint: true },\n );\n }\n\n create(\n request: CreateRequestOptions & { stream: true },\n ): Promise<OllamaStream<ProgressResponse, ProgressStreamResult>>;\n create(request: CreateRequestOptions & { stream?: false | undefined }): Promise<ProgressResponse>;\n create(\n request: CreateRequestOptions,\n ): Promise<ProgressResponse | OllamaStream<ProgressResponse, ProgressStreamResult>>;\n async create(\n request: CreateRequestOptions,\n ): Promise<ProgressResponse | OllamaStream<ProgressResponse, ProgressStreamResult>> {\n if (request.stream) {\n return this.runner(\n async (http, signal) => {\n const stream = await http.requestStream<ProgressResponse>({\n path: '/api/create',\n body: { ...request, stream: true },\n signal,\n });\n return normalizeProgressStream(stream);\n },\n { ...request, singleEndpoint: true, holdUntil: (stream) => stream.finalResult },\n );\n }\n return this.runner(\n (http, signal) =>\n http.request<ProgressResponse>({\n path: '/api/create',\n body: { ...request, stream: false },\n signal,\n }),\n { ...request, singleEndpoint: true },\n );\n }\n\n delete(request: DeleteRequestOptions): Promise<StatusResponse> {\n return this.runner(\n (http, signal) =>\n http.request<StatusResponse>({\n path: '/api/delete',\n method: 'DELETE',\n body: request,\n signal,\n }),\n { ...request, singleEndpoint: true },\n );\n }\n\n copy(request: CopyRequestOptions): Promise<StatusResponse> {\n return this.runner(\n (http, signal) => http.request<StatusResponse>({ path: '/api/copy', body: request, signal }),\n { ...request, singleEndpoint: true },\n );\n }\n\n ps(): Promise<PsResponse> {\n return this.runner((http) => http.request<PsResponse>({ path: '/api/ps', method: 'GET' }), {\n singleEndpoint: true,\n });\n }\n\n version(): Promise<VersionResponse> {\n return this.runner(\n (http) => http.request<VersionResponse>({ path: '/api/version', method: 'GET' }),\n { singleEndpoint: true },\n );\n }\n\n async createBlob(digest: string, data: BinaryBody): Promise<void> {\n await this.runner(\n (http, signal) =>\n http.request<void>({\n path: `/api/blobs/${encodeURIComponent(digest)}`,\n method: 'POST',\n rawBody: data,\n signal,\n }),\n { singleEndpoint: true },\n );\n }\n\n async checkBlob(digest: string): Promise<boolean> {\n try {\n await this.runner(\n (http, signal) =>\n http.request<void>({\n path: `/api/blobs/${encodeURIComponent(digest)}`,\n method: 'HEAD',\n signal,\n }),\n { singleEndpoint: true },\n );\n return true;\n } catch {\n return false;\n }\n }\n}\n","/**\n * OpenAI Compatibility interfaces and client helpers for Ollama.\n * Ollama exposes OpenAI-compatible /v1 endpoints.\n *\n * @remarks\n * This is a typed pass-through to Ollama's own OpenAI-compatible `/v1` endpoints — it\n * implements the subset of the OpenAI API surface that Ollama documents as supported\n * (https://docs.ollama.com/api/openai-compatibility), not the full OpenAI surface (hosted\n * tools like web/file search, computer use, code interpreter, or stateful server-side\n * conversation state). Notably, `tools` is supported by Ollama's compat layer but\n * `tool_choice` and `parallel_tool_calls` are not — both are still typed on\n * {@link OpenAIChatCompletionRequest} (accepted-but-ignored) so consumers passing a\n * standard OpenAI request object don't get spurious type errors; see the `@remarks` on\n * each field. `/v1/responses` is supported non-statefully — see\n * {@link OpenAIResponsesRequest}.\n */\n\nimport type { AbortableAsyncIterable } from '../streaming/types.js';\nimport type { SseEvent } from '../streaming/sse.js';\nimport type { HttpClient } from '../transport/http.js';\nimport type { RequestRunner } from '../transport/runner.js';\nimport { OllamaAbortError, OllamaClientError } from '../errors.js';\n\nexport interface OpenAIToolCall {\n readonly id: string;\n readonly type: 'function';\n readonly function: {\n readonly name: string;\n /** JSON-encoded arguments string, matching OpenAI's wire format (not a parsed object). */\n readonly arguments: string;\n };\n}\n\nexport interface OpenAITextContentPart {\n readonly type: 'text';\n readonly text: string;\n}\n\nexport interface OpenAIImageUrlContentPart {\n readonly type: 'image_url';\n /** Ollama accepts a data/image URL string or the standard OpenAI URL object. */\n readonly image_url:\n | string\n | { readonly url: string; readonly detail?: 'auto' | 'low' | 'high' | 'original' | undefined };\n}\n\nexport type OpenAIContentPart = OpenAITextContentPart | OpenAIImageUrlContentPart;\n\nexport interface OpenAIMessage {\n readonly role: 'system' | 'user' | 'assistant' | 'tool';\n readonly content: string | readonly OpenAIContentPart[];\n readonly name?: string | undefined;\n readonly tool_calls?: readonly OpenAIToolCall[] | undefined;\n /** Ollama may emit model reasoning alongside assistant content. */\n readonly reasoning?: string | undefined;\n /** Set on a `role: 'tool'` message to identify which call this is a result for. */\n readonly tool_call_id?: string | undefined;\n}\n\nexport interface OpenAIStreamOptions {\n /** Emit a final SSE chunk carrying `usage` (prompt/completion/total tokens) before `[DONE]`. */\n readonly include_usage?: boolean | undefined;\n}\n\nexport interface OpenAIFunctionDefinition {\n readonly name: string;\n readonly description?: string | undefined;\n readonly parameters?: Record<string, unknown> | undefined;\n}\n\nexport interface OpenAITool {\n readonly type: 'function';\n readonly function: OpenAIFunctionDefinition;\n}\n\nexport type OpenAIReasoningEffort =\n | 'high'\n | 'medium'\n | 'low'\n | 'max'\n | 'none'\n | 'minimal'\n | 'xhigh'\n | 'ultra'\n | (string & {});\n\nexport type OpenAIResponseFormat =\n | { readonly type: 'text' }\n | { readonly type: 'json_object' }\n | { readonly type: 'json_schema'; readonly json_schema: Record<string, unknown> };\n\nexport interface OpenAIChatCompletionRequest {\n readonly model: string;\n readonly messages: readonly OpenAIMessage[];\n readonly temperature?: number | undefined;\n readonly top_p?: number | undefined;\n readonly stream?: boolean | undefined;\n /** Only meaningful when `stream: true`; ignored otherwise. */\n readonly stream_options?: OpenAIStreamOptions | undefined;\n readonly max_tokens?: number | undefined;\n readonly stop?: readonly string[] | undefined;\n readonly response_format?: OpenAIResponseFormat | undefined;\n readonly seed?: number | undefined;\n readonly presence_penalty?: number | undefined;\n readonly frequency_penalty?: number | undefined;\n readonly user?: string | undefined;\n readonly logit_bias?: Record<string, number> | undefined;\n readonly n?: number | undefined;\n /** Ollama exposes log probabilities for supported reasoning/chat models. */\n readonly logprobs?: boolean | undefined;\n readonly top_logprobs?: number | undefined;\n readonly tools?: readonly OpenAITool[] | undefined;\n /**\n * @remarks Accepted for OpenAI compatibility but ignored by Ollama — every tool the\n * model is given remains callable regardless of this value.\n */\n readonly tool_choice?:\n | 'none'\n | 'auto'\n | 'required'\n | { readonly type: 'function'; readonly function: { readonly name: string } }\n | undefined;\n /**\n * @remarks Accepted for OpenAI compatibility but ignored by Ollama — Ollama does not\n * control tool-call parallelism through this flag.\n */\n readonly parallel_tool_calls?: boolean | undefined;\n /**\n * Effort level for thinking models (e.g. `deepseek-r1`, `qwen3`). Equivalent to\n * `reasoning.effort`; only effective for models that support reasoning/thinking.\n */\n readonly reasoning_effort?: OpenAIReasoningEffort | undefined;\n /**\n * Effort level for thinking models (e.g. `deepseek-r1`, `qwen3`), nested OpenAI-style.\n * Equivalent to `reasoning_effort`; only effective for models that support\n * reasoning/thinking.\n */\n readonly reasoning?:\n { readonly effort?: OpenAIReasoningEffort | undefined } | undefined;\n}\n\n/** Ollama Chat Completions supports text plus base64 image content via a string image URL. */\nexport type OllamaOpenAIChatContentPart =\n | OpenAITextContentPart\n | {\n readonly type: 'image_url';\n /** Ollama's current compatibility docs accept an image URL string, including data URLs. */\n readonly image_url: string;\n };\n\nexport type OllamaOpenAIReasoningEffort =\n | 'high'\n | 'medium'\n | 'low'\n | 'max'\n | 'none';\n\nexport type OllamaOpenAIChatMessage = Omit<OpenAIMessage, 'content'> & {\n readonly content: string | readonly OllamaOpenAIChatContentPart[];\n};\n\n/** Strict Ollama-documented Chat Completions request; excludes only the SDK-only parallel tool flag. */\nexport type OllamaOpenAIChatCompletionRequest = Omit<\n OpenAIChatCompletionRequest,\n 'messages' | 'parallel_tool_calls' | 'reasoning_effort' | 'reasoning'\n> & {\n readonly messages: readonly OllamaOpenAIChatMessage[];\n readonly reasoning_effort?: OllamaOpenAIReasoningEffort | undefined;\n readonly reasoning?: { readonly effort?: OllamaOpenAIReasoningEffort | undefined } | undefined;\n};\n\nexport interface OpenAIChatCompletionChoice {\n readonly index: number;\n readonly message: OpenAIMessage;\n readonly finish_reason: string;\n readonly logprobs?: Record<string, unknown> | null | undefined;\n}\n\nexport interface OpenAIToolCallDelta {\n readonly index: number;\n readonly id?: string | undefined;\n readonly type?: 'function' | undefined;\n readonly function?: {\n readonly name?: string | undefined;\n readonly arguments?: string | undefined;\n } | undefined;\n}\n\nexport interface OpenAIChatCompletionDelta {\n readonly role?: OpenAIMessage['role'] | undefined;\n readonly content?: string | null | undefined;\n readonly reasoning?: string | null | undefined;\n readonly refusal?: string | null | undefined;\n readonly tool_calls?: readonly OpenAIToolCallDelta[] | undefined;\n}\n\nexport interface OpenAIChatCompletionChunkChoice {\n readonly index: number;\n readonly delta: OpenAIChatCompletionDelta;\n readonly finish_reason?: string | null | undefined;\n readonly logprobs?: Record<string, unknown> | null | undefined;\n}\n\nexport interface OpenAIChatCompletionChunk {\n readonly id: string;\n readonly object: 'chat.completion.chunk';\n readonly created: number;\n readonly model: string;\n readonly system_fingerprint?: string | undefined;\n readonly choices: readonly OpenAIChatCompletionChunkChoice[];\n readonly usage?:\n | {\n readonly prompt_tokens: number;\n readonly completion_tokens: number;\n readonly total_tokens: number;\n }\n | null\n | undefined;\n}\n\nexport interface OpenAIUsage {\n readonly prompt_tokens: number;\n readonly completion_tokens: number;\n readonly total_tokens: number;\n readonly prompt_tokens_details?: {\n readonly cached_tokens?: number | undefined;\n } | undefined;\n}\n\nexport interface OpenAIChatCompletionResponse {\n readonly id: string;\n readonly object: 'chat.completion';\n readonly created: number;\n readonly model: string;\n readonly system_fingerprint?: string | undefined;\n readonly choices: readonly OpenAIChatCompletionChoice[];\n readonly usage?: OpenAIUsage | undefined;\n}\n\nexport interface OpenAIModelItem {\n readonly id: string;\n readonly object: 'model';\n readonly created: number;\n readonly owned_by: string;\n}\n\nexport interface OpenAIListModelsResponse {\n readonly object: 'list';\n readonly data: readonly OpenAIModelItem[];\n}\n\nexport interface OpenAICompletionRequest {\n readonly model: string;\n /** Ollama currently accepts a string prompt for /v1/completions. */\n readonly prompt: string;\n /** Number of log probability alternatives requested for completion tokens. */\n readonly logprobs?: number | undefined;\n readonly frequency_penalty?: number | undefined;\n readonly presence_penalty?: number | undefined;\n readonly seed?: number | undefined;\n readonly stop?: readonly string[] | undefined;\n readonly stream?: boolean | undefined;\n readonly stream_options?: OpenAIStreamOptions | undefined;\n readonly temperature?: number | undefined;\n readonly top_p?: number | undefined;\n readonly max_tokens?: number | undefined;\n readonly suffix?: string | undefined;\n readonly best_of?: number | undefined;\n readonly echo?: boolean | undefined;\n readonly logit_bias?: Record<string, number> | undefined;\n readonly user?: string | undefined;\n readonly n?: number | undefined;\n}\n\n/** Strict Ollama-documented Completions request. */\nexport type OllamaOpenAICompletionRequest = OpenAICompletionRequest;\n\nexport interface OpenAICompletionChoice {\n readonly text: string;\n readonly index: number;\n readonly logprobs?: Record<string, unknown> | null | undefined;\n readonly finish_reason: string | null;\n}\n\nexport interface OpenAICompletionChunk {\n readonly id: string;\n readonly object: 'text_completion';\n readonly created: number;\n readonly model: string;\n readonly system_fingerprint?: string | undefined;\n readonly choices: readonly {\n readonly text: string;\n readonly index: number;\n readonly logprobs?: Record<string, unknown> | null | undefined;\n readonly finish_reason?: string | null | undefined;\n }[];\n readonly usage?:\n | {\n readonly prompt_tokens: number;\n readonly completion_tokens: number;\n readonly total_tokens: number;\n }\n | null\n | undefined;\n}\n\nexport interface OpenAICompletionResponse {\n readonly id: string;\n readonly object: 'text_completion';\n readonly created: number;\n readonly model: string;\n readonly system_fingerprint?: string | undefined;\n readonly choices: readonly OpenAICompletionChoice[];\n readonly usage?: OpenAIUsage | undefined;\n}\n\nexport type OpenAIEmbeddingInput =\n | string\n | readonly string[]\n | readonly number[]\n | readonly (readonly number[])[];\n\nexport interface OpenAIEmbeddingRequest {\n readonly model: string;\n readonly input: OpenAIEmbeddingInput;\n readonly encoding_format?: 'float' | 'base64' | undefined;\n readonly dimensions?: number | undefined;\n readonly user?: string | undefined;\n}\n\n/** Strict Ollama-documented Embeddings request. */\nexport type OllamaOpenAIEmbeddingRequest = OpenAIEmbeddingRequest;\n\nexport interface OpenAIEmbeddingItem {\n readonly object: 'embedding';\n readonly embedding: readonly number[] | string;\n readonly index: number;\n}\n\nexport interface OpenAIEmbeddingResponse {\n readonly object: 'list';\n readonly data: readonly OpenAIEmbeddingItem[];\n readonly model: string;\n readonly usage?: {\n readonly prompt_tokens: number;\n readonly total_tokens: number;\n } | undefined;\n}\n\n/**\n * Request body for OpenAI's Responses API (`/v1/responses`), added in Ollama v0.13.3.\n *\n * @remarks\n * Ollama implements this **non-statefully**: every call is independent, so\n * {@link previous_response_id} and {@link conversation} — OpenAI's mechanisms for\n * resuming server-side conversation state — are accepted for compatibility but ignored.\n * Send the full conversation in `input` on every call, the same as `/api/chat`.\n */\nexport interface OpenAIResponsesRequest {\n readonly model: string;\n readonly input: string | readonly OpenAIMessage[];\n readonly instructions?: string | undefined;\n readonly tools?: readonly OpenAITool[] | undefined;\n readonly stream?: boolean | undefined;\n readonly temperature?: number | undefined;\n readonly top_p?: number | undefined;\n readonly max_output_tokens?: number | undefined;\n /** @remarks Not supported by Ollama, which is stateless across calls — accepted but ignored. */\n readonly previous_response_id?: string | undefined;\n /** @remarks Not supported by Ollama, which is stateless across calls — accepted but ignored. */\n readonly conversation?: string | undefined;\n readonly truncation?: string | undefined;\n readonly reasoning?: { readonly effort?: OpenAIReasoningEffort | undefined } | undefined;\n /** Ollama extension: boolean, model-defined string, or null for model default. */\n readonly think?: boolean | string | null | undefined;\n}\n\n/** Strict Ollama-documented Responses request; excludes stateful and SDK-only request fields. */\n/** Strict Ollama-documented Responses request; excludes only unsupported stateful fields. */\nexport type OllamaOpenAIResponsesRequest = Omit<\n OpenAIResponsesRequest,\n 'previous_response_id' | 'conversation'\n>;\n\nexport type OpenAIResponsesStatus = 'completed' | 'failed' | 'in_progress' | 'cancelled' | 'queued' | 'incomplete';\n\nexport interface OpenAIResponsesError { readonly code?: string | undefined; readonly message?: string | undefined; readonly [key: string]: unknown; }\nexport interface OpenAIResponsesIncompleteDetails { readonly reason?: string | undefined; readonly [key: string]: unknown; }\n\nexport interface OpenAIResponsesOutputTextContent {\n readonly type: 'output_text'; readonly text: string;\n readonly annotations?: readonly Record<string, unknown>[] | undefined;\n readonly logprobs?: readonly Record<string, unknown>[] | undefined;\n}\nexport interface OpenAIResponsesOutputRefusal { readonly type: 'refusal'; readonly refusal: string; }\nexport type OpenAIResponsesOutputContent = OpenAIResponsesOutputTextContent | OpenAIResponsesOutputRefusal;\n\nexport interface OpenAIResponsesOutputMessage {\n readonly type: 'message'; readonly id?: string | undefined; readonly status?: OpenAIResponsesStatus | undefined;\n readonly role?: string | undefined; readonly phase?: string | undefined;\n readonly content: readonly OpenAIResponsesOutputContent[];\n}\nexport interface OpenAIResponsesOutputFunctionCall {\n readonly type: 'function_call'; readonly id?: string | undefined; readonly call_id?: string | undefined;\n readonly name: string; readonly arguments: string; readonly status?: OpenAIResponsesStatus | undefined;\n}\nexport interface OpenAIResponsesOutputReasoning {\n readonly type: 'reasoning'; readonly id?: string | undefined; readonly status?: OpenAIResponsesStatus | undefined;\n readonly summary?: readonly { readonly type: 'summary_text'; readonly text: string }[] | undefined;\n readonly text?: string | undefined; readonly encrypted_content?: string | undefined;\n}\nexport type OpenAIResponsesOutputItem = OpenAIResponsesOutputMessage | OpenAIResponsesOutputFunctionCall | OpenAIResponsesOutputReasoning;\n\nexport interface OpenAIResponsesUsage {\n readonly input_tokens: number; readonly output_tokens: number; readonly total_tokens: number;\n readonly input_tokens_details?: Record<string, unknown> | undefined;\n readonly output_tokens_details?: Record<string, unknown> | undefined;\n}\n\n/** Non-stateful response shape for the Ollama Responses compatibility endpoint. */\nexport interface OpenAIResponsesResponse {\n readonly id: string; readonly object: 'response'; readonly created: number;\n readonly created_at?: number | undefined; readonly status?: OpenAIResponsesStatus | undefined;\n readonly completed_at?: number | null | undefined; readonly error?: OpenAIResponsesError | null | undefined;\n readonly incomplete_details?: OpenAIResponsesIncompleteDetails | null | undefined;\n readonly model: string; readonly output: readonly OpenAIResponsesOutputItem[];\n readonly output_text?: string | undefined; readonly previous_response_id?: string | null | undefined;\n readonly parallel_tool_calls?: boolean | undefined; readonly usage?: OpenAIResponsesUsage | undefined;\n}\n\nexport class OpenAIResponsesStreamError extends OllamaClientError {\n readonly responsePayload: OpenAIResponsesResponse;\n constructor(message: string, responsePayload: OpenAIResponsesResponse) {\n super(message, { code: 'openai_responses_stream_error', retryable: false, response: { body: responsePayload } });\n this.responsePayload = responsePayload;\n }\n}\nexport class OpenAIChatCompletionStream implements AsyncIterable<OpenAIChatCompletionChunk> {\n private readonly finalResultPromise: Promise<OpenAIChatCompletionResponse>;\n private resolveFinal!: (value: OpenAIChatCompletionResponse) => void;\n private rejectFinal!: (reason: unknown) => void;\n private removeAbortListener: (() => void) | undefined;\n\n constructor(private readonly source: AbortableAsyncIterable<SseEvent>, signal?: AbortSignal) {\n this.finalResultPromise = new Promise<OpenAIChatCompletionResponse>((resolve, reject) => {\n this.resolveFinal = resolve;\n this.rejectFinal = reject;\n });\n if (signal !== undefined) {\n const onAbort = (): void => this.abort();\n if (signal.aborted) onAbort();\n else {\n signal.addEventListener('abort', onAbort, { once: true });\n this.removeAbortListener = () => signal.removeEventListener('abort', onAbort);\n }\n }\n }\n\n get finalResult(): Promise<OpenAIChatCompletionResponse> {\n return this.finalResultPromise;\n }\n\n abort(): void {\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n this.source.abort?.();\n this.rejectFinal(new OllamaAbortError('OpenAI Chat Completion stream aborted'));\n }\n\n async *[Symbol.asyncIterator](): AsyncGenerator<OpenAIChatCompletionChunk, void, undefined> {\n const choices = new Map<number, {\n message: OpenAIMessage;\n finish_reason: string;\n logprobs?: Record<string, unknown> | null | undefined;\n }>();\n let id = '';\n let model = '';\n let created = 0;\n let systemFingerprint: string | undefined;\n let usage: OpenAIUsage | undefined;\n let completed = false;\n\n try {\n for await (const event of this.source) {\n if (event.data === '[DONE]') break;\n let chunk: OpenAIChatCompletionChunk;\n try {\n chunk = JSON.parse(event.data) as OpenAIChatCompletionChunk;\n } catch (error) {\n throw new Error('Failed to parse OpenAI chat completion SSE payload', { cause: error });\n }\n id = chunk.id || id;\n model = chunk.model || model;\n created = chunk.created || created;\n if (chunk.system_fingerprint !== undefined) systemFingerprint = chunk.system_fingerprint;\n if (chunk.usage !== null && chunk.usage !== undefined) usage = chunk.usage;\n\n for (const choice of chunk.choices) {\n const existing = choices.get(choice.index);\n const delta = choice.delta;\n if (!existing) {\n const toolCalls = delta.tool_calls?.map((toolCall) => ({\n id: toolCall.id ?? '',\n type: 'function' as const,\n function: {\n name: toolCall.function?.name ?? '',\n arguments: toolCall.function?.arguments ?? '',\n },\n }));\n choices.set(choice.index, {\n message: {\n role: delta.role ?? 'assistant',\n content: delta.content ?? '',\n ...(delta.reasoning !== undefined && delta.reasoning !== null\n ? { reasoning: delta.reasoning }\n : {}),\n ...(toolCalls?.length ? { tool_calls: toolCalls } : {}),\n },\n finish_reason: choice.finish_reason ?? '',\n ...(choice.logprobs !== undefined ? { logprobs: choice.logprobs } : {}),\n });\n continue;\n }\n\n const priorToolCalls = [...(existing.message.tool_calls ?? [])];\n for (const toolCall of delta.tool_calls ?? []) {\n const position = toolCall.index;\n const current = priorToolCalls[position];\n if (current) {\n priorToolCalls[position] = {\n ...current,\n ...(toolCall.id !== undefined ? { id: toolCall.id } : {}),\n function: {\n name: current.function?.name ?? toolCall.function?.name ?? '',\n arguments:\n (current.function?.arguments ?? '') + (toolCall.function?.arguments ?? ''),\n },\n };\n } else {\n priorToolCalls[position] = {\n id: toolCall.id ?? '',\n type: 'function',\n function: {\n name: toolCall.function?.name ?? '',\n arguments: toolCall.function?.arguments ?? '',\n },\n };\n }\n }\n choices.set(choice.index, {\n message: {\n ...existing.message,\n ...(delta.content !== undefined && delta.content !== null\n ? { content: existing.message.content + delta.content }\n : {}),\n ...(delta.reasoning !== undefined && delta.reasoning !== null\n ? { reasoning: (existing.message.reasoning ?? '') + delta.reasoning }\n : {}),\n ...(priorToolCalls.length ? { tool_calls: priorToolCalls } : {}),\n },\n finish_reason: choice.finish_reason ?? existing.finish_reason,\n ...(choice.logprobs !== undefined ? { logprobs: choice.logprobs } : {}),\n });\n }\n\n yield chunk;\n }\n\n const response: OpenAIChatCompletionResponse = {\n id,\n object: 'chat.completion',\n created,\n model,\n ...(systemFingerprint !== undefined ? { system_fingerprint: systemFingerprint } : {}),\n choices: [...choices.entries()]\n .sort(([a], [b]) => a - b)\n .map(([index, choice]) => ({\n index,\n message: choice.message,\n finish_reason: choice.finish_reason,\n ...(choice.logprobs !== undefined ? { logprobs: choice.logprobs } : {}),\n })),\n ...(usage !== undefined ? { usage } : {}),\n };\n completed = true;\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n this.resolveFinal(response);\n } catch (error) {\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n this.rejectFinal(error);\n throw error;\n } finally {\n if (!completed) {\n this.source.abort?.();\n this.rejectFinal(new OllamaAbortError('OpenAI Chat Completion stream ended before completion'));\n }\n }\n }\n}\n\nexport class OpenAICompletionStream implements AsyncIterable<OpenAICompletionChunk> {\n private readonly finalResultPromise: Promise<OpenAICompletionResponse>;\n private resolveFinal!: (value: OpenAICompletionResponse) => void;\n private rejectFinal!: (reason: unknown) => void;\n private removeAbortListener: (() => void) | undefined;\n\n constructor(private readonly source: AbortableAsyncIterable<SseEvent>, signal?: AbortSignal) {\n this.finalResultPromise = new Promise<OpenAICompletionResponse>((resolve, reject) => {\n this.resolveFinal = resolve;\n this.rejectFinal = reject;\n });\n if (signal !== undefined) {\n const onAbort = (): void => this.abort();\n if (signal.aborted) onAbort();\n else {\n signal.addEventListener('abort', onAbort, { once: true });\n this.removeAbortListener = () => signal.removeEventListener('abort', onAbort);\n }\n }\n }\n\n get finalResult(): Promise<OpenAICompletionResponse> {\n return this.finalResultPromise;\n }\n\n abort(): void {\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n this.source.abort?.();\n this.rejectFinal(new OllamaAbortError('OpenAI Completion stream aborted'));\n }\n\n async *[Symbol.asyncIterator](): AsyncGenerator<OpenAICompletionChunk, void, undefined> {\n const texts = new Map<number, OpenAICompletionChoice>();\n let id = '';\n let model = '';\n let created = 0;\n let usage:\n | { prompt_tokens: number; completion_tokens: number; total_tokens: number }\n | undefined;\n let completed = false;\n\n try {\n for await (const event of this.source) {\n if (event.data === '[DONE]') break;\n const chunk = JSON.parse(event.data) as OpenAICompletionChunk;\n id = chunk.id || id;\n model = chunk.model || model;\n created = chunk.created || created;\n if (chunk.usage !== null && chunk.usage !== undefined) usage = chunk.usage;\n\n for (const choice of chunk.choices) {\n const existing = texts.get(choice.index);\n texts.set(choice.index, {\n text: (existing?.text ?? '') + (choice.text ?? ''),\n index: choice.index,\n finish_reason: choice.finish_reason ?? existing?.finish_reason ?? null,\n ...(choice.logprobs !== undefined ? { logprobs: choice.logprobs } : {}),\n });\n }\n yield chunk;\n }\n\n const response: OpenAICompletionResponse = {\n id,\n object: 'text_completion',\n created,\n model,\n choices: [...texts.values()].sort((a, b) => a.index - b.index),\n ...(usage !== undefined ? { usage } : {}),\n };\n completed = true;\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n this.resolveFinal(response);\n } catch (error) {\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n this.rejectFinal(error);\n throw error;\n } finally {\n if (!completed) {\n this.source.abort?.();\n this.rejectFinal(new OllamaAbortError('OpenAI Completion stream ended before completion'));\n }\n }\n }\n}\n\nexport interface OpenAIResponsesEventBase { readonly response_id?: string | undefined; readonly sequence_number?: number | undefined; }\n\nexport interface OpenAIResponsesOutputTextDeltaEvent extends OpenAIResponsesEventBase { readonly type: 'response.output_text.delta'; readonly item_id: string; readonly output_index: number; readonly content_index: number; readonly delta: string; }\nexport interface OpenAIResponsesOutputTextDoneEvent extends OpenAIResponsesEventBase { readonly type: 'response.output_text.done'; readonly item_id: string; readonly output_index: number; readonly content_index: number; readonly text: string; }\nexport interface OpenAIResponsesFunctionCallArgumentsDeltaEvent extends OpenAIResponsesEventBase { readonly type: 'response.function_call_arguments.delta'; readonly item_id: string; readonly output_index: number; readonly delta: string; }\nexport interface OpenAIResponsesFunctionCallArgumentsDoneEvent extends OpenAIResponsesEventBase { readonly type: 'response.function_call_arguments.done'; readonly item_id: string; readonly output_index: number; readonly arguments: string; readonly name?: string | undefined; }\nexport interface OpenAIResponsesReasoningTextDeltaEvent extends OpenAIResponsesEventBase { readonly type: 'response.reasoning_text.delta'; readonly item_id: string; readonly output_index: number; readonly content_index: number; readonly delta: string; }\nexport interface OpenAIResponsesReasoningTextDoneEvent extends OpenAIResponsesEventBase { readonly type: 'response.reasoning_text.done'; readonly item_id: string; readonly output_index: number; readonly content_index: number; readonly text: string; }\nexport interface OpenAIResponsesReasoningSummaryPartAddedEvent extends OpenAIResponsesEventBase { readonly type: 'response.reasoning_summary_part.added'; readonly item_id: string; readonly output_index: number; readonly summary_index: number; readonly part: { readonly type: 'summary_text'; readonly text: string }; }\nexport interface OpenAIResponsesReasoningSummaryPartDoneEvent extends OpenAIResponsesEventBase { readonly type: 'response.reasoning_summary_part.done'; readonly item_id: string; readonly output_index: number; readonly summary_index: number; readonly part: { readonly type: 'summary_text'; readonly text: string }; readonly status?: 'incomplete' | undefined; }\nexport interface OpenAIResponsesReasoningSummaryTextDeltaEvent extends OpenAIResponsesEventBase { readonly type: 'response.reasoning_summary_text.delta'; readonly item_id: string; readonly output_index: number; readonly summary_index: number; readonly delta: string; }\nexport interface OpenAIResponsesReasoningSummaryTextDoneEvent extends OpenAIResponsesEventBase { readonly type: 'response.reasoning_summary_text.done'; readonly item_id: string; readonly output_index: number; readonly summary_index: number; readonly text: string; }\nexport interface OpenAIResponsesOutputItemAddedEvent extends OpenAIResponsesEventBase { readonly type: 'response.output_item.added'; readonly item: OpenAIResponsesOutputItem; readonly output_index: number; }\nexport interface OpenAIResponsesOutputItemDoneEvent extends OpenAIResponsesEventBase { readonly type: 'response.output_item.done'; readonly item: OpenAIResponsesOutputItem; readonly output_index: number; }\nexport interface OpenAIResponsesContentPartAddedEvent extends OpenAIResponsesEventBase { readonly type: 'response.content_part.added'; readonly item_id: string; readonly output_index: number; readonly content_index: number; readonly part: OpenAIResponsesOutputContent | { readonly type: string; readonly [key: string]: unknown }; }\nexport interface OpenAIResponsesContentPartDoneEvent extends OpenAIResponsesEventBase { readonly type: 'response.content_part.done'; readonly item_id: string; readonly output_index: number; readonly content_index: number; readonly part: OpenAIResponsesOutputContent | { readonly type: string; readonly [key: string]: unknown }; }\nexport interface OpenAIResponsesRefusalDeltaEvent extends OpenAIResponsesEventBase { readonly type: 'response.refusal.delta'; readonly item_id: string; readonly output_index: number; readonly content_index: number; readonly delta: string; }\nexport interface OpenAIResponsesRefusalDoneEvent extends OpenAIResponsesEventBase { readonly type: 'response.refusal.done'; readonly item_id: string; readonly output_index: number; readonly content_index: number; readonly refusal: string; }\nexport interface OpenAIResponsesCreatedEvent extends OpenAIResponsesEventBase { readonly type: 'response.created'; readonly response: OpenAIResponsesResponse; }\nexport interface OpenAIResponsesInProgressEvent extends OpenAIResponsesEventBase { readonly type: 'response.in_progress'; readonly response: OpenAIResponsesResponse; }\nexport interface OpenAIResponsesQueuedEvent extends OpenAIResponsesEventBase { readonly type: 'response.queued'; readonly response: OpenAIResponsesResponse; }\nexport interface OpenAIResponsesCompletedEvent extends OpenAIResponsesEventBase { readonly type: 'response.completed' | 'response.done'; readonly response: OpenAIResponsesResponse; }\nexport interface OpenAIResponsesFailedEvent extends OpenAIResponsesEventBase { readonly type: 'response.failed'; readonly response: OpenAIResponsesResponse; }\nexport interface OpenAIResponsesIncompleteEvent extends OpenAIResponsesEventBase { readonly type: 'response.incomplete'; readonly response: OpenAIResponsesResponse; }\n\nexport type OpenAIResponsesStreamEvent =\n | OpenAIResponsesOutputTextDeltaEvent | OpenAIResponsesOutputTextDoneEvent\n | OpenAIResponsesFunctionCallArgumentsDeltaEvent | OpenAIResponsesFunctionCallArgumentsDoneEvent\n | OpenAIResponsesReasoningTextDeltaEvent | OpenAIResponsesReasoningTextDoneEvent\n | OpenAIResponsesReasoningSummaryPartAddedEvent | OpenAIResponsesReasoningSummaryPartDoneEvent\n | OpenAIResponsesReasoningSummaryTextDeltaEvent | OpenAIResponsesReasoningSummaryTextDoneEvent\n | OpenAIResponsesOutputItemAddedEvent | OpenAIResponsesOutputItemDoneEvent\n | OpenAIResponsesContentPartAddedEvent | OpenAIResponsesContentPartDoneEvent\n | OpenAIResponsesRefusalDeltaEvent | OpenAIResponsesRefusalDoneEvent\n | OpenAIResponsesCreatedEvent | OpenAIResponsesInProgressEvent | OpenAIResponsesQueuedEvent\n | OpenAIResponsesCompletedEvent | OpenAIResponsesFailedEvent | OpenAIResponsesIncompleteEvent\n | { readonly type: string; readonly [key: string]: unknown };\n\ntype OpenAIResponsesOutputState = {\n itemId: string; kind: 'message' | 'function_call' | 'reasoning';\n content: Map<number, OpenAIResponsesOutputContent>; summary: Map<number, string>;\n arguments: string; name?: string | undefined; callId?: string | undefined; status?: OpenAIResponsesStatus | undefined;\n role?: string | undefined; phase?: string | undefined; reasoningText: string;\n};\nexport class OpenAIResponsesStream implements AsyncIterable<OpenAIResponsesStreamEvent> {\n private readonly finalResultPromise: Promise<OpenAIResponsesResponse>;\n private resolveFinal!: (value: OpenAIResponsesResponse) => void;\n private rejectFinal!: (reason: unknown) => void;\n private removeAbortListener: (() => void) | undefined;\n\n constructor(private readonly source: AbortableAsyncIterable<SseEvent>, signal?: AbortSignal) {\n this.finalResultPromise = new Promise<OpenAIResponsesResponse>((resolve, reject) => { this.resolveFinal = resolve; this.rejectFinal = reject; });\n if (signal !== undefined) {\n const onAbort = (): void => this.abort();\n if (signal.aborted) onAbort();\n else { signal.addEventListener('abort', onAbort, { once: true }); this.removeAbortListener = () => signal.removeEventListener('abort', onAbort); }\n }\n }\n get finalResult(): Promise<OpenAIResponsesResponse> { return this.finalResultPromise; }\n abort(): void {\n this.removeAbortListener?.(); this.removeAbortListener = undefined; this.source.abort?.();\n this.rejectFinal(new OllamaAbortError('OpenAI Responses stream aborted'));\n }\n\n async *[Symbol.asyncIterator](): AsyncGenerator<OpenAIResponsesStreamEvent, void, undefined> {\n let finalResponse: OpenAIResponsesResponse | undefined;\n let responseMeta: OpenAIResponsesResponse | undefined;\n let terminalFailure: OpenAIResponsesResponse | undefined;\n let terminalIncomplete: OpenAIResponsesResponse | undefined;\n const outputs = new Map<number, OpenAIResponsesOutputState>();\n const canonicalOutputItems = new Map<number, OpenAIResponsesOutputItem>();\n let completed = false;\n\n const ensureState = (outputIndex: number, itemId: string, kind: OpenAIResponsesOutputState['kind']): OpenAIResponsesOutputState => {\n const existing = outputs.get(outputIndex);\n if (existing) { if (itemId) existing.itemId = itemId; existing.kind = kind; return existing; }\n const state: OpenAIResponsesOutputState = { itemId, kind, content: new Map(), summary: new Map(), arguments: '', reasoningText: '' };\n outputs.set(outputIndex, state); return state;\n };\n\n const applyOutputItem = (outputIndex: number, item: OpenAIResponsesOutputItem): void => {\n const kind = item.type === 'message' ? 'message' : item.type === 'function_call' ? 'function_call' : 'reasoning';\n const state = ensureState(outputIndex, item.id ?? '', kind);\n state.itemId = item.id ?? state.itemId; state.status = item.status;\n if (item.type === 'message') { state.role = item.role; state.phase = item.phase; state.content.clear(); item.content.forEach((p, i) => state.content.set(i, p)); }\n else if (item.type === 'function_call') { state.callId = item.call_id; state.name = item.name; state.arguments = item.arguments; }\n else { state.summary.clear(); item.summary?.forEach((p, i) => state.summary.set(i, p.text)); state.reasoningText = item.text ?? ''; }\n };\n const applyContentPart = (outputIndex: number, itemId: string, contentIndex: number, part: OpenAIResponsesOutputContent): void => {\n const state = ensureState(outputIndex, itemId, 'message'); state.content.set(contentIndex, part);\n };\n const reconstructedOutput = (): readonly OpenAIResponsesOutputItem[] =>\n [...outputs.entries()].sort(([a], [b]) => a - b).map(([outputIndex, state]) => {\n const canonical = canonicalOutputItems.get(outputIndex); if (canonical) return canonical;\n if (state.kind === 'message') return { type: 'message', ...(state.itemId ? { id: state.itemId } : {}), ...(state.status ? { status: state.status } : {}), role: state.role ?? 'assistant', ...(state.phase ? { phase: state.phase } : {}), content: [...state.content.entries()].sort(([a], [b]) => a - b).map(([, p]) => p) };\n if (state.kind === 'function_call') return { type: 'function_call', ...(state.itemId ? { id: state.itemId } : {}), ...(state.callId ? { call_id: state.callId } : {}), ...(state.status ? { status: state.status } : {}), name: state.name ?? '', arguments: state.arguments };\n return { type: 'reasoning', ...(state.itemId ? { id: state.itemId } : {}), ...(state.status ? { status: state.status } : {}), ...(state.summary.size ? { summary: [...state.summary.entries()].sort(([a], [b]) => a - b).map(([, text]) => ({ type: 'summary_text' as const, text })) } : {}), ...(state.reasoningText ? { text: state.reasoningText } : {}) };\n });\n\n try {\n for await (const event of this.source) {\n if (event.data === '[DONE]') break;\n let payload: OpenAIResponsesStreamEvent;\n try { payload = JSON.parse(event.data) as OpenAIResponsesStreamEvent; } catch (error) { throw new Error('Failed to parse OpenAI Responses SSE payload', { cause: error }); }\n switch (payload.type) {\n case 'response.created': case 'response.in_progress': case 'response.queued': responseMeta = (payload as OpenAIResponsesCreatedEvent).response; break;\n case 'response.completed': case 'response.done': finalResponse = (payload as OpenAIResponsesCompletedEvent).response; break;\n case 'response.failed': terminalFailure = (payload as OpenAIResponsesFailedEvent).response; finalResponse = terminalFailure; break;\n case 'response.incomplete': terminalIncomplete = (payload as OpenAIResponsesIncompleteEvent).response; finalResponse = terminalIncomplete; break;\n case 'response.output_item.added': { const e = payload as OpenAIResponsesOutputItemAddedEvent; applyOutputItem(e.output_index, e.item); break; }\n case 'response.output_item.done': { const e = payload as OpenAIResponsesOutputItemDoneEvent; applyOutputItem(e.output_index, e.item); canonicalOutputItems.set(e.output_index, e.item); break; }\n case 'response.content_part.added': case 'response.content_part.done': {\n const e = payload as OpenAIResponsesContentPartAddedEvent | OpenAIResponsesContentPartDoneEvent;\n if (\n (e.part.type === 'output_text' && 'text' in e.part && typeof e.part.text === 'string') ||\n (e.part.type === 'refusal' && 'refusal' in e.part && typeof e.part.refusal === 'string')\n ) {\n applyContentPart(e.output_index, e.item_id, e.content_index, e.part as OpenAIResponsesOutputContent);\n }\n break;\n }\n case 'response.output_text.delta': { const e = payload as OpenAIResponsesOutputTextDeltaEvent; const s = ensureState(e.output_index, e.item_id, 'message'); const p=s.content.get(e.content_index); s.content.set(e.content_index,{type:'output_text',text:(p?.type==='output_text'?p.text:'')+e.delta}); break; }\n case 'response.output_text.done': { const e = payload as OpenAIResponsesOutputTextDoneEvent; const s=ensureState(e.output_index,e.item_id,'message'); s.content.set(e.content_index,{type:'output_text',text:e.text}); break; }\n case 'response.refusal.delta': { const e=payload as OpenAIResponsesRefusalDeltaEvent; const s=ensureState(e.output_index,e.item_id,'message'); const p=s.content.get(e.content_index); s.content.set(e.content_index,{type:'refusal',refusal:(p?.type==='refusal'?p.refusal:'')+e.delta}); break; }\n case 'response.refusal.done': { const e=payload as OpenAIResponsesRefusalDoneEvent; const s=ensureState(e.output_index,e.item_id,'message'); s.content.set(e.content_index,{type:'refusal',refusal:e.refusal}); break; }\n case 'response.function_call_arguments.delta': { const e=payload as OpenAIResponsesFunctionCallArgumentsDeltaEvent; const s=ensureState(e.output_index,e.item_id,'function_call'); s.arguments+=e.delta; break; }\n case 'response.function_call_arguments.done': { const e=payload as OpenAIResponsesFunctionCallArgumentsDoneEvent; const s=ensureState(e.output_index,e.item_id,'function_call'); s.arguments=e.arguments; if(e.name!==undefined) s.name=e.name; break; }\n case 'response.reasoning_summary_part.added': case 'response.reasoning_summary_part.done': { const e=payload as OpenAIResponsesReasoningSummaryPartAddedEvent | OpenAIResponsesReasoningSummaryPartDoneEvent; const s=ensureState(e.output_index,e.item_id,'reasoning'); s.summary.set(e.summary_index,e.part.text); break; }\n case 'response.reasoning_summary_text.delta': { const e=payload as OpenAIResponsesReasoningSummaryTextDeltaEvent; const s=ensureState(e.output_index,e.item_id,'reasoning'); s.summary.set(e.summary_index,(s.summary.get(e.summary_index)??'')+e.delta); break; }\n case 'response.reasoning_summary_text.done': { const e=payload as OpenAIResponsesReasoningSummaryTextDoneEvent; const s=ensureState(e.output_index,e.item_id,'reasoning'); s.summary.set(e.summary_index,e.text); break; }\n case 'response.reasoning_text.delta': { const e=payload as OpenAIResponsesReasoningTextDeltaEvent; const s=ensureState(e.output_index,e.item_id,'reasoning'); s.reasoningText+=e.delta; break; }\n case 'response.reasoning_text.done': { const e=payload as OpenAIResponsesReasoningTextDoneEvent; const s=ensureState(e.output_index,e.item_id,'reasoning'); s.reasoningText=e.text; break; }\n default: break;\n }\n yield payload;\n }\n if (terminalFailure || terminalIncomplete) {\n const response = terminalFailure ?? terminalIncomplete!; const status = terminalFailure ? 'failed' : 'incomplete';\n const detail = response.error?.message ?? response.incomplete_details?.reason ?? 'unknown error';\n throw new OpenAIResponsesStreamError('OpenAI Responses stream ' + status + ': ' + detail, response);\n }\n if (!finalResponse) {\n if (!responseMeta) throw new Error('OpenAI Responses stream ended without a terminal response payload');\n if (responseMeta.status === 'failed' || responseMeta.status === 'incomplete') {\n const detail=responseMeta.error?.message ?? responseMeta.incomplete_details?.reason ?? 'unknown error';\n throw new OpenAIResponsesStreamError('OpenAI Responses stream ' + responseMeta.status + ': ' + detail, responseMeta);\n }\n finalResponse={...responseMeta,output:reconstructedOutput(),status:'completed'};\n } else if (finalResponse.status === 'failed' || finalResponse.status === 'incomplete') {\n const detail=finalResponse.error?.message ?? finalResponse.incomplete_details?.reason ?? 'unknown error';\n throw new OpenAIResponsesStreamError('OpenAI Responses stream ' + finalResponse.status + ': ' + detail, finalResponse);\n }\n if (finalResponse.output.length===0 && outputs.size>0) finalResponse={...finalResponse,output:reconstructedOutput()};\n completed=true; this.removeAbortListener?.(); this.removeAbortListener=undefined; this.resolveFinal(finalResponse);\n } catch(error) { this.removeAbortListener?.(); this.removeAbortListener=undefined; this.rejectFinal(error); throw error; }\n finally { if(!completed){ this.source.abort?.(); this.rejectFinal(new OllamaAbortError('OpenAI Responses stream ended before completion')); } }\n }\n}\nexport class OpenAICompatClient {\n constructor(\n private readonly http: HttpClient,\n private readonly runner?: RequestRunner | undefined,\n ) {}\n\n private request<T>(\n operation: (http: HttpClient, signal?: AbortSignal) => Promise<T>,\n model: string | undefined,\n signal?: AbortSignal,\n holdUntil?: ((result: T) => Promise<unknown>) | undefined,\n ): Promise<T> {\n if (this.runner) {\n return this.runner(\n (http, runnerSignal) => operation(http, runnerSignal),\n {\n ...(model !== undefined ? { model } : {}),\n ...(signal !== undefined ? { signal } : {}),\n ...(holdUntil !== undefined ? { holdUntil } : {}),\n },\n );\n }\n return operation(this.http, signal);\n }\n\n async createChatCompletion(\n request: OpenAIChatCompletionRequest & { stream: true },\n signal?: AbortSignal,\n ): Promise<OpenAIChatCompletionStream>;\n async createChatCompletion(\n request: OpenAIChatCompletionRequest & { stream?: false | undefined },\n signal?: AbortSignal,\n ): Promise<OpenAIChatCompletionResponse>;\n async createChatCompletion(\n request: OpenAIChatCompletionRequest,\n signal?: AbortSignal,\n ): Promise<OpenAIChatCompletionResponse | OpenAIChatCompletionStream> {\n if (request.stream) {\n return this.request(\n (http, requestSignal) =>\n http.requestSseStream({\n path: '/v1/chat/completions',\n body: request,\n signal: requestSignal,\n }).then((source) => new OpenAIChatCompletionStream(source, requestSignal)),\n request.model,\n signal,\n (stream: OpenAIChatCompletionStream) => stream.finalResult,\n );\n }\n return this.request(\n (http, requestSignal) =>\n http.request<OpenAIChatCompletionResponse>({\n path: '/v1/chat/completions',\n body: request,\n signal: requestSignal,\n }),\n request.model,\n signal,\n );\n }\n\n async chatCompletions(\n request: OpenAIChatCompletionRequest & { stream: true },\n signal?: AbortSignal,\n ): Promise<OpenAIChatCompletionStream>;\n async chatCompletions(\n request: OpenAIChatCompletionRequest & { stream?: false | undefined },\n signal?: AbortSignal,\n ): Promise<OpenAIChatCompletionResponse>;\n async chatCompletions(\n request: OpenAIChatCompletionRequest,\n signal?: AbortSignal,\n ): Promise<OpenAIChatCompletionResponse | OpenAIChatCompletionStream> {\n return this.createChatCompletion(request as never, signal);\n }\n\n async listModels(signal?: AbortSignal): Promise<OpenAIListModelsResponse> {\n return this.request(\n (http, requestSignal) =>\n http.request<OpenAIListModelsResponse>({\n path: '/v1/models',\n method: 'GET',\n signal: requestSignal,\n }),\n undefined,\n signal,\n );\n }\n\n async retrieveModel(\n model: string,\n signal?: AbortSignal,\n ): Promise<OpenAIModelItem> {\n return this.request(\n (http, requestSignal) =>\n http.request<OpenAIModelItem>({\n path: `/v1/models/${encodeURIComponent(model)}`,\n method: 'GET',\n signal: requestSignal,\n }),\n model,\n signal,\n );\n }\n\n async getModel(model: string, signal?: AbortSignal): Promise<OpenAIModelItem> {\n return this.retrieveModel(model, signal);\n }\n\n async createCompletion(\n request: OpenAICompletionRequest & { stream: true },\n signal?: AbortSignal,\n ): Promise<OpenAICompletionStream>;\n async createCompletion(\n request: OpenAICompletionRequest & { stream?: false | undefined },\n signal?: AbortSignal,\n ): Promise<OpenAICompletionResponse>;\n async createCompletion(\n request: OpenAICompletionRequest,\n signal?: AbortSignal,\n ): Promise<OpenAICompletionResponse | OpenAICompletionStream> {\n if (request.stream) {\n return this.request(\n (http, requestSignal) =>\n http.requestSseStream({\n path: '/v1/completions',\n body: request,\n signal: requestSignal,\n }).then((source) => new OpenAICompletionStream(source, requestSignal)),\n request.model,\n signal,\n (stream: OpenAICompletionStream) => stream.finalResult,\n );\n }\n return this.request(\n (http, requestSignal) =>\n http.request<OpenAICompletionResponse>({\n path: '/v1/completions',\n body: request,\n signal: requestSignal,\n }),\n request.model,\n signal,\n );\n }\n\n async completions(\n request: OpenAICompletionRequest & { stream: true },\n signal?: AbortSignal,\n ): Promise<OpenAICompletionStream>;\n async completions(\n request: OpenAICompletionRequest & { stream?: false | undefined },\n signal?: AbortSignal,\n ): Promise<OpenAICompletionResponse>;\n async completions(\n request: OpenAICompletionRequest,\n signal?: AbortSignal,\n ): Promise<OpenAICompletionResponse | OpenAICompletionStream> {\n return this.createCompletion(request as never, signal);\n }\n\n async createEmbedding(\n request: OpenAIEmbeddingRequest,\n signal?: AbortSignal,\n ): Promise<OpenAIEmbeddingResponse> {\n return this.request(\n (http, requestSignal) =>\n http.request<OpenAIEmbeddingResponse>({\n path: '/v1/embeddings',\n body: request,\n signal: requestSignal,\n }),\n request.model,\n signal,\n );\n }\n\n async embeddings(\n request: OpenAIEmbeddingRequest,\n signal?: AbortSignal,\n ): Promise<OpenAIEmbeddingResponse> {\n return this.createEmbedding(request, signal);\n }\n\n async createResponses(\n request: OpenAIResponsesRequest & { stream: true },\n signal?: AbortSignal,\n ): Promise<OpenAIResponsesStream>;\n async createResponses(\n request: OpenAIResponsesRequest & { stream?: false | undefined },\n signal?: AbortSignal,\n ): Promise<OpenAIResponsesResponse>;\n async createResponses(\n request: OpenAIResponsesRequest,\n signal?: AbortSignal,\n ): Promise<OpenAIResponsesResponse | OpenAIResponsesStream> {\n if (request.stream) {\n return this.request(\n (http, requestSignal) =>\n http.requestSseStream({\n path: '/v1/responses',\n body: request,\n signal: requestSignal,\n }).then((source) => new OpenAIResponsesStream(source, requestSignal)),\n request.model,\n signal,\n (stream: OpenAIResponsesStream) => stream.finalResult,\n );\n }\n return this.request(\n (http, requestSignal) =>\n http.request<OpenAIResponsesResponse>({\n path: '/v1/responses',\n body: request,\n signal: requestSignal,\n }),\n request.model,\n signal,\n );\n }\n\n async responses(\n request: OpenAIResponsesRequest & { stream: true },\n signal?: AbortSignal,\n ): Promise<OpenAIResponsesStream>;\n async responses(\n request: OpenAIResponsesRequest & { stream?: false | undefined },\n signal?: AbortSignal,\n ): Promise<OpenAIResponsesResponse>;\n async responses(\n request: OpenAIResponsesRequest,\n signal?: AbortSignal,\n ): Promise<OpenAIResponsesResponse | OpenAIResponsesStream> {\n return this.createResponses(request as never, signal);\n }\n}\n","/**\n * Anthropic Compatibility interfaces and client helpers for Ollama.\n * Ollama supports the Anthropic Messages API format.\n */\n\nimport type { AbortableAsyncIterable } from '../streaming/types.js';\nimport type { SseEvent } from '../streaming/sse.js';\nimport type { HttpClient } from '../transport/http.js';\nimport type { RequestRunner } from '../transport/runner.js';\nimport { OllamaAbortError } from '../errors.js';\n\nexport interface AnthropicCacheControl {\n readonly type: 'ephemeral';\n readonly ttl?: '5m' | '1h' | undefined;\n}\n\nexport interface AnthropicTextContentBlock {\n readonly type: 'text';\n readonly text: string;\n readonly cache_control?: AnthropicCacheControl | undefined;\n}\n\nexport interface AnthropicImageContentBlock {\n readonly type: 'image';\n readonly source: {\n readonly type: 'base64';\n readonly media_type: string;\n readonly data: string;\n };\n}\n\nexport interface AnthropicToolUseContentBlock {\n readonly type: 'tool_use';\n readonly id: string;\n readonly name: string;\n readonly input: Record<string, unknown>;\n}\n\nexport interface AnthropicToolResultContentBlock {\n readonly type: 'tool_result';\n readonly tool_use_id: string;\n readonly content?: string | readonly AnthropicTextContentBlock[] | undefined;\n readonly is_error?: boolean | undefined;\n}\n\nexport interface AnthropicThinkingContentBlock {\n readonly type: 'thinking';\n readonly thinking: string;\n readonly signature?: string | undefined;\n}\n\nexport interface AnthropicRedactedThinkingContentBlock {\n readonly type: 'redacted_thinking';\n readonly data: string;\n}\n\nexport type AnthropicContentBlock =\n | AnthropicTextContentBlock\n | AnthropicImageContentBlock\n | AnthropicToolUseContentBlock\n | AnthropicToolResultContentBlock\n | AnthropicThinkingContentBlock\n | AnthropicRedactedThinkingContentBlock;\n\nexport interface AnthropicMessage {\n readonly role: 'user' | 'assistant';\n readonly content: string | readonly AnthropicContentBlock[];\n}\n\nexport interface AnthropicSystemTextBlock {\n readonly type: 'text';\n readonly text: string;\n readonly cache_control?: AnthropicCacheControl | undefined;\n}\n\nexport type AnthropicSystem = string | readonly AnthropicSystemTextBlock[];\n\nexport interface AnthropicTool {\n readonly name: string;\n readonly description?: string | undefined;\n readonly input_schema: Record<string, unknown>;\n readonly eager_input_streaming?: boolean | undefined;\n}\n\nexport type AnthropicToolChoice =\n | { readonly type: 'auto'; readonly disable_parallel_tool_use?: boolean | undefined }\n | { readonly type: 'any'; readonly disable_parallel_tool_use?: boolean | undefined }\n | { readonly type: 'tool'; readonly name: string; readonly disable_parallel_tool_use?: boolean | undefined }\n | { readonly type: 'none' };\n\nexport interface AnthropicThinkingConfig {\n readonly type: 'enabled' | 'disabled' | 'adaptive';\n readonly display?: 'omitted' | 'summarized' | 'updates' | undefined;\n /** Accepted by Ollama for compatibility but currently not enforced by the server. */\n readonly budget_tokens?: number | undefined;\n}\n\nexport interface AnthropicOutputConfig {\n readonly effort?: string | undefined;\n}\n\nexport interface AnthropicMetadata {\n readonly user_id?: string | undefined;\n}\n\nexport interface AnthropicMessagesRequest {\n readonly model: string;\n readonly messages: readonly AnthropicMessage[];\n readonly system?: AnthropicSystem | undefined;\n readonly max_tokens?: number | undefined;\n readonly temperature?: number | undefined;\n readonly top_p?: number | undefined;\n readonly top_k?: number | undefined;\n readonly stop_sequences?: readonly string[] | undefined;\n readonly stream?: boolean | undefined;\n readonly tools?: readonly AnthropicTool[] | undefined;\n readonly thinking?: AnthropicThinkingConfig | undefined;\n readonly output_config?: AnthropicOutputConfig | undefined;\n /**\n * Accepted for Anthropic compatibility but currently ignored by Ollama.\n * Tool selection cannot be forced through the Ollama compatibility endpoint.\n */\n readonly tool_choice?: AnthropicToolChoice | undefined;\n /** Accepted for compatibility but currently ignored by Ollama. */\n readonly metadata?: AnthropicMetadata | undefined;\n}\n\n/** Strict Ollama-documented Messages request; excludes fields Ollama marks unsupported. */\nexport type OllamaAnthropicTextContentBlock = Omit<\n AnthropicTextContentBlock,\n 'cache_control'\n>;\n\nexport type OllamaAnthropicTool = Omit<AnthropicTool, 'eager_input_streaming'>;\n\nexport type OllamaAnthropicThinkingConfig = {\n readonly type: 'enabled' | 'disabled';\n /** Accepted by Ollama for compatibility but currently not enforced by the server. */\n readonly budget_tokens?: number | undefined;\n};\n\nexport type OllamaAnthropicToolResultContentBlock = Omit<\n AnthropicToolResultContentBlock,\n 'content'\n> & {\n readonly content?: string | readonly OllamaAnthropicTextContentBlock[] | undefined;\n};\n\nexport type OllamaAnthropicContentBlock =\n | OllamaAnthropicTextContentBlock\n | AnthropicImageContentBlock\n | AnthropicToolUseContentBlock\n | OllamaAnthropicToolResultContentBlock\n | AnthropicThinkingContentBlock;\n\nexport type OllamaAnthropicMessage = Omit<AnthropicMessage, 'content'> & {\n readonly content: string | readonly OllamaAnthropicContentBlock[];\n};\n\nexport type OllamaAnthropicSystemTextBlock = Omit<\n AnthropicSystemTextBlock,\n 'cache_control'\n>;\n\nexport type OllamaAnthropicSystem =\n | string\n | readonly OllamaAnthropicSystemTextBlock[];\n\n/** Strict Ollama-documented Messages request; excludes unsupported caching/tool-choice metadata. */\nexport type OllamaAnthropicMessagesRequest = Omit<\n AnthropicMessagesRequest,\n 'messages' | 'system' | 'tools' | 'thinking' | 'tool_choice' | 'metadata'\n> & {\n readonly messages: readonly OllamaAnthropicMessage[];\n readonly system?: OllamaAnthropicSystem | undefined;\n readonly tools?: readonly OllamaAnthropicTool[] | undefined;\n readonly thinking?: OllamaAnthropicThinkingConfig | undefined;\n};\n\nexport interface AnthropicMessagesResponse {\n readonly id: string;\n readonly type: 'message';\n readonly role: 'assistant';\n readonly content: readonly AnthropicContentBlock[];\n readonly model: string;\n readonly stop_reason: string | null;\n readonly stop_sequence?: string | null | undefined;\n readonly usage?: {\n readonly input_tokens: number;\n readonly output_tokens: number;\n readonly cache_creation_input_tokens?: number | undefined;\n readonly cache_read_input_tokens?: number | undefined;\n readonly cache_creation?: Record<string, unknown> | undefined;\n } | undefined;\n}\n\nexport interface AnthropicMessageStartEvent {\n readonly type: 'message_start';\n readonly message: AnthropicMessagesResponse;\n}\n\nexport interface AnthropicContentBlockStartEvent {\n readonly type: 'content_block_start';\n readonly index: number;\n readonly content_block: AnthropicContentBlock;\n}\n\nexport type AnthropicContentBlockDelta =\n | { readonly type: 'text_delta'; readonly text: string }\n | { readonly type: 'input_json_delta'; readonly partial_json: string }\n | { readonly type: 'thinking_delta'; readonly thinking: string }\n | { readonly type: 'signature_delta'; readonly signature: string };\n\nexport interface AnthropicContentBlockDeltaEvent {\n readonly type: 'content_block_delta';\n readonly index: number;\n readonly delta: AnthropicContentBlockDelta;\n}\n\nexport interface AnthropicContentBlockStopEvent {\n readonly type: 'content_block_stop';\n readonly index: number;\n}\n\nexport interface AnthropicMessageDeltaEvent {\n readonly type: 'message_delta';\n readonly delta: {\n readonly stop_reason?: string | null | undefined;\n readonly stop_sequence?: string | null | undefined;\n };\n readonly usage?: {\n readonly input_tokens?: number | undefined;\n readonly output_tokens: number;\n readonly cache_creation_input_tokens?: number | undefined;\n readonly cache_read_input_tokens?: number | undefined;\n readonly cache_creation?: Record<string, unknown> | undefined;\n } | undefined;\n}\n\nexport interface AnthropicMessageStopEvent {\n readonly type: 'message_stop';\n}\n\nexport interface AnthropicPingEvent {\n readonly type: 'ping';\n}\n\nexport interface AnthropicErrorEvent {\n readonly type: 'error';\n readonly error: {\n readonly type: string;\n readonly message: string;\n };\n}\n\nexport interface AnthropicUnknownStreamEvent {\n /** Forward-compatible event type not yet modeled by this SDK. */\n readonly type: string;\n readonly [key: string]: unknown;\n}\n\nexport type AnthropicMessageStreamEvent =\n | AnthropicMessageStartEvent\n | AnthropicContentBlockStartEvent\n | AnthropicContentBlockDeltaEvent\n | AnthropicContentBlockStopEvent\n | AnthropicMessageDeltaEvent\n | AnthropicMessageStopEvent\n | AnthropicPingEvent\n | AnthropicErrorEvent\n | AnthropicUnknownStreamEvent;\n\ntype AnthropicKnownStreamEvent = Exclude<\n AnthropicMessageStreamEvent,\n AnthropicUnknownStreamEvent\n>;\n\nfunction isAnthropicKnownStreamEvent(\n event: AnthropicMessageStreamEvent,\n): event is AnthropicKnownStreamEvent {\n switch (event.type) {\n case 'message_start':\n case 'content_block_start':\n case 'content_block_delta':\n case 'content_block_stop':\n case 'message_delta':\n case 'message_stop':\n case 'ping':\n case 'error':\n return true;\n default:\n return false;\n }\n}\n\nfunction parseAnthropicEvent(event: SseEvent): AnthropicMessageStreamEvent {\n return JSON.parse(event.data) as AnthropicMessageStreamEvent;\n}\n\nfunction mergeContentBlock(\n current: AnthropicContentBlock,\n delta: AnthropicContentBlockDelta,\n): AnthropicContentBlock {\n if (delta.type === 'text_delta' && current.type === 'text') {\n return { ...current, text: current.text + delta.text };\n }\n if (delta.type === 'input_json_delta' && current.type === 'tool_use') {\n return current;\n }\n if (delta.type === 'thinking_delta' && current.type === 'thinking') {\n return { ...current, thinking: current.thinking + delta.thinking };\n }\n if (delta.type === 'signature_delta' && current.type === 'thinking') {\n return { ...current, signature: (current.signature ?? '') + delta.signature };\n }\n return current;\n}\n\nfunction sanitizeAnthropicTextBlock(\n block: AnthropicTextContentBlock,\n): OllamaAnthropicTextContentBlock {\n if (block.cache_control === undefined) return block;\n const { cache_control: _cacheControl, ...sanitized } = block;\n return sanitized;\n}\n\nfunction sanitizeAnthropicContentBlock(\n block: AnthropicContentBlock,\n): AnthropicContentBlock {\n if (block.type === 'text') {\n return sanitizeAnthropicTextBlock(block);\n }\n\n if (block.type === 'tool_result' && Array.isArray(block.content)) {\n return {\n ...block,\n content: block.content.map(sanitizeAnthropicTextBlock),\n };\n }\n\n return block;\n}\n\nfunction sanitizeAnthropicRequest(request: AnthropicMessagesRequest): AnthropicMessagesRequest {\n const messages = request.messages.map((message) => {\n if (typeof message.content === 'string') return message;\n return {\n ...message,\n content: message.content.map(sanitizeAnthropicContentBlock),\n };\n });\n\n const system = Array.isArray(request.system)\n ? request.system.map(sanitizeAnthropicTextBlock)\n : request.system;\n\n const {\n tool_choice: _toolChoice,\n metadata: _metadata,\n ...sanitized\n } = request;\n\n return {\n ...sanitized,\n messages,\n ...(system !== undefined ? { system } : {}),\n };\n}\nexport class AnthropicMessagesStream implements AsyncIterable<AnthropicMessageStreamEvent> {\n private readonly finalResultPromise: Promise<AnthropicMessagesResponse>;\n private resolveFinal!: (value: AnthropicMessagesResponse) => void;\n private rejectFinal!: (reason: unknown) => void;\n private removeAbortListener: (() => void) | undefined;\n\n constructor(private readonly source: AbortableAsyncIterable<SseEvent>, signal?: AbortSignal) {\n this.finalResultPromise = new Promise<AnthropicMessagesResponse>((resolve, reject) => {\n this.resolveFinal = resolve;\n this.rejectFinal = reject;\n });\n if (signal !== undefined) {\n const onAbort = (): void => this.abort();\n if (signal.aborted) onAbort();\n else {\n signal.addEventListener('abort', onAbort, { once: true });\n this.removeAbortListener = () => signal.removeEventListener('abort', onAbort);\n }\n }\n }\n\n get finalResult(): Promise<AnthropicMessagesResponse> {\n return this.finalResultPromise;\n }\n\n abort(): void {\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n this.source.abort?.();\n this.rejectFinal(new OllamaAbortError('Anthropic Messages stream aborted'));\n }\n\n async *[Symbol.asyncIterator](): AsyncGenerator<AnthropicMessageStreamEvent, void, undefined> {\n let message:\n | AnthropicMessagesResponse\n | undefined;\n const blocks = new Map<number, AnthropicContentBlock>();\n const toolInputJson = new Map<number, string>();\n let completed = false;\n\n try {\n for await (const rawEvent of this.source) {\n let event: AnthropicMessageStreamEvent;\n try {\n event = parseAnthropicEvent(rawEvent);\n } catch (error) {\n throw new Error('Failed to parse Anthropic message SSE payload', { cause: error });\n }\n\n if (!isAnthropicKnownStreamEvent(event)) {\n yield event;\n continue;\n }\n\n if (event.type === 'error') {\n throw new Error(event.error.message);\n }\n\n if (event.type === 'message_start') {\n message = {\n ...event.message,\n content: [],\n ...(event.message.usage !== undefined ? { usage: event.message.usage } : {}),\n };\n } else if (event.type === 'content_block_start') {\n blocks.set(event.index, event.content_block);\n } else if (event.type === 'content_block_delta') {\n const current = blocks.get(event.index);\n if (event.delta.type === 'input_json_delta') {\n toolInputJson.set(event.index, (toolInputJson.get(event.index) ?? '') + event.delta.partial_json);\n }\n if (current) blocks.set(event.index, mergeContentBlock(current, event.delta));\n } else if (event.type === 'content_block_stop') {\n const current = blocks.get(event.index);\n if (current?.type === 'tool_use') {\n const rawJson = toolInputJson.get(event.index);\n if (rawJson !== undefined && rawJson !== '') {\n try {\n const parsed = JSON.parse(rawJson) as Record<string, unknown>;\n blocks.set(event.index, { ...current, input: parsed });\n } catch {\n // Keep the provider-provided partial object when the accumulated JSON is malformed.\n blocks.set(event.index, current);\n }\n }\n }\n } else if (event.type === 'message_delta') {\n if (message) {\n message = {\n ...message,\n stop_reason:\n event.delta.stop_reason !== undefined && event.delta.stop_reason !== null\n ? event.delta.stop_reason\n : message.stop_reason,\n stop_sequence: event.delta.stop_sequence ?? message.stop_sequence,\n ...(event.usage !== undefined\n ? {\n usage: {\n input_tokens: event.usage.input_tokens ?? message.usage?.input_tokens ?? 0,\n output_tokens: event.usage.output_tokens,\n ...(event.usage.cache_creation_input_tokens !== undefined\n ? { cache_creation_input_tokens: event.usage.cache_creation_input_tokens }\n : message.usage?.cache_creation_input_tokens !== undefined\n ? { cache_creation_input_tokens: message.usage.cache_creation_input_tokens }\n : {}),\n ...(event.usage.cache_read_input_tokens !== undefined\n ? { cache_read_input_tokens: event.usage.cache_read_input_tokens }\n : message.usage?.cache_read_input_tokens !== undefined\n ? { cache_read_input_tokens: message.usage.cache_read_input_tokens }\n : {}),\n ...(event.usage.cache_creation !== undefined\n ? { cache_creation: event.usage.cache_creation }\n : message.usage?.cache_creation !== undefined\n ? { cache_creation: message.usage.cache_creation }\n : {}),\n },\n }\n : {}),\n };\n }\n } else if (event.type === 'message_stop' && message) {\n message = {\n ...message,\n content: [...blocks.entries()].sort(([a], [b]) => a - b).map(([, block]) => block),\n };\n }\n\n yield event;\n }\n\n if (!message) {\n throw new Error('Anthropic Messages stream ended without message_start');\n }\n\n const final: AnthropicMessagesResponse = {\n ...message,\n content: [...blocks.entries()].sort(([a], [b]) => a - b).map(([, block]) => block),\n };\n completed = true;\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n this.resolveFinal(final);\n } catch (error) {\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n this.rejectFinal(error);\n throw error;\n } finally {\n if (!completed) {\n this.source.abort?.();\n this.rejectFinal(new OllamaAbortError('Anthropic Messages stream ended before completion'));\n }\n }\n }\n}\n\nexport class AnthropicCompatClient {\n constructor(\n private readonly http: HttpClient,\n private readonly runner?: RequestRunner | undefined,\n ) {}\n\n private request<T>(\n operation: (http: HttpClient, signal?: AbortSignal) => Promise<T>,\n model: string,\n signal?: AbortSignal,\n holdUntil?: ((result: T) => Promise<unknown>) | undefined,\n ): Promise<T> {\n if (this.runner) {\n return this.runner(\n (http, runnerSignal) => operation(http, runnerSignal),\n {\n model,\n ...(signal !== undefined ? { signal } : {}),\n ...(holdUntil !== undefined ? { holdUntil } : {}),\n },\n );\n }\n return operation(this.http, signal);\n }\n\n async createMessage(\n request: AnthropicMessagesRequest & { stream: true },\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesStream>;\n async createMessage(\n request: AnthropicMessagesRequest & { stream?: false | undefined },\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesResponse>;\n async createMessage(\n request: AnthropicMessagesRequest,\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesResponse | AnthropicMessagesStream>;\n async createMessage(\n request: AnthropicMessagesRequest,\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesResponse | AnthropicMessagesStream> {\n if (request.stream) {\n return this.request(\n (http, requestSignal) =>\n http.requestSseStream({\n path: '/v1/messages',\n body: sanitizeAnthropicRequest(request),\n headers: { 'anthropic-version': '2023-06-01' },\n signal: requestSignal,\n }).then((source) => new AnthropicMessagesStream(source, requestSignal)),\n request.model,\n signal,\n (stream: AnthropicMessagesStream) => stream.finalResult,\n );\n }\n return this.request(\n (http, requestSignal) =>\n http.request<AnthropicMessagesResponse>({\n path: '/v1/messages',\n body: sanitizeAnthropicRequest(request),\n headers: { 'anthropic-version': '2023-06-01' },\n signal: requestSignal,\n }),\n request.model,\n signal,\n );\n }\n\n async messages(\n request: AnthropicMessagesRequest & { stream: true },\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesStream>;\n async messages(\n request: AnthropicMessagesRequest & { stream?: false | undefined },\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesResponse>;\n async messages(\n request: AnthropicMessagesRequest,\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesResponse | AnthropicMessagesStream>;\n async messages(\n request: AnthropicMessagesRequest,\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesResponse | AnthropicMessagesStream> {\n if (request.stream) {\n return this.createMessage(request, signal);\n }\n return this.createMessage(request, signal);\n }\n}\n","/**\n * OllamaRuntime — the runtime seam generated API classes delegate to.\n *\n * This is the only hand-written file in `src/generated/runtime/`. Every\n * generated method in `src/generated/api/*-api.ts` ends with:\n *\n * ```ts\n * return this.runtime.invoke({ operation: chatOp, body: request });\n * ```\n *\n * The runtime is responsible for:\n * - Method/path resolution (from {@link OperationDefinition})\n * - Streaming default application (when the request doesn't set `stream`)\n * - Environment guard (rejecting cloud calls for local-only operations)\n * - Version constraint guard (failing fast when the server is too old)\n * - Delegating to the existing {@link HttpClient} for transport, retry,\n * telemetry, NDJSON/SSE parsing\n *\n * It is intentionally a thin adapter — the existing transport, streaming,\n * middleware, and error-mapping layers are preserved verbatim. This file\n * only adds the contract-aware glue between generated API classes and the\n * existing HttpClient.\n */\nimport { HttpClient, type HttpRequestOptions } from '../../transport/http.js';\nimport { parseNdjsonStream } from '../../streaming/ndjson.js';\nimport { OllamaGenericClientError } from '../../errors.js';\nimport type { OperationDefinition, InvokeRequest } from './operation-definition.js';\n\n/** Constructor options for {@link OllamaRuntime}. */\nexport interface OllamaRuntimeOptions {\n readonly http: HttpClient;\n /**\n * Whether this runtime is targeting a local Ollama instance. Defaults to\n * `true`. When `false`, operations marked `environment.cloud === false`\n * (i.e. local-only like `/v1/systemone`) are rejected at request time.\n */\n readonly localMode?: boolean;\n /**\n * Server version, if known (typically from a prior `/api/version` call).\n * When set, operations with `constraints.minOllamaVersion` are checked\n * against this value at request time.\n */\n readonly serverVersion?: string;\n}\n\nfunction compareVersions(a: string, b: string): number {\n const pa = a.split('.').map((s) => Number.parseInt(s, 10) ?? 0);\n const pb = b.split('.').map((s) => Number.parseInt(s, 10) ?? 0);\n for (let i = 0; i < Math.max(pa.length, pb.length); i += 1) {\n const va = pa[i] ?? 0;\n const vb = pb[i] ?? 0;\n if (va !== vb) return va - vb;\n }\n return 0;\n}\n\n/**\n * Apply environment + version guards before delegating to HttpClient.\n *\n * Throws {@link OllamaGenericClientError} when:\n * - The operation is local-only and the runtime is in cloud mode.\n * - The operation has `constraints.minOllamaVersion` and the server is older.\n */\nfunction assertOperationAllowed(\n operation: OperationDefinition,\n options: OllamaRuntimeOptions,\n): void {\n const localMode = options.localMode ?? true;\n if (!localMode && !operation.environment.cloud) {\n throw new OllamaGenericClientError(\n `Operation ${operation.operationId} (${operation.method} ${operation.path}) ` +\n `is local-only and not supported in cloud mode.`,\n );\n }\n if (\n operation.constraints?.minOllamaVersion &&\n options.serverVersion &&\n compareVersions(options.serverVersion, operation.constraints.minOllamaVersion) < 0\n ) {\n throw new OllamaGenericClientError(\n `Operation ${operation.operationId} (${operation.method} ${operation.path}) ` +\n `requires Ollama >= ${operation.constraints.minOllamaVersion} ` +\n `(server reports ${options.serverVersion}).`,\n );\n }\n}\n\n/**\n * Decide whether the request should stream. If the request body explicitly\n * sets `stream`, that wins. Otherwise the operation's `streamingDefault`\n * from the contract is used.\n */\nfunction shouldStream(req: InvokeRequest): boolean {\n if (req.body && typeof req.body === 'object' && 'stream' in req.body) {\n const explicit = (req.body as { stream?: unknown }).stream;\n if (typeof explicit === 'boolean') return explicit;\n }\n return Boolean(req.streamingDefault ?? req.operation.transport.streamingDefault);\n}\n\n/**\n * Apply the streaming default to the request body if needed.\n *\n * If the operation streams by default and the body doesn't set `stream`,\n * add `stream: true`. The user can always override by setting `stream`\n * explicitly on the request.\n */\nfunction buildBody(req: InvokeRequest): unknown {\n if (req.body === undefined) return undefined;\n if (typeof req.body !== 'object' || req.body === null) return req.body;\n const body = req.body as Record<string, unknown>;\n if (\n req.operation.transport.streaming &&\n req.operation.transport.streamingDefault &&\n body.stream === undefined\n ) {\n return { ...body, stream: true };\n }\n return body;\n}\n\n/** The runtime seam. */\nexport class OllamaRuntime {\n constructor(private readonly options: OllamaRuntimeOptions) {}\n\n /**\n * Invoke an operation. Called by every generated API method.\n *\n * Returns a `Promise<T>` for non-streaming operations, or an\n * `AsyncGenerator<T>` for streaming operations. The generated API\n * class's overloads pick the right return type at compile time.\n */\n async invoke<T = unknown>(req: InvokeRequest): Promise<T> {\n assertOperationAllowed(req.operation, this.options);\n const body = buildBody(req);\n const streaming = shouldStream(req);\n\n // The HttpClient expects the narrow method union 'GET' | 'POST' |\n // 'DELETE' | 'HEAD' | undefined — cast through `as` because our\n // OperationDefinition.method is the wider HttpMethod type.\n const httpReq: HttpRequestOptions = {\n path: req.operation.path,\n method: req.operation.method as 'GET' | 'POST' | 'DELETE' | 'HEAD',\n ...(body !== undefined ? { body } : {}),\n ...(req.signal !== undefined ? { signal: req.signal } : {}),\n // For streaming calls, request the raw Response so we can pipe it\n // through parseNdjsonStream directly. This inherits middleware,\n // retry, telemetry, and error-mapping from HttpClient — the\n // previous Wave 3 implementation bypassed them with a direct\n // `fetch()` call.\n ...(streaming ? { raw: true } : {}),\n };\n\n if (!streaming) {\n return (await this.options.http.request<T>(httpReq)) as T;\n }\n\n // Streaming: HttpClient returns the raw Response (via the `raw: true`\n // option) so we can read its body as an NDJSON stream.\n const response = await this.options.http.request<Response>(httpReq);\n if (!response.body) {\n throw new OllamaGenericClientError(\n `Operation ${req.operation.operationId}: streaming response had no body.`,\n );\n }\n return parseNdjsonStream<T>(response.body) as unknown as T;\n }\n}\n","/**\n * Cross-runtime helpers with no Node.js API dependency, so they stay safe to import from\n * the core client bundle (see ADR 0006 — Edge Runtime CI).\n */\n\n/**\n * Encodes an image to a base64 string, matching the wire format Ollama's `/api/chat` and\n * `/api/generate` `images` arrays expect.\n *\n * - A `string` is assumed to already be base64-encoded and is returned unchanged.\n * - A `Uint8Array` is base64-encoded using whichever universal primitive the runtime\n * exposes: `Buffer` on Node.js, `btoa` on browsers/Edge runtimes. Chunked so it doesn't\n * blow the engine's max call-stack/argument-count limits on large images.\n */\nexport async function encodeImage(image: Uint8Array | string): Promise<string> {\n if (typeof image === 'string') return image;\n\n const bufferCtor = (\n globalThis as { Buffer?: { from(data: Uint8Array): { toString(encoding: string): string } } }\n ).Buffer;\n if (bufferCtor !== undefined) return bufferCtor.from(image).toString('base64');\n\n const CHUNK_SIZE = 0x8000;\n let binary = '';\n for (let i = 0; i < image.length; i += CHUNK_SIZE) {\n binary += String.fromCharCode(...image.subarray(i, i + CHUNK_SIZE));\n }\n return btoa(binary);\n}\n\nasync function encodeImages(\n images: readonly (string | Uint8Array)[] | undefined,\n): Promise<readonly string[] | undefined> {\n if (images === undefined) return undefined;\n return Promise.all(images.map((image) => encodeImage(image)));\n}\n\n/**\n * Returns `req` unchanged if `req.images` has no `Uint8Array` entries (the common case),\n * otherwise a shallow copy with `images` base64-encoded. Keeps `chat`/`generate` request\n * bodies wire-compatible without requiring callers to pre-encode raw image bytes.\n */\nexport async function withEncodedImages<\n T extends { images?: readonly (string | Uint8Array)[] | undefined },\n>(req: T): Promise<T> {\n if (!req.images?.some((image) => image instanceof Uint8Array)) return req;\n return { ...req, images: await encodeImages(req.images) };\n}\n\n/**\n * Applies {@link withEncodedImages} to each message's `images` array. Returns `messages`\n * unchanged (same reference) if no message carries a `Uint8Array` image.\n */\nexport async function withEncodedMessageImages<\n T extends { images?: readonly (string | Uint8Array)[] | undefined },\n>(messages: readonly T[]): Promise<readonly T[]> {\n if (!messages.some((message) => message.images?.some((image) => image instanceof Uint8Array)))\n return messages;\n return Promise.all(messages.map((message) => withEncodedImages(message)));\n}\n","/**\n * Main OllamaClient class with failover, streaming, structured outputs, and ecosystem integrations.\n */\n\nimport { z } from 'zod';\nimport {\n DEFAULT_BASE_URL,\n DEFAULT_FAILOVER_CODES,\n DEFAULT_TIMEOUT_MS,\n OLLAMA_CLOUD_BASE_URL,\n resolveApiKey,\n resolveBaseUrl,\n resolveCredentialEndpoints,\n type OllamaClientConfig,\n} from './config.js';\nimport {\n OllamaClientError,\n OllamaModelRoutingError,\n OllamaUnsupportedCapabilityError,\n} from './errors.js';\nimport { createConsoleLogger, NOOP_LOGGER, type Logger } from './logger.js';\nimport { EndpointRegistry, type EndpointHealth } from './providers/endpoint-registry.js';\nimport { checkEndpointHealth, type EndpointHealthCheckResult } from './providers/health-check.js';\nimport {\n detectModelCapabilities,\n inferRuntimeMode,\n type ModelCapabilities,\n type RuntimeMode,\n} from './capabilities/capabilities.js';\nimport { parseStructuredOutput, zodToJsonSchema } from './schema/zod.js';\nimport { normalizeChatStream, normalizeGenerateStream } from './streaming/normalize.js';\nimport { OllamaStream } from './streaming/stream.js';\nimport type { ChatStreamResult, GenerateStreamResult } from './streaming/types.js';\nimport { HttpClient, type BinaryBody, type FetchLike } from './transport/http.js';\nimport { DEFAULT_RETRY_CONFIG, withRetry, type RetryConfig } from './transport/retry.js';\nimport { createTimeoutSignal } from './transport/timeout.js';\nimport { ModelsClient } from './models-client.js';\nimport { OpenAICompatClient } from './integrations/openai.js';\nimport { AnthropicCompatClient } from './integrations/anthropic.js';\nimport { OllamaRuntime } from './generated/runtime/runtime.js';\nimport { ensureToolCallIds } from './tools/tool-call-id.js';\nimport { withEncodedImages, withEncodedMessageImages } from './utils.js';\nimport {\n withSpan,\n ATTR_GEN_AI_SYSTEM,\n ATTR_GEN_AI_OPERATION_NAME,\n ATTR_GEN_AI_REQUEST_MODEL,\n ATTR_GEN_AI_RESPONSE_MODEL,\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n ATTR_OLLAMA_ENDPOINT_NAME,\n ATTR_OLLAMA_ENDPOINT_ATTEMPT,\n GEN_AI_SYSTEM_OLLAMA,\n} from './telemetry/index.js';\nimport type {\n ChatRequestOptions,\n ChatResponse,\n CopyRequestOptions,\n CreateRequestOptions,\n DeleteRequestOptions,\n EmbedRequestOptions,\n EmbedResponse,\n EmbeddingsRequestOptions,\n EmbeddingsResponse,\n GenerateRequestOptions,\n GenerateResponse,\n PullRequestOptions,\n PushRequestOptions,\n RequestCancellationOptions,\n ShowRequestOptions,\n WebFetchRequestOptions,\n WebFetchResponse,\n WebSearchRequestOptions,\n WebSearchResponse,\n} from './types.js';\n\nlet logicalRequestSequence = 0;\n\nfunction createLogicalRequestId(): string {\n logicalRequestSequence += 1;\n return `ollama-request-${logicalRequestSequence}`;\n}\n\n/**\n * High-level Ollama client — the original, hand-written API surface.\n *\n * **Wave 8 (ADR 0018) deprecation notice:**\n *\n * For new code, prefer the generated `NativeApi` from\n * {@link ./generated/runtime/runtime.js} + {@link ./generated/api/native-api.js}\n * instead. The generated surface:\n *\n * - Inherits every contract-layer guarantee (environment guards, version\n * guards, streaming defaults) automatically from the canonical IR.\n * - Stays in sync with the OpenAPI spec by construction — no hand-written\n * surface to drift.\n * - Uses the same `HttpClient` (and therefore the same middleware,\n * retry, telemetry, and streaming pipeline) as this client.\n *\n * The migration path is non-breaking:\n *\n * ```ts\n * // Before (still works, no breaking changes):\n * const client = new OllamaClient({ baseUrl: 'http://localhost:11434' });\n * const res = await client.chat({ model, messages });\n *\n * // After (recommended for new code):\n * const http = new HttpClient({ baseUrl: 'http://localhost:11434' });\n * const runtime = new OllamaRuntime({ http });\n * const api = new NativeApi(runtime);\n * const res = await api.chat({ model, messages, stream: false });\n * ```\n *\n * `OllamaClient` is preserved verbatim — existing callers do not need to\n * change anything. New methods and operations will land on the generated\n * surface first; `OllamaClient` will receive them only as a follow-up.\n */\nexport class OllamaClient {\n readonly registry: EndpointRegistry;\n readonly models: ModelsClient;\n private readonly retryConfig: RetryConfig;\n private readonly timeoutMs: number;\n private readonly failoverCodes: Set<string>;\n private readonly fetchImpl: FetchLike;\n private readonly logger: Logger;\n private readonly middleware: OllamaClientConfig['middleware'];\n private readonly onLifecycleEvent: OllamaClientConfig['onLifecycleEvent'];\n /**\n * API key for Ollama's hosted web tools (`webSearch`/`webFetch`), which always target\n * `OLLAMA_CLOUD_BASE_URL` regardless of `config.endpoints` — an Ollama account API key\n * is inherently a single global credential, not tied to any one inference endpoint.\n * Resolved the same way as a single-endpoint `apiKey` (`config.apiKey` falling back to\n * `OLLAMA_API_KEY`), independent of whether `config.endpoints` was used instead.\n */\n private readonly cloudApiKey: string | undefined;\n\n constructor(config: OllamaClientConfig = {}) {\n const resolvedApiKey = resolveApiKey(config.apiKey);\n this.cloudApiKey = resolvedApiKey;\n const credentialEndpoints = resolveCredentialEndpoints(config);\n const endpoints =\n config.endpoints ??\n (credentialEndpoints.length > 0\n ? []\n : [\n {\n name: 'default',\n baseUrl: resolveBaseUrl(config.baseUrl),\n ...(resolvedApiKey !== undefined ? { apiKey: resolvedApiKey } : {}),\n ...(config.headers !== undefined ? { headers: config.headers } : {}),\n },\n ]);\n this.registry = new EndpointRegistry(\n [...endpoints, ...credentialEndpoints],\n config.endpointHealth,\n );\n this.timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.failoverCodes = new Set(config.failoverOn ?? DEFAULT_FAILOVER_CODES);\n this.fetchImpl = config.fetch ?? globalThis.fetch;\n this.logger = config.logger ?? (config.debug ? createConsoleLogger() : NOOP_LOGGER);\n this.middleware = config.middleware;\n this.onLifecycleEvent = config.onLifecycleEvent;\n this.retryConfig =\n typeof config.retries === 'number'\n ? { ...DEFAULT_RETRY_CONFIG, maxRetries: config.retries }\n : { ...DEFAULT_RETRY_CONFIG, ...config.retries };\n this.models = new ModelsClient((op, opts) => this.executeWithFailover(op, opts));\n }\n\n get modelsClient(): ModelsClient {\n return this.models;\n }\n\n /**\n * Return a generated {@link OllamaRuntime} that shares this client's\n * transport (HttpClient + middleware + retry + telemetry).\n *\n * Wave 8 (ADR 0018) bridge: lets callers mix the existing `OllamaClient`\n * API with the generated `NativeApi` / `OpenAIApi` / `AnthropicApi`\n * surface without configuring two separate HttpClient instances.\n *\n * The returned runtime is bound to the registry's first candidate\n * endpoint (or the resolved single-endpoint config if no `endpoints`\n * array was provided). For multi-endpoint configs that need per-call\n * routing, prefer constructing `OllamaRuntime` directly with a\n * specific HttpClient:\n *\n * ```ts\n * const http = new HttpClient({ baseUrl: 'http://host-a:11434' });\n * const runtime = new OllamaRuntime({ http });\n * const api = new NativeApi(runtime);\n * ```\n *\n * The runtime is cached on first call — subsequent calls return the\n * same instance.\n */\n get runtime(): OllamaRuntime {\n if (this._runtime === undefined) {\n // Pick the first candidate endpoint to bind the runtime to. The\n // generated surface doesn't currently support multi-endpoint\n // failover; callers needing that should keep using OllamaClient\n // (or construct OllamaRuntime per-call with the desired endpoint).\n const candidates = this.registry.candidates();\n const endpoint = candidates[0];\n const baseUrl = endpoint?.baseUrl ?? 'http://localhost:11434';\n const http = new HttpClient({\n baseUrl,\n ...(endpoint?.apiKey !== undefined ? { apiKey: endpoint.apiKey } : {}),\n ...(endpoint?.headers !== undefined ? { headers: endpoint.headers } : {}),\n fetch: this.fetchImpl,\n ...(this.middleware !== undefined ? { middleware: this.middleware } : {}),\n ...(this.onLifecycleEvent !== undefined ? { onLifecycleEvent: this.onLifecycleEvent } : {}),\n });\n this._runtime = new OllamaRuntime({\n http,\n localMode: inferRuntimeMode(baseUrl) === 'local',\n });\n }\n return this._runtime;\n }\n private _runtime: OllamaRuntime | undefined;\n\n /**\n * Fail-fast guard for `format` (structured output) requests: throws before any network\n * call if the candidate endpoint is inferred as Ollama Cloud, which does not currently\n * support structured outputs (see `ModelCapabilities.supportsStructuredOutputRequest`).\n * `unsupported_capability` is in `DEFAULT_FAILOVER_CODES`, so in a multi-endpoint setup\n * this causes failover to the next candidate rather than failing the whole request.\n */\n private assertStructuredOutputSupported(baseUrl: string, model: string): void {\n if (inferRuntimeMode(baseUrl) === 'cloud') {\n throw new OllamaUnsupportedCapabilityError(\n `Structured output (\"format\") requests are not supported against Ollama Cloud ` +\n `endpoints (model \"${model}\" via ${baseUrl}). This is a known Ollama Cloud ` +\n `limitation, not a bug in this SDK.`,\n { capability: 'structuredOutputRequest' },\n );\n }\n }\n\n async executeWithFailover<T>(\n operation: (http: HttpClient, signal: AbortSignal) => Promise<T>,\n options?: {\n signal?: AbortSignal | undefined;\n timeoutMs?: number | undefined;\n /**\n * Disables cross-endpoint failover: only the single best candidate endpoint is\n * tried (same-endpoint retry via `withRetry` still applies). For operations whose\n * target IS the endpoint — model catalog/blob management — a different endpoint\n * isn't an interchangeable substitute, so failing over to one would silently\n * operate on the wrong server's state rather than retrying \"the same\" request. See\n * ADR 0008. Defaults to `false`, preserving normal failover for inference calls.\n */\n singleEndpoint?: boolean | undefined;\n /**\n * The model this request targets, used to filter candidates by\n * `OllamaEndpoint.models` (credential-scoped routing — see that field's docs).\n * Requests without a `model` (e.g. `listModels`) consider every configured\n * endpoint, same as before this option existed.\n */\n model?: string | undefined;\n /**\n * For an operation whose real completion outlasts its own returned promise — a\n * streaming response, specifically — defers releasing the endpoint's concurrency\n * slot (see `EndpointRegistryOptions.maxConcurrentPerEndpoint`/`'least-connections'`)\n * until the promise this returns settles, instead of releasing as soon as\n * `operation` resolves. Pass `(stream) => stream.finalResult` for `chatStream`/\n * `generateStream` so the slot stays held for as long as the underlying HTTP\n * connection realistically does — until the stream is fully consumed, errors, or is\n * aborted. Omit for anything whose returned promise already represents the whole\n * request/response (the default, and correct for every non-streaming call).\n */\n holdUntil?: ((result: T) => Promise<unknown>) | undefined;\n },\n ): Promise<T> {\n const timeout = createTimeoutSignal(options?.timeoutMs ?? this.timeoutMs, options?.signal);\n const requestId = createLogicalRequestId();\n let deferTimeoutCancel = false;\n try {\n let lastError: Error | undefined;\n\n for (;;) {\n const allCandidates = this.registry.candidates(options?.model);\n if (\n allCandidates.length === 0 &&\n options?.model !== undefined &&\n this.registry.hasModelScopedEndpoints()\n ) {\n const configured = this.registry\n .list()\n .flatMap((ep) => ep.models ?? [])\n .filter((m, i, arr) => arr.indexOf(m) === i);\n throw new OllamaModelRoutingError(\n `No configured endpoint is authorized for model \"${options.model}\". ` +\n (configured.length > 0\n ? `Endpoints are scoped to: ${configured.join(', ')}.`\n : 'No endpoint declares a `models` allow-list that includes it.') +\n ' Add or widen an `OllamaEndpoint.models` entry to route this model.',\n { model: options.model, availableModels: configured },\n );\n }\n const candidates = options?.singleEndpoint ? allCandidates.slice(0, 1) : allCandidates;\n\n const runnable = this.registry.filterWithCapacity(candidates);\n if (runnable.length === 0 && candidates.length > 0) {\n await this.registry.waitForCapacity(\n candidates.map((c) => c.name),\n timeout.signal,\n );\n continue;\n }\n\n for (const [attemptIndex, endpoint] of runnable.entries()) {\n this.logger.debug(`Executing on endpoint \"${endpoint.name}\" (${endpoint.baseUrl})`);\n const http = new HttpClient({\n baseUrl: endpoint.baseUrl,\n ...(endpoint.apiKey !== undefined ? { apiKey: endpoint.apiKey } : {}),\n ...(endpoint.headers !== undefined ? { headers: endpoint.headers } : {}),\n fetch: this.fetchImpl,\n middleware: this.middleware,\n onLifecycleEvent: this.onLifecycleEvent,\n requestId,\n });\n\n // Acquired synchronously, right after this endpoint was chosen from\n // `candidates()`/`filterWithCapacity()` with no `await` in between — see\n // `EndpointRegistryOptions.strategy`'s `'least-connections'` doc for why that\n // ordering is what makes it race-free.\n this.registry.acquire(endpoint.name);\n let holdPromise: Promise<unknown> | undefined;\n try {\n const result = await withSpan(\n 'ollama.endpoint.attempt',\n {\n [ATTR_OLLAMA_ENDPOINT_NAME]: endpoint.name,\n [ATTR_OLLAMA_ENDPOINT_ATTEMPT]: attemptIndex,\n },\n () =>\n withRetry(\n () => operation(http, timeout.signal),\n {\n ...this.retryConfig,\n onRetry: (error, attempt, delayMs) => {\n this.retryConfig.onRetry?.(error, attempt, delayMs);\n this.onLifecycleEvent?.({\n type: 'retry',\n requestId,\n attempt: attempt + 1,\n error,\n delayMs,\n timestamp: Date.now(),\n });\n },\n },\n timeout.signal,\n ),\n );\n this.registry.reportSuccess(endpoint.name);\n if (options?.holdUntil) {\n holdPromise = options.holdUntil(result);\n deferTimeoutCancel = true;\n }\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n lastError = error;\n this.registry.reportFailure(endpoint.name);\n this.logger.warn(`Failed on \"${endpoint.name}\": ${error.message}`);\n if (!(error instanceof OllamaClientError && this.failoverCodes.has(error.code)))\n throw error;\n } finally {\n if (holdPromise) {\n void holdPromise\n .catch(() => undefined)\n .finally(() => {\n timeout.cancel();\n this.registry.release(endpoint.name);\n });\n } else {\n this.registry.release(endpoint.name);\n }\n }\n }\n throw lastError ?? new Error('No healthy Ollama endpoints available');\n }\n } finally {\n if (!deferTimeoutCancel) timeout.cancel();\n }\n }\n\n // --- Chat ---\n chat(\n req: ChatRequestOptions & { stream: true },\n ): Promise<OllamaStream<ChatResponse, ChatStreamResult>>;\n chat(req: ChatRequestOptions & { stream?: false | undefined }): Promise<ChatResponse>;\n chat(\n req: ChatRequestOptions,\n ): Promise<ChatResponse | OllamaStream<ChatResponse, ChatStreamResult>>;\n async chat(\n req: ChatRequestOptions,\n ): Promise<ChatResponse | OllamaStream<ChatResponse, ChatStreamResult>> {\n const encodedMessages = await withEncodedMessageImages(req.messages);\n const messages = encodedMessages.map((message) => {\n if (message.role === 'tool' && message.tool_call_id !== undefined) {\n const { tool_call_id: _toolCallId, ...nativeMessage } = message;\n return nativeMessage;\n }\n return message;\n });\n if (req.stream) {\n return this.executeWithFailover(\n async (http, signal) => {\n if (req.format !== undefined)\n this.assertStructuredOutputSupported(http.baseUrl, req.model);\n const stream = await http.requestStream<ChatResponse>({\n path: '/api/chat',\n body: { ...req, messages, stream: true },\n signal,\n });\n return normalizeChatStream(stream, signal);\n },\n {\n signal: req.signal,\n timeoutMs: req.timeoutMs,\n model: req.model,\n // The endpoint's concurrency slot must stay held for as long as the stream is\n // actually being consumed, not just until the initial response/headers arrive\n // — see `executeWithFailover`'s `holdUntil` doc.\n holdUntil: (stream) => stream.finalResult,\n },\n );\n }\n return withSpan(\n `chat ${req.model}`,\n {\n [ATTR_GEN_AI_SYSTEM]: GEN_AI_SYSTEM_OLLAMA,\n [ATTR_GEN_AI_OPERATION_NAME]: 'chat',\n [ATTR_GEN_AI_REQUEST_MODEL]: req.model,\n },\n async (span) => {\n const rawRes = await this.executeWithFailover((http, signal) => {\n if (req.format !== undefined)\n this.assertStructuredOutputSupported(http.baseUrl, req.model);\n return http.request<ChatResponse>({\n path: '/api/chat',\n body: { ...req, messages, stream: false },\n signal,\n });\n }, req);\n const toolCalls = ensureToolCallIds(rawRes.message.tool_calls);\n const res: ChatResponse =\n toolCalls === rawRes.message.tool_calls\n ? rawRes\n : { ...rawRes, message: { ...rawRes.message, tool_calls: toolCalls } };\n span?.setAttributes({\n [ATTR_GEN_AI_RESPONSE_MODEL]: res.model,\n ...(res.prompt_eval_count !== undefined\n ? { [ATTR_GEN_AI_USAGE_INPUT_TOKENS]: res.prompt_eval_count }\n : {}),\n ...(res.eval_count !== undefined\n ? { [ATTR_GEN_AI_USAGE_OUTPUT_TOKENS]: res.eval_count }\n : {}),\n });\n return res;\n },\n );\n }\n\n chatStream(\n req: Omit<ChatRequestOptions, 'stream'>,\n ): Promise<OllamaStream<ChatResponse, ChatStreamResult>> {\n return this.chat({ ...req, stream: true });\n }\n\n async chatText(req: Omit<ChatRequestOptions, 'stream'>): Promise<string> {\n const res = await this.chat({ ...req, stream: false });\n return res.message.content;\n }\n\n async chatWithSchema<T>(\n req: Omit<ChatRequestOptions, 'stream' | 'format'>,\n schema: z.ZodType<T>,\n ): Promise<T> {\n const res = await this.chat({ ...req, format: zodToJsonSchema(schema), stream: false });\n return parseStructuredOutput(res.message.content, schema);\n }\n\n // --- Generate ---\n generate(\n req: GenerateRequestOptions & { stream: true },\n ): Promise<OllamaStream<GenerateResponse, GenerateStreamResult>>;\n generate(req: GenerateRequestOptions & { stream?: false | undefined }): Promise<GenerateResponse>;\n generate(\n req: GenerateRequestOptions,\n ): Promise<GenerateResponse | OllamaStream<GenerateResponse, GenerateStreamResult>>;\n async generate(\n req: GenerateRequestOptions,\n ): Promise<GenerateResponse | OllamaStream<GenerateResponse, GenerateStreamResult>> {\n const encodedReq = await withEncodedImages(req);\n if (encodedReq.stream) {\n return this.executeWithFailover(\n async (http, signal) => {\n if (encodedReq.format !== undefined)\n this.assertStructuredOutputSupported(http.baseUrl, encodedReq.model);\n const stream = await http.requestStream<GenerateResponse>({\n path: '/api/generate',\n body: { ...encodedReq, stream: true },\n signal,\n });\n return normalizeGenerateStream(stream, signal);\n },\n {\n signal: encodedReq.signal,\n timeoutMs: encodedReq.timeoutMs,\n model: encodedReq.model,\n holdUntil: (stream) => stream.finalResult,\n },\n );\n }\n return withSpan(\n `text_completion ${encodedReq.model}`,\n {\n [ATTR_GEN_AI_SYSTEM]: GEN_AI_SYSTEM_OLLAMA,\n [ATTR_GEN_AI_OPERATION_NAME]: 'text_completion',\n [ATTR_GEN_AI_REQUEST_MODEL]: encodedReq.model,\n },\n async (span) => {\n const res = await this.executeWithFailover((http, signal) => {\n if (encodedReq.format !== undefined)\n this.assertStructuredOutputSupported(http.baseUrl, encodedReq.model);\n return http.request<GenerateResponse>({\n path: '/api/generate',\n body: { ...encodedReq, stream: false },\n signal,\n });\n }, encodedReq);\n span?.setAttributes({\n [ATTR_GEN_AI_RESPONSE_MODEL]: res.model,\n ...(res.prompt_eval_count !== undefined\n ? { [ATTR_GEN_AI_USAGE_INPUT_TOKENS]: res.prompt_eval_count }\n : {}),\n ...(res.eval_count !== undefined\n ? { [ATTR_GEN_AI_USAGE_OUTPUT_TOKENS]: res.eval_count }\n : {}),\n });\n return res;\n },\n );\n }\n\n generateStream(\n req: Omit<GenerateRequestOptions, 'stream'>,\n ): Promise<OllamaStream<GenerateResponse, GenerateStreamResult>> {\n return this.generate({ ...req, stream: true });\n }\n\n async generateText(req: Omit<GenerateRequestOptions, 'stream'>): Promise<string> {\n const res = await this.generate({ ...req, stream: false });\n return res.response;\n }\n\n async generateWithSchema<T>(\n req: Omit<GenerateRequestOptions, 'stream' | 'format'>,\n schema: z.ZodType<T>,\n ): Promise<T> {\n const res = await this.generate({ ...req, format: zodToJsonSchema(schema), stream: false });\n return parseStructuredOutput(res.response, schema);\n }\n\n // --- Embeddings ---\n embed(req: EmbedRequestOptions): Promise<EmbedResponse> {\n return this.executeWithFailover(\n (http, signal) => http.request<EmbedResponse>({ path: '/api/embed', body: req, signal }),\n req,\n );\n }\n\n async embedText(\n model: string,\n input: string | readonly string[],\n ): Promise<readonly (readonly number[])[]> {\n const res = await this.embed({ model, input });\n return res.embeddings;\n }\n\n /**\n * @deprecated Ollama's `/api/embeddings` endpoint has been superseded by `/api/embed`\n * (exposed here as {@link OllamaClient.embed}), which additionally supports batch\n * input. Kept for compatibility with existing callers; new code should use `embed`.\n */\n embeddings(req: EmbeddingsRequestOptions): Promise<EmbeddingsResponse> {\n return this.executeWithFailover(\n (http, signal) =>\n http.request<EmbeddingsResponse>({ path: '/api/embeddings', body: req, signal }),\n req,\n );\n }\n\n // --- Model Operations (Delegated to ModelsClient) ---\n readonly listModels = () => this.models.list();\n readonly showModel = (req: ShowRequestOptions) => this.models.show(req);\n readonly pullModel = (r: PullRequestOptions) => this.models.pull(r);\n readonly pushModel = (r: PushRequestOptions) => this.models.push(r);\n readonly createModel = (r: CreateRequestOptions) => this.models.create(r);\n readonly deleteModel = (req: DeleteRequestOptions) => this.models.delete(req);\n readonly copyModel = (req: CopyRequestOptions) => this.models.copy(req);\n readonly ps = () => this.models.ps();\n readonly version = () => this.models.version();\n readonly createBlob = (digest: string, data: BinaryBody) => this.models.createBlob(digest, data);\n readonly checkBlob = (digest: string) => this.models.checkBlob(digest);\n\n // --- Web Endpoints ---\n /**\n * Ollama's hosted web search tool (`POST https://ollama.com/api/web_search`) — a fixed\n * Ollama Cloud service, unrelated to `config.endpoints`/`baseUrl` and not proxied\n * through a local server. Requires an Ollama account API key: pass `apiKey` to the\n * client constructor or set `OLLAMA_API_KEY`. Applies the same default `timeoutMs` and\n * retry policy as inference calls, but never cross-endpoint-fails-over — there is only\n * ever the one cloud endpoint to call.\n */\n async webSearch(req: WebSearchRequestOptions): Promise<WebSearchResponse> {\n const { count, max_results, ...rest } = req;\n const res = await this.executeCloudRequest(\n (http, signal) =>\n http.request<WebSearchResponse>({\n path: '/api/web_search',\n body: { ...rest, max_results: max_results ?? count },\n signal,\n }),\n req,\n );\n // `snippet` is a deprecated mirror of `content`, kept for backward compatibility —\n // see the `@deprecated` note on `WebSearchResult.snippet`.\n return { results: res.results.map((r) => ({ ...r, snippet: r.content })) };\n }\n /**\n * Ollama's hosted web fetch tool (`POST https://ollama.com/api/web_fetch`) — see\n * {@link OllamaClient.webSearch} for the cloud-endpoint/auth/timeout/retry behavior,\n * which applies identically here.\n */\n webFetch(req: WebFetchRequestOptions): Promise<WebFetchResponse> {\n return this.executeCloudRequest(\n (http, signal) =>\n http.request<WebFetchResponse>({ path: '/api/web_fetch', body: req, signal }),\n req,\n );\n }\n /**\n * Runs `operation` against the fixed Ollama Cloud host with this client's default\n * timeout and retry policy — the same primitives `executeWithFailover` uses, minus the\n * multi-candidate loop, since `webSearch`/`webFetch` only ever have the one endpoint.\n */\n private async executeCloudRequest<T>(\n operation: (http: HttpClient, signal: AbortSignal) => Promise<T>,\n options: RequestCancellationOptions,\n ): Promise<T> {\n const timeout = createTimeoutSignal(options.timeoutMs ?? this.timeoutMs, options.signal);\n const requestId = createLogicalRequestId();\n try {\n const http = new HttpClient({\n baseUrl: OLLAMA_CLOUD_BASE_URL,\n apiKey: this.cloudApiKey,\n fetch: this.fetchImpl,\n middleware: this.middleware,\n onLifecycleEvent: this.onLifecycleEvent,\n requestId,\n });\n return await withRetry(\n () => operation(http, timeout.signal),\n {\n ...this.retryConfig,\n onRetry: (error, attempt, delayMs) => {\n this.retryConfig.onRetry?.(error, attempt, delayMs);\n this.onLifecycleEvent?.({\n type: 'retry',\n requestId,\n attempt: attempt + 1,\n error,\n delayMs,\n timestamp: Date.now(),\n });\n },\n },\n timeout.signal,\n );\n } finally {\n timeout.cancel();\n }\n }\n\n // --- Capabilities & Health ---\n capabilities(model: string, signal?: AbortSignal): Promise<ModelCapabilities> {\n return this.executeWithFailover(\n (http, runnerSignal) => detectModelCapabilities(http, model, runnerSignal),\n {\n singleEndpoint: true,\n model,\n ...(signal !== undefined ? { signal } : {}),\n },\n );\n }\n runtimeMode(): RuntimeMode {\n const ep = this.registry.candidates()[0];\n return inferRuntimeMode(ep?.baseUrl ?? DEFAULT_BASE_URL);\n }\n healthCheck(): Promise<EndpointHealthCheckResult[]> {\n return Promise.all(\n this.registry\n .list()\n .map((ep) =>\n checkEndpointHealth(ep, this.fetchImpl, 5000, this.middleware, this.onLifecycleEvent),\n ),\n );\n }\n endpointStatus(): EndpointHealth[] {\n return this.registry.status();\n }\n\n // --- Compatibility Adapters ---\n get openai(): OpenAICompatClient {\n const ep = this.registry.candidates()[0];\n return new OpenAICompatClient(\n new HttpClient({\n baseUrl: ep?.baseUrl ?? DEFAULT_BASE_URL,\n apiKey: ep?.apiKey,\n headers: ep?.headers,\n fetch: this.fetchImpl,\n middleware: this.middleware,\n onLifecycleEvent: this.onLifecycleEvent,\n }),\n (op, opts) => this.executeWithFailover(op, opts),\n );\n }\n get anthropic(): AnthropicCompatClient {\n const ep = this.registry.candidates()[0];\n return new AnthropicCompatClient(\n new HttpClient({\n baseUrl: ep?.baseUrl ?? DEFAULT_BASE_URL,\n apiKey: ep?.apiKey,\n headers: ep?.headers,\n fetch: this.fetchImpl,\n middleware: this.middleware,\n onLifecycleEvent: this.onLifecycleEvent,\n }),\n (op, opts) => this.executeWithFailover(op, opts),\n );\n }\n}\n","/**\n * Web Standard Stream adapters for OllamaStream.\n * Enables seamless integration with Vercel AI SDK, Next.js route handlers, and standard web fetch responses.\n */\n\nimport type { OllamaStream } from './stream.js';\n\n/**\n * Transforms an OllamaStream into a standard Web ReadableStream of token text strings.\n */\nexport function toTextStream<TChunk, TFinal>(\n stream: OllamaStream<TChunk, TFinal>,\n): ReadableStream<string> {\n const iterator = stream[Symbol.asyncIterator]();\n\n return new ReadableStream<string>({\n async pull(controller) {\n try {\n while (true) {\n const { done, value } = await iterator.next();\n if (done) {\n controller.close();\n return;\n }\n if (value.type === 'token' && value.data.delta) {\n controller.enqueue(value.data.delta);\n return;\n }\n }\n } catch (err) {\n controller.error(err);\n }\n },\n cancel() {\n stream.abort();\n },\n });\n}\n\n/**\n * Transforms an OllamaStream into a standard Web ReadableStream of encoded Uint8Array bytes.\n */\nexport function toDataStream<TChunk, TFinal>(\n stream: OllamaStream<TChunk, TFinal>,\n): ReadableStream<Uint8Array> {\n const textStream = toTextStream(stream);\n const reader = textStream.getReader();\n const encoder = new TextEncoder();\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n return;\n }\n controller.enqueue(encoder.encode(value));\n } catch (err) {\n controller.error(err);\n }\n },\n cancel() {\n reader.cancel();\n stream.abort();\n },\n });\n}\n\n/**\n * Converts an OllamaStream directly into a standard Web Response with text/plain streaming headers.\n */\nexport function toResponse<TChunk, TFinal>(\n stream: OllamaStream<TChunk, TFinal>,\n init: ResponseInit = {},\n): Response {\n const body = toDataStream(stream);\n const headers = new Headers(init.headers);\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'text/plain; charset=utf-8');\n }\n return new Response(body, { ...init, headers });\n}\n","/**\n * Client-side usage budgeting.\n *\n * Ollama Cloud does not expose account-level quota or remaining-budget through the API —\n * chat/generate responses carry only per-request token counts, and there is no header or\n * endpoint that reports how much of your plan's session or weekly limit is left (the only\n * way to see that today is the https://ollama.com dashboard or the 90%-usage email). See\n * https://github.com/ollama/ollama/issues/15663.\n *\n * `QuotaManager` does not — and cannot — read Ollama's real limits. It tracks usage you\n * record against budgets *you* configure over one or more rolling windows, and refuses to\n * proceed once a window's budget is spent. Pair it with `OllamaRateLimitError` (thrown by\n * `OllamaClient` on the server's actual 429) as the authoritative signal; treat\n * `QuotaManager` as a local safety net that fails fast before the request is even sent.\n */\n\nimport { OllamaQuotaExceededError } from './errors.js';\nimport { extractUsage, type RawUsageSource, type TokenUsage } from './usage.js';\n\nexport interface QuotaWindowConfig {\n /** Identifies this window in status reports and thrown errors (e.g. \"session\", \"weekly\"). */\n readonly id: string;\n /** Length of the rolling window in milliseconds, after which usage resets to zero. */\n readonly windowMs: number;\n /** Token budget for the window. Omit to only track requests. */\n readonly maxTokens?: number;\n /** Request-count budget for the window. Omit to only track tokens. */\n readonly maxRequests?: number;\n}\n\nexport interface QuotaWindowStatus extends QuotaWindowConfig {\n readonly tokensUsed: number;\n readonly requestsMade: number;\n readonly windowStartedAt: number;\n readonly windowResetAt: number;\n readonly remainingTokens?: number;\n readonly remainingRequests?: number;\n}\n\nexport interface QuotaManagerOptions {\n readonly windows: readonly QuotaWindowConfig[];\n /** Clock override for testing. Defaults to `Date.now`. */\n readonly now?: () => number;\n}\n\ninterface WindowState {\n readonly config: QuotaWindowConfig;\n tokensUsed: number;\n requestsMade: number;\n windowStartedAt: number;\n}\n\nexport class QuotaManager {\n private readonly now: () => number;\n private readonly windows: readonly WindowState[];\n\n constructor(options: QuotaManagerOptions) {\n if (options.windows.length === 0) {\n throw new Error('QuotaManager requires at least one window configuration.');\n }\n this.now = options.now ?? Date.now;\n this.windows = options.windows.map((config) => ({\n config,\n tokensUsed: 0,\n requestsMade: 0,\n windowStartedAt: this.now(),\n }));\n }\n\n private rollover(state: WindowState): void {\n if (this.now() - state.windowStartedAt >= state.config.windowMs) {\n state.tokensUsed = 0;\n state.requestsMade = 0;\n state.windowStartedAt = this.now();\n }\n }\n\n /** Current usage, budgets, and reset time for every configured window. */\n status(): readonly QuotaWindowStatus[] {\n return this.windows.map((state) => {\n this.rollover(state);\n const { config } = state;\n return {\n ...config,\n tokensUsed: state.tokensUsed,\n requestsMade: state.requestsMade,\n windowStartedAt: state.windowStartedAt,\n windowResetAt: state.windowStartedAt + config.windowMs,\n ...(config.maxTokens !== undefined\n ? { remainingTokens: Math.max(0, config.maxTokens - state.tokensUsed) }\n : {}),\n ...(config.maxRequests !== undefined\n ? { remainingRequests: Math.max(0, config.maxRequests - state.requestsMade) }\n : {}),\n };\n });\n }\n\n /**\n * True if one more request — optionally estimated at `estimatedTokens` — would stay\n * within every configured window's budget. Read-only; does not record usage.\n */\n canProceed(estimatedTokens = 0): boolean {\n return this.windows.every((state) => {\n this.rollover(state);\n const { config } = state;\n if (config.maxRequests !== undefined && state.requestsMade + 1 > config.maxRequests) {\n return false;\n }\n return !(\n config.maxTokens !== undefined && state.tokensUsed + estimatedTokens > config.maxTokens\n );\n });\n }\n\n /**\n * Throws `OllamaQuotaExceededError` for the first window that `canProceed(estimatedTokens)`\n * would fail on; otherwise a no-op. Call before issuing a request.\n */\n assertCanProceed(estimatedTokens = 0): void {\n for (const state of this.windows) {\n this.rollover(state);\n const { config } = state;\n if (config.maxRequests !== undefined && state.requestsMade + 1 > config.maxRequests) {\n throw new OllamaQuotaExceededError(\n `Client-side quota window \"${config.id}\" would exceed its request budget ` +\n `(${state.requestsMade}/${config.maxRequests} requests used).`,\n { windowId: config.id, resetAt: state.windowStartedAt + config.windowMs },\n );\n }\n if (config.maxTokens !== undefined && state.tokensUsed + estimatedTokens > config.maxTokens) {\n throw new OllamaQuotaExceededError(\n `Client-side quota window \"${config.id}\" would exceed its token budget ` +\n `(${state.tokensUsed}/${config.maxTokens} tokens used).`,\n { windowId: config.id, resetAt: state.windowStartedAt + config.windowMs },\n );\n }\n }\n }\n\n /** Records one request's actual usage — a raw API response or a pre-normalized `TokenUsage` — against every window. */\n recordUsage(usage: RawUsageSource | TokenUsage): void {\n const normalized: TokenUsage = 'totalTokens' in usage ? usage : extractUsage(usage);\n for (const state of this.windows) {\n this.rollover(state);\n state.tokensUsed += normalized.totalTokens;\n state.requestsMade += 1;\n }\n }\n\n /** Resets one window (by `id`) or, if omitted, all windows — zeroing usage and restarting their clocks. */\n reset(windowId?: string): void {\n for (const state of this.windows) {\n if (windowId === undefined || state.config.id === windowId) {\n state.tokensUsed = 0;\n state.requestsMade = 0;\n state.windowStartedAt = this.now();\n }\n }\n }\n}\n\nexport interface OllamaCloudFreeTierQuotaBudgets {\n /** Budget for the free tier's ~5-hour session window. Omit to skip tracking it. */\n readonly session?: { readonly maxTokens?: number; readonly maxRequests?: number };\n /** Budget for the free tier's 7-day weekly window. Omit to skip tracking it. */\n readonly weekly?: { readonly maxTokens?: number; readonly maxRequests?: number };\n readonly now?: () => number;\n}\n\n/**\n * Convenience factory mirroring Ollama Cloud free-tier's documented reset cadence — a\n * session window that resets every 5 hours and a weekly window that resets every 7 days\n * (see https://ollama.com/pricing). Ollama does not publish the actual token/request\n * ceilings for either window, so you must supply the budgets yourself (e.g. from your own\n * observed usage) — this only wires up the window durations.\n */\nexport function createOllamaCloudFreeTierQuota(\n budgets: OllamaCloudFreeTierQuotaBudgets,\n): QuotaManager {\n const windows: QuotaWindowConfig[] = [];\n if (budgets.session !== undefined) {\n windows.push({ id: 'session', windowMs: 5 * 60 * 60 * 1000, ...budgets.session });\n }\n if (budgets.weekly !== undefined) {\n windows.push({ id: 'weekly', windowMs: 7 * 24 * 60 * 60 * 1000, ...budgets.weekly });\n }\n if (windows.length === 0) {\n throw new Error(\n 'createOllamaCloudFreeTierQuota requires at least a `session` or `weekly` budget.',\n );\n }\n return new QuotaManager({ windows, ...(budgets.now !== undefined ? { now: budgets.now } : {}) });\n}\n","/**\n * Type-safe tool definition helper.\n */\n\nimport type { z } from 'zod';\nimport { zodToJsonSchema } from '../schema/zod.js';\nimport type { Tool, ToolHandler } from './types.js';\nimport type { ToolProperty } from '../types.js';\n\nexport interface DefineToolOptions<TParams, TResult> {\n readonly name: string;\n readonly description: string;\n readonly schema: z.ZodType<TParams>;\n readonly execute: ToolHandler<TParams, TResult>;\n /**\n * Per-tool execution timeout in milliseconds, overriding the registry's default.\n * Pass `0` to explicitly disable timeout enforcement for this tool.\n */\n readonly timeoutMs?: number | undefined;\n}\n\n/**\n * Creates a strongly-typed Tool definition with automatic JSON Schema conversion.\n */\nexport function defineTool<TParams, TResult>(\n options: DefineToolOptions<TParams, TResult>,\n): Tool<TParams, TResult> {\n const jsonSchema = zodToJsonSchema(options.schema);\n const properties = (jsonSchema['properties'] ?? {}) as Record<string, ToolProperty>;\n const required = (jsonSchema['required'] ?? []) as string[];\n\n return {\n name: options.name,\n description: options.description,\n schema: options.schema,\n execute: options.execute,\n timeoutMs: options.timeoutMs,\n definition: {\n type: 'function',\n function: {\n name: options.name,\n description: options.description,\n parameters: {\n type: 'object',\n properties,\n ...(required.length > 0 ? { required } : {}),\n },\n },\n },\n };\n}\n","/**\n * Tool registry for managing definitions and executing model tool calls.\n */\n\nimport {\n OllamaNotFoundError,\n OllamaToolTimeoutError,\n OllamaToolValidationError,\n} from '../errors.js';\nimport {\n withSpan,\n setSpanError,\n ATTR_GEN_AI_TOOL_NAME,\n ATTR_GEN_AI_TOOL_CALL_ID,\n} from '../telemetry/index.js';\nimport type { ToolCall, ToolDefinition } from '../types.js';\nimport type { AnyTool, Tool, ToolExecutionContext, ToolExecutionResult } from './types.js';\n\nexport interface ToolRegistryOptions {\n readonly tools?: readonly AnyTool[] | undefined;\n readonly onError?: ((error: Error, toolCall: ToolCall) => string) | undefined;\n /**\n * Default per-call execution timeout in milliseconds, applied to any tool that\n * doesn't declare its own `timeoutMs`. Undefined (the default) means no timeout is\n * enforced, matching prior behavior. Recommended whenever tool arguments or\n * implementations are influenced by model output you don't fully control, since an\n * unbounded tool call can otherwise stall the entire agent loop indefinitely.\n *\n * Enforcement is cooperative: it races the tool's promise against a timer and\n * reports a timeout failure, but cannot forcibly halt synchronous or non-abort-aware\n * asynchronous work already in flight on the same thread. Tools that perform I/O\n * should honor `ToolExecutionContext.signal` to stop promptly on timeout.\n */\n readonly timeoutMs?: number | undefined;\n /**\n * Maximum number of tool calls executed concurrently by `executeToolCalls`.\n * Undefined (the default) runs all calls in parallel, matching prior behavior.\n */\n readonly maxConcurrency?: number | undefined;\n /**\n * Maximum length of a tool's `outputString` before it is truncated. Guards against a\n * single tool call flooding the conversation history / model context (and process\n * memory) with unbounded output. Undefined (the default) applies no limit.\n */\n readonly maxOutputChars?: number | undefined;\n}\n\nexport class ToolRegistry {\n private readonly tools = new Map<string, AnyTool>();\n private readonly onError?: ((error: Error, toolCall: ToolCall) => string) | undefined;\n private readonly defaultTimeoutMs?: number | undefined;\n private readonly maxConcurrency?: number | undefined;\n private readonly maxOutputChars?: number | undefined;\n\n constructor(toolsOrOptions?: readonly AnyTool[] | ToolRegistryOptions | undefined) {\n if (Array.isArray(toolsOrOptions)) {\n this.registerMany(toolsOrOptions);\n } else if (toolsOrOptions !== undefined) {\n const opts = toolsOrOptions as ToolRegistryOptions;\n this.onError = opts.onError;\n this.defaultTimeoutMs = opts.timeoutMs;\n this.maxConcurrency = opts.maxConcurrency;\n this.maxOutputChars = opts.maxOutputChars;\n if (opts.tools) {\n this.registerMany(opts.tools);\n }\n }\n }\n\n register(tool: AnyTool): this {\n this.tools.set(tool.name, tool);\n return this;\n }\n\n registerMany(tools: readonly AnyTool[]): this {\n for (const tool of tools) {\n this.register(tool);\n }\n return this;\n }\n\n get(name: string): AnyTool | undefined {\n return this.tools.get(name);\n }\n\n definitions(): ToolDefinition[] {\n return Array.from(this.tools.values()).map((t) => t.definition);\n }\n\n async executeToolCall(\n toolCall: ToolCall,\n ctx: ToolExecutionContext = {},\n ): Promise<ToolExecutionResult> {\n const { name } = toolCall.function;\n return withSpan(\n `execute_tool ${name}`,\n { [ATTR_GEN_AI_TOOL_NAME]: name, [ATTR_GEN_AI_TOOL_CALL_ID]: toolCall.id },\n async (span) => {\n const result = await this.executeToolCallUninstrumented(toolCall, ctx);\n if (!result.success) {\n await setSpanError(span, result.error);\n }\n return result;\n },\n );\n }\n\n private async executeToolCallUninstrumented(\n toolCall: ToolCall,\n ctx: ToolExecutionContext,\n ): Promise<ToolExecutionResult> {\n const { name, arguments: args } = toolCall.function;\n const tool = this.tools.get(name);\n\n if (!tool) {\n const err = new OllamaNotFoundError(`Tool \"${name}\" is not registered in this registry`);\n return this.handleExecutionError(err, toolCall);\n }\n\n const parseResult = tool.schema.safeParse(args);\n if (!parseResult.success) {\n const err = new OllamaToolValidationError(`Tool \"${name}\" arguments validation failed`, {\n toolName: name,\n issues: parseResult.error.issues,\n cause: parseResult.error,\n });\n return this.handleExecutionError(err, toolCall);\n }\n\n try {\n const result = await this.runWithTimeout(tool, parseResult.data, ctx, name);\n const outputString = this.truncateOutput(\n typeof result === 'string' ? result : JSON.stringify(result),\n );\n return {\n toolName: name,\n toolCallId: toolCall.id,\n success: true,\n result,\n outputString,\n };\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n return this.handleExecutionError(error, toolCall);\n }\n }\n\n /**\n * Executes every call in `toolCalls` and returns results in the same order, so results\n * are always correlatable by array position regardless of `id`. Each result also echoes\n * its call's `toolCallId` for callers who'd rather match by ID — see the {@link ToolCall}\n * docs for how that id is produced. Runs fully in parallel (`Promise.all`) unless\n * `maxConcurrency` was configured, in which case a bounded worker pool is used instead.\n */\n async executeToolCalls(\n toolCalls: readonly ToolCall[],\n ctx: ToolExecutionContext = {},\n ): Promise<ToolExecutionResult[]> {\n const limit = this.maxConcurrency;\n if (!limit || limit >= toolCalls.length) {\n return Promise.all(toolCalls.map((tc) => this.executeToolCall(tc, ctx)));\n }\n\n const results = new Array<ToolExecutionResult>(toolCalls.length);\n let nextIndex = 0;\n const worker = async (): Promise<void> => {\n for (let i = nextIndex++; i < toolCalls.length; i = nextIndex++) {\n results[i] = await this.executeToolCall(toolCalls[i] as ToolCall, ctx);\n }\n };\n await Promise.all(Array.from({ length: limit }, () => worker()));\n return results;\n }\n\n private async runWithTimeout<TParams>(\n tool: Tool<TParams, unknown>,\n params: TParams,\n ctx: ToolExecutionContext,\n toolName: string,\n ): Promise<unknown> {\n const timeoutMs = tool.timeoutMs ?? this.defaultTimeoutMs;\n if (!timeoutMs || timeoutMs <= 0) {\n return tool.execute(params, ctx);\n }\n\n const controller = new AbortController();\n const onParentAbort = (): void => controller.abort(ctx.signal?.reason);\n if (ctx.signal) {\n if (ctx.signal.aborted) {\n controller.abort(ctx.signal.reason);\n } else {\n ctx.signal.addEventListener('abort', onParentAbort, { once: true });\n }\n }\n\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, timeoutMs);\n\n try {\n const executePromise = Promise.resolve(\n tool.execute(params, { ...ctx, signal: controller.signal }),\n );\n // Prevent an unhandled rejection if the tool's promise loses the race and later\n // rejects; the tool remains responsible for actually stopping its own work via\n // `signal` since JS cannot forcibly cancel work already in flight.\n executePromise.catch(() => undefined);\n\n const abortRejection = (): Error =>\n timedOut\n ? new OllamaToolTimeoutError(`Tool \"${toolName}\" timed out after ${timeoutMs}ms`, {\n toolName,\n timeoutMs,\n })\n : ((ctx.signal?.reason as Error | undefined) ?? new Error('Tool execution aborted'));\n\n return await Promise.race([\n executePromise,\n controller.signal.aborted\n ? Promise.reject(abortRejection())\n : new Promise<never>((_resolve, reject) => {\n controller.signal.addEventListener('abort', () => reject(abortRejection()), {\n once: true,\n });\n }),\n ]);\n } finally {\n clearTimeout(timer);\n if (ctx.signal) {\n ctx.signal.removeEventListener('abort', onParentAbort);\n }\n }\n }\n\n private truncateOutput(output: string): string {\n const limit = this.maxOutputChars;\n if (!limit || output.length <= limit) {\n return output;\n }\n return `${output.slice(0, limit)}\\n… [truncated ${output.length - limit} of ${output.length} chars]`;\n }\n\n private handleExecutionError(error: Error, toolCall: ToolCall): ToolExecutionResult {\n const fallbackMessage = this.onError ? this.onError(error, toolCall) : error.message;\n return {\n toolName: toolCall.function.name,\n toolCallId: toolCall.id,\n success: false,\n error,\n outputString: this.truncateOutput(fallbackMessage),\n };\n }\n}\n","/** Dependency-free JSON Schema validator for MCP tool argument boundaries. */\n\nexport interface JsonSchemaValidationIssue {\n readonly path: readonly (string | number)[];\n readonly message: string;\n}\n\nfunction label(path: readonly (string | number)[]): string {\n return path.length === 0 ? 'value' : 'value' + path.map((part) => typeof part === 'number' ? '[' + part + ']' : '.' + part).join('');\n}\n\nfunction equalJson(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== typeof b || a === null || b === null) return false;\n if (Array.isArray(a) || Array.isArray(b)) {\n return Array.isArray(a) && Array.isArray(b) && a.length === b.length && a.every((item, i) => equalJson(item, b[i]));\n }\n if (typeof a === 'object' && typeof b === 'object') {\n const ar = a as Record<string, unknown>;\n const br = b as Record<string, unknown>;\n const ak = Object.keys(ar).sort();\n const bk = Object.keys(br).sort();\n return ak.length === bk.length && ak.every((key, i) => key === bk[i] && equalJson(ar[key], br[key]));\n }\n return false;\n}\n\nfunction matchesType(value: unknown, type: string): boolean {\n switch (type) {\n case 'null': return value === null;\n case 'boolean': return typeof value === 'boolean';\n case 'object': return typeof value === 'object' && value !== null && !Array.isArray(value);\n case 'array': return Array.isArray(value);\n case 'string': return typeof value === 'string';\n case 'number': return typeof value === 'number' && Number.isFinite(value);\n case 'integer': return typeof value === 'number' && Number.isInteger(value);\n default: return true;\n }\n}\n\nfunction validate(value: unknown, schema: unknown, path: readonly (string | number)[]): JsonSchemaValidationIssue[] {\n if (schema === true || schema === undefined) return [];\n if (schema === false) return [{ path, message: label(path) + ' is not allowed by the schema' }];\n if (typeof schema !== 'object' || schema === null || Array.isArray(schema)) return [];\n const s = schema as Record<string, unknown>;\n const issues: JsonSchemaValidationIssue[] = [];\n\n if (s['nullable'] === true && value === null) return issues;\n\n const type = s['type'];\n if (typeof type === 'string' && !matchesType(value, type)) {\n return [{ path, message: label(path) + ' must be ' + type }];\n }\n if (Array.isArray(type) && !type.some((t) => typeof t === 'string' && matchesType(value, t))) {\n return [{ path, message: label(path) + ' must match one of: ' + type.join(', ') }];\n }\n\n if ('const' in s && !equalJson(value, s['const'])) issues.push({ path, message: label(path) + ' must equal the schema const value' });\n const enumValues = s['enum'];\n if (Array.isArray(enumValues) && !enumValues.some((item) => equalJson(value, item))) issues.push({ path, message: label(path) + ' must be one of the allowed enum values' });\n\n const anyOf = s['anyOf'];\n if (Array.isArray(anyOf) && !anyOf.some((candidate) => validate(value, candidate, path).length === 0)) issues.push({ path, message: label(path) + ' must satisfy at least one anyOf schema' });\n const oneOf = s['oneOf'];\n if (Array.isArray(oneOf)) {\n const matches = oneOf.filter((candidate) => validate(value, candidate, path).length === 0).length;\n if (matches !== 1) issues.push({ path, message: label(path) + ' must satisfy exactly one oneOf schema' });\n }\n const allOf = s['allOf'];\n if (Array.isArray(allOf)) for (const candidate of allOf) issues.push(...validate(value, candidate, path));\n if ('not' in s && validate(value, s['not'], path).length === 0) issues.push({ path, message: label(path) + ' must not satisfy the not schema' });\n\n if (typeof value === 'string') {\n const min = s['minLength'];\n const max = s['maxLength'];\n if (typeof min === 'number' && value.length < min) issues.push({ path, message: label(path) + ' must have at least ' + min + ' characters' });\n if (typeof max === 'number' && value.length > max) issues.push({ path, message: label(path) + ' must have at most ' + max + ' characters' });\n if (typeof s['pattern'] === 'string') {\n try { if (!new RegExp(s['pattern']).test(value)) issues.push({ path, message: label(path) + ' does not match the required pattern' }); }\n catch { /* malformed provider regex; do not reject otherwise valid arguments */ }\n }\n }\n\n if (typeof value === 'number' && Number.isFinite(value)) {\n const numericRules: readonly [string, (n: number, bound: number) => boolean, string][] = [\n ['minimum', (n, b) => n >= b, 'must be greater than or equal to'],\n ['maximum', (n, b) => n <= b, 'must be less than or equal to'],\n ['exclusiveMinimum', (n, b) => n > b, 'must be greater than'],\n ['exclusiveMaximum', (n, b) => n < b, 'must be less than'],\n ];\n for (const [keyword, check, phrase] of numericRules) {\n const bound = s[keyword];\n if (typeof bound === 'number' && !check(value, bound)) issues.push({ path, message: label(path) + ' ' + phrase + ' ' + bound });\n }\n const multipleOf = s['multipleOf'];\n if (typeof multipleOf === 'number' && multipleOf > 0) {\n const quotient = value / multipleOf;\n if (Math.abs(quotient - Math.round(quotient)) > 1e-12) issues.push({ path, message: label(path) + ' must be a multiple of ' + multipleOf });\n }\n }\n\n if (Array.isArray(value)) {\n const min = s['minItems'];\n const max = s['maxItems'];\n if (typeof min === 'number' && value.length < min) issues.push({ path, message: label(path) + ' must contain at least ' + min + ' items' });\n if (typeof max === 'number' && value.length > max) issues.push({ path, message: label(path) + ' must contain at most ' + max + ' items' });\n if (s['uniqueItems'] === true) {\n for (let i = 0; i < value.length; i += 1) if (value.slice(0, i).some((previous) => equalJson(previous, value[i]))) { issues.push({ path: [...path, i], message: label([...path, i]) + ' must be unique' }); break; }\n }\n if ('items' in s) value.forEach((item, i) => issues.push(...validate(item, s['items'], [...path, i])));\n if (Array.isArray(s['prefixItems'])) s['prefixItems'].forEach((itemSchema, i) => { if (i < value.length) issues.push(...validate(value[i], itemSchema, [...path, i])); });\n }\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n const object = value as Record<string, unknown>;\n const required = s['required'];\n if (Array.isArray(required)) for (const key of required) if (typeof key === 'string' && !(key in object)) issues.push({ path: [...path, key], message: label([...path, key]) + ' is required' });\n const properties = s['properties'];\n if (typeof properties === 'object' && properties !== null && !Array.isArray(properties)) {\n const propertySchemas = properties as Record<string, unknown>;\n for (const [key, propertySchema] of Object.entries(propertySchemas)) if (key in object) issues.push(...validate(object[key], propertySchema, [...path, key]));\n const additional = s['additionalProperties'];\n for (const key of Object.keys(object)) {\n if (key in propertySchemas) continue;\n if (additional === false) issues.push({ path: [...path, key], message: label([...path, key]) + ' is not allowed' });\n else if (additional !== true && additional !== undefined) issues.push(...validate(object[key], additional, [...path, key]));\n }\n }\n const min = s['minProperties'];\n const max = s['maxProperties'];\n if (typeof min === 'number' && Object.keys(object).length < min) issues.push({ path, message: label(path) + ' must contain at least ' + min + ' properties' });\n if (typeof max === 'number' && Object.keys(object).length > max) issues.push({ path, message: label(path) + ' must contain at most ' + max + ' properties' });\n }\n\n return issues;\n}\n\nexport function validateJsonSchema(value: unknown, schema: unknown): readonly JsonSchemaValidationIssue[] {\n return validate(value, schema, []);\n}","/**\n * Converts MCP tools into Ollama-compatible tools.\n */\n\nimport { z } from 'zod';\nimport { validateJsonSchema } from './json-schema.js';\nimport { OllamaMcpError } from '../errors.js';\nimport type { AnyTool } from '../tools/types.js';\nimport type { ToolRegistry } from '../tools/registry.js';\nimport type {\n McpCallToolResult,\n McpClientLike,\n McpListToolsParams,\n McpRequestOptions,\n McpToolDescriptor,\n} from './types.js';\nimport type { ToolDefinition, ToolProperty } from '../types.js';\n\nexport type McpToolResultMode = 'text' | 'structured';\n\nexport interface LoadMcpToolsOptions {\n readonly namePrefix?: string | undefined;\n /** Maximum number of paginated tools/list responses to traverse. */\n readonly maxPages?: number | undefined;\n /**\n * Return MCP's raw CallToolResult to programmatic callers instead of the legacy\n * model-oriented text representation. The default preserves existing behavior.\n */\n readonly resultMode?: McpToolResultMode | undefined;\n}\n\nfunction resolveMaxPages(options: LoadMcpToolsOptions): number {\n const maxPages = options.maxPages ?? 64;\n if (!Number.isInteger(maxPages) || maxPages <= 0) {\n throw new RangeError('MCP maxPages must be a positive integer');\n }\n return maxPages;\n}\n\nexport async function listAllMcpTools(\n mcpClient: McpClientLike,\n options: LoadMcpToolsOptions = {},\n signal?: AbortSignal,\n): Promise<McpToolDescriptor[]> {\n const maxPages = resolveMaxPages(options);\n const tools: McpToolDescriptor[] = [];\n const seenCursors = new Set<string>();\n let cursor: string | undefined;\n\n for (let pageNumber = 1; pageNumber <= maxPages; pageNumber += 1) {\n const params: McpListToolsParams | undefined =\n cursor !== undefined ? { cursor } : undefined;\n const requestOptions: McpRequestOptions | undefined =\n signal !== undefined ? { signal } : undefined;\n const page = await mcpClient.listTools(params, requestOptions);\n tools.push(...page.tools);\n\n if (page.nextCursor === undefined) {\n return tools;\n }\n if (seenCursors.has(page.nextCursor)) {\n throw new Error('MCP tools/list returned a repeated nextCursor');\n }\n seenCursors.add(page.nextCursor);\n cursor = page.nextCursor;\n }\n\n throw new Error('MCP tools/list exceeded maxPages (' + maxPages + ')');\n}\n\nfunction formatMcpToolResult(result: McpCallToolResult): string {\n const parts = result.content.map((block) => {\n if (block.type === 'text' && typeof block.text === 'string') {\n return block.text;\n }\n try {\n return JSON.stringify(block);\n } catch {\n return `[${block.type}]`;\n }\n });\n\n if (result.structuredContent !== undefined) {\n try {\n parts.push(JSON.stringify(result.structuredContent));\n } catch {\n // Preserve the regular content if structuredContent cannot be serialized.\n }\n }\n\n if (result.isError) {\n parts.unshift('[MCP tool error]');\n }\n\n return parts.join('\\n');\n}\n\nfunction createInputValidator(inputSchema: Record<string, unknown>): z.ZodType<Record<string, unknown>> {\n return z.custom<Record<string, unknown>>().superRefine((value, ctx) => {\n const issues = validateJsonSchema(value, inputSchema);\n for (const issue of issues) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [...issue.path],\n message: issue.message,\n });\n }\n });\n}\n\nfunction convertMcpDescriptorToTool(\n descriptor: McpToolDescriptor,\n mcpClient: McpClientLike,\n namePrefix = '',\n resultMode: McpToolResultMode = 'text',\n): AnyTool {\n const toolName = `${namePrefix}${descriptor.name}`;\n const inputSchema = descriptor.inputSchema ?? { type: 'object', properties: {} };\n const properties = (inputSchema['properties'] ?? {}) as Record<string, ToolProperty>;\n const required = (inputSchema['required'] ?? []) as string[];\n const parameters = {\n ...inputSchema,\n type: 'object' as const,\n properties,\n ...(required.length > 0 ? { required } : {}),\n } as ToolDefinition['function']['parameters'];\n\n return {\n name: toolName,\n description: descriptor.description ?? '',\n schema: createInputValidator(inputSchema),\n execute: async (args: Record<string, unknown>, context: { readonly signal?: AbortSignal | undefined }) => {\n try {\n const result = await mcpClient.callTool(\n {\n name: descriptor.name,\n arguments: args,\n },\n context.signal !== undefined ? { signal: context.signal } : undefined,\n );\n\n // MCP tool failures are ordinary CallToolResult values, not transport failures.\n // Keep the result model-readable so the agent can observe the error and recover.\n return resultMode === 'structured' ? result : formatMcpToolResult(result);\n } catch (err) {\n if (err instanceof OllamaMcpError) throw err;\n throw new OllamaMcpError(`Failed calling MCP tool \"${descriptor.name}\"`, {\n mcpMethod: 'callTool',\n toolName: descriptor.name,\n cause: err,\n });\n }\n },\n definition: {\n type: 'function',\n function: {\n name: toolName,\n description: descriptor.description ?? '',\n parameters,\n },\n },\n };\n}\n\nexport async function loadMcpTools(\n mcpClient: McpClientLike,\n options: LoadMcpToolsOptions = {},\n signal?: AbortSignal,\n): Promise<AnyTool[]> {\n try {\n const tools = await listAllMcpTools(mcpClient, options, signal);\n return tools.map((t) => convertMcpDescriptorToTool(t, mcpClient, options.namePrefix, options.resultMode));\n } catch (err) {\n throw new OllamaMcpError('Failed listing MCP tools from client', {\n mcpMethod: 'listTools',\n cause: err,\n });\n }\n}\n\nexport async function registerMcpTools(\n registry: ToolRegistry,\n mcpClient: McpClientLike,\n options: LoadMcpToolsOptions = {},\n signal?: AbortSignal,\n): Promise<void> {\n const tools = await loadMcpTools(mcpClient, options, signal);\n registry.registerMany(tools);\n}\n","/**\n * First-class MCP-to-Ollama bridge.\n *\n * The core package deliberately stays transport-agnostic and Edge-compatible. Connect\n * to an MCP server with an MCP client implementation (stdio, Streamable HTTP, etc.)\n * then pass that client to this bridge.\n */\nimport type { ToolDefinition } from '../types.js';\nimport type { ToolRegistry } from '../tools/registry.js';\nimport { listAllMcpTools, loadMcpTools, type LoadMcpToolsOptions } from './mcp-tools.js';\nimport type { McpClientLike, McpToolDescriptor } from './types.js';\n\nexport type McpBridgeOptions = LoadMcpToolsOptions;\n\nexport class McpBridge {\n constructor(\n private readonly client: McpClientLike,\n private readonly options: McpBridgeOptions = {},\n ) {}\n\n static toOllamaTools(\n tools: readonly McpToolDescriptor[],\n options: McpBridgeOptions = {},\n ): ToolDefinition[] {\n const prefix = options.namePrefix ?? '';\n return tools.map((tool) => ({\n type: 'function',\n function: {\n name: prefix + tool.name,\n description: tool.description ?? '',\n parameters: {\n ...(tool.inputSchema ?? { type: 'object', properties: {} }),\n type: 'object' as const,\n properties: ((tool.inputSchema ?? {})['properties'] ?? {}) as ToolDefinition['function']['parameters']['properties'],\n } as ToolDefinition['function']['parameters'],\n },\n }));\n }\n\n async listTools(signal?: AbortSignal): Promise<readonly McpToolDescriptor[]> {\n return listAllMcpTools(this.client, this.options, signal);\n }\n\n async definitions(signal?: AbortSignal): Promise<ToolDefinition[]> {\n return McpBridge.toOllamaTools(await this.listTools(signal), this.options);\n }\n\n async loadTools(signal?: AbortSignal) {\n return loadMcpTools(this.client, this.options, signal);\n }\n\n async register(registry: ToolRegistry, signal?: AbortSignal): Promise<void> {\n await registry.registerMany(await this.loadTools(signal));\n }\n}\n","/**\n * Lightweight frontmatter parser for SKILL.md files.\n */\n\nimport { OllamaSkillInvalidError } from '../errors.js';\nimport type { SkillFrontmatter } from './types.js';\n\nexport interface ParsedFrontmatter {\n readonly frontmatter: SkillFrontmatter;\n readonly body: string;\n}\n\nfunction parseYamlValue(raw: string): unknown {\n const trimmed = raw.trim();\n if (trimmed === 'true') return true;\n if (trimmed === 'false') return false;\n if (!Number.isNaN(Number(trimmed)) && trimmed !== '') return Number(trimmed);\n if (\n (trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n ) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n}\n\nfunction parseYamlBlock(yamlText: string): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n const lines = yamlText.split('\\n');\n let currentKey: string | undefined;\n let currentList: unknown[] | undefined;\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n if (trimmed.startsWith('- ') && currentKey) {\n if (!currentList) {\n currentList = [];\n result[currentKey] = currentList;\n }\n currentList.push(parseYamlValue(trimmed.slice(2)));\n continue;\n }\n\n currentList = undefined;\n const colonIndex = line.indexOf(':');\n if (colonIndex > 0) {\n const key = line.slice(0, colonIndex).trim();\n const valStr = line.slice(colonIndex + 1).trim();\n currentKey = key;\n if (valStr.length > 0) {\n result[key] = parseYamlValue(valStr);\n }\n }\n }\n\n return result;\n}\n\nexport function parseFrontmatter(source: string, path = ''): ParsedFrontmatter {\n const match = source.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/);\n if (!match) {\n throw new OllamaSkillInvalidError('Missing YAML frontmatter delimiters (---)', {\n skillName: path || 'unknown',\n path,\n });\n }\n\n const rawYaml = match[1] ?? '';\n const body = match[2]?.trim() ?? '';\n const parsed = parseYamlBlock(rawYaml);\n\n if (!parsed['name'] || typeof parsed['name'] !== 'string') {\n throw new OllamaSkillInvalidError('Frontmatter missing required string \"name\"', {\n skillName: String(parsed['name'] ?? 'unknown'),\n path,\n });\n }\n if (!parsed['description'] || typeof parsed['description'] !== 'string') {\n throw new OllamaSkillInvalidError('Frontmatter missing required string \"description\"', {\n skillName: parsed['name'],\n path,\n });\n }\n\n return {\n frontmatter: parsed as unknown as SkillFrontmatter,\n body,\n };\n}\n","/**\n * Skill composition and context injection.\n */\n\nimport type { Message } from '../types.js';\nimport type { ToolRegistry } from '../tools/registry.js';\nimport type { Skill } from './types.js';\n\nexport interface ApplySkillOptions {\n readonly messages: readonly Message[];\n readonly tools?: ToolRegistry;\n}\n\nexport interface AppliedSkillResult {\n readonly messages: readonly Message[];\n readonly tools?: ToolRegistry;\n}\n\n/**\n * Injects a skill's body into messages as a system prompt and applies allowed tool filters.\n */\nexport function applySkill(skill: Skill, options: ApplySkillOptions): AppliedSkillResult {\n const systemPrompt = `[Skill: ${skill.name}]\\n${skill.description}\\n\\n${skill.body}`;\n const messages = [...options.messages];\n const systemIndex = messages.findIndex((m) => m.role === 'system');\n\n if (systemIndex >= 0) {\n const existing = messages[systemIndex];\n if (existing) {\n messages[systemIndex] = {\n role: 'system',\n content: `${existing.content}\\n\\n${systemPrompt}`,\n };\n }\n } else {\n messages.unshift({ role: 'system', content: systemPrompt });\n }\n\n return {\n messages,\n ...(options.tools !== undefined ? { tools: options.tools } : {}),\n };\n}\n","/**\n * Multi-turn tool execution loop agent.\n */\n\nimport {\n OllamaAgentMaxIterationsError,\n OllamaAgentMaxToolCallsError,\n OllamaIncompatibleModelError,\n} from '../errors.js';\nimport {\n withSpan,\n ATTR_GEN_AI_SYSTEM,\n ATTR_GEN_AI_OPERATION_NAME,\n ATTR_GEN_AI_REQUEST_MODEL,\n ATTR_OLLAMA_AGENT_MAX_ITERATIONS,\n ATTR_OLLAMA_AGENT_ITERATION,\n GEN_AI_SYSTEM_OLLAMA,\n} from '../telemetry/index.js';\nimport { ensureToolCallIds } from '../tools/tool-call-id.js';\nimport type { ModelCapabilities } from '../capabilities/capabilities.js';\nimport type { Message, ModelOptions, ThinkValue, ToolDefinition } from '../types.js';\nimport type { ToolRegistry } from '../tools/registry.js';\nimport type { AgentConfig, AgentHooks, AgentResult, AgentRunInput, AgentTurn } from './types.js';\n\nexport interface AgentChatClient {\n capabilities?:\n | ((model: string, signal?: AbortSignal) => Promise<ModelCapabilities>)\n | undefined;\n chat(request: {\n readonly model: string;\n readonly messages: readonly Message[];\n readonly tools?: readonly ToolDefinition[] | undefined;\n readonly options?: ModelOptions | undefined;\n readonly think?: ThinkValue | undefined;\n readonly stream?: false | undefined;\n readonly signal?: AbortSignal | undefined;\n }): Promise<{ readonly message: Message }>;\n}\n\n/**\n * Runs a multi-turn `chat` + tool-execution loop until the model responds without\n * requesting further tool calls, or `maxIterations` is exceeded. Tool calls within a\n * single turn are handed to `ToolRegistry.executeToolCalls` and their results are\n * appended to history in the same order the model requested them. Native Ollama tool-result\n * messages use `tool_name` on the wire; the SDK-generated `toolCallId` remains execution\n * metadata and is not sent to Ollama.\n * `Agent` assigns ids defensively even when `AgentChatClient` isn't `OllamaClient` (e.g. a\n * custom/test implementation), so this guarantee holds regardless of which chat client is\n * supplied.\n */\nexport class Agent {\n private readonly client: AgentChatClient;\n private readonly tools?: ToolRegistry | undefined;\n private readonly maxIterations: number;\n private readonly maxToolCalls?: number | undefined;\n private readonly hooks?: AgentHooks | undefined;\n private readonly validateToolCapability: boolean;\n private readonly toolContextSize: number;\n\n constructor(client: AgentChatClient, config: AgentConfig = {}) {\n this.client = client;\n this.tools = config.tools;\n this.maxIterations = config.maxIterations ?? 10;\n this.maxToolCalls = config.maxToolCalls;\n this.hooks = config.hooks;\n if (this.maxToolCalls !== undefined && (!Number.isInteger(this.maxToolCalls) || this.maxToolCalls < 0)) {\n throw new RangeError('Agent maxToolCalls must be a non-negative integer');\n }\n this.validateToolCapability = config.validateToolCapability ?? true;\n this.toolContextSize = config.toolContextSize ?? 32768;\n if (!Number.isInteger(this.toolContextSize) || this.toolContextSize <= 0) {\n throw new RangeError('Agent toolContextSize must be a positive integer');\n }\n }\n\n run(input: AgentRunInput): Promise<AgentResult> {\n return withSpan(\n `invoke_agent ${input.model}`,\n {\n [ATTR_GEN_AI_SYSTEM]: GEN_AI_SYSTEM_OLLAMA,\n [ATTR_GEN_AI_OPERATION_NAME]: 'invoke_agent',\n [ATTR_GEN_AI_REQUEST_MODEL]: input.model,\n [ATTR_OLLAMA_AGENT_MAX_ITERATIONS]: this.maxIterations,\n },\n () => this.runLoop(input),\n );\n }\n\n private async runLoop(input: AgentRunInput): Promise<AgentResult> {\n const history: Message[] = [...input.messages];\n const turns: AgentTurn[] = [];\n const toolDefs = this.tools?.definitions();\n const hasTools = toolDefs !== undefined && toolDefs.length > 0;\n let capabilities: ModelCapabilities | undefined;\n\n if (hasTools && this.validateToolCapability && this.client.capabilities) {\n capabilities = await this.client.capabilities(input.model, input.signal);\n if (!capabilities.supportsTools) {\n throw new OllamaIncompatibleModelError(\n `Model \"${input.model}\" does not advertise the \"tools\" capability.`,\n {\n model: input.model,\n capability: 'tools',\n reportedCapabilities: capabilities.reported,\n },\n );\n }\n }\n\n const shouldAutoSizeContext =\n hasTools &&\n this.validateToolCapability &&\n capabilities !== undefined &&\n input.options?.num_ctx === undefined;\n\n const effectiveOptions = shouldAutoSizeContext\n ? {\n ...(input.options ?? {}),\n num_ctx: Math.min(\n this.toolContextSize,\n capabilities?.contextLength ?? this.toolContextSize,\n ),\n }\n : input.options;\n\n let toolCallsExecuted = 0;\n\n for (let iteration = 1; iteration <= this.maxIterations; iteration++) {\n const outcome = await withSpan(\n 'ollama.agent.turn',\n { [ATTR_OLLAMA_AGENT_ITERATION]: iteration },\n async () => {\n this.hooks?.onTurnStart?.(iteration);\n\n const response = await this.client.chat({\n model: input.model,\n messages: history,\n ...(toolDefs !== undefined ? { tools: toolDefs } : {}),\n ...(effectiveOptions !== undefined ? { options: effectiveOptions } : {}),\n ...(input.think !== undefined ? { think: input.think } : {}),\n stream: false,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n\n const rawToolCalls = response.message.tool_calls;\n const toolCalls = ensureToolCallIds(rawToolCalls);\n const assistantMessage: Message =\n toolCalls === rawToolCalls\n ? response.message\n : { ...response.message, tool_calls: toolCalls };\n history.push(assistantMessage);\n\n if (!toolCalls || toolCalls.length === 0 || !this.tools) {\n const finalTurn: AgentTurn = { iteration, message: assistantMessage };\n turns.push(finalTurn);\n this.hooks?.onTurnEnd?.(finalTurn);\n return { done: true as const, finalMessage: assistantMessage };\n }\n\n if (this.maxToolCalls !== undefined && toolCallsExecuted + toolCalls.length > this.maxToolCalls) {\n throw new OllamaAgentMaxToolCallsError(\n `Agent exceeded max tool calls (${this.maxToolCalls})`,\n { maxToolCalls: this.maxToolCalls, toolCallsExecuted },\n );\n }\n\n for (const tc of toolCalls) {\n this.hooks?.onToolCallStart?.(tc);\n }\n\n const toolResults = await this.tools.executeToolCalls(toolCalls, {\n signal: input.signal,\n });\n toolCallsExecuted += toolCalls.length;\n\n for (const res of toolResults) {\n this.hooks?.onToolCallEnd?.(res);\n history.push({\n role: 'tool',\n tool_name: res.toolName,\n content: res.outputString,\n });\n }\n\n const turn: AgentTurn = { iteration, message: assistantMessage, toolCalls, toolResults };\n turns.push(turn);\n this.hooks?.onTurnEnd?.(turn);\n return { done: false as const };\n },\n );\n\n if (outcome.done) {\n return { finalMessage: outcome.finalMessage, turns, totalIterations: iteration };\n }\n }\n\n throw new OllamaAgentMaxIterationsError(\n `Agent exceeded max iterations (${this.maxIterations}) without converging`,\n { maxIterations: this.maxIterations },\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/config.ts","../src/errors.ts","../src/logger.ts","../src/providers/endpoint-registry.ts","../src/middleware.ts","../src/utils.ts","../src/streaming/ndjson.ts","../src/streaming/sse.ts","../src/telemetry/tracer.ts","../src/transport/http.ts","../src/providers/health-check.ts","../src/capabilities/capabilities.ts","../src/schema/zod.ts","../src/usage.ts","../src/tools/tool-call-id.ts","../src/streaming/stream.ts","../src/streaming/normalize.ts","../src/transport/backoff.ts","../src/transport/retry.ts","../src/transport/timeout.ts","../src/models-client.ts","../src/integrations/openai.ts","../src/integrations/anthropic.ts","../src/generated/models/ToolCall.schema.ts","../src/generated/models/ChatMessage.schema.ts","../src/generated/models/ModelOptions.schema.ts","../src/generated/models/ThinkValue.schema.ts","../src/generated/models/ToolDefinition.schema.ts","../src/generated/models/ChatRequest.schema.ts","../src/generated/models/GenerateRequest.schema.ts","../src/generated/models/EmbedRequest.schema.ts","../src/generated/models/CreateRequest.schema.ts","../src/generated/models/CopyRequest.schema.ts","../src/generated/models/DeleteRequest.schema.ts","../src/generated/models/PullRequest.schema.ts","../src/generated/models/PushRequest.schema.ts","../src/generated/models/ShowRequest.schema.ts","../src/generated/runtime/schema-registry.ts","../src/generated/runtime/runtime.ts","../src/client.ts","../src/streaming/adapters.ts","../src/quota.ts","../src/tools/define-tool.ts","../src/tools/registry.ts","../src/mcp/json-schema.ts","../src/mcp/mcp-tools.ts","../src/mcp/bridge.ts","../src/skills/frontmatter.ts","../src/skills/compose.ts","../src/agent/agent.ts"],"names":["message","dispatch","response","controller","z"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Configuration options and constants for OllamaClient.\n */\n\nimport type { Logger, RequestLifecycleHook } from './logger.js';\nimport type { Middleware } from './middleware.js';\nimport type { RetryConfig } from './transport/retry.js';\nimport type { FetchLike } from './transport/http.js';\nimport type { EndpointRegistryOptions, OllamaEndpoint } from './providers/endpoint-registry.js';\n\nexport const DEFAULT_BASE_URL = 'http://localhost:11434';\nexport const DEFAULT_TIMEOUT_MS = 30_000;\n/**\n * Fixed host for Ollama's hosted web tools (`/api/web_search`, `/api/web_fetch`) — see\n * `OllamaClient.webSearch`/`webFetch`. These are an Ollama Cloud service reachable only\n * at this host, independent of any locally-configured `baseUrl`/`endpoints`.\n */\nexport const OLLAMA_CLOUD_BASE_URL = 'https://ollama.com';\n\n/**\n * Reads a process environment variable, if any. Guarded with `typeof process` rather\n * than importing `node:process` so this stays safe to call from Edge Runtimes (Cloudflare\n * Workers, Vercel Edge) where `process` doesn't exist — it just returns `undefined` there.\n */\nfunction readEnv(name: string): string | undefined {\n return typeof process !== 'undefined' && process.env ? process.env[name] : undefined;\n}\n\n/**\n * Resolves the default single-endpoint `baseUrl`, falling back to the `OLLAMA_HOST`\n * environment variable (the same one the official `ollama` CLI and client libraries\n * read) before `DEFAULT_BASE_URL`. Explicit `config.baseUrl` always wins.\n */\nexport function resolveBaseUrl(configBaseUrl?: string | undefined): string {\n return configBaseUrl ?? readEnv('OLLAMA_HOST') ?? DEFAULT_BASE_URL;\n}\n\n/**\n * Resolves the default single-endpoint `apiKey`, falling back to the `OLLAMA_API_KEY`\n * environment variable before leaving it unset. Explicit `config.apiKey` always wins.\n */\nexport function resolveApiKey(configApiKey?: string | undefined): string | undefined {\n return configApiKey ?? readEnv('OLLAMA_API_KEY');\n}\n\n/** One named credential for the `credentials`/`modelBindings` config shape. */\nexport interface OllamaCredentialConfig {\n readonly apiKey: string;\n /** Overrides `OllamaClientConfig.baseUrl` for requests made with this credential. */\n readonly baseUrl?: string | undefined;\n readonly headers?: Record<string, string> | undefined;\n}\n\n/**\n * Builds synthetic `OllamaEndpoint`s (named `credential:<id>`) from `config.credentials` +\n * `config.modelBindings` — an ergonomic, map-based alternative to writing out `endpoints`\n * with per-entry `models` allow-lists directly. Both shapes feed the same\n * `EndpointRegistry`/`executeWithFailover` routing engine; this is pure config sugar, not\n * a separate routing mechanism. Returns `[]` if `config.credentials` is unset.\n *\n * A model bound to one credential (`modelBindings: { \"minimax-m3\": \"coder\" }`) scopes that\n * credential to only that model, same as `OllamaEndpoint.models`. A model bound to several\n * credentials (`modelBindings: { \"gpt-oss:120b\": [\"key1\", \"key2\"] }`) makes ordinary\n * endpoint failover apply between them. `config.defaultCredential`, if set, is given a\n * lower priority than explicitly-bound credentials and no `models` restriction, so it acts\n * as a catch-all for any model without an explicit binding without ever pre-empting one\n * that has.\n */\nexport function resolveCredentialEndpoints(\n config: Pick<OllamaClientConfig, 'credentials' | 'modelBindings' | 'defaultCredential' | 'baseUrl'>,\n): readonly OllamaEndpoint[] {\n if (config.credentials === undefined) return [];\n\n const modelsByCredential = new Map<string, string[]>();\n for (const [model, bound] of Object.entries(config.modelBindings ?? {})) {\n for (const id of typeof bound === 'string' ? [bound] : bound) {\n if (!(id in config.credentials)) {\n throw new Error(\n `modelBindings[\"${model}\"] references unknown credential \"${id}\" — it isn't ` +\n `in \\`credentials\\`. Known credentials: ${Object.keys(config.credentials).join(', ') || '(none)'}.`,\n );\n }\n const list = modelsByCredential.get(id) ?? [];\n list.push(model);\n modelsByCredential.set(id, list);\n }\n }\n\n return Object.entries(config.credentials).map(([id, credential]) => {\n const isDefault = id === config.defaultCredential;\n const boundModels = isDefault ? undefined : modelsByCredential.get(id);\n return {\n name: `credential:${id}`,\n baseUrl: resolveBaseUrl(credential.baseUrl ?? config.baseUrl),\n apiKey: credential.apiKey,\n ...(credential.headers !== undefined ? { headers: credential.headers } : {}),\n ...(boundModels !== undefined ? { models: boundModels } : {}),\n priority: isDefault ? -1 : 0,\n };\n });\n}\n\nexport const DEFAULT_FAILOVER_CODES: readonly string[] = [\n 'network_error',\n 'timeout',\n 'server_error',\n 'rate_limited',\n 'auth_error',\n // A candidate endpoint rejected the request pre-flight for a known-unsupported\n // capability (e.g. structured output against Ollama Cloud) — try the next candidate\n // rather than failing outright; see OllamaUnsupportedCapabilityError.\n 'unsupported_capability',\n];\n\nexport interface OllamaClientConfig {\n /**\n * Base URL of a single Ollama server. Ignored if `endpoints` is provided. Falls back to\n * the `OLLAMA_HOST` environment variable (when set and running under Node), then\n * `http://localhost:11434`.\n */\n readonly baseUrl?: string;\n /**\n * Bearer token sent as `Authorization: Bearer <apiKey>` for a single-endpoint setup.\n * Falls back to the `OLLAMA_API_KEY` environment variable (when set and running under\n * Node).\n */\n readonly apiKey?: string;\n /** Static headers merged into every request. */\n readonly headers?: Record<string, string>;\n /**\n * Multiple named endpoints for rotation and automatic failover. Each endpoint may\n * carry its own `apiKey` and, via `models`, be scoped to only the models that\n * credential is entitled to — see `OllamaEndpoint.models` for routing several\n * per-model Ollama Cloud API keys through a single client.\n */\n readonly endpoints?: readonly OllamaEndpoint[];\n /**\n * Named credentials, keyed by an id you choose — an ergonomic alternative to writing\n * out `endpoints` by hand for the common \"several Ollama Cloud API keys, each entitled\n * to different models\" shape. Combine with `modelBindings` to scope each credential to\n * the models it's authorized for; a credential with no binding (or set as\n * `defaultCredential`) is eligible for every model, same as an `OllamaEndpoint` with no\n * `models`. Merges additively with `endpoints` if both are given.\n */\n readonly credentials?: Readonly<Record<string, OllamaCredentialConfig>>;\n /**\n * Maps a model name to the `credentials` id (or ids, for several keys authorized for\n * the same model — ordinary failover applies between them) that may serve it. Has no\n * effect without `credentials`. Referencing an id not present in `credentials` throws\n * at construction time.\n */\n readonly modelBindings?: Readonly<Record<string, string | readonly string[]>>;\n /**\n * The `credentials` id to fall back to for a model with no entry in `modelBindings`.\n * Unset means such a model has no synthesized-from-`credentials` route — it still\n * routes normally through any plain `endpoints` entry without a `models` restriction.\n */\n readonly defaultCredential?: string | undefined;\n /**\n * Tuning options for the endpoint circuit breaker, and candidate selection ordering —\n * pass `{ strategy: 'round-robin' }` to spread requests across a pool of same-priority\n * endpoints/credentials (e.g. several unbound `credentials`) instead of always\n * preferring the first one, or `{ strategy: 'least-connections' }` to route each\n * request to whichever candidate currently has the fewest requests in flight (e.g.\n * several free-tier Ollama Cloud accounts, each capped at 1 concurrent request — this\n * deterministically spreads concurrent `Promise.all`-style calls one-per-account rather\n * than risking two landing on the same still-busy one), and `maxConcurrentPerEndpoint`\n * to cap that at an exact number and queue (rather than overrun a saturated candidate)\n * once every eligible one is at capacity — e.g. `{ strategy: 'least-connections',\n * maxConcurrentPerEndpoint: 1 }` for accounts that only allow one request at a time.\n * See `EndpointRegistryOptions`.\n */\n readonly endpointHealth?: EndpointRegistryOptions;\n /** Error codes that trigger failover to the next candidate endpoint. */\n readonly failoverOn?: readonly string[];\n /** Default per-request timeout in milliseconds (default 30_000ms). */\n readonly timeoutMs?: number;\n /** Retry configuration or retry count override. */\n readonly retries?: number | Partial<RetryConfig>;\n /** Custom fetch implementation (defaults to globalThis.fetch). */\n readonly fetch?: FetchLike;\n /** Request/Response middleware list. */\n readonly middleware?: readonly Middleware[];\n /** Structured logger. */\n readonly logger?: Logger;\n /** Enables console debug logger if true. */\n readonly debug?: boolean;\n /** Request lifecycle hook for telemetry/metrics. */\n readonly onLifecycleEvent?: RequestLifecycleHook;\n}\n","/**\n * Structured, typed error hierarchy for OllamaClient.\n */\n\nimport type { z } from 'zod';\n\nexport interface OllamaErrorRequestContext {\n readonly method?: string | undefined;\n readonly url?: string | undefined;\n readonly model?: string | undefined;\n}\n\nexport interface OllamaErrorResponseContext {\n readonly status?: number | undefined;\n readonly headers?: Record<string, string> | undefined;\n readonly body?: unknown;\n}\n\nexport interface OllamaClientErrorOptions extends ErrorOptions {\n readonly code: string;\n readonly status?: number | undefined;\n readonly retryable?: boolean | undefined;\n readonly request?: OllamaErrorRequestContext | undefined;\n readonly response?: OllamaErrorResponseContext | undefined;\n}\n\nexport class OllamaClientError extends Error {\n readonly code: string;\n readonly status?: number | undefined;\n readonly retryable: boolean;\n readonly request?: OllamaErrorRequestContext | undefined;\n readonly response?: OllamaErrorResponseContext | undefined;\n\n constructor(message: string, options: OllamaClientErrorOptions) {\n super(message, { cause: options.cause });\n this.name = this.constructor.name;\n this.code = options.code;\n this.status = options.status;\n this.retryable = options.retryable ?? false;\n this.request = options.request;\n this.response = options.response;\n }\n}\n\nexport class OllamaNetworkError extends OllamaClientError {\n constructor(\n message: string,\n options?: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> | undefined,\n ) {\n super(message, { ...options, code: 'network_error', retryable: true });\n }\n}\n\nexport class OllamaTimeoutError extends OllamaClientError {\n readonly timeoutMs?: number | undefined;\n constructor(\n message: string,\n options?:\n | (Omit<OllamaClientErrorOptions, 'code' | 'retryable'> & { timeoutMs?: number | undefined })\n | undefined,\n ) {\n super(message, { ...options, code: 'timeout', retryable: true });\n this.timeoutMs = options?.timeoutMs;\n }\n}\n\nexport class OllamaAuthError extends OllamaClientError {\n constructor(\n message: string,\n options?: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> | undefined,\n ) {\n super(message, { ...options, code: 'auth_error', retryable: false });\n }\n}\n\nexport class OllamaNotFoundError extends OllamaClientError {\n constructor(\n message: string,\n options?: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> | undefined,\n ) {\n super(message, { ...options, code: 'not_found', retryable: false });\n }\n}\n\nexport class OllamaRateLimitError extends OllamaClientError {\n readonly retryAfterMs?: number | undefined;\n constructor(\n message: string,\n options?:\n | (Omit<OllamaClientErrorOptions, 'code' | 'retryable'> & {\n retryAfterMs?: number | undefined;\n })\n | undefined,\n ) {\n super(message, { ...options, code: 'rate_limited', retryable: true });\n this.retryAfterMs = options?.retryAfterMs;\n }\n}\n\n/**\n * Thrown client-side, before a network request is made, by `QuotaManager.assertCanProceed`\n * (see `src/quota.ts`) when issuing the request would exceed a configured usage budget for\n * one of its rolling windows. This is distinct from `OllamaRateLimitError`, which reflects\n * the server's own 429 response — Ollama Cloud does not expose account-level quota via the\n * API, so `QuotaManager` tracks usage against budgets the caller configures locally and\n * fails fast rather than waiting for the server to reject the request.\n */\nexport class OllamaQuotaExceededError extends OllamaClientError {\n readonly windowId: string;\n readonly resetAt: number;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> & {\n windowId: string;\n resetAt: number;\n },\n ) {\n super(message, { ...options, code: 'quota_exceeded', retryable: false });\n this.windowId = options.windowId;\n this.resetAt = options.resetAt;\n }\n}\n\nexport class OllamaServerError extends OllamaClientError {\n constructor(\n message: string,\n options?: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> | undefined,\n ) {\n super(message, { ...options, code: 'server_error', retryable: true });\n }\n}\n\nexport class OllamaAbortError extends OllamaClientError {\n constructor(\n message: string,\n options?: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> | undefined,\n ) {\n super(message, { ...options, code: 'aborted', retryable: false });\n }\n}\n\nexport class OllamaToolValidationError extends OllamaClientError {\n readonly toolName: string;\n readonly issues?: unknown;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code'> & { toolName: string; issues?: unknown },\n ) {\n super(message, { ...options, code: 'tool_validation_error', retryable: false });\n this.toolName = options.toolName;\n this.issues = options.issues;\n }\n}\n\n/**\n * Thrown by `OllamaRuntime.invoke` when `validateRequests: true` is set and\n * the request body fails Zod validation against the operation's registered\n * schema. See ADR 0020 (runtime Zod validation).\n *\n * The error carries the original Zod issues so callers can inspect which\n * fields failed. No HTTP request is made when this error is thrown.\n */\nexport class OllamaRequestValidationError extends OllamaClientError {\n readonly operationId: string;\n readonly issues: readonly z.ZodIssue[];\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code'> & {\n operationId: string;\n issues: readonly z.ZodIssue[];\n },\n ) {\n super(message, { ...options, code: 'request_validation_error', retryable: false });\n this.operationId = options.operationId;\n this.issues = options.issues;\n }\n}\n\nexport class OllamaToolTimeoutError extends OllamaClientError {\n readonly toolName: string;\n readonly timeoutMs: number;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> & {\n toolName: string;\n timeoutMs: number;\n },\n ) {\n super(message, { ...options, code: 'tool_timeout', retryable: false });\n this.toolName = options.toolName;\n this.timeoutMs = options.timeoutMs;\n }\n}\n\n/**\n * Thrown client-side, before a network request is made, when a request asks for a\n * capability an endpoint is known not to support (e.g. structured output `format` against\n * an Ollama Cloud endpoint — see `ModelCapabilities.supportsStructuredOutputRequest` in\n * `src/capabilities/capabilities.ts`). Its `code` is included in `DEFAULT_FAILOVER_CODES`\n * by default, so in a multi-endpoint setup it causes failover to the next candidate rather\n * than failing outright — it only surfaces to the caller if every candidate is rejected.\n */\nexport class OllamaUnsupportedCapabilityError extends OllamaClientError {\n readonly capability: string;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> & { capability: string },\n ) {\n super(message, { ...options, code: 'unsupported_capability', retryable: false });\n this.capability = options.capability;\n }\n}\n\n/**\n * Thrown client-side, before any network call, when `config.endpoints` uses\n * `OllamaEndpoint.models` to scope endpoints/credentials to specific models and the\n * requested `model` isn't in any configured endpoint's allow-list. This is a routing\n * misconfiguration, not a connectivity problem — the SDK deliberately does not \"probe\"\n * unauthorized endpoints to find one that happens to work (that would burn quota on keys\n * that were never entitled to the model and produce non-deterministic startup behavior).\n */\nexport class OllamaModelRoutingError extends OllamaClientError {\n readonly model: string;\n readonly availableModels: readonly string[];\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> & {\n model: string;\n availableModels: readonly string[];\n },\n ) {\n super(message, { ...options, code: 'model_routing_error', retryable: false });\n this.model = options.model;\n this.availableModels = options.availableModels;\n }\n}\n\n/**\n * Thrown before an agent tool loop starts when the selected model's /api/show metadata\n * does not advertise a capability required by the loop.\n */\nexport class OllamaIncompatibleModelError extends OllamaClientError {\n readonly model: string;\n readonly capability: string;\n readonly reportedCapabilities: readonly string[];\n\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> & {\n model: string;\n capability: string;\n reportedCapabilities: readonly string[];\n },\n ) {\n super(message, { ...options, code: 'incompatible_model', retryable: false });\n this.model = options.model;\n this.capability = options.capability;\n this.reportedCapabilities = options.reportedCapabilities;\n }\n}\nexport class OllamaAgentMaxToolCallsError extends OllamaClientError {\n readonly maxToolCalls: number;\n readonly toolCallsExecuted: number;\n\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code'> & {\n maxToolCalls: number;\n toolCallsExecuted: number;\n },\n ) {\n super(message, { ...options, code: 'agent_max_tool_calls_exceeded', retryable: false });\n this.maxToolCalls = options.maxToolCalls;\n this.toolCallsExecuted = options.toolCallsExecuted;\n }\n}\n\nexport class OllamaAgentMaxIterationsError extends OllamaClientError {\n readonly maxIterations: number;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code'> & { maxIterations: number },\n ) {\n super(message, { ...options, code: 'agent_max_iterations_exceeded', retryable: false });\n this.maxIterations = options.maxIterations;\n }\n}\n\nexport class OllamaMcpError extends OllamaClientError {\n readonly mcpMethod: 'listTools' | 'callTool';\n readonly toolName?: string | undefined;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code'> & {\n mcpMethod: 'listTools' | 'callTool';\n toolName?: string | undefined;\n },\n ) {\n super(message, { ...options, code: 'mcp_error', retryable: options.retryable ?? false });\n this.mcpMethod = options.mcpMethod;\n this.toolName = options.toolName;\n }\n}\n\nexport class OllamaSkillNotFoundError extends OllamaClientError {\n readonly skillName: string;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code'> & { skillName: string },\n ) {\n super(message, { ...options, code: 'skill_not_found', retryable: false });\n this.skillName = options.skillName;\n }\n}\n\nexport class OllamaSkillInvalidError extends OllamaClientError {\n readonly skillName: string;\n readonly path?: string | undefined;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code'> & {\n skillName: string;\n path?: string | undefined;\n },\n ) {\n super(message, { ...options, code: 'skill_invalid', retryable: false });\n this.skillName = options.skillName;\n this.path = options.path;\n }\n}\n\nexport class OllamaGenericClientError extends OllamaClientError {\n constructor(message: string, options?: Omit<OllamaClientErrorOptions, 'code'> | undefined) {\n super(message, { ...options, code: 'client_error' });\n }\n}\n\nfunction isDomAbortError(error: unknown): error is DOMException {\n return (\n typeof DOMException !== 'undefined' &&\n error instanceof DOMException &&\n error.name === 'AbortError'\n );\n}\n\nfunction statusToError(\n status: number,\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code' | 'status'>,\n): OllamaClientError {\n if (status === 401 || status === 403) {\n return new OllamaAuthError(message, { ...options, status });\n }\n if (status === 404) {\n return new OllamaNotFoundError(message, { ...options, status });\n }\n if (status === 429) {\n return new OllamaRateLimitError(message, { ...options, status });\n }\n if (status >= 500) {\n return new OllamaServerError(message, { ...options, status });\n }\n return new OllamaGenericClientError(message, { ...options, status });\n}\n\n/**\n * Maps arbitrary thrown exceptions into structured OllamaClientError instances.\n */\nexport function mapError(\n error: unknown,\n context: {\n request?: OllamaErrorRequestContext | undefined;\n response?: OllamaErrorResponseContext | undefined;\n } = {},\n): OllamaClientError {\n if (error instanceof OllamaClientError) {\n return error;\n }\n if (isDomAbortError(error)) {\n return new OllamaAbortError(error.message || 'Request was aborted', {\n cause: error,\n request: context.request,\n });\n }\n if (error instanceof TypeError) {\n return new OllamaNetworkError(error.message || 'Network request failed', {\n cause: error,\n request: context.request,\n });\n }\n if (context.response?.status !== undefined) {\n const message = error instanceof Error ? error.message : String(error);\n return statusToError(context.response.status, message, {\n cause: error,\n request: context.request,\n response: context.response,\n });\n }\n const message = error instanceof Error ? error.message : String(error);\n return new OllamaGenericClientError(message, {\n cause: error,\n request: context.request,\n response: context.response,\n });\n}\n","/**\n * Structured logger and request lifecycle interfaces.\n */\n\nexport interface LogFn {\n (message: string, context?: Record<string, unknown>): void;\n}\n\nexport interface Logger {\n readonly debug: LogFn;\n readonly info: LogFn;\n readonly warn: LogFn;\n readonly error: LogFn;\n}\n\nexport interface LifecycleStartEvent {\n readonly type: 'start';\n readonly requestId: string;\n readonly method: string;\n readonly url: string;\n readonly timestamp: number;\n}\n\nexport interface LifecycleSuccessEvent {\n readonly type: 'success';\n readonly requestId: string;\n readonly durationMs: number;\n readonly status: number;\n readonly timestamp: number;\n}\n\nexport interface LifecycleRetryEvent {\n readonly type: 'retry';\n readonly requestId: string;\n readonly attempt: number;\n readonly error: Error;\n readonly delayMs: number;\n readonly timestamp: number;\n}\n\nexport interface LifecycleErrorEvent {\n readonly type: 'error';\n readonly requestId: string;\n readonly durationMs: number;\n readonly error: Error;\n readonly timestamp: number;\n}\n\nexport type RequestLifecycleEvent =\n LifecycleStartEvent | LifecycleSuccessEvent | LifecycleRetryEvent | LifecycleErrorEvent;\n\nexport interface RequestLifecycleHook {\n (event: RequestLifecycleEvent): void;\n}\n\nexport const NOOP_LOGGER: Logger = {\n debug: () => undefined,\n info: () => undefined,\n warn: () => undefined,\n error: () => undefined,\n};\n\nexport function createConsoleLogger(prefix = '[@nemesis-oss/ollama-sdk]'): Logger {\n return {\n debug: (msg, ctx) => console.debug(`${prefix} ${msg}`, ctx ?? ''),\n info: (msg, ctx) => console.info(`${prefix} ${msg}`, ctx ?? ''),\n warn: (msg, ctx) => console.warn(`${prefix} ${msg}`, ctx ?? ''),\n error: (msg, ctx) => console.error(`${prefix} ${msg}`, ctx ?? ''),\n };\n}\n","/**\n * Multi-endpoint registry with priority routing and circuit breaker failover.\n */\n\nimport { OllamaAbortError } from '../errors.js';\n\nexport interface OllamaEndpoint {\n readonly name: string;\n readonly baseUrl: string;\n readonly apiKey?: string | undefined;\n readonly headers?: Record<string, string> | undefined;\n readonly priority?: number | undefined;\n /**\n * Restricts this endpoint/credential to a specific set of models — for the common case\n * of several Ollama Cloud API keys, each entitled to a different model. When set,\n * `EndpointRegistry.candidates(model)` only returns this endpoint for a request whose\n * `model` is in the list, so cross-endpoint failover never retries a request against a\n * credential that isn't authorized for the requested model. Omit (the default) to make\n * the endpoint eligible for every model, preserving prior behavior.\n */\n readonly models?: readonly string[] | undefined;\n}\n\nexport interface EndpointHealth {\n readonly endpoint: OllamaEndpoint;\n readonly failureCount: number;\n readonly lastFailureTimestamp?: number | undefined;\n readonly isCoolingDown: boolean;\n /** In-flight requests currently attempting this endpoint — see `acquire`/`release`. */\n readonly activeRequests: number;\n}\n\nexport interface EndpointRegistryOptions {\n readonly failureThreshold?: number | undefined;\n readonly cooldownMs?: number | undefined;\n readonly now?: (() => number) | undefined;\n /**\n * How candidates that share the same `priority` are ordered within `candidates()`.\n * `'priority'` (the default) keeps them in registration order, so the same candidate is\n * always tried first while it stays healthy. `'round-robin'` rotates each same-priority\n * group by one position per `candidates()` call — i.e. per `chat`/`generate`/etc. call —\n * so consecutive requests spread across a pool of interchangeable endpoints/credentials\n * instead of always preferring the first one (the common case: several Ollama Cloud keys\n * registered with no `models` restriction, meant to be used interchangeably). Endpoints\n * at different priorities are unaffected either way — a higher-priority one is still\n * always tried first, and failover to the rest of the group still applies if the\n * rotated-to-front candidate fails.\n *\n * `'least-connections'` instead orders each same-priority group by ascending in-flight\n * request count (tracked via `acquire`/`release`, ties broken by registration order),\n * so a request always prefers whichever candidate currently has the fewest requests\n * still in progress. Unlike `'round-robin'`, this remains correct under uneven or\n * overlapping request durations — e.g. several Ollama Cloud accounts each limited to 1\n * concurrent request: firing several requests at once (`Promise.all`) deterministically\n * lands each on a different account rather than risking two landing on the same\n * still-busy one, because `candidates()` and the subsequent `acquire()` for the chosen\n * candidate run synchronously with no `await` in between — JS's single-threaded\n * execution means no two concurrent calls can observe the same \"0 active\" snapshot for\n * the same candidate.\n */\n readonly strategy?: 'priority' | 'round-robin' | 'least-connections' | undefined;\n /**\n * Caps in-flight requests per endpoint (tracked via `acquire`/`release`). Unset (the\n * default) means no cap — candidates are never treated as saturated. When set, a\n * request whose every otherwise-eligible candidate is already at this cap waits\n * (`waitForCapacity`, FIFO per candidate) for one of them to free up, instead of being\n * sent to an already-saturated candidate. Pairs naturally with `strategy:\n * 'least-connections'` for a pool of accounts each limited to N concurrent requests —\n * e.g. `maxConcurrentPerEndpoint: 1` for several Ollama Cloud free-tier accounts, so\n * `N + 1` concurrent calls against `N` such accounts run `N` immediately and queue the\n * rest, rather than the `(N+1)`th overrunning whichever account looks \"least busy\" at\n * that instant. Waiting is bounded by the request's own timeout/`AbortSignal`, same as\n * any other in-flight request — it never blocks indefinitely on its own.\n */\n readonly maxConcurrentPerEndpoint?: number | undefined;\n}\n\ninterface CapacityWaiter {\n readonly names: readonly string[];\n readonly resolve: () => void;\n cleanup: () => void;\n}\n\nexport class EndpointRegistry {\n private readonly endpoints: readonly OllamaEndpoint[];\n private readonly failureCounts = new Map<string, number>();\n private readonly lastFailures = new Map<string, number>();\n private readonly failureThreshold: number;\n private readonly cooldownMs: number;\n private readonly now: () => number;\n private readonly strategy: 'priority' | 'round-robin' | 'least-connections';\n private roundRobinCounter = 0;\n private readonly activeCounts = new Map<string, number>();\n private readonly maxConcurrentPerEndpoint: number | undefined;\n private readonly waiters: CapacityWaiter[] = [];\n\n constructor(endpoints: readonly OllamaEndpoint[], options: EndpointRegistryOptions = {}) {\n this.endpoints =\n endpoints.length > 0 ? endpoints : [{ name: 'default', baseUrl: 'http://localhost:11434' }];\n this.failureThreshold = options.failureThreshold ?? 3;\n this.cooldownMs = options.cooldownMs ?? 30_000;\n this.now = options.now ?? Date.now;\n this.strategy = options.strategy ?? 'priority';\n this.maxConcurrentPerEndpoint = options.maxConcurrentPerEndpoint;\n }\n\n /**\n * Marks one more request as in-flight against `name`. Callers (`OllamaClient`) must\n * pair every `acquire` with a `release` once that attempt finishes, success or not —\n * see `OllamaClient.executeWithFailover`. Only affects candidate ordering when\n * `strategy` is `'least-connections'`; harmless (just bookkeeping) otherwise, and\n * always reflected in `status()`'s `activeRequests`.\n */\n acquire(name: string): void {\n this.activeCounts.set(name, (this.activeCounts.get(name) ?? 0) + 1);\n }\n\n /** Releases one in-flight request marked via `acquire`, waking one waiter for `name` if any. */\n release(name: string): void {\n const next = (this.activeCounts.get(name) ?? 0) - 1;\n if (next <= 0) {\n this.activeCounts.delete(name);\n } else {\n this.activeCounts.set(name, next);\n }\n const idx = this.waiters.findIndex((w) => w.names.includes(name));\n if (idx !== -1) {\n const [waiter] = this.waiters.splice(idx, 1);\n waiter?.cleanup();\n waiter?.resolve();\n }\n }\n\n /**\n * `candidates` filtered down to those currently under `maxConcurrentPerEndpoint` (all\n * of them, unchanged, if that option is unset).\n */\n filterWithCapacity(candidates: readonly OllamaEndpoint[]): OllamaEndpoint[] {\n const cap = this.maxConcurrentPerEndpoint;\n if (cap === undefined) return [...candidates];\n return candidates.filter((ep) => (this.activeCounts.get(ep.name) ?? 0) < cap);\n }\n\n /**\n * Resolves once any endpoint named in `names` has spare capacity under\n * `maxConcurrentPerEndpoint` (a no-op resolve if that option is unset, or if one\n * already does). Otherwise queues (FIFO per name) until a matching `release()` frees a\n * slot, or rejects if `signal` aborts first — mirroring whatever aborted it\n * (`OllamaTimeoutError`/the caller's own abort reason) so callers see the same error\n * shape as any other in-flight request that times out or is cancelled. FIFO order is\n * best-effort (a newly-arriving request can still win a race for a slot that just\n * freed) — the capacity cap itself, not fairness, is the guarantee this exists for.\n */\n waitForCapacity(names: readonly string[], signal?: AbortSignal): Promise<void> {\n const cap = this.maxConcurrentPerEndpoint;\n if (cap === undefined) return Promise.resolve();\n if (names.some((n) => (this.activeCounts.get(n) ?? 0) < cap)) return Promise.resolve();\n\n return new Promise<void>((resolve, reject) => {\n const waiter: CapacityWaiter = { names, resolve, cleanup: () => undefined };\n const onAbort = (): void => {\n const idx = this.waiters.indexOf(waiter);\n if (idx !== -1) this.waiters.splice(idx, 1);\n reject(\n signal?.reason instanceof Error\n ? signal.reason\n : new OllamaAbortError('Aborted while waiting for endpoint capacity'),\n );\n };\n if (signal !== undefined) {\n if (signal.aborted) {\n onAbort();\n return;\n }\n signal.addEventListener('abort', onAbort, { once: true });\n waiter.cleanup = () => signal.removeEventListener('abort', onAbort);\n }\n this.waiters.push(waiter);\n });\n }\n\n /**\n * Rotates each same-`priority` group in `sorted` (already sorted highest-priority-first)\n * by one position further per call, wrapping around within the group. Priority tiers\n * themselves are never reordered — only candidates that were already tied.\n */\n private applyRoundRobin(sorted: readonly OllamaEndpoint[]): OllamaEndpoint[] {\n const offset = this.roundRobinCounter++;\n const result: OllamaEndpoint[] = [];\n let i = 0;\n while (i < sorted.length) {\n const priority = sorted[i]?.priority ?? 0;\n let j = i + 1;\n while (j < sorted.length && (sorted[j]?.priority ?? 0) === priority) j++;\n const tier = sorted.slice(i, j);\n const rotation = offset % tier.length;\n result.push(...tier.slice(rotation), ...tier.slice(0, rotation));\n i = j;\n }\n return result;\n }\n\n /**\n * Reorders each same-`priority` group in `sorted` by ascending in-flight request count\n * (from `acquire`/`release`); a stable sort, so candidates tied on active count keep\n * their relative (priority-then-registration) order. Priority tiers themselves are\n * never reordered.\n */\n private applyLeastConnections(sorted: readonly OllamaEndpoint[]): OllamaEndpoint[] {\n const result: OllamaEndpoint[] = [];\n let i = 0;\n while (i < sorted.length) {\n const priority = sorted[i]?.priority ?? 0;\n let j = i + 1;\n while (j < sorted.length && (sorted[j]?.priority ?? 0) === priority) j++;\n const tier = [...sorted.slice(i, j)].sort(\n (a, b) => (this.activeCounts.get(a.name) ?? 0) - (this.activeCounts.get(b.name) ?? 0),\n );\n result.push(...tier);\n i = j;\n }\n return result;\n }\n\n /**\n * Endpoints eligible for `model`, sorted healthy-first-by-priority (falling back to\n * soonest-to-recover if every eligible endpoint is cooling down); same-priority\n * candidates are further reordered per `options.strategy` (see\n * `EndpointRegistryOptions.strategy`). When `model` is given, endpoints whose `models`\n * allow-list doesn't include it are excluded entirely — see `OllamaEndpoint.models`.\n * Omit `model` to consider every configured endpoint, regardless of any `models`\n * restriction (used for non-model-scoped operations).\n */\n candidates(model?: string): OllamaEndpoint[] {\n const currentTime = this.now();\n const scoped =\n model === undefined\n ? this.endpoints\n : this.endpoints.filter((ep) => ep.models === undefined || ep.models.includes(model));\n const healthy: OllamaEndpoint[] = [];\n const coolingDown: Array<{ endpoint: OllamaEndpoint; recoveredAt: number }> = [];\n\n for (const ep of scoped) {\n const failures = this.failureCounts.get(ep.name) ?? 0;\n const lastFail = this.lastFailures.get(ep.name) ?? 0;\n const isCooling =\n failures >= this.failureThreshold && currentTime - lastFail < this.cooldownMs;\n\n if (!isCooling) {\n healthy.push(ep);\n } else {\n coolingDown.push({ endpoint: ep, recoveredAt: lastFail + this.cooldownMs });\n }\n }\n\n if (healthy.length > 0) {\n const sorted = healthy.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n if (this.strategy === 'round-robin') return this.applyRoundRobin(sorted);\n if (this.strategy === 'least-connections') return this.applyLeastConnections(sorted);\n return sorted;\n }\n\n // Fail-open: sort by soonest-to-recover\n return coolingDown.sort((a, b) => a.recoveredAt - b.recoveredAt).map((c) => c.endpoint);\n }\n\n reportSuccess(name: string): void {\n this.failureCounts.delete(name);\n this.lastFailures.delete(name);\n }\n\n reportFailure(name: string): void {\n const current = (this.failureCounts.get(name) ?? 0) + 1;\n this.failureCounts.set(name, current);\n this.lastFailures.set(name, this.now());\n }\n\n list(): readonly OllamaEndpoint[] {\n return this.endpoints;\n }\n\n /** True if any configured endpoint restricts itself to a `models` allow-list. */\n hasModelScopedEndpoints(): boolean {\n return this.endpoints.some((ep) => ep.models !== undefined);\n }\n\n status(): EndpointHealth[] {\n const currentTime = this.now();\n return this.endpoints.map((ep) => {\n const failures = this.failureCounts.get(ep.name) ?? 0;\n const lastFail = this.lastFailures.get(ep.name);\n const isCoolingDown =\n failures >= this.failureThreshold &&\n lastFail !== undefined &&\n currentTime - lastFail < this.cooldownMs;\n\n return {\n endpoint: ep,\n failureCount: failures,\n ...(lastFail !== undefined ? { lastFailureTimestamp: lastFail } : {}),\n isCoolingDown,\n activeRequests: this.activeCounts.get(ep.name) ?? 0,\n };\n });\n }\n}\n","/**\n * Request/response middleware pipeline.\n */\n\nexport interface RequestContext {\n readonly url: string;\n readonly method: string;\n readonly headers: Record<string, string>;\n readonly body?: unknown;\n readonly signal?: AbortSignal;\n}\n\nexport interface ResponseContext {\n readonly status: number;\n readonly headers: Record<string, string>;\n readonly body: unknown;\n}\n\nexport type NextFunction = () => Promise<ResponseContext>;\n\nexport interface MiddlewareContext {\n readonly request: RequestContext;\n readonly next: NextFunction;\n}\n\nexport interface Middleware {\n (ctx: MiddlewareContext): Promise<ResponseContext>;\n}\n\nexport function composeMiddleware(\n middlewares: readonly Middleware[],\n finalHandler: (req: RequestContext) => Promise<ResponseContext>,\n): (req: RequestContext) => Promise<ResponseContext> {\n return function runPipeline(initialRequest: RequestContext): Promise<ResponseContext> {\n let index = -1;\n\n function dispatch(i: number, currentRequest: RequestContext): Promise<ResponseContext> {\n if (i <= index) {\n return Promise.reject(new Error('next() called multiple times in middleware'));\n }\n index = i;\n const fn = middlewares[i];\n if (i === middlewares.length || !fn) {\n return finalHandler(currentRequest);\n }\n return fn({\n request: currentRequest,\n next: () => dispatch(i + 1, currentRequest),\n });\n }\n\n return dispatch(0, initialRequest);\n };\n}\n","/**\n * Cross-runtime helpers with no Node.js API dependency, so they stay safe to import from\n * the core client bundle (see ADR 0006 — Edge Runtime CI).\n */\n\n/**\n * Encodes an image to a base64 string, matching the wire format Ollama's `/api/chat` and\n * `/api/generate` `images` arrays expect.\n *\n * - A `string` is assumed to already be base64-encoded and is returned unchanged.\n * - A `Uint8Array` is base64-encoded using whichever universal primitive the runtime\n * exposes: `Buffer` on Node.js, `btoa` on browsers/Edge runtimes. Chunked so it doesn't\n * blow the engine's max call-stack/argument-count limits on large images.\n */\nexport async function encodeImage(image: Uint8Array | string): Promise<string> {\n if (typeof image === 'string') return image;\n\n const bufferCtor = (\n globalThis as { Buffer?: { from(data: Uint8Array): { toString(encoding: string): string } } }\n ).Buffer;\n if (bufferCtor !== undefined) return bufferCtor.from(image).toString('base64');\n\n const CHUNK_SIZE = 0x8000;\n let binary = '';\n for (let i = 0; i < image.length; i += CHUNK_SIZE) {\n binary += String.fromCharCode(...image.subarray(i, i + CHUNK_SIZE));\n }\n return btoa(binary);\n}\n\nasync function encodeImages(\n images: readonly (string | Uint8Array)[] | undefined,\n): Promise<readonly string[] | undefined> {\n if (images === undefined) return undefined;\n return Promise.all(images.map((image) => encodeImage(image)));\n}\n\n/**\n * Returns `req` unchanged if `req.images` has no `Uint8Array` entries (the common case),\n * otherwise a shallow copy with `images` base64-encoded. Keeps `chat`/`generate` request\n * bodies wire-compatible without requiring callers to pre-encode raw image bytes.\n */\nexport async function withEncodedImages<\n T extends { images?: readonly (string | Uint8Array)[] | undefined },\n>(req: T): Promise<T> {\n if (!req.images?.some((image) => image instanceof Uint8Array)) return req;\n return { ...req, images: await encodeImages(req.images) };\n}\n\n/**\n * Applies {@link withEncodedImages} to each message's `images` array. Returns `messages`\n * unchanged (same reference) if no message carries a `Uint8Array` image.\n */\nexport async function withEncodedMessageImages<\n T extends { images?: readonly (string | Uint8Array)[] | undefined },\n>(messages: readonly T[]): Promise<readonly T[]> {\n if (!messages.some((message) => message.images?.some((image) => image instanceof Uint8Array)))\n return messages;\n return Promise.all(messages.map((message) => withEncodedImages(message)));\n}\n\n// ─── Disposable helpers (TS 5.2+ `using` declarations) ──────────────────\n//\n// These wrappers turn cleanup operations into `Disposable` / `AsyncDisposable`\n// values so callers can use `using` / `await using` declarations instead of\n// try/finally blocks. This eliminates the \"forgot to clean up in the finally\n// block\" bug class for timer, reader, and span lifecycles.\n\n/** Wraps a `setTimeout` handle so `clearTimeout` runs at scope exit. */\nexport function disposableTimer(timer: ReturnType<typeof setTimeout>): Disposable {\n return {\n [Symbol.dispose]() {\n clearTimeout(timer);\n },\n };\n}\n\n/** Wraps a `ReadableStreamDefaultReader` so `cancel()` + `releaseLock()` run at scope exit. */\nexport function disposableReader<T>(reader: ReadableStreamDefaultReader<T>): AsyncDisposable {\n return {\n async [Symbol.asyncDispose]() {\n try {\n await reader.cancel();\n } catch {\n /* stream may already be closed */\n }\n reader.releaseLock();\n },\n };\n}\n\n/** Wraps an OpenTelemetry span so `span.end()` runs at scope exit. */\nexport function disposableSpan(span: { end(): void }): Disposable {\n return {\n [Symbol.dispose]() {\n span.end();\n },\n };\n}\n","/**\n * NDJSON (newline-delimited JSON) stream reader for native fetch Response bodies.\n */\n\nimport { OllamaGenericClientError } from '../errors.js';\nimport { disposableReader } from '../utils.js';\n\n/**\n * Parses a byte stream from fetch body into an async generator of typed JSON chunks.\n */\nexport async function* parseNdjsonStream<T>(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<T, void, undefined> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n await using _reader = disposableReader(reader);\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n // Keep the last partial line in buffer\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n yield JSON.parse(trimmed) as T;\n } catch (err) {\n throw new OllamaGenericClientError(`Failed to parse stream JSON chunk: ${trimmed}`, {\n cause: err,\n });\n }\n }\n }\n\n if (buffer.trim()) {\n yield JSON.parse(buffer.trim()) as T;\n }\n // reader.cancel() + reader.releaseLock() called automatically via `await using _reader`\n}\n","/**\n * Server-Sent Events (SSE) parser for OpenAI/Anthropic-compatible streaming endpoints.\n *\n * Implements standard event-stream field rules without coupling the parser to\n * any provider-specific event schema.\n */\n\nimport { disposableReader } from '../utils.js';\n\nexport interface SseEvent {\n /** Event type; omitted when the server emitted no explicit event field. */\n readonly event?: string | undefined;\n /** Event data with consecutive data fields joined by a newline. */\n readonly data: string;\n /** Last event id associated with this dispatch, when present. */\n readonly id?: string | undefined;\n /** Reconnection delay requested by the server, in milliseconds, when valid. */\n readonly retry?: number | undefined;\n}\n\nfunction dispatch(\n event: string | undefined,\n data: string[],\n id: string | undefined,\n retry: number | undefined,\n): SseEvent | undefined {\n if (data.length === 0) return undefined;\n\n const joined = data.join('\\n');\n return {\n ...(event !== undefined ? { event } : {}),\n data: joined.endsWith('\\n') ? joined.slice(0, -1) : joined,\n ...(id !== undefined ? { id } : {}),\n ...(retry !== undefined ? { retry } : {}),\n };\n}\n\n/**\n * Parses an SSE byte stream into discrete events.\n *\n * Supports CRLF, CR, and LF line endings; comments; repeated data fields;\n * event/id/retry fields; UTF-8 chunks split across arbitrary byte boundaries;\n * and a terminal event without a trailing blank line.\n */\nexport async function* parseSseStream(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<SseEvent, void, undefined> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n\n let buffer = '';\n let eventType: string | undefined;\n let data: string[] = [];\n let lastEventId: string | undefined;\n let retry: number | undefined;\n\n const processLine = (line: string): SseEvent | undefined => {\n if (line.length === 0) {\n const event = dispatch(eventType, data, lastEventId, retry);\n eventType = undefined;\n data = [];\n retry = undefined;\n return event;\n }\n\n if (line.startsWith(':')) return undefined;\n\n const separator = line.indexOf(':');\n const field = separator === -1 ? line : line.slice(0, separator);\n let value = separator === -1 ? '' : line.slice(separator + 1);\n if (value.startsWith(' ')) value = value.slice(1);\n\n switch (field) {\n case 'event':\n eventType = value;\n break;\n case 'data':\n data.push(value);\n break;\n case 'id':\n if (!value.includes('\\0')) lastEventId = value;\n break;\n case 'retry': {\n if (/^\\d+$/.test(value)) {\n const parsed = Number(value);\n if (Number.isSafeInteger(parsed)) retry = parsed;\n }\n break;\n }\n default:\n break;\n }\n\n return undefined;\n };\n\n await using _reader = disposableReader(reader);\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const lf = buffer.indexOf('\\n');\n const cr = buffer.indexOf('\\r');\n if (lf === -1 && cr === -1) break;\n // A CR may be the first half of a CRLF sequence split across two network chunks.\n if (cr !== -1 && lf === -1 && cr === buffer.length - 1) break;\n\n const lineEnd = lf === -1 ? cr : cr === -1 ? lf : Math.min(lf, cr);\n let separatorLength = 1;\n\n if (buffer[lineEnd] === '\\r' && buffer[lineEnd + 1] === '\\n') {\n separatorLength = 2;\n }\n\n const line = buffer.slice(0, lineEnd);\n buffer = buffer.slice(lineEnd + separatorLength);\n\n const event = processLine(line);\n if (event) yield event;\n }\n }\n\n buffer += decoder.decode();\n if (buffer.length > 0) {\n const event = processLine(buffer);\n if (event) yield event;\n }\n\n const terminal = dispatch(eventType, data, lastEventId, retry);\n if (terminal) yield terminal;\n // reader.cancel() + reader.releaseLock() called automatically via `await using _reader`\n}\n","/**\n * Optional OpenTelemetry tracing.\n *\n * `@opentelemetry/api` is an optional peer dependency. When it isn't installed, or when\n * the host process hasn't registered a global TracerProvider, `withSpan` degrades to\n * invoking its callback directly — no spans, no exporters, nothing beyond one cached\n * dynamic `import()` attempt. Once a consumer wires up an OpenTelemetry SDK, spans for\n * HTTP requests, endpoint failover attempts, agent turns, and tool calls appear\n * automatically without any configuration on this SDK's side.\n */\n\nimport type * as Otel from '@opentelemetry/api';\nimport { disposableSpan } from '../utils.js';\n\nexport type SpanAttributeValue = string | number | boolean;\nexport type SpanAttributes = Record<string, SpanAttributeValue | undefined>;\n\nconst INSTRUMENTATION_NAME = '@nemesis-oss/ollama-sdk';\nconst INSTRUMENTATION_VERSION = '1.0.0';\n\nlet apiPromise: Promise<typeof Otel | undefined> | undefined;\n\nfunction loadApi(): Promise<typeof Otel | undefined> {\n apiPromise ??= import('@opentelemetry/api').catch(() => undefined);\n return apiPromise;\n}\n\nfunction cleanAttributes(attributes: SpanAttributes): Record<string, SpanAttributeValue> {\n const clean: Record<string, SpanAttributeValue> = {};\n for (const [key, value] of Object.entries(attributes)) {\n if (value !== undefined) {\n clean[key] = value;\n }\n }\n return clean;\n}\n\n/**\n * Runs `fn` inside an active OpenTelemetry span named `name`, when OpenTelemetry is\n * available. `fn` receives the live span (to add events/attributes as work proceeds) or\n * `undefined` when tracing is a no-op. Exceptions from `fn` are recorded on the span,\n * marked as an error status, and re-thrown unchanged; the span always ends.\n *\n * On success the span status is left `Unset` rather than forced to `Ok` — per the\n * OpenTelemetry spec, `Ok` is final and silently suppresses any later `Error` status.\n * Some call sites (e.g. tool execution, which reports failure via a return value rather\n * than a throw) need to mark a successfully-*returned* span as an error after the fact,\n * via `setSpanError`; leaving success as `Unset` keeps that possible. Backends treat\n * `Unset` the same as `Ok` for filtering purposes.\n */\nexport async function withSpan<T>(\n name: string,\n attributes: SpanAttributes,\n fn: (span: Otel.Span | undefined) => Promise<T>,\n): Promise<T> {\n const api = await loadApi();\n if (!api) {\n return fn(undefined);\n }\n\n const tracer = api.trace.getTracer(INSTRUMENTATION_NAME, INSTRUMENTATION_VERSION);\n return tracer.startActiveSpan(name, async (span) => {\n span.setAttributes(cleanAttributes(attributes));\n using _span = disposableSpan(span);\n try {\n return await fn(span);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n span.recordException(error);\n span.setStatus({ code: api.SpanStatusCode.ERROR, message: error.message });\n throw error;\n }\n // span.end() called automatically via `using _span` at scope exit\n });\n}\n\n/** Adds an attribute/event to `span` if tracing is active; a cheap no-op otherwise. */\nexport function addSpanEvent(\n span: Otel.Span | undefined,\n name: string,\n attributes?: SpanAttributes,\n): void {\n span?.addEvent(name, attributes ? cleanAttributes(attributes) : undefined);\n}\n\n/**\n * Marks a span as failed without throwing — for operations (like tool execution) that\n * report failure through a return value rather than an exception. No-ops when tracing\n * is inactive.\n */\nexport async function setSpanError(span: Otel.Span | undefined, error: Error): Promise<void> {\n if (!span) {\n return;\n }\n const api = await loadApi();\n span.recordException(error);\n span.setStatus({ code: api?.SpanStatusCode.ERROR ?? 2, message: error.message });\n}\n\n// --- Semantic convention attribute keys used by this SDK's instrumentation ---\n// https://opentelemetry.io/docs/specs/semconv/http/http-spans/\nexport const ATTR_HTTP_REQUEST_METHOD = 'http.request.method';\nexport const ATTR_URL_FULL = 'url.full';\nexport const ATTR_SERVER_ADDRESS = 'server.address';\nexport const ATTR_SERVER_PORT = 'server.port';\nexport const ATTR_HTTP_RESPONSE_STATUS_CODE = 'http.response.status_code';\n\n// https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/\nexport const ATTR_GEN_AI_SYSTEM = 'gen_ai.system';\nexport const ATTR_GEN_AI_OPERATION_NAME = 'gen_ai.operation.name';\nexport const ATTR_GEN_AI_REQUEST_MODEL = 'gen_ai.request.model';\nexport const ATTR_GEN_AI_RESPONSE_MODEL = 'gen_ai.response.model';\nexport const ATTR_GEN_AI_USAGE_INPUT_TOKENS = 'gen_ai.usage.input_tokens';\nexport const ATTR_GEN_AI_USAGE_OUTPUT_TOKENS = 'gen_ai.usage.output_tokens';\nexport const ATTR_GEN_AI_TOOL_NAME = 'gen_ai.tool.name';\nexport const ATTR_GEN_AI_TOOL_CALL_ID = 'gen_ai.tool.call.id';\n\n// Attributes specific to this SDK's failover/agent model (no matching semconv entry).\nexport const ATTR_OLLAMA_ENDPOINT_NAME = 'ollama.endpoint.name';\nexport const ATTR_OLLAMA_ENDPOINT_ATTEMPT = 'ollama.endpoint.attempt';\nexport const ATTR_OLLAMA_AGENT_MAX_ITERATIONS = 'ollama.agent.max_iterations';\nexport const ATTR_OLLAMA_AGENT_ITERATION = 'ollama.agent.iteration';\nexport const GEN_AI_SYSTEM_OLLAMA = 'ollama';\n","/**\n * Native fetch HTTP transport client for Ollama API.\n */\n\nimport { mapError } from '../errors.js';\nimport { composeMiddleware, type Middleware, type RequestContext } from '../middleware.js';\nimport type { RequestLifecycleHook } from '../logger.js';\nimport { parseNdjsonStream } from '../streaming/ndjson.js';\nimport { parseSseStream, type SseEvent } from '../streaming/sse.js';\nimport type { AbortableAsyncIterable } from '../streaming/types.js';\nimport {\n withSpan,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_URL_FULL,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n type SpanAttributes,\n} from '../telemetry/index.js';\n\n/** Collapses path segments with high-cardinality values (e.g. blob digests) for span names. */\nfunction routeTemplate(path: string): string {\n return path.replace(/^\\/api\\/blobs\\/.+$/, '/api/blobs/{digest}');\n}\n\nfunction httpSpanAttributes(method: string, url: string): SpanAttributes {\n const target = new URL(url);\n return {\n [ATTR_HTTP_REQUEST_METHOD]: method,\n [ATTR_URL_FULL]: url,\n [ATTR_SERVER_ADDRESS]: target.hostname,\n [ATTR_SERVER_PORT]: target.port ? Number(target.port) : undefined,\n };\n}\n\nexport type FetchLike = typeof globalThis.fetch;\nexport type BinaryBody = Uint8Array | ArrayBuffer | string | Blob | ReadableStream<Uint8Array>;\nexport type HttpBody = unknown;\n\nlet requestSequence = 0;\n\nfunction createRequestId(): string {\n requestSequence += 1;\n return `ollama-http-${requestSequence}`;\n}\n\nfunction sameHeaders(actual: Record<string, string>, expected: Headers): boolean {\n const actualEntries = Object.fromEntries(\n Object.entries(actual).map(([key, value]) => [key.toLowerCase(), value]),\n );\n const expectedEntries = Object.fromEntries(expected.entries());\n const actualKeys = Object.keys(actualEntries);\n const expectedKeys = Object.keys(expectedEntries);\n return (\n actualKeys.length === expectedKeys.length &&\n expectedKeys.every((key) => actualEntries[key] === expectedEntries[key])\n );\n}\n\nexport interface HttpClientOptions {\n readonly baseUrl: string;\n readonly apiKey?: string | undefined;\n readonly headers?: Record<string, string> | undefined;\n readonly fetch?: FetchLike | undefined;\n readonly middleware?: readonly Middleware[] | undefined;\n readonly onLifecycleEvent?: RequestLifecycleHook | undefined;\n /** Reuse a logical request id across endpoint failover/retry attempts. */\n readonly requestId?: string | undefined;\n}\n\nexport interface HttpRequestOptions {\n readonly path: string;\n readonly method?: 'GET' | 'POST' | 'DELETE' | 'HEAD' | undefined;\n readonly body?: HttpBody;\n readonly rawBody?: BinaryBody | undefined;\n readonly headers?: Record<string, string> | undefined;\n readonly signal?: AbortSignal | undefined;\n /**\n * When `true`, return the raw {@link Response} object instead of parsing\n * the body as JSON. Used by callers that need direct access to the\n * streaming body (e.g. {@link src/generated/runtime/runtime.ts} for\n * NDJSON streaming through the runtime seam).\n *\n * The returned `Response` is the same one middleware/retry/telemetry\n * have already processed, so this option does NOT bypass any of the\n * transport-layer concerns.\n */\n readonly raw?: boolean | undefined;\n}\n\nexport class HttpClient {\n readonly baseUrl: string;\n private readonly apiKey?: string | undefined;\n private readonly defaultHeaders: Record<string, string>;\n private readonly fetchImpl: FetchLike;\n private readonly middleware: readonly Middleware[];\n private readonly onLifecycleEvent: RequestLifecycleHook | undefined;\n private readonly requestId?: string | undefined;\n\n constructor(options: HttpClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '');\n this.apiKey = options.apiKey;\n this.defaultHeaders = options.headers ?? {};\n this.fetchImpl = options.fetch ?? globalThis.fetch;\n this.middleware = options.middleware ?? [];\n this.onLifecycleEvent = options.onLifecycleEvent;\n this.requestId = options.requestId;\n }\n\n private buildHeaders(customHeaders?: Record<string, string> | undefined): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders,\n ...customHeaders,\n };\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n return headers;\n }\n\n private async fetchWithMiddleware(request: RequestContext): Promise<Response> {\n const requestId = this.requestId ?? createRequestId();\n const startedAt = Date.now();\n let rawResponse: unknown;\n this.onLifecycleEvent?.({\n type: 'start',\n requestId,\n method: request.method,\n url: request.url,\n timestamp: startedAt,\n });\n\n const finalHandler = async (req: RequestContext): Promise<{\n status: number;\n headers: Record<string, string>;\n body: Response;\n }> => {\n const init: RequestInit = {\n method: req.method,\n headers: req.headers,\n ...(req.body !== undefined ? { body: req.body as NonNullable<RequestInit['body']> } : {}),\n ...(req.signal !== undefined ? { signal: req.signal } : {}),\n };\n const response = await this.fetchImpl(req.url, init);\n rawResponse = response;\n const responseHeaders =\n response.headers && typeof response.headers.entries === 'function'\n ? Object.fromEntries(response.headers.entries())\n : {};\n return {\n status: response.status,\n headers: responseHeaders,\n body: response,\n };\n };\n\n try {\n if (this.middleware.length === 0) {\n const response = await this.fetchImpl(request.url, {\n method: request.method,\n headers: request.headers,\n ...(request.body !== undefined\n ? { body: request.body as NonNullable<RequestInit['body']> }\n : {}),\n ...(request.signal !== undefined ? { signal: request.signal } : {}),\n });\n if (response.status >= 200 && response.status < 300) {\n this.onLifecycleEvent?.({\n type: 'success',\n requestId,\n durationMs: Date.now() - startedAt,\n status: response.status,\n timestamp: Date.now(),\n });\n } else {\n this.onLifecycleEvent?.({\n type: 'error',\n requestId,\n durationMs: Date.now() - startedAt,\n error: mapError(new Error(`HTTP ${response.status}`), {\n request: { method: request.method, url: request.url },\n response: { status: response.status },\n }),\n timestamp: Date.now(),\n });\n }\n return response;\n }\n\n const pipeline = composeMiddleware(this.middleware, finalHandler);\n const context = await pipeline(request);\n\n let response: Response;\n if (rawResponse !== undefined && context.body === rawResponse) {\n response = rawResponse as Response;\n if (\n context.status !== response.status ||\n !sameHeaders(context.headers, response.headers)\n ) {\n const cloned = response.clone();\n response = new Response(cloned.body, {\n status: context.status,\n headers: context.headers,\n });\n }\n } else if (context.body instanceof Response) {\n if (\n context.status === context.body.status &&\n sameHeaders(context.headers, context.body.headers)\n ) {\n response = context.body;\n } else {\n const cloned = context.body.clone();\n response = new Response(cloned.body, {\n status: context.status,\n headers: context.headers,\n });\n }\n } else if (\n context.body === undefined ||\n typeof context.body === 'string' ||\n context.body instanceof ArrayBuffer ||\n ArrayBuffer.isView(context.body) ||\n context.body instanceof Blob ||\n context.body instanceof ReadableStream\n ) {\n response = new Response(context.body as RequestInit['body'], {\n status: context.status,\n headers: context.headers,\n });\n } else {\n response = new Response(JSON.stringify(context.body), {\n status: context.status,\n headers: context.headers,\n });\n }\n\n if (context.status >= 200 && context.status < 300) {\n this.onLifecycleEvent?.({\n type: 'success',\n requestId,\n durationMs: Date.now() - startedAt,\n status: context.status,\n timestamp: Date.now(),\n });\n } else {\n this.onLifecycleEvent?.({\n type: 'error',\n requestId,\n durationMs: Date.now() - startedAt,\n error: mapError(new Error(`HTTP ${context.status}`), {\n request: { method: request.method, url: request.url },\n response: { status: context.status, headers: context.headers },\n }),\n timestamp: Date.now(),\n });\n }\n return response;\n } catch (error) {\n const mapped = mapError(error, {\n request: { method: request.method, url: request.url },\n });\n this.onLifecycleEvent?.({\n type: 'error',\n requestId,\n durationMs: Date.now() - startedAt,\n error: mapped,\n timestamp: Date.now(),\n });\n throw mapped;\n }\n }\n\n async request<T>(options: HttpRequestOptions): Promise<T> {\n const url = `${this.baseUrl}${options.path}`;\n const method =\n options.method ??\n (options.body !== undefined || options.rawBody !== undefined ? 'POST' : 'GET');\n const headers = this.buildHeaders(options.headers);\n\n if (options.rawBody !== undefined && !options.headers?.['Content-Type']) {\n delete headers['Content-Type'];\n }\n\n return withSpan(\n `${method} ${routeTemplate(options.path)}`,\n httpSpanAttributes(method, url),\n async (span) => {\n try {\n const bodyInit =\n options.rawBody !== undefined\n ? (options.rawBody as never)\n : options.body !== undefined\n ? JSON.stringify(options.body)\n : undefined;\n\n const response = await this.fetchWithMiddleware({\n url,\n method,\n headers,\n ...(bodyInit !== undefined ? { body: bodyInit } : {}),\n ...(options.signal !== undefined ? { signal: options.signal } : {}),\n });\n span?.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, response.status);\n\n if (!response.ok) {\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n errorBody = await response.text();\n }\n const message =\n typeof errorBody === 'object' && errorBody !== null && 'error' in errorBody\n ? String((errorBody as { error: unknown }).error)\n : `HTTP ${response.status} ${response.statusText}`;\n\n throw mapError(new Error(message), {\n request: { method, url },\n response: { status: response.status, body: errorBody },\n });\n }\n\n if (options.method === 'HEAD' || response.status === 204) {\n return undefined as T;\n }\n\n // Raw mode: return the Response object directly so callers can\n // access the streaming body. Middleware, retry, telemetry, and\n // error-mapping have already run by this point.\n if (options.raw === true) {\n return response as unknown as T;\n }\n\n if (typeof response.text === 'function') {\n const text = await response.text();\n return (text ? JSON.parse(text) : undefined) as T;\n }\n if (typeof response.json === 'function') {\n return (await response.json()) as T;\n }\n return undefined as T;\n } catch (err) {\n throw mapError(err, { request: { method, url } });\n }\n },\n );\n }\n\n /**\n * Opens an event-stream response and exposes parsed SSE events.\n *\n * This is intentionally schema-agnostic so OpenAI and Anthropic compatibility layers\n * can decode their provider-specific event payloads without duplicating transport logic.\n */\n async requestSseStream(options: HttpRequestOptions): Promise<AbortableAsyncIterable<SseEvent>> {\n const url = `${this.baseUrl}${options.path}`;\n const method = options.method ?? 'POST';\n const headers = {\n ...this.buildHeaders(options.headers),\n Accept: 'text/event-stream',\n };\n\n return withSpan(\n `${method} ${routeTemplate(options.path)}`,\n httpSpanAttributes(method, url),\n async (span) => {\n try {\n const controller = new AbortController();\n const removeAbortListener =\n options.signal !== undefined\n ? (() => {\n if (options.signal.aborted) {\n controller.abort(options.signal.reason);\n } else {\n const onAbort = (): void => controller.abort(options.signal?.reason);\n options.signal.addEventListener('abort', onAbort, { once: true });\n return () => options.signal?.removeEventListener('abort', onAbort);\n }\n return undefined;\n })()\n : undefined;\n\n const response = await this.fetchWithMiddleware({\n url,\n method,\n headers,\n ...(options.body !== undefined ? { body: JSON.stringify(options.body) } : {}),\n signal: controller.signal,\n });\n span?.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, response.status);\n\n if (!response.ok) {\n removeAbortListener?.();\n const errorText = await response.text();\n throw mapError(new Error(errorText || `HTTP ${response.status}`), {\n request: { method, url },\n response: { status: response.status, body: errorText },\n });\n }\n\n if (!response.body) {\n removeAbortListener?.();\n throw mapError(new Error('Response body is null, cannot stream SSE'), {\n request: { method, url },\n });\n }\n\n const stream = (async function* (): AsyncGenerator<SseEvent, void, undefined> {\n try {\n yield* parseSseStream(response.body!);\n } finally {\n removeAbortListener?.();\n }\n })();\n\n return {\n [Symbol.asyncIterator]() {\n return stream[Symbol.asyncIterator]();\n },\n abort: () => {\n removeAbortListener?.();\n controller.abort();\n },\n } as AbortableAsyncIterable<SseEvent>;\n } catch (err) {\n throw mapError(err, { request: { method, url } });\n }\n },\n );\n }\n\n async requestStream<T>(options: HttpRequestOptions): Promise<AbortableAsyncIterable<T>> {\n const url = `${this.baseUrl}${options.path}`;\n const method = options.method ?? 'POST';\n const headers = this.buildHeaders(options.headers);\n\n return withSpan(\n `${method} ${routeTemplate(options.path)}`,\n httpSpanAttributes(method, url),\n async (span) => {\n try {\n const controller = new AbortController();\n const removeAbortListener =\n options.signal !== undefined\n ? (() => {\n if (options.signal.aborted) {\n controller.abort(options.signal.reason);\n } else {\n const onAbort = (): void => controller.abort(options.signal?.reason);\n options.signal.addEventListener('abort', onAbort, { once: true });\n return () => options.signal?.removeEventListener('abort', onAbort);\n }\n return undefined;\n })()\n : undefined;\n\n const response = await this.fetchWithMiddleware({\n url,\n method,\n headers,\n ...(options.body !== undefined ? { body: JSON.stringify(options.body) } : {}),\n signal: controller.signal,\n });\n span?.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, response.status);\n\n if (!response.ok) {\n removeAbortListener?.();\n const errorText = await response.text();\n throw mapError(new Error(errorText || `HTTP ${response.status}`), {\n request: { method, url },\n response: { status: response.status, body: errorText },\n });\n }\n\n if (!response.body) {\n removeAbortListener?.();\n throw mapError(new Error('Response body is null, cannot stream'), {\n request: { method, url },\n });\n }\n\n const stream = parseNdjsonStream<T>(response.body);\n const abortable: AbortableAsyncIterable<T> = {\n [Symbol.asyncIterator]() {\n return (async function* (): AsyncGenerator<T, void, undefined> {\n try {\n yield* stream;\n } finally {\n removeAbortListener?.();\n }\n })()[Symbol.asyncIterator]();\n },\n abort: () => {\n removeAbortListener?.();\n controller.abort();\n },\n };\n return abortable;\n } catch (err) {\n throw mapError(err, { request: { method, url } });\n }\n },\n );\n }\n}\n","/**\n * Active endpoint health pinging utility.\n */\n\nimport { HttpClient, type FetchLike } from '../transport/http.js';\nimport type { OllamaEndpoint } from './endpoint-registry.js';\nimport type { Middleware } from '../middleware.js';\nimport type { RequestLifecycleHook } from '../logger.js';\nimport type { VersionResponse } from '../types.js';\nimport { disposableTimer } from '../utils.js';\n\nexport interface EndpointHealthCheckResult {\n readonly name: string;\n readonly baseUrl: string;\n readonly reachable: boolean;\n readonly latencyMs: number;\n readonly version?: string;\n readonly error?: string;\n}\n\nexport async function checkEndpointHealth(\n endpoint: OllamaEndpoint,\n fetchImpl?: FetchLike,\n timeoutMs = 5000,\n middleware?: readonly Middleware[] | undefined,\n onLifecycleEvent?: RequestLifecycleHook | undefined,\n): Promise<EndpointHealthCheckResult> {\n const client = new HttpClient({\n baseUrl: endpoint.baseUrl,\n apiKey: endpoint.apiKey,\n headers: endpoint.headers,\n fetch: fetchImpl,\n middleware,\n onLifecycleEvent,\n });\n\n const startTime = Date.now();\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n using _timer = disposableTimer(timer);\n\n try {\n const res = await client.request<VersionResponse>({\n path: '/api/version',\n method: 'GET',\n signal: controller.signal,\n });\n const latencyMs = Date.now() - startTime;\n return {\n name: endpoint.name,\n baseUrl: endpoint.baseUrl,\n reachable: true,\n latencyMs,\n version: res.version,\n };\n } catch (err) {\n const latencyMs = Date.now() - startTime;\n return {\n name: endpoint.name,\n baseUrl: endpoint.baseUrl,\n reachable: false,\n latencyMs,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n // clearTimeout(timer) called automatically via `using _timer` at scope exit\n}\n","/**\n * Model capability detection and runtime environment inference.\n */\n\nimport { HttpClient } from '../transport/http.js';\nimport type { ListResponse, ModelResponse, ShowResponse, ThinkingMetadata } from '../types.js';\n\nexport type RuntimeMode = 'local' | 'cloud' | 'unknown';\n\nexport interface ModelCapabilities {\n readonly model: string;\n readonly reported: readonly string[];\n readonly supportsTools: boolean;\n readonly supportsVision: boolean;\n readonly supportsEmbedding: boolean;\n readonly supportsCompletion: boolean;\n readonly supportsThinking: boolean;\n /** Model-defined thinking values and default, when /api/show reports them. */\n readonly thinking?: ThinkingMetadata | undefined;\n readonly supportsStreaming: true;\n /** Maximum model context length reported by /api/show model_info, when available. */\n readonly contextLength?: number | undefined;\n /**\n * Best-effort inference, not a guarantee: Ollama's `/api/show` does not report structured\n * output support as a queryable capability, so this is inferred from {@link inferRuntimeMode}\n * — `false` for `cloud`, since Ollama Cloud does not currently support structured outputs;\n * `true` for `local`/`unknown`. A locally-hosted model that genuinely can't follow a JSON\n * schema will still report `true` here; the request itself is the only reliable way to find\n * out. `OllamaClient.chat`/`generate` apply this same inference as a fail-fast pre-flight\n * guard whenever `format` is set, throwing `OllamaUnsupportedCapabilityError` rather than\n * making a network call that Ollama Cloud is known to reject.\n */\n readonly supportsStructuredOutputRequest: boolean;\n}\n\nexport function inferRuntimeMode(baseUrl: string): RuntimeMode {\n try {\n const url = new URL(baseUrl);\n const host = url.hostname.toLowerCase();\n if (\n host === 'localhost' ||\n host === '127.0.0.1' ||\n host === '::1' ||\n host.endsWith('.local') ||\n host.startsWith('192.168.') ||\n host.startsWith('10.')\n ) {\n return 'local';\n }\n return 'cloud';\n } catch {\n return 'unknown';\n }\n}\n\nfunction extractContextLength(modelInfo?: Record<string, unknown>): number | undefined {\n if (!modelInfo) return undefined;\n for (const [key, value] of Object.entries(modelInfo)) {\n if (\n key.endsWith('.context_length') &&\n typeof value === 'number' &&\n Number.isFinite(value) &&\n value > 0\n ) {\n return value;\n }\n }\n return undefined;\n}\n\nexport async function detectModelCapabilities(\n http: HttpClient,\n model: string,\n signal?: AbortSignal,\n): Promise<ModelCapabilities> {\n const showRes = await http.request<ShowResponse>({\n path: '/api/show',\n body: { model },\n ...(signal !== undefined ? { signal } : {}),\n });\n\n const reported = showRes.capabilities ?? [];\n const reportedSet = new Set(reported.map((c) => c.toLowerCase()));\n\n const contextLength = extractContextLength(showRes.model_info);\n\n return {\n model,\n reported,\n supportsTools: reportedSet.has('tools'),\n supportsVision: reportedSet.has('vision'),\n supportsEmbedding: reportedSet.has('embedding'),\n supportsCompletion: reportedSet.has('completion') || !reportedSet.has('embedding'),\n supportsThinking: reportedSet.has('thinking'),\n ...(showRes.thinking !== undefined ? { thinking: showRes.thinking } : {}),\n ...(contextLength !== undefined ? { contextLength } : {}),\n supportsStreaming: true,\n supportsStructuredOutputRequest: inferRuntimeMode(http.baseUrl) !== 'cloud',\n };\n}\n\nexport async function listAvailableModels(http: HttpClient): Promise<ModelResponse[]> {\n const res = await http.request<ListResponse>({\n path: '/api/tags',\n method: 'GET',\n });\n return [...res.models];\n}\n","/**\n * Zod schema conversion to JSON Schema for Ollama structured outputs.\n */\n\nimport { z } from 'zod';\nimport { OllamaToolValidationError } from '../errors.js';\n\nexport type SupportedSchema<T = unknown> = z.ZodType<T>;\n\nfunction extractJsonSubstring(text: string): string {\n const trimmed = text.trim();\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n return trimmed;\n }\n const match = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/);\n if (match && match[1]) {\n return match[1].trim();\n }\n const firstBrace = trimmed.indexOf('{');\n const lastBrace = trimmed.lastIndexOf('}');\n if (firstBrace !== -1 && lastBrace > firstBrace) {\n return trimmed.slice(firstBrace, lastBrace + 1);\n }\n return trimmed;\n}\n\n/**\n * Best-effort structural JSON Schema conversion for Zod v3 schemas, which lack a\n * native `toJSONSchema` API. Walks the internal `_def` shape that v3 exposes.\n */\nexport function zodV3ToJsonSchema(schema: unknown): Record<string, unknown> {\n const def = (schema as { _def?: { typeName?: string; [key: string]: unknown } })._def;\n if (!def) {\n return { type: 'object' };\n }\n\n switch (def['typeName']) {\n case 'ZodObject': {\n const shape = (def['shape'] as () => Record<string, unknown>)();\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = zodV3ToJsonSchema(value);\n if (!isZodV3Optional(value)) {\n required.push(key);\n }\n }\n return {\n type: 'object',\n properties,\n ...(required.length > 0 ? { required } : {}),\n };\n }\n case 'ZodString':\n return { type: 'string' };\n case 'ZodNumber':\n return { type: 'number' };\n case 'ZodBoolean':\n return { type: 'boolean' };\n case 'ZodDate':\n return { type: 'string', format: 'date-time' };\n case 'ZodArray':\n return { type: 'array', items: zodV3ToJsonSchema(def['type']) };\n case 'ZodEnum':\n return { type: 'string', enum: def['values'] };\n case 'ZodNativeEnum':\n return { enum: Object.values(def['values'] as Record<string, unknown>) };\n case 'ZodLiteral':\n return { const: def['value'] };\n case 'ZodOptional':\n case 'ZodNullable':\n case 'ZodDefault':\n return zodV3ToJsonSchema(def['innerType']);\n case 'ZodEffects':\n return zodV3ToJsonSchema(def['schema']);\n case 'ZodUnion':\n return { anyOf: (def['options'] as unknown[]).map((option) => zodV3ToJsonSchema(option)) };\n case 'ZodRecord':\n return { type: 'object', additionalProperties: zodV3ToJsonSchema(def['valueType']) };\n default:\n return { type: 'object' };\n }\n}\n\nfunction isZodV3Optional(schema: unknown): boolean {\n const typeName = (schema as { _def?: { typeName?: string } })._def?.typeName;\n return typeName === 'ZodOptional' || typeName === 'ZodDefault';\n}\n\n/**\n * Converts a Zod schema into a JSON Schema object accepted by Ollama's `format` parameter.\n *\n * Uses Zod v4's native `z.toJSONSchema` when available, falling back to a structural\n * walk of Zod v3's internal `_def` shape so both major versions work as peer dependencies.\n */\nexport function zodToJsonSchema<T>(schema: z.ZodType<T>): Record<string, unknown> {\n if (\n typeof (z as { toJSONSchema?: (s: z.ZodType<T>) => Record<string, unknown> }).toJSONSchema ===\n 'function'\n ) {\n return (\n z as unknown as { toJSONSchema: (s: z.ZodType<T>) => Record<string, unknown> }\n ).toJSONSchema(schema);\n }\n\n return zodV3ToJsonSchema(schema);\n}\n\n/**\n * Parses and validates a JSON output string against a Zod schema.\n */\nexport function parseStructuredOutput<T>(\n rawJson: string,\n schema: z.ZodType<T>,\n toolName = 'structured_output',\n): T {\n let parsed: unknown;\n const jsonStr = extractJsonSubstring(rawJson);\n try {\n parsed = JSON.parse(jsonStr);\n } catch (err) {\n throw new OllamaToolValidationError(`Failed to parse structured output as JSON: ${rawJson}`, {\n toolName,\n cause: err,\n });\n }\n\n const result = schema.safeParse(parsed);\n if (!result.success) {\n throw new OllamaToolValidationError(`Structured output failed schema validation`, {\n toolName,\n issues: result.error.issues,\n cause: result.error,\n });\n }\n\n return result.data;\n}\n","/**\n * Token usage and duration calculation utilities.\n */\n\nexport const NANOS_PER_MS = 1_000_000;\nexport const NANOS_PER_SECOND = 1_000_000_000;\n\nexport interface TokenUsage {\n readonly promptTokens: number;\n /** Prompt tokens read from Ollama's KV cache. */\n readonly cachedPromptTokens?: number | undefined;\n readonly completionTokens: number;\n readonly totalTokens: number;\n readonly tokensPerSecond?: number | undefined;\n readonly loadDurationMs?: number | undefined;\n readonly promptEvalDurationMs?: number | undefined;\n readonly evalDurationMs?: number | undefined;\n readonly totalDurationMs?: number | undefined;\n}\n\nexport interface RawUsageSource {\n readonly prompt_eval_count?: number | undefined;\n readonly prompt_eval_cached_count?: number | undefined;\n readonly eval_count?: number | undefined;\n readonly total_duration?: number | undefined;\n readonly load_duration?: number | undefined;\n readonly prompt_eval_duration?: number | undefined;\n readonly eval_duration?: number | undefined;\n}\n\n/**\n * Extracts and normalizes token usage metrics from an Ollama response.\n */\nexport function extractUsage(raw: RawUsageSource): TokenUsage {\n const promptTokens = raw.prompt_eval_count ?? 0;\n const completionTokens = raw.eval_count ?? 0;\n const totalTokens = promptTokens + completionTokens;\n\n let tokensPerSecond: number | undefined;\n if (raw.eval_count && raw.eval_duration && raw.eval_duration > 0) {\n tokensPerSecond = Number(((raw.eval_count / raw.eval_duration) * NANOS_PER_SECOND).toFixed(2));\n }\n\n return {\n promptTokens,\n ...(raw.prompt_eval_cached_count !== undefined\n ? { cachedPromptTokens: raw.prompt_eval_cached_count }\n : {}),\n completionTokens,\n totalTokens,\n ...(tokensPerSecond !== undefined ? { tokensPerSecond } : {}),\n ...(raw.load_duration !== undefined\n ? { loadDurationMs: raw.load_duration / NANOS_PER_MS }\n : {}),\n ...(raw.prompt_eval_duration !== undefined\n ? { promptEvalDurationMs: raw.prompt_eval_duration / NANOS_PER_MS }\n : {}),\n ...(raw.eval_duration !== undefined\n ? { evalDurationMs: raw.eval_duration / NANOS_PER_MS }\n : {}),\n ...(raw.total_duration !== undefined\n ? { totalDurationMs: raw.total_duration / NANOS_PER_MS }\n : {}),\n };\n}\n","/**\n * Synthetic tool-call ID generation.\n *\n * Ollama's native `/api/chat` protocol does not assign an identifier to a tool call —\n * see the {@link ToolCall} docs in `../types.js`. To let consumers correlate a tool\n * result back to its call the way OpenAI's `tool_call_id` does (useful for logging,\n * OpenAI-shaped transcripts, or just not having to track array position by hand), the\n * SDK synthesizes a stable client-side `id` the first time it sees a tool call that\n * doesn't already have one, and reuses that same id everywhere that call is referenced\n * (the streamed `tool_call` event, the final aggregated message, `ToolExecutionResult`,\n * and the `role: 'tool'` history entry `Agent` appends). It has no meaning to Ollama or\n * the model itself — it's purely a client-side bookkeeping aid.\n *\n * Uses the global Web Crypto `crypto.randomUUID()` (available in Node 20+, browsers, and\n * every Edge runtime this SDK targets) rather than `node:crypto`, which would break Edge\n * Runtime compatibility (see ADR 0006).\n */\n\nimport type { ToolCall } from '../types.js';\n\nexport function generateToolCallId(): string {\n return `call_${crypto.randomUUID()}`;\n}\n\n/**\n * Returns `toolCalls` with every entry guaranteed to have an `id`, generating one for any\n * entry that lacks it. Entries that already have an `id` (e.g. re-processed calls) are\n * left untouched so ids stay stable across repeated calls on the same data.\n */\nexport function ensureToolCallIds(\n toolCalls: readonly ToolCall[] | undefined,\n): readonly ToolCall[] | undefined {\n if (!toolCalls || toolCalls.length === 0) {\n return toolCalls;\n }\n return toolCalls.map((tc) => (tc.id !== undefined ? tc : { ...tc, id: generateToolCallId() }));\n}\n","/**\n * Dual-mode (AsyncIterator and EventEmitter-like) stream wrapper.\n */\n\nimport { mapError, OllamaAbortError, type OllamaClientError } from '../errors.js';\nimport type { AbortableAsyncIterable, OllamaStreamEvent, OllamaStreamEventType } from './types.js';\n\ntype ChunkMapper<TChunk, TFinal> = (\n chunk: TChunk,\n accumulated: TFinal,\n) => Array<OllamaStreamEvent<TChunk, TFinal>>;\n\ntype Aggregator<TChunk, TFinal> = (accumulated: TFinal, chunk: TChunk) => TFinal;\n\ntype Listener<TChunk, TFinal> = (event: OllamaStreamEvent<TChunk, TFinal>) => void;\n\nexport class OllamaStream<TChunk, TFinal> implements AsyncIterable<\n OllamaStreamEvent<TChunk, TFinal>\n> {\n private mode: 'unconsumed' | 'iterator' | 'events' = 'unconsumed';\n private readonly listeners = new Map<string, Set<Listener<TChunk, TFinal>>>();\n private readonly finalResultPromise: Promise<TFinal>;\n private resolveFinal!: (value: TFinal) => void;\n private rejectFinal!: (reason: OllamaClientError) => void;\n private removeAbortListener: (() => void) | undefined;\n\n constructor(\n private readonly source: AbortableAsyncIterable<TChunk>,\n private readonly mapChunk: ChunkMapper<TChunk, TFinal>,\n private readonly aggregate: Aggregator<TChunk, TFinal>,\n private readonly initial: TFinal,\n signal?: AbortSignal,\n ) {\n this.finalResultPromise = new Promise<TFinal>((resolve, reject) => {\n this.resolveFinal = resolve;\n this.rejectFinal = reject;\n });\n\n if (signal !== undefined) {\n const onAbort = (): void => this.abort();\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener('abort', onAbort, { once: true });\n this.removeAbortListener = () => signal.removeEventListener('abort', onAbort);\n }\n }\n }\n\n get finalResult(): Promise<TFinal> {\n return this.finalResultPromise;\n }\n\n abort(): void {\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n this.source.abort?.();\n this.rejectFinal(new OllamaAbortError('Ollama stream aborted'));\n }\n\n on<TType extends OllamaStreamEventType>(\n type: TType,\n listener: (event: Extract<OllamaStreamEvent<TChunk, TFinal>, { type: TType }>) => void,\n ): () => void {\n if (this.mode === 'iterator') {\n throw new Error(\n 'Cannot register event listeners: this stream is already being consumed via async iteration.',\n );\n }\n\n const genericListener = listener as Listener<TChunk, TFinal>;\n let set = this.listeners.get(type);\n if (!set) {\n set = new Set();\n this.listeners.set(type, set);\n }\n set.add(genericListener);\n\n if (this.mode !== 'events') {\n this.mode = 'events';\n void this.pump();\n }\n\n return () => {\n set?.delete(genericListener);\n };\n }\n\n private emit(event: OllamaStreamEvent<TChunk, TFinal>): void {\n for (const listener of this.listeners.get(event.type) ?? []) {\n listener(event);\n }\n }\n\n private async pump(): Promise<void> {\n let accumulated = this.initial;\n try {\n for await (const chunk of this.source) {\n accumulated = this.aggregate(accumulated, chunk);\n for (const event of this.mapChunk(chunk, accumulated)) {\n this.emit(event);\n if (event.type === 'done') {\n this.resolveFinal(event.data.result);\n }\n }\n }\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n } catch (error) {\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n const mapped = mapError(error);\n this.emit({ type: 'error', data: { error: mapped } });\n this.rejectFinal(mapped);\n }\n }\n\n async *[Symbol.asyncIterator](): AsyncGenerator<\n OllamaStreamEvent<TChunk, TFinal>,\n void,\n undefined\n > {\n if (this.mode === 'events') {\n throw new Error(\n 'Cannot use async iteration: this stream already has event listeners registered via .on().',\n );\n }\n this.mode = 'iterator';\n let accumulated = this.initial;\n let completed = false;\n try {\n for await (const chunk of this.source) {\n accumulated = this.aggregate(accumulated, chunk);\n const events = this.mapChunk(chunk, accumulated);\n for (const event of events) {\n if (event.type === 'done') {\n completed = true;\n this.resolveFinal(event.data.result);\n }\n yield event;\n }\n }\n } catch (error) {\n const mapped = mapError(error);\n this.rejectFinal(mapped);\n yield { type: 'error', data: { error: mapped } };\n } finally {\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n if (!completed) {\n this.source.abort?.();\n this.rejectFinal(new OllamaAbortError('Ollama stream ended before completion'));\n }\n }\n }\n}\n","/**\n * Normalization mappers and aggregators for Ollama streaming responses.\n */\n\nimport type { ChatResponse, GenerateResponse, ProgressResponse } from '../types.js';\nimport { extractUsage, NANOS_PER_MS } from '../usage.js';\nimport { ensureToolCallIds } from '../tools/tool-call-id.js';\nimport { OllamaStream } from './stream.js';\nimport type {\n AbortableAsyncIterable,\n ChatStreamResult,\n GenerateStreamResult,\n OllamaStreamEvent,\n ProgressStreamResult,\n} from './types.js';\n\nfunction aggregateChat(accumulated: ChatStreamResult, chunk: ChatResponse): ChatStreamResult {\n const message = chunk.message ?? { role: 'assistant', content: '' };\n return {\n message: {\n role: message.role || accumulated.message.role,\n content: accumulated.message.content + (message.content ?? ''),\n thinking:\n message.thinking !== undefined\n ? (accumulated.message.thinking ?? '') + message.thinking\n : accumulated.message.thinking,\n tool_calls: message.tool_calls?.length\n ? [...(accumulated.message.tool_calls ?? []), ...message.tool_calls]\n : accumulated.message.tool_calls,\n },\n model: chunk.model,\n done: chunk.done,\n doneReason: chunk.done ? chunk.done_reason : accumulated.doneReason,\n totalDurationMs:\n chunk.done && chunk.total_duration !== undefined\n ? chunk.total_duration / NANOS_PER_MS\n : accumulated.totalDurationMs,\n usage: chunk.done ? extractUsage(chunk) : accumulated.usage,\n raw: chunk,\n };\n}\n\nfunction mapChatChunk(\n chunk: ChatResponse,\n aggregated: ChatStreamResult,\n): Array<OllamaStreamEvent<ChatResponse, ChatStreamResult>> {\n const events: Array<OllamaStreamEvent<ChatResponse, ChatStreamResult>> = [];\n const message = chunk.message;\n\n if (message?.thinking) {\n events.push({ type: 'thinking', data: { delta: message.thinking } });\n }\n for (const toolCall of message?.tool_calls ?? []) {\n events.push({ type: 'tool_call', data: { toolCall } });\n }\n if (message?.content) {\n events.push({ type: 'token', data: { delta: message.content, role: message.role } });\n }\n events.push({ type: 'message', data: { chunk } });\n if (chunk.done) {\n events.push({ type: 'done', data: { result: aggregated } });\n }\n return events;\n}\n\n/**\n * Wraps `source` so every chunk's `message.tool_calls` carries a stable client-synthesized\n * `id` (see `../tools/tool-call-id.js`) before it reaches either the aggregator or the\n * per-chunk event mapper — both read the same chunk object, so ids must be assigned exactly\n * once here rather than independently in each, or the streamed `tool_call` event and the\n * final aggregated message would end up with two different ids for the same call.\n */\nfunction withStableToolCallIds(\n source: AbortableAsyncIterable<ChatResponse>,\n): AbortableAsyncIterable<ChatResponse> {\n async function* generator(): AsyncGenerator<ChatResponse, void, undefined> {\n for await (const chunk of source) {\n const toolCalls = chunk.message?.tool_calls;\n if (!toolCalls?.length) {\n yield chunk;\n continue;\n }\n yield { ...chunk, message: { ...chunk.message, tool_calls: ensureToolCallIds(toolCalls) } };\n }\n }\n return Object.assign(generator(), { abort: source.abort });\n}\n\nexport function normalizeChatStream(\n source: AbortableAsyncIterable<ChatResponse>,\n signal?: AbortSignal,\n): OllamaStream<ChatResponse, ChatStreamResult> {\n const initial: ChatStreamResult = {\n message: { role: 'assistant', content: '' },\n model: '',\n done: false,\n };\n return new OllamaStream(withStableToolCallIds(source), mapChatChunk, aggregateChat, initial, signal);\n}\n\nfunction aggregateGenerate(\n accumulated: GenerateStreamResult,\n chunk: GenerateResponse,\n): GenerateStreamResult {\n return {\n response: accumulated.response + (chunk.response ?? ''),\n model: chunk.model,\n done: chunk.done,\n doneReason: chunk.done ? chunk.done_reason : accumulated.doneReason,\n totalDurationMs:\n chunk.done && chunk.total_duration !== undefined\n ? chunk.total_duration / NANOS_PER_MS\n : accumulated.totalDurationMs,\n usage: chunk.done ? extractUsage(chunk) : accumulated.usage,\n thinking:\n chunk.thinking !== undefined\n ? (accumulated.thinking ?? '') + chunk.thinking\n : accumulated.thinking,\n image: chunk.image ?? accumulated.image,\n completed: chunk.completed ?? accumulated.completed,\n total: chunk.total ?? accumulated.total,\n raw: chunk,\n };\n}\n\nfunction mapGenerateChunk(\n chunk: GenerateResponse,\n aggregated: GenerateStreamResult,\n): Array<OllamaStreamEvent<GenerateResponse, GenerateStreamResult>> {\n const events: Array<OllamaStreamEvent<GenerateResponse, GenerateStreamResult>> = [];\n\n if (chunk.thinking) {\n events.push({ type: 'thinking', data: { delta: chunk.thinking } });\n }\n if (chunk.response) {\n events.push({ type: 'token', data: { delta: chunk.response, role: 'assistant' } });\n }\n events.push({ type: 'message', data: { chunk } });\n if (chunk.done) {\n events.push({ type: 'done', data: { result: aggregated } });\n }\n return events;\n}\n\nexport function normalizeGenerateStream(\n source: AbortableAsyncIterable<GenerateResponse>,\n signal?: AbortSignal,\n): OllamaStream<GenerateResponse, GenerateStreamResult> {\n const initial: GenerateStreamResult = { response: '', model: '', done: false };\n return new OllamaStream(source, mapGenerateChunk, aggregateGenerate, initial, signal);\n}\n\nfunction aggregateProgress(\n _accumulated: ProgressStreamResult,\n chunk: ProgressResponse,\n): ProgressStreamResult {\n return {\n status: chunk.status,\n completed: chunk.completed,\n total: chunk.total,\n done: chunk.status === 'success',\n raw: chunk,\n };\n}\n\nfunction mapProgressChunk(\n chunk: ProgressResponse,\n aggregated: ProgressStreamResult,\n): Array<OllamaStreamEvent<ProgressResponse, ProgressStreamResult>> {\n const events: Array<OllamaStreamEvent<ProgressResponse, ProgressStreamResult>> = [\n { type: 'message', data: { chunk } },\n ];\n if (chunk.status === 'success') {\n events.push({ type: 'done', data: { result: aggregated } });\n }\n return events;\n}\n\nexport function normalizeProgressStream(\n source: AbortableAsyncIterable<ProgressResponse>,\n signal?: AbortSignal,\n): OllamaStream<ProgressResponse, ProgressStreamResult> {\n const initial: ProgressStreamResult = { status: '', done: false };\n return new OllamaStream(source, mapProgressChunk, aggregateProgress, initial, signal);\n}\n","/**\n * Exponential backoff with full jitter calculation.\n */\n\nexport interface BackoffOptions {\n readonly initialDelayMs: number;\n readonly maxDelayMs: number;\n readonly backoffFactor: number;\n}\n\nexport const DEFAULT_BACKOFF: BackoffOptions = {\n initialDelayMs: 500,\n maxDelayMs: 30_000,\n backoffFactor: 2,\n};\n\n/**\n * Calculates exponential backoff with full jitter for attempt (0-indexed).\n */\nexport function calculateBackoff(\n attempt: number,\n options: BackoffOptions = DEFAULT_BACKOFF,\n): number {\n const exponential = options.initialDelayMs * Math.pow(options.backoffFactor, attempt);\n const ceiling = Math.min(exponential, options.maxDelayMs);\n // Full jitter: random duration between 0 and ceiling\n return Math.floor(Math.random() * (ceiling + 1));\n}\n","/**\n * Retry policy and execution runner.\n */\n\nimport { OllamaAbortError, OllamaClientError } from '../errors.js';\nimport { calculateBackoff, type BackoffOptions, DEFAULT_BACKOFF } from './backoff.js';\n\nexport interface RetryConfig {\n readonly maxRetries: number;\n readonly backoff: BackoffOptions;\n readonly shouldRetry?: (error: Error, attempt: number) => boolean;\n readonly onRetry?: (error: Error, attempt: number, delayMs: number) => void;\n}\n\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 3,\n backoff: DEFAULT_BACKOFF,\n};\n\nfunction isRetryableDefault(error: Error): boolean {\n if (error instanceof OllamaClientError) {\n return error.retryable;\n }\n return false;\n}\n\nfunction abortError(\n signal: AbortSignal | undefined,\n fallbackMessage: string,\n): OllamaAbortError | OllamaClientError {\n const reason = signal?.reason;\n if (reason instanceof OllamaClientError) return reason;\n return new OllamaAbortError(\n reason instanceof Error && reason.message ? reason.message : fallbackMessage,\n { cause: reason },\n );\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(abortError(signal, 'Retry backoff aborted'));\n return;\n }\n\n const timerId = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = (): void => {\n if (timerId !== undefined) clearTimeout(timerId);\n signal?.removeEventListener('abort', onAbort);\n reject(abortError(signal, 'Retry backoff aborted'));\n };\n\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/**\n * Executes an async operation with retries according to config.\n */\nexport async function withRetry<T>(\n operation: (attempt: number) => Promise<T>,\n config: RetryConfig = DEFAULT_RETRY_CONFIG,\n signal?: AbortSignal,\n): Promise<T> {\n let attempt = 0;\n while (true) {\n try {\n return await operation(attempt);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n const shouldRetry = config.shouldRetry ?? isRetryableDefault;\n if (attempt >= config.maxRetries || !shouldRetry(error, attempt)) {\n throw error;\n }\n const delayMs = calculateBackoff(attempt, config.backoff);\n config.onRetry?.(error, attempt, delayMs);\n await sleep(delayMs, signal);\n attempt += 1;\n }\n }\n}\n","/**\n * AbortSignal and timeout management for HTTP requests.\n */\n\nimport { OllamaTimeoutError } from '../errors.js';\n\nexport interface TimeoutSignal {\n readonly signal: AbortSignal;\n readonly cancel: () => void;\n}\n\n/**\n * Combines an optional timeout with an optional caller-provided AbortSignal.\n */\nexport function createTimeoutSignal(timeoutMs?: number, userSignal?: AbortSignal): TimeoutSignal {\n if (!timeoutMs && !userSignal) {\n const controller = new AbortController();\n return { signal: controller.signal, cancel: () => undefined };\n }\n\n const controller = new AbortController();\n let timerId: ReturnType<typeof setTimeout> | undefined;\n\n if (timeoutMs && timeoutMs > 0) {\n timerId = setTimeout(() => {\n controller.abort(\n new OllamaTimeoutError(`Request timed out after ${timeoutMs}ms`, { timeoutMs }),\n );\n }, timeoutMs);\n }\n\n const onUserAbort = (): void => {\n if (timerId) clearTimeout(timerId);\n controller.abort(userSignal?.reason);\n };\n\n if (userSignal) {\n if (userSignal.aborted) {\n if (timerId) clearTimeout(timerId);\n controller.abort(userSignal.reason);\n } else {\n userSignal.addEventListener('abort', onUserAbort, { once: true });\n }\n }\n\n const cancel = (): void => {\n if (timerId) clearTimeout(timerId);\n if (userSignal) {\n userSignal.removeEventListener('abort', onUserAbort);\n }\n };\n\n return { signal: controller.signal, cancel };\n}\n","/**\n * Model and blob management operations.\n */\n\nimport { listAvailableModels } from './capabilities/capabilities.js';\nimport { normalizeProgressStream } from './streaming/normalize.js';\nimport type { OllamaStream } from './streaming/stream.js';\nimport type { ProgressStreamResult } from './streaming/types.js';\nimport type { BinaryBody } from './transport/http.js';\nimport type { RequestRunner } from './transport/runner.js';\nimport type {\n CopyRequestOptions,\n CreateRequestOptions,\n DeleteRequestOptions,\n ModelResponse,\n ProgressResponse,\n PsResponse,\n PullRequestOptions,\n PushRequestOptions,\n ShowRequestOptions,\n ShowResponse,\n StatusResponse,\n VersionResponse,\n} from './types.js';\n\n/**\n * Every operation here targets one specific Ollama server's local model catalog or blob\n * store — unlike `chat`/`generate`/`embed`, a different endpoint isn't an interchangeable\n * substitute; it's a different catalog/store entirely. `singleEndpoint: true` disables\n * `OllamaClient`'s cross-endpoint failover for these calls (same-endpoint retry via\n * `withRetry` still applies), so a multi-endpoint setup never silently lists/mutates the\n * wrong server just because the intended one had a transient failure. See ADR 0008.\n */\nexport class ModelsClient {\n constructor(private readonly runner: RequestRunner) {}\n\n list(): Promise<ModelResponse[]> {\n return this.runner((http) => listAvailableModels(http), { singleEndpoint: true });\n }\n\n show(request: ShowRequestOptions): Promise<ShowResponse> {\n return this.runner(\n (http, signal) => http.request<ShowResponse>({ path: '/api/show', body: request, signal }),\n { ...request, singleEndpoint: true },\n );\n }\n\n pull(\n request: PullRequestOptions & { stream: true },\n ): Promise<OllamaStream<ProgressResponse, ProgressStreamResult>>;\n pull(request: PullRequestOptions & { stream?: false | undefined }): Promise<ProgressResponse>;\n pull(\n request: PullRequestOptions,\n ): Promise<ProgressResponse | OllamaStream<ProgressResponse, ProgressStreamResult>>;\n async pull(\n request: PullRequestOptions,\n ): Promise<ProgressResponse | OllamaStream<ProgressResponse, ProgressStreamResult>> {\n if (request.stream) {\n return this.runner(\n async (http, signal) => {\n const stream = await http.requestStream<ProgressResponse>({\n path: '/api/pull',\n body: { ...request, stream: true },\n signal,\n });\n return normalizeProgressStream(stream, signal);\n },\n { ...request, singleEndpoint: true, holdUntil: (stream) => stream.finalResult },\n );\n }\n return this.runner(\n (http, signal) =>\n http.request<ProgressResponse>({\n path: '/api/pull',\n body: { ...request, stream: false },\n signal,\n }),\n { ...request, singleEndpoint: true },\n );\n }\n\n push(\n request: PushRequestOptions & { stream: true },\n ): Promise<OllamaStream<ProgressResponse, ProgressStreamResult>>;\n push(request: PushRequestOptions & { stream?: false | undefined }): Promise<ProgressResponse>;\n push(\n request: PushRequestOptions,\n ): Promise<ProgressResponse | OllamaStream<ProgressResponse, ProgressStreamResult>>;\n async push(\n request: PushRequestOptions,\n ): Promise<ProgressResponse | OllamaStream<ProgressResponse, ProgressStreamResult>> {\n if (request.stream) {\n return this.runner(\n async (http, signal) => {\n const stream = await http.requestStream<ProgressResponse>({\n path: '/api/push',\n body: { ...request, stream: true },\n signal,\n });\n return normalizeProgressStream(stream, signal);\n },\n { ...request, singleEndpoint: true, holdUntil: (stream) => stream.finalResult },\n );\n }\n return this.runner(\n (http, signal) =>\n http.request<ProgressResponse>({\n path: '/api/push',\n body: { ...request, stream: false },\n signal,\n }),\n { ...request, singleEndpoint: true },\n );\n }\n\n create(\n request: CreateRequestOptions & { stream: true },\n ): Promise<OllamaStream<ProgressResponse, ProgressStreamResult>>;\n create(request: CreateRequestOptions & { stream?: false | undefined }): Promise<ProgressResponse>;\n create(\n request: CreateRequestOptions,\n ): Promise<ProgressResponse | OllamaStream<ProgressResponse, ProgressStreamResult>>;\n async create(\n request: CreateRequestOptions,\n ): Promise<ProgressResponse | OllamaStream<ProgressResponse, ProgressStreamResult>> {\n if (request.stream) {\n return this.runner(\n async (http, signal) => {\n const stream = await http.requestStream<ProgressResponse>({\n path: '/api/create',\n body: { ...request, stream: true },\n signal,\n });\n return normalizeProgressStream(stream);\n },\n { ...request, singleEndpoint: true, holdUntil: (stream) => stream.finalResult },\n );\n }\n return this.runner(\n (http, signal) =>\n http.request<ProgressResponse>({\n path: '/api/create',\n body: { ...request, stream: false },\n signal,\n }),\n { ...request, singleEndpoint: true },\n );\n }\n\n delete(request: DeleteRequestOptions): Promise<StatusResponse> {\n return this.runner(\n (http, signal) =>\n http.request<StatusResponse>({\n path: '/api/delete',\n method: 'DELETE',\n body: request,\n signal,\n }),\n { ...request, singleEndpoint: true },\n );\n }\n\n copy(request: CopyRequestOptions): Promise<StatusResponse> {\n return this.runner(\n (http, signal) => http.request<StatusResponse>({ path: '/api/copy', body: request, signal }),\n { ...request, singleEndpoint: true },\n );\n }\n\n ps(): Promise<PsResponse> {\n return this.runner((http) => http.request<PsResponse>({ path: '/api/ps', method: 'GET' }), {\n singleEndpoint: true,\n });\n }\n\n version(): Promise<VersionResponse> {\n return this.runner(\n (http) => http.request<VersionResponse>({ path: '/api/version', method: 'GET' }),\n { singleEndpoint: true },\n );\n }\n\n async createBlob(digest: string, data: BinaryBody): Promise<void> {\n await this.runner(\n (http, signal) =>\n http.request<void>({\n path: `/api/blobs/${encodeURIComponent(digest)}`,\n method: 'POST',\n rawBody: data,\n signal,\n }),\n { singleEndpoint: true },\n );\n }\n\n async checkBlob(digest: string): Promise<boolean> {\n try {\n await this.runner(\n (http, signal) =>\n http.request<void>({\n path: `/api/blobs/${encodeURIComponent(digest)}`,\n method: 'HEAD',\n signal,\n }),\n { singleEndpoint: true },\n );\n return true;\n } catch {\n return false;\n }\n }\n}\n","/**\n * OpenAI Compatibility interfaces and client helpers for Ollama.\n * Ollama exposes OpenAI-compatible /v1 endpoints.\n *\n * @remarks\n * This is a typed pass-through to Ollama's own OpenAI-compatible `/v1` endpoints — it\n * implements the subset of the OpenAI API surface that Ollama documents as supported\n * (https://docs.ollama.com/api/openai-compatibility), not the full OpenAI surface (hosted\n * tools like web/file search, computer use, code interpreter, or stateful server-side\n * conversation state). Notably, `tools` is supported by Ollama's compat layer but\n * `tool_choice` and `parallel_tool_calls` are not — both are still typed on\n * {@link OpenAIChatCompletionRequest} (accepted-but-ignored) so consumers passing a\n * standard OpenAI request object don't get spurious type errors; see the `@remarks` on\n * each field. `/v1/responses` is supported non-statefully — see\n * {@link OpenAIResponsesRequest}.\n */\n\nimport type { AbortableAsyncIterable } from '../streaming/types.js';\nimport type { SseEvent } from '../streaming/sse.js';\nimport type { HttpClient } from '../transport/http.js';\nimport type { RequestRunner } from '../transport/runner.js';\nimport { OllamaAbortError, OllamaClientError } from '../errors.js';\n\nexport interface OpenAIToolCall {\n readonly id: string;\n readonly type: 'function';\n readonly function: {\n readonly name: string;\n /** JSON-encoded arguments string, matching OpenAI's wire format (not a parsed object). */\n readonly arguments: string;\n };\n}\n\nexport interface OpenAITextContentPart {\n readonly type: 'text';\n readonly text: string;\n}\n\nexport interface OpenAIImageUrlContentPart {\n readonly type: 'image_url';\n /** Ollama accepts a data/image URL string or the standard OpenAI URL object. */\n readonly image_url:\n | string\n | { readonly url: string; readonly detail?: 'auto' | 'low' | 'high' | 'original' | undefined };\n}\n\nexport type OpenAIContentPart = OpenAITextContentPart | OpenAIImageUrlContentPart;\n\nexport interface OpenAIMessage {\n readonly role: 'system' | 'user' | 'assistant' | 'tool';\n readonly content: string | readonly OpenAIContentPart[];\n readonly name?: string | undefined;\n readonly tool_calls?: readonly OpenAIToolCall[] | undefined;\n /** Ollama may emit model reasoning alongside assistant content. */\n readonly reasoning?: string | undefined;\n /** Set on a `role: 'tool'` message to identify which call this is a result for. */\n readonly tool_call_id?: string | undefined;\n}\n\nexport interface OpenAIStreamOptions {\n /** Emit a final SSE chunk carrying `usage` (prompt/completion/total tokens) before `[DONE]`. */\n readonly include_usage?: boolean | undefined;\n}\n\nexport interface OpenAIFunctionDefinition {\n readonly name: string;\n readonly description?: string | undefined;\n readonly parameters?: Record<string, unknown> | undefined;\n}\n\nexport interface OpenAITool {\n readonly type: 'function';\n readonly function: OpenAIFunctionDefinition;\n}\n\nexport type OpenAIReasoningEffort =\n | 'high'\n | 'medium'\n | 'low'\n | 'max'\n | 'none'\n | 'minimal'\n | 'xhigh'\n | 'ultra'\n | (string & {});\n\nexport type OpenAIResponseFormat =\n | { readonly type: 'text' }\n | { readonly type: 'json_object' }\n | { readonly type: 'json_schema'; readonly json_schema: Record<string, unknown> };\n\nexport interface OpenAIChatCompletionRequest {\n readonly model: string;\n readonly messages: readonly OpenAIMessage[];\n readonly temperature?: number | undefined;\n readonly top_p?: number | undefined;\n readonly stream?: boolean | undefined;\n /** Only meaningful when `stream: true`; ignored otherwise. */\n readonly stream_options?: OpenAIStreamOptions | undefined;\n readonly max_tokens?: number | undefined;\n readonly stop?: readonly string[] | undefined;\n readonly response_format?: OpenAIResponseFormat | undefined;\n readonly seed?: number | undefined;\n readonly presence_penalty?: number | undefined;\n readonly frequency_penalty?: number | undefined;\n readonly user?: string | undefined;\n readonly logit_bias?: Record<string, number> | undefined;\n readonly n?: number | undefined;\n /** Ollama exposes log probabilities for supported reasoning/chat models. */\n readonly logprobs?: boolean | undefined;\n readonly top_logprobs?: number | undefined;\n readonly tools?: readonly OpenAITool[] | undefined;\n /**\n * @remarks Accepted for OpenAI compatibility but ignored by Ollama — every tool the\n * model is given remains callable regardless of this value.\n */\n readonly tool_choice?:\n | 'none'\n | 'auto'\n | 'required'\n | { readonly type: 'function'; readonly function: { readonly name: string } }\n | undefined;\n /**\n * @remarks Accepted for OpenAI compatibility but ignored by Ollama — Ollama does not\n * control tool-call parallelism through this flag.\n */\n readonly parallel_tool_calls?: boolean | undefined;\n /**\n * Effort level for thinking models (e.g. `deepseek-r1`, `qwen3`). Equivalent to\n * `reasoning.effort`; only effective for models that support reasoning/thinking.\n */\n readonly reasoning_effort?: OpenAIReasoningEffort | undefined;\n /**\n * Effort level for thinking models (e.g. `deepseek-r1`, `qwen3`), nested OpenAI-style.\n * Equivalent to `reasoning_effort`; only effective for models that support\n * reasoning/thinking.\n */\n readonly reasoning?:\n { readonly effort?: OpenAIReasoningEffort | undefined } | undefined;\n}\n\n/** Ollama Chat Completions supports text plus base64 image content via a string image URL. */\nexport type OllamaOpenAIChatContentPart =\n | OpenAITextContentPart\n | {\n readonly type: 'image_url';\n /** Ollama's current compatibility docs accept an image URL string, including data URLs. */\n readonly image_url: string;\n };\n\nexport type OllamaOpenAIReasoningEffort =\n | 'high'\n | 'medium'\n | 'low'\n | 'max'\n | 'none';\n\nexport type OllamaOpenAIChatMessage = Omit<OpenAIMessage, 'content'> & {\n readonly content: string | readonly OllamaOpenAIChatContentPart[];\n};\n\n/** Strict Ollama-documented Chat Completions request; excludes only the SDK-only parallel tool flag. */\nexport type OllamaOpenAIChatCompletionRequest = Omit<\n OpenAIChatCompletionRequest,\n 'messages' | 'parallel_tool_calls' | 'reasoning_effort' | 'reasoning'\n> & {\n readonly messages: readonly OllamaOpenAIChatMessage[];\n readonly reasoning_effort?: OllamaOpenAIReasoningEffort | undefined;\n readonly reasoning?: { readonly effort?: OllamaOpenAIReasoningEffort | undefined } | undefined;\n};\n\nexport interface OpenAIChatCompletionChoice {\n readonly index: number;\n readonly message: OpenAIMessage;\n readonly finish_reason: string;\n readonly logprobs?: Record<string, unknown> | null | undefined;\n}\n\nexport interface OpenAIToolCallDelta {\n readonly index: number;\n readonly id?: string | undefined;\n readonly type?: 'function' | undefined;\n readonly function?: {\n readonly name?: string | undefined;\n readonly arguments?: string | undefined;\n } | undefined;\n}\n\nexport interface OpenAIChatCompletionDelta {\n readonly role?: OpenAIMessage['role'] | undefined;\n readonly content?: string | null | undefined;\n readonly reasoning?: string | null | undefined;\n readonly refusal?: string | null | undefined;\n readonly tool_calls?: readonly OpenAIToolCallDelta[] | undefined;\n}\n\nexport interface OpenAIChatCompletionChunkChoice {\n readonly index: number;\n readonly delta: OpenAIChatCompletionDelta;\n readonly finish_reason?: string | null | undefined;\n readonly logprobs?: Record<string, unknown> | null | undefined;\n}\n\nexport interface OpenAIChatCompletionChunk {\n readonly id: string;\n readonly object: 'chat.completion.chunk';\n readonly created: number;\n readonly model: string;\n readonly system_fingerprint?: string | undefined;\n readonly choices: readonly OpenAIChatCompletionChunkChoice[];\n readonly usage?:\n | {\n readonly prompt_tokens: number;\n readonly completion_tokens: number;\n readonly total_tokens: number;\n }\n | null\n | undefined;\n}\n\nexport interface OpenAIUsage {\n readonly prompt_tokens: number;\n readonly completion_tokens: number;\n readonly total_tokens: number;\n readonly prompt_tokens_details?: {\n readonly cached_tokens?: number | undefined;\n } | undefined;\n}\n\nexport interface OpenAIChatCompletionResponse {\n readonly id: string;\n readonly object: 'chat.completion';\n readonly created: number;\n readonly model: string;\n readonly system_fingerprint?: string | undefined;\n readonly choices: readonly OpenAIChatCompletionChoice[];\n readonly usage?: OpenAIUsage | undefined;\n}\n\nexport interface OpenAIModelItem {\n readonly id: string;\n readonly object: 'model';\n readonly created: number;\n readonly owned_by: string;\n}\n\nexport interface OpenAIListModelsResponse {\n readonly object: 'list';\n readonly data: readonly OpenAIModelItem[];\n}\n\nexport interface OpenAICompletionRequest {\n readonly model: string;\n /** Ollama currently accepts a string prompt for /v1/completions. */\n readonly prompt: string;\n /** Number of log probability alternatives requested for completion tokens. */\n readonly logprobs?: number | undefined;\n readonly frequency_penalty?: number | undefined;\n readonly presence_penalty?: number | undefined;\n readonly seed?: number | undefined;\n readonly stop?: readonly string[] | undefined;\n readonly stream?: boolean | undefined;\n readonly stream_options?: OpenAIStreamOptions | undefined;\n readonly temperature?: number | undefined;\n readonly top_p?: number | undefined;\n readonly max_tokens?: number | undefined;\n readonly suffix?: string | undefined;\n readonly best_of?: number | undefined;\n readonly echo?: boolean | undefined;\n readonly logit_bias?: Record<string, number> | undefined;\n readonly user?: string | undefined;\n readonly n?: number | undefined;\n}\n\n/** Strict Ollama-documented Completions request. */\nexport type OllamaOpenAICompletionRequest = OpenAICompletionRequest;\n\nexport interface OpenAICompletionChoice {\n readonly text: string;\n readonly index: number;\n readonly logprobs?: Record<string, unknown> | null | undefined;\n readonly finish_reason: string | null;\n}\n\nexport interface OpenAICompletionChunk {\n readonly id: string;\n readonly object: 'text_completion';\n readonly created: number;\n readonly model: string;\n readonly system_fingerprint?: string | undefined;\n readonly choices: readonly {\n readonly text: string;\n readonly index: number;\n readonly logprobs?: Record<string, unknown> | null | undefined;\n readonly finish_reason?: string | null | undefined;\n }[];\n readonly usage?:\n | {\n readonly prompt_tokens: number;\n readonly completion_tokens: number;\n readonly total_tokens: number;\n }\n | null\n | undefined;\n}\n\nexport interface OpenAICompletionResponse {\n readonly id: string;\n readonly object: 'text_completion';\n readonly created: number;\n readonly model: string;\n readonly system_fingerprint?: string | undefined;\n readonly choices: readonly OpenAICompletionChoice[];\n readonly usage?: OpenAIUsage | undefined;\n}\n\nexport type OpenAIEmbeddingInput =\n | string\n | readonly string[]\n | readonly number[]\n | readonly (readonly number[])[];\n\nexport interface OpenAIEmbeddingRequest {\n readonly model: string;\n readonly input: OpenAIEmbeddingInput;\n readonly encoding_format?: 'float' | 'base64' | undefined;\n readonly dimensions?: number | undefined;\n readonly user?: string | undefined;\n}\n\n/** Strict Ollama-documented Embeddings request. */\nexport type OllamaOpenAIEmbeddingRequest = OpenAIEmbeddingRequest;\n\nexport interface OpenAIEmbeddingItem {\n readonly object: 'embedding';\n readonly embedding: readonly number[] | string;\n readonly index: number;\n}\n\nexport interface OpenAIEmbeddingResponse {\n readonly object: 'list';\n readonly data: readonly OpenAIEmbeddingItem[];\n readonly model: string;\n readonly usage?: {\n readonly prompt_tokens: number;\n readonly total_tokens: number;\n } | undefined;\n}\n\n/**\n * Request body for OpenAI's Responses API (`/v1/responses`), added in Ollama v0.13.3.\n *\n * @remarks\n * Ollama implements this **non-statefully**: every call is independent, so\n * {@link previous_response_id} and {@link conversation} — OpenAI's mechanisms for\n * resuming server-side conversation state — are accepted for compatibility but ignored.\n * Send the full conversation in `input` on every call, the same as `/api/chat`.\n */\nexport interface OpenAIResponsesRequest {\n readonly model: string;\n readonly input: string | readonly OpenAIMessage[];\n readonly instructions?: string | undefined;\n readonly tools?: readonly OpenAITool[] | undefined;\n readonly stream?: boolean | undefined;\n readonly temperature?: number | undefined;\n readonly top_p?: number | undefined;\n readonly max_output_tokens?: number | undefined;\n /** @remarks Not supported by Ollama, which is stateless across calls — accepted but ignored. */\n readonly previous_response_id?: string | undefined;\n /** @remarks Not supported by Ollama, which is stateless across calls — accepted but ignored. */\n readonly conversation?: string | undefined;\n readonly truncation?: string | undefined;\n readonly reasoning?: { readonly effort?: OpenAIReasoningEffort | undefined } | undefined;\n /** Ollama extension: boolean, model-defined string, or null for model default. */\n readonly think?: boolean | string | null | undefined;\n}\n\n/** Strict Ollama-documented Responses request; excludes stateful and SDK-only request fields. */\n/** Strict Ollama-documented Responses request; excludes only unsupported stateful fields. */\nexport type OllamaOpenAIResponsesRequest = Omit<\n OpenAIResponsesRequest,\n 'previous_response_id' | 'conversation'\n>;\n\nexport type OpenAIResponsesStatus = 'completed' | 'failed' | 'in_progress' | 'cancelled' | 'queued' | 'incomplete';\n\nexport interface OpenAIResponsesError { readonly code?: string | undefined; readonly message?: string | undefined; readonly [key: string]: unknown; }\nexport interface OpenAIResponsesIncompleteDetails { readonly reason?: string | undefined; readonly [key: string]: unknown; }\n\nexport interface OpenAIResponsesOutputTextContent {\n readonly type: 'output_text'; readonly text: string;\n readonly annotations?: readonly Record<string, unknown>[] | undefined;\n readonly logprobs?: readonly Record<string, unknown>[] | undefined;\n}\nexport interface OpenAIResponsesOutputRefusal { readonly type: 'refusal'; readonly refusal: string; }\nexport type OpenAIResponsesOutputContent = OpenAIResponsesOutputTextContent | OpenAIResponsesOutputRefusal;\n\nexport interface OpenAIResponsesOutputMessage {\n readonly type: 'message'; readonly id?: string | undefined; readonly status?: OpenAIResponsesStatus | undefined;\n readonly role?: string | undefined; readonly phase?: string | undefined;\n readonly content: readonly OpenAIResponsesOutputContent[];\n}\nexport interface OpenAIResponsesOutputFunctionCall {\n readonly type: 'function_call'; readonly id?: string | undefined; readonly call_id?: string | undefined;\n readonly name: string; readonly arguments: string; readonly status?: OpenAIResponsesStatus | undefined;\n}\nexport interface OpenAIResponsesOutputReasoning {\n readonly type: 'reasoning'; readonly id?: string | undefined; readonly status?: OpenAIResponsesStatus | undefined;\n readonly summary?: readonly { readonly type: 'summary_text'; readonly text: string }[] | undefined;\n readonly text?: string | undefined; readonly encrypted_content?: string | undefined;\n}\nexport type OpenAIResponsesOutputItem = OpenAIResponsesOutputMessage | OpenAIResponsesOutputFunctionCall | OpenAIResponsesOutputReasoning;\n\nexport interface OpenAIResponsesUsage {\n readonly input_tokens: number; readonly output_tokens: number; readonly total_tokens: number;\n readonly input_tokens_details?: Record<string, unknown> | undefined;\n readonly output_tokens_details?: Record<string, unknown> | undefined;\n}\n\n/** Non-stateful response shape for the Ollama Responses compatibility endpoint. */\nexport interface OpenAIResponsesResponse {\n readonly id: string; readonly object: 'response'; readonly created: number;\n readonly created_at?: number | undefined; readonly status?: OpenAIResponsesStatus | undefined;\n readonly completed_at?: number | null | undefined; readonly error?: OpenAIResponsesError | null | undefined;\n readonly incomplete_details?: OpenAIResponsesIncompleteDetails | null | undefined;\n readonly model: string; readonly output: readonly OpenAIResponsesOutputItem[];\n readonly output_text?: string | undefined; readonly previous_response_id?: string | null | undefined;\n readonly parallel_tool_calls?: boolean | undefined; readonly usage?: OpenAIResponsesUsage | undefined;\n}\n\nexport class OpenAIResponsesStreamError extends OllamaClientError {\n readonly responsePayload: OpenAIResponsesResponse;\n constructor(message: string, responsePayload: OpenAIResponsesResponse) {\n super(message, { code: 'openai_responses_stream_error', retryable: false, response: { body: responsePayload } });\n this.responsePayload = responsePayload;\n }\n}\nexport class OpenAIChatCompletionStream implements AsyncIterable<OpenAIChatCompletionChunk> {\n private readonly finalResultPromise: Promise<OpenAIChatCompletionResponse>;\n private resolveFinal!: (value: OpenAIChatCompletionResponse) => void;\n private rejectFinal!: (reason: unknown) => void;\n private removeAbortListener: (() => void) | undefined;\n\n constructor(private readonly source: AbortableAsyncIterable<SseEvent>, signal?: AbortSignal) {\n this.finalResultPromise = new Promise<OpenAIChatCompletionResponse>((resolve, reject) => {\n this.resolveFinal = resolve;\n this.rejectFinal = reject;\n });\n if (signal !== undefined) {\n const onAbort = (): void => this.abort();\n if (signal.aborted) onAbort();\n else {\n signal.addEventListener('abort', onAbort, { once: true });\n this.removeAbortListener = () => signal.removeEventListener('abort', onAbort);\n }\n }\n }\n\n get finalResult(): Promise<OpenAIChatCompletionResponse> {\n return this.finalResultPromise;\n }\n\n abort(): void {\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n this.source.abort?.();\n this.rejectFinal(new OllamaAbortError('OpenAI Chat Completion stream aborted'));\n }\n\n async *[Symbol.asyncIterator](): AsyncGenerator<OpenAIChatCompletionChunk, void, undefined> {\n const choices = new Map<number, {\n message: OpenAIMessage;\n finish_reason: string;\n logprobs?: Record<string, unknown> | null | undefined;\n }>();\n let id = '';\n let model = '';\n let created = 0;\n let systemFingerprint: string | undefined;\n let usage: OpenAIUsage | undefined;\n let completed = false;\n\n try {\n for await (const event of this.source) {\n if (event.data === '[DONE]') break;\n let chunk: OpenAIChatCompletionChunk;\n try {\n chunk = JSON.parse(event.data) as OpenAIChatCompletionChunk;\n } catch (error) {\n throw new Error('Failed to parse OpenAI chat completion SSE payload', { cause: error });\n }\n id = chunk.id || id;\n model = chunk.model || model;\n created = chunk.created || created;\n if (chunk.system_fingerprint !== undefined) systemFingerprint = chunk.system_fingerprint;\n if (chunk.usage !== null && chunk.usage !== undefined) usage = chunk.usage;\n\n for (const choice of chunk.choices) {\n const existing = choices.get(choice.index);\n const delta = choice.delta;\n if (!existing) {\n const toolCalls = delta.tool_calls?.map((toolCall) => ({\n id: toolCall.id ?? '',\n type: 'function' as const,\n function: {\n name: toolCall.function?.name ?? '',\n arguments: toolCall.function?.arguments ?? '',\n },\n }));\n choices.set(choice.index, {\n message: {\n role: delta.role ?? 'assistant',\n content: delta.content ?? '',\n ...(delta.reasoning !== undefined && delta.reasoning !== null\n ? { reasoning: delta.reasoning }\n : {}),\n ...(toolCalls?.length ? { tool_calls: toolCalls } : {}),\n },\n finish_reason: choice.finish_reason ?? '',\n ...(choice.logprobs !== undefined ? { logprobs: choice.logprobs } : {}),\n });\n continue;\n }\n\n const priorToolCalls = [...(existing.message.tool_calls ?? [])];\n for (const toolCall of delta.tool_calls ?? []) {\n const position = toolCall.index;\n const current = priorToolCalls[position];\n if (current) {\n priorToolCalls[position] = {\n ...current,\n ...(toolCall.id !== undefined ? { id: toolCall.id } : {}),\n function: {\n name: current.function?.name ?? toolCall.function?.name ?? '',\n arguments:\n (current.function?.arguments ?? '') + (toolCall.function?.arguments ?? ''),\n },\n };\n } else {\n priorToolCalls[position] = {\n id: toolCall.id ?? '',\n type: 'function',\n function: {\n name: toolCall.function?.name ?? '',\n arguments: toolCall.function?.arguments ?? '',\n },\n };\n }\n }\n choices.set(choice.index, {\n message: {\n ...existing.message,\n ...(delta.content !== undefined && delta.content !== null\n ? { content: existing.message.content + delta.content }\n : {}),\n ...(delta.reasoning !== undefined && delta.reasoning !== null\n ? { reasoning: (existing.message.reasoning ?? '') + delta.reasoning }\n : {}),\n ...(priorToolCalls.length ? { tool_calls: priorToolCalls } : {}),\n },\n finish_reason: choice.finish_reason ?? existing.finish_reason,\n ...(choice.logprobs !== undefined ? { logprobs: choice.logprobs } : {}),\n });\n }\n\n yield chunk;\n }\n\n const response: OpenAIChatCompletionResponse = {\n id,\n object: 'chat.completion',\n created,\n model,\n ...(systemFingerprint !== undefined ? { system_fingerprint: systemFingerprint } : {}),\n choices: [...choices.entries()]\n .sort(([a], [b]) => a - b)\n .map(([index, choice]) => ({\n index,\n message: choice.message,\n finish_reason: choice.finish_reason,\n ...(choice.logprobs !== undefined ? { logprobs: choice.logprobs } : {}),\n })),\n ...(usage !== undefined ? { usage } : {}),\n };\n completed = true;\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n this.resolveFinal(response);\n } catch (error) {\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n this.rejectFinal(error);\n throw error;\n } finally {\n if (!completed) {\n this.source.abort?.();\n this.rejectFinal(new OllamaAbortError('OpenAI Chat Completion stream ended before completion'));\n }\n }\n }\n}\n\nexport class OpenAICompletionStream implements AsyncIterable<OpenAICompletionChunk> {\n private readonly finalResultPromise: Promise<OpenAICompletionResponse>;\n private resolveFinal!: (value: OpenAICompletionResponse) => void;\n private rejectFinal!: (reason: unknown) => void;\n private removeAbortListener: (() => void) | undefined;\n\n constructor(private readonly source: AbortableAsyncIterable<SseEvent>, signal?: AbortSignal) {\n this.finalResultPromise = new Promise<OpenAICompletionResponse>((resolve, reject) => {\n this.resolveFinal = resolve;\n this.rejectFinal = reject;\n });\n if (signal !== undefined) {\n const onAbort = (): void => this.abort();\n if (signal.aborted) onAbort();\n else {\n signal.addEventListener('abort', onAbort, { once: true });\n this.removeAbortListener = () => signal.removeEventListener('abort', onAbort);\n }\n }\n }\n\n get finalResult(): Promise<OpenAICompletionResponse> {\n return this.finalResultPromise;\n }\n\n abort(): void {\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n this.source.abort?.();\n this.rejectFinal(new OllamaAbortError('OpenAI Completion stream aborted'));\n }\n\n async *[Symbol.asyncIterator](): AsyncGenerator<OpenAICompletionChunk, void, undefined> {\n const texts = new Map<number, OpenAICompletionChoice>();\n let id = '';\n let model = '';\n let created = 0;\n let usage:\n | { prompt_tokens: number; completion_tokens: number; total_tokens: number }\n | undefined;\n let completed = false;\n\n try {\n for await (const event of this.source) {\n if (event.data === '[DONE]') break;\n const chunk = JSON.parse(event.data) as OpenAICompletionChunk;\n id = chunk.id || id;\n model = chunk.model || model;\n created = chunk.created || created;\n if (chunk.usage !== null && chunk.usage !== undefined) usage = chunk.usage;\n\n for (const choice of chunk.choices) {\n const existing = texts.get(choice.index);\n texts.set(choice.index, {\n text: (existing?.text ?? '') + (choice.text ?? ''),\n index: choice.index,\n finish_reason: choice.finish_reason ?? existing?.finish_reason ?? null,\n ...(choice.logprobs !== undefined ? { logprobs: choice.logprobs } : {}),\n });\n }\n yield chunk;\n }\n\n const response: OpenAICompletionResponse = {\n id,\n object: 'text_completion',\n created,\n model,\n choices: [...texts.values()].sort((a, b) => a.index - b.index),\n ...(usage !== undefined ? { usage } : {}),\n };\n completed = true;\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n this.resolveFinal(response);\n } catch (error) {\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n this.rejectFinal(error);\n throw error;\n } finally {\n if (!completed) {\n this.source.abort?.();\n this.rejectFinal(new OllamaAbortError('OpenAI Completion stream ended before completion'));\n }\n }\n }\n}\n\nexport interface OpenAIResponsesEventBase { readonly response_id?: string | undefined; readonly sequence_number?: number | undefined; }\n\nexport interface OpenAIResponsesOutputTextDeltaEvent extends OpenAIResponsesEventBase { readonly type: 'response.output_text.delta'; readonly item_id: string; readonly output_index: number; readonly content_index: number; readonly delta: string; }\nexport interface OpenAIResponsesOutputTextDoneEvent extends OpenAIResponsesEventBase { readonly type: 'response.output_text.done'; readonly item_id: string; readonly output_index: number; readonly content_index: number; readonly text: string; }\nexport interface OpenAIResponsesFunctionCallArgumentsDeltaEvent extends OpenAIResponsesEventBase { readonly type: 'response.function_call_arguments.delta'; readonly item_id: string; readonly output_index: number; readonly delta: string; }\nexport interface OpenAIResponsesFunctionCallArgumentsDoneEvent extends OpenAIResponsesEventBase { readonly type: 'response.function_call_arguments.done'; readonly item_id: string; readonly output_index: number; readonly arguments: string; readonly name?: string | undefined; }\nexport interface OpenAIResponsesReasoningTextDeltaEvent extends OpenAIResponsesEventBase { readonly type: 'response.reasoning_text.delta'; readonly item_id: string; readonly output_index: number; readonly content_index: number; readonly delta: string; }\nexport interface OpenAIResponsesReasoningTextDoneEvent extends OpenAIResponsesEventBase { readonly type: 'response.reasoning_text.done'; readonly item_id: string; readonly output_index: number; readonly content_index: number; readonly text: string; }\nexport interface OpenAIResponsesReasoningSummaryPartAddedEvent extends OpenAIResponsesEventBase { readonly type: 'response.reasoning_summary_part.added'; readonly item_id: string; readonly output_index: number; readonly summary_index: number; readonly part: { readonly type: 'summary_text'; readonly text: string }; }\nexport interface OpenAIResponsesReasoningSummaryPartDoneEvent extends OpenAIResponsesEventBase { readonly type: 'response.reasoning_summary_part.done'; readonly item_id: string; readonly output_index: number; readonly summary_index: number; readonly part: { readonly type: 'summary_text'; readonly text: string }; readonly status?: 'incomplete' | undefined; }\nexport interface OpenAIResponsesReasoningSummaryTextDeltaEvent extends OpenAIResponsesEventBase { readonly type: 'response.reasoning_summary_text.delta'; readonly item_id: string; readonly output_index: number; readonly summary_index: number; readonly delta: string; }\nexport interface OpenAIResponsesReasoningSummaryTextDoneEvent extends OpenAIResponsesEventBase { readonly type: 'response.reasoning_summary_text.done'; readonly item_id: string; readonly output_index: number; readonly summary_index: number; readonly text: string; }\nexport interface OpenAIResponsesOutputItemAddedEvent extends OpenAIResponsesEventBase { readonly type: 'response.output_item.added'; readonly item: OpenAIResponsesOutputItem; readonly output_index: number; }\nexport interface OpenAIResponsesOutputItemDoneEvent extends OpenAIResponsesEventBase { readonly type: 'response.output_item.done'; readonly item: OpenAIResponsesOutputItem; readonly output_index: number; }\nexport interface OpenAIResponsesContentPartAddedEvent extends OpenAIResponsesEventBase { readonly type: 'response.content_part.added'; readonly item_id: string; readonly output_index: number; readonly content_index: number; readonly part: OpenAIResponsesOutputContent | { readonly type: string; readonly [key: string]: unknown }; }\nexport interface OpenAIResponsesContentPartDoneEvent extends OpenAIResponsesEventBase { readonly type: 'response.content_part.done'; readonly item_id: string; readonly output_index: number; readonly content_index: number; readonly part: OpenAIResponsesOutputContent | { readonly type: string; readonly [key: string]: unknown }; }\nexport interface OpenAIResponsesRefusalDeltaEvent extends OpenAIResponsesEventBase { readonly type: 'response.refusal.delta'; readonly item_id: string; readonly output_index: number; readonly content_index: number; readonly delta: string; }\nexport interface OpenAIResponsesRefusalDoneEvent extends OpenAIResponsesEventBase { readonly type: 'response.refusal.done'; readonly item_id: string; readonly output_index: number; readonly content_index: number; readonly refusal: string; }\nexport interface OpenAIResponsesCreatedEvent extends OpenAIResponsesEventBase { readonly type: 'response.created'; readonly response: OpenAIResponsesResponse; }\nexport interface OpenAIResponsesInProgressEvent extends OpenAIResponsesEventBase { readonly type: 'response.in_progress'; readonly response: OpenAIResponsesResponse; }\nexport interface OpenAIResponsesQueuedEvent extends OpenAIResponsesEventBase { readonly type: 'response.queued'; readonly response: OpenAIResponsesResponse; }\nexport interface OpenAIResponsesCompletedEvent extends OpenAIResponsesEventBase { readonly type: 'response.completed' | 'response.done'; readonly response: OpenAIResponsesResponse; }\nexport interface OpenAIResponsesFailedEvent extends OpenAIResponsesEventBase { readonly type: 'response.failed'; readonly response: OpenAIResponsesResponse; }\nexport interface OpenAIResponsesIncompleteEvent extends OpenAIResponsesEventBase { readonly type: 'response.incomplete'; readonly response: OpenAIResponsesResponse; }\n\nexport type OpenAIResponsesStreamEvent =\n | OpenAIResponsesOutputTextDeltaEvent | OpenAIResponsesOutputTextDoneEvent\n | OpenAIResponsesFunctionCallArgumentsDeltaEvent | OpenAIResponsesFunctionCallArgumentsDoneEvent\n | OpenAIResponsesReasoningTextDeltaEvent | OpenAIResponsesReasoningTextDoneEvent\n | OpenAIResponsesReasoningSummaryPartAddedEvent | OpenAIResponsesReasoningSummaryPartDoneEvent\n | OpenAIResponsesReasoningSummaryTextDeltaEvent | OpenAIResponsesReasoningSummaryTextDoneEvent\n | OpenAIResponsesOutputItemAddedEvent | OpenAIResponsesOutputItemDoneEvent\n | OpenAIResponsesContentPartAddedEvent | OpenAIResponsesContentPartDoneEvent\n | OpenAIResponsesRefusalDeltaEvent | OpenAIResponsesRefusalDoneEvent\n | OpenAIResponsesCreatedEvent | OpenAIResponsesInProgressEvent | OpenAIResponsesQueuedEvent\n | OpenAIResponsesCompletedEvent | OpenAIResponsesFailedEvent | OpenAIResponsesIncompleteEvent\n | { readonly type: string; readonly [key: string]: unknown };\n\ntype OpenAIResponsesOutputState = {\n itemId: string; kind: 'message' | 'function_call' | 'reasoning';\n content: Map<number, OpenAIResponsesOutputContent>; summary: Map<number, string>;\n arguments: string; name?: string | undefined; callId?: string | undefined; status?: OpenAIResponsesStatus | undefined;\n role?: string | undefined; phase?: string | undefined; reasoningText: string;\n};\nexport class OpenAIResponsesStream implements AsyncIterable<OpenAIResponsesStreamEvent> {\n private readonly finalResultPromise: Promise<OpenAIResponsesResponse>;\n private resolveFinal!: (value: OpenAIResponsesResponse) => void;\n private rejectFinal!: (reason: unknown) => void;\n private removeAbortListener: (() => void) | undefined;\n\n constructor(private readonly source: AbortableAsyncIterable<SseEvent>, signal?: AbortSignal) {\n this.finalResultPromise = new Promise<OpenAIResponsesResponse>((resolve, reject) => { this.resolveFinal = resolve; this.rejectFinal = reject; });\n if (signal !== undefined) {\n const onAbort = (): void => this.abort();\n if (signal.aborted) onAbort();\n else { signal.addEventListener('abort', onAbort, { once: true }); this.removeAbortListener = () => signal.removeEventListener('abort', onAbort); }\n }\n }\n get finalResult(): Promise<OpenAIResponsesResponse> { return this.finalResultPromise; }\n abort(): void {\n this.removeAbortListener?.(); this.removeAbortListener = undefined; this.source.abort?.();\n this.rejectFinal(new OllamaAbortError('OpenAI Responses stream aborted'));\n }\n\n async *[Symbol.asyncIterator](): AsyncGenerator<OpenAIResponsesStreamEvent, void, undefined> {\n let finalResponse: OpenAIResponsesResponse | undefined;\n let responseMeta: OpenAIResponsesResponse | undefined;\n let terminalFailure: OpenAIResponsesResponse | undefined;\n let terminalIncomplete: OpenAIResponsesResponse | undefined;\n const outputs = new Map<number, OpenAIResponsesOutputState>();\n const canonicalOutputItems = new Map<number, OpenAIResponsesOutputItem>();\n let completed = false;\n\n const ensureState = (outputIndex: number, itemId: string, kind: OpenAIResponsesOutputState['kind']): OpenAIResponsesOutputState => {\n const existing = outputs.get(outputIndex);\n if (existing) { if (itemId) existing.itemId = itemId; existing.kind = kind; return existing; }\n const state: OpenAIResponsesOutputState = { itemId, kind, content: new Map(), summary: new Map(), arguments: '', reasoningText: '' };\n outputs.set(outputIndex, state); return state;\n };\n\n const applyOutputItem = (outputIndex: number, item: OpenAIResponsesOutputItem): void => {\n const kind = item.type === 'message' ? 'message' : item.type === 'function_call' ? 'function_call' : 'reasoning';\n const state = ensureState(outputIndex, item.id ?? '', kind);\n state.itemId = item.id ?? state.itemId; state.status = item.status;\n if (item.type === 'message') { state.role = item.role; state.phase = item.phase; state.content.clear(); item.content.forEach((p, i) => state.content.set(i, p)); }\n else if (item.type === 'function_call') { state.callId = item.call_id; state.name = item.name; state.arguments = item.arguments; }\n else { state.summary.clear(); item.summary?.forEach((p, i) => state.summary.set(i, p.text)); state.reasoningText = item.text ?? ''; }\n };\n const applyContentPart = (outputIndex: number, itemId: string, contentIndex: number, part: OpenAIResponsesOutputContent): void => {\n const state = ensureState(outputIndex, itemId, 'message'); state.content.set(contentIndex, part);\n };\n const reconstructedOutput = (): readonly OpenAIResponsesOutputItem[] =>\n [...outputs.entries()].sort(([a], [b]) => a - b).map(([outputIndex, state]) => {\n const canonical = canonicalOutputItems.get(outputIndex); if (canonical) return canonical;\n if (state.kind === 'message') return { type: 'message', ...(state.itemId ? { id: state.itemId } : {}), ...(state.status ? { status: state.status } : {}), role: state.role ?? 'assistant', ...(state.phase ? { phase: state.phase } : {}), content: [...state.content.entries()].sort(([a], [b]) => a - b).map(([, p]) => p) };\n if (state.kind === 'function_call') return { type: 'function_call', ...(state.itemId ? { id: state.itemId } : {}), ...(state.callId ? { call_id: state.callId } : {}), ...(state.status ? { status: state.status } : {}), name: state.name ?? '', arguments: state.arguments };\n return { type: 'reasoning', ...(state.itemId ? { id: state.itemId } : {}), ...(state.status ? { status: state.status } : {}), ...(state.summary.size ? { summary: [...state.summary.entries()].sort(([a], [b]) => a - b).map(([, text]) => ({ type: 'summary_text' as const, text })) } : {}), ...(state.reasoningText ? { text: state.reasoningText } : {}) };\n });\n\n try {\n for await (const event of this.source) {\n if (event.data === '[DONE]') break;\n let payload: OpenAIResponsesStreamEvent;\n try { payload = JSON.parse(event.data) as OpenAIResponsesStreamEvent; } catch (error) { throw new Error('Failed to parse OpenAI Responses SSE payload', { cause: error }); }\n switch (payload.type) {\n case 'response.created': case 'response.in_progress': case 'response.queued': responseMeta = (payload as OpenAIResponsesCreatedEvent).response; break;\n case 'response.completed': case 'response.done': finalResponse = (payload as OpenAIResponsesCompletedEvent).response; break;\n case 'response.failed': terminalFailure = (payload as OpenAIResponsesFailedEvent).response; finalResponse = terminalFailure; break;\n case 'response.incomplete': terminalIncomplete = (payload as OpenAIResponsesIncompleteEvent).response; finalResponse = terminalIncomplete; break;\n case 'response.output_item.added': { const e = payload as OpenAIResponsesOutputItemAddedEvent; applyOutputItem(e.output_index, e.item); break; }\n case 'response.output_item.done': { const e = payload as OpenAIResponsesOutputItemDoneEvent; applyOutputItem(e.output_index, e.item); canonicalOutputItems.set(e.output_index, e.item); break; }\n case 'response.content_part.added': case 'response.content_part.done': {\n const e = payload as OpenAIResponsesContentPartAddedEvent | OpenAIResponsesContentPartDoneEvent;\n if (\n (e.part.type === 'output_text' && 'text' in e.part && typeof e.part.text === 'string') ||\n (e.part.type === 'refusal' && 'refusal' in e.part && typeof e.part.refusal === 'string')\n ) {\n applyContentPart(e.output_index, e.item_id, e.content_index, e.part as OpenAIResponsesOutputContent);\n }\n break;\n }\n case 'response.output_text.delta': { const e = payload as OpenAIResponsesOutputTextDeltaEvent; const s = ensureState(e.output_index, e.item_id, 'message'); const p=s.content.get(e.content_index); s.content.set(e.content_index,{type:'output_text',text:(p?.type==='output_text'?p.text:'')+e.delta}); break; }\n case 'response.output_text.done': { const e = payload as OpenAIResponsesOutputTextDoneEvent; const s=ensureState(e.output_index,e.item_id,'message'); s.content.set(e.content_index,{type:'output_text',text:e.text}); break; }\n case 'response.refusal.delta': { const e=payload as OpenAIResponsesRefusalDeltaEvent; const s=ensureState(e.output_index,e.item_id,'message'); const p=s.content.get(e.content_index); s.content.set(e.content_index,{type:'refusal',refusal:(p?.type==='refusal'?p.refusal:'')+e.delta}); break; }\n case 'response.refusal.done': { const e=payload as OpenAIResponsesRefusalDoneEvent; const s=ensureState(e.output_index,e.item_id,'message'); s.content.set(e.content_index,{type:'refusal',refusal:e.refusal}); break; }\n case 'response.function_call_arguments.delta': { const e=payload as OpenAIResponsesFunctionCallArgumentsDeltaEvent; const s=ensureState(e.output_index,e.item_id,'function_call'); s.arguments+=e.delta; break; }\n case 'response.function_call_arguments.done': { const e=payload as OpenAIResponsesFunctionCallArgumentsDoneEvent; const s=ensureState(e.output_index,e.item_id,'function_call'); s.arguments=e.arguments; if(e.name!==undefined) s.name=e.name; break; }\n case 'response.reasoning_summary_part.added': case 'response.reasoning_summary_part.done': { const e=payload as OpenAIResponsesReasoningSummaryPartAddedEvent | OpenAIResponsesReasoningSummaryPartDoneEvent; const s=ensureState(e.output_index,e.item_id,'reasoning'); s.summary.set(e.summary_index,e.part.text); break; }\n case 'response.reasoning_summary_text.delta': { const e=payload as OpenAIResponsesReasoningSummaryTextDeltaEvent; const s=ensureState(e.output_index,e.item_id,'reasoning'); s.summary.set(e.summary_index,(s.summary.get(e.summary_index)??'')+e.delta); break; }\n case 'response.reasoning_summary_text.done': { const e=payload as OpenAIResponsesReasoningSummaryTextDoneEvent; const s=ensureState(e.output_index,e.item_id,'reasoning'); s.summary.set(e.summary_index,e.text); break; }\n case 'response.reasoning_text.delta': { const e=payload as OpenAIResponsesReasoningTextDeltaEvent; const s=ensureState(e.output_index,e.item_id,'reasoning'); s.reasoningText+=e.delta; break; }\n case 'response.reasoning_text.done': { const e=payload as OpenAIResponsesReasoningTextDoneEvent; const s=ensureState(e.output_index,e.item_id,'reasoning'); s.reasoningText=e.text; break; }\n default: break;\n }\n yield payload;\n }\n if (terminalFailure || terminalIncomplete) {\n const response = terminalFailure ?? terminalIncomplete!; const status = terminalFailure ? 'failed' : 'incomplete';\n const detail = response.error?.message ?? response.incomplete_details?.reason ?? 'unknown error';\n throw new OpenAIResponsesStreamError('OpenAI Responses stream ' + status + ': ' + detail, response);\n }\n if (!finalResponse) {\n if (!responseMeta) throw new Error('OpenAI Responses stream ended without a terminal response payload');\n if (responseMeta.status === 'failed' || responseMeta.status === 'incomplete') {\n const detail=responseMeta.error?.message ?? responseMeta.incomplete_details?.reason ?? 'unknown error';\n throw new OpenAIResponsesStreamError('OpenAI Responses stream ' + responseMeta.status + ': ' + detail, responseMeta);\n }\n finalResponse={...responseMeta,output:reconstructedOutput(),status:'completed'};\n } else if (finalResponse.status === 'failed' || finalResponse.status === 'incomplete') {\n const detail=finalResponse.error?.message ?? finalResponse.incomplete_details?.reason ?? 'unknown error';\n throw new OpenAIResponsesStreamError('OpenAI Responses stream ' + finalResponse.status + ': ' + detail, finalResponse);\n }\n if (finalResponse.output.length===0 && outputs.size>0) finalResponse={...finalResponse,output:reconstructedOutput()};\n completed=true; this.removeAbortListener?.(); this.removeAbortListener=undefined; this.resolveFinal(finalResponse);\n } catch(error) { this.removeAbortListener?.(); this.removeAbortListener=undefined; this.rejectFinal(error); throw error; }\n finally { if(!completed){ this.source.abort?.(); this.rejectFinal(new OllamaAbortError('OpenAI Responses stream ended before completion')); } }\n }\n}\nexport class OpenAICompatClient {\n constructor(\n private readonly http: HttpClient,\n private readonly runner?: RequestRunner | undefined,\n ) {}\n\n private request<T>(\n operation: (http: HttpClient, signal?: AbortSignal) => Promise<T>,\n model: string | undefined,\n signal?: AbortSignal,\n holdUntil?: ((result: T) => Promise<unknown>) | undefined,\n ): Promise<T> {\n if (this.runner) {\n return this.runner(\n (http, runnerSignal) => operation(http, runnerSignal),\n {\n ...(model !== undefined ? { model } : {}),\n ...(signal !== undefined ? { signal } : {}),\n ...(holdUntil !== undefined ? { holdUntil } : {}),\n },\n );\n }\n return operation(this.http, signal);\n }\n\n async createChatCompletion(\n request: OpenAIChatCompletionRequest & { stream: true },\n signal?: AbortSignal,\n ): Promise<OpenAIChatCompletionStream>;\n async createChatCompletion(\n request: OpenAIChatCompletionRequest & { stream?: false | undefined },\n signal?: AbortSignal,\n ): Promise<OpenAIChatCompletionResponse>;\n async createChatCompletion(\n request: OpenAIChatCompletionRequest,\n signal?: AbortSignal,\n ): Promise<OpenAIChatCompletionResponse | OpenAIChatCompletionStream> {\n if (request.stream) {\n return this.request(\n (http, requestSignal) =>\n http.requestSseStream({\n path: '/v1/chat/completions',\n body: request,\n signal: requestSignal,\n }).then((source) => new OpenAIChatCompletionStream(source, requestSignal)),\n request.model,\n signal,\n (stream: OpenAIChatCompletionStream) => stream.finalResult,\n );\n }\n return this.request(\n (http, requestSignal) =>\n http.request<OpenAIChatCompletionResponse>({\n path: '/v1/chat/completions',\n body: request,\n signal: requestSignal,\n }),\n request.model,\n signal,\n );\n }\n\n async chatCompletions(\n request: OpenAIChatCompletionRequest & { stream: true },\n signal?: AbortSignal,\n ): Promise<OpenAIChatCompletionStream>;\n async chatCompletions(\n request: OpenAIChatCompletionRequest & { stream?: false | undefined },\n signal?: AbortSignal,\n ): Promise<OpenAIChatCompletionResponse>;\n async chatCompletions(\n request: OpenAIChatCompletionRequest,\n signal?: AbortSignal,\n ): Promise<OpenAIChatCompletionResponse | OpenAIChatCompletionStream> {\n return this.createChatCompletion(request as never, signal);\n }\n\n async listModels(signal?: AbortSignal): Promise<OpenAIListModelsResponse> {\n return this.request(\n (http, requestSignal) =>\n http.request<OpenAIListModelsResponse>({\n path: '/v1/models',\n method: 'GET',\n signal: requestSignal,\n }),\n undefined,\n signal,\n );\n }\n\n async retrieveModel(\n model: string,\n signal?: AbortSignal,\n ): Promise<OpenAIModelItem> {\n return this.request(\n (http, requestSignal) =>\n http.request<OpenAIModelItem>({\n path: `/v1/models/${encodeURIComponent(model)}`,\n method: 'GET',\n signal: requestSignal,\n }),\n model,\n signal,\n );\n }\n\n async getModel(model: string, signal?: AbortSignal): Promise<OpenAIModelItem> {\n return this.retrieveModel(model, signal);\n }\n\n async createCompletion(\n request: OpenAICompletionRequest & { stream: true },\n signal?: AbortSignal,\n ): Promise<OpenAICompletionStream>;\n async createCompletion(\n request: OpenAICompletionRequest & { stream?: false | undefined },\n signal?: AbortSignal,\n ): Promise<OpenAICompletionResponse>;\n async createCompletion(\n request: OpenAICompletionRequest,\n signal?: AbortSignal,\n ): Promise<OpenAICompletionResponse | OpenAICompletionStream> {\n if (request.stream) {\n return this.request(\n (http, requestSignal) =>\n http.requestSseStream({\n path: '/v1/completions',\n body: request,\n signal: requestSignal,\n }).then((source) => new OpenAICompletionStream(source, requestSignal)),\n request.model,\n signal,\n (stream: OpenAICompletionStream) => stream.finalResult,\n );\n }\n return this.request(\n (http, requestSignal) =>\n http.request<OpenAICompletionResponse>({\n path: '/v1/completions',\n body: request,\n signal: requestSignal,\n }),\n request.model,\n signal,\n );\n }\n\n async completions(\n request: OpenAICompletionRequest & { stream: true },\n signal?: AbortSignal,\n ): Promise<OpenAICompletionStream>;\n async completions(\n request: OpenAICompletionRequest & { stream?: false | undefined },\n signal?: AbortSignal,\n ): Promise<OpenAICompletionResponse>;\n async completions(\n request: OpenAICompletionRequest,\n signal?: AbortSignal,\n ): Promise<OpenAICompletionResponse | OpenAICompletionStream> {\n return this.createCompletion(request as never, signal);\n }\n\n async createEmbedding(\n request: OpenAIEmbeddingRequest,\n signal?: AbortSignal,\n ): Promise<OpenAIEmbeddingResponse> {\n return this.request(\n (http, requestSignal) =>\n http.request<OpenAIEmbeddingResponse>({\n path: '/v1/embeddings',\n body: request,\n signal: requestSignal,\n }),\n request.model,\n signal,\n );\n }\n\n async embeddings(\n request: OpenAIEmbeddingRequest,\n signal?: AbortSignal,\n ): Promise<OpenAIEmbeddingResponse> {\n return this.createEmbedding(request, signal);\n }\n\n async createResponses(\n request: OpenAIResponsesRequest & { stream: true },\n signal?: AbortSignal,\n ): Promise<OpenAIResponsesStream>;\n async createResponses(\n request: OpenAIResponsesRequest & { stream?: false | undefined },\n signal?: AbortSignal,\n ): Promise<OpenAIResponsesResponse>;\n async createResponses(\n request: OpenAIResponsesRequest,\n signal?: AbortSignal,\n ): Promise<OpenAIResponsesResponse | OpenAIResponsesStream> {\n if (request.stream) {\n return this.request(\n (http, requestSignal) =>\n http.requestSseStream({\n path: '/v1/responses',\n body: request,\n signal: requestSignal,\n }).then((source) => new OpenAIResponsesStream(source, requestSignal)),\n request.model,\n signal,\n (stream: OpenAIResponsesStream) => stream.finalResult,\n );\n }\n return this.request(\n (http, requestSignal) =>\n http.request<OpenAIResponsesResponse>({\n path: '/v1/responses',\n body: request,\n signal: requestSignal,\n }),\n request.model,\n signal,\n );\n }\n\n async responses(\n request: OpenAIResponsesRequest & { stream: true },\n signal?: AbortSignal,\n ): Promise<OpenAIResponsesStream>;\n async responses(\n request: OpenAIResponsesRequest & { stream?: false | undefined },\n signal?: AbortSignal,\n ): Promise<OpenAIResponsesResponse>;\n async responses(\n request: OpenAIResponsesRequest,\n signal?: AbortSignal,\n ): Promise<OpenAIResponsesResponse | OpenAIResponsesStream> {\n return this.createResponses(request as never, signal);\n }\n}\n","/**\n * Anthropic Compatibility interfaces and client helpers for Ollama.\n * Ollama supports the Anthropic Messages API format.\n */\n\nimport type { AbortableAsyncIterable } from '../streaming/types.js';\nimport type { SseEvent } from '../streaming/sse.js';\nimport type { HttpClient } from '../transport/http.js';\nimport type { RequestRunner } from '../transport/runner.js';\nimport { OllamaAbortError } from '../errors.js';\n\nexport interface AnthropicCacheControl {\n readonly type: 'ephemeral';\n readonly ttl?: '5m' | '1h' | undefined;\n}\n\nexport interface AnthropicTextContentBlock {\n readonly type: 'text';\n readonly text: string;\n readonly cache_control?: AnthropicCacheControl | undefined;\n}\n\nexport interface AnthropicImageContentBlock {\n readonly type: 'image';\n readonly source: {\n readonly type: 'base64';\n readonly media_type: string;\n readonly data: string;\n };\n}\n\nexport interface AnthropicToolUseContentBlock {\n readonly type: 'tool_use';\n readonly id: string;\n readonly name: string;\n readonly input: Record<string, unknown>;\n}\n\nexport interface AnthropicToolResultContentBlock {\n readonly type: 'tool_result';\n readonly tool_use_id: string;\n readonly content?: string | readonly AnthropicTextContentBlock[] | undefined;\n readonly is_error?: boolean | undefined;\n}\n\nexport interface AnthropicThinkingContentBlock {\n readonly type: 'thinking';\n readonly thinking: string;\n readonly signature?: string | undefined;\n}\n\nexport interface AnthropicRedactedThinkingContentBlock {\n readonly type: 'redacted_thinking';\n readonly data: string;\n}\n\nexport type AnthropicContentBlock =\n | AnthropicTextContentBlock\n | AnthropicImageContentBlock\n | AnthropicToolUseContentBlock\n | AnthropicToolResultContentBlock\n | AnthropicThinkingContentBlock\n | AnthropicRedactedThinkingContentBlock;\n\nexport interface AnthropicMessage {\n readonly role: 'user' | 'assistant';\n readonly content: string | readonly AnthropicContentBlock[];\n}\n\nexport interface AnthropicSystemTextBlock {\n readonly type: 'text';\n readonly text: string;\n readonly cache_control?: AnthropicCacheControl | undefined;\n}\n\nexport type AnthropicSystem = string | readonly AnthropicSystemTextBlock[];\n\nexport interface AnthropicTool {\n readonly name: string;\n readonly description?: string | undefined;\n readonly input_schema: Record<string, unknown>;\n readonly eager_input_streaming?: boolean | undefined;\n}\n\nexport type AnthropicToolChoice =\n | { readonly type: 'auto'; readonly disable_parallel_tool_use?: boolean | undefined }\n | { readonly type: 'any'; readonly disable_parallel_tool_use?: boolean | undefined }\n | { readonly type: 'tool'; readonly name: string; readonly disable_parallel_tool_use?: boolean | undefined }\n | { readonly type: 'none' };\n\nexport interface AnthropicThinkingConfig {\n readonly type: 'enabled' | 'disabled' | 'adaptive';\n readonly display?: 'omitted' | 'summarized' | 'updates' | undefined;\n /** Accepted by Ollama for compatibility but currently not enforced by the server. */\n readonly budget_tokens?: number | undefined;\n}\n\nexport interface AnthropicOutputConfig {\n readonly effort?: string | undefined;\n}\n\nexport interface AnthropicMetadata {\n readonly user_id?: string | undefined;\n}\n\nexport interface AnthropicMessagesRequest {\n readonly model: string;\n readonly messages: readonly AnthropicMessage[];\n readonly system?: AnthropicSystem | undefined;\n readonly max_tokens?: number | undefined;\n readonly temperature?: number | undefined;\n readonly top_p?: number | undefined;\n readonly top_k?: number | undefined;\n readonly stop_sequences?: readonly string[] | undefined;\n readonly stream?: boolean | undefined;\n readonly tools?: readonly AnthropicTool[] | undefined;\n readonly thinking?: AnthropicThinkingConfig | undefined;\n readonly output_config?: AnthropicOutputConfig | undefined;\n /**\n * Accepted for Anthropic compatibility but currently ignored by Ollama.\n * Tool selection cannot be forced through the Ollama compatibility endpoint.\n */\n readonly tool_choice?: AnthropicToolChoice | undefined;\n /** Accepted for compatibility but currently ignored by Ollama. */\n readonly metadata?: AnthropicMetadata | undefined;\n}\n\n/** Strict Ollama-documented Messages request; excludes fields Ollama marks unsupported. */\nexport type OllamaAnthropicTextContentBlock = Omit<\n AnthropicTextContentBlock,\n 'cache_control'\n>;\n\nexport type OllamaAnthropicTool = Omit<AnthropicTool, 'eager_input_streaming'>;\n\nexport type OllamaAnthropicThinkingConfig = {\n readonly type: 'enabled' | 'disabled';\n /** Accepted by Ollama for compatibility but currently not enforced by the server. */\n readonly budget_tokens?: number | undefined;\n};\n\nexport type OllamaAnthropicToolResultContentBlock = Omit<\n AnthropicToolResultContentBlock,\n 'content'\n> & {\n readonly content?: string | readonly OllamaAnthropicTextContentBlock[] | undefined;\n};\n\nexport type OllamaAnthropicContentBlock =\n | OllamaAnthropicTextContentBlock\n | AnthropicImageContentBlock\n | AnthropicToolUseContentBlock\n | OllamaAnthropicToolResultContentBlock\n | AnthropicThinkingContentBlock;\n\nexport type OllamaAnthropicMessage = Omit<AnthropicMessage, 'content'> & {\n readonly content: string | readonly OllamaAnthropicContentBlock[];\n};\n\nexport type OllamaAnthropicSystemTextBlock = Omit<\n AnthropicSystemTextBlock,\n 'cache_control'\n>;\n\nexport type OllamaAnthropicSystem =\n | string\n | readonly OllamaAnthropicSystemTextBlock[];\n\n/** Strict Ollama-documented Messages request; excludes unsupported caching/tool-choice metadata. */\nexport type OllamaAnthropicMessagesRequest = Omit<\n AnthropicMessagesRequest,\n 'messages' | 'system' | 'tools' | 'thinking' | 'tool_choice' | 'metadata'\n> & {\n readonly messages: readonly OllamaAnthropicMessage[];\n readonly system?: OllamaAnthropicSystem | undefined;\n readonly tools?: readonly OllamaAnthropicTool[] | undefined;\n readonly thinking?: OllamaAnthropicThinkingConfig | undefined;\n};\n\nexport interface AnthropicMessagesResponse {\n readonly id: string;\n readonly type: 'message';\n readonly role: 'assistant';\n readonly content: readonly AnthropicContentBlock[];\n readonly model: string;\n readonly stop_reason: string | null;\n readonly stop_sequence?: string | null | undefined;\n readonly usage?: {\n readonly input_tokens: number;\n readonly output_tokens: number;\n readonly cache_creation_input_tokens?: number | undefined;\n readonly cache_read_input_tokens?: number | undefined;\n readonly cache_creation?: Record<string, unknown> | undefined;\n } | undefined;\n}\n\nexport interface AnthropicMessageStartEvent {\n readonly type: 'message_start';\n readonly message: AnthropicMessagesResponse;\n}\n\nexport interface AnthropicContentBlockStartEvent {\n readonly type: 'content_block_start';\n readonly index: number;\n readonly content_block: AnthropicContentBlock;\n}\n\nexport type AnthropicContentBlockDelta =\n | { readonly type: 'text_delta'; readonly text: string }\n | { readonly type: 'input_json_delta'; readonly partial_json: string }\n | { readonly type: 'thinking_delta'; readonly thinking: string }\n | { readonly type: 'signature_delta'; readonly signature: string };\n\nexport interface AnthropicContentBlockDeltaEvent {\n readonly type: 'content_block_delta';\n readonly index: number;\n readonly delta: AnthropicContentBlockDelta;\n}\n\nexport interface AnthropicContentBlockStopEvent {\n readonly type: 'content_block_stop';\n readonly index: number;\n}\n\nexport interface AnthropicMessageDeltaEvent {\n readonly type: 'message_delta';\n readonly delta: {\n readonly stop_reason?: string | null | undefined;\n readonly stop_sequence?: string | null | undefined;\n };\n readonly usage?: {\n readonly input_tokens?: number | undefined;\n readonly output_tokens: number;\n readonly cache_creation_input_tokens?: number | undefined;\n readonly cache_read_input_tokens?: number | undefined;\n readonly cache_creation?: Record<string, unknown> | undefined;\n } | undefined;\n}\n\nexport interface AnthropicMessageStopEvent {\n readonly type: 'message_stop';\n}\n\nexport interface AnthropicPingEvent {\n readonly type: 'ping';\n}\n\nexport interface AnthropicErrorEvent {\n readonly type: 'error';\n readonly error: {\n readonly type: string;\n readonly message: string;\n };\n}\n\nexport interface AnthropicUnknownStreamEvent {\n /** Forward-compatible event type not yet modeled by this SDK. */\n readonly type: string;\n readonly [key: string]: unknown;\n}\n\nexport type AnthropicMessageStreamEvent =\n | AnthropicMessageStartEvent\n | AnthropicContentBlockStartEvent\n | AnthropicContentBlockDeltaEvent\n | AnthropicContentBlockStopEvent\n | AnthropicMessageDeltaEvent\n | AnthropicMessageStopEvent\n | AnthropicPingEvent\n | AnthropicErrorEvent\n | AnthropicUnknownStreamEvent;\n\ntype AnthropicKnownStreamEvent = Exclude<\n AnthropicMessageStreamEvent,\n AnthropicUnknownStreamEvent\n>;\n\nfunction isAnthropicKnownStreamEvent(\n event: AnthropicMessageStreamEvent,\n): event is AnthropicKnownStreamEvent {\n switch (event.type) {\n case 'message_start':\n case 'content_block_start':\n case 'content_block_delta':\n case 'content_block_stop':\n case 'message_delta':\n case 'message_stop':\n case 'ping':\n case 'error':\n return true;\n default:\n return false;\n }\n}\n\nfunction parseAnthropicEvent(event: SseEvent): AnthropicMessageStreamEvent {\n return JSON.parse(event.data) as AnthropicMessageStreamEvent;\n}\n\nfunction mergeContentBlock(\n current: AnthropicContentBlock,\n delta: AnthropicContentBlockDelta,\n): AnthropicContentBlock {\n if (delta.type === 'text_delta' && current.type === 'text') {\n return { ...current, text: current.text + delta.text };\n }\n if (delta.type === 'input_json_delta' && current.type === 'tool_use') {\n return current;\n }\n if (delta.type === 'thinking_delta' && current.type === 'thinking') {\n return { ...current, thinking: current.thinking + delta.thinking };\n }\n if (delta.type === 'signature_delta' && current.type === 'thinking') {\n return { ...current, signature: (current.signature ?? '') + delta.signature };\n }\n return current;\n}\n\nfunction sanitizeAnthropicTextBlock(\n block: AnthropicTextContentBlock,\n): OllamaAnthropicTextContentBlock {\n if (block.cache_control === undefined) return block;\n const { cache_control: _cacheControl, ...sanitized } = block;\n return sanitized;\n}\n\nfunction sanitizeAnthropicContentBlock(\n block: AnthropicContentBlock,\n): AnthropicContentBlock {\n if (block.type === 'text') {\n return sanitizeAnthropicTextBlock(block);\n }\n\n if (block.type === 'tool_result' && Array.isArray(block.content)) {\n return {\n ...block,\n content: block.content.map(sanitizeAnthropicTextBlock),\n };\n }\n\n return block;\n}\n\nfunction sanitizeAnthropicRequest(request: AnthropicMessagesRequest): AnthropicMessagesRequest {\n const messages = request.messages.map((message) => {\n if (typeof message.content === 'string') return message;\n return {\n ...message,\n content: message.content.map(sanitizeAnthropicContentBlock),\n };\n });\n\n const system = Array.isArray(request.system)\n ? request.system.map(sanitizeAnthropicTextBlock)\n : request.system;\n\n const {\n tool_choice: _toolChoice,\n metadata: _metadata,\n ...sanitized\n } = request;\n\n return {\n ...sanitized,\n messages,\n ...(system !== undefined ? { system } : {}),\n };\n}\nexport class AnthropicMessagesStream implements AsyncIterable<AnthropicMessageStreamEvent> {\n private readonly finalResultPromise: Promise<AnthropicMessagesResponse>;\n private resolveFinal!: (value: AnthropicMessagesResponse) => void;\n private rejectFinal!: (reason: unknown) => void;\n private removeAbortListener: (() => void) | undefined;\n\n constructor(private readonly source: AbortableAsyncIterable<SseEvent>, signal?: AbortSignal) {\n this.finalResultPromise = new Promise<AnthropicMessagesResponse>((resolve, reject) => {\n this.resolveFinal = resolve;\n this.rejectFinal = reject;\n });\n if (signal !== undefined) {\n const onAbort = (): void => this.abort();\n if (signal.aborted) onAbort();\n else {\n signal.addEventListener('abort', onAbort, { once: true });\n this.removeAbortListener = () => signal.removeEventListener('abort', onAbort);\n }\n }\n }\n\n get finalResult(): Promise<AnthropicMessagesResponse> {\n return this.finalResultPromise;\n }\n\n abort(): void {\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n this.source.abort?.();\n this.rejectFinal(new OllamaAbortError('Anthropic Messages stream aborted'));\n }\n\n async *[Symbol.asyncIterator](): AsyncGenerator<AnthropicMessageStreamEvent, void, undefined> {\n let message:\n | AnthropicMessagesResponse\n | undefined;\n const blocks = new Map<number, AnthropicContentBlock>();\n const toolInputJson = new Map<number, string>();\n let completed = false;\n\n try {\n for await (const rawEvent of this.source) {\n let event: AnthropicMessageStreamEvent;\n try {\n event = parseAnthropicEvent(rawEvent);\n } catch (error) {\n throw new Error('Failed to parse Anthropic message SSE payload', { cause: error });\n }\n\n if (!isAnthropicKnownStreamEvent(event)) {\n yield event;\n continue;\n }\n\n if (event.type === 'error') {\n throw new Error(event.error.message);\n }\n\n if (event.type === 'message_start') {\n message = {\n ...event.message,\n content: [],\n ...(event.message.usage !== undefined ? { usage: event.message.usage } : {}),\n };\n } else if (event.type === 'content_block_start') {\n blocks.set(event.index, event.content_block);\n } else if (event.type === 'content_block_delta') {\n const current = blocks.get(event.index);\n if (event.delta.type === 'input_json_delta') {\n toolInputJson.set(event.index, (toolInputJson.get(event.index) ?? '') + event.delta.partial_json);\n }\n if (current) blocks.set(event.index, mergeContentBlock(current, event.delta));\n } else if (event.type === 'content_block_stop') {\n const current = blocks.get(event.index);\n if (current?.type === 'tool_use') {\n const rawJson = toolInputJson.get(event.index);\n if (rawJson !== undefined && rawJson !== '') {\n try {\n const parsed = JSON.parse(rawJson) as Record<string, unknown>;\n blocks.set(event.index, { ...current, input: parsed });\n } catch {\n // Keep the provider-provided partial object when the accumulated JSON is malformed.\n blocks.set(event.index, current);\n }\n }\n }\n } else if (event.type === 'message_delta') {\n if (message) {\n message = {\n ...message,\n stop_reason:\n event.delta.stop_reason !== undefined && event.delta.stop_reason !== null\n ? event.delta.stop_reason\n : message.stop_reason,\n stop_sequence: event.delta.stop_sequence ?? message.stop_sequence,\n ...(event.usage !== undefined\n ? {\n usage: {\n input_tokens: event.usage.input_tokens ?? message.usage?.input_tokens ?? 0,\n output_tokens: event.usage.output_tokens,\n ...(event.usage.cache_creation_input_tokens !== undefined\n ? { cache_creation_input_tokens: event.usage.cache_creation_input_tokens }\n : message.usage?.cache_creation_input_tokens !== undefined\n ? { cache_creation_input_tokens: message.usage.cache_creation_input_tokens }\n : {}),\n ...(event.usage.cache_read_input_tokens !== undefined\n ? { cache_read_input_tokens: event.usage.cache_read_input_tokens }\n : message.usage?.cache_read_input_tokens !== undefined\n ? { cache_read_input_tokens: message.usage.cache_read_input_tokens }\n : {}),\n ...(event.usage.cache_creation !== undefined\n ? { cache_creation: event.usage.cache_creation }\n : message.usage?.cache_creation !== undefined\n ? { cache_creation: message.usage.cache_creation }\n : {}),\n },\n }\n : {}),\n };\n }\n } else if (event.type === 'message_stop' && message) {\n message = {\n ...message,\n content: [...blocks.entries()].sort(([a], [b]) => a - b).map(([, block]) => block),\n };\n }\n\n yield event;\n }\n\n if (!message) {\n throw new Error('Anthropic Messages stream ended without message_start');\n }\n\n const final: AnthropicMessagesResponse = {\n ...message,\n content: [...blocks.entries()].sort(([a], [b]) => a - b).map(([, block]) => block),\n };\n completed = true;\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n this.resolveFinal(final);\n } catch (error) {\n this.removeAbortListener?.();\n this.removeAbortListener = undefined;\n this.rejectFinal(error);\n throw error;\n } finally {\n if (!completed) {\n this.source.abort?.();\n this.rejectFinal(new OllamaAbortError('Anthropic Messages stream ended before completion'));\n }\n }\n }\n}\n\nexport class AnthropicCompatClient {\n constructor(\n private readonly http: HttpClient,\n private readonly runner?: RequestRunner | undefined,\n ) {}\n\n private request<T>(\n operation: (http: HttpClient, signal?: AbortSignal) => Promise<T>,\n model: string,\n signal?: AbortSignal,\n holdUntil?: ((result: T) => Promise<unknown>) | undefined,\n ): Promise<T> {\n if (this.runner) {\n return this.runner(\n (http, runnerSignal) => operation(http, runnerSignal),\n {\n model,\n ...(signal !== undefined ? { signal } : {}),\n ...(holdUntil !== undefined ? { holdUntil } : {}),\n },\n );\n }\n return operation(this.http, signal);\n }\n\n async createMessage(\n request: AnthropicMessagesRequest & { stream: true },\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesStream>;\n async createMessage(\n request: AnthropicMessagesRequest & { stream?: false | undefined },\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesResponse>;\n async createMessage(\n request: AnthropicMessagesRequest,\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesResponse | AnthropicMessagesStream>;\n async createMessage(\n request: AnthropicMessagesRequest,\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesResponse | AnthropicMessagesStream> {\n if (request.stream) {\n return this.request(\n (http, requestSignal) =>\n http.requestSseStream({\n path: '/v1/messages',\n body: sanitizeAnthropicRequest(request),\n headers: { 'anthropic-version': '2023-06-01' },\n signal: requestSignal,\n }).then((source) => new AnthropicMessagesStream(source, requestSignal)),\n request.model,\n signal,\n (stream: AnthropicMessagesStream) => stream.finalResult,\n );\n }\n return this.request(\n (http, requestSignal) =>\n http.request<AnthropicMessagesResponse>({\n path: '/v1/messages',\n body: sanitizeAnthropicRequest(request),\n headers: { 'anthropic-version': '2023-06-01' },\n signal: requestSignal,\n }),\n request.model,\n signal,\n );\n }\n\n async messages(\n request: AnthropicMessagesRequest & { stream: true },\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesStream>;\n async messages(\n request: AnthropicMessagesRequest & { stream?: false | undefined },\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesResponse>;\n async messages(\n request: AnthropicMessagesRequest,\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesResponse | AnthropicMessagesStream>;\n async messages(\n request: AnthropicMessagesRequest,\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesResponse | AnthropicMessagesStream> {\n if (request.stream) {\n return this.createMessage(request, signal);\n }\n return this.createMessage(request, signal);\n }\n}\n","// AUTO-GENERATED by `npm run contract:generate`. DO NOT EDIT.\n// Source: contracts/ir/ollama.ir.json (canonical Ollama IR).\n// Pairs with ./<name>.ts (the TypeScript interface).\n\nimport { z } from 'zod';\n\nexport const ToolCallSchema = z.object({\n function: z\n .object({\n name: z.string(),\n description: z.string().optional(),\n arguments: z.object({}).optional(),\n })\n .optional(),\n});\n","// AUTO-GENERATED by `npm run contract:generate`. DO NOT EDIT.\n// Source: contracts/ir/ollama.ir.json (canonical Ollama IR).\n// Pairs with ./<name>.ts (the TypeScript interface).\n\nimport { z } from 'zod';\nimport { ToolCallSchema } from './ToolCall.schema.js';\n\nexport const ChatMessageSchema = z.object({\n role: z.enum(['system', 'user', 'assistant', 'tool']),\n content: z.string(),\n images: z.array(z.string()).optional(),\n tool_calls: z.array(ToolCallSchema).optional(),\n});\n","// AUTO-GENERATED by `npm run contract:generate`. DO NOT EDIT.\n// Source: contracts/ir/ollama.ir.json (canonical Ollama IR).\n// Pairs with ./<name>.ts (the TypeScript interface).\n\nimport { z } from 'zod';\n\n/** Runtime options that control text generation */\nexport const ModelOptionsSchema = z\n .object({\n seed: z.number().optional(),\n temperature: z.number().optional(),\n top_k: z.number().optional(),\n top_p: z.number().optional(),\n min_p: z.number().optional(),\n stop: z.union([z.string(), z.array(z.string())]).optional(),\n num_ctx: z.number().optional(),\n num_predict: z.number().optional(),\n })\n .catchall(z.unknown());\n","// AUTO-GENERATED by `npm run contract:generate`. DO NOT EDIT.\n// Source: contracts/ir/ollama.ir.json (canonical Ollama IR).\n// Pairs with ./<name>.ts (the TypeScript interface).\n\nimport { z } from 'zod';\n\n/** Controls a model's thinking output. Use `/api/show` to discover the supported values and default for the selected model. `true` requests thinking, `false` requests no thinking output, and `null` uses the model default. String values are model-defined; supported names must match `/api/show` exactly. Numbers are not supported. */\nexport const ThinkValueSchema = z.union([z.boolean(), z.string(), z.null()]);\n","// AUTO-GENERATED by `npm run contract:generate`. DO NOT EDIT.\n// Source: contracts/ir/ollama.ir.json (canonical Ollama IR).\n// Pairs with ./<name>.ts (the TypeScript interface).\n\nimport { z } from 'zod';\n\nexport const ToolDefinitionSchema = z.object({\n type: z.enum(['function']),\n function: z.object({\n name: z.string(),\n description: z.string().optional(),\n parameters: z.object({}),\n }),\n});\n","// AUTO-GENERATED by `npm run contract:generate`. DO NOT EDIT.\n// Source: contracts/ir/ollama.ir.json (canonical Ollama IR).\n// Pairs with ./<name>.ts (the TypeScript interface).\n\nimport { z } from 'zod';\nimport { ChatMessageSchema } from './ChatMessage.schema.js';\nimport { ModelOptionsSchema } from './ModelOptions.schema.js';\nimport { ThinkValueSchema } from './ThinkValue.schema.js';\nimport { ToolDefinitionSchema } from './ToolDefinition.schema.js';\n\nexport const ChatRequestSchema = z.object({\n model: z.string(),\n messages: z.array(ChatMessageSchema),\n tools: z.array(ToolDefinitionSchema).optional(),\n format: z.union([z.enum(['json']), z.object({})]).optional(),\n options: ModelOptionsSchema.optional(),\n stream: z.boolean().optional(),\n think: ThinkValueSchema.optional(),\n keep_alive: z.union([z.string(), z.number()]).optional(),\n logprobs: z.boolean().optional(),\n top_logprobs: z.number().optional(),\n});\n","// AUTO-GENERATED by `npm run contract:generate`. DO NOT EDIT.\n// Source: contracts/ir/ollama.ir.json (canonical Ollama IR).\n// Pairs with ./<name>.ts (the TypeScript interface).\n\nimport { z } from 'zod';\nimport { ModelOptionsSchema } from './ModelOptions.schema.js';\nimport { ThinkValueSchema } from './ThinkValue.schema.js';\n\nexport const GenerateRequestSchema = z.object({\n model: z.string(),\n prompt: z.string().optional(),\n suffix: z.string().optional(),\n images: z.array(z.string()).optional(),\n format: z.union([z.string(), z.object({})]).optional(),\n system: z.string().optional(),\n stream: z.boolean().optional(),\n think: ThinkValueSchema.optional(),\n raw: z.boolean().optional(),\n keep_alive: z.union([z.string(), z.number()]).optional(),\n options: ModelOptionsSchema.optional(),\n logprobs: z.boolean().optional(),\n top_logprobs: z.number().optional(),\n});\n","// AUTO-GENERATED by `npm run contract:generate`. DO NOT EDIT.\n// Source: contracts/ir/ollama.ir.json (canonical Ollama IR).\n// Pairs with ./<name>.ts (the TypeScript interface).\n\nimport { z } from 'zod';\nimport { ModelOptionsSchema } from './ModelOptions.schema.js';\n\nexport const EmbedRequestSchema = z.object({\n model: z.string(),\n input: z.union([z.string(), z.array(z.string())]),\n truncate: z.boolean().optional(),\n dimensions: z.number().optional(),\n keep_alive: z.string().optional(),\n options: ModelOptionsSchema.optional(),\n});\n","// AUTO-GENERATED by `npm run contract:generate`. DO NOT EDIT.\n// Source: contracts/ir/ollama.ir.json (canonical Ollama IR).\n// Pairs with ./<name>.ts (the TypeScript interface).\n\nimport { z } from 'zod';\nimport { ChatMessageSchema } from './ChatMessage.schema.js';\n\nexport const CreateRequestSchema = z.object({\n model: z.string(),\n from: z.string().optional(),\n template: z.string().optional(),\n renderer: z.string().optional(),\n parser: z.string().optional(),\n files: z.object({}).catchall(z.string()).optional(),\n draft_files: z.object({}).catchall(z.string()).optional(),\n license: z.union([z.string(), z.array(z.string())]).optional(),\n system: z.string().optional(),\n parameters: z.object({}).optional(),\n messages: z.array(ChatMessageSchema).optional(),\n quantize: z.string().optional(),\n draft_quantize: z.string().optional(),\n requires: z.string().optional(),\n stream: z.boolean().optional(),\n});\n","// AUTO-GENERATED by `npm run contract:generate`. DO NOT EDIT.\n// Source: contracts/ir/ollama.ir.json (canonical Ollama IR).\n// Pairs with ./<name>.ts (the TypeScript interface).\n\nimport { z } from 'zod';\n\nexport const CopyRequestSchema = z.object({\n source: z.string(),\n destination: z.string(),\n});\n","// AUTO-GENERATED by `npm run contract:generate`. DO NOT EDIT.\n// Source: contracts/ir/ollama.ir.json (canonical Ollama IR).\n// Pairs with ./<name>.ts (the TypeScript interface).\n\nimport { z } from 'zod';\n\nexport const DeleteRequestSchema = z.object({\n model: z.string(),\n});\n","// AUTO-GENERATED by `npm run contract:generate`. DO NOT EDIT.\n// Source: contracts/ir/ollama.ir.json (canonical Ollama IR).\n// Pairs with ./<name>.ts (the TypeScript interface).\n\nimport { z } from 'zod';\n\nexport const PullRequestSchema = z.object({\n model: z.string(),\n insecure: z.boolean().optional(),\n stream: z.boolean().optional(),\n});\n","// AUTO-GENERATED by `npm run contract:generate`. DO NOT EDIT.\n// Source: contracts/ir/ollama.ir.json (canonical Ollama IR).\n// Pairs with ./<name>.ts (the TypeScript interface).\n\nimport { z } from 'zod';\n\nexport const PushRequestSchema = z.object({\n model: z.string(),\n insecure: z.boolean().optional(),\n stream: z.boolean().optional(),\n});\n","// AUTO-GENERATED by `npm run contract:generate`. DO NOT EDIT.\n// Source: contracts/ir/ollama.ir.json (canonical Ollama IR).\n// Pairs with ./<name>.ts (the TypeScript interface).\n\nimport { z } from 'zod';\n\nexport const ShowRequestSchema = z.object({\n model: z.string(),\n verbose: z.boolean().optional(),\n});\n","/**\n * Schema registry — maps operationId → request/response Zod schemas.\n *\n * The runtime consults this registry to validate request bodies before\n * sending and response payloads after receiving. This is the runtime\n * enforcement layer described in ADR 0019 (Zod schema generation) and\n * ADR 0020 (runtime validation wiring).\n *\n * The registry is hand-written (not generated) because:\n * 1. Not every operation has a request schema (GET/HEAD have no body).\n * 2. Not every operation has a response schema (DELETE returns 204).\n * 3. The map is small (21 operations) and changes only when overlays\n * add new operations — at which point the generator should remind\n * the maintainer to update this file via the contract validator.\n *\n * When `validateRequests: true` is set on `OllamaRuntime` and an\n * operation has no registered request schema, the runtime skips\n * validation (it doesn't fail — the contract just doesn't have a\n * schema for that operation yet).\n */\nimport type { z } from 'zod';\nimport { ChatRequestSchema } from '../models/ChatRequest.schema.js';\nimport { GenerateRequestSchema } from '../models/GenerateRequest.schema.js';\nimport { EmbedRequestSchema } from '../models/EmbedRequest.schema.js';\nimport { CreateRequestSchema } from '../models/CreateRequest.schema.js';\nimport { CopyRequestSchema } from '../models/CopyRequest.schema.js';\nimport { DeleteRequestSchema } from '../models/DeleteRequest.schema.js';\nimport { PullRequestSchema } from '../models/PullRequest.schema.js';\nimport { PushRequestSchema } from '../models/PushRequest.schema.js';\nimport { ShowRequestSchema } from '../models/ShowRequest.schema.js';\n\n/**\n * Map from operationId → request schema. Response schemas are intentionally\n * NOT registered here — see ADR 0020 for the rationale (response validation\n * would break on legitimate forward-compat extensions to the wire format).\n */\nexport const requestSchemas: Readonly<Record<string, z.ZodType>> = {\n chat: ChatRequestSchema,\n generate: GenerateRequestSchema,\n embed: EmbedRequestSchema,\n create: CreateRequestSchema,\n copy: CopyRequestSchema,\n delete: DeleteRequestSchema,\n pull: PullRequestSchema,\n push: PushRequestSchema,\n show: ShowRequestSchema,\n // Operations without a registered request schema (blobs, ps, tags,\n // version, systemOne, openai*, anthropic*) skip validation. This is\n // deliberate — the OpenAPI spec doesn't define request bodies for\n // GET/HEAD operations, and the compat-surface request schemas (OpenAI,\n // Anthropic) are richer than what the IR currently models.\n};\n\n/** Look up a request schema by operationId. Returns `undefined` if no schema exists. */\nexport function getRequestSchema(operationId: string): z.ZodType | undefined {\n return requestSchemas[operationId];\n}\n","/**\n * OllamaRuntime — the runtime seam generated API classes delegate to.\n *\n * This is the only hand-written file in `src/generated/runtime/`. Every\n * generated method in `src/generated/api/*-api.ts` ends with:\n *\n * ```ts\n * return this.runtime.invoke({ operation: chatOp, body: request });\n * ```\n *\n * The runtime is responsible for:\n * - Method/path resolution (from {@link OperationDefinition})\n * - Streaming default application (when the request doesn't set `stream`)\n * - Environment guard (rejecting cloud calls for local-only operations)\n * - Version constraint guard (failing fast when the server is too old)\n * - Delegating to the existing {@link HttpClient} for transport, retry,\n * telemetry, NDJSON/SSE parsing\n *\n * It is intentionally a thin adapter — the existing transport, streaming,\n * middleware, and error-mapping layers are preserved verbatim. This file\n * only adds the contract-aware glue between generated API classes and the\n * existing HttpClient.\n */\nimport { HttpClient, type HttpRequestOptions } from '../../transport/http.js';\nimport { parseNdjsonStream } from '../../streaming/ndjson.js';\nimport { OllamaGenericClientError, OllamaRequestValidationError } from '../../errors.js';\nimport type { OperationDefinition, InvokeRequest } from './operation-definition.js';\nimport { getRequestSchema } from './schema-registry.js';\n\n/** Constructor options for {@link OllamaRuntime}. */\nexport interface OllamaRuntimeOptions {\n readonly http: HttpClient;\n /**\n * Whether this runtime is targeting a local Ollama instance. Defaults to\n * `true`. When `false`, operations marked `environment.cloud === false`\n * (i.e. local-only like `/v1/systemone`) are rejected at request time.\n */\n readonly localMode?: boolean;\n /**\n * Server version, if known (typically from a prior `/api/version` call).\n * When set, operations with `constraints.minOllamaVersion` are checked\n * against this value at request time.\n */\n readonly serverVersion?: string;\n /**\n * When `true`, the runtime validates every request body against the\n * generated Zod schema before sending it. Defaults to `false` — opt-in.\n *\n * Validation behavior:\n * - If the operation has a registered request schema (see\n * {@link schema-registry.ts}), the body is parsed via `safeParse`.\n * - On parse failure, throws `OllamaRequestValidationError` with the\n * Zod issues attached. No HTTP request is made.\n * - On parse success, the parsed (and stripped of unknown fields) body\n * is sent — this means callers can't accidentally send extra fields\n * that the contract doesn't allow.\n * - If the operation has NO registered schema (e.g. GET endpoints,\n * `/v1/systemone`, OpenAI/Anthropic compat surfaces), validation is\n * skipped silently.\n *\n * Response validation is intentionally NOT enabled — see ADR 0020 for\n * the rationale (forward-compat with wire-format extensions).\n */\n readonly validateRequests?: boolean;\n}\n\nfunction compareVersions(a: string, b: string): number {\n const pa = a.split('.').map((s) => Number.parseInt(s, 10) ?? 0);\n const pb = b.split('.').map((s) => Number.parseInt(s, 10) ?? 0);\n for (let i = 0; i < Math.max(pa.length, pb.length); i += 1) {\n const va = pa[i] ?? 0;\n const vb = pb[i] ?? 0;\n if (va !== vb) return va - vb;\n }\n return 0;\n}\n\n/**\n * Apply environment + version guards before delegating to HttpClient.\n *\n * Throws {@link OllamaGenericClientError} when:\n * - The operation is local-only and the runtime is in cloud mode.\n * - The operation has `constraints.minOllamaVersion` and the server is older.\n */\nfunction assertOperationAllowed(\n operation: OperationDefinition,\n options: OllamaRuntimeOptions,\n): void {\n const localMode = options.localMode ?? true;\n if (!localMode && !operation.environment.cloud) {\n throw new OllamaGenericClientError(\n `Operation ${operation.operationId} (${operation.method} ${operation.path}) ` +\n `is local-only and not supported in cloud mode.`,\n );\n }\n if (\n operation.constraints?.minOllamaVersion &&\n options.serverVersion &&\n compareVersions(options.serverVersion, operation.constraints.minOllamaVersion) < 0\n ) {\n throw new OllamaGenericClientError(\n `Operation ${operation.operationId} (${operation.method} ${operation.path}) ` +\n `requires Ollama >= ${operation.constraints.minOllamaVersion} ` +\n `(server reports ${options.serverVersion}).`,\n );\n }\n}\n\n/**\n * Decide whether the request should stream. If the request body explicitly\n * sets `stream`, that wins. Otherwise the operation's `streamingDefault`\n * from the contract is used.\n */\nfunction shouldStream(req: InvokeRequest): boolean {\n if (req.body && typeof req.body === 'object' && 'stream' in req.body) {\n const explicit = (req.body as { stream?: unknown }).stream;\n if (typeof explicit === 'boolean') return explicit;\n }\n return Boolean(req.streamingDefault ?? req.operation.transport.streamingDefault);\n}\n\n/**\n * Apply the streaming default to the request body if needed.\n *\n * If the operation streams by default and the body doesn't set `stream`,\n * add `stream: true`. The user can always override by setting `stream`\n * explicitly on the request.\n */\nfunction buildBody(req: InvokeRequest): unknown {\n if (req.body === undefined) return undefined;\n if (typeof req.body !== 'object' || req.body === null) return req.body;\n const body = req.body as Record<string, unknown>;\n if (\n req.operation.transport.streaming &&\n req.operation.transport.streamingDefault &&\n body.stream === undefined\n ) {\n return { ...body, stream: true };\n }\n return body;\n}\n\n/** The runtime seam. */\nexport class OllamaRuntime {\n constructor(private readonly options: OllamaRuntimeOptions) {}\n\n /**\n * Invoke an operation. Called by every generated API method.\n *\n * Returns a `Promise<T>` for non-streaming operations, or an\n * `AsyncGenerator<T>` for streaming operations. The generated API\n * class's overloads pick the right return type at compile time.\n */\n async invoke<T = unknown>(req: InvokeRequest): Promise<T> {\n assertOperationAllowed(req.operation, this.options);\n let body = buildBody(req);\n\n // Wave 10 (ADR 0020): runtime Zod validation. Opt-in via\n // `validateRequests: true` on the runtime constructor. Throws\n // `OllamaRequestValidationError` BEFORE any HTTP request is made\n // when the body fails validation. The validated (and stripped)\n // body replaces the original so unknown fields can't leak through.\n if (this.options.validateRequests === true && body !== undefined) {\n const schema = getRequestSchema(req.operation.operationId);\n if (schema) {\n const result = schema.safeParse(body);\n if (!result.success) {\n throw new OllamaRequestValidationError(\n `Request validation failed for operation \"${req.operation.operationId}\" ` +\n `(${req.operation.method} ${req.operation.path}): ` +\n result.error.issues\n .map((i) => `${i.path.join('.') || '<root>'}: ${i.message}`)\n .join('; '),\n {\n operationId: req.operation.operationId,\n issues: result.error.issues,\n request: { method: req.operation.method, url: req.operation.path },\n },\n );\n }\n body = result.data;\n }\n }\n\n const streaming = shouldStream(req);\n\n // The HttpClient expects the narrow method union 'GET' | 'POST' |\n // 'DELETE' | 'HEAD' | undefined — cast through `as` because our\n // OperationDefinition.method is the wider HttpMethod type.\n const httpReq: HttpRequestOptions = {\n path: req.operation.path,\n method: req.operation.method as 'GET' | 'POST' | 'DELETE' | 'HEAD',\n ...(body !== undefined ? { body } : {}),\n ...(req.signal !== undefined ? { signal: req.signal } : {}),\n // For streaming calls, request the raw Response so we can pipe it\n // through parseNdjsonStream directly. This inherits middleware,\n // retry, telemetry, and error-mapping from HttpClient — the\n // previous Wave 3 implementation bypassed them with a direct\n // `fetch()` call.\n ...(streaming ? { raw: true } : {}),\n };\n\n if (!streaming) {\n return (await this.options.http.request<T>(httpReq)) as T;\n }\n\n // Streaming: HttpClient returns the raw Response (via the `raw: true`\n // option) so we can read its body as an NDJSON stream.\n const response = await this.options.http.request<Response>(httpReq);\n if (!response.body) {\n throw new OllamaGenericClientError(\n `Operation ${req.operation.operationId}: streaming response had no body.`,\n );\n }\n return parseNdjsonStream<T>(response.body) as unknown as T;\n }\n}\n","/**\n * Main OllamaClient class with failover, streaming, structured outputs, and ecosystem integrations.\n */\n\nimport { z } from 'zod';\nimport {\n DEFAULT_BASE_URL,\n DEFAULT_FAILOVER_CODES,\n DEFAULT_TIMEOUT_MS,\n OLLAMA_CLOUD_BASE_URL,\n resolveApiKey,\n resolveBaseUrl,\n resolveCredentialEndpoints,\n type OllamaClientConfig,\n} from './config.js';\nimport {\n OllamaClientError,\n OllamaModelRoutingError,\n OllamaUnsupportedCapabilityError,\n} from './errors.js';\nimport { createConsoleLogger, NOOP_LOGGER, type Logger } from './logger.js';\nimport { EndpointRegistry, type EndpointHealth } from './providers/endpoint-registry.js';\nimport { checkEndpointHealth, type EndpointHealthCheckResult } from './providers/health-check.js';\nimport {\n detectModelCapabilities,\n inferRuntimeMode,\n type ModelCapabilities,\n type RuntimeMode,\n} from './capabilities/capabilities.js';\nimport { parseStructuredOutput, zodToJsonSchema } from './schema/zod.js';\nimport { normalizeChatStream, normalizeGenerateStream } from './streaming/normalize.js';\nimport { OllamaStream } from './streaming/stream.js';\nimport type { ChatStreamResult, GenerateStreamResult } from './streaming/types.js';\nimport { HttpClient, type BinaryBody, type FetchLike } from './transport/http.js';\nimport { DEFAULT_RETRY_CONFIG, withRetry, type RetryConfig } from './transport/retry.js';\nimport { createTimeoutSignal } from './transport/timeout.js';\nimport { ModelsClient } from './models-client.js';\nimport { OpenAICompatClient } from './integrations/openai.js';\nimport { AnthropicCompatClient } from './integrations/anthropic.js';\nimport { OllamaRuntime } from './generated/runtime/runtime.js';\nimport { ensureToolCallIds } from './tools/tool-call-id.js';\nimport { withEncodedImages, withEncodedMessageImages } from './utils.js';\nimport {\n withSpan,\n ATTR_GEN_AI_SYSTEM,\n ATTR_GEN_AI_OPERATION_NAME,\n ATTR_GEN_AI_REQUEST_MODEL,\n ATTR_GEN_AI_RESPONSE_MODEL,\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n ATTR_OLLAMA_ENDPOINT_NAME,\n ATTR_OLLAMA_ENDPOINT_ATTEMPT,\n GEN_AI_SYSTEM_OLLAMA,\n} from './telemetry/index.js';\nimport type {\n ChatRequestOptions,\n ChatResponse,\n CopyRequestOptions,\n CreateRequestOptions,\n DeleteRequestOptions,\n EmbedRequestOptions,\n EmbedResponse,\n EmbeddingsRequestOptions,\n EmbeddingsResponse,\n GenerateRequestOptions,\n GenerateResponse,\n PullRequestOptions,\n PushRequestOptions,\n RequestCancellationOptions,\n ShowRequestOptions,\n WebFetchRequestOptions,\n WebFetchResponse,\n WebSearchRequestOptions,\n WebSearchResponse,\n} from './types.js';\n\nlet logicalRequestSequence = 0;\n\nfunction createLogicalRequestId(): string {\n logicalRequestSequence += 1;\n return `ollama-request-${logicalRequestSequence}`;\n}\n\n/**\n * High-level Ollama client — the original, hand-written API surface.\n *\n * **Wave 8 (ADR 0018) deprecation notice:**\n *\n * For new code, prefer the generated `NativeApi` from\n * {@link ./generated/runtime/runtime.js} + {@link ./generated/api/native-api.js}\n * instead. The generated surface:\n *\n * - Inherits every contract-layer guarantee (environment guards, version\n * guards, streaming defaults) automatically from the canonical IR.\n * - Stays in sync with the OpenAPI spec by construction — no hand-written\n * surface to drift.\n * - Uses the same `HttpClient` (and therefore the same middleware,\n * retry, telemetry, and streaming pipeline) as this client.\n *\n * The migration path is non-breaking:\n *\n * ```ts\n * // Before (still works, no breaking changes):\n * const client = new OllamaClient({ baseUrl: 'http://localhost:11434' });\n * const res = await client.chat({ model, messages });\n *\n * // After (recommended for new code):\n * const http = new HttpClient({ baseUrl: 'http://localhost:11434' });\n * const runtime = new OllamaRuntime({ http });\n * const api = new NativeApi(runtime);\n * const res = await api.chat({ model, messages, stream: false });\n * ```\n *\n * `OllamaClient` is preserved verbatim — existing callers do not need to\n * change anything. New methods and operations will land on the generated\n * surface first; `OllamaClient` will receive them only as a follow-up.\n */\nexport class OllamaClient {\n readonly registry: EndpointRegistry;\n readonly models: ModelsClient;\n private readonly retryConfig: RetryConfig;\n private readonly timeoutMs: number;\n private readonly failoverCodes: Set<string>;\n private readonly fetchImpl: FetchLike;\n private readonly logger: Logger;\n private readonly middleware: OllamaClientConfig['middleware'];\n private readonly onLifecycleEvent: OllamaClientConfig['onLifecycleEvent'];\n /**\n * API key for Ollama's hosted web tools (`webSearch`/`webFetch`), which always target\n * `OLLAMA_CLOUD_BASE_URL` regardless of `config.endpoints` — an Ollama account API key\n * is inherently a single global credential, not tied to any one inference endpoint.\n * Resolved the same way as a single-endpoint `apiKey` (`config.apiKey` falling back to\n * `OLLAMA_API_KEY`), independent of whether `config.endpoints` was used instead.\n */\n private readonly cloudApiKey: string | undefined;\n\n constructor(config: OllamaClientConfig = {}) {\n const resolvedApiKey = resolveApiKey(config.apiKey);\n this.cloudApiKey = resolvedApiKey;\n const credentialEndpoints = resolveCredentialEndpoints(config);\n const endpoints =\n config.endpoints ??\n (credentialEndpoints.length > 0\n ? []\n : [\n {\n name: 'default',\n baseUrl: resolveBaseUrl(config.baseUrl),\n ...(resolvedApiKey !== undefined ? { apiKey: resolvedApiKey } : {}),\n ...(config.headers !== undefined ? { headers: config.headers } : {}),\n },\n ]);\n this.registry = new EndpointRegistry(\n [...endpoints, ...credentialEndpoints],\n config.endpointHealth,\n );\n this.timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.failoverCodes = new Set(config.failoverOn ?? DEFAULT_FAILOVER_CODES);\n this.fetchImpl = config.fetch ?? globalThis.fetch;\n this.logger = config.logger ?? (config.debug ? createConsoleLogger() : NOOP_LOGGER);\n this.middleware = config.middleware;\n this.onLifecycleEvent = config.onLifecycleEvent;\n this.retryConfig =\n typeof config.retries === 'number'\n ? { ...DEFAULT_RETRY_CONFIG, maxRetries: config.retries }\n : { ...DEFAULT_RETRY_CONFIG, ...config.retries };\n this.models = new ModelsClient((op, opts) => this.executeWithFailover(op, opts));\n }\n\n get modelsClient(): ModelsClient {\n return this.models;\n }\n\n /**\n * Return a generated {@link OllamaRuntime} that shares this client's\n * transport (HttpClient + middleware + retry + telemetry).\n *\n * Wave 8 (ADR 0018) bridge: lets callers mix the existing `OllamaClient`\n * API with the generated `NativeApi` / `OpenAIApi` / `AnthropicApi`\n * surface without configuring two separate HttpClient instances.\n *\n * The returned runtime is bound to the registry's first candidate\n * endpoint (or the resolved single-endpoint config if no `endpoints`\n * array was provided). For multi-endpoint configs that need per-call\n * routing, prefer constructing `OllamaRuntime` directly with a\n * specific HttpClient:\n *\n * ```ts\n * const http = new HttpClient({ baseUrl: 'http://host-a:11434' });\n * const runtime = new OllamaRuntime({ http });\n * const api = new NativeApi(runtime);\n * ```\n *\n * The runtime is cached on first call — subsequent calls return the\n * same instance.\n */\n get runtime(): OllamaRuntime {\n if (this._runtime === undefined) {\n // Pick the first candidate endpoint to bind the runtime to. The\n // generated surface doesn't currently support multi-endpoint\n // failover; callers needing that should keep using OllamaClient\n // (or construct OllamaRuntime per-call with the desired endpoint).\n const candidates = this.registry.candidates();\n const endpoint = candidates[0];\n const baseUrl = endpoint?.baseUrl ?? 'http://localhost:11434';\n const http = new HttpClient({\n baseUrl,\n ...(endpoint?.apiKey !== undefined ? { apiKey: endpoint.apiKey } : {}),\n ...(endpoint?.headers !== undefined ? { headers: endpoint.headers } : {}),\n fetch: this.fetchImpl,\n ...(this.middleware !== undefined ? { middleware: this.middleware } : {}),\n ...(this.onLifecycleEvent !== undefined ? { onLifecycleEvent: this.onLifecycleEvent } : {}),\n });\n this._runtime = new OllamaRuntime({\n http,\n localMode: inferRuntimeMode(baseUrl) === 'local',\n });\n }\n return this._runtime;\n }\n private _runtime: OllamaRuntime | undefined;\n\n /**\n * Fail-fast guard for `format` (structured output) requests: throws before any network\n * call if the candidate endpoint is inferred as Ollama Cloud, which does not currently\n * support structured outputs (see `ModelCapabilities.supportsStructuredOutputRequest`).\n * `unsupported_capability` is in `DEFAULT_FAILOVER_CODES`, so in a multi-endpoint setup\n * this causes failover to the next candidate rather than failing the whole request.\n */\n private assertStructuredOutputSupported(baseUrl: string, model: string): void {\n if (inferRuntimeMode(baseUrl) === 'cloud') {\n throw new OllamaUnsupportedCapabilityError(\n `Structured output (\"format\") requests are not supported against Ollama Cloud ` +\n `endpoints (model \"${model}\" via ${baseUrl}). This is a known Ollama Cloud ` +\n `limitation, not a bug in this SDK.`,\n { capability: 'structuredOutputRequest' },\n );\n }\n }\n\n async executeWithFailover<T>(\n operation: (http: HttpClient, signal: AbortSignal) => Promise<T>,\n options?: {\n signal?: AbortSignal | undefined;\n timeoutMs?: number | undefined;\n /**\n * Disables cross-endpoint failover: only the single best candidate endpoint is\n * tried (same-endpoint retry via `withRetry` still applies). For operations whose\n * target IS the endpoint — model catalog/blob management — a different endpoint\n * isn't an interchangeable substitute, so failing over to one would silently\n * operate on the wrong server's state rather than retrying \"the same\" request. See\n * ADR 0008. Defaults to `false`, preserving normal failover for inference calls.\n */\n singleEndpoint?: boolean | undefined;\n /**\n * The model this request targets, used to filter candidates by\n * `OllamaEndpoint.models` (credential-scoped routing — see that field's docs).\n * Requests without a `model` (e.g. `listModels`) consider every configured\n * endpoint, same as before this option existed.\n */\n model?: string | undefined;\n /**\n * For an operation whose real completion outlasts its own returned promise — a\n * streaming response, specifically — defers releasing the endpoint's concurrency\n * slot (see `EndpointRegistryOptions.maxConcurrentPerEndpoint`/`'least-connections'`)\n * until the promise this returns settles, instead of releasing as soon as\n * `operation` resolves. Pass `(stream) => stream.finalResult` for `chatStream`/\n * `generateStream` so the slot stays held for as long as the underlying HTTP\n * connection realistically does — until the stream is fully consumed, errors, or is\n * aborted. Omit for anything whose returned promise already represents the whole\n * request/response (the default, and correct for every non-streaming call).\n */\n holdUntil?: ((result: T) => Promise<unknown>) | undefined;\n },\n ): Promise<T> {\n const timeout = createTimeoutSignal(options?.timeoutMs ?? this.timeoutMs, options?.signal);\n const requestId = createLogicalRequestId();\n let deferTimeoutCancel = false;\n try {\n let lastError: Error | undefined;\n\n for (;;) {\n const allCandidates = this.registry.candidates(options?.model);\n if (\n allCandidates.length === 0 &&\n options?.model !== undefined &&\n this.registry.hasModelScopedEndpoints()\n ) {\n const configured = this.registry\n .list()\n .flatMap((ep) => ep.models ?? [])\n .filter((m, i, arr) => arr.indexOf(m) === i);\n throw new OllamaModelRoutingError(\n `No configured endpoint is authorized for model \"${options.model}\". ` +\n (configured.length > 0\n ? `Endpoints are scoped to: ${configured.join(', ')}.`\n : 'No endpoint declares a `models` allow-list that includes it.') +\n ' Add or widen an `OllamaEndpoint.models` entry to route this model.',\n { model: options.model, availableModels: configured },\n );\n }\n const candidates = options?.singleEndpoint ? allCandidates.slice(0, 1) : allCandidates;\n\n const runnable = this.registry.filterWithCapacity(candidates);\n if (runnable.length === 0 && candidates.length > 0) {\n await this.registry.waitForCapacity(\n candidates.map((c) => c.name),\n timeout.signal,\n );\n continue;\n }\n\n for (const [attemptIndex, endpoint] of runnable.entries()) {\n this.logger.debug(`Executing on endpoint \"${endpoint.name}\" (${endpoint.baseUrl})`);\n const http = new HttpClient({\n baseUrl: endpoint.baseUrl,\n ...(endpoint.apiKey !== undefined ? { apiKey: endpoint.apiKey } : {}),\n ...(endpoint.headers !== undefined ? { headers: endpoint.headers } : {}),\n fetch: this.fetchImpl,\n middleware: this.middleware,\n onLifecycleEvent: this.onLifecycleEvent,\n requestId,\n });\n\n // Acquired synchronously, right after this endpoint was chosen from\n // `candidates()`/`filterWithCapacity()` with no `await` in between — see\n // `EndpointRegistryOptions.strategy`'s `'least-connections'` doc for why that\n // ordering is what makes it race-free.\n this.registry.acquire(endpoint.name);\n let holdPromise: Promise<unknown> | undefined;\n try {\n const result = await withSpan(\n 'ollama.endpoint.attempt',\n {\n [ATTR_OLLAMA_ENDPOINT_NAME]: endpoint.name,\n [ATTR_OLLAMA_ENDPOINT_ATTEMPT]: attemptIndex,\n },\n () =>\n withRetry(\n () => operation(http, timeout.signal),\n {\n ...this.retryConfig,\n onRetry: (error, attempt, delayMs) => {\n this.retryConfig.onRetry?.(error, attempt, delayMs);\n this.onLifecycleEvent?.({\n type: 'retry',\n requestId,\n attempt: attempt + 1,\n error,\n delayMs,\n timestamp: Date.now(),\n });\n },\n },\n timeout.signal,\n ),\n );\n this.registry.reportSuccess(endpoint.name);\n if (options?.holdUntil) {\n holdPromise = options.holdUntil(result);\n deferTimeoutCancel = true;\n }\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n lastError = error;\n this.registry.reportFailure(endpoint.name);\n this.logger.warn(`Failed on \"${endpoint.name}\": ${error.message}`);\n if (!(error instanceof OllamaClientError && this.failoverCodes.has(error.code)))\n throw error;\n } finally {\n if (holdPromise) {\n void holdPromise\n .catch(() => undefined)\n .finally(() => {\n timeout.cancel();\n this.registry.release(endpoint.name);\n });\n } else {\n this.registry.release(endpoint.name);\n }\n }\n }\n throw lastError ?? new Error('No healthy Ollama endpoints available');\n }\n } finally {\n if (!deferTimeoutCancel) timeout.cancel();\n }\n }\n\n // --- Chat ---\n chat(\n req: ChatRequestOptions & { stream: true },\n ): Promise<OllamaStream<ChatResponse, ChatStreamResult>>;\n chat(req: ChatRequestOptions & { stream?: false | undefined }): Promise<ChatResponse>;\n chat(\n req: ChatRequestOptions,\n ): Promise<ChatResponse | OllamaStream<ChatResponse, ChatStreamResult>>;\n async chat(\n req: ChatRequestOptions,\n ): Promise<ChatResponse | OllamaStream<ChatResponse, ChatStreamResult>> {\n const encodedMessages = await withEncodedMessageImages(req.messages);\n const messages = encodedMessages.map((message) => {\n if (message.role === 'tool' && message.tool_call_id !== undefined) {\n const { tool_call_id: _toolCallId, ...nativeMessage } = message;\n return nativeMessage;\n }\n return message;\n });\n if (req.stream) {\n return this.executeWithFailover(\n async (http, signal) => {\n if (req.format !== undefined)\n this.assertStructuredOutputSupported(http.baseUrl, req.model);\n const stream = await http.requestStream<ChatResponse>({\n path: '/api/chat',\n body: { ...req, messages, stream: true },\n signal,\n });\n return normalizeChatStream(stream, signal);\n },\n {\n signal: req.signal,\n timeoutMs: req.timeoutMs,\n model: req.model,\n // The endpoint's concurrency slot must stay held for as long as the stream is\n // actually being consumed, not just until the initial response/headers arrive\n // — see `executeWithFailover`'s `holdUntil` doc.\n holdUntil: (stream) => stream.finalResult,\n },\n );\n }\n return withSpan(\n `chat ${req.model}`,\n {\n [ATTR_GEN_AI_SYSTEM]: GEN_AI_SYSTEM_OLLAMA,\n [ATTR_GEN_AI_OPERATION_NAME]: 'chat',\n [ATTR_GEN_AI_REQUEST_MODEL]: req.model,\n },\n async (span) => {\n const rawRes = await this.executeWithFailover((http, signal) => {\n if (req.format !== undefined)\n this.assertStructuredOutputSupported(http.baseUrl, req.model);\n return http.request<ChatResponse>({\n path: '/api/chat',\n body: { ...req, messages, stream: false },\n signal,\n });\n }, req);\n const toolCalls = ensureToolCallIds(rawRes.message.tool_calls);\n const res: ChatResponse =\n toolCalls === rawRes.message.tool_calls\n ? rawRes\n : { ...rawRes, message: { ...rawRes.message, tool_calls: toolCalls } };\n span?.setAttributes({\n [ATTR_GEN_AI_RESPONSE_MODEL]: res.model,\n ...(res.prompt_eval_count !== undefined\n ? { [ATTR_GEN_AI_USAGE_INPUT_TOKENS]: res.prompt_eval_count }\n : {}),\n ...(res.eval_count !== undefined\n ? { [ATTR_GEN_AI_USAGE_OUTPUT_TOKENS]: res.eval_count }\n : {}),\n });\n return res;\n },\n );\n }\n\n chatStream(\n req: Omit<ChatRequestOptions, 'stream'>,\n ): Promise<OllamaStream<ChatResponse, ChatStreamResult>> {\n return this.chat({ ...req, stream: true });\n }\n\n async chatText(req: Omit<ChatRequestOptions, 'stream'>): Promise<string> {\n const res = await this.chat({ ...req, stream: false });\n return res.message.content;\n }\n\n async chatWithSchema<T>(\n req: Omit<ChatRequestOptions, 'stream' | 'format'>,\n schema: z.ZodType<T>,\n ): Promise<T> {\n const res = await this.chat({ ...req, format: zodToJsonSchema(schema), stream: false });\n return parseStructuredOutput(res.message.content, schema);\n }\n\n // --- Generate ---\n generate(\n req: GenerateRequestOptions & { stream: true },\n ): Promise<OllamaStream<GenerateResponse, GenerateStreamResult>>;\n generate(req: GenerateRequestOptions & { stream?: false | undefined }): Promise<GenerateResponse>;\n generate(\n req: GenerateRequestOptions,\n ): Promise<GenerateResponse | OllamaStream<GenerateResponse, GenerateStreamResult>>;\n async generate(\n req: GenerateRequestOptions,\n ): Promise<GenerateResponse | OllamaStream<GenerateResponse, GenerateStreamResult>> {\n const encodedReq = await withEncodedImages(req);\n if (encodedReq.stream) {\n return this.executeWithFailover(\n async (http, signal) => {\n if (encodedReq.format !== undefined)\n this.assertStructuredOutputSupported(http.baseUrl, encodedReq.model);\n const stream = await http.requestStream<GenerateResponse>({\n path: '/api/generate',\n body: { ...encodedReq, stream: true },\n signal,\n });\n return normalizeGenerateStream(stream, signal);\n },\n {\n signal: encodedReq.signal,\n timeoutMs: encodedReq.timeoutMs,\n model: encodedReq.model,\n holdUntil: (stream) => stream.finalResult,\n },\n );\n }\n return withSpan(\n `text_completion ${encodedReq.model}`,\n {\n [ATTR_GEN_AI_SYSTEM]: GEN_AI_SYSTEM_OLLAMA,\n [ATTR_GEN_AI_OPERATION_NAME]: 'text_completion',\n [ATTR_GEN_AI_REQUEST_MODEL]: encodedReq.model,\n },\n async (span) => {\n const res = await this.executeWithFailover((http, signal) => {\n if (encodedReq.format !== undefined)\n this.assertStructuredOutputSupported(http.baseUrl, encodedReq.model);\n return http.request<GenerateResponse>({\n path: '/api/generate',\n body: { ...encodedReq, stream: false },\n signal,\n });\n }, encodedReq);\n span?.setAttributes({\n [ATTR_GEN_AI_RESPONSE_MODEL]: res.model,\n ...(res.prompt_eval_count !== undefined\n ? { [ATTR_GEN_AI_USAGE_INPUT_TOKENS]: res.prompt_eval_count }\n : {}),\n ...(res.eval_count !== undefined\n ? { [ATTR_GEN_AI_USAGE_OUTPUT_TOKENS]: res.eval_count }\n : {}),\n });\n return res;\n },\n );\n }\n\n generateStream(\n req: Omit<GenerateRequestOptions, 'stream'>,\n ): Promise<OllamaStream<GenerateResponse, GenerateStreamResult>> {\n return this.generate({ ...req, stream: true });\n }\n\n async generateText(req: Omit<GenerateRequestOptions, 'stream'>): Promise<string> {\n const res = await this.generate({ ...req, stream: false });\n return res.response;\n }\n\n async generateWithSchema<T>(\n req: Omit<GenerateRequestOptions, 'stream' | 'format'>,\n schema: z.ZodType<T>,\n ): Promise<T> {\n const res = await this.generate({ ...req, format: zodToJsonSchema(schema), stream: false });\n return parseStructuredOutput(res.response, schema);\n }\n\n // --- Embeddings ---\n embed(req: EmbedRequestOptions): Promise<EmbedResponse> {\n return this.executeWithFailover(\n (http, signal) => http.request<EmbedResponse>({ path: '/api/embed', body: req, signal }),\n req,\n );\n }\n\n async embedText(\n model: string,\n input: string | readonly string[],\n ): Promise<readonly (readonly number[])[]> {\n const res = await this.embed({ model, input });\n return res.embeddings;\n }\n\n /**\n * @deprecated Ollama's `/api/embeddings` endpoint has been superseded by `/api/embed`\n * (exposed here as {@link OllamaClient.embed}), which additionally supports batch\n * input. Kept for compatibility with existing callers; new code should use `embed`.\n */\n embeddings(req: EmbeddingsRequestOptions): Promise<EmbeddingsResponse> {\n return this.executeWithFailover(\n (http, signal) =>\n http.request<EmbeddingsResponse>({ path: '/api/embeddings', body: req, signal }),\n req,\n );\n }\n\n // --- Model Operations (Delegated to ModelsClient) ---\n readonly listModels = () => this.models.list();\n readonly showModel = (req: ShowRequestOptions) => this.models.show(req);\n readonly pullModel = (r: PullRequestOptions) => this.models.pull(r);\n readonly pushModel = (r: PushRequestOptions) => this.models.push(r);\n readonly createModel = (r: CreateRequestOptions) => this.models.create(r);\n readonly deleteModel = (req: DeleteRequestOptions) => this.models.delete(req);\n readonly copyModel = (req: CopyRequestOptions) => this.models.copy(req);\n readonly ps = () => this.models.ps();\n readonly version = () => this.models.version();\n readonly createBlob = (digest: string, data: BinaryBody) => this.models.createBlob(digest, data);\n readonly checkBlob = (digest: string) => this.models.checkBlob(digest);\n\n // --- Web Endpoints ---\n /**\n * Ollama's hosted web search tool (`POST https://ollama.com/api/web_search`) — a fixed\n * Ollama Cloud service, unrelated to `config.endpoints`/`baseUrl` and not proxied\n * through a local server. Requires an Ollama account API key: pass `apiKey` to the\n * client constructor or set `OLLAMA_API_KEY`. Applies the same default `timeoutMs` and\n * retry policy as inference calls, but never cross-endpoint-fails-over — there is only\n * ever the one cloud endpoint to call.\n */\n async webSearch(req: WebSearchRequestOptions): Promise<WebSearchResponse> {\n const { count, max_results, ...rest } = req;\n const res = await this.executeCloudRequest(\n (http, signal) =>\n http.request<WebSearchResponse>({\n path: '/api/web_search',\n body: { ...rest, max_results: max_results ?? count },\n signal,\n }),\n req,\n );\n // `snippet` is a deprecated mirror of `content`, kept for backward compatibility —\n // see the `@deprecated` note on `WebSearchResult.snippet`.\n return { results: res.results.map((r) => ({ ...r, snippet: r.content })) };\n }\n /**\n * Ollama's hosted web fetch tool (`POST https://ollama.com/api/web_fetch`) — see\n * {@link OllamaClient.webSearch} for the cloud-endpoint/auth/timeout/retry behavior,\n * which applies identically here.\n */\n webFetch(req: WebFetchRequestOptions): Promise<WebFetchResponse> {\n return this.executeCloudRequest(\n (http, signal) =>\n http.request<WebFetchResponse>({ path: '/api/web_fetch', body: req, signal }),\n req,\n );\n }\n /**\n * Runs `operation` against the fixed Ollama Cloud host with this client's default\n * timeout and retry policy — the same primitives `executeWithFailover` uses, minus the\n * multi-candidate loop, since `webSearch`/`webFetch` only ever have the one endpoint.\n */\n private async executeCloudRequest<T>(\n operation: (http: HttpClient, signal: AbortSignal) => Promise<T>,\n options: RequestCancellationOptions,\n ): Promise<T> {\n const timeout = createTimeoutSignal(options.timeoutMs ?? this.timeoutMs, options.signal);\n using _timeout = {\n [Symbol.dispose]() {\n timeout.cancel();\n },\n };\n const requestId = createLogicalRequestId();\n const http = new HttpClient({\n baseUrl: OLLAMA_CLOUD_BASE_URL,\n apiKey: this.cloudApiKey,\n fetch: this.fetchImpl,\n middleware: this.middleware,\n onLifecycleEvent: this.onLifecycleEvent,\n requestId,\n });\n return await withRetry(\n () => operation(http, timeout.signal),\n {\n ...this.retryConfig,\n onRetry: (error, attempt, delayMs) => {\n this.retryConfig.onRetry?.(error, attempt, delayMs);\n this.onLifecycleEvent?.({\n type: 'retry',\n requestId,\n attempt: attempt + 1,\n error,\n delayMs,\n timestamp: Date.now(),\n });\n },\n },\n timeout.signal,\n );\n // timeout.cancel() called automatically via `using _timeout`\n }\n\n // --- Capabilities & Health ---\n capabilities(model: string, signal?: AbortSignal): Promise<ModelCapabilities> {\n return this.executeWithFailover(\n (http, runnerSignal) => detectModelCapabilities(http, model, runnerSignal),\n {\n singleEndpoint: true,\n model,\n ...(signal !== undefined ? { signal } : {}),\n },\n );\n }\n runtimeMode(): RuntimeMode {\n const ep = this.registry.candidates()[0];\n return inferRuntimeMode(ep?.baseUrl ?? DEFAULT_BASE_URL);\n }\n healthCheck(): Promise<EndpointHealthCheckResult[]> {\n return Promise.all(\n this.registry\n .list()\n .map((ep) =>\n checkEndpointHealth(ep, this.fetchImpl, 5000, this.middleware, this.onLifecycleEvent),\n ),\n );\n }\n endpointStatus(): EndpointHealth[] {\n return this.registry.status();\n }\n\n // --- Compatibility Adapters ---\n get openai(): OpenAICompatClient {\n const ep = this.registry.candidates()[0];\n return new OpenAICompatClient(\n new HttpClient({\n baseUrl: ep?.baseUrl ?? DEFAULT_BASE_URL,\n apiKey: ep?.apiKey,\n headers: ep?.headers,\n fetch: this.fetchImpl,\n middleware: this.middleware,\n onLifecycleEvent: this.onLifecycleEvent,\n }),\n (op, opts) => this.executeWithFailover(op, opts),\n );\n }\n get anthropic(): AnthropicCompatClient {\n const ep = this.registry.candidates()[0];\n return new AnthropicCompatClient(\n new HttpClient({\n baseUrl: ep?.baseUrl ?? DEFAULT_BASE_URL,\n apiKey: ep?.apiKey,\n headers: ep?.headers,\n fetch: this.fetchImpl,\n middleware: this.middleware,\n onLifecycleEvent: this.onLifecycleEvent,\n }),\n (op, opts) => this.executeWithFailover(op, opts),\n );\n }\n}\n","/**\n * Web Standard Stream adapters for OllamaStream.\n * Enables seamless integration with Vercel AI SDK, Next.js route handlers, and standard web fetch responses.\n */\n\nimport type { OllamaStream } from './stream.js';\n\n/**\n * Transforms an OllamaStream into a standard Web ReadableStream of token text strings.\n */\nexport function toTextStream<TChunk, TFinal>(\n stream: OllamaStream<TChunk, TFinal>,\n): ReadableStream<string> {\n const iterator = stream[Symbol.asyncIterator]();\n\n return new ReadableStream<string>({\n async pull(controller) {\n try {\n while (true) {\n const { done, value } = await iterator.next();\n if (done) {\n controller.close();\n return;\n }\n if (value.type === 'token' && value.data.delta) {\n controller.enqueue(value.data.delta);\n return;\n }\n }\n } catch (err) {\n controller.error(err);\n }\n },\n cancel() {\n stream.abort();\n },\n });\n}\n\n/**\n * Transforms an OllamaStream into a standard Web ReadableStream of encoded Uint8Array bytes.\n */\nexport function toDataStream<TChunk, TFinal>(\n stream: OllamaStream<TChunk, TFinal>,\n): ReadableStream<Uint8Array> {\n const textStream = toTextStream(stream);\n const reader = textStream.getReader();\n const encoder = new TextEncoder();\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n return;\n }\n controller.enqueue(encoder.encode(value));\n } catch (err) {\n controller.error(err);\n }\n },\n cancel() {\n reader.cancel();\n stream.abort();\n },\n });\n}\n\n/**\n * Converts an OllamaStream directly into a standard Web Response with text/plain streaming headers.\n */\nexport function toResponse<TChunk, TFinal>(\n stream: OllamaStream<TChunk, TFinal>,\n init: ResponseInit = {},\n): Response {\n const body = toDataStream(stream);\n const headers = new Headers(init.headers);\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'text/plain; charset=utf-8');\n }\n return new Response(body, { ...init, headers });\n}\n","/**\n * Client-side usage budgeting.\n *\n * Ollama Cloud does not expose account-level quota or remaining-budget through the API —\n * chat/generate responses carry only per-request token counts, and there is no header or\n * endpoint that reports how much of your plan's session or weekly limit is left (the only\n * way to see that today is the https://ollama.com dashboard or the 90%-usage email). See\n * https://github.com/ollama/ollama/issues/15663.\n *\n * `QuotaManager` does not — and cannot — read Ollama's real limits. It tracks usage you\n * record against budgets *you* configure over one or more rolling windows, and refuses to\n * proceed once a window's budget is spent. Pair it with `OllamaRateLimitError` (thrown by\n * `OllamaClient` on the server's actual 429) as the authoritative signal; treat\n * `QuotaManager` as a local safety net that fails fast before the request is even sent.\n */\n\nimport { OllamaQuotaExceededError } from './errors.js';\nimport { extractUsage, type RawUsageSource, type TokenUsage } from './usage.js';\n\nexport interface QuotaWindowConfig {\n /** Identifies this window in status reports and thrown errors (e.g. \"session\", \"weekly\"). */\n readonly id: string;\n /** Length of the rolling window in milliseconds, after which usage resets to zero. */\n readonly windowMs: number;\n /** Token budget for the window. Omit to only track requests. */\n readonly maxTokens?: number;\n /** Request-count budget for the window. Omit to only track tokens. */\n readonly maxRequests?: number;\n}\n\nexport interface QuotaWindowStatus extends QuotaWindowConfig {\n readonly tokensUsed: number;\n readonly requestsMade: number;\n readonly windowStartedAt: number;\n readonly windowResetAt: number;\n readonly remainingTokens?: number;\n readonly remainingRequests?: number;\n}\n\nexport interface QuotaManagerOptions {\n readonly windows: readonly QuotaWindowConfig[];\n /** Clock override for testing. Defaults to `Date.now`. */\n readonly now?: () => number;\n}\n\ninterface WindowState {\n readonly config: QuotaWindowConfig;\n tokensUsed: number;\n requestsMade: number;\n windowStartedAt: number;\n}\n\nexport class QuotaManager {\n private readonly now: () => number;\n private readonly windows: readonly WindowState[];\n\n constructor(options: QuotaManagerOptions) {\n if (options.windows.length === 0) {\n throw new Error('QuotaManager requires at least one window configuration.');\n }\n this.now = options.now ?? Date.now;\n this.windows = options.windows.map((config) => ({\n config,\n tokensUsed: 0,\n requestsMade: 0,\n windowStartedAt: this.now(),\n }));\n }\n\n private rollover(state: WindowState): void {\n if (this.now() - state.windowStartedAt >= state.config.windowMs) {\n state.tokensUsed = 0;\n state.requestsMade = 0;\n state.windowStartedAt = this.now();\n }\n }\n\n /** Current usage, budgets, and reset time for every configured window. */\n status(): readonly QuotaWindowStatus[] {\n return this.windows.map((state) => {\n this.rollover(state);\n const { config } = state;\n return {\n ...config,\n tokensUsed: state.tokensUsed,\n requestsMade: state.requestsMade,\n windowStartedAt: state.windowStartedAt,\n windowResetAt: state.windowStartedAt + config.windowMs,\n ...(config.maxTokens !== undefined\n ? { remainingTokens: Math.max(0, config.maxTokens - state.tokensUsed) }\n : {}),\n ...(config.maxRequests !== undefined\n ? { remainingRequests: Math.max(0, config.maxRequests - state.requestsMade) }\n : {}),\n };\n });\n }\n\n /**\n * True if one more request — optionally estimated at `estimatedTokens` — would stay\n * within every configured window's budget. Read-only; does not record usage.\n */\n canProceed(estimatedTokens = 0): boolean {\n return this.windows.every((state) => {\n this.rollover(state);\n const { config } = state;\n if (config.maxRequests !== undefined && state.requestsMade + 1 > config.maxRequests) {\n return false;\n }\n return !(\n config.maxTokens !== undefined && state.tokensUsed + estimatedTokens > config.maxTokens\n );\n });\n }\n\n /**\n * Throws `OllamaQuotaExceededError` for the first window that `canProceed(estimatedTokens)`\n * would fail on; otherwise a no-op. Call before issuing a request.\n */\n assertCanProceed(estimatedTokens = 0): void {\n for (const state of this.windows) {\n this.rollover(state);\n const { config } = state;\n if (config.maxRequests !== undefined && state.requestsMade + 1 > config.maxRequests) {\n throw new OllamaQuotaExceededError(\n `Client-side quota window \"${config.id}\" would exceed its request budget ` +\n `(${state.requestsMade}/${config.maxRequests} requests used).`,\n { windowId: config.id, resetAt: state.windowStartedAt + config.windowMs },\n );\n }\n if (config.maxTokens !== undefined && state.tokensUsed + estimatedTokens > config.maxTokens) {\n throw new OllamaQuotaExceededError(\n `Client-side quota window \"${config.id}\" would exceed its token budget ` +\n `(${state.tokensUsed}/${config.maxTokens} tokens used).`,\n { windowId: config.id, resetAt: state.windowStartedAt + config.windowMs },\n );\n }\n }\n }\n\n /** Records one request's actual usage — a raw API response or a pre-normalized `TokenUsage` — against every window. */\n recordUsage(usage: RawUsageSource | TokenUsage): void {\n const normalized: TokenUsage = 'totalTokens' in usage ? usage : extractUsage(usage);\n for (const state of this.windows) {\n this.rollover(state);\n state.tokensUsed += normalized.totalTokens;\n state.requestsMade += 1;\n }\n }\n\n /** Resets one window (by `id`) or, if omitted, all windows — zeroing usage and restarting their clocks. */\n reset(windowId?: string): void {\n for (const state of this.windows) {\n if (windowId === undefined || state.config.id === windowId) {\n state.tokensUsed = 0;\n state.requestsMade = 0;\n state.windowStartedAt = this.now();\n }\n }\n }\n}\n\nexport interface OllamaCloudFreeTierQuotaBudgets {\n /** Budget for the free tier's ~5-hour session window. Omit to skip tracking it. */\n readonly session?: { readonly maxTokens?: number; readonly maxRequests?: number };\n /** Budget for the free tier's 7-day weekly window. Omit to skip tracking it. */\n readonly weekly?: { readonly maxTokens?: number; readonly maxRequests?: number };\n readonly now?: () => number;\n}\n\n/**\n * Convenience factory mirroring Ollama Cloud free-tier's documented reset cadence — a\n * session window that resets every 5 hours and a weekly window that resets every 7 days\n * (see https://ollama.com/pricing). Ollama does not publish the actual token/request\n * ceilings for either window, so you must supply the budgets yourself (e.g. from your own\n * observed usage) — this only wires up the window durations.\n */\nexport function createOllamaCloudFreeTierQuota(\n budgets: OllamaCloudFreeTierQuotaBudgets,\n): QuotaManager {\n const windows: QuotaWindowConfig[] = [];\n if (budgets.session !== undefined) {\n windows.push({ id: 'session', windowMs: 5 * 60 * 60 * 1000, ...budgets.session });\n }\n if (budgets.weekly !== undefined) {\n windows.push({ id: 'weekly', windowMs: 7 * 24 * 60 * 60 * 1000, ...budgets.weekly });\n }\n if (windows.length === 0) {\n throw new Error(\n 'createOllamaCloudFreeTierQuota requires at least a `session` or `weekly` budget.',\n );\n }\n return new QuotaManager({ windows, ...(budgets.now !== undefined ? { now: budgets.now } : {}) });\n}\n","/**\n * Type-safe tool definition helper.\n */\n\nimport type { z } from 'zod';\nimport { zodToJsonSchema } from '../schema/zod.js';\nimport type { Tool, ToolHandler } from './types.js';\nimport type { ToolProperty } from '../types.js';\n\nexport interface DefineToolOptions<TParams, TResult> {\n readonly name: string;\n readonly description: string;\n readonly schema: z.ZodType<TParams>;\n readonly execute: ToolHandler<TParams, TResult>;\n /**\n * Per-tool execution timeout in milliseconds, overriding the registry's default.\n * Pass `0` to explicitly disable timeout enforcement for this tool.\n */\n readonly timeoutMs?: number | undefined;\n}\n\n/**\n * Creates a strongly-typed Tool definition with automatic JSON Schema conversion.\n */\nexport function defineTool<TParams, TResult>(\n options: DefineToolOptions<TParams, TResult>,\n): Tool<TParams, TResult> {\n const jsonSchema = zodToJsonSchema(options.schema);\n const properties = (jsonSchema['properties'] ?? {}) as Record<string, ToolProperty>;\n const required = (jsonSchema['required'] ?? []) as string[];\n\n return {\n name: options.name,\n description: options.description,\n schema: options.schema,\n execute: options.execute,\n timeoutMs: options.timeoutMs,\n definition: {\n type: 'function',\n function: {\n name: options.name,\n description: options.description,\n parameters: {\n type: 'object',\n properties,\n ...(required.length > 0 ? { required } : {}),\n },\n },\n },\n };\n}\n","/**\n * Tool registry for managing definitions and executing model tool calls.\n */\n\nimport {\n OllamaNotFoundError,\n OllamaToolTimeoutError,\n OllamaToolValidationError,\n} from '../errors.js';\nimport {\n withSpan,\n setSpanError,\n ATTR_GEN_AI_TOOL_NAME,\n ATTR_GEN_AI_TOOL_CALL_ID,\n} from '../telemetry/index.js';\nimport type { ToolCall, ToolDefinition } from '../types.js';\nimport type { AnyTool, Tool, ToolExecutionContext, ToolExecutionResult } from './types.js';\nimport { disposableTimer } from '../utils.js';\n\nexport interface ToolRegistryOptions {\n readonly tools?: readonly AnyTool[] | undefined;\n readonly onError?: ((error: Error, toolCall: ToolCall) => string) | undefined;\n /**\n * Default per-call execution timeout in milliseconds, applied to any tool that\n * doesn't declare its own `timeoutMs`. Undefined (the default) means no timeout is\n * enforced, matching prior behavior. Recommended whenever tool arguments or\n * implementations are influenced by model output you don't fully control, since an\n * unbounded tool call can otherwise stall the entire agent loop indefinitely.\n *\n * Enforcement is cooperative: it races the tool's promise against a timer and\n * reports a timeout failure, but cannot forcibly halt synchronous or non-abort-aware\n * asynchronous work already in flight on the same thread. Tools that perform I/O\n * should honor `ToolExecutionContext.signal` to stop promptly on timeout.\n */\n readonly timeoutMs?: number | undefined;\n /**\n * Maximum number of tool calls executed concurrently by `executeToolCalls`.\n * Undefined (the default) runs all calls in parallel, matching prior behavior.\n */\n readonly maxConcurrency?: number | undefined;\n /**\n * Maximum length of a tool's `outputString` before it is truncated. Guards against a\n * single tool call flooding the conversation history / model context (and process\n * memory) with unbounded output. Undefined (the default) applies no limit.\n */\n readonly maxOutputChars?: number | undefined;\n}\n\nexport class ToolRegistry {\n private readonly tools = new Map<string, AnyTool>();\n private readonly onError?: ((error: Error, toolCall: ToolCall) => string) | undefined;\n private readonly defaultTimeoutMs?: number | undefined;\n private readonly maxConcurrency?: number | undefined;\n private readonly maxOutputChars?: number | undefined;\n\n constructor(toolsOrOptions?: readonly AnyTool[] | ToolRegistryOptions | undefined) {\n if (Array.isArray(toolsOrOptions)) {\n this.registerMany(toolsOrOptions);\n } else if (toolsOrOptions !== undefined) {\n const opts = toolsOrOptions as ToolRegistryOptions;\n this.onError = opts.onError;\n this.defaultTimeoutMs = opts.timeoutMs;\n this.maxConcurrency = opts.maxConcurrency;\n this.maxOutputChars = opts.maxOutputChars;\n if (opts.tools) {\n this.registerMany(opts.tools);\n }\n }\n }\n\n register(tool: AnyTool): this {\n this.tools.set(tool.name, tool);\n return this;\n }\n\n registerMany(tools: readonly AnyTool[]): this {\n for (const tool of tools) {\n this.register(tool);\n }\n return this;\n }\n\n get(name: string): AnyTool | undefined {\n return this.tools.get(name);\n }\n\n definitions(): ToolDefinition[] {\n return Array.from(this.tools.values()).map((t) => t.definition);\n }\n\n async executeToolCall(\n toolCall: ToolCall,\n ctx: ToolExecutionContext = {},\n ): Promise<ToolExecutionResult> {\n const { name } = toolCall.function;\n return withSpan(\n `execute_tool ${name}`,\n { [ATTR_GEN_AI_TOOL_NAME]: name, [ATTR_GEN_AI_TOOL_CALL_ID]: toolCall.id },\n async (span) => {\n const result = await this.executeToolCallUninstrumented(toolCall, ctx);\n if (!result.success) {\n await setSpanError(span, result.error);\n }\n return result;\n },\n );\n }\n\n private async executeToolCallUninstrumented(\n toolCall: ToolCall,\n ctx: ToolExecutionContext,\n ): Promise<ToolExecutionResult> {\n const { name, arguments: args } = toolCall.function;\n const tool = this.tools.get(name);\n\n if (!tool) {\n const err = new OllamaNotFoundError(`Tool \"${name}\" is not registered in this registry`);\n return this.handleExecutionError(err, toolCall);\n }\n\n const parseResult = tool.schema.safeParse(args);\n if (!parseResult.success) {\n const err = new OllamaToolValidationError(`Tool \"${name}\" arguments validation failed`, {\n toolName: name,\n issues: parseResult.error.issues,\n cause: parseResult.error,\n });\n return this.handleExecutionError(err, toolCall);\n }\n\n try {\n const result = await this.runWithTimeout(tool, parseResult.data, ctx, name);\n const outputString = this.truncateOutput(\n typeof result === 'string' ? result : JSON.stringify(result),\n );\n return {\n toolName: name,\n toolCallId: toolCall.id,\n success: true,\n result,\n outputString,\n };\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n return this.handleExecutionError(error, toolCall);\n }\n }\n\n /**\n * Executes every call in `toolCalls` and returns results in the same order, so results\n * are always correlatable by array position regardless of `id`. Each result also echoes\n * its call's `toolCallId` for callers who'd rather match by ID — see the {@link ToolCall}\n * docs for how that id is produced. Runs fully in parallel (`Promise.all`) unless\n * `maxConcurrency` was configured, in which case a bounded worker pool is used instead.\n */\n async executeToolCalls(\n toolCalls: readonly ToolCall[],\n ctx: ToolExecutionContext = {},\n ): Promise<ToolExecutionResult[]> {\n const limit = this.maxConcurrency;\n if (!limit || limit >= toolCalls.length) {\n return Promise.all(toolCalls.map((tc) => this.executeToolCall(tc, ctx)));\n }\n\n const results = new Array<ToolExecutionResult>(toolCalls.length);\n let nextIndex = 0;\n const worker = async (): Promise<void> => {\n for (let i = nextIndex++; i < toolCalls.length; i = nextIndex++) {\n results[i] = await this.executeToolCall(toolCalls[i] as ToolCall, ctx);\n }\n };\n await Promise.all(Array.from({ length: limit }, () => worker()));\n return results;\n }\n\n private async runWithTimeout<TParams>(\n tool: Tool<TParams, unknown>,\n params: TParams,\n ctx: ToolExecutionContext,\n toolName: string,\n ): Promise<unknown> {\n const timeoutMs = tool.timeoutMs ?? this.defaultTimeoutMs;\n if (!timeoutMs || timeoutMs <= 0) {\n return tool.execute(params, ctx);\n }\n\n const controller = new AbortController();\n const onParentAbort = (): void => controller.abort(ctx.signal?.reason);\n if (ctx.signal) {\n if (ctx.signal.aborted) {\n controller.abort(ctx.signal.reason);\n } else {\n ctx.signal.addEventListener('abort', onParentAbort, { once: true });\n }\n }\n\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, timeoutMs);\n using _timer = disposableTimer(timer);\n // Also clean up the parent-abort listener at scope exit (conditional on ctx.signal)\n using _listener = {\n [Symbol.dispose]() {\n ctx.signal?.removeEventListener('abort', onParentAbort);\n },\n };\n\n const executePromise = Promise.resolve(\n tool.execute(params, { ...ctx, signal: controller.signal }),\n );\n // Prevent an unhandled rejection if the tool's promise loses the race and later\n // rejects; the tool remains responsible for actually stopping its own work via\n // `signal` since JS cannot forcibly cancel work already in flight.\n executePromise.catch(() => undefined);\n\n const abortRejection = (): Error =>\n timedOut\n ? new OllamaToolTimeoutError(`Tool \"${toolName}\" timed out after ${timeoutMs}ms`, {\n toolName,\n timeoutMs,\n })\n : ((ctx.signal?.reason as Error | undefined) ?? new Error('Tool execution aborted'));\n\n return await Promise.race([\n executePromise,\n controller.signal.aborted\n ? Promise.reject(abortRejection())\n : new Promise<never>((_resolve, reject) => {\n controller.signal.addEventListener('abort', () => reject(abortRejection()), {\n once: true,\n });\n }),\n ]);\n // clearTimeout(timer) + removeEventListener called automatically via `using`\n }\n\n private truncateOutput(output: string): string {\n const limit = this.maxOutputChars;\n if (!limit || output.length <= limit) {\n return output;\n }\n return `${output.slice(0, limit)}\\n… [truncated ${output.length - limit} of ${output.length} chars]`;\n }\n\n private handleExecutionError(error: Error, toolCall: ToolCall): ToolExecutionResult {\n const fallbackMessage = this.onError ? this.onError(error, toolCall) : error.message;\n return {\n toolName: toolCall.function.name,\n toolCallId: toolCall.id,\n success: false,\n error,\n outputString: this.truncateOutput(fallbackMessage),\n };\n }\n}\n","/** Dependency-free JSON Schema validator for MCP tool argument boundaries. */\n\nexport interface JsonSchemaValidationIssue {\n readonly path: readonly (string | number)[];\n readonly message: string;\n}\n\nfunction label(path: readonly (string | number)[]): string {\n return path.length === 0 ? 'value' : 'value' + path.map((part) => typeof part === 'number' ? '[' + part + ']' : '.' + part).join('');\n}\n\nfunction equalJson(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== typeof b || a === null || b === null) return false;\n if (Array.isArray(a) || Array.isArray(b)) {\n return Array.isArray(a) && Array.isArray(b) && a.length === b.length && a.every((item, i) => equalJson(item, b[i]));\n }\n if (typeof a === 'object' && typeof b === 'object') {\n const ar = a as Record<string, unknown>;\n const br = b as Record<string, unknown>;\n const ak = Object.keys(ar).sort();\n const bk = Object.keys(br).sort();\n return ak.length === bk.length && ak.every((key, i) => key === bk[i] && equalJson(ar[key], br[key]));\n }\n return false;\n}\n\nfunction matchesType(value: unknown, type: string): boolean {\n switch (type) {\n case 'null': return value === null;\n case 'boolean': return typeof value === 'boolean';\n case 'object': return typeof value === 'object' && value !== null && !Array.isArray(value);\n case 'array': return Array.isArray(value);\n case 'string': return typeof value === 'string';\n case 'number': return typeof value === 'number' && Number.isFinite(value);\n case 'integer': return typeof value === 'number' && Number.isInteger(value);\n default: return true;\n }\n}\n\nfunction validate(value: unknown, schema: unknown, path: readonly (string | number)[]): JsonSchemaValidationIssue[] {\n if (schema === true || schema === undefined) return [];\n if (schema === false) return [{ path, message: label(path) + ' is not allowed by the schema' }];\n if (typeof schema !== 'object' || schema === null || Array.isArray(schema)) return [];\n const s = schema as Record<string, unknown>;\n const issues: JsonSchemaValidationIssue[] = [];\n\n if (s['nullable'] === true && value === null) return issues;\n\n const type = s['type'];\n if (typeof type === 'string' && !matchesType(value, type)) {\n return [{ path, message: label(path) + ' must be ' + type }];\n }\n if (Array.isArray(type) && !type.some((t) => typeof t === 'string' && matchesType(value, t))) {\n return [{ path, message: label(path) + ' must match one of: ' + type.join(', ') }];\n }\n\n if ('const' in s && !equalJson(value, s['const'])) issues.push({ path, message: label(path) + ' must equal the schema const value' });\n const enumValues = s['enum'];\n if (Array.isArray(enumValues) && !enumValues.some((item) => equalJson(value, item))) issues.push({ path, message: label(path) + ' must be one of the allowed enum values' });\n\n const anyOf = s['anyOf'];\n if (Array.isArray(anyOf) && !anyOf.some((candidate) => validate(value, candidate, path).length === 0)) issues.push({ path, message: label(path) + ' must satisfy at least one anyOf schema' });\n const oneOf = s['oneOf'];\n if (Array.isArray(oneOf)) {\n const matches = oneOf.filter((candidate) => validate(value, candidate, path).length === 0).length;\n if (matches !== 1) issues.push({ path, message: label(path) + ' must satisfy exactly one oneOf schema' });\n }\n const allOf = s['allOf'];\n if (Array.isArray(allOf)) for (const candidate of allOf) issues.push(...validate(value, candidate, path));\n if ('not' in s && validate(value, s['not'], path).length === 0) issues.push({ path, message: label(path) + ' must not satisfy the not schema' });\n\n if (typeof value === 'string') {\n const min = s['minLength'];\n const max = s['maxLength'];\n if (typeof min === 'number' && value.length < min) issues.push({ path, message: label(path) + ' must have at least ' + min + ' characters' });\n if (typeof max === 'number' && value.length > max) issues.push({ path, message: label(path) + ' must have at most ' + max + ' characters' });\n if (typeof s['pattern'] === 'string') {\n try { if (!new RegExp(s['pattern']).test(value)) issues.push({ path, message: label(path) + ' does not match the required pattern' }); }\n catch { /* malformed provider regex; do not reject otherwise valid arguments */ }\n }\n }\n\n if (typeof value === 'number' && Number.isFinite(value)) {\n const numericRules: readonly [string, (n: number, bound: number) => boolean, string][] = [\n ['minimum', (n, b) => n >= b, 'must be greater than or equal to'],\n ['maximum', (n, b) => n <= b, 'must be less than or equal to'],\n ['exclusiveMinimum', (n, b) => n > b, 'must be greater than'],\n ['exclusiveMaximum', (n, b) => n < b, 'must be less than'],\n ];\n for (const [keyword, check, phrase] of numericRules) {\n const bound = s[keyword];\n if (typeof bound === 'number' && !check(value, bound)) issues.push({ path, message: label(path) + ' ' + phrase + ' ' + bound });\n }\n const multipleOf = s['multipleOf'];\n if (typeof multipleOf === 'number' && multipleOf > 0) {\n const quotient = value / multipleOf;\n if (Math.abs(quotient - Math.round(quotient)) > 1e-12) issues.push({ path, message: label(path) + ' must be a multiple of ' + multipleOf });\n }\n }\n\n if (Array.isArray(value)) {\n const min = s['minItems'];\n const max = s['maxItems'];\n if (typeof min === 'number' && value.length < min) issues.push({ path, message: label(path) + ' must contain at least ' + min + ' items' });\n if (typeof max === 'number' && value.length > max) issues.push({ path, message: label(path) + ' must contain at most ' + max + ' items' });\n if (s['uniqueItems'] === true) {\n for (let i = 0; i < value.length; i += 1) if (value.slice(0, i).some((previous) => equalJson(previous, value[i]))) { issues.push({ path: [...path, i], message: label([...path, i]) + ' must be unique' }); break; }\n }\n if ('items' in s) value.forEach((item, i) => issues.push(...validate(item, s['items'], [...path, i])));\n if (Array.isArray(s['prefixItems'])) s['prefixItems'].forEach((itemSchema, i) => { if (i < value.length) issues.push(...validate(value[i], itemSchema, [...path, i])); });\n }\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n const object = value as Record<string, unknown>;\n const required = s['required'];\n if (Array.isArray(required)) for (const key of required) if (typeof key === 'string' && !(key in object)) issues.push({ path: [...path, key], message: label([...path, key]) + ' is required' });\n const properties = s['properties'];\n if (typeof properties === 'object' && properties !== null && !Array.isArray(properties)) {\n const propertySchemas = properties as Record<string, unknown>;\n for (const [key, propertySchema] of Object.entries(propertySchemas)) if (key in object) issues.push(...validate(object[key], propertySchema, [...path, key]));\n const additional = s['additionalProperties'];\n for (const key of Object.keys(object)) {\n if (key in propertySchemas) continue;\n if (additional === false) issues.push({ path: [...path, key], message: label([...path, key]) + ' is not allowed' });\n else if (additional !== true && additional !== undefined) issues.push(...validate(object[key], additional, [...path, key]));\n }\n }\n const min = s['minProperties'];\n const max = s['maxProperties'];\n if (typeof min === 'number' && Object.keys(object).length < min) issues.push({ path, message: label(path) + ' must contain at least ' + min + ' properties' });\n if (typeof max === 'number' && Object.keys(object).length > max) issues.push({ path, message: label(path) + ' must contain at most ' + max + ' properties' });\n }\n\n return issues;\n}\n\nexport function validateJsonSchema(value: unknown, schema: unknown): readonly JsonSchemaValidationIssue[] {\n return validate(value, schema, []);\n}","/**\n * Converts MCP tools into Ollama-compatible tools.\n */\n\nimport { z } from 'zod';\nimport { validateJsonSchema } from './json-schema.js';\nimport { OllamaMcpError } from '../errors.js';\nimport type { AnyTool } from '../tools/types.js';\nimport type { ToolRegistry } from '../tools/registry.js';\nimport type {\n McpCallToolResult,\n McpClientLike,\n McpListToolsParams,\n McpRequestOptions,\n McpToolDescriptor,\n} from './types.js';\nimport type { ToolDefinition, ToolProperty } from '../types.js';\n\nexport type McpToolResultMode = 'text' | 'structured';\n\nexport interface LoadMcpToolsOptions {\n readonly namePrefix?: string | undefined;\n /** Maximum number of paginated tools/list responses to traverse. */\n readonly maxPages?: number | undefined;\n /**\n * Return MCP's raw CallToolResult to programmatic callers instead of the legacy\n * model-oriented text representation. The default preserves existing behavior.\n */\n readonly resultMode?: McpToolResultMode | undefined;\n}\n\nfunction resolveMaxPages(options: LoadMcpToolsOptions): number {\n const maxPages = options.maxPages ?? 64;\n if (!Number.isInteger(maxPages) || maxPages <= 0) {\n throw new RangeError('MCP maxPages must be a positive integer');\n }\n return maxPages;\n}\n\nexport async function listAllMcpTools(\n mcpClient: McpClientLike,\n options: LoadMcpToolsOptions = {},\n signal?: AbortSignal,\n): Promise<McpToolDescriptor[]> {\n const maxPages = resolveMaxPages(options);\n const tools: McpToolDescriptor[] = [];\n const seenCursors = new Set<string>();\n let cursor: string | undefined;\n\n for (let pageNumber = 1; pageNumber <= maxPages; pageNumber += 1) {\n const params: McpListToolsParams | undefined =\n cursor !== undefined ? { cursor } : undefined;\n const requestOptions: McpRequestOptions | undefined =\n signal !== undefined ? { signal } : undefined;\n const page = await mcpClient.listTools(params, requestOptions);\n tools.push(...page.tools);\n\n if (page.nextCursor === undefined) {\n return tools;\n }\n if (seenCursors.has(page.nextCursor)) {\n throw new Error('MCP tools/list returned a repeated nextCursor');\n }\n seenCursors.add(page.nextCursor);\n cursor = page.nextCursor;\n }\n\n throw new Error('MCP tools/list exceeded maxPages (' + maxPages + ')');\n}\n\nfunction formatMcpToolResult(result: McpCallToolResult): string {\n const parts = result.content.map((block) => {\n if (block.type === 'text' && typeof block.text === 'string') {\n return block.text;\n }\n try {\n return JSON.stringify(block);\n } catch {\n return `[${block.type}]`;\n }\n });\n\n if (result.structuredContent !== undefined) {\n try {\n parts.push(JSON.stringify(result.structuredContent));\n } catch {\n // Preserve the regular content if structuredContent cannot be serialized.\n }\n }\n\n if (result.isError) {\n parts.unshift('[MCP tool error]');\n }\n\n return parts.join('\\n');\n}\n\nfunction createInputValidator(inputSchema: Record<string, unknown>): z.ZodType<Record<string, unknown>> {\n return z.custom<Record<string, unknown>>().superRefine((value, ctx) => {\n const issues = validateJsonSchema(value, inputSchema);\n for (const issue of issues) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [...issue.path],\n message: issue.message,\n });\n }\n });\n}\n\nfunction convertMcpDescriptorToTool(\n descriptor: McpToolDescriptor,\n mcpClient: McpClientLike,\n namePrefix = '',\n resultMode: McpToolResultMode = 'text',\n): AnyTool {\n const toolName = `${namePrefix}${descriptor.name}`;\n const inputSchema = descriptor.inputSchema ?? { type: 'object', properties: {} };\n const properties = (inputSchema['properties'] ?? {}) as Record<string, ToolProperty>;\n const required = (inputSchema['required'] ?? []) as string[];\n const parameters = {\n ...inputSchema,\n type: 'object' as const,\n properties,\n ...(required.length > 0 ? { required } : {}),\n } as ToolDefinition['function']['parameters'];\n\n return {\n name: toolName,\n description: descriptor.description ?? '',\n schema: createInputValidator(inputSchema),\n execute: async (args: Record<string, unknown>, context: { readonly signal?: AbortSignal | undefined }) => {\n try {\n const result = await mcpClient.callTool(\n {\n name: descriptor.name,\n arguments: args,\n },\n context.signal !== undefined ? { signal: context.signal } : undefined,\n );\n\n // MCP tool failures are ordinary CallToolResult values, not transport failures.\n // Keep the result model-readable so the agent can observe the error and recover.\n return resultMode === 'structured' ? result : formatMcpToolResult(result);\n } catch (err) {\n if (err instanceof OllamaMcpError) throw err;\n throw new OllamaMcpError(`Failed calling MCP tool \"${descriptor.name}\"`, {\n mcpMethod: 'callTool',\n toolName: descriptor.name,\n cause: err,\n });\n }\n },\n definition: {\n type: 'function',\n function: {\n name: toolName,\n description: descriptor.description ?? '',\n parameters,\n },\n },\n };\n}\n\nexport async function loadMcpTools(\n mcpClient: McpClientLike,\n options: LoadMcpToolsOptions = {},\n signal?: AbortSignal,\n): Promise<AnyTool[]> {\n try {\n const tools = await listAllMcpTools(mcpClient, options, signal);\n return tools.map((t) => convertMcpDescriptorToTool(t, mcpClient, options.namePrefix, options.resultMode));\n } catch (err) {\n throw new OllamaMcpError('Failed listing MCP tools from client', {\n mcpMethod: 'listTools',\n cause: err,\n });\n }\n}\n\nexport async function registerMcpTools(\n registry: ToolRegistry,\n mcpClient: McpClientLike,\n options: LoadMcpToolsOptions = {},\n signal?: AbortSignal,\n): Promise<void> {\n const tools = await loadMcpTools(mcpClient, options, signal);\n registry.registerMany(tools);\n}\n","/**\n * First-class MCP-to-Ollama bridge.\n *\n * The core package deliberately stays transport-agnostic and Edge-compatible. Connect\n * to an MCP server with an MCP client implementation (stdio, Streamable HTTP, etc.)\n * then pass that client to this bridge.\n */\nimport type { ToolDefinition } from '../types.js';\nimport type { ToolRegistry } from '../tools/registry.js';\nimport { listAllMcpTools, loadMcpTools, type LoadMcpToolsOptions } from './mcp-tools.js';\nimport type { McpClientLike, McpToolDescriptor } from './types.js';\n\nexport type McpBridgeOptions = LoadMcpToolsOptions;\n\nexport class McpBridge {\n constructor(\n private readonly client: McpClientLike,\n private readonly options: McpBridgeOptions = {},\n ) {}\n\n static toOllamaTools(\n tools: readonly McpToolDescriptor[],\n options: McpBridgeOptions = {},\n ): ToolDefinition[] {\n const prefix = options.namePrefix ?? '';\n return tools.map((tool) => ({\n type: 'function',\n function: {\n name: prefix + tool.name,\n description: tool.description ?? '',\n parameters: {\n ...(tool.inputSchema ?? { type: 'object', properties: {} }),\n type: 'object' as const,\n properties: ((tool.inputSchema ?? {})['properties'] ?? {}) as ToolDefinition['function']['parameters']['properties'],\n } as ToolDefinition['function']['parameters'],\n },\n }));\n }\n\n async listTools(signal?: AbortSignal): Promise<readonly McpToolDescriptor[]> {\n return listAllMcpTools(this.client, this.options, signal);\n }\n\n async definitions(signal?: AbortSignal): Promise<ToolDefinition[]> {\n return McpBridge.toOllamaTools(await this.listTools(signal), this.options);\n }\n\n async loadTools(signal?: AbortSignal) {\n return loadMcpTools(this.client, this.options, signal);\n }\n\n async register(registry: ToolRegistry, signal?: AbortSignal): Promise<void> {\n await registry.registerMany(await this.loadTools(signal));\n }\n}\n","/**\n * Lightweight frontmatter parser for SKILL.md files.\n */\n\nimport { OllamaSkillInvalidError } from '../errors.js';\nimport type { SkillFrontmatter } from './types.js';\n\nexport interface ParsedFrontmatter {\n readonly frontmatter: SkillFrontmatter;\n readonly body: string;\n}\n\nfunction parseYamlValue(raw: string): unknown {\n const trimmed = raw.trim();\n if (trimmed === 'true') return true;\n if (trimmed === 'false') return false;\n if (!Number.isNaN(Number(trimmed)) && trimmed !== '') return Number(trimmed);\n if (\n (trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n ) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n}\n\nfunction parseYamlBlock(yamlText: string): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n const lines = yamlText.split('\\n');\n let currentKey: string | undefined;\n let currentList: unknown[] | undefined;\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n if (trimmed.startsWith('- ') && currentKey) {\n if (!currentList) {\n currentList = [];\n result[currentKey] = currentList;\n }\n currentList.push(parseYamlValue(trimmed.slice(2)));\n continue;\n }\n\n currentList = undefined;\n const colonIndex = line.indexOf(':');\n if (colonIndex > 0) {\n const key = line.slice(0, colonIndex).trim();\n const valStr = line.slice(colonIndex + 1).trim();\n currentKey = key;\n if (valStr.length > 0) {\n result[key] = parseYamlValue(valStr);\n }\n }\n }\n\n return result;\n}\n\nexport function parseFrontmatter(source: string, path = ''): ParsedFrontmatter {\n const match = source.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/);\n if (!match) {\n throw new OllamaSkillInvalidError('Missing YAML frontmatter delimiters (---)', {\n skillName: path || 'unknown',\n path,\n });\n }\n\n const rawYaml = match[1] ?? '';\n const body = match[2]?.trim() ?? '';\n const parsed = parseYamlBlock(rawYaml);\n\n if (!parsed['name'] || typeof parsed['name'] !== 'string') {\n throw new OllamaSkillInvalidError('Frontmatter missing required string \"name\"', {\n skillName: String(parsed['name'] ?? 'unknown'),\n path,\n });\n }\n if (!parsed['description'] || typeof parsed['description'] !== 'string') {\n throw new OllamaSkillInvalidError('Frontmatter missing required string \"description\"', {\n skillName: parsed['name'],\n path,\n });\n }\n\n return {\n frontmatter: parsed as unknown as SkillFrontmatter,\n body,\n };\n}\n","/**\n * Skill composition and context injection.\n */\n\nimport type { Message } from '../types.js';\nimport type { ToolRegistry } from '../tools/registry.js';\nimport type { Skill } from './types.js';\n\nexport interface ApplySkillOptions {\n readonly messages: readonly Message[];\n readonly tools?: ToolRegistry;\n}\n\nexport interface AppliedSkillResult {\n readonly messages: readonly Message[];\n readonly tools?: ToolRegistry;\n}\n\n/**\n * Injects a skill's body into messages as a system prompt and applies allowed tool filters.\n */\nexport function applySkill(skill: Skill, options: ApplySkillOptions): AppliedSkillResult {\n const systemPrompt = `[Skill: ${skill.name}]\\n${skill.description}\\n\\n${skill.body}`;\n const messages = [...options.messages];\n const systemIndex = messages.findIndex((m) => m.role === 'system');\n\n if (systemIndex >= 0) {\n const existing = messages[systemIndex];\n if (existing) {\n messages[systemIndex] = {\n role: 'system',\n content: `${existing.content}\\n\\n${systemPrompt}`,\n };\n }\n } else {\n messages.unshift({ role: 'system', content: systemPrompt });\n }\n\n return {\n messages,\n ...(options.tools !== undefined ? { tools: options.tools } : {}),\n };\n}\n","/**\n * Multi-turn tool execution loop agent.\n */\n\nimport {\n OllamaAgentMaxIterationsError,\n OllamaAgentMaxToolCallsError,\n OllamaIncompatibleModelError,\n} from '../errors.js';\nimport {\n withSpan,\n ATTR_GEN_AI_SYSTEM,\n ATTR_GEN_AI_OPERATION_NAME,\n ATTR_GEN_AI_REQUEST_MODEL,\n ATTR_OLLAMA_AGENT_MAX_ITERATIONS,\n ATTR_OLLAMA_AGENT_ITERATION,\n GEN_AI_SYSTEM_OLLAMA,\n} from '../telemetry/index.js';\nimport { ensureToolCallIds } from '../tools/tool-call-id.js';\nimport type { ModelCapabilities } from '../capabilities/capabilities.js';\nimport type { Message, ModelOptions, ThinkValue, ToolDefinition } from '../types.js';\nimport type { ToolRegistry } from '../tools/registry.js';\nimport type { AgentConfig, AgentHooks, AgentResult, AgentRunInput, AgentTurn } from './types.js';\n\nexport interface AgentChatClient {\n capabilities?:\n | ((model: string, signal?: AbortSignal) => Promise<ModelCapabilities>)\n | undefined;\n chat(request: {\n readonly model: string;\n readonly messages: readonly Message[];\n readonly tools?: readonly ToolDefinition[] | undefined;\n readonly options?: ModelOptions | undefined;\n readonly think?: ThinkValue | undefined;\n readonly stream?: false | undefined;\n readonly signal?: AbortSignal | undefined;\n }): Promise<{ readonly message: Message }>;\n}\n\n/**\n * Runs a multi-turn `chat` + tool-execution loop until the model responds without\n * requesting further tool calls, or `maxIterations` is exceeded. Tool calls within a\n * single turn are handed to `ToolRegistry.executeToolCalls` and their results are\n * appended to history in the same order the model requested them. Native Ollama tool-result\n * messages use `tool_name` on the wire; the SDK-generated `toolCallId` remains execution\n * metadata and is not sent to Ollama.\n * `Agent` assigns ids defensively even when `AgentChatClient` isn't `OllamaClient` (e.g. a\n * custom/test implementation), so this guarantee holds regardless of which chat client is\n * supplied.\n */\nexport class Agent {\n private readonly client: AgentChatClient;\n private readonly tools?: ToolRegistry | undefined;\n private readonly maxIterations: number;\n private readonly maxToolCalls?: number | undefined;\n private readonly hooks?: AgentHooks | undefined;\n private readonly validateToolCapability: boolean;\n private readonly toolContextSize: number;\n\n constructor(client: AgentChatClient, config: AgentConfig = {}) {\n this.client = client;\n this.tools = config.tools;\n this.maxIterations = config.maxIterations ?? 10;\n this.maxToolCalls = config.maxToolCalls;\n this.hooks = config.hooks;\n if (this.maxToolCalls !== undefined && (!Number.isInteger(this.maxToolCalls) || this.maxToolCalls < 0)) {\n throw new RangeError('Agent maxToolCalls must be a non-negative integer');\n }\n this.validateToolCapability = config.validateToolCapability ?? true;\n this.toolContextSize = config.toolContextSize ?? 32768;\n if (!Number.isInteger(this.toolContextSize) || this.toolContextSize <= 0) {\n throw new RangeError('Agent toolContextSize must be a positive integer');\n }\n }\n\n run(input: AgentRunInput): Promise<AgentResult> {\n return withSpan(\n `invoke_agent ${input.model}`,\n {\n [ATTR_GEN_AI_SYSTEM]: GEN_AI_SYSTEM_OLLAMA,\n [ATTR_GEN_AI_OPERATION_NAME]: 'invoke_agent',\n [ATTR_GEN_AI_REQUEST_MODEL]: input.model,\n [ATTR_OLLAMA_AGENT_MAX_ITERATIONS]: this.maxIterations,\n },\n () => this.runLoop(input),\n );\n }\n\n private async runLoop(input: AgentRunInput): Promise<AgentResult> {\n const history: Message[] = [...input.messages];\n const turns: AgentTurn[] = [];\n const toolDefs = this.tools?.definitions();\n const hasTools = toolDefs !== undefined && toolDefs.length > 0;\n let capabilities: ModelCapabilities | undefined;\n\n if (hasTools && this.validateToolCapability && this.client.capabilities) {\n capabilities = await this.client.capabilities(input.model, input.signal);\n if (!capabilities.supportsTools) {\n throw new OllamaIncompatibleModelError(\n `Model \"${input.model}\" does not advertise the \"tools\" capability.`,\n {\n model: input.model,\n capability: 'tools',\n reportedCapabilities: capabilities.reported,\n },\n );\n }\n }\n\n const shouldAutoSizeContext =\n hasTools &&\n this.validateToolCapability &&\n capabilities !== undefined &&\n input.options?.num_ctx === undefined;\n\n const effectiveOptions = shouldAutoSizeContext\n ? {\n ...(input.options ?? {}),\n num_ctx: Math.min(\n this.toolContextSize,\n capabilities?.contextLength ?? this.toolContextSize,\n ),\n }\n : input.options;\n\n let toolCallsExecuted = 0;\n\n for (let iteration = 1; iteration <= this.maxIterations; iteration++) {\n const outcome = await withSpan(\n 'ollama.agent.turn',\n { [ATTR_OLLAMA_AGENT_ITERATION]: iteration },\n async () => {\n this.hooks?.onTurnStart?.(iteration);\n\n const response = await this.client.chat({\n model: input.model,\n messages: history,\n ...(toolDefs !== undefined ? { tools: toolDefs } : {}),\n ...(effectiveOptions !== undefined ? { options: effectiveOptions } : {}),\n ...(input.think !== undefined ? { think: input.think } : {}),\n stream: false,\n ...(input.signal !== undefined ? { signal: input.signal } : {}),\n });\n\n const rawToolCalls = response.message.tool_calls;\n const toolCalls = ensureToolCallIds(rawToolCalls);\n const assistantMessage: Message =\n toolCalls === rawToolCalls\n ? response.message\n : { ...response.message, tool_calls: toolCalls };\n history.push(assistantMessage);\n\n if (!toolCalls || toolCalls.length === 0 || !this.tools) {\n const finalTurn: AgentTurn = { iteration, message: assistantMessage };\n turns.push(finalTurn);\n this.hooks?.onTurnEnd?.(finalTurn);\n return { done: true as const, finalMessage: assistantMessage };\n }\n\n if (this.maxToolCalls !== undefined && toolCallsExecuted + toolCalls.length > this.maxToolCalls) {\n throw new OllamaAgentMaxToolCallsError(\n `Agent exceeded max tool calls (${this.maxToolCalls})`,\n { maxToolCalls: this.maxToolCalls, toolCallsExecuted },\n );\n }\n\n for (const tc of toolCalls) {\n this.hooks?.onToolCallStart?.(tc);\n }\n\n const toolResults = await this.tools.executeToolCalls(toolCalls, {\n signal: input.signal,\n });\n toolCallsExecuted += toolCalls.length;\n\n for (const res of toolResults) {\n this.hooks?.onToolCallEnd?.(res);\n history.push({\n role: 'tool',\n tool_name: res.toolName,\n content: res.outputString,\n });\n }\n\n const turn: AgentTurn = { iteration, message: assistantMessage, toolCalls, toolResults };\n turns.push(turn);\n this.hooks?.onTurnEnd?.(turn);\n return { done: false as const };\n },\n );\n\n if (outcome.done) {\n return { finalMessage: outcome.finalMessage, turns, totalIterations: iteration };\n }\n }\n\n throw new OllamaAgentMaxIterationsError(\n `Agent exceeded max iterations (${this.maxIterations}) without converging`,\n { maxIterations: this.maxIterations },\n );\n }\n}\n"]}