@nemesis-oss/ollama-sdk 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -0
- package/README.md +36 -10
- package/dist/{compose-DC11aDJn.d.cts → compose-DJjVpDrk.d.cts} +29 -2
- package/dist/{compose-DC11aDJn.d.ts → compose-DJjVpDrk.d.ts} +29 -2
- package/dist/index.cjs +54 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +107 -10
- package/dist/index.d.ts +107 -10
- package/dist/index.js +54 -13
- package/dist/index.js.map +1 -1
- package/dist/skills.d.cts +2 -2
- package/dist/skills.d.ts +2 -2
- package/package.json +5 -4
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/errors.ts","../src/logger.ts","../src/providers/endpoint-registry.ts","../src/streaming/ndjson.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/client.ts","../src/middleware.ts","../src/streaming/adapters.ts","../src/tools/define-tool.ts","../src/tools/registry.ts","../src/mcp/mcp-tools.ts","../src/skills/frontmatter.ts","../src/skills/compose.ts","../src/agent/agent.ts"],"names":["message","z","controller"],"mappings":"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","file":"index.cjs","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/**\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\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 /** Multiple named endpoints for rotation and automatic failover. */\n readonly endpoints?: readonly OllamaEndpoint[];\n /** Tuning options for endpoint circuit breaker. */\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\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\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\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\nexport interface EndpointHealth {\n readonly endpoint: OllamaEndpoint;\n readonly failureCount: number;\n readonly lastFailureTimestamp?: number | undefined;\n readonly isCoolingDown: boolean;\n}\n\nexport interface EndpointRegistryOptions {\n readonly failureThreshold?: number | undefined;\n readonly cooldownMs?: number | undefined;\n readonly now?: (() => number) | undefined;\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\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 }\n\n candidates(): OllamaEndpoint[] {\n const currentTime = this.now();\n const healthy: OllamaEndpoint[] = [];\n const coolingDown: Array<{ endpoint: OllamaEndpoint; recoveredAt: number }> = [];\n\n for (const ep of this.endpoints) {\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 return healthy.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\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 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 };\n });\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 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 { parseNdjsonStream } from '../streaming/ndjson.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\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}\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\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\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 }\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 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 init: RequestInit = {\n method,\n headers,\n ...(bodyInit !== undefined ? { body: bodyInit } : {}),\n ...(options.signal !== undefined ? { signal: options.signal } : {}),\n };\n\n const response = await this.fetchImpl(url, init);\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 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 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 init: RequestInit = {\n method,\n headers,\n ...(options.body !== undefined ? { body: JSON.stringify(options.body) } : {}),\n ...(options.signal !== undefined ? { signal: options.signal } : {}),\n };\n\n const response = await this.fetchImpl(url, init);\n span?.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, response.status);\n\n if (!response.ok) {\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 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 stream[Symbol.asyncIterator]();\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 { 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): Promise<EndpointHealthCheckResult> {\n const client = new HttpClient({\n baseUrl: endpoint.baseUrl,\n apiKey: endpoint.apiKey,\n headers: endpoint.headers,\n fetch: fetchImpl,\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 } 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 readonly supportsStreaming: true;\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\nexport async function detectModelCapabilities(\n http: HttpClient,\n model: string,\n): Promise<ModelCapabilities> {\n const showRes = await http.request<ShowResponse>({\n path: '/api/show',\n body: { model },\n });\n\n const reported = showRes.capabilities ?? [];\n const reportedSet = new Set(reported.map((c) => c.toLowerCase()));\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 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 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 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 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, 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\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 ) {\n this.finalResultPromise = new Promise<TFinal>((resolve, reject) => {\n this.resolveFinal = resolve;\n this.rejectFinal = reject;\n });\n }\n\n get finalResult(): Promise<TFinal> {\n return this.finalResultPromise;\n }\n\n abort(): void {\n this.source.abort?.();\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 } catch (error) {\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 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 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 }\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 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): 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);\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 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 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): OllamaStream<GenerateResponse, GenerateStreamResult> {\n const initial: GenerateStreamResult = { response: '', model: '', done: false };\n return new OllamaStream(source, mapGenerateChunk, aggregateGenerate, initial);\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): OllamaStream<ProgressResponse, ProgressStreamResult> {\n const initial: ProgressStreamResult = { status: '', done: false };\n return new OllamaStream(source, mapProgressChunk, aggregateProgress, initial);\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 { 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\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\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): 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);\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, HttpClient } from './transport/http.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\nexport type RequestRunner = <T>(\n op: (http: HttpClient, signal: AbortSignal) => Promise<T>,\n opts?: {\n signal?: AbortSignal | undefined;\n timeoutMs?: number | undefined;\n singleEndpoint?: boolean | undefined;\n },\n) => Promise<T>;\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);\n },\n { ...request, singleEndpoint: true },\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);\n },\n { ...request, singleEndpoint: true },\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 },\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 Chat Completions API that Ollama documents as\n * supported (https://docs.ollama.com/api/openai-compatibility), not the full OpenAI\n * surface (Responses API, hosted tools like web/file search, computer use, code\n * interpreter, or server-side conversation state). Notably, `tools` is supported by\n * Ollama's compat layer but `tool_choice` and `parallel_tool_calls` are explicitly\n * **not** — deliberately omitted from {@link OpenAIChatCompletionRequest} rather than\n * typed as accepted-but-ignored.\n */\n\nimport type { HttpClient } from '../transport/http.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 OpenAIMessage {\n readonly role: 'system' | 'user' | 'assistant' | 'tool';\n readonly content: string;\n readonly name?: string | undefined;\n readonly tool_calls?: readonly OpenAIToolCall[] | 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 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 presence_penalty?: number | undefined;\n readonly frequency_penalty?: number | undefined;\n readonly user?: string | undefined;\n readonly tools?: readonly OpenAITool[] | undefined;\n}\n\nexport interface OpenAIChatCompletionChoice {\n readonly index: number;\n readonly message: OpenAIMessage;\n readonly finish_reason: string;\n}\n\nexport interface OpenAIChatCompletionResponse {\n readonly id: string;\n readonly object: 'chat.completion';\n readonly created: number;\n readonly model: string;\n readonly choices: readonly OpenAIChatCompletionChoice[];\n readonly usage?:\n | {\n readonly prompt_tokens: number;\n readonly completion_tokens: number;\n readonly total_tokens: number;\n }\n | 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 class OpenAICompatClient {\n constructor(private readonly http: HttpClient) {}\n\n async createChatCompletion(\n request: OpenAIChatCompletionRequest,\n signal?: AbortSignal,\n ): Promise<OpenAIChatCompletionResponse> {\n return this.http.request<OpenAIChatCompletionResponse>({\n path: '/v1/chat/completions',\n body: request,\n signal,\n });\n }\n\n async chatCompletions(\n request: OpenAIChatCompletionRequest,\n signal?: AbortSignal,\n ): Promise<OpenAIChatCompletionResponse> {\n return this.createChatCompletion(request, signal);\n }\n\n async listModels(signal?: AbortSignal): Promise<OpenAIListModelsResponse> {\n return this.http.request<OpenAIListModelsResponse>({\n path: '/v1/models',\n method: 'GET',\n signal,\n });\n }\n}\n","/**\n * Anthropic Compatibility interfaces and client helpers for Ollama.\n * Ollama supports Anthropic Messages API format.\n *\n * @remarks\n * This is a typed pass-through to Ollama's Anthropic-compatible `/v1/messages` endpoint\n * — a subset of Anthropic's Messages API (text content, system prompt, sampling\n * parameters, ephemeral prompt-caching hints via `cache_control`), not the full Anthropic\n * surface. Tool use (`tool_use`/`tool_result` content blocks), extended thinking,\n * citations, files, token counting, and the Batches API are not modeled here.\n */\n\nimport type { HttpClient } from '../transport/http.js';\n\nexport interface AnthropicCacheControl {\n readonly type: 'ephemeral';\n}\n\nexport interface AnthropicContentBlock {\n readonly type: 'text';\n readonly text: string;\n /** Marks this block as a prompt-caching breakpoint (Anthropic's ephemeral cache). */\n readonly cache_control?: AnthropicCacheControl | undefined;\n}\n\nexport interface AnthropicMessage {\n readonly role: 'user' | 'assistant';\n readonly content: string | readonly AnthropicContentBlock[];\n}\n\nexport interface AnthropicMessagesRequest {\n readonly model: string;\n readonly messages: readonly AnthropicMessage[];\n readonly system?: string | 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 stream?: boolean | 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;\n readonly usage?:\n | {\n readonly input_tokens: number;\n readonly output_tokens: number;\n }\n | undefined;\n}\n\nexport class AnthropicCompatClient {\n constructor(private readonly http: HttpClient) {}\n\n async createMessage(\n request: AnthropicMessagesRequest,\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesResponse> {\n return this.http.request<AnthropicMessagesResponse>({\n path: '/v1/messages',\n body: request,\n signal,\n });\n }\n\n async messages(\n request: AnthropicMessagesRequest,\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesResponse> {\n return this.createMessage(request, signal);\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 resolveApiKey,\n resolveBaseUrl,\n type OllamaClientConfig,\n} from './config.js';\nimport { OllamaClientError, OllamaUnsupportedCapabilityError } 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 { ensureToolCallIds } from './tools/tool-call-id.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 ShowRequestOptions,\n WebFetchRequestOptions,\n WebFetchResponse,\n WebSearchRequestOptions,\n WebSearchResponse,\n} from './types.js';\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\n constructor(config: OllamaClientConfig = {}) {\n const resolvedApiKey = resolveApiKey(config.apiKey);\n const endpoints = config.endpoints ?? [\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(endpoints, config.endpointHealth);\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.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 * 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 ): Promise<T> {\n const timeout = createTimeoutSignal(options?.timeoutMs ?? this.timeoutMs, options?.signal);\n try {\n const allCandidates = this.registry.candidates();\n const candidates = options?.singleEndpoint ? allCandidates.slice(0, 1) : allCandidates;\n let lastError: Error | undefined;\n\n for (const [attemptIndex, endpoint] of candidates.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 });\n\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 () => withRetry(() => operation(http, timeout.signal), this.retryConfig),\n );\n this.registry.reportSuccess(endpoint.name);\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 }\n }\n throw lastError ?? new Error('No healthy Ollama endpoints available');\n } finally {\n 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 if (req.stream) {\n return this.executeWithFailover(async (http, signal) => {\n if (req.format !== undefined) this.assertStructuredOutputSupported(http.baseUrl, req.model);\n const stream = await http.requestStream<ChatResponse>({\n path: '/api/chat',\n body: { ...req, stream: true },\n signal,\n });\n return normalizeChatStream(stream);\n }, req);\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, 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 if (req.stream) {\n return this.executeWithFailover(async (http, signal) => {\n if (req.format !== undefined) this.assertStructuredOutputSupported(http.baseUrl, req.model);\n const stream = await http.requestStream<GenerateResponse>({\n path: '/api/generate',\n body: { ...req, stream: true },\n signal,\n });\n return normalizeGenerateStream(stream);\n }, req);\n }\n return withSpan(\n `text_completion ${req.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]: req.model,\n },\n async (span) => {\n const res = await this.executeWithFailover((http, signal) => {\n if (req.format !== undefined)\n this.assertStructuredOutputSupported(http.baseUrl, req.model);\n return http.request<GenerateResponse>({\n path: '/api/generate',\n body: { ...req, stream: false },\n signal,\n });\n }, req);\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 webSearch(req: WebSearchRequestOptions): Promise<WebSearchResponse> {\n return this.executeWithFailover(\n (http, signal) =>\n http.request<WebSearchResponse>({ path: '/api/websearch', body: req, signal }),\n req,\n );\n }\n webFetch(req: WebFetchRequestOptions): Promise<WebFetchResponse> {\n return this.executeWithFailover(\n (http, signal) =>\n http.request<WebFetchResponse>({ path: '/api/webfetch', body: req, signal }),\n req,\n );\n }\n\n // --- Capabilities & Health ---\n capabilities(model: string): Promise<ModelCapabilities> {\n return this.executeWithFailover((http) => detectModelCapabilities(http, model), {\n singleEndpoint: true,\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(this.registry.list().map((ep) => checkEndpointHealth(ep, this.fetchImpl)));\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 }),\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 }),\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 * 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 * 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","/**\n * Converts MCP tools into Ollama-compatible tools.\n */\n\nimport { z } from 'zod';\nimport { OllamaMcpError } from '../errors.js';\nimport type { AnyTool } from '../tools/types.js';\nimport type { ToolRegistry } from '../tools/registry.js';\nimport type { McpClientLike, McpToolDescriptor } from './types.js';\nimport type { ToolProperty } from '../types.js';\n\nexport interface LoadMcpToolsOptions {\n readonly namePrefix?: string;\n}\n\nfunction convertMcpDescriptorToTool(\n descriptor: McpToolDescriptor,\n mcpClient: McpClientLike,\n namePrefix = '',\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\n return {\n name: toolName,\n description: descriptor.description ?? '',\n schema: z.record(z.string(), z.unknown()),\n execute: async (args: Record<string, unknown>) => {\n try {\n const result = await mcpClient.callTool({\n name: descriptor.name,\n arguments: args,\n });\n\n if (result.isError) {\n throw new OllamaMcpError(`MCP tool \"${descriptor.name}\" returned error`, {\n mcpMethod: 'callTool',\n toolName: descriptor.name,\n });\n }\n\n return result.content\n .map((b) => (b.type === 'text' && b.text ? b.text : `[${b.type}]`))\n .join('\\n');\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 type: 'object',\n properties,\n ...(required.length > 0 ? { required } : {}),\n },\n },\n },\n };\n}\n\nexport async function loadMcpTools(\n mcpClient: McpClientLike,\n options: LoadMcpToolsOptions = {},\n): Promise<AnyTool[]> {\n try {\n const { tools } = await mcpClient.listTools();\n return tools.map((t) => convertMcpDescriptorToTool(t, mcpClient, options.namePrefix));\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): Promise<void> {\n const tools = await loadMcpTools(mcpClient, options);\n registry.registerMany(tools);\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 { OllamaAgentMaxIterationsError } 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 { Message, ModelOptions, 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 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?: boolean | 'low' | 'medium' | 'high' | 'max' | 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, each tagged with the\n * originating call's `tool_call_id` — see the {@link ToolCall} type docs for how that id\n * is produced (Ollama's native tool-calling protocol has none; this SDK synthesizes one).\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 hooks?: AgentHooks | undefined;\n\n constructor(client: AgentChatClient, config: AgentConfig = {}) {\n this.client = client;\n this.tools = config.tools;\n this.maxIterations = config.maxIterations ?? 10;\n this.hooks = config.hooks;\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\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 ...(input.options !== undefined ? { options: input.options } : {}),\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 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\n for (const res of toolResults) {\n this.hooks?.onToolCallEnd?.(res);\n history.push({\n role: 'tool',\n ...(res.toolCallId !== undefined ? { tool_call_id: res.toolCallId } : {}),\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/streaming/ndjson.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/utils.ts","../src/client.ts","../src/middleware.ts","../src/streaming/adapters.ts","../src/tools/define-tool.ts","../src/tools/registry.ts","../src/mcp/mcp-tools.ts","../src/skills/frontmatter.ts","../src/skills/compose.ts","../src/agent/agent.ts"],"names":["message","z","controller"],"mappings":"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","file":"index.cjs","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/**\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\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 /** Multiple named endpoints for rotation and automatic failover. */\n readonly endpoints?: readonly OllamaEndpoint[];\n /** Tuning options for endpoint circuit breaker. */\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\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\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\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\nexport interface EndpointHealth {\n readonly endpoint: OllamaEndpoint;\n readonly failureCount: number;\n readonly lastFailureTimestamp?: number | undefined;\n readonly isCoolingDown: boolean;\n}\n\nexport interface EndpointRegistryOptions {\n readonly failureThreshold?: number | undefined;\n readonly cooldownMs?: number | undefined;\n readonly now?: (() => number) | undefined;\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\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 }\n\n candidates(): OllamaEndpoint[] {\n const currentTime = this.now();\n const healthy: OllamaEndpoint[] = [];\n const coolingDown: Array<{ endpoint: OllamaEndpoint; recoveredAt: number }> = [];\n\n for (const ep of this.endpoints) {\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 return healthy.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\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 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 };\n });\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 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 { parseNdjsonStream } from '../streaming/ndjson.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\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}\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\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\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 }\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 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 init: RequestInit = {\n method,\n headers,\n ...(bodyInit !== undefined ? { body: bodyInit } : {}),\n ...(options.signal !== undefined ? { signal: options.signal } : {}),\n };\n\n const response = await this.fetchImpl(url, init);\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 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 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 init: RequestInit = {\n method,\n headers,\n ...(options.body !== undefined ? { body: JSON.stringify(options.body) } : {}),\n ...(options.signal !== undefined ? { signal: options.signal } : {}),\n };\n\n const response = await this.fetchImpl(url, init);\n span?.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, response.status);\n\n if (!response.ok) {\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 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 stream[Symbol.asyncIterator]();\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 { 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): Promise<EndpointHealthCheckResult> {\n const client = new HttpClient({\n baseUrl: endpoint.baseUrl,\n apiKey: endpoint.apiKey,\n headers: endpoint.headers,\n fetch: fetchImpl,\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 } 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 readonly supportsStreaming: true;\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\nexport async function detectModelCapabilities(\n http: HttpClient,\n model: string,\n): Promise<ModelCapabilities> {\n const showRes = await http.request<ShowResponse>({\n path: '/api/show',\n body: { model },\n });\n\n const reported = showRes.capabilities ?? [];\n const reportedSet = new Set(reported.map((c) => c.toLowerCase()));\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 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 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 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 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, 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\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 ) {\n this.finalResultPromise = new Promise<TFinal>((resolve, reject) => {\n this.resolveFinal = resolve;\n this.rejectFinal = reject;\n });\n }\n\n get finalResult(): Promise<TFinal> {\n return this.finalResultPromise;\n }\n\n abort(): void {\n this.source.abort?.();\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 } catch (error) {\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 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 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 }\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): 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);\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 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): OllamaStream<GenerateResponse, GenerateStreamResult> {\n const initial: GenerateStreamResult = { response: '', model: '', done: false };\n return new OllamaStream(source, mapGenerateChunk, aggregateGenerate, initial);\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): OllamaStream<ProgressResponse, ProgressStreamResult> {\n const initial: ProgressStreamResult = { status: '', done: false };\n return new OllamaStream(source, mapProgressChunk, aggregateProgress, initial);\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 { 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\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\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): 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);\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, HttpClient } from './transport/http.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\nexport type RequestRunner = <T>(\n op: (http: HttpClient, signal: AbortSignal) => Promise<T>,\n opts?: {\n signal?: AbortSignal | undefined;\n timeoutMs?: number | undefined;\n singleEndpoint?: boolean | undefined;\n },\n) => Promise<T>;\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);\n },\n { ...request, singleEndpoint: true },\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);\n },\n { ...request, singleEndpoint: true },\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 },\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 { HttpClient } from '../transport/http.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 OpenAIMessage {\n readonly role: 'system' | 'user' | 'assistant' | 'tool';\n readonly content: string;\n readonly name?: string | undefined;\n readonly tool_calls?: readonly OpenAIToolCall[] | 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 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 presence_penalty?: number | undefined;\n readonly frequency_penalty?: number | undefined;\n readonly user?: string | 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?: 'high' | 'medium' | 'low' | 'max' | 'none' | 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?: 'high' | 'medium' | 'low' | 'max' | 'none' | undefined } | undefined;\n}\n\nexport interface OpenAIChatCompletionChoice {\n readonly index: number;\n readonly message: OpenAIMessage;\n readonly finish_reason: string;\n}\n\nexport interface OpenAIChatCompletionResponse {\n readonly id: string;\n readonly object: 'chat.completion';\n readonly created: number;\n readonly model: string;\n readonly choices: readonly OpenAIChatCompletionChoice[];\n readonly usage?:\n | {\n readonly prompt_tokens: number;\n readonly completion_tokens: number;\n readonly total_tokens: number;\n }\n | 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\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}\n\nexport interface OpenAIResponsesOutputTextContent {\n readonly type: 'output_text';\n readonly text: string;\n}\n\nexport interface OpenAIResponsesOutputMessage {\n readonly type: 'message';\n readonly role?: string | undefined;\n readonly content: readonly OpenAIResponsesOutputTextContent[];\n}\n\n/** Non-stateful response shape for `/v1/responses`; see {@link OpenAIResponsesRequest}. */\nexport interface OpenAIResponsesResponse {\n readonly id: string;\n readonly object: 'response';\n readonly created: number;\n readonly model: string;\n readonly output: readonly OpenAIResponsesOutputMessage[];\n readonly usage?:\n | {\n readonly input_tokens: number;\n readonly output_tokens: number;\n readonly total_tokens: number;\n }\n | undefined;\n}\n\nexport class OpenAICompatClient {\n constructor(private readonly http: HttpClient) {}\n\n async createChatCompletion(\n request: OpenAIChatCompletionRequest,\n signal?: AbortSignal,\n ): Promise<OpenAIChatCompletionResponse> {\n return this.http.request<OpenAIChatCompletionResponse>({\n path: '/v1/chat/completions',\n body: request,\n signal,\n });\n }\n\n async chatCompletions(\n request: OpenAIChatCompletionRequest,\n signal?: AbortSignal,\n ): Promise<OpenAIChatCompletionResponse> {\n return this.createChatCompletion(request, signal);\n }\n\n async listModels(signal?: AbortSignal): Promise<OpenAIListModelsResponse> {\n return this.http.request<OpenAIListModelsResponse>({\n path: '/v1/models',\n method: 'GET',\n signal,\n });\n }\n\n async createResponses(\n request: OpenAIResponsesRequest,\n signal?: AbortSignal,\n ): Promise<OpenAIResponsesResponse> {\n return this.http.request<OpenAIResponsesResponse>({\n path: '/v1/responses',\n body: request,\n signal,\n });\n }\n\n async responses(\n request: OpenAIResponsesRequest,\n signal?: AbortSignal,\n ): Promise<OpenAIResponsesResponse> {\n return this.createResponses(request, signal);\n }\n}\n","/**\n * Anthropic Compatibility interfaces and client helpers for Ollama.\n * Ollama supports Anthropic Messages API format.\n *\n * @remarks\n * This is a typed pass-through to Ollama's Anthropic-compatible `/v1/messages` endpoint\n * — a subset of Anthropic's Messages API (text content, system prompt, sampling\n * parameters, ephemeral prompt-caching hints via `cache_control`), not the full Anthropic\n * surface. Tool use (`tool_use`/`tool_result` content blocks), extended thinking,\n * citations, files, token counting, and the Batches API are not modeled here.\n */\n\nimport type { HttpClient } from '../transport/http.js';\n\nexport interface AnthropicCacheControl {\n readonly type: 'ephemeral';\n}\n\nexport interface AnthropicContentBlock {\n readonly type: 'text';\n readonly text: string;\n /** Marks this block as a prompt-caching breakpoint (Anthropic's ephemeral cache). */\n readonly cache_control?: AnthropicCacheControl | undefined;\n}\n\nexport interface AnthropicMessage {\n readonly role: 'user' | 'assistant';\n readonly content: string | readonly AnthropicContentBlock[];\n}\n\nexport interface AnthropicMessagesRequest {\n readonly model: string;\n readonly messages: readonly AnthropicMessage[];\n readonly system?: string | 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 stream?: boolean | 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;\n readonly usage?:\n | {\n readonly input_tokens: number;\n readonly output_tokens: number;\n }\n | undefined;\n}\n\nexport class AnthropicCompatClient {\n constructor(private readonly http: HttpClient) {}\n\n async createMessage(\n request: AnthropicMessagesRequest,\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesResponse> {\n return this.http.request<AnthropicMessagesResponse>({\n path: '/v1/messages',\n body: request,\n signal,\n });\n }\n\n async messages(\n request: AnthropicMessagesRequest,\n signal?: AbortSignal,\n ): Promise<AnthropicMessagesResponse> {\n return this.createMessage(request, signal);\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 resolveApiKey,\n resolveBaseUrl,\n type OllamaClientConfig,\n} from './config.js';\nimport { OllamaClientError, OllamaUnsupportedCapabilityError } 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 { 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 ShowRequestOptions,\n WebFetchRequestOptions,\n WebFetchResponse,\n WebSearchRequestOptions,\n WebSearchResponse,\n} from './types.js';\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\n constructor(config: OllamaClientConfig = {}) {\n const resolvedApiKey = resolveApiKey(config.apiKey);\n const endpoints = config.endpoints ?? [\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(endpoints, config.endpointHealth);\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.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 * 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 ): Promise<T> {\n const timeout = createTimeoutSignal(options?.timeoutMs ?? this.timeoutMs, options?.signal);\n try {\n const allCandidates = this.registry.candidates();\n const candidates = options?.singleEndpoint ? allCandidates.slice(0, 1) : allCandidates;\n let lastError: Error | undefined;\n\n for (const [attemptIndex, endpoint] of candidates.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 });\n\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 () => withRetry(() => operation(http, timeout.signal), this.retryConfig),\n );\n this.registry.reportSuccess(endpoint.name);\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 }\n }\n throw lastError ?? new Error('No healthy Ollama endpoints available');\n } finally {\n 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 messages = await withEncodedMessageImages(req.messages);\n if (req.stream) {\n return this.executeWithFailover(async (http, signal) => {\n if (req.format !== undefined) 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);\n }, req);\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(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);\n }, encodedReq);\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 webSearch(req: WebSearchRequestOptions): Promise<WebSearchResponse> {\n return this.executeWithFailover(\n (http, signal) =>\n http.request<WebSearchResponse>({ path: '/api/websearch', body: req, signal }),\n req,\n );\n }\n webFetch(req: WebFetchRequestOptions): Promise<WebFetchResponse> {\n return this.executeWithFailover(\n (http, signal) =>\n http.request<WebFetchResponse>({ path: '/api/webfetch', body: req, signal }),\n req,\n );\n }\n\n // --- Capabilities & Health ---\n capabilities(model: string): Promise<ModelCapabilities> {\n return this.executeWithFailover((http) => detectModelCapabilities(http, model), {\n singleEndpoint: true,\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(this.registry.list().map((ep) => checkEndpointHealth(ep, this.fetchImpl)));\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 }),\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 }),\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 * 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 * 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","/**\n * Converts MCP tools into Ollama-compatible tools.\n */\n\nimport { z } from 'zod';\nimport { OllamaMcpError } from '../errors.js';\nimport type { AnyTool } from '../tools/types.js';\nimport type { ToolRegistry } from '../tools/registry.js';\nimport type { McpClientLike, McpToolDescriptor } from './types.js';\nimport type { ToolProperty } from '../types.js';\n\nexport interface LoadMcpToolsOptions {\n readonly namePrefix?: string;\n}\n\nfunction convertMcpDescriptorToTool(\n descriptor: McpToolDescriptor,\n mcpClient: McpClientLike,\n namePrefix = '',\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\n return {\n name: toolName,\n description: descriptor.description ?? '',\n schema: z.record(z.string(), z.unknown()),\n execute: async (args: Record<string, unknown>) => {\n try {\n const result = await mcpClient.callTool({\n name: descriptor.name,\n arguments: args,\n });\n\n if (result.isError) {\n throw new OllamaMcpError(`MCP tool \"${descriptor.name}\" returned error`, {\n mcpMethod: 'callTool',\n toolName: descriptor.name,\n });\n }\n\n return result.content\n .map((b) => (b.type === 'text' && b.text ? b.text : `[${b.type}]`))\n .join('\\n');\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 type: 'object',\n properties,\n ...(required.length > 0 ? { required } : {}),\n },\n },\n },\n };\n}\n\nexport async function loadMcpTools(\n mcpClient: McpClientLike,\n options: LoadMcpToolsOptions = {},\n): Promise<AnyTool[]> {\n try {\n const { tools } = await mcpClient.listTools();\n return tools.map((t) => convertMcpDescriptorToTool(t, mcpClient, options.namePrefix));\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): Promise<void> {\n const tools = await loadMcpTools(mcpClient, options);\n registry.registerMany(tools);\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 { OllamaAgentMaxIterationsError } 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 { Message, ModelOptions, 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 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?: boolean | 'low' | 'medium' | 'high' | 'max' | 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, each tagged with the\n * originating call's `tool_call_id` — see the {@link ToolCall} type docs for how that id\n * is produced (Ollama's native tool-calling protocol has none; this SDK synthesizes one).\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 hooks?: AgentHooks | undefined;\n\n constructor(client: AgentChatClient, config: AgentConfig = {}) {\n this.client = client;\n this.tools = config.tools;\n this.maxIterations = config.maxIterations ?? 10;\n this.hooks = config.hooks;\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\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 ...(input.options !== undefined ? { options: input.options } : {}),\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 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\n for (const res of toolResults) {\n this.hooks?.onToolCallEnd?.(res);\n history.push({\n role: 'tool',\n ...(res.toolCallId !== undefined ? { tool_call_id: res.toolCallId } : {}),\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"]}
|