@nemesis-oss/ollama-sdk 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +120 -0
- package/README.md +368 -3
- package/dist/{compose-DJjVpDrk.d.cts → compose-CDWq8oxJ.d.cts} +51 -2
- package/dist/{compose-DJjVpDrk.d.ts → compose-CDWq8oxJ.d.ts} +51 -2
- package/dist/index.cjs +455 -63
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +344 -6
- package/dist/index.d.ts +344 -6
- package/dist/index.js +450 -64
- package/dist/index.js.map +1 -1
- package/dist/skills.cjs.map +1 -1
- package/dist/skills.d.cts +2 -2
- package/dist/skills.d.ts +2 -2
- package/dist/skills.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/errors.ts","../src/logger.ts","../src/providers/endpoint-registry.ts","../src/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","controller","z"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Configuration options and constants for OllamaClient.\n */\n\nimport type { Logger, RequestLifecycleHook } from './logger.js';\nimport type { Middleware } from './middleware.js';\nimport type { RetryConfig } from './transport/retry.js';\nimport type { FetchLike } from './transport/http.js';\nimport type { EndpointRegistryOptions, OllamaEndpoint } from './providers/endpoint-registry.js';\n\nexport const DEFAULT_BASE_URL = 'http://localhost:11434';\nexport const DEFAULT_TIMEOUT_MS = 30_000;\n\n/**\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"]}
|
|
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/quota.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","controller","z"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Configuration options and constants for OllamaClient.\n */\n\nimport type { Logger, RequestLifecycleHook } from './logger.js';\nimport type { Middleware } from './middleware.js';\nimport type { RetryConfig } from './transport/retry.js';\nimport type { FetchLike } from './transport/http.js';\nimport type { EndpointRegistryOptions, OllamaEndpoint } from './providers/endpoint-registry.js';\n\nexport const DEFAULT_BASE_URL = 'http://localhost:11434';\nexport const DEFAULT_TIMEOUT_MS = 30_000;\n/**\n * Fixed host for Ollama's hosted web tools (`/api/web_search`, `/api/web_fetch`) — see\n * `OllamaClient.webSearch`/`webFetch`. These are an Ollama Cloud service reachable only\n * at this host, independent of any locally-configured `baseUrl`/`endpoints`.\n */\nexport const OLLAMA_CLOUD_BASE_URL = 'https://ollama.com';\n\n/**\n * Reads a process environment variable, if any. Guarded with `typeof process` rather\n * than importing `node:process` so this stays safe to call from Edge Runtimes (Cloudflare\n * Workers, Vercel Edge) where `process` doesn't exist — it just returns `undefined` there.\n */\nfunction readEnv(name: string): string | undefined {\n return typeof process !== 'undefined' && process.env ? process.env[name] : undefined;\n}\n\n/**\n * Resolves the default single-endpoint `baseUrl`, falling back to the `OLLAMA_HOST`\n * environment variable (the same one the official `ollama` CLI and client libraries\n * read) before `DEFAULT_BASE_URL`. Explicit `config.baseUrl` always wins.\n */\nexport function resolveBaseUrl(configBaseUrl?: string | undefined): string {\n return configBaseUrl ?? readEnv('OLLAMA_HOST') ?? DEFAULT_BASE_URL;\n}\n\n/**\n * Resolves the default single-endpoint `apiKey`, falling back to the `OLLAMA_API_KEY`\n * environment variable before leaving it unset. Explicit `config.apiKey` always wins.\n */\nexport function resolveApiKey(configApiKey?: string | undefined): string | undefined {\n return configApiKey ?? readEnv('OLLAMA_API_KEY');\n}\n\n/** One named credential for the `credentials`/`modelBindings` config shape. */\nexport interface OllamaCredentialConfig {\n readonly apiKey: string;\n /** Overrides `OllamaClientConfig.baseUrl` for requests made with this credential. */\n readonly baseUrl?: string | undefined;\n readonly headers?: Record<string, string> | undefined;\n}\n\n/**\n * Builds synthetic `OllamaEndpoint`s (named `credential:<id>`) from `config.credentials` +\n * `config.modelBindings` — an ergonomic, map-based alternative to writing out `endpoints`\n * with per-entry `models` allow-lists directly. Both shapes feed the same\n * `EndpointRegistry`/`executeWithFailover` routing engine; this is pure config sugar, not\n * a separate routing mechanism. Returns `[]` if `config.credentials` is unset.\n *\n * A model bound to one credential (`modelBindings: { \"minimax-m3\": \"coder\" }`) scopes that\n * credential to only that model, same as `OllamaEndpoint.models`. A model bound to several\n * credentials (`modelBindings: { \"gpt-oss:120b\": [\"key1\", \"key2\"] }`) makes ordinary\n * endpoint failover apply between them. `config.defaultCredential`, if set, is given a\n * lower priority than explicitly-bound credentials and no `models` restriction, so it acts\n * as a catch-all for any model without an explicit binding without ever pre-empting one\n * that has.\n */\nexport function resolveCredentialEndpoints(\n config: Pick<OllamaClientConfig, 'credentials' | 'modelBindings' | 'defaultCredential' | 'baseUrl'>,\n): readonly OllamaEndpoint[] {\n if (config.credentials === undefined) return [];\n\n const modelsByCredential = new Map<string, string[]>();\n for (const [model, bound] of Object.entries(config.modelBindings ?? {})) {\n for (const id of typeof bound === 'string' ? [bound] : bound) {\n if (!(id in config.credentials)) {\n throw new Error(\n `modelBindings[\"${model}\"] references unknown credential \"${id}\" — it isn't ` +\n `in \\`credentials\\`. Known credentials: ${Object.keys(config.credentials).join(', ') || '(none)'}.`,\n );\n }\n const list = modelsByCredential.get(id) ?? [];\n list.push(model);\n modelsByCredential.set(id, list);\n }\n }\n\n return Object.entries(config.credentials).map(([id, credential]) => {\n const isDefault = id === config.defaultCredential;\n const boundModels = isDefault ? undefined : modelsByCredential.get(id);\n return {\n name: `credential:${id}`,\n baseUrl: resolveBaseUrl(credential.baseUrl ?? config.baseUrl),\n apiKey: credential.apiKey,\n ...(credential.headers !== undefined ? { headers: credential.headers } : {}),\n ...(boundModels !== undefined ? { models: boundModels } : {}),\n priority: isDefault ? -1 : 0,\n };\n });\n}\n\nexport const DEFAULT_FAILOVER_CODES: readonly string[] = [\n 'network_error',\n 'timeout',\n 'server_error',\n 'rate_limited',\n 'auth_error',\n // A candidate endpoint rejected the request pre-flight for a known-unsupported\n // capability (e.g. structured output against Ollama Cloud) — try the next candidate\n // rather than failing outright; see OllamaUnsupportedCapabilityError.\n 'unsupported_capability',\n];\n\nexport interface OllamaClientConfig {\n /**\n * Base URL of a single Ollama server. Ignored if `endpoints` is provided. Falls back to\n * the `OLLAMA_HOST` environment variable (when set and running under Node), then\n * `http://localhost:11434`.\n */\n readonly baseUrl?: string;\n /**\n * Bearer token sent as `Authorization: Bearer <apiKey>` for a single-endpoint setup.\n * Falls back to the `OLLAMA_API_KEY` environment variable (when set and running under\n * Node).\n */\n readonly apiKey?: string;\n /** Static headers merged into every request. */\n readonly headers?: Record<string, string>;\n /**\n * Multiple named endpoints for rotation and automatic failover. Each endpoint may\n * carry its own `apiKey` and, via `models`, be scoped to only the models that\n * credential is entitled to — see `OllamaEndpoint.models` for routing several\n * per-model Ollama Cloud API keys through a single client.\n */\n readonly endpoints?: readonly OllamaEndpoint[];\n /**\n * Named credentials, keyed by an id you choose — an ergonomic alternative to writing\n * out `endpoints` by hand for the common \"several Ollama Cloud API keys, each entitled\n * to different models\" shape. Combine with `modelBindings` to scope each credential to\n * the models it's authorized for; a credential with no binding (or set as\n * `defaultCredential`) is eligible for every model, same as an `OllamaEndpoint` with no\n * `models`. Merges additively with `endpoints` if both are given.\n */\n readonly credentials?: Readonly<Record<string, OllamaCredentialConfig>>;\n /**\n * Maps a model name to the `credentials` id (or ids, for several keys authorized for\n * the same model — ordinary failover applies between them) that may serve it. Has no\n * effect without `credentials`. Referencing an id not present in `credentials` throws\n * at construction time.\n */\n readonly modelBindings?: Readonly<Record<string, string | readonly string[]>>;\n /**\n * The `credentials` id to fall back to for a model with no entry in `modelBindings`.\n * Unset means such a model has no synthesized-from-`credentials` route — it still\n * routes normally through any plain `endpoints` entry without a `models` restriction.\n */\n readonly defaultCredential?: string | undefined;\n /**\n * Tuning options for the endpoint circuit breaker, and candidate selection ordering —\n * pass `{ strategy: 'round-robin' }` to spread requests across a pool of same-priority\n * endpoints/credentials (e.g. several unbound `credentials`) instead of always\n * preferring the first one, or `{ strategy: 'least-connections' }` to route each\n * request to whichever candidate currently has the fewest requests in flight (e.g.\n * several free-tier Ollama Cloud accounts, each capped at 1 concurrent request — this\n * deterministically spreads concurrent `Promise.all`-style calls one-per-account rather\n * than risking two landing on the same still-busy one), and `maxConcurrentPerEndpoint`\n * to cap that at an exact number and queue (rather than overrun a saturated candidate)\n * once every eligible one is at capacity — e.g. `{ strategy: 'least-connections',\n * maxConcurrentPerEndpoint: 1 }` for accounts that only allow one request at a time.\n * See `EndpointRegistryOptions`.\n */\n readonly endpointHealth?: EndpointRegistryOptions;\n /** Error codes that trigger failover to the next candidate endpoint. */\n readonly failoverOn?: readonly string[];\n /** Default per-request timeout in milliseconds (default 30_000ms). */\n readonly timeoutMs?: number;\n /** Retry configuration or retry count override. */\n readonly retries?: number | Partial<RetryConfig>;\n /** Custom fetch implementation (defaults to globalThis.fetch). */\n readonly fetch?: FetchLike;\n /** Request/Response middleware list. */\n readonly middleware?: readonly Middleware[];\n /** Structured logger. */\n readonly logger?: Logger;\n /** Enables console debug logger if true. */\n readonly debug?: boolean;\n /** Request lifecycle hook for telemetry/metrics. */\n readonly onLifecycleEvent?: RequestLifecycleHook;\n}\n","/**\n * Structured, typed error hierarchy for OllamaClient.\n */\n\nexport interface OllamaErrorRequestContext {\n readonly method?: string | undefined;\n readonly url?: string | undefined;\n readonly model?: string | undefined;\n}\n\nexport interface OllamaErrorResponseContext {\n readonly status?: number | undefined;\n readonly headers?: Record<string, string> | undefined;\n readonly body?: unknown;\n}\n\nexport interface OllamaClientErrorOptions extends ErrorOptions {\n readonly code: string;\n readonly status?: number | undefined;\n readonly retryable?: boolean | undefined;\n readonly request?: OllamaErrorRequestContext | undefined;\n readonly response?: OllamaErrorResponseContext | undefined;\n}\n\nexport class OllamaClientError extends Error {\n readonly code: string;\n readonly status?: number | undefined;\n readonly retryable: boolean;\n readonly request?: OllamaErrorRequestContext | undefined;\n readonly response?: OllamaErrorResponseContext | undefined;\n\n constructor(message: string, options: OllamaClientErrorOptions) {\n super(message, { cause: options.cause });\n this.name = this.constructor.name;\n this.code = options.code;\n this.status = options.status;\n this.retryable = options.retryable ?? false;\n this.request = options.request;\n this.response = options.response;\n }\n}\n\nexport class OllamaNetworkError extends OllamaClientError {\n constructor(\n message: string,\n options?: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> | undefined,\n ) {\n super(message, { ...options, code: 'network_error', retryable: true });\n }\n}\n\nexport class OllamaTimeoutError extends OllamaClientError {\n readonly timeoutMs?: number | undefined;\n constructor(\n message: string,\n options?:\n | (Omit<OllamaClientErrorOptions, 'code' | 'retryable'> & { timeoutMs?: number | undefined })\n | undefined,\n ) {\n super(message, { ...options, code: 'timeout', retryable: true });\n this.timeoutMs = options?.timeoutMs;\n }\n}\n\nexport class OllamaAuthError extends OllamaClientError {\n constructor(\n message: string,\n options?: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> | undefined,\n ) {\n super(message, { ...options, code: 'auth_error', retryable: false });\n }\n}\n\nexport class OllamaNotFoundError extends OllamaClientError {\n constructor(\n message: string,\n options?: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> | undefined,\n ) {\n super(message, { ...options, code: 'not_found', retryable: false });\n }\n}\n\nexport class OllamaRateLimitError extends OllamaClientError {\n readonly retryAfterMs?: number | undefined;\n constructor(\n message: string,\n options?:\n | (Omit<OllamaClientErrorOptions, 'code' | 'retryable'> & {\n retryAfterMs?: number | undefined;\n })\n | undefined,\n ) {\n super(message, { ...options, code: 'rate_limited', retryable: true });\n this.retryAfterMs = options?.retryAfterMs;\n }\n}\n\n/**\n * Thrown client-side, before a network request is made, by `QuotaManager.assertCanProceed`\n * (see `src/quota.ts`) when issuing the request would exceed a configured usage budget for\n * one of its rolling windows. This is distinct from `OllamaRateLimitError`, which reflects\n * the server's own 429 response — Ollama Cloud does not expose account-level quota via the\n * API, so `QuotaManager` tracks usage against budgets the caller configures locally and\n * fails fast rather than waiting for the server to reject the request.\n */\nexport class OllamaQuotaExceededError extends OllamaClientError {\n readonly windowId: string;\n readonly resetAt: number;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> & {\n windowId: string;\n resetAt: number;\n },\n ) {\n super(message, { ...options, code: 'quota_exceeded', retryable: false });\n this.windowId = options.windowId;\n this.resetAt = options.resetAt;\n }\n}\n\nexport class OllamaServerError extends OllamaClientError {\n constructor(\n message: string,\n options?: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> | undefined,\n ) {\n super(message, { ...options, code: 'server_error', retryable: true });\n }\n}\n\nexport class OllamaAbortError extends OllamaClientError {\n constructor(\n message: string,\n options?: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> | undefined,\n ) {\n super(message, { ...options, code: 'aborted', retryable: false });\n }\n}\n\nexport class OllamaToolValidationError extends OllamaClientError {\n readonly toolName: string;\n readonly issues?: unknown;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code'> & { toolName: string; issues?: unknown },\n ) {\n super(message, { ...options, code: 'tool_validation_error', retryable: false });\n this.toolName = options.toolName;\n this.issues = options.issues;\n }\n}\n\nexport class OllamaToolTimeoutError extends OllamaClientError {\n readonly toolName: string;\n readonly timeoutMs: number;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> & {\n toolName: string;\n timeoutMs: number;\n },\n ) {\n super(message, { ...options, code: 'tool_timeout', retryable: false });\n this.toolName = options.toolName;\n this.timeoutMs = options.timeoutMs;\n }\n}\n\n/**\n * Thrown client-side, before a network request is made, when a request asks for a\n * capability an endpoint is known not to support (e.g. structured output `format` against\n * an Ollama Cloud endpoint — see `ModelCapabilities.supportsStructuredOutputRequest` in\n * `src/capabilities/capabilities.ts`). Its `code` is included in `DEFAULT_FAILOVER_CODES`\n * by default, so in a multi-endpoint setup it causes failover to the next candidate rather\n * than failing outright — it only surfaces to the caller if every candidate is rejected.\n */\nexport class OllamaUnsupportedCapabilityError extends OllamaClientError {\n readonly capability: string;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> & { capability: string },\n ) {\n super(message, { ...options, code: 'unsupported_capability', retryable: false });\n this.capability = options.capability;\n }\n}\n\n/**\n * Thrown client-side, before any network call, when `config.endpoints` uses\n * `OllamaEndpoint.models` to scope endpoints/credentials to specific models and the\n * requested `model` isn't in any configured endpoint's allow-list. This is a routing\n * misconfiguration, not a connectivity problem — the SDK deliberately does not \"probe\"\n * unauthorized endpoints to find one that happens to work (that would burn quota on keys\n * that were never entitled to the model and produce non-deterministic startup behavior).\n */\nexport class OllamaModelRoutingError extends OllamaClientError {\n readonly model: string;\n readonly availableModels: readonly string[];\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code' | 'retryable'> & {\n model: string;\n availableModels: readonly string[];\n },\n ) {\n super(message, { ...options, code: 'model_routing_error', retryable: false });\n this.model = options.model;\n this.availableModels = options.availableModels;\n }\n}\n\nexport class OllamaAgentMaxIterationsError extends OllamaClientError {\n readonly maxIterations: number;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code'> & { maxIterations: number },\n ) {\n super(message, { ...options, code: 'agent_max_iterations_exceeded', retryable: false });\n this.maxIterations = options.maxIterations;\n }\n}\n\nexport class OllamaMcpError extends OllamaClientError {\n readonly mcpMethod: 'listTools' | 'callTool';\n readonly toolName?: string | undefined;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code'> & {\n mcpMethod: 'listTools' | 'callTool';\n toolName?: string | undefined;\n },\n ) {\n super(message, { ...options, code: 'mcp_error', retryable: options.retryable ?? false });\n this.mcpMethod = options.mcpMethod;\n this.toolName = options.toolName;\n }\n}\n\nexport class OllamaSkillNotFoundError extends OllamaClientError {\n readonly skillName: string;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code'> & { skillName: string },\n ) {\n super(message, { ...options, code: 'skill_not_found', retryable: false });\n this.skillName = options.skillName;\n }\n}\n\nexport class OllamaSkillInvalidError extends OllamaClientError {\n readonly skillName: string;\n readonly path?: string | undefined;\n constructor(\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code'> & {\n skillName: string;\n path?: string | undefined;\n },\n ) {\n super(message, { ...options, code: 'skill_invalid', retryable: false });\n this.skillName = options.skillName;\n this.path = options.path;\n }\n}\n\nexport class OllamaGenericClientError extends OllamaClientError {\n constructor(message: string, options?: Omit<OllamaClientErrorOptions, 'code'> | undefined) {\n super(message, { ...options, code: 'client_error' });\n }\n}\n\nfunction isDomAbortError(error: unknown): error is DOMException {\n return (\n typeof DOMException !== 'undefined' &&\n error instanceof DOMException &&\n error.name === 'AbortError'\n );\n}\n\nfunction statusToError(\n status: number,\n message: string,\n options: Omit<OllamaClientErrorOptions, 'code' | 'status'>,\n): OllamaClientError {\n if (status === 401 || status === 403) {\n return new OllamaAuthError(message, { ...options, status });\n }\n if (status === 404) {\n return new OllamaNotFoundError(message, { ...options, status });\n }\n if (status === 429) {\n return new OllamaRateLimitError(message, { ...options, status });\n }\n if (status >= 500) {\n return new OllamaServerError(message, { ...options, status });\n }\n return new OllamaGenericClientError(message, { ...options, status });\n}\n\n/**\n * Maps arbitrary thrown exceptions into structured OllamaClientError instances.\n */\nexport function mapError(\n error: unknown,\n context: {\n request?: OllamaErrorRequestContext | undefined;\n response?: OllamaErrorResponseContext | undefined;\n } = {},\n): OllamaClientError {\n if (error instanceof OllamaClientError) {\n return error;\n }\n if (isDomAbortError(error)) {\n return new OllamaAbortError(error.message || 'Request was aborted', {\n cause: error,\n request: context.request,\n });\n }\n if (error instanceof TypeError) {\n return new OllamaNetworkError(error.message || 'Network request failed', {\n cause: error,\n request: context.request,\n });\n }\n if (context.response?.status !== undefined) {\n const message = error instanceof Error ? error.message : String(error);\n return statusToError(context.response.status, message, {\n cause: error,\n request: context.request,\n response: context.response,\n });\n }\n const message = error instanceof Error ? error.message : String(error);\n return new OllamaGenericClientError(message, {\n cause: error,\n request: context.request,\n response: context.response,\n });\n}\n","/**\n * Structured logger and request lifecycle interfaces.\n */\n\nexport interface LogFn {\n (message: string, context?: Record<string, unknown>): void;\n}\n\nexport interface Logger {\n readonly debug: LogFn;\n readonly info: LogFn;\n readonly warn: LogFn;\n readonly error: LogFn;\n}\n\nexport interface LifecycleStartEvent {\n readonly type: 'start';\n readonly requestId: string;\n readonly method: string;\n readonly url: string;\n readonly timestamp: number;\n}\n\nexport interface LifecycleSuccessEvent {\n readonly type: 'success';\n readonly requestId: string;\n readonly durationMs: number;\n readonly status: number;\n readonly timestamp: number;\n}\n\nexport interface LifecycleRetryEvent {\n readonly type: 'retry';\n readonly requestId: string;\n readonly attempt: number;\n readonly error: Error;\n readonly delayMs: number;\n readonly timestamp: number;\n}\n\nexport interface LifecycleErrorEvent {\n readonly type: 'error';\n readonly requestId: string;\n readonly durationMs: number;\n readonly error: Error;\n readonly timestamp: number;\n}\n\nexport type RequestLifecycleEvent =\n LifecycleStartEvent | LifecycleSuccessEvent | LifecycleRetryEvent | LifecycleErrorEvent;\n\nexport interface RequestLifecycleHook {\n (event: RequestLifecycleEvent): void;\n}\n\nexport const NOOP_LOGGER: Logger = {\n debug: () => undefined,\n info: () => undefined,\n warn: () => undefined,\n error: () => undefined,\n};\n\nexport function createConsoleLogger(prefix = '[@nemesis-oss/ollama-sdk]'): Logger {\n return {\n debug: (msg, ctx) => console.debug(`${prefix} ${msg}`, ctx ?? ''),\n info: (msg, ctx) => console.info(`${prefix} ${msg}`, ctx ?? ''),\n warn: (msg, ctx) => console.warn(`${prefix} ${msg}`, ctx ?? ''),\n error: (msg, ctx) => console.error(`${prefix} ${msg}`, ctx ?? ''),\n };\n}\n","/**\n * Multi-endpoint registry with priority routing and circuit breaker failover.\n */\n\nimport { OllamaAbortError } from '../errors.js';\n\nexport interface OllamaEndpoint {\n readonly name: string;\n readonly baseUrl: string;\n readonly apiKey?: string | undefined;\n readonly headers?: Record<string, string> | undefined;\n readonly priority?: number | undefined;\n /**\n * Restricts this endpoint/credential to a specific set of models — for the common case\n * of several Ollama Cloud API keys, each entitled to a different model. When set,\n * `EndpointRegistry.candidates(model)` only returns this endpoint for a request whose\n * `model` is in the list, so cross-endpoint failover never retries a request against a\n * credential that isn't authorized for the requested model. Omit (the default) to make\n * the endpoint eligible for every model, preserving prior behavior.\n */\n readonly models?: readonly string[] | undefined;\n}\n\nexport interface EndpointHealth {\n readonly endpoint: OllamaEndpoint;\n readonly failureCount: number;\n readonly lastFailureTimestamp?: number | undefined;\n readonly isCoolingDown: boolean;\n /** In-flight requests currently attempting this endpoint — see `acquire`/`release`. */\n readonly activeRequests: number;\n}\n\nexport interface EndpointRegistryOptions {\n readonly failureThreshold?: number | undefined;\n readonly cooldownMs?: number | undefined;\n readonly now?: (() => number) | undefined;\n /**\n * How candidates that share the same `priority` are ordered within `candidates()`.\n * `'priority'` (the default) keeps them in registration order, so the same candidate is\n * always tried first while it stays healthy. `'round-robin'` rotates each same-priority\n * group by one position per `candidates()` call — i.e. per `chat`/`generate`/etc. call —\n * so consecutive requests spread across a pool of interchangeable endpoints/credentials\n * instead of always preferring the first one (the common case: several Ollama Cloud keys\n * registered with no `models` restriction, meant to be used interchangeably). Endpoints\n * at different priorities are unaffected either way — a higher-priority one is still\n * always tried first, and failover to the rest of the group still applies if the\n * rotated-to-front candidate fails.\n *\n * `'least-connections'` instead orders each same-priority group by ascending in-flight\n * request count (tracked via `acquire`/`release`, ties broken by registration order),\n * so a request always prefers whichever candidate currently has the fewest requests\n * still in progress. Unlike `'round-robin'`, this remains correct under uneven or\n * overlapping request durations — e.g. several Ollama Cloud accounts each limited to 1\n * concurrent request: firing several requests at once (`Promise.all`) deterministically\n * lands each on a different account rather than risking two landing on the same\n * still-busy one, because `candidates()` and the subsequent `acquire()` for the chosen\n * candidate run synchronously with no `await` in between — JS's single-threaded\n * execution means no two concurrent calls can observe the same \"0 active\" snapshot for\n * the same candidate.\n */\n readonly strategy?: 'priority' | 'round-robin' | 'least-connections' | undefined;\n /**\n * Caps in-flight requests per endpoint (tracked via `acquire`/`release`). Unset (the\n * default) means no cap — candidates are never treated as saturated. When set, a\n * request whose every otherwise-eligible candidate is already at this cap waits\n * (`waitForCapacity`, FIFO per candidate) for one of them to free up, instead of being\n * sent to an already-saturated candidate. Pairs naturally with `strategy:\n * 'least-connections'` for a pool of accounts each limited to N concurrent requests —\n * e.g. `maxConcurrentPerEndpoint: 1` for several Ollama Cloud free-tier accounts, so\n * `N + 1` concurrent calls against `N` such accounts run `N` immediately and queue the\n * rest, rather than the `(N+1)`th overrunning whichever account looks \"least busy\" at\n * that instant. Waiting is bounded by the request's own timeout/`AbortSignal`, same as\n * any other in-flight request — it never blocks indefinitely on its own.\n */\n readonly maxConcurrentPerEndpoint?: number | undefined;\n}\n\ninterface CapacityWaiter {\n readonly names: readonly string[];\n readonly resolve: () => void;\n cleanup: () => void;\n}\n\nexport class EndpointRegistry {\n private readonly endpoints: readonly OllamaEndpoint[];\n private readonly failureCounts = new Map<string, number>();\n private readonly lastFailures = new Map<string, number>();\n private readonly failureThreshold: number;\n private readonly cooldownMs: number;\n private readonly now: () => number;\n private readonly strategy: 'priority' | 'round-robin' | 'least-connections';\n private roundRobinCounter = 0;\n private readonly activeCounts = new Map<string, number>();\n private readonly maxConcurrentPerEndpoint: number | undefined;\n private readonly waiters: CapacityWaiter[] = [];\n\n constructor(endpoints: readonly OllamaEndpoint[], options: EndpointRegistryOptions = {}) {\n this.endpoints =\n endpoints.length > 0 ? endpoints : [{ name: 'default', baseUrl: 'http://localhost:11434' }];\n this.failureThreshold = options.failureThreshold ?? 3;\n this.cooldownMs = options.cooldownMs ?? 30_000;\n this.now = options.now ?? Date.now;\n this.strategy = options.strategy ?? 'priority';\n this.maxConcurrentPerEndpoint = options.maxConcurrentPerEndpoint;\n }\n\n /**\n * Marks one more request as in-flight against `name`. Callers (`OllamaClient`) must\n * pair every `acquire` with a `release` once that attempt finishes, success or not —\n * see `OllamaClient.executeWithFailover`. Only affects candidate ordering when\n * `strategy` is `'least-connections'`; harmless (just bookkeeping) otherwise, and\n * always reflected in `status()`'s `activeRequests`.\n */\n acquire(name: string): void {\n this.activeCounts.set(name, (this.activeCounts.get(name) ?? 0) + 1);\n }\n\n /** Releases one in-flight request marked via `acquire`, waking one waiter for `name` if any. */\n release(name: string): void {\n const next = (this.activeCounts.get(name) ?? 0) - 1;\n if (next <= 0) {\n this.activeCounts.delete(name);\n } else {\n this.activeCounts.set(name, next);\n }\n const idx = this.waiters.findIndex((w) => w.names.includes(name));\n if (idx !== -1) {\n const [waiter] = this.waiters.splice(idx, 1);\n waiter?.cleanup();\n waiter?.resolve();\n }\n }\n\n /**\n * `candidates` filtered down to those currently under `maxConcurrentPerEndpoint` (all\n * of them, unchanged, if that option is unset).\n */\n filterWithCapacity(candidates: readonly OllamaEndpoint[]): OllamaEndpoint[] {\n const cap = this.maxConcurrentPerEndpoint;\n if (cap === undefined) return [...candidates];\n return candidates.filter((ep) => (this.activeCounts.get(ep.name) ?? 0) < cap);\n }\n\n /**\n * Resolves once any endpoint named in `names` has spare capacity under\n * `maxConcurrentPerEndpoint` (a no-op resolve if that option is unset, or if one\n * already does). Otherwise queues (FIFO per name) until a matching `release()` frees a\n * slot, or rejects if `signal` aborts first — mirroring whatever aborted it\n * (`OllamaTimeoutError`/the caller's own abort reason) so callers see the same error\n * shape as any other in-flight request that times out or is cancelled. FIFO order is\n * best-effort (a newly-arriving request can still win a race for a slot that just\n * freed) — the capacity cap itself, not fairness, is the guarantee this exists for.\n */\n waitForCapacity(names: readonly string[], signal?: AbortSignal): Promise<void> {\n const cap = this.maxConcurrentPerEndpoint;\n if (cap === undefined) return Promise.resolve();\n if (names.some((n) => (this.activeCounts.get(n) ?? 0) < cap)) return Promise.resolve();\n\n return new Promise<void>((resolve, reject) => {\n const waiter: CapacityWaiter = { names, resolve, cleanup: () => undefined };\n const onAbort = (): void => {\n const idx = this.waiters.indexOf(waiter);\n if (idx !== -1) this.waiters.splice(idx, 1);\n reject(\n signal?.reason instanceof Error\n ? signal.reason\n : new OllamaAbortError('Aborted while waiting for endpoint capacity'),\n );\n };\n if (signal !== undefined) {\n if (signal.aborted) {\n onAbort();\n return;\n }\n signal.addEventListener('abort', onAbort, { once: true });\n waiter.cleanup = () => signal.removeEventListener('abort', onAbort);\n }\n this.waiters.push(waiter);\n });\n }\n\n /**\n * Rotates each same-`priority` group in `sorted` (already sorted highest-priority-first)\n * by one position further per call, wrapping around within the group. Priority tiers\n * themselves are never reordered — only candidates that were already tied.\n */\n private applyRoundRobin(sorted: readonly OllamaEndpoint[]): OllamaEndpoint[] {\n const offset = this.roundRobinCounter++;\n const result: OllamaEndpoint[] = [];\n let i = 0;\n while (i < sorted.length) {\n const priority = sorted[i]?.priority ?? 0;\n let j = i + 1;\n while (j < sorted.length && (sorted[j]?.priority ?? 0) === priority) j++;\n const tier = sorted.slice(i, j);\n const rotation = offset % tier.length;\n result.push(...tier.slice(rotation), ...tier.slice(0, rotation));\n i = j;\n }\n return result;\n }\n\n /**\n * Reorders each same-`priority` group in `sorted` by ascending in-flight request count\n * (from `acquire`/`release`); a stable sort, so candidates tied on active count keep\n * their relative (priority-then-registration) order. Priority tiers themselves are\n * never reordered.\n */\n private applyLeastConnections(sorted: readonly OllamaEndpoint[]): OllamaEndpoint[] {\n const result: OllamaEndpoint[] = [];\n let i = 0;\n while (i < sorted.length) {\n const priority = sorted[i]?.priority ?? 0;\n let j = i + 1;\n while (j < sorted.length && (sorted[j]?.priority ?? 0) === priority) j++;\n const tier = [...sorted.slice(i, j)].sort(\n (a, b) => (this.activeCounts.get(a.name) ?? 0) - (this.activeCounts.get(b.name) ?? 0),\n );\n result.push(...tier);\n i = j;\n }\n return result;\n }\n\n /**\n * Endpoints eligible for `model`, sorted healthy-first-by-priority (falling back to\n * soonest-to-recover if every eligible endpoint is cooling down); same-priority\n * candidates are further reordered per `options.strategy` (see\n * `EndpointRegistryOptions.strategy`). When `model` is given, endpoints whose `models`\n * allow-list doesn't include it are excluded entirely — see `OllamaEndpoint.models`.\n * Omit `model` to consider every configured endpoint, regardless of any `models`\n * restriction (used for non-model-scoped operations).\n */\n candidates(model?: string): OllamaEndpoint[] {\n const currentTime = this.now();\n const scoped =\n model === undefined\n ? this.endpoints\n : this.endpoints.filter((ep) => ep.models === undefined || ep.models.includes(model));\n const healthy: OllamaEndpoint[] = [];\n const coolingDown: Array<{ endpoint: OllamaEndpoint; recoveredAt: number }> = [];\n\n for (const ep of scoped) {\n const failures = this.failureCounts.get(ep.name) ?? 0;\n const lastFail = this.lastFailures.get(ep.name) ?? 0;\n const isCooling =\n failures >= this.failureThreshold && currentTime - lastFail < this.cooldownMs;\n\n if (!isCooling) {\n healthy.push(ep);\n } else {\n coolingDown.push({ endpoint: ep, recoveredAt: lastFail + this.cooldownMs });\n }\n }\n\n if (healthy.length > 0) {\n const sorted = healthy.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n if (this.strategy === 'round-robin') return this.applyRoundRobin(sorted);\n if (this.strategy === 'least-connections') return this.applyLeastConnections(sorted);\n return sorted;\n }\n\n // Fail-open: sort by soonest-to-recover\n return coolingDown.sort((a, b) => a.recoveredAt - b.recoveredAt).map((c) => c.endpoint);\n }\n\n reportSuccess(name: string): void {\n this.failureCounts.delete(name);\n this.lastFailures.delete(name);\n }\n\n reportFailure(name: string): void {\n const current = (this.failureCounts.get(name) ?? 0) + 1;\n this.failureCounts.set(name, current);\n this.lastFailures.set(name, this.now());\n }\n\n list(): readonly OllamaEndpoint[] {\n return this.endpoints;\n }\n\n /** True if any configured endpoint restricts itself to a `models` allow-list. */\n hasModelScopedEndpoints(): boolean {\n return this.endpoints.some((ep) => ep.models !== undefined);\n }\n\n status(): EndpointHealth[] {\n const currentTime = this.now();\n return this.endpoints.map((ep) => {\n const failures = this.failureCounts.get(ep.name) ?? 0;\n const lastFail = this.lastFailures.get(ep.name);\n const isCoolingDown =\n failures >= this.failureThreshold &&\n lastFail !== undefined &&\n currentTime - lastFail < this.cooldownMs;\n\n return {\n endpoint: ep,\n failureCount: failures,\n ...(lastFail !== undefined ? { lastFailureTimestamp: lastFail } : {}),\n isCoolingDown,\n activeRequests: this.activeCounts.get(ep.name) ?? 0,\n };\n });\n }\n}\n","/**\n * 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 model?: string | undefined;\n /** See `OllamaClient.executeWithFailover`'s `holdUntil` doc. */\n holdUntil?: ((result: T) => Promise<unknown>) | 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, holdUntil: (stream) => stream.finalResult },\n );\n }\n return this.runner(\n (http, signal) =>\n http.request<ProgressResponse>({\n path: '/api/pull',\n body: { ...request, stream: false },\n signal,\n }),\n { ...request, singleEndpoint: true },\n );\n }\n\n push(\n request: PushRequestOptions & { stream: true },\n ): Promise<OllamaStream<ProgressResponse, ProgressStreamResult>>;\n push(request: PushRequestOptions & { stream?: false | undefined }): Promise<ProgressResponse>;\n push(\n request: PushRequestOptions,\n ): Promise<ProgressResponse | OllamaStream<ProgressResponse, ProgressStreamResult>>;\n async push(\n request: PushRequestOptions,\n ): Promise<ProgressResponse | OllamaStream<ProgressResponse, ProgressStreamResult>> {\n if (request.stream) {\n return this.runner(\n async (http, signal) => {\n const stream = await http.requestStream<ProgressResponse>({\n path: '/api/push',\n body: { ...request, stream: true },\n signal,\n });\n return normalizeProgressStream(stream);\n },\n { ...request, singleEndpoint: true, holdUntil: (stream) => stream.finalResult },\n );\n }\n return this.runner(\n (http, signal) =>\n http.request<ProgressResponse>({\n path: '/api/push',\n body: { ...request, stream: false },\n signal,\n }),\n { ...request, singleEndpoint: true },\n );\n }\n\n create(\n request: CreateRequestOptions & { stream: true },\n ): Promise<OllamaStream<ProgressResponse, ProgressStreamResult>>;\n create(request: CreateRequestOptions & { stream?: false | undefined }): Promise<ProgressResponse>;\n create(\n request: CreateRequestOptions,\n ): Promise<ProgressResponse | OllamaStream<ProgressResponse, ProgressStreamResult>>;\n async create(\n request: CreateRequestOptions,\n ): Promise<ProgressResponse | OllamaStream<ProgressResponse, ProgressStreamResult>> {\n if (request.stream) {\n return this.runner(\n async (http, signal) => {\n const stream = await http.requestStream<ProgressResponse>({\n path: '/api/create',\n body: { ...request, stream: true },\n signal,\n });\n return normalizeProgressStream(stream);\n },\n { ...request, singleEndpoint: true, holdUntil: (stream) => stream.finalResult },\n );\n }\n return this.runner(\n (http, signal) =>\n http.request<ProgressResponse>({\n path: '/api/create',\n body: { ...request, stream: false },\n signal,\n }),\n { ...request, singleEndpoint: true },\n );\n }\n\n delete(request: DeleteRequestOptions): Promise<StatusResponse> {\n return this.runner(\n (http, signal) =>\n http.request<StatusResponse>({\n path: '/api/delete',\n method: 'DELETE',\n body: request,\n signal,\n }),\n { ...request, singleEndpoint: true },\n );\n }\n\n copy(request: CopyRequestOptions): Promise<StatusResponse> {\n return this.runner(\n (http, signal) => http.request<StatusResponse>({ path: '/api/copy', body: request, signal }),\n { ...request, singleEndpoint: true },\n );\n }\n\n ps(): Promise<PsResponse> {\n return this.runner((http) => http.request<PsResponse>({ path: '/api/ps', method: 'GET' }), {\n singleEndpoint: true,\n });\n }\n\n version(): Promise<VersionResponse> {\n return this.runner(\n (http) => http.request<VersionResponse>({ path: '/api/version', method: 'GET' }),\n { singleEndpoint: true },\n );\n }\n\n async createBlob(digest: string, data: BinaryBody): Promise<void> {\n await this.runner(\n (http, signal) =>\n http.request<void>({\n path: `/api/blobs/${encodeURIComponent(digest)}`,\n method: 'POST',\n rawBody: data,\n signal,\n }),\n { singleEndpoint: true },\n );\n }\n\n async checkBlob(digest: string): Promise<boolean> {\n try {\n await this.runner(\n (http, signal) =>\n http.request<void>({\n path: `/api/blobs/${encodeURIComponent(digest)}`,\n method: 'HEAD',\n signal,\n }),\n { singleEndpoint: true },\n );\n return true;\n } catch {\n return false;\n }\n }\n}\n","/**\n * OpenAI Compatibility interfaces and client helpers for Ollama.\n * Ollama exposes OpenAI-compatible /v1 endpoints.\n *\n * @remarks\n * This is a typed pass-through to Ollama's own OpenAI-compatible `/v1` endpoints — it\n * implements the subset of the OpenAI API surface that Ollama documents as supported\n * (https://docs.ollama.com/api/openai-compatibility), not the full OpenAI surface (hosted\n * tools like web/file search, computer use, code interpreter, or stateful server-side\n * conversation state). Notably, `tools` is supported by Ollama's compat layer but\n * `tool_choice` and `parallel_tool_calls` are not — both are still typed on\n * {@link OpenAIChatCompletionRequest} (accepted-but-ignored) so consumers passing a\n * standard OpenAI request object don't get spurious type errors; see the `@remarks` on\n * each field. `/v1/responses` is supported non-statefully — see\n * {@link OpenAIResponsesRequest}.\n */\n\nimport type { 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 OLLAMA_CLOUD_BASE_URL,\n resolveApiKey,\n resolveBaseUrl,\n resolveCredentialEndpoints,\n type OllamaClientConfig,\n} from './config.js';\nimport { OllamaClientError, OllamaModelRoutingError, 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 RequestCancellationOptions,\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 * API key for Ollama's hosted web tools (`webSearch`/`webFetch`), which always target\n * `OLLAMA_CLOUD_BASE_URL` regardless of `config.endpoints` — an Ollama account API key\n * is inherently a single global credential, not tied to any one inference endpoint.\n * Resolved the same way as a single-endpoint `apiKey` (`config.apiKey` falling back to\n * `OLLAMA_API_KEY`), independent of whether `config.endpoints` was used instead.\n */\n private readonly cloudApiKey: string | undefined;\n\n constructor(config: OllamaClientConfig = {}) {\n const resolvedApiKey = resolveApiKey(config.apiKey);\n this.cloudApiKey = resolvedApiKey;\n const credentialEndpoints = resolveCredentialEndpoints(config);\n const endpoints =\n config.endpoints ??\n (credentialEndpoints.length > 0\n ? []\n : [\n {\n name: 'default',\n baseUrl: resolveBaseUrl(config.baseUrl),\n ...(resolvedApiKey !== undefined ? { apiKey: resolvedApiKey } : {}),\n ...(config.headers !== undefined ? { headers: config.headers } : {}),\n },\n ]);\n this.registry = new EndpointRegistry([...endpoints, ...credentialEndpoints], 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 * The model this request targets, used to filter candidates by\n * `OllamaEndpoint.models` (credential-scoped routing — see that field's docs).\n * Requests without a `model` (e.g. `listModels`) consider every configured\n * endpoint, same as before this option existed.\n */\n model?: string | undefined;\n /**\n * For an operation whose real completion outlasts its own returned promise — a\n * streaming response, specifically — defers releasing the endpoint's concurrency\n * slot (see `EndpointRegistryOptions.maxConcurrentPerEndpoint`/`'least-connections'`)\n * until the promise this returns settles, instead of releasing as soon as\n * `operation` resolves. Pass `(stream) => stream.finalResult` for `chatStream`/\n * `generateStream` so the slot stays held for as long as the underlying HTTP\n * connection realistically does — until the stream is fully consumed, errors, or is\n * aborted. Omit for anything whose returned promise already represents the whole\n * request/response (the default, and correct for every non-streaming call).\n */\n holdUntil?: ((result: T) => Promise<unknown>) | undefined;\n },\n ): Promise<T> {\n const timeout = createTimeoutSignal(options?.timeoutMs ?? this.timeoutMs, options?.signal);\n try {\n let lastError: Error | undefined;\n\n for (;;) {\n const allCandidates = this.registry.candidates(options?.model);\n if (\n allCandidates.length === 0 &&\n options?.model !== undefined &&\n this.registry.hasModelScopedEndpoints()\n ) {\n const configured = this.registry\n .list()\n .flatMap((ep) => ep.models ?? [])\n .filter((m, i, arr) => arr.indexOf(m) === i);\n throw new OllamaModelRoutingError(\n `No configured endpoint is authorized for model \"${options.model}\". ` +\n (configured.length > 0\n ? `Endpoints are scoped to: ${configured.join(', ')}.`\n : 'No endpoint declares a `models` allow-list that includes it.') +\n ' Add or widen an `OllamaEndpoint.models` entry to route this model.',\n { model: options.model, availableModels: configured },\n );\n }\n const candidates = options?.singleEndpoint ? allCandidates.slice(0, 1) : allCandidates;\n\n const runnable = this.registry.filterWithCapacity(candidates);\n if (runnable.length === 0 && candidates.length > 0) {\n await this.registry.waitForCapacity(\n candidates.map((c) => c.name),\n timeout.signal,\n );\n continue;\n }\n\n for (const [attemptIndex, endpoint] of runnable.entries()) {\n this.logger.debug(`Executing on endpoint \"${endpoint.name}\" (${endpoint.baseUrl})`);\n const http = new HttpClient({\n baseUrl: endpoint.baseUrl,\n ...(endpoint.apiKey !== undefined ? { apiKey: endpoint.apiKey } : {}),\n ...(endpoint.headers !== undefined ? { headers: endpoint.headers } : {}),\n fetch: this.fetchImpl,\n });\n\n // Acquired synchronously, right after this endpoint was chosen from\n // `candidates()`/`filterWithCapacity()` with no `await` in between — see\n // `EndpointRegistryOptions.strategy`'s `'least-connections'` doc for why that\n // ordering is what makes it race-free.\n this.registry.acquire(endpoint.name);\n let holdPromise: Promise<unknown> | undefined;\n try {\n const result = await withSpan(\n 'ollama.endpoint.attempt',\n {\n [ATTR_OLLAMA_ENDPOINT_NAME]: endpoint.name,\n [ATTR_OLLAMA_ENDPOINT_ATTEMPT]: attemptIndex,\n },\n () => withRetry(() => operation(http, timeout.signal), this.retryConfig),\n );\n this.registry.reportSuccess(endpoint.name);\n if (options?.holdUntil) holdPromise = options.holdUntil(result);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n lastError = error;\n this.registry.reportFailure(endpoint.name);\n this.logger.warn(`Failed on \"${endpoint.name}\": ${error.message}`);\n if (!(error instanceof OllamaClientError && this.failoverCodes.has(error.code)))\n throw error;\n } finally {\n if (holdPromise) {\n void holdPromise\n .catch(() => undefined)\n .finally(() => this.registry.release(endpoint.name));\n } else {\n this.registry.release(endpoint.name);\n }\n }\n }\n throw lastError ?? new Error('No healthy Ollama endpoints available');\n }\n } finally {\n 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(\n async (http, signal) => {\n if (req.format !== undefined)\n this.assertStructuredOutputSupported(http.baseUrl, req.model);\n const stream = await http.requestStream<ChatResponse>({\n path: '/api/chat',\n body: { ...req, messages, stream: true },\n signal,\n });\n return normalizeChatStream(stream);\n },\n {\n signal: req.signal,\n timeoutMs: req.timeoutMs,\n model: req.model,\n // The endpoint's concurrency slot must stay held for as long as the stream is\n // actually being consumed, not just until the initial response/headers arrive\n // — see `executeWithFailover`'s `holdUntil` doc.\n holdUntil: (stream) => stream.finalResult,\n },\n );\n }\n return withSpan(\n `chat ${req.model}`,\n {\n [ATTR_GEN_AI_SYSTEM]: GEN_AI_SYSTEM_OLLAMA,\n [ATTR_GEN_AI_OPERATION_NAME]: 'chat',\n [ATTR_GEN_AI_REQUEST_MODEL]: req.model,\n },\n async (span) => {\n const rawRes = await this.executeWithFailover((http, signal) => {\n if (req.format !== undefined)\n this.assertStructuredOutputSupported(http.baseUrl, req.model);\n return http.request<ChatResponse>({\n path: '/api/chat',\n body: { ...req, messages, stream: false },\n signal,\n });\n }, req);\n const toolCalls = ensureToolCallIds(rawRes.message.tool_calls);\n const res: ChatResponse =\n toolCalls === rawRes.message.tool_calls\n ? rawRes\n : { ...rawRes, message: { ...rawRes.message, tool_calls: toolCalls } };\n span?.setAttributes({\n [ATTR_GEN_AI_RESPONSE_MODEL]: res.model,\n ...(res.prompt_eval_count !== undefined\n ? { [ATTR_GEN_AI_USAGE_INPUT_TOKENS]: res.prompt_eval_count }\n : {}),\n ...(res.eval_count !== undefined\n ? { [ATTR_GEN_AI_USAGE_OUTPUT_TOKENS]: res.eval_count }\n : {}),\n });\n return res;\n },\n );\n }\n\n chatStream(\n req: Omit<ChatRequestOptions, 'stream'>,\n ): Promise<OllamaStream<ChatResponse, ChatStreamResult>> {\n return this.chat({ ...req, stream: true });\n }\n\n async chatText(req: Omit<ChatRequestOptions, 'stream'>): Promise<string> {\n const res = await this.chat({ ...req, stream: false });\n return res.message.content;\n }\n\n async chatWithSchema<T>(\n req: Omit<ChatRequestOptions, 'stream' | 'format'>,\n schema: z.ZodType<T>,\n ): Promise<T> {\n const res = await this.chat({ ...req, format: zodToJsonSchema(schema), stream: false });\n return parseStructuredOutput(res.message.content, schema);\n }\n\n // --- Generate ---\n generate(\n req: GenerateRequestOptions & { stream: true },\n ): Promise<OllamaStream<GenerateResponse, GenerateStreamResult>>;\n generate(req: GenerateRequestOptions & { stream?: false | undefined }): Promise<GenerateResponse>;\n generate(\n req: GenerateRequestOptions,\n ): Promise<GenerateResponse | OllamaStream<GenerateResponse, GenerateStreamResult>>;\n async generate(\n req: GenerateRequestOptions,\n ): Promise<GenerateResponse | OllamaStream<GenerateResponse, GenerateStreamResult>> {\n const encodedReq = await withEncodedImages(req);\n if (encodedReq.stream) {\n return this.executeWithFailover(\n async (http, signal) => {\n if (encodedReq.format !== undefined)\n this.assertStructuredOutputSupported(http.baseUrl, encodedReq.model);\n const stream = await http.requestStream<GenerateResponse>({\n path: '/api/generate',\n body: { ...encodedReq, stream: true },\n signal,\n });\n return normalizeGenerateStream(stream);\n },\n {\n signal: encodedReq.signal,\n timeoutMs: encodedReq.timeoutMs,\n model: encodedReq.model,\n holdUntil: (stream) => stream.finalResult,\n },\n );\n }\n return withSpan(\n `text_completion ${encodedReq.model}`,\n {\n [ATTR_GEN_AI_SYSTEM]: GEN_AI_SYSTEM_OLLAMA,\n [ATTR_GEN_AI_OPERATION_NAME]: 'text_completion',\n [ATTR_GEN_AI_REQUEST_MODEL]: encodedReq.model,\n },\n async (span) => {\n const res = await this.executeWithFailover((http, signal) => {\n if (encodedReq.format !== undefined)\n this.assertStructuredOutputSupported(http.baseUrl, encodedReq.model);\n return http.request<GenerateResponse>({\n path: '/api/generate',\n body: { ...encodedReq, stream: false },\n signal,\n });\n }, encodedReq);\n span?.setAttributes({\n [ATTR_GEN_AI_RESPONSE_MODEL]: res.model,\n ...(res.prompt_eval_count !== undefined\n ? { [ATTR_GEN_AI_USAGE_INPUT_TOKENS]: res.prompt_eval_count }\n : {}),\n ...(res.eval_count !== undefined\n ? { [ATTR_GEN_AI_USAGE_OUTPUT_TOKENS]: res.eval_count }\n : {}),\n });\n return res;\n },\n );\n }\n\n generateStream(\n req: Omit<GenerateRequestOptions, 'stream'>,\n ): Promise<OllamaStream<GenerateResponse, GenerateStreamResult>> {\n return this.generate({ ...req, stream: true });\n }\n\n async generateText(req: Omit<GenerateRequestOptions, 'stream'>): Promise<string> {\n const res = await this.generate({ ...req, stream: false });\n return res.response;\n }\n\n async generateWithSchema<T>(\n req: Omit<GenerateRequestOptions, 'stream' | 'format'>,\n schema: z.ZodType<T>,\n ): Promise<T> {\n const res = await this.generate({ ...req, format: zodToJsonSchema(schema), stream: false });\n return parseStructuredOutput(res.response, schema);\n }\n\n // --- Embeddings ---\n embed(req: EmbedRequestOptions): Promise<EmbedResponse> {\n return this.executeWithFailover(\n (http, signal) => http.request<EmbedResponse>({ path: '/api/embed', body: req, signal }),\n req,\n );\n }\n\n async embedText(\n model: string,\n input: string | readonly string[],\n ): Promise<readonly (readonly number[])[]> {\n const res = await this.embed({ model, input });\n return res.embeddings;\n }\n\n /**\n * @deprecated Ollama's `/api/embeddings` endpoint has been superseded by `/api/embed`\n * (exposed here as {@link OllamaClient.embed}), which additionally supports batch\n * input. Kept for compatibility with existing callers; new code should use `embed`.\n */\n embeddings(req: EmbeddingsRequestOptions): Promise<EmbeddingsResponse> {\n return this.executeWithFailover(\n (http, signal) =>\n http.request<EmbeddingsResponse>({ path: '/api/embeddings', body: req, signal }),\n req,\n );\n }\n\n // --- Model Operations (Delegated to ModelsClient) ---\n readonly listModels = () => this.models.list();\n readonly showModel = (req: ShowRequestOptions) => this.models.show(req);\n readonly pullModel = (r: PullRequestOptions) => this.models.pull(r);\n readonly pushModel = (r: PushRequestOptions) => this.models.push(r);\n readonly createModel = (r: CreateRequestOptions) => this.models.create(r);\n readonly deleteModel = (req: DeleteRequestOptions) => this.models.delete(req);\n readonly copyModel = (req: CopyRequestOptions) => this.models.copy(req);\n readonly ps = () => this.models.ps();\n readonly version = () => this.models.version();\n readonly createBlob = (digest: string, data: BinaryBody) => this.models.createBlob(digest, data);\n readonly checkBlob = (digest: string) => this.models.checkBlob(digest);\n\n // --- Web Endpoints ---\n /**\n * Ollama's hosted web search tool (`POST https://ollama.com/api/web_search`) — a fixed\n * Ollama Cloud service, unrelated to `config.endpoints`/`baseUrl` and not proxied\n * through a local server. Requires an Ollama account API key: pass `apiKey` to the\n * client constructor or set `OLLAMA_API_KEY`. Applies the same default `timeoutMs` and\n * retry policy as inference calls, but never cross-endpoint-fails-over — there is only\n * ever the one cloud endpoint to call.\n */\n async webSearch(req: WebSearchRequestOptions): Promise<WebSearchResponse> {\n const { count, max_results, ...rest } = req;\n const res = await this.executeCloudRequest(\n (http, signal) =>\n http.request<WebSearchResponse>({\n path: '/api/web_search',\n body: { ...rest, max_results: max_results ?? count },\n signal,\n }),\n req,\n );\n // `snippet` is a deprecated mirror of `content`, kept for backward compatibility —\n // see the `@deprecated` note on `WebSearchResult.snippet`.\n return { results: res.results.map((r) => ({ ...r, snippet: r.content })) };\n }\n /**\n * Ollama's hosted web fetch tool (`POST https://ollama.com/api/web_fetch`) — see\n * {@link OllamaClient.webSearch} for the cloud-endpoint/auth/timeout/retry behavior,\n * which applies identically here.\n */\n webFetch(req: WebFetchRequestOptions): Promise<WebFetchResponse> {\n return this.executeCloudRequest(\n (http, signal) =>\n http.request<WebFetchResponse>({ path: '/api/web_fetch', body: req, signal }),\n req,\n );\n }\n /**\n * Runs `operation` against the fixed Ollama Cloud host with this client's default\n * timeout and retry policy — the same primitives `executeWithFailover` uses, minus the\n * multi-candidate loop, since `webSearch`/`webFetch` only ever have the one endpoint.\n */\n private async executeCloudRequest<T>(\n operation: (http: HttpClient, signal: AbortSignal) => Promise<T>,\n options: RequestCancellationOptions,\n ): Promise<T> {\n const timeout = createTimeoutSignal(options.timeoutMs ?? this.timeoutMs, options.signal);\n try {\n const http = new HttpClient({\n baseUrl: OLLAMA_CLOUD_BASE_URL,\n apiKey: this.cloudApiKey,\n fetch: this.fetchImpl,\n });\n return await withRetry(() => operation(http, timeout.signal), this.retryConfig);\n } finally {\n timeout.cancel();\n }\n }\n\n // --- Capabilities & Health ---\n capabilities(model: string): Promise<ModelCapabilities> {\n return this.executeWithFailover((http) => detectModelCapabilities(http, model), {\n singleEndpoint: true,\n model,\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 * Client-side usage budgeting.\n *\n * Ollama Cloud does not expose account-level quota or remaining-budget through the API —\n * chat/generate responses carry only per-request token counts, and there is no header or\n * endpoint that reports how much of your plan's session or weekly limit is left (the only\n * way to see that today is the https://ollama.com dashboard or the 90%-usage email). See\n * https://github.com/ollama/ollama/issues/15663.\n *\n * `QuotaManager` does not — and cannot — read Ollama's real limits. It tracks usage you\n * record against budgets *you* configure over one or more rolling windows, and refuses to\n * proceed once a window's budget is spent. Pair it with `OllamaRateLimitError` (thrown by\n * `OllamaClient` on the server's actual 429) as the authoritative signal; treat\n * `QuotaManager` as a local safety net that fails fast before the request is even sent.\n */\n\nimport { OllamaQuotaExceededError } from './errors.js';\nimport { extractUsage, type RawUsageSource, type TokenUsage } from './usage.js';\n\nexport interface QuotaWindowConfig {\n /** Identifies this window in status reports and thrown errors (e.g. \"session\", \"weekly\"). */\n readonly id: string;\n /** Length of the rolling window in milliseconds, after which usage resets to zero. */\n readonly windowMs: number;\n /** Token budget for the window. Omit to only track requests. */\n readonly maxTokens?: number;\n /** Request-count budget for the window. Omit to only track tokens. */\n readonly maxRequests?: number;\n}\n\nexport interface QuotaWindowStatus extends QuotaWindowConfig {\n readonly tokensUsed: number;\n readonly requestsMade: number;\n readonly windowStartedAt: number;\n readonly windowResetAt: number;\n readonly remainingTokens?: number;\n readonly remainingRequests?: number;\n}\n\nexport interface QuotaManagerOptions {\n readonly windows: readonly QuotaWindowConfig[];\n /** Clock override for testing. Defaults to `Date.now`. */\n readonly now?: () => number;\n}\n\ninterface WindowState {\n readonly config: QuotaWindowConfig;\n tokensUsed: number;\n requestsMade: number;\n windowStartedAt: number;\n}\n\nexport class QuotaManager {\n private readonly now: () => number;\n private readonly windows: readonly WindowState[];\n\n constructor(options: QuotaManagerOptions) {\n if (options.windows.length === 0) {\n throw new Error('QuotaManager requires at least one window configuration.');\n }\n this.now = options.now ?? Date.now;\n this.windows = options.windows.map((config) => ({\n config,\n tokensUsed: 0,\n requestsMade: 0,\n windowStartedAt: this.now(),\n }));\n }\n\n private rollover(state: WindowState): void {\n if (this.now() - state.windowStartedAt >= state.config.windowMs) {\n state.tokensUsed = 0;\n state.requestsMade = 0;\n state.windowStartedAt = this.now();\n }\n }\n\n /** Current usage, budgets, and reset time for every configured window. */\n status(): readonly QuotaWindowStatus[] {\n return this.windows.map((state) => {\n this.rollover(state);\n const { config } = state;\n return {\n ...config,\n tokensUsed: state.tokensUsed,\n requestsMade: state.requestsMade,\n windowStartedAt: state.windowStartedAt,\n windowResetAt: state.windowStartedAt + config.windowMs,\n ...(config.maxTokens !== undefined\n ? { remainingTokens: Math.max(0, config.maxTokens - state.tokensUsed) }\n : {}),\n ...(config.maxRequests !== undefined\n ? { remainingRequests: Math.max(0, config.maxRequests - state.requestsMade) }\n : {}),\n };\n });\n }\n\n /**\n * True if one more request — optionally estimated at `estimatedTokens` — would stay\n * within every configured window's budget. Read-only; does not record usage.\n */\n canProceed(estimatedTokens = 0): boolean {\n return this.windows.every((state) => {\n this.rollover(state);\n const { config } = state;\n if (config.maxRequests !== undefined && state.requestsMade + 1 > config.maxRequests) {\n return false;\n }\n return !(\n config.maxTokens !== undefined && state.tokensUsed + estimatedTokens > config.maxTokens\n );\n });\n }\n\n /**\n * Throws `OllamaQuotaExceededError` for the first window that `canProceed(estimatedTokens)`\n * would fail on; otherwise a no-op. Call before issuing a request.\n */\n assertCanProceed(estimatedTokens = 0): void {\n for (const state of this.windows) {\n this.rollover(state);\n const { config } = state;\n if (config.maxRequests !== undefined && state.requestsMade + 1 > config.maxRequests) {\n throw new OllamaQuotaExceededError(\n `Client-side quota window \"${config.id}\" would exceed its request budget ` +\n `(${state.requestsMade}/${config.maxRequests} requests used).`,\n { windowId: config.id, resetAt: state.windowStartedAt + config.windowMs },\n );\n }\n if (config.maxTokens !== undefined && state.tokensUsed + estimatedTokens > config.maxTokens) {\n throw new OllamaQuotaExceededError(\n `Client-side quota window \"${config.id}\" would exceed its token budget ` +\n `(${state.tokensUsed}/${config.maxTokens} tokens used).`,\n { windowId: config.id, resetAt: state.windowStartedAt + config.windowMs },\n );\n }\n }\n }\n\n /** Records one request's actual usage — a raw API response or a pre-normalized `TokenUsage` — against every window. */\n recordUsage(usage: RawUsageSource | TokenUsage): void {\n const normalized: TokenUsage = 'totalTokens' in usage ? usage : extractUsage(usage);\n for (const state of this.windows) {\n this.rollover(state);\n state.tokensUsed += normalized.totalTokens;\n state.requestsMade += 1;\n }\n }\n\n /** Resets one window (by `id`) or, if omitted, all windows — zeroing usage and restarting their clocks. */\n reset(windowId?: string): void {\n for (const state of this.windows) {\n if (windowId === undefined || state.config.id === windowId) {\n state.tokensUsed = 0;\n state.requestsMade = 0;\n state.windowStartedAt = this.now();\n }\n }\n }\n}\n\nexport interface OllamaCloudFreeTierQuotaBudgets {\n /** Budget for the free tier's ~5-hour session window. Omit to skip tracking it. */\n readonly session?: { readonly maxTokens?: number; readonly maxRequests?: number };\n /** Budget for the free tier's 7-day weekly window. Omit to skip tracking it. */\n readonly weekly?: { readonly maxTokens?: number; readonly maxRequests?: number };\n readonly now?: () => number;\n}\n\n/**\n * Convenience factory mirroring Ollama Cloud free-tier's documented reset cadence — a\n * session window that resets every 5 hours and a weekly window that resets every 7 days\n * (see https://ollama.com/pricing). Ollama does not publish the actual token/request\n * ceilings for either window, so you must supply the budgets yourself (e.g. from your own\n * observed usage) — this only wires up the window durations.\n */\nexport function createOllamaCloudFreeTierQuota(\n budgets: OllamaCloudFreeTierQuotaBudgets,\n): QuotaManager {\n const windows: QuotaWindowConfig[] = [];\n if (budgets.session !== undefined) {\n windows.push({ id: 'session', windowMs: 5 * 60 * 60 * 1000, ...budgets.session });\n }\n if (budgets.weekly !== undefined) {\n windows.push({ id: 'weekly', windowMs: 7 * 24 * 60 * 60 * 1000, ...budgets.weekly });\n }\n if (windows.length === 0) {\n throw new Error(\n 'createOllamaCloudFreeTierQuota requires at least a `session` or `weekly` budget.',\n );\n }\n return new QuotaManager({ windows, ...(budgets.now !== undefined ? { now: budgets.now } : {}) });\n}\n","/**\n * Type-safe tool definition helper.\n */\n\nimport type { z } from 'zod';\nimport { zodToJsonSchema } from '../schema/zod.js';\nimport type { Tool, ToolHandler } from './types.js';\nimport type { ToolProperty } from '../types.js';\n\nexport interface DefineToolOptions<TParams, TResult> {\n readonly name: string;\n readonly description: string;\n readonly schema: z.ZodType<TParams>;\n readonly execute: ToolHandler<TParams, TResult>;\n /**\n * Per-tool execution timeout in milliseconds, overriding the registry's default.\n * Pass `0` to explicitly disable timeout enforcement for this tool.\n */\n readonly timeoutMs?: number | undefined;\n}\n\n/**\n * Creates a strongly-typed Tool definition with automatic JSON Schema conversion.\n */\nexport function defineTool<TParams, TResult>(\n options: DefineToolOptions<TParams, TResult>,\n): Tool<TParams, TResult> {\n const jsonSchema = zodToJsonSchema(options.schema);\n const properties = (jsonSchema['properties'] ?? {}) as Record<string, ToolProperty>;\n const required = (jsonSchema['required'] ?? []) as string[];\n\n return {\n name: options.name,\n description: options.description,\n schema: options.schema,\n execute: options.execute,\n timeoutMs: options.timeoutMs,\n definition: {\n type: 'function',\n function: {\n name: options.name,\n description: options.description,\n parameters: {\n type: 'object',\n properties,\n ...(required.length > 0 ? { required } : {}),\n },\n },\n },\n };\n}\n","/**\n * Tool registry for managing definitions and executing model tool calls.\n */\n\nimport {\n OllamaNotFoundError,\n OllamaToolTimeoutError,\n OllamaToolValidationError,\n} from '../errors.js';\nimport {\n withSpan,\n setSpanError,\n ATTR_GEN_AI_TOOL_NAME,\n ATTR_GEN_AI_TOOL_CALL_ID,\n} from '../telemetry/index.js';\nimport type { ToolCall, ToolDefinition } from '../types.js';\nimport type { AnyTool, Tool, ToolExecutionContext, ToolExecutionResult } from './types.js';\n\nexport interface ToolRegistryOptions {\n readonly tools?: readonly AnyTool[] | undefined;\n readonly onError?: ((error: Error, toolCall: ToolCall) => string) | undefined;\n /**\n * Default per-call execution timeout in milliseconds, applied to any tool that\n * doesn't declare its own `timeoutMs`. Undefined (the default) means no timeout is\n * enforced, matching prior behavior. Recommended whenever tool arguments or\n * implementations are influenced by model output you don't fully control, since an\n * unbounded tool call can otherwise stall the entire agent loop indefinitely.\n *\n * Enforcement is cooperative: it races the tool's promise against a timer and\n * reports a timeout failure, but cannot forcibly halt synchronous or non-abort-aware\n * asynchronous work already in flight on the same thread. Tools that perform I/O\n * should honor `ToolExecutionContext.signal` to stop promptly on timeout.\n */\n readonly timeoutMs?: number | undefined;\n /**\n * Maximum number of tool calls executed concurrently by `executeToolCalls`.\n * Undefined (the default) runs all calls in parallel, matching prior behavior.\n */\n readonly maxConcurrency?: number | undefined;\n /**\n * Maximum length of a tool's `outputString` before it is truncated. Guards against a\n * single tool call flooding the conversation history / model context (and process\n * memory) with unbounded output. Undefined (the default) applies no limit.\n */\n readonly maxOutputChars?: number | undefined;\n}\n\nexport class ToolRegistry {\n private readonly tools = new Map<string, AnyTool>();\n private readonly onError?: ((error: Error, toolCall: ToolCall) => string) | undefined;\n private readonly defaultTimeoutMs?: number | undefined;\n private readonly maxConcurrency?: number | undefined;\n private readonly maxOutputChars?: number | undefined;\n\n constructor(toolsOrOptions?: readonly AnyTool[] | ToolRegistryOptions | undefined) {\n if (Array.isArray(toolsOrOptions)) {\n this.registerMany(toolsOrOptions);\n } else if (toolsOrOptions !== undefined) {\n const opts = toolsOrOptions as ToolRegistryOptions;\n this.onError = opts.onError;\n this.defaultTimeoutMs = opts.timeoutMs;\n this.maxConcurrency = opts.maxConcurrency;\n this.maxOutputChars = opts.maxOutputChars;\n if (opts.tools) {\n this.registerMany(opts.tools);\n }\n }\n }\n\n register(tool: AnyTool): this {\n this.tools.set(tool.name, tool);\n return this;\n }\n\n registerMany(tools: readonly AnyTool[]): this {\n for (const tool of tools) {\n this.register(tool);\n }\n return this;\n }\n\n get(name: string): AnyTool | undefined {\n return this.tools.get(name);\n }\n\n definitions(): ToolDefinition[] {\n return Array.from(this.tools.values()).map((t) => t.definition);\n }\n\n async executeToolCall(\n toolCall: ToolCall,\n ctx: ToolExecutionContext = {},\n ): Promise<ToolExecutionResult> {\n const { name } = toolCall.function;\n return withSpan(\n `execute_tool ${name}`,\n { [ATTR_GEN_AI_TOOL_NAME]: name, [ATTR_GEN_AI_TOOL_CALL_ID]: toolCall.id },\n async (span) => {\n const result = await this.executeToolCallUninstrumented(toolCall, ctx);\n if (!result.success) {\n await setSpanError(span, result.error);\n }\n return result;\n },\n );\n }\n\n private async executeToolCallUninstrumented(\n toolCall: ToolCall,\n ctx: ToolExecutionContext,\n ): Promise<ToolExecutionResult> {\n const { name, arguments: args } = toolCall.function;\n const tool = this.tools.get(name);\n\n if (!tool) {\n const err = new OllamaNotFoundError(`Tool \"${name}\" is not registered in this registry`);\n return this.handleExecutionError(err, toolCall);\n }\n\n const parseResult = tool.schema.safeParse(args);\n if (!parseResult.success) {\n const err = new OllamaToolValidationError(`Tool \"${name}\" arguments validation failed`, {\n toolName: name,\n issues: parseResult.error.issues,\n cause: parseResult.error,\n });\n return this.handleExecutionError(err, toolCall);\n }\n\n try {\n const result = await this.runWithTimeout(tool, parseResult.data, ctx, name);\n const outputString = this.truncateOutput(\n typeof result === 'string' ? result : JSON.stringify(result),\n );\n return {\n toolName: name,\n toolCallId: toolCall.id,\n success: true,\n result,\n outputString,\n };\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n return this.handleExecutionError(error, toolCall);\n }\n }\n\n /**\n * Executes every call in `toolCalls` and returns results in the same order, so results\n * are always correlatable by array position regardless of `id`. Each result also echoes\n * its call's `toolCallId` for callers who'd rather match by ID — see the {@link ToolCall}\n * docs for how that id is produced. Runs fully in parallel (`Promise.all`) unless\n * `maxConcurrency` was configured, in which case a bounded worker pool is used instead.\n */\n async executeToolCalls(\n toolCalls: readonly ToolCall[],\n ctx: ToolExecutionContext = {},\n ): Promise<ToolExecutionResult[]> {\n const limit = this.maxConcurrency;\n if (!limit || limit >= toolCalls.length) {\n return Promise.all(toolCalls.map((tc) => this.executeToolCall(tc, ctx)));\n }\n\n const results = new Array<ToolExecutionResult>(toolCalls.length);\n let nextIndex = 0;\n const worker = async (): Promise<void> => {\n for (let i = nextIndex++; i < toolCalls.length; i = nextIndex++) {\n results[i] = await this.executeToolCall(toolCalls[i] as ToolCall, ctx);\n }\n };\n await Promise.all(Array.from({ length: limit }, () => worker()));\n return results;\n }\n\n private async runWithTimeout<TParams>(\n tool: Tool<TParams, unknown>,\n params: TParams,\n ctx: ToolExecutionContext,\n toolName: string,\n ): Promise<unknown> {\n const timeoutMs = tool.timeoutMs ?? this.defaultTimeoutMs;\n if (!timeoutMs || timeoutMs <= 0) {\n return tool.execute(params, ctx);\n }\n\n const controller = new AbortController();\n const onParentAbort = (): void => controller.abort(ctx.signal?.reason);\n if (ctx.signal) {\n if (ctx.signal.aborted) {\n controller.abort(ctx.signal.reason);\n } else {\n ctx.signal.addEventListener('abort', onParentAbort, { once: true });\n }\n }\n\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, timeoutMs);\n\n try {\n const executePromise = Promise.resolve(\n tool.execute(params, { ...ctx, signal: controller.signal }),\n );\n // Prevent an unhandled rejection if the tool's promise loses the race and later\n // rejects; the tool remains responsible for actually stopping its own work via\n // `signal` since JS cannot forcibly cancel work already in flight.\n executePromise.catch(() => undefined);\n\n const abortRejection = (): Error =>\n timedOut\n ? new OllamaToolTimeoutError(`Tool \"${toolName}\" timed out after ${timeoutMs}ms`, {\n toolName,\n timeoutMs,\n })\n : ((ctx.signal?.reason as Error | undefined) ?? new Error('Tool execution aborted'));\n\n return await Promise.race([\n executePromise,\n controller.signal.aborted\n ? Promise.reject(abortRejection())\n : new Promise<never>((_resolve, reject) => {\n controller.signal.addEventListener('abort', () => reject(abortRejection()), {\n once: true,\n });\n }),\n ]);\n } finally {\n clearTimeout(timer);\n if (ctx.signal) {\n ctx.signal.removeEventListener('abort', onParentAbort);\n }\n }\n }\n\n private truncateOutput(output: string): string {\n const limit = this.maxOutputChars;\n if (!limit || output.length <= limit) {\n return output;\n }\n return `${output.slice(0, limit)}\\n… [truncated ${output.length - limit} of ${output.length} chars]`;\n }\n\n private handleExecutionError(error: Error, toolCall: ToolCall): ToolExecutionResult {\n const fallbackMessage = this.onError ? this.onError(error, toolCall) : error.message;\n return {\n toolName: toolCall.function.name,\n toolCallId: toolCall.id,\n success: false,\n error,\n outputString: this.truncateOutput(fallbackMessage),\n };\n }\n}\n","/**\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"]}
|