@reactive-agents/llm-provider 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +19 -0
- package/dist/index.js +48 -14
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -161,6 +161,10 @@ type LLMMessage = {
|
|
|
161
161
|
} | {
|
|
162
162
|
readonly role: "assistant";
|
|
163
163
|
readonly content: string | readonly ContentBlock[];
|
|
164
|
+
} | {
|
|
165
|
+
readonly role: "tool";
|
|
166
|
+
readonly toolCallId: string;
|
|
167
|
+
readonly content: string;
|
|
164
168
|
};
|
|
165
169
|
declare const TokenUsageSchema: Schema.Struct<{
|
|
166
170
|
inputTokens: typeof Schema.Number;
|
|
@@ -235,6 +239,7 @@ type StructuredCompletionRequest<A> = CompletionRequest & {
|
|
|
235
239
|
readonly maxParseRetries?: number;
|
|
236
240
|
};
|
|
237
241
|
type TruncationStrategy = "drop-oldest" | "summarize-middle" | "sliding-window" | "importance-based";
|
|
242
|
+
type ObservabilityVerbosity = "metadata" | "full";
|
|
238
243
|
|
|
239
244
|
declare const LLMError_base: new <A extends Record<string, any> = {}>(args: effect_Types.Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => effect_Cause.YieldableError & {
|
|
240
245
|
readonly _tag: "LLMError";
|
|
@@ -366,6 +371,13 @@ declare const LLMConfig_base: Context.TagClass<LLMConfig, "LLMConfig", {
|
|
|
366
371
|
readonly timeoutMs: number;
|
|
367
372
|
readonly defaultMaxTokens: number;
|
|
368
373
|
readonly defaultTemperature: number;
|
|
374
|
+
/**
|
|
375
|
+
* LLM request/response observability verbosity.
|
|
376
|
+
* "full" captures the complete request and response payloads.
|
|
377
|
+
* "metadata" captures only timing/token counts (cheaper for production).
|
|
378
|
+
* Default: "full" — always capture everything during development.
|
|
379
|
+
*/
|
|
380
|
+
readonly observabilityVerbosity: ObservabilityVerbosity;
|
|
369
381
|
}>;
|
|
370
382
|
/**
|
|
371
383
|
* LLM configuration — provided via environment or config file.
|
|
@@ -399,6 +411,13 @@ declare const llmConfigFromEnv: {
|
|
|
399
411
|
readonly timeoutMs: number;
|
|
400
412
|
readonly defaultMaxTokens: number;
|
|
401
413
|
readonly defaultTemperature: number;
|
|
414
|
+
/**
|
|
415
|
+
* LLM request/response observability verbosity.
|
|
416
|
+
* "full" captures the complete request and response payloads.
|
|
417
|
+
* "metadata" captures only timing/token counts (cheaper for production).
|
|
418
|
+
* Default: "full" — always capture everything during development.
|
|
419
|
+
*/
|
|
420
|
+
readonly observabilityVerbosity: ObservabilityVerbosity;
|
|
402
421
|
};
|
|
403
422
|
/**
|
|
404
423
|
* Build LLMConfig from environment variables.
|
package/dist/index.js
CHANGED
|
@@ -1324,7 +1324,8 @@ var llmConfigFromEnv = LLMConfig.of({
|
|
|
1324
1324
|
maxRetries: Number(process.env.LLM_MAX_RETRIES ?? 3),
|
|
1325
1325
|
timeoutMs: Number(process.env.LLM_TIMEOUT_MS ?? 3e4),
|
|
1326
1326
|
defaultMaxTokens: 4096,
|
|
1327
|
-
defaultTemperature: Number(process.env.LLM_DEFAULT_TEMPERATURE ?? 0.7)
|
|
1327
|
+
defaultTemperature: Number(process.env.LLM_DEFAULT_TEMPERATURE ?? 0.7),
|
|
1328
|
+
observabilityVerbosity: process.env.LLM_OBSERVABILITY_VERBOSITY ?? "full"
|
|
1328
1329
|
});
|
|
1329
1330
|
var LLMConfigFromEnv = Layer.succeed(LLMConfig, llmConfigFromEnv);
|
|
1330
1331
|
|
|
@@ -1481,12 +1482,24 @@ var retryPolicy = Schedule.intersect(
|
|
|
1481
1482
|
);
|
|
1482
1483
|
|
|
1483
1484
|
// src/providers/anthropic.ts
|
|
1484
|
-
var toAnthropicMessages = (messages) => messages.filter((m) => m.role !== "system").map((m) =>
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1485
|
+
var toAnthropicMessages = (messages) => messages.filter((m) => m.role !== "system").map((m) => {
|
|
1486
|
+
if (m.role === "tool") {
|
|
1487
|
+
return {
|
|
1488
|
+
role: "user",
|
|
1489
|
+
content: [{
|
|
1490
|
+
type: "tool_result",
|
|
1491
|
+
tool_use_id: m.toolCallId,
|
|
1492
|
+
content: m.content
|
|
1493
|
+
}]
|
|
1494
|
+
};
|
|
1495
|
+
}
|
|
1496
|
+
return {
|
|
1497
|
+
role: m.role,
|
|
1498
|
+
content: typeof m.content === "string" ? m.content : m.content.map(
|
|
1499
|
+
(b) => b
|
|
1500
|
+
)
|
|
1501
|
+
};
|
|
1502
|
+
});
|
|
1490
1503
|
var toAnthropicTool = (tool) => ({
|
|
1491
1504
|
name: tool.name,
|
|
1492
1505
|
description: tool.description,
|
|
@@ -1761,12 +1774,21 @@ var mapAnthropicResponse = (response, model) => {
|
|
|
1761
1774
|
|
|
1762
1775
|
// src/providers/openai.ts
|
|
1763
1776
|
import { Effect as Effect5, Layer as Layer4, Stream as Stream2, Schema as Schema3 } from "effect";
|
|
1764
|
-
var toOpenAIMessages = (messages) => messages.map((m) =>
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1777
|
+
var toOpenAIMessages = (messages) => messages.map((m) => {
|
|
1778
|
+
if (m.role === "tool") {
|
|
1779
|
+
return {
|
|
1780
|
+
role: "tool",
|
|
1781
|
+
tool_call_id: m.toolCallId,
|
|
1782
|
+
content: m.content
|
|
1783
|
+
};
|
|
1784
|
+
}
|
|
1785
|
+
return {
|
|
1786
|
+
role: m.role,
|
|
1787
|
+
content: typeof m.content === "string" ? m.content : m.content.filter(
|
|
1788
|
+
(b) => b.type === "text"
|
|
1789
|
+
).map((b) => b.text).join("")
|
|
1790
|
+
};
|
|
1791
|
+
});
|
|
1770
1792
|
var toEffectError2 = (error, provider) => {
|
|
1771
1793
|
const err = error;
|
|
1772
1794
|
if (err.status === 429) {
|
|
@@ -2046,7 +2068,7 @@ var mapOpenAIResponse = (response, model) => {
|
|
|
2046
2068
|
|
|
2047
2069
|
// src/providers/local.ts
|
|
2048
2070
|
import { Effect as Effect6, Layer as Layer5, Stream as Stream3, Schema as Schema4 } from "effect";
|
|
2049
|
-
var toOllamaMessages = (messages) => messages.map((m) => ({
|
|
2071
|
+
var toOllamaMessages = (messages) => messages.filter((m) => m.role !== "tool").map((m) => ({
|
|
2050
2072
|
role: m.role,
|
|
2051
2073
|
content: typeof m.content === "string" ? m.content : m.content.filter(
|
|
2052
2074
|
(b) => b.type === "text"
|
|
@@ -2325,6 +2347,18 @@ var toGeminiContents = (messages) => {
|
|
|
2325
2347
|
const result = [];
|
|
2326
2348
|
for (const msg of messages) {
|
|
2327
2349
|
if (msg.role === "system") continue;
|
|
2350
|
+
if (msg.role === "tool") {
|
|
2351
|
+
result.push({
|
|
2352
|
+
role: "user",
|
|
2353
|
+
parts: [{
|
|
2354
|
+
functionResponse: {
|
|
2355
|
+
name: "tool",
|
|
2356
|
+
response: { content: msg.content }
|
|
2357
|
+
}
|
|
2358
|
+
}]
|
|
2359
|
+
});
|
|
2360
|
+
continue;
|
|
2361
|
+
}
|
|
2328
2362
|
const role = msg.role === "assistant" ? "model" : "user";
|
|
2329
2363
|
if (typeof msg.content === "string") {
|
|
2330
2364
|
result.push({ role, parts: [{ text: msg.content }] });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/whatwg-fetch/fetch.js","../../../node_modules/ollama/dist/browser.mjs","../../../node_modules/ollama/dist/index.mjs","../src/types.ts","../src/errors.ts","../src/llm-service.ts","../src/llm-config.ts","../src/prompt-manager.ts","../src/token-counter.ts","../src/providers/anthropic.ts","../src/retry.ts","../src/providers/openai.ts","../src/providers/local.ts","../src/providers/gemini.ts","../src/testing.ts","../src/structured-output.ts","../src/runtime.ts"],"sourcesContent":["/* eslint-disable no-prototype-builtins */\nvar g =\n (typeof globalThis !== 'undefined' && globalThis) ||\n (typeof self !== 'undefined' && self) ||\n // eslint-disable-next-line no-undef\n (typeof global !== 'undefined' && global) ||\n {}\n\nvar support = {\n searchParams: 'URLSearchParams' in g,\n iterable: 'Symbol' in g && 'iterator' in Symbol,\n blob:\n 'FileReader' in g &&\n 'Blob' in g &&\n (function() {\n try {\n new Blob()\n return true\n } catch (e) {\n return false\n }\n })(),\n formData: 'FormData' in g,\n arrayBuffer: 'ArrayBuffer' in g\n}\n\nfunction isDataView(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n}\n\nif (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isArrayBufferView =\n ArrayBuffer.isView ||\n function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n}\n\nfunction normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.^_`|~!]/i.test(name) || name === '') {\n throw new TypeError('Invalid character in header field name: \"' + name + '\"')\n }\n return name.toLowerCase()\n}\n\nfunction normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n}\n\n// Build a destructive iterator for the value list\nfunction iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n}\n\nexport function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n if (header.length != 2) {\n throw new TypeError('Headers constructor: expected name/value pair to be length 2, found' + header.length)\n }\n this.append(header[0], header[1])\n }, this)\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n}\n\nHeaders.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue + ', ' + value : value\n}\n\nHeaders.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n}\n\nHeaders.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n}\n\nHeaders.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n}\n\nHeaders.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n}\n\nHeaders.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n}\n\nHeaders.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push(name)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.values = function() {\n var items = []\n this.forEach(function(value) {\n items.push(value)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push([name, value])\n })\n return iteratorFor(items)\n}\n\nif (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n}\n\nfunction consumed(body) {\n if (body._noBody) return\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n}\n\nfunction fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n}\n\nfunction readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n}\n\nfunction readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n var match = /charset=([A-Za-z0-9_-]+)/.exec(blob.type)\n var encoding = match ? match[1] : 'utf-8'\n reader.readAsText(blob, encoding)\n return promise\n}\n\nfunction readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n}\n\nfunction bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n}\n\nfunction Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n /*\n fetch-mock wraps the Response object in an ES6 Proxy to\n provide useful test harness features such as flush. However, on\n ES5 browsers without fetch or Proxy support pollyfills must be used;\n the proxy-pollyfill is unable to proxy an attribute unless it exists\n on the object before the Proxy is created. This change ensures\n Response.bodyUsed exists on the instance, while maintaining the\n semantic of setting Request.bodyUsed in the constructor before\n _initBody is called.\n */\n // eslint-disable-next-line no-self-assign\n this.bodyUsed = this.bodyUsed\n this._bodyInit = body\n if (!body) {\n this._noBody = true;\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n this._bodyText = body = Object.prototype.toString.call(body)\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n var isConsumed = consumed(this)\n if (isConsumed) {\n return isConsumed\n } else if (ArrayBuffer.isView(this._bodyArrayBuffer)) {\n return Promise.resolve(\n this._bodyArrayBuffer.buffer.slice(\n this._bodyArrayBuffer.byteOffset,\n this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength\n )\n )\n } else {\n return Promise.resolve(this._bodyArrayBuffer)\n }\n } else if (support.blob) {\n return this.blob().then(readBlobAsArrayBuffer)\n } else {\n throw new Error('could not read as ArrayBuffer')\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n}\n\n// HTTP methods whose capitalization should be normalized\nvar methods = ['CONNECT', 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'TRACE']\n\nfunction normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return methods.indexOf(upcased) > -1 ? upcased : method\n}\n\nexport function Request(input, options) {\n if (!(this instanceof Request)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n\n options = options || {}\n var body = options.body\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n this.signal = input.signal\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = String(input)\n }\n\n this.credentials = options.credentials || this.credentials || 'same-origin'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.signal = options.signal || this.signal || (function () {\n if ('AbortController' in g) {\n var ctrl = new AbortController();\n return ctrl.signal;\n }\n }());\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n\n if (this.method === 'GET' || this.method === 'HEAD') {\n if (options.cache === 'no-store' || options.cache === 'no-cache') {\n // Search for a '_' parameter in the query string\n var reParamSearch = /([?&])_=[^&]*/\n if (reParamSearch.test(this.url)) {\n // If it already exists then set the value with the current time\n this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime())\n } else {\n // Otherwise add a new '_' parameter to the end with the current time\n var reQueryString = /\\?/\n this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime()\n }\n }\n }\n}\n\nRequest.prototype.clone = function() {\n return new Request(this, {body: this._bodyInit})\n}\n\nfunction decode(body) {\n var form = new FormData()\n body\n .trim()\n .split('&')\n .forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n}\n\nfunction parseHeaders(rawHeaders) {\n var headers = new Headers()\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ')\n // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill\n // https://github.com/github/fetch/issues/748\n // https://github.com/zloirock/core-js/issues/751\n preProcessedHeaders\n .split('\\r')\n .map(function(header) {\n return header.indexOf('\\n') === 0 ? header.substr(1, header.length) : header\n })\n .forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n try {\n headers.append(key, value)\n } catch (error) {\n console.warn('Response ' + error.message)\n }\n }\n })\n return headers\n}\n\nBody.call(Request.prototype)\n\nexport function Response(bodyInit, options) {\n if (!(this instanceof Response)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = options.status === undefined ? 200 : options.status\n if (this.status < 200 || this.status > 599) {\n throw new RangeError(\"Failed to construct 'Response': The status provided (0) is outside the range [200, 599].\")\n }\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = options.statusText === undefined ? '' : '' + options.statusText\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n}\n\nBody.call(Response.prototype)\n\nResponse.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n}\n\nResponse.error = function() {\n var response = new Response(null, {status: 200, statusText: ''})\n response.ok = false\n response.status = 0\n response.type = 'error'\n return response\n}\n\nvar redirectStatuses = [301, 302, 303, 307, 308]\n\nResponse.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n}\n\nexport var DOMException = g.DOMException\ntry {\n new DOMException()\n} catch (err) {\n DOMException = function(message, name) {\n this.message = message\n this.name = name\n var error = Error(message)\n this.stack = error.stack\n }\n DOMException.prototype = Object.create(Error.prototype)\n DOMException.prototype.constructor = DOMException\n}\n\nexport function fetch(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n\n if (request.signal && request.signal.aborted) {\n return reject(new DOMException('Aborted', 'AbortError'))\n }\n\n var xhr = new XMLHttpRequest()\n\n function abortXhr() {\n xhr.abort()\n }\n\n xhr.onload = function() {\n var options = {\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n // This check if specifically for when a user fetches a file locally from the file system\n // Only if the status is out of a normal range\n if (request.url.indexOf('file://') === 0 && (xhr.status < 200 || xhr.status > 599)) {\n options.status = 200;\n } else {\n options.status = xhr.status;\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n setTimeout(function() {\n resolve(new Response(body, options))\n }, 0)\n }\n\n xhr.onerror = function() {\n setTimeout(function() {\n reject(new TypeError('Network request failed'))\n }, 0)\n }\n\n xhr.ontimeout = function() {\n setTimeout(function() {\n reject(new TypeError('Network request timed out'))\n }, 0)\n }\n\n xhr.onabort = function() {\n setTimeout(function() {\n reject(new DOMException('Aborted', 'AbortError'))\n }, 0)\n }\n\n function fixUrl(url) {\n try {\n return url === '' && g.location.href ? g.location.href : url\n } catch (e) {\n return url\n }\n }\n\n xhr.open(request.method, fixUrl(request.url), true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false\n }\n\n if ('responseType' in xhr) {\n if (support.blob) {\n xhr.responseType = 'blob'\n } else if (\n support.arrayBuffer\n ) {\n xhr.responseType = 'arraybuffer'\n }\n }\n\n if (init && typeof init.headers === 'object' && !(init.headers instanceof Headers || (g.Headers && init.headers instanceof g.Headers))) {\n var names = [];\n Object.getOwnPropertyNames(init.headers).forEach(function(name) {\n names.push(normalizeName(name))\n xhr.setRequestHeader(name, normalizeValue(init.headers[name]))\n })\n request.headers.forEach(function(value, name) {\n if (names.indexOf(name) === -1) {\n xhr.setRequestHeader(name, value)\n }\n })\n } else {\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n }\n\n if (request.signal) {\n request.signal.addEventListener('abort', abortXhr)\n\n xhr.onreadystatechange = function() {\n // DONE (success or failure)\n if (xhr.readyState === 4) {\n request.signal.removeEventListener('abort', abortXhr)\n }\n }\n }\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n}\n\nfetch.polyfill = true\n\nif (!g.fetch) {\n g.fetch = fetch\n g.Headers = Headers\n g.Request = Request\n g.Response = Response\n}\n","import 'whatwg-fetch';\n\nconst defaultPort = \"11434\";\nconst defaultHost = `http://127.0.0.1:${defaultPort}`;\n\nconst version = \"0.6.3\";\n\nvar __defProp$1 = Object.defineProperty;\nvar __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField$1 = (obj, key, value) => {\n __defNormalProp$1(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\nclass ResponseError extends Error {\n constructor(error, status_code) {\n super(error);\n this.error = error;\n this.status_code = status_code;\n this.name = \"ResponseError\";\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ResponseError);\n }\n }\n}\nclass AbortableAsyncIterator {\n constructor(abortController, itr, doneCallback) {\n __publicField$1(this, \"abortController\");\n __publicField$1(this, \"itr\");\n __publicField$1(this, \"doneCallback\");\n this.abortController = abortController;\n this.itr = itr;\n this.doneCallback = doneCallback;\n }\n abort() {\n this.abortController.abort();\n }\n async *[Symbol.asyncIterator]() {\n for await (const message of this.itr) {\n if (\"error\" in message) {\n throw new Error(message.error);\n }\n yield message;\n if (message.done || message.status === \"success\") {\n this.doneCallback();\n return;\n }\n }\n throw new Error(\"Did not receive done or success response in stream.\");\n }\n}\nconst checkOk = async (response) => {\n if (response.ok) {\n return;\n }\n let message = `Error ${response.status}: ${response.statusText}`;\n let errorData = null;\n if (response.headers.get(\"content-type\")?.includes(\"application/json\")) {\n try {\n errorData = await response.json();\n message = errorData.error || message;\n } catch (error) {\n console.log(\"Failed to parse error response as JSON\");\n }\n } else {\n try {\n console.log(\"Getting text from response\");\n const textResponse = await response.text();\n message = textResponse || message;\n } catch (error) {\n console.log(\"Failed to get text from error response\");\n }\n }\n throw new ResponseError(message, response.status);\n};\nfunction getPlatform() {\n if (typeof window !== \"undefined\" && window.navigator) {\n const nav = navigator;\n if (\"userAgentData\" in nav && nav.userAgentData?.platform) {\n return `${nav.userAgentData.platform.toLowerCase()} Browser/${navigator.userAgent};`;\n }\n if (navigator.platform) {\n return `${navigator.platform.toLowerCase()} Browser/${navigator.userAgent};`;\n }\n return `unknown Browser/${navigator.userAgent};`;\n } else if (typeof process !== \"undefined\") {\n return `${process.arch} ${process.platform} Node.js/${process.version}`;\n }\n return \"\";\n}\nfunction normalizeHeaders(headers) {\n if (headers instanceof Headers) {\n const obj = {};\n headers.forEach((value, key) => {\n obj[key] = value;\n });\n return obj;\n } else if (Array.isArray(headers)) {\n return Object.fromEntries(headers);\n } else {\n return headers || {};\n }\n}\nconst readEnvVar = (obj, key) => {\n return obj[key];\n};\nconst fetchWithHeaders = async (fetch, url, options = {}) => {\n const defaultHeaders = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"User-Agent\": `ollama-js/${version} (${getPlatform()})`\n };\n options.headers = normalizeHeaders(options.headers);\n try {\n const parsed = new URL(url);\n if (parsed.protocol === \"https:\" && parsed.hostname === \"ollama.com\") {\n const apiKey = typeof process === \"object\" && process !== null && typeof process.env === \"object\" && process.env !== null ? readEnvVar(process.env, \"OLLAMA_API_KEY\") : void 0;\n const authorization = options.headers[\"authorization\"] || options.headers[\"Authorization\"];\n if (!authorization && apiKey) {\n options.headers[\"Authorization\"] = `Bearer ${apiKey}`;\n }\n }\n } catch (error) {\n console.error(\"error parsing url\", error);\n }\n const customHeaders = Object.fromEntries(\n Object.entries(options.headers).filter(\n ([key]) => !Object.keys(defaultHeaders).some(\n (defaultKey) => defaultKey.toLowerCase() === key.toLowerCase()\n )\n )\n );\n options.headers = {\n ...defaultHeaders,\n ...customHeaders\n };\n return fetch(url, options);\n};\nconst get = async (fetch, host, options) => {\n const response = await fetchWithHeaders(fetch, host, {\n headers: options?.headers\n });\n await checkOk(response);\n return response;\n};\nconst post = async (fetch, host, data, options) => {\n const isRecord = (input) => {\n return input !== null && typeof input === \"object\" && !Array.isArray(input);\n };\n const formattedData = isRecord(data) ? JSON.stringify(data) : data;\n const response = await fetchWithHeaders(fetch, host, {\n method: \"POST\",\n body: formattedData,\n signal: options?.signal,\n headers: options?.headers\n });\n await checkOk(response);\n return response;\n};\nconst del = async (fetch, host, data, options) => {\n const response = await fetchWithHeaders(fetch, host, {\n method: \"DELETE\",\n body: JSON.stringify(data),\n headers: options?.headers\n });\n await checkOk(response);\n return response;\n};\nconst parseJSON = async function* (itr) {\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n const reader = itr.getReader();\n while (true) {\n const { done, value: chunk } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(chunk, { stream: true });\n const parts = buffer.split(\"\\n\");\n buffer = parts.pop() ?? \"\";\n for (const part of parts) {\n try {\n yield JSON.parse(part);\n } catch (error) {\n console.warn(\"invalid json: \", part);\n }\n }\n }\n buffer += decoder.decode();\n for (const part of buffer.split(\"\\n\").filter((p) => p !== \"\")) {\n try {\n yield JSON.parse(part);\n } catch (error) {\n console.warn(\"invalid json: \", part);\n }\n }\n};\nconst formatHost = (host) => {\n if (!host) {\n return defaultHost;\n }\n let isExplicitProtocol = host.includes(\"://\");\n if (host.startsWith(\":\")) {\n host = `http://127.0.0.1${host}`;\n isExplicitProtocol = true;\n }\n if (!isExplicitProtocol) {\n host = `http://${host}`;\n }\n const url = new URL(host);\n let port = url.port;\n if (!port) {\n if (!isExplicitProtocol) {\n port = defaultPort;\n } else {\n port = url.protocol === \"https:\" ? \"443\" : \"80\";\n }\n }\n let auth = \"\";\n if (url.username) {\n auth = url.username;\n if (url.password) {\n auth += `:${url.password}`;\n }\n auth += \"@\";\n }\n let formattedHost = `${url.protocol}//${auth}${url.hostname}:${port}${url.pathname}`;\n if (formattedHost.endsWith(\"/\")) {\n formattedHost = formattedHost.slice(0, -1);\n }\n return formattedHost;\n};\n\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => {\n __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\nlet Ollama$1 = class Ollama {\n constructor(config) {\n __publicField(this, \"config\");\n __publicField(this, \"fetch\");\n __publicField(this, \"ongoingStreamedRequests\", []);\n this.config = {\n host: \"\",\n headers: config?.headers\n };\n if (!config?.proxy) {\n this.config.host = formatHost(config?.host ?? defaultHost);\n }\n this.fetch = config?.fetch ?? fetch;\n }\n // Abort any ongoing streamed requests to Ollama\n abort() {\n for (const request of this.ongoingStreamedRequests) {\n request.abort();\n }\n this.ongoingStreamedRequests.length = 0;\n }\n /**\n * Processes a request to the Ollama server. If the request is streamable, it will return a\n * AbortableAsyncIterator that yields the response messages. Otherwise, it will return the response\n * object.\n * @param endpoint {string} - The endpoint to send the request to.\n * @param request {object} - The request object to send to the endpoint.\n * @protected {T | AbortableAsyncIterator<T>} - The response object or a AbortableAsyncIterator that yields\n * response messages.\n * @throws {Error} - If the response body is missing or if the response is an error.\n * @returns {Promise<T | AbortableAsyncIterator<T>>} - The response object or a AbortableAsyncIterator that yields the streamed response.\n */\n async processStreamableRequest(endpoint, request) {\n request.stream = request.stream ?? false;\n const host = `${this.config.host}/api/${endpoint}`;\n if (request.stream) {\n const abortController = new AbortController();\n const response2 = await post(this.fetch, host, request, {\n signal: abortController.signal,\n headers: this.config.headers\n });\n if (!response2.body) {\n throw new Error(\"Missing body\");\n }\n const itr = parseJSON(response2.body);\n const abortableAsyncIterator = new AbortableAsyncIterator(\n abortController,\n itr,\n () => {\n const i = this.ongoingStreamedRequests.indexOf(abortableAsyncIterator);\n if (i > -1) {\n this.ongoingStreamedRequests.splice(i, 1);\n }\n }\n );\n this.ongoingStreamedRequests.push(abortableAsyncIterator);\n return abortableAsyncIterator;\n }\n const response = await post(this.fetch, host, request, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Encodes an image to base64 if it is a Uint8Array.\n * @param image {Uint8Array | string} - The image to encode.\n * @returns {Promise<string>} - The base64 encoded image.\n */\n async encodeImage(image) {\n if (typeof image !== \"string\") {\n const uint8Array = new Uint8Array(image);\n let byteString = \"\";\n const len = uint8Array.byteLength;\n for (let i = 0; i < len; i++) {\n byteString += String.fromCharCode(uint8Array[i]);\n }\n return btoa(byteString);\n }\n return image;\n }\n /**\n * Generates a response from a text prompt.\n * @param request {GenerateRequest} - The request object.\n * @returns {Promise<GenerateResponse | AbortableAsyncIterator<GenerateResponse>>} - The response object or\n * an AbortableAsyncIterator that yields response messages.\n */\n async generate(request) {\n if (request.images) {\n request.images = await Promise.all(request.images.map(this.encodeImage.bind(this)));\n }\n return this.processStreamableRequest(\"generate\", request);\n }\n /**\n * Chats with the model. The request object can contain messages with images that are either\n * Uint8Arrays or base64 encoded strings. The images will be base64 encoded before sending the\n * request.\n * @param request {ChatRequest} - The request object.\n * @returns {Promise<ChatResponse | AbortableAsyncIterator<ChatResponse>>} - The response object or an\n * AbortableAsyncIterator that yields response messages.\n */\n async chat(request) {\n if (request.messages) {\n for (const message of request.messages) {\n if (message.images) {\n message.images = await Promise.all(\n message.images.map(this.encodeImage.bind(this))\n );\n }\n }\n }\n return this.processStreamableRequest(\"chat\", request);\n }\n /**\n * Creates a new model from a stream of data.\n * @param request {CreateRequest} - The request object.\n * @returns {Promise<ProgressResponse | AbortableAsyncIterator<ProgressResponse>>} - The response object or a stream of progress responses.\n */\n async create(request) {\n return this.processStreamableRequest(\"create\", {\n ...request\n });\n }\n /**\n * Pulls a model from the Ollama registry. The request object can contain a stream flag to indicate if the\n * response should be streamed.\n * @param request {PullRequest} - The request object.\n * @returns {Promise<ProgressResponse | AbortableAsyncIterator<ProgressResponse>>} - The response object or\n * an AbortableAsyncIterator that yields response messages.\n */\n async pull(request) {\n return this.processStreamableRequest(\"pull\", {\n name: request.model,\n stream: request.stream,\n insecure: request.insecure\n });\n }\n /**\n * Pushes a model to the Ollama registry. The request object can contain a stream flag to indicate if the\n * response should be streamed.\n * @param request {PushRequest} - The request object.\n * @returns {Promise<ProgressResponse | AbortableAsyncIterator<ProgressResponse>>} - The response object or\n * an AbortableAsyncIterator that yields response messages.\n */\n async push(request) {\n return this.processStreamableRequest(\"push\", {\n name: request.model,\n stream: request.stream,\n insecure: request.insecure\n });\n }\n /**\n * Deletes a model from the server. The request object should contain the name of the model to\n * delete.\n * @param request {DeleteRequest} - The request object.\n * @returns {Promise<StatusResponse>} - The response object.\n */\n async delete(request) {\n await del(\n this.fetch,\n `${this.config.host}/api/delete`,\n { name: request.model },\n { headers: this.config.headers }\n );\n return { status: \"success\" };\n }\n /**\n * Copies a model from one name to another. The request object should contain the name of the\n * model to copy and the new name.\n * @param request {CopyRequest} - The request object.\n * @returns {Promise<StatusResponse>} - The response object.\n */\n async copy(request) {\n await post(this.fetch, `${this.config.host}/api/copy`, { ...request }, {\n headers: this.config.headers\n });\n return { status: \"success\" };\n }\n /**\n * Lists the models on the server.\n * @returns {Promise<ListResponse>} - The response object.\n * @throws {Error} - If the response body is missing.\n */\n async list() {\n const response = await get(this.fetch, `${this.config.host}/api/tags`, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Shows the metadata of a model. The request object should contain the name of the model.\n * @param request {ShowRequest} - The request object.\n * @returns {Promise<ShowResponse>} - The response object.\n */\n async show(request) {\n const response = await post(this.fetch, `${this.config.host}/api/show`, {\n ...request\n }, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Embeds text input into vectors.\n * @param request {EmbedRequest} - The request object.\n * @returns {Promise<EmbedResponse>} - The response object.\n */\n async embed(request) {\n const response = await post(this.fetch, `${this.config.host}/api/embed`, {\n ...request\n }, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Embeds a text prompt into a vector.\n * @param request {EmbeddingsRequest} - The request object.\n * @returns {Promise<EmbeddingsResponse>} - The response object.\n */\n async embeddings(request) {\n const response = await post(this.fetch, `${this.config.host}/api/embeddings`, {\n ...request\n }, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Lists the running models on the server\n * @returns {Promise<ListResponse>} - The response object.\n * @throws {Error} - If the response body is missing.\n */\n async ps() {\n const response = await get(this.fetch, `${this.config.host}/api/ps`, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Returns the Ollama server version.\n * @returns {Promise<VersionResponse>} - The server version object.\n */\n async version() {\n const response = await get(this.fetch, `${this.config.host}/api/version`, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Performs web search using the Ollama web search API\n * @param request {WebSearchRequest} - The search request containing query and options\n * @returns {Promise<WebSearchResponse>} - The search results\n * @throws {Error} - If the request is invalid or the server returns an error\n */\n async webSearch(request) {\n if (!request.query || request.query.length === 0) {\n throw new Error(\"Query is required\");\n }\n const response = await post(this.fetch, `https://ollama.com/api/web_search`, { ...request }, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Fetches a single page using the Ollama web fetch API\n * @param request {WebFetchRequest} - The fetch request containing a URL\n * @returns {Promise<WebFetchResponse>} - The fetch result\n * @throws {Error} - If the request is invalid or the server returns an error\n */\n async webFetch(request) {\n if (!request.url || request.url.length === 0) {\n throw new Error(\"URL is required\");\n }\n const response = await post(this.fetch, `https://ollama.com/api/web_fetch`, { ...request }, { headers: this.config.headers });\n return await response.json();\n }\n};\nconst browser = new Ollama$1();\n\nexport { Ollama$1 as Ollama, browser as default };\n","import fs, { promises } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { Ollama as Ollama$1 } from './browser.mjs';\nimport 'whatwg-fetch';\n\nclass Ollama extends Ollama$1 {\n async encodeImage(image) {\n if (typeof image !== \"string\") {\n return Buffer.from(image).toString(\"base64\");\n }\n try {\n if (fs.existsSync(image)) {\n const fileBuffer = await promises.readFile(resolve(image));\n return Buffer.from(fileBuffer).toString(\"base64\");\n }\n } catch {\n }\n return image;\n }\n /**\n * checks if a file exists\n * @param path {string} - The path to the file\n * @private @internal\n * @returns {Promise<boolean>} - Whether the file exists or not\n */\n async fileExists(path) {\n try {\n await promises.access(path);\n return true;\n } catch {\n return false;\n }\n }\n async create(request) {\n if (request.from && await this.fileExists(resolve(request.from))) {\n throw Error(\"Creating with a local path is not currently supported from ollama-js\");\n }\n if (request.stream) {\n return super.create(request);\n } else {\n return super.create(request);\n }\n }\n}\nconst index = new Ollama();\n\nexport { Ollama, index as default };\n","import { Schema } from \"effect\";\n\n// ─── LLM Provider Type ───\n\nexport const LLMProviderType = Schema.Literal(\n \"anthropic\",\n \"openai\",\n \"ollama\",\n \"gemini\",\n \"custom\",\n);\nexport type LLMProvider = Schema.Schema.Type<typeof LLMProviderType>;\n\n// ─── Embedding Configuration ───\n\nexport const EmbeddingConfigSchema = Schema.Struct({\n model: Schema.String,\n dimensions: Schema.Number,\n provider: Schema.Literal(\"openai\", \"ollama\"),\n batchSize: Schema.optional(Schema.Number),\n});\n\nexport type EmbeddingConfig = Schema.Schema.Type<typeof EmbeddingConfigSchema>;\n\nexport const DefaultEmbeddingConfig: EmbeddingConfig = {\n model: \"text-embedding-3-small\",\n dimensions: 1536,\n provider: \"openai\",\n batchSize: 100,\n};\n\n// ─── Model Configuration ───\n\nexport const ModelConfigSchema = Schema.Struct({\n provider: LLMProviderType,\n model: Schema.String,\n maxTokens: Schema.optional(Schema.Number),\n temperature: Schema.optional(Schema.Number),\n topP: Schema.optional(Schema.Number),\n stopSequences: Schema.optional(Schema.Array(Schema.String)),\n});\n\nexport type ModelConfig = Schema.Schema.Type<typeof ModelConfigSchema>;\n\n// ─── Model Presets ───\n\nexport const ModelPresets = {\n \"claude-haiku\": {\n provider: \"anthropic\" as const,\n model: \"claude-3-5-haiku-20241022\",\n costPer1MInput: 1.0,\n costPer1MOutput: 5.0,\n maxContext: 200_000,\n quality: 0.6,\n },\n \"claude-sonnet\": {\n provider: \"anthropic\" as const,\n model: \"claude-sonnet-4-20250514\",\n costPer1MInput: 3.0,\n costPer1MOutput: 15.0,\n maxContext: 200_000,\n quality: 0.85,\n },\n \"claude-sonnet-4-5\": {\n provider: \"anthropic\" as const,\n model: \"claude-sonnet-4-5-20250929\",\n costPer1MInput: 3.0,\n costPer1MOutput: 15.0,\n maxContext: 200_000,\n quality: 0.9,\n },\n \"claude-opus\": {\n provider: \"anthropic\" as const,\n model: \"claude-opus-4-20250514\",\n costPer1MInput: 15.0,\n costPer1MOutput: 75.0,\n maxContext: 1_000_000,\n quality: 1.0,\n },\n \"gpt-4o-mini\": {\n provider: \"openai\" as const,\n model: \"gpt-4o-mini\",\n costPer1MInput: 0.15,\n costPer1MOutput: 0.6,\n maxContext: 128_000,\n quality: 0.55,\n },\n \"gpt-4o\": {\n provider: \"openai\" as const,\n model: \"gpt-4o\",\n costPer1MInput: 2.5,\n costPer1MOutput: 10.0,\n maxContext: 128_000,\n quality: 0.8,\n },\n \"gemini-2.0-flash\": {\n provider: \"gemini\" as const,\n model: \"gemini-2.0-flash\",\n costPer1MInput: 0.1,\n costPer1MOutput: 0.4,\n maxContext: 1_000_000,\n quality: 0.75,\n },\n \"gemini-2.5-pro\": {\n provider: \"gemini\" as const,\n model: \"gemini-2.5-pro-preview-03-25\",\n costPer1MInput: 1.25,\n costPer1MOutput: 10.0,\n maxContext: 1_000_000,\n quality: 0.95,\n },\n} as const;\n\nexport type ModelPresetName = keyof typeof ModelPresets;\n\n// ─── Cache Control (Anthropic Prompt Caching) ───\n\nexport const CacheControlSchema = Schema.Struct({\n type: Schema.Literal(\"ephemeral\"),\n});\n\nexport type CacheControl = Schema.Schema.Type<typeof CacheControlSchema>;\n\n// ─── Content Blocks ───\n\nexport const ImageSourceSchema = Schema.Struct({\n type: Schema.Literal(\"base64\", \"url\"),\n media_type: Schema.Literal(\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n ),\n data: Schema.String,\n});\n\nexport type ImageSource = Schema.Schema.Type<typeof ImageSourceSchema>;\n\nexport const TextContentBlockSchema = Schema.Struct({\n type: Schema.Literal(\"text\"),\n text: Schema.String,\n cache_control: Schema.optional(CacheControlSchema),\n});\n\nexport const ImageContentBlockSchema = Schema.Struct({\n type: Schema.Literal(\"image\"),\n source: ImageSourceSchema,\n});\n\nexport const ToolUseContentBlockSchema = Schema.Struct({\n type: Schema.Literal(\"tool_use\"),\n id: Schema.String,\n name: Schema.String,\n input: Schema.Unknown,\n});\n\nexport const ToolResultContentBlockSchema = Schema.Struct({\n type: Schema.Literal(\"tool_result\"),\n tool_use_id: Schema.String,\n content: Schema.String,\n});\n\nexport type ContentBlock =\n | {\n readonly type: \"text\";\n readonly text: string;\n readonly cache_control?: CacheControl;\n }\n | { readonly type: \"image\"; readonly source: ImageSource }\n | {\n readonly type: \"tool_use\";\n readonly id: string;\n readonly name: string;\n readonly input: unknown;\n }\n | {\n readonly type: \"tool_result\";\n readonly tool_use_id: string;\n readonly content: string;\n };\n\n// ─── Cacheable Content Block ───\n\nexport type CacheableContentBlock = {\n readonly type: \"text\";\n readonly text: string;\n readonly cache_control: CacheControl;\n};\n\n/**\n * Helper — wrap text in a cacheable content block.\n * Non-Anthropic providers silently ignore `cache_control`.\n */\nexport const makeCacheable = (text: string): CacheableContentBlock => ({\n type: \"text\",\n text,\n cache_control: { type: \"ephemeral\" },\n});\n\n// ─── Message Types ───\n\nexport type LLMMessage =\n | { readonly role: \"system\"; readonly content: string }\n | {\n readonly role: \"user\";\n readonly content: string | readonly ContentBlock[];\n }\n | {\n readonly role: \"assistant\";\n readonly content: string | readonly ContentBlock[];\n };\n\n// ─── Token Usage ───\n\nexport const TokenUsageSchema = Schema.Struct({\n inputTokens: Schema.Number,\n outputTokens: Schema.Number,\n totalTokens: Schema.Number,\n estimatedCost: Schema.Number,\n});\n\nexport type TokenUsage = Schema.Schema.Type<typeof TokenUsageSchema>;\n\n// ─── Stop Reason ───\n\nexport const StopReasonSchema = Schema.Literal(\n \"end_turn\",\n \"max_tokens\",\n \"stop_sequence\",\n \"tool_use\",\n);\n\nexport type StopReason = Schema.Schema.Type<typeof StopReasonSchema>;\n\n// ─── Tool Definition ───\n\nexport const ToolDefinitionSchema = Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n inputSchema: Schema.Record({ key: Schema.String, value: Schema.Unknown }),\n});\n\nexport type ToolDefinition = Schema.Schema.Type<typeof ToolDefinitionSchema>;\n\n// ─── Tool Call ───\n\nexport const ToolCallSchema = Schema.Struct({\n id: Schema.String,\n name: Schema.String,\n input: Schema.Unknown,\n});\n\nexport type ToolCall = Schema.Schema.Type<typeof ToolCallSchema>;\n\n// ─── Completion Request ───\n\nexport type CompletionRequest = {\n readonly messages: readonly LLMMessage[];\n readonly model?: ModelConfig;\n readonly maxTokens?: number;\n readonly temperature?: number;\n readonly stopSequences?: readonly string[];\n readonly tools?: readonly ToolDefinition[];\n readonly systemPrompt?: string;\n};\n\n// ─── Completion Response ───\n\nexport const CompletionResponseSchema = Schema.Struct({\n content: Schema.String,\n stopReason: StopReasonSchema,\n usage: TokenUsageSchema,\n model: Schema.String,\n toolCalls: Schema.optional(Schema.Array(ToolCallSchema)),\n});\n\nexport type CompletionResponse = Schema.Schema.Type<\n typeof CompletionResponseSchema\n>;\n\n// ─── Stream Events ───\n\nexport type StreamEvent =\n | { readonly type: \"text_delta\"; readonly text: string }\n | {\n readonly type: \"tool_use_start\";\n readonly id: string;\n readonly name: string;\n }\n | { readonly type: \"tool_use_delta\"; readonly input: string }\n | { readonly type: \"content_complete\"; readonly content: string }\n | { readonly type: \"usage\"; readonly usage: TokenUsage }\n | { readonly type: \"error\"; readonly error: string };\n\n// ─── Structured Output Config ───\n\nexport type StructuredCompletionRequest<A> = CompletionRequest & {\n readonly outputSchema: Schema.Schema<A>;\n readonly retryOnParseFail?: boolean;\n readonly maxParseRetries?: number;\n};\n\n// ─── Truncation Strategy ───\n\nexport type TruncationStrategy =\n | \"drop-oldest\"\n | \"summarize-middle\"\n | \"sliding-window\"\n | \"importance-based\";\n","import { Data } from \"effect\";\nimport type { LLMProvider } from \"./types.js\";\n\n/**\n * General LLM error — catch-all for unexpected provider failures.\n */\nexport class LLMError extends Data.TaggedError(\"LLMError\")<{\n readonly message: string;\n readonly provider: LLMProvider;\n readonly cause?: unknown;\n}> {}\n\n/**\n * Rate limit exceeded — includes retry-after hint.\n */\nexport class LLMRateLimitError extends Data.TaggedError(\"LLMRateLimitError\")<{\n readonly message: string;\n readonly provider: LLMProvider;\n readonly retryAfterMs: number;\n}> {}\n\n/**\n * Request timeout.\n */\nexport class LLMTimeoutError extends Data.TaggedError(\"LLMTimeoutError\")<{\n readonly message: string;\n readonly provider: LLMProvider;\n readonly timeoutMs: number;\n}> {}\n\n/**\n * Structured output parse failure.\n */\nexport class LLMParseError extends Data.TaggedError(\"LLMParseError\")<{\n readonly message: string;\n readonly rawOutput: string;\n readonly expectedSchema: string;\n}> {}\n\n/**\n * Context window overflow — too many tokens for the model.\n */\nexport class LLMContextOverflowError extends Data.TaggedError(\n \"LLMContextOverflowError\",\n)<{\n readonly message: string;\n readonly tokenCount: number;\n readonly maxTokens: number;\n}> {}\n\n/**\n * Union of all LLM error types.\n */\nexport type LLMErrors =\n | LLMError\n | LLMRateLimitError\n | LLMTimeoutError\n | LLMParseError\n | LLMContextOverflowError;\n","import { Effect, Context, type Stream } from \"effect\";\nimport type {\n CompletionRequest,\n CompletionResponse,\n StreamEvent,\n StructuredCompletionRequest,\n LLMMessage,\n ModelConfig,\n} from \"./types.js\";\nimport type { LLMErrors } from \"./errors.js\";\n\n/**\n * Core LLM service — all LLM interactions go through this.\n * Layers 3, 4, 5, and 10 depend on this.\n */\nexport class LLMService extends Context.Tag(\"LLMService\")<\n LLMService,\n {\n /**\n * Complete a prompt (non-streaming).\n * Returns full response after generation completes.\n */\n readonly complete: (\n request: CompletionRequest,\n ) => Effect.Effect<CompletionResponse, LLMErrors>;\n\n /**\n * Stream a completion. Returns an Effect that yields a Stream of events.\n * Use for real-time UI updates (collaborative mode).\n */\n readonly stream: (\n request: CompletionRequest,\n ) => Effect.Effect<Stream.Stream<StreamEvent, LLMErrors>, LLMErrors>;\n\n /**\n * Complete with structured output.\n * Parses LLM response into a typed object using Effect Schema.\n * Retries with parse error feedback if parsing fails.\n */\n readonly completeStructured: <A>(\n request: StructuredCompletionRequest<A>,\n ) => Effect.Effect<A, LLMErrors>;\n\n /**\n * Generate embeddings for text.\n *\n * This is the SOLE embedding source for the entire framework.\n * Anthropic has no embeddings API — routes to OpenAI or Ollama\n * per LLMConfig.embeddingConfig.\n */\n readonly embed: (\n texts: readonly string[],\n model?: string,\n ) => Effect.Effect<readonly number[][], LLMErrors>;\n\n /**\n * Count tokens for a set of messages.\n * Used for context window management.\n */\n readonly countTokens: (\n messages: readonly LLMMessage[],\n ) => Effect.Effect<number, LLMErrors>;\n\n /**\n * Get current model configuration.\n */\n readonly getModelConfig: () => Effect.Effect<ModelConfig, never>;\n }\n>() {}\n","import { Context, Layer } from \"effect\";\nimport type { LLMProvider, EmbeddingConfig } from \"./types.js\";\n\n/**\n * LLM configuration — provided via environment or config file.\n */\nexport class LLMConfig extends Context.Tag(\"LLMConfig\")<\n LLMConfig,\n {\n readonly defaultProvider: LLMProvider;\n readonly defaultModel: string;\n readonly anthropicApiKey?: string;\n readonly openaiApiKey?: string;\n readonly googleApiKey?: string;\n readonly ollamaEndpoint?: string;\n /**\n * Embedding configuration. Anthropic has no embeddings API;\n * embeddings route to OpenAI (default) or Ollama.\n * This is the SOLE embedding config for the entire framework.\n */\n readonly embeddingConfig: EmbeddingConfig;\n /**\n * Enable Anthropic prompt caching.\n * When true, memory context injections are wrapped in\n * `cache_control: { type: \"ephemeral\" }` blocks.\n */\n readonly supportsPromptCaching: boolean;\n readonly maxRetries: number;\n readonly timeoutMs: number;\n readonly defaultMaxTokens: number;\n readonly defaultTemperature: number;\n }\n>() {}\n\n/**\n * Raw LLMConfig value from environment variables.\n * Exported so callers can spread overrides (e.g. model) on top.\n */\nexport const llmConfigFromEnv = LLMConfig.of({\n defaultProvider: \"anthropic\",\n defaultModel:\n process.env.LLM_DEFAULT_MODEL ?? \"claude-sonnet-4-20250514\",\n anthropicApiKey: process.env.ANTHROPIC_API_KEY,\n openaiApiKey: process.env.OPENAI_API_KEY,\n googleApiKey: process.env.GOOGLE_API_KEY,\n ollamaEndpoint:\n process.env.OLLAMA_ENDPOINT ?? \"http://localhost:11434\",\n embeddingConfig: {\n model: process.env.EMBEDDING_MODEL ?? \"text-embedding-3-small\",\n dimensions: Number(process.env.EMBEDDING_DIMENSIONS ?? 1536),\n provider:\n (process.env.EMBEDDING_PROVIDER as \"openai\" | \"ollama\") ?? \"openai\",\n batchSize: 100,\n },\n supportsPromptCaching: (\n process.env.LLM_DEFAULT_MODEL ?? \"claude-sonnet-4-20250514\"\n ).startsWith(\"claude\"),\n maxRetries: Number(process.env.LLM_MAX_RETRIES ?? 3),\n timeoutMs: Number(process.env.LLM_TIMEOUT_MS ?? 30_000),\n defaultMaxTokens: 4096,\n defaultTemperature: Number(process.env.LLM_DEFAULT_TEMPERATURE ?? 0.7),\n});\n\n/**\n * Build LLMConfig from environment variables.\n */\nexport const LLMConfigFromEnv = Layer.succeed(LLMConfig, llmConfigFromEnv);\n","import { Effect, Context, Layer } from \"effect\";\nimport type { LLMMessage, TruncationStrategy } from \"./types.js\";\nimport type { LLMErrors } from \"./errors.js\";\nimport { estimateTokenCount } from \"./token-counter.js\";\n\n/**\n * Manages context window budgets.\n * Ensures prompts don't exceed model limits.\n * Implements truncation strategies.\n */\nexport class PromptManager extends Context.Tag(\"PromptManager\")<\n PromptManager,\n {\n /**\n * Build a prompt within token budget.\n * Automatically truncates conversation history if needed.\n */\n readonly buildPrompt: (options: {\n readonly systemPrompt: string;\n readonly messages: readonly LLMMessage[];\n readonly reserveOutputTokens: number;\n readonly maxContextTokens: number;\n readonly truncationStrategy: TruncationStrategy;\n }) => Effect.Effect<readonly LLMMessage[], LLMErrors>;\n\n /**\n * Check if messages fit within context window.\n */\n readonly fitsInContext: (\n messages: readonly LLMMessage[],\n maxTokens: number,\n ) => Effect.Effect<boolean, LLMErrors>;\n }\n>() {}\n\n/**\n * Live PromptManager that uses heuristic token counting\n * and applies truncation strategies.\n */\nexport const PromptManagerLive = Layer.succeed(\n PromptManager,\n PromptManager.of({\n buildPrompt: (options) =>\n Effect.gen(function* () {\n const {\n systemPrompt,\n messages,\n reserveOutputTokens,\n maxContextTokens,\n truncationStrategy,\n } = options;\n\n const budget = maxContextTokens - reserveOutputTokens;\n\n // Always keep the system prompt\n const systemMessage: LLMMessage = {\n role: \"system\",\n content: systemPrompt,\n };\n const systemTokens = yield* estimateTokenCount([systemMessage]);\n\n if (systemTokens >= budget) {\n // System prompt alone exceeds budget — return just it (truncated scenario)\n return [systemMessage];\n }\n\n const remainingBudget = budget - systemTokens;\n\n // Apply truncation strategy\n const truncated = yield* applyTruncation(\n messages,\n remainingBudget,\n truncationStrategy,\n );\n\n return [systemMessage, ...truncated];\n }),\n\n fitsInContext: (messages, maxTokens) =>\n Effect.gen(function* () {\n const count = yield* estimateTokenCount(messages);\n return count <= maxTokens;\n }),\n }),\n);\n\n/**\n * Apply truncation strategy to fit messages within token budget.\n */\nconst applyTruncation = (\n messages: readonly LLMMessage[],\n budget: number,\n strategy: TruncationStrategy,\n): Effect.Effect<readonly LLMMessage[], never> =>\n Effect.gen(function* () {\n const totalTokens = yield* estimateTokenCount(messages);\n\n if (totalTokens <= budget) {\n return messages;\n }\n\n switch (strategy) {\n case \"drop-oldest\": {\n // Remove messages from the beginning until we fit\n const result: LLMMessage[] = [];\n let usedTokens = 0;\n\n // Work backwards — keep most recent messages\n for (let i = messages.length - 1; i >= 0; i--) {\n const msgTokens = yield* estimateTokenCount([messages[i]!]);\n if (usedTokens + msgTokens <= budget) {\n result.unshift(messages[i]!);\n usedTokens += msgTokens;\n } else {\n break;\n }\n }\n return result;\n }\n\n case \"sliding-window\": {\n // Keep last N messages that fit\n const result: LLMMessage[] = [];\n let usedTokens = 0;\n\n for (let i = messages.length - 1; i >= 0; i--) {\n const msgTokens = yield* estimateTokenCount([messages[i]!]);\n if (usedTokens + msgTokens <= budget) {\n result.unshift(messages[i]!);\n usedTokens += msgTokens;\n } else {\n break;\n }\n }\n return result;\n }\n\n case \"summarize-middle\":\n case \"importance-based\":\n // For Phase 1: fall back to sliding-window behavior\n // Full implementation requires LLM calls (circular dependency)\n {\n const result: LLMMessage[] = [];\n let usedTokens = 0;\n\n // Keep first message (often has important context)\n if (messages.length > 0) {\n const firstTokens = yield* estimateTokenCount([messages[0]!]);\n if (firstTokens <= budget) {\n result.push(messages[0]!);\n usedTokens += firstTokens;\n }\n }\n\n // Fill from the end\n const tail: LLMMessage[] = [];\n for (let i = messages.length - 1; i >= 1; i--) {\n const msgTokens = yield* estimateTokenCount([messages[i]!]);\n if (usedTokens + msgTokens <= budget) {\n tail.unshift(messages[i]!);\n usedTokens += msgTokens;\n } else {\n break;\n }\n }\n\n return [...result, ...tail];\n }\n }\n });\n","import { Effect } from \"effect\";\nimport type { LLMMessage } from \"./types.js\";\n\n/**\n * Estimate token count for messages.\n * Uses a simple heuristic: ~4 characters per token for English text.\n * This is used as a fallback when the provider's token counting API is unavailable.\n */\nexport const estimateTokenCount = (\n messages: readonly LLMMessage[],\n): Effect.Effect<number, never> =>\n Effect.sync(() => {\n let totalChars = 0;\n\n for (const msg of messages) {\n if (typeof msg.content === \"string\") {\n totalChars += msg.content.length;\n } else {\n // Content blocks\n for (const block of msg.content) {\n if (block.type === \"text\") {\n totalChars += block.text.length;\n } else if (block.type === \"tool_result\") {\n totalChars += block.content.length;\n } else if (block.type === \"tool_use\") {\n totalChars += JSON.stringify(block.input).length;\n }\n // Images not counted in token estimation\n }\n }\n // Add overhead for role/message framing (~4 tokens per message)\n totalChars += 16;\n }\n\n return Math.ceil(totalChars / 4);\n });\n\n/**\n * Calculate cost in USD given token counts and model name.\n */\nexport const calculateCost = (\n inputTokens: number,\n outputTokens: number,\n model: string,\n): number => {\n // Cost per 1M tokens lookup\n const costMap: Record<string, { input: number; output: number }> = {\n \"claude-3-5-haiku-20241022\": { input: 1.0, output: 5.0 },\n \"claude-sonnet-4-20250514\": { input: 3.0, output: 15.0 },\n \"claude-sonnet-4-5-20250929\": { input: 3.0, output: 15.0 },\n \"claude-opus-4-20250514\": { input: 15.0, output: 75.0 },\n \"gpt-4o-mini\": { input: 0.15, output: 0.6 },\n \"gpt-4o\": { input: 2.5, output: 10.0 },\n \"gemini-2.0-flash\": { input: 0.1, output: 0.4 },\n \"gemini-2.5-pro-preview-03-25\": { input: 1.25, output: 10.0 },\n \"gemini-embedding-001\": { input: 0.0, output: 0.0 },\n };\n\n const costs = costMap[model] ?? { input: 3.0, output: 15.0 };\n return (\n (inputTokens / 1_000_000) * costs.input +\n (outputTokens / 1_000_000) * costs.output\n );\n};\n","import { Effect, Layer, Stream, Schema } from \"effect\";\nimport { LLMService } from \"../llm-service.js\";\nimport { LLMConfig } from \"../llm-config.js\";\nimport {\n LLMError,\n LLMTimeoutError,\n LLMParseError,\n LLMRateLimitError,\n} from \"../errors.js\";\nimport type {\n LLMErrors } from \"../errors.js\";\nimport type {\n CompletionResponse,\n StreamEvent,\n LLMMessage,\n ContentBlock,\n} from \"../types.js\";\nimport { calculateCost, estimateTokenCount } from \"../token-counter.js\";\nimport { retryPolicy } from \"../retry.js\";\n\n// ─── Anthropic Message Conversion Helpers ───\n\ntype AnthropicRole = \"user\" | \"assistant\";\n\ntype AnthropicContentBlock =\n | { type: \"text\"; text: string; cache_control?: { type: \"ephemeral\" } }\n | { type: \"image\"; source: { type: string; media_type: string; data: string } }\n | { type: \"tool_use\"; id: string; name: string; input: unknown }\n | { type: \"tool_result\"; tool_use_id: string; content: string };\n\ntype AnthropicMessage = {\n role: AnthropicRole;\n content: string | AnthropicContentBlock[];\n};\n\nconst toAnthropicMessages = (\n messages: readonly LLMMessage[],\n): AnthropicMessage[] =>\n messages\n .filter((m) => m.role !== \"system\")\n .map((m) => ({\n role: m.role as AnthropicRole,\n content:\n typeof m.content === \"string\"\n ? m.content\n : (m.content as readonly ContentBlock[]).map(\n (b) => b as unknown as AnthropicContentBlock,\n ),\n }));\n\nconst toAnthropicTool = (tool: {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n}) => ({\n name: tool.name,\n description: tool.description,\n input_schema: {\n type: \"object\" as const,\n ...tool.inputSchema,\n },\n});\n\nconst toEffectError = (error: unknown, provider: \"anthropic\"): LLMErrors => {\n const err = error as { status?: number; message?: string; headers?: Record<string, string> };\n if (err.status === 429) {\n const retryAfter = err.headers?.[\"retry-after\"];\n return new LLMRateLimitError({\n message: err.message ?? \"Rate limit exceeded\",\n provider,\n retryAfterMs: retryAfter ? Number(retryAfter) * 1000 : 60_000,\n });\n }\n return new LLMError({\n message: err.message ?? String(error),\n provider,\n cause: error,\n });\n};\n\n// ─── Anthropic Provider Layer ───\n\nexport const AnthropicProviderLive = Layer.effect(\n LLMService,\n Effect.gen(function* () {\n const config = yield* LLMConfig;\n\n // Lazy-load the SDK to avoid hard dependency if not using Anthropic\n const createClient = () => {\n // Dynamic import is handled in Effect.tryPromise\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const Anthropic = require(\"@anthropic-ai/sdk\").default;\n return new Anthropic({ apiKey: config.anthropicApiKey });\n };\n\n let _client: ReturnType<typeof createClient> | null = null;\n const getClient = () => {\n if (!_client) _client = createClient();\n return _client;\n };\n\n return LLMService.of({\n complete: (request) =>\n Effect.gen(function* () {\n const client = getClient();\n const model = typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? config.defaultModel;\n\n const response = yield* Effect.tryPromise({\n try: () =>\n (client as { messages: { create: (opts: unknown) => Promise<unknown> } }).messages.create({\n model,\n max_tokens: request.maxTokens ?? config.defaultMaxTokens,\n temperature: request.temperature ?? config.defaultTemperature,\n system: request.systemPrompt,\n messages: toAnthropicMessages(request.messages),\n stop_sequences: request.stopSequences\n ? [...request.stopSequences]\n : undefined,\n tools: request.tools?.map(toAnthropicTool),\n }),\n catch: (error) => toEffectError(error, \"anthropic\"),\n });\n\n return mapAnthropicResponse(response as AnthropicRawResponse, model);\n }).pipe(\n Effect.retry(retryPolicy),\n Effect.timeout(\"30 seconds\"),\n Effect.catchTag(\"TimeoutException\", () =>\n Effect.fail(\n new LLMTimeoutError({\n message: \"LLM request timed out\",\n provider: \"anthropic\",\n timeoutMs: 30_000,\n }),\n ),\n ),\n ),\n\n stream: (request) =>\n Effect.gen(function* () {\n const client = getClient();\n const model = typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? config.defaultModel;\n\n return Stream.async<StreamEvent, LLMErrors>((emit) => {\n const stream = (client as { messages: { stream: (opts: unknown) => { on: (event: string, cb: (...args: unknown[]) => void) => void } } }).messages.stream({\n model,\n max_tokens: request.maxTokens ?? config.defaultMaxTokens,\n temperature: request.temperature ?? config.defaultTemperature,\n system: request.systemPrompt,\n messages: toAnthropicMessages(request.messages),\n });\n\n stream.on(\"text\", (text: unknown) => {\n emit.single({ type: \"text_delta\", text: text as string });\n });\n\n stream.on(\"finalMessage\", (message: unknown) => {\n const msg = message as AnthropicRawResponse;\n const content = msg.content\n .filter(\n (b: { type: string }): b is { type: \"text\"; text: string } =>\n b.type === \"text\",\n )\n .map((b: { text: string }) => b.text)\n .join(\"\");\n\n emit.single({ type: \"content_complete\", content });\n emit.single({\n type: \"usage\",\n usage: {\n inputTokens: msg.usage.input_tokens,\n outputTokens: msg.usage.output_tokens,\n totalTokens:\n msg.usage.input_tokens + msg.usage.output_tokens,\n estimatedCost: calculateCost(\n msg.usage.input_tokens,\n msg.usage.output_tokens,\n model,\n ),\n },\n });\n emit.end();\n });\n\n stream.on(\"error\", (error: unknown) => {\n const err = error as { message?: string };\n emit.fail(\n new LLMError({\n message: err.message ?? String(error),\n provider: \"anthropic\",\n cause: error,\n }),\n );\n });\n });\n }),\n\n completeStructured: (request) =>\n Effect.gen(function* () {\n const schemaStr = JSON.stringify(\n Schema.encodedSchema(request.outputSchema),\n null,\n 2,\n );\n\n const messagesWithFormat: LLMMessage[] = [\n ...request.messages,\n {\n role: \"user\" as const,\n content: `\\nRespond with ONLY valid JSON matching this schema:\\n${schemaStr}\\n\\nNo markdown, no code fences, just raw JSON.`,\n },\n ];\n\n let lastError: unknown = null;\n const maxRetries = request.maxParseRetries ?? 2;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const msgs =\n attempt === 0\n ? messagesWithFormat\n : [\n ...messagesWithFormat,\n {\n role: \"assistant\" as const,\n content: String(lastError),\n },\n {\n role: \"user\" as const,\n content: `That response was not valid JSON. The parse error was: ${String(lastError)}. Please try again with valid JSON only.`,\n },\n ];\n\n const completeResult = yield* Effect.tryPromise({\n try: () => {\n const client = getClient();\n return (client as { messages: { create: (opts: unknown) => Promise<unknown> } }).messages.create({\n model: typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? config.defaultModel,\n max_tokens:\n request.maxTokens ?? config.defaultMaxTokens,\n temperature: request.temperature ?? config.defaultTemperature,\n system: request.systemPrompt,\n messages: toAnthropicMessages(msgs),\n });\n },\n catch: (error) => toEffectError(error, \"anthropic\"),\n });\n\n const response = mapAnthropicResponse(\n completeResult as AnthropicRawResponse,\n typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? config.defaultModel,\n );\n\n try {\n const parsed = JSON.parse(response.content);\n const decoded = Schema.decodeUnknownEither(\n request.outputSchema,\n )(parsed);\n\n if (decoded._tag === \"Right\") {\n return decoded.right;\n }\n lastError = decoded.left;\n } catch (e) {\n lastError = e;\n }\n }\n\n return yield* Effect.fail(\n new LLMParseError({\n message: `Failed to parse structured output after ${maxRetries + 1} attempts`,\n rawOutput: String(lastError),\n expectedSchema: schemaStr,\n }),\n );\n }),\n\n embed: (texts, model) =>\n Effect.tryPromise({\n try: async () => {\n const embeddingModel = model ?? config.embeddingConfig.model;\n const embProvider = config.embeddingConfig.provider;\n\n if (embProvider === \"openai\") {\n const { default: OpenAI } = await import(\"openai\");\n const openaiClient = new OpenAI({\n apiKey: config.openaiApiKey,\n });\n const batchSize = config.embeddingConfig.batchSize ?? 100;\n const results: number[][] = [];\n\n for (let i = 0; i < texts.length; i += batchSize) {\n const batch = texts.slice(i, i + batchSize);\n const response = await openaiClient.embeddings.create({\n model: embeddingModel,\n input: [...batch],\n dimensions: config.embeddingConfig.dimensions,\n });\n results.push(\n ...response.data.map(\n (d: { embedding: number[] }) => d.embedding,\n ),\n );\n }\n\n return results;\n }\n\n // Ollama embeddings\n const endpoint =\n config.ollamaEndpoint ?? \"http://localhost:11434\";\n return Promise.all(\n [...texts].map(async (text) => {\n const res = await fetch(`${endpoint}/api/embed`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model: embeddingModel,\n input: text,\n }),\n });\n const data = (await res.json()) as {\n embeddings: number[][];\n };\n return data.embeddings[0]!;\n }),\n );\n },\n catch: (error) =>\n new LLMError({\n message: `Embedding failed: ${error}`,\n provider: \"anthropic\",\n cause: error,\n }),\n }),\n\n countTokens: (messages) =>\n Effect.gen(function* () {\n return yield* estimateTokenCount(messages);\n }),\n\n getModelConfig: () =>\n Effect.succeed({\n provider: \"anthropic\" as const,\n model: config.defaultModel,\n }),\n });\n }),\n);\n\n// ─── Anthropic Response Mapping ───\n\ntype AnthropicRawResponse = {\n content: Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: unknown }\n >;\n stop_reason: string;\n usage: { input_tokens: number; output_tokens: number };\n model: string;\n};\n\nconst mapAnthropicResponse = (\n response: AnthropicRawResponse,\n model: string,\n): CompletionResponse => {\n const textContent = response.content\n .filter(\n (b): b is { type: \"text\"; text: string } => b.type === \"text\",\n )\n .map((b) => b.text)\n .join(\"\");\n\n const toolCalls = response.content\n .filter(\n (\n b,\n ): b is {\n type: \"tool_use\";\n id: string;\n name: string;\n input: unknown;\n } => b.type === \"tool_use\",\n )\n .map((b) => ({\n id: b.id,\n name: b.name,\n input: b.input,\n }));\n\n const stopReason =\n response.stop_reason === \"end_turn\"\n ? (\"end_turn\" as const)\n : response.stop_reason === \"max_tokens\"\n ? (\"max_tokens\" as const)\n : response.stop_reason === \"stop_sequence\"\n ? (\"stop_sequence\" as const)\n : response.stop_reason === \"tool_use\"\n ? (\"tool_use\" as const)\n : (\"end_turn\" as const);\n\n return {\n content: textContent,\n stopReason,\n usage: {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n totalTokens:\n response.usage.input_tokens + response.usage.output_tokens,\n estimatedCost: calculateCost(\n response.usage.input_tokens,\n response.usage.output_tokens,\n model,\n ),\n },\n model: response.model ?? model,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n };\n};\n","import { Schedule } from \"effect\";\nimport type { LLMErrors } from \"./errors.js\";\n\n/**\n * Retry policy for LLM calls.\n * Handles rate limits with exponential backoff.\n * Only retries on rate limit and timeout errors.\n */\nexport const retryPolicy = Schedule.intersect(\n Schedule.recurs(3),\n Schedule.exponential(\"1 second\", 2.0),\n).pipe(\n Schedule.whileInput<LLMErrors>(\n (error) =>\n error._tag === \"LLMRateLimitError\" || error._tag === \"LLMTimeoutError\",\n ),\n);\n\n// ─── Circuit Breaker ───\n\nexport type CircuitBreakerConfig = {\n readonly failureThreshold: number;\n readonly cooldownMs: number;\n readonly halfOpenRequests: number;\n};\n\nexport const defaultCircuitBreakerConfig: CircuitBreakerConfig = {\n failureThreshold: 5,\n cooldownMs: 30_000,\n halfOpenRequests: 1,\n};\n","import { Effect, Layer, Stream, Schema } from \"effect\";\nimport { LLMService } from \"../llm-service.js\";\nimport { LLMConfig } from \"../llm-config.js\";\nimport {\n LLMError,\n LLMTimeoutError,\n LLMParseError,\n LLMRateLimitError,\n} from \"../errors.js\";\nimport type { LLMErrors } from \"../errors.js\";\nimport type {\n CompletionResponse,\n StreamEvent,\n LLMMessage,\n ToolDefinition,\n ToolCall,\n} from \"../types.js\";\nimport { calculateCost, estimateTokenCount } from \"../token-counter.js\";\nimport { retryPolicy } from \"../retry.js\";\n\n// ─── OpenAI Message Conversion ───\n\ntype OpenAIMessage = {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n};\n\nconst toOpenAIMessages = (\n messages: readonly LLMMessage[],\n): OpenAIMessage[] =>\n messages.map((m) => ({\n role: m.role,\n content:\n typeof m.content === \"string\"\n ? m.content\n : m.content\n .filter(\n (b): b is { type: \"text\"; text: string } => b.type === \"text\",\n )\n .map((b) => b.text)\n .join(\"\"),\n }));\n\nconst toEffectError = (error: unknown, provider: \"openai\"): LLMErrors => {\n const err = error as { status?: number; message?: string };\n if (err.status === 429) {\n return new LLMRateLimitError({\n message: err.message ?? \"Rate limit exceeded\",\n provider,\n retryAfterMs: 60_000,\n });\n }\n return new LLMError({\n message: err.message ?? String(error),\n provider,\n cause: error,\n });\n};\n\n// ─── OpenAI Tool Conversion ───\n\nconst toOpenAITool = (tool: ToolDefinition) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n});\n\n// ─── OpenAI Provider Layer ───\n\nexport const OpenAIProviderLive = Layer.effect(\n LLMService,\n Effect.gen(function* () {\n const config = yield* LLMConfig;\n\n const createClient = () => {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const OpenAI = require(\"openai\").default;\n return new OpenAI({ apiKey: config.openaiApiKey });\n };\n\n let _client: ReturnType<typeof createClient> | null = null;\n const getClient = () => {\n if (!_client) _client = createClient();\n return _client;\n };\n\n const defaultModel = config.defaultModel.startsWith(\"claude\")\n ? \"gpt-4o\"\n : config.defaultModel;\n\n return LLMService.of({\n complete: (request) =>\n Effect.gen(function* () {\n const client = getClient();\n const model = typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? defaultModel;\n\n const messages = toOpenAIMessages(request.messages);\n if (request.systemPrompt) {\n messages.unshift({ role: \"system\", content: request.systemPrompt });\n }\n\n const requestBody: Record<string, unknown> = {\n model,\n max_tokens: request.maxTokens ?? config.defaultMaxTokens,\n temperature: request.temperature ?? config.defaultTemperature,\n messages,\n stop: request.stopSequences\n ? [...request.stopSequences]\n : undefined,\n };\n\n if (request.tools && request.tools.length > 0) {\n requestBody.tools = request.tools.map(toOpenAITool);\n }\n\n const response = yield* Effect.tryPromise({\n try: () =>\n (client as { chat: { completions: { create: (opts: unknown) => Promise<unknown> } } }).chat.completions.create(requestBody),\n catch: (error) => toEffectError(error, \"openai\"),\n });\n\n return mapOpenAIResponse(response as OpenAIRawResponse, model);\n }).pipe(\n Effect.retry(retryPolicy),\n Effect.timeout(\"30 seconds\"),\n Effect.catchTag(\"TimeoutException\", () =>\n Effect.fail(\n new LLMTimeoutError({\n message: \"LLM request timed out\",\n provider: \"openai\",\n timeoutMs: 30_000,\n }),\n ),\n ),\n ),\n\n stream: (request) =>\n Effect.gen(function* () {\n const client = getClient();\n const model = typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? defaultModel;\n\n return Stream.async<StreamEvent, LLMErrors>((emit) => {\n const doStream = async () => {\n try {\n const stream = await (client as { chat: { completions: { create: (opts: unknown) => Promise<AsyncIterable<unknown>> } } }).chat.completions.create({\n model,\n max_tokens:\n request.maxTokens ?? config.defaultMaxTokens,\n temperature:\n request.temperature ?? config.defaultTemperature,\n messages: (() => {\n const msgs = toOpenAIMessages(request.messages);\n if (request.systemPrompt) {\n msgs.unshift({ role: \"system\", content: request.systemPrompt });\n }\n return msgs;\n })(),\n stream: true,\n });\n\n let fullContent = \"\";\n\n for await (const chunk of stream as AsyncIterable<{\n choices: Array<{\n delta: { content?: string };\n finish_reason?: string;\n }>;\n usage?: { prompt_tokens: number; completion_tokens: number };\n }>) {\n const delta = chunk.choices[0]?.delta?.content;\n if (delta) {\n fullContent += delta;\n emit.single({ type: \"text_delta\", text: delta });\n }\n\n if (chunk.choices[0]?.finish_reason) {\n emit.single({\n type: \"content_complete\",\n content: fullContent,\n });\n\n const inputTokens = chunk.usage?.prompt_tokens ?? 0;\n const outputTokens =\n chunk.usage?.completion_tokens ?? 0;\n emit.single({\n type: \"usage\",\n usage: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n estimatedCost: calculateCost(\n inputTokens,\n outputTokens,\n model,\n ),\n },\n });\n emit.end();\n }\n }\n } catch (error) {\n const err = error as { message?: string };\n emit.fail(\n new LLMError({\n message: err.message ?? String(error),\n provider: \"openai\",\n cause: error,\n }),\n );\n }\n };\n void doStream();\n });\n }),\n\n completeStructured: (request) =>\n Effect.gen(function* () {\n const schemaStr = JSON.stringify(\n Schema.encodedSchema(request.outputSchema),\n null,\n 2,\n );\n\n const messagesWithFormat: LLMMessage[] = [\n ...request.messages,\n {\n role: \"user\" as const,\n content: `\\nRespond with ONLY valid JSON matching this schema:\\n${schemaStr}\\n\\nNo markdown, no code fences, just raw JSON.`,\n },\n ];\n\n let lastError: unknown = null;\n const maxRetries = request.maxParseRetries ?? 2;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const msgs =\n attempt === 0\n ? messagesWithFormat\n : [\n ...messagesWithFormat,\n {\n role: \"assistant\" as const,\n content: String(lastError),\n },\n {\n role: \"user\" as const,\n content: `That response was not valid JSON. The parse error was: ${String(lastError)}. Please try again with valid JSON only.`,\n },\n ];\n\n const client = getClient();\n const completeResult = yield* Effect.tryPromise({\n try: () =>\n (client as { chat: { completions: { create: (opts: unknown) => Promise<unknown> } } }).chat.completions.create({\n model: typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? defaultModel,\n max_tokens:\n request.maxTokens ?? config.defaultMaxTokens,\n temperature:\n request.temperature ?? config.defaultTemperature,\n messages: toOpenAIMessages(msgs),\n }),\n catch: (error) => toEffectError(error, \"openai\"),\n });\n\n const response = mapOpenAIResponse(\n completeResult as OpenAIRawResponse,\n typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? defaultModel,\n );\n\n try {\n const parsed = JSON.parse(response.content);\n const decoded = Schema.decodeUnknownEither(\n request.outputSchema,\n )(parsed);\n\n if (decoded._tag === \"Right\") {\n return decoded.right;\n }\n lastError = decoded.left;\n } catch (e) {\n lastError = e;\n }\n }\n\n return yield* Effect.fail(\n new LLMParseError({\n message: `Failed to parse structured output after ${maxRetries + 1} attempts`,\n rawOutput: String(lastError),\n expectedSchema: schemaStr,\n }),\n );\n }),\n\n embed: (texts, model) =>\n Effect.tryPromise({\n try: async () => {\n const client = getClient();\n const embeddingModel =\n model ?? config.embeddingConfig.model;\n const batchSize = config.embeddingConfig.batchSize ?? 100;\n const results: number[][] = [];\n\n for (let i = 0; i < texts.length; i += batchSize) {\n const batch = texts.slice(i, i + batchSize);\n const response = await (client as { embeddings: { create: (opts: unknown) => Promise<{ data: Array<{ embedding: number[] }> }> } }).embeddings.create({\n model: embeddingModel,\n input: [...batch],\n dimensions: config.embeddingConfig.dimensions,\n });\n results.push(\n ...response.data.map(\n (d: { embedding: number[] }) => d.embedding,\n ),\n );\n }\n\n return results;\n },\n catch: (error) =>\n new LLMError({\n message: `Embedding failed: ${error}`,\n provider: \"openai\",\n cause: error,\n }),\n }),\n\n countTokens: (messages) =>\n Effect.gen(function* () {\n return yield* estimateTokenCount(messages);\n }),\n\n getModelConfig: () =>\n Effect.succeed({\n provider: \"openai\" as const,\n model: defaultModel,\n }),\n });\n }),\n);\n\n// ─── OpenAI Response Mapping ───\n\ntype OpenAIToolCall = {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n};\n\ntype OpenAIRawResponse = {\n choices: Array<{\n message: {\n content: string | null;\n role: string;\n tool_calls?: OpenAIToolCall[];\n };\n finish_reason: string;\n }>;\n usage: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n model: string;\n};\n\nconst mapOpenAIResponse = (\n response: OpenAIRawResponse,\n model: string,\n): CompletionResponse => {\n const message = response.choices[0]?.message;\n const content = message?.content ?? \"\";\n const rawToolCalls = message?.tool_calls;\n\n const hasToolCalls = rawToolCalls && rawToolCalls.length > 0;\n\n const stopReason =\n response.choices[0]?.finish_reason === \"tool_calls\" || hasToolCalls\n ? (\"tool_use\" as const)\n : response.choices[0]?.finish_reason === \"stop\"\n ? (\"end_turn\" as const)\n : response.choices[0]?.finish_reason === \"length\"\n ? (\"max_tokens\" as const)\n : (\"end_turn\" as const);\n\n const toolCalls: ToolCall[] | undefined = hasToolCalls\n ? rawToolCalls.map((tc) => {\n let input: unknown;\n try {\n input = JSON.parse(tc.function.arguments);\n } catch {\n input = { raw: tc.function.arguments };\n }\n return {\n id: tc.id,\n name: tc.function.name,\n input,\n };\n })\n : undefined;\n\n return {\n content,\n stopReason,\n usage: {\n inputTokens: response.usage?.prompt_tokens ?? 0,\n outputTokens: response.usage?.completion_tokens ?? 0,\n totalTokens: response.usage?.total_tokens ?? 0,\n estimatedCost: calculateCost(\n response.usage?.prompt_tokens ?? 0,\n response.usage?.completion_tokens ?? 0,\n model,\n ),\n },\n model: response.model ?? model,\n toolCalls,\n };\n};\n","import { Effect, Layer, Stream, Schema } from \"effect\";\nimport { LLMService } from \"../llm-service.js\";\nimport { LLMConfig } from \"../llm-config.js\";\nimport { LLMError, LLMTimeoutError, LLMParseError } from \"../errors.js\";\nimport type { LLMErrors } from \"../errors.js\";\nimport type {\n CompletionResponse,\n StreamEvent,\n LLMMessage,\n ToolDefinition,\n ToolCall,\n} from \"../types.js\";\nimport { estimateTokenCount } from \"../token-counter.js\";\nimport { retryPolicy } from \"../retry.js\";\n\n// ─── Ollama SDK types (from the `ollama` npm package) ───\n\ntype OllamaTool = {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n};\n\ntype OllamaMessage = {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n};\n\n// ─── Conversion Helpers ───\n\nconst toOllamaMessages = (\n messages: readonly LLMMessage[],\n): OllamaMessage[] =>\n messages.map((m) => ({\n role: m.role,\n content:\n typeof m.content === \"string\"\n ? m.content\n : m.content\n .filter(\n (b): b is { type: \"text\"; text: string } => b.type === \"text\",\n )\n .map((b) => b.text)\n .join(\"\"),\n }));\n\nconst toOllamaTools = (\n tools?: readonly ToolDefinition[],\n): OllamaTool[] | undefined => {\n if (!tools || tools.length === 0) return undefined;\n return tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema as Record<string, unknown>,\n },\n }));\n};\n\nconst parseToolCalls = (\n toolCalls?: Array<{\n function: { name: string; arguments: unknown };\n }>,\n): ToolCall[] | undefined => {\n if (!toolCalls || toolCalls.length === 0) return undefined;\n return toolCalls.map((tc, i) => ({\n id: `ollama-tc-${Date.now()}-${i}`,\n name: tc.function.name,\n input: tc.function.arguments,\n }));\n};\n\n// ─── Ollama / Local Provider Layer ───\n\nexport const LocalProviderLive = Layer.effect(\n LLMService,\n Effect.gen(function* () {\n const config = yield* LLMConfig;\n const endpoint = config.ollamaEndpoint ?? \"http://localhost:11434\";\n const defaultModel = config.defaultModel.startsWith(\"claude\") ||\n config.defaultModel.startsWith(\"gpt\")\n ? \"llama3\"\n : config.defaultModel;\n\n // Lazy-import the ollama SDK (same pattern as Gemini provider)\n const getClient = async () => {\n const { Ollama } = await import(\"ollama\");\n return new Ollama({ host: endpoint });\n };\n\n return LLMService.of({\n complete: (request) =>\n Effect.gen(function* () {\n const model = typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? defaultModel;\n\n const response = yield* Effect.tryPromise({\n try: async () => {\n const client = await getClient();\n\n const msgs = toOllamaMessages(request.messages);\n if (request.systemPrompt) {\n msgs.unshift({ role: \"system\", content: request.systemPrompt });\n }\n\n return client.chat({\n model,\n messages: msgs,\n tools: toOllamaTools(request.tools),\n stream: false,\n keep_alive: \"5m\",\n options: {\n temperature:\n request.temperature ?? config.defaultTemperature,\n num_predict:\n request.maxTokens ?? config.defaultMaxTokens,\n stop: request.stopSequences\n ? [...request.stopSequences]\n : undefined,\n },\n });\n },\n catch: (error) =>\n new LLMError({\n message: `Ollama request failed: ${error}`,\n provider: \"ollama\",\n cause: error,\n }),\n });\n\n const content = response.message?.content ?? \"\";\n const inputTokens = response.prompt_eval_count ?? 0;\n const outputTokens = response.eval_count ?? 0;\n const toolCalls = parseToolCalls(\n response.message?.tool_calls as Array<{\n function: { name: string; arguments: unknown };\n }> | undefined,\n );\n\n const hasToolCalls = toolCalls && toolCalls.length > 0;\n\n return {\n content,\n stopReason: hasToolCalls\n ? (\"tool_use\" as const)\n : response.done_reason === \"stop\"\n ? (\"end_turn\" as const)\n : response.done_reason === \"length\"\n ? (\"max_tokens\" as const)\n : (\"end_turn\" as const),\n usage: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n estimatedCost: 0, // Local models are free\n },\n model: response.model ?? model,\n toolCalls,\n } satisfies CompletionResponse;\n }).pipe(\n Effect.retry(retryPolicy),\n Effect.timeout(\"120 seconds\"),\n Effect.catchTag(\"TimeoutException\", () =>\n Effect.fail(\n new LLMTimeoutError({\n message: \"Local LLM request timed out\",\n provider: \"ollama\",\n timeoutMs: 120_000,\n }),\n ),\n ),\n ),\n\n stream: (request) =>\n Effect.gen(function* () {\n const model = typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? defaultModel;\n\n return Stream.async<StreamEvent, LLMErrors>((emit) => {\n const doStream = async () => {\n try {\n const client = await getClient();\n\n const msgs = toOllamaMessages(request.messages);\n if (request.systemPrompt) {\n msgs.unshift({ role: \"system\", content: request.systemPrompt });\n }\n\n const stream = await client.chat({\n model,\n messages: msgs,\n tools: toOllamaTools(request.tools),\n stream: true,\n keep_alive: \"5m\",\n options: {\n temperature:\n request.temperature ?? config.defaultTemperature,\n num_predict:\n request.maxTokens ?? config.defaultMaxTokens,\n },\n });\n\n let fullContent = \"\";\n\n for await (const chunk of stream) {\n if (chunk.message?.content) {\n fullContent += chunk.message.content;\n emit.single({\n type: \"text_delta\",\n text: chunk.message.content,\n });\n }\n\n if (chunk.done) {\n emit.single({\n type: \"content_complete\",\n content: fullContent,\n });\n emit.single({\n type: \"usage\",\n usage: {\n inputTokens: chunk.prompt_eval_count ?? 0,\n outputTokens: chunk.eval_count ?? 0,\n totalTokens:\n (chunk.prompt_eval_count ?? 0) +\n (chunk.eval_count ?? 0),\n estimatedCost: 0,\n },\n });\n emit.end();\n }\n }\n } catch (error) {\n const err = error as { message?: string };\n emit.fail(\n new LLMError({\n message: err.message ?? String(error),\n provider: \"ollama\",\n cause: error,\n }),\n );\n }\n };\n void doStream();\n });\n }),\n\n completeStructured: (request) =>\n Effect.gen(function* () {\n const schemaStr = JSON.stringify(\n Schema.encodedSchema(request.outputSchema),\n null,\n 2,\n );\n\n const model = typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? defaultModel;\n\n let lastError: unknown = null;\n const maxRetries = request.maxParseRetries ?? 2;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const msgs = toOllamaMessages(\n attempt === 0\n ? [\n ...request.messages,\n {\n role: \"user\" as const,\n content: `\\nRespond with ONLY valid JSON matching this schema:\\n${schemaStr}\\n\\nNo markdown, no code fences, just raw JSON.`,\n },\n ]\n : [\n ...request.messages,\n {\n role: \"user\" as const,\n content: `\\nRespond with ONLY valid JSON matching this schema:\\n${schemaStr}\\n\\nNo markdown, no code fences, just raw JSON.`,\n },\n {\n role: \"assistant\" as const,\n content: String(lastError),\n },\n {\n role: \"user\" as const,\n content: `That response was not valid JSON. The parse error was: ${String(lastError)}. Please try again with valid JSON only.`,\n },\n ],\n );\n\n if (request.systemPrompt) {\n msgs.unshift({ role: \"system\", content: request.systemPrompt });\n }\n\n const response = yield* Effect.tryPromise({\n try: async () => {\n const client = await getClient();\n return client.chat({\n model,\n messages: msgs,\n stream: false,\n format: \"json\",\n keep_alive: \"5m\",\n options: {\n temperature:\n request.temperature ?? config.defaultTemperature,\n num_predict:\n request.maxTokens ?? config.defaultMaxTokens,\n },\n });\n },\n catch: (error) =>\n new LLMError({\n message: `Ollama request failed: ${error}`,\n provider: \"ollama\",\n cause: error,\n }),\n });\n\n const content = response.message?.content ?? \"\";\n\n try {\n const parsed = JSON.parse(content);\n const decoded = Schema.decodeUnknownEither(\n request.outputSchema,\n )(parsed);\n\n if (decoded._tag === \"Right\") {\n return decoded.right;\n }\n lastError = decoded.left;\n } catch (e) {\n lastError = e;\n }\n }\n\n return yield* Effect.fail(\n new LLMParseError({\n message: `Failed to parse structured output after ${maxRetries + 1} attempts`,\n rawOutput: String(lastError),\n expectedSchema: schemaStr,\n }),\n );\n }),\n\n embed: (texts, model) =>\n Effect.tryPromise({\n try: async () => {\n const client = await getClient();\n const embeddingModel =\n model ?? config.embeddingConfig.model ?? \"nomic-embed-text\";\n\n const response = await client.embed({\n model: embeddingModel,\n input: [...texts],\n });\n\n return response.embeddings;\n },\n catch: (error) =>\n new LLMError({\n message: `Embedding failed: ${error}`,\n provider: \"ollama\",\n cause: error,\n }),\n }),\n\n countTokens: (messages) =>\n Effect.gen(function* () {\n return yield* estimateTokenCount(messages);\n }),\n\n getModelConfig: () =>\n Effect.succeed({\n provider: \"ollama\" as const,\n model: defaultModel,\n }),\n });\n }),\n);\n","import { Effect, Layer, Stream, Schema } from \"effect\";\nimport { LLMService } from \"../llm-service.js\";\nimport { LLMConfig } from \"../llm-config.js\";\nimport {\n LLMError,\n LLMTimeoutError,\n LLMParseError,\n LLMRateLimitError,\n} from \"../errors.js\";\nimport type { LLMErrors } from \"../errors.js\";\nimport type {\n CompletionResponse,\n StreamEvent,\n LLMMessage,\n ContentBlock,\n} from \"../types.js\";\nimport { calculateCost, estimateTokenCount } from \"../token-counter.js\";\nimport { retryPolicy } from \"../retry.js\";\n\n// ─── Gemini Message Conversion Helpers ───\n\ntype GeminiPart =\n | { text: string }\n | { functionCall: { name: string; args: unknown } }\n | { functionResponse: { name: string; response: unknown } };\n\ntype GeminiContent = {\n role: \"user\" | \"model\";\n parts: GeminiPart[];\n};\n\nconst toGeminiContents = (messages: readonly LLMMessage[]): GeminiContent[] => {\n const result: GeminiContent[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") continue; // handled via config.systemInstruction\n\n const role = msg.role === \"assistant\" ? \"model\" : \"user\";\n\n if (typeof msg.content === \"string\") {\n result.push({ role, parts: [{ text: msg.content }] });\n } else {\n const parts: GeminiPart[] = [];\n for (const block of msg.content as readonly ContentBlock[]) {\n if (block.type === \"text\") {\n parts.push({ text: block.text });\n } else if (block.type === \"tool_use\") {\n parts.push({\n functionCall: { name: block.name, args: block.input },\n });\n } else if (block.type === \"tool_result\") {\n parts.push({\n functionResponse: {\n name: \"tool\",\n response: { content: block.content },\n },\n });\n }\n // images not converted — Gemini multimodal requires separate file URIs\n }\n if (parts.length > 0) {\n result.push({ role, parts });\n }\n }\n }\n\n return result;\n};\n\nconst extractSystemPrompt = (\n messages: readonly LLMMessage[],\n): string | undefined => {\n const sys = messages.find((m) => m.role === \"system\");\n if (!sys) return undefined;\n return typeof sys.content === \"string\" ? sys.content : undefined;\n};\n\nconst toGeminiTools = (\n tools: { name: string; description: string; inputSchema: Record<string, unknown> }[],\n) =>\n tools.length === 0\n ? undefined\n : [\n {\n functionDeclarations: tools.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: { type: \"object\", ...t.inputSchema },\n })),\n },\n ];\n\nconst toEffectError = (error: unknown): LLMErrors => {\n const err = error as { status?: number; code?: number; message?: string };\n if (err.status === 429 || err.code === 429) {\n return new LLMRateLimitError({\n message: err.message ?? \"Rate limit exceeded\",\n provider: \"gemini\",\n retryAfterMs: 60_000,\n });\n }\n return new LLMError({\n message: err.message ?? String(error),\n provider: \"gemini\",\n cause: error,\n });\n};\n\n// ─── Gemini Response Types ───\n\ntype GeminiUsage = {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n};\n\ntype GeminiFunctionCall = { name: string; args: unknown };\n\ntype GeminiRawResponse = {\n text: string;\n functionCalls?: GeminiFunctionCall[];\n usageMetadata?: GeminiUsage;\n};\n\n// ─── Response Mapper ───\n\nconst mapGeminiResponse = (\n response: GeminiRawResponse,\n model: string,\n): CompletionResponse => {\n const toolCalls = response.functionCalls?.map((fc, i) => ({\n id: `call_${i}`,\n name: fc.name,\n input: fc.args,\n }));\n\n const inputTokens = response.usageMetadata?.promptTokenCount ?? 0;\n const outputTokens = response.usageMetadata?.candidatesTokenCount ?? 0;\n\n return {\n content: response.text ?? \"\",\n stopReason: toolCalls?.length ? \"tool_use\" : \"end_turn\",\n usage: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n estimatedCost: calculateCost(inputTokens, outputTokens, model),\n },\n model,\n toolCalls: toolCalls?.length ? toolCalls : undefined,\n };\n};\n\n// ─── Gemini Provider Layer ───\n\nconst GEMINI_DEFAULT_MODEL = \"gemini-2.5-flash\";\n\nexport const GeminiProviderLive = Layer.effect(\n LLMService,\n Effect.gen(function* () {\n const config = yield* LLMConfig;\n\n // ─── Lazy-load the SDK via dynamic import (interceptable by mock.module) ───\n\n type GoogleGenAIClient = {\n models: {\n generateContent: (opts: unknown) => Promise<GeminiRawResponse>;\n generateContentStream: (opts: unknown) => Promise<\n AsyncIterable<{\n text: string;\n usageMetadata?: GeminiUsage;\n }>\n >;\n embedContent: (opts: unknown) => Promise<{\n embeddings: Array<{ values: number[] }>;\n }>;\n };\n };\n\n type GoogleGenAIModule = {\n GoogleGenAI: new (opts: { apiKey?: string }) => GoogleGenAIClient;\n };\n\n let _clientPromise: Promise<GoogleGenAIClient> | null = null;\n const getClient = (): Promise<GoogleGenAIClient> => {\n if (!_clientPromise) {\n _clientPromise = (\n import(\"@google/genai\") as Promise<GoogleGenAIModule>\n ).then(({ GoogleGenAI }) => new GoogleGenAI({ apiKey: config.googleApiKey }));\n }\n return _clientPromise;\n };\n\n const buildGeminiConfig = (opts: {\n maxTokens?: number;\n temperature?: number;\n systemPrompt?: string;\n stopSequences?: readonly string[];\n tools?: readonly { name: string; description: string; inputSchema: Record<string, unknown> }[];\n }) => {\n const cfg: Record<string, unknown> = {\n maxOutputTokens: opts.maxTokens ?? config.defaultMaxTokens,\n temperature: opts.temperature ?? config.defaultTemperature,\n };\n const sys = opts.systemPrompt;\n if (sys) cfg.systemInstruction = sys;\n if (opts.stopSequences?.length) cfg.stopSequences = [...opts.stopSequences];\n if (opts.tools?.length) {\n cfg.tools = toGeminiTools([...opts.tools]);\n }\n return cfg;\n };\n\n return LLMService.of({\n complete: (request) =>\n Effect.gen(function* () {\n const client = yield* Effect.promise(() => getClient());\n let model = typeof request.model === 'string' \n ? request.model \n : request.model?.model ?? config.defaultModel;\n // If using non-Gemini default (e.g., Anthropic), fall back to Gemini default\n if (!model || model.startsWith(\"claude\") || model.startsWith(\"gpt-\")) {\n model = GEMINI_DEFAULT_MODEL;\n }\n const contents = toGeminiContents(request.messages);\n const systemPrompt =\n extractSystemPrompt(request.messages) ?? request.systemPrompt;\n\n const response = yield* Effect.tryPromise({\n try: () =>\n client.models.generateContent({\n model,\n contents,\n config: buildGeminiConfig({\n maxTokens: request.maxTokens,\n temperature: request.temperature,\n systemPrompt,\n stopSequences: request.stopSequences,\n tools: request.tools,\n }),\n }),\n catch: toEffectError,\n });\n\n return mapGeminiResponse(response, model);\n }).pipe(\n Effect.retry(retryPolicy),\n Effect.timeout(\"30 seconds\"),\n Effect.catchTag(\"TimeoutException\", () =>\n Effect.fail(\n new LLMTimeoutError({\n message: \"LLM request timed out\",\n provider: \"gemini\",\n timeoutMs: 30_000,\n }),\n ),\n ),\n ),\n\n stream: (request) =>\n Effect.gen(function* () {\n let model = typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? config.defaultModel;\n // If using non-Gemini default (e.g., Anthropic), fall back to Gemini default\n if (!model || model.startsWith(\"claude\") || model.startsWith(\"gpt-\")) {\n model = GEMINI_DEFAULT_MODEL;\n }\n const contents = toGeminiContents(request.messages);\n const systemPrompt =\n extractSystemPrompt(request.messages) ?? request.systemPrompt;\n\n return Stream.async<StreamEvent, LLMErrors>((emit) => {\n void (async () => {\n try {\n const client = await getClient();\n const stream = await client.models.generateContentStream({\n model,\n contents,\n config: buildGeminiConfig({\n maxTokens: request.maxTokens,\n temperature: request.temperature,\n systemPrompt,\n }),\n });\n\n let fullContent = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n\n for await (const chunk of stream) {\n if (chunk.text) {\n emit.single({ type: \"text_delta\", text: chunk.text });\n fullContent += chunk.text;\n }\n if (chunk.usageMetadata) {\n inputTokens = chunk.usageMetadata.promptTokenCount ?? 0;\n outputTokens =\n chunk.usageMetadata.candidatesTokenCount ?? 0;\n }\n }\n\n emit.single({ type: \"content_complete\", content: fullContent });\n emit.single({\n type: \"usage\",\n usage: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n estimatedCost: calculateCost(inputTokens, outputTokens, model),\n },\n });\n emit.end();\n } catch (error) {\n const err = error as { message?: string };\n emit.fail(\n new LLMError({\n message: err.message ?? String(error),\n provider: \"gemini\",\n cause: error,\n }),\n );\n }\n })();\n });\n }),\n\n completeStructured: (request) =>\n Effect.gen(function* () {\n const schemaStr = JSON.stringify(\n Schema.encodedSchema(request.outputSchema),\n null,\n 2,\n );\n\n const messagesWithFormat: LLMMessage[] = [\n ...request.messages,\n {\n role: \"user\" as const,\n content: `\\nRespond with ONLY valid JSON matching this schema:\\n${schemaStr}\\n\\nNo markdown, no code fences, just raw JSON.`,\n },\n ];\n\n let lastError: unknown = null;\n const maxRetries = request.maxParseRetries ?? 2;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const msgs =\n attempt === 0\n ? messagesWithFormat\n : [\n ...messagesWithFormat,\n {\n role: \"assistant\" as const,\n content: String(lastError),\n },\n {\n role: \"user\" as const,\n content: `That response was not valid JSON. The parse error was: ${String(lastError)}. Please try again with valid JSON only.`,\n },\n ];\n\n const client = yield* Effect.promise(() => getClient());\n let model = typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? config.defaultModel;\n // If using non-Gemini default (e.g., Anthropic), fall back to Gemini default\n if (!model || model.startsWith(\"claude\") || model.startsWith(\"gpt-\")) {\n model = GEMINI_DEFAULT_MODEL;\n }\n\n const response = yield* Effect.tryPromise({\n try: () =>\n client.models.generateContent({\n model,\n contents: toGeminiContents(msgs),\n config: buildGeminiConfig({\n maxTokens: request.maxTokens,\n temperature: request.temperature,\n systemPrompt: request.systemPrompt,\n }),\n }),\n catch: toEffectError,\n });\n\n const mapped = mapGeminiResponse(response, model);\n\n try {\n const parsed = JSON.parse(mapped.content);\n const decoded = Schema.decodeUnknownEither(\n request.outputSchema,\n )(parsed);\n\n if (decoded._tag === \"Right\") {\n return decoded.right;\n }\n lastError = decoded.left;\n } catch (e) {\n lastError = e;\n }\n }\n\n return yield* Effect.fail(\n new LLMParseError({\n message: `Failed to parse structured output after ${maxRetries + 1} attempts`,\n rawOutput: String(lastError),\n expectedSchema: schemaStr,\n }),\n );\n }),\n\n embed: (texts, model) =>\n Effect.tryPromise({\n try: async () => {\n const client = await getClient();\n const embeddingModel = model ?? \"gemini-embedding-001\";\n\n const result = await client.models.embedContent({\n model: embeddingModel,\n contents: [...texts],\n config: {\n outputDimensionality: config.embeddingConfig.dimensions,\n },\n });\n\n return result.embeddings.map((e) => e.values);\n },\n catch: (error) =>\n new LLMError({\n message: `Embedding failed: ${error}`,\n provider: \"gemini\",\n cause: error,\n }),\n }),\n\n countTokens: (messages) =>\n Effect.gen(function* () {\n return yield* estimateTokenCount(messages);\n }),\n\n getModelConfig: () =>\n Effect.succeed({\n provider: \"gemini\" as const,\n model: config.defaultModel,\n }),\n });\n }),\n);\n","import { Effect, Layer, Stream, Schema } from \"effect\";\nimport { LLMService } from \"./llm-service.js\";\nimport type {\n CompletionResponse,\n StreamEvent,\n LLMMessage,\n} from \"./types.js\";\nimport type { LLMErrors } from \"./errors.js\";\n\n/**\n * Create a deterministic test LLM service.\n * Returns responses based on pattern matching against prompt content.\n *\n * Usage:\n * ```ts\n * const layer = TestLLMServiceLayer({\n * \"capital of France\": \"Paris\",\n * \"plan\": '{\"goal\":\"test\",\"steps\":[]}',\n * });\n * ```\n */\nexport const TestLLMService = (\n responses: Record<string, string>,\n): typeof LLMService.Service => ({\n complete: (request) =>\n Effect.gen(function* () {\n const lastMessage = request.messages[request.messages.length - 1];\n const content =\n lastMessage && typeof lastMessage.content === \"string\"\n ? lastMessage.content\n : \"\";\n\n // Also check systemPrompt for pattern matching\n const systemPrompt =\n typeof (request as any).systemPrompt === \"string\"\n ? (request as any).systemPrompt\n : \"\";\n const searchText = `${content} ${systemPrompt}`;\n\n // Match against registered patterns\n for (const [pattern, response] of Object.entries(responses)) {\n if (pattern.length > 0 && searchText.includes(pattern)) {\n return {\n content: response,\n stopReason: \"end_turn\" as const,\n usage: {\n inputTokens: Math.ceil(content.length / 4),\n outputTokens: Math.ceil(response.length / 4),\n totalTokens:\n Math.ceil(content.length / 4) +\n Math.ceil(response.length / 4),\n estimatedCost: 0,\n },\n model: \"test-model\",\n } satisfies CompletionResponse;\n }\n }\n\n // Default response\n return {\n content: \"Test response\",\n stopReason: \"end_turn\" as const,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n estimatedCost: 0,\n },\n model: \"test-model\",\n } satisfies CompletionResponse;\n }),\n\n stream: (_request) =>\n Effect.succeed(\n Stream.make(\n { type: \"text_delta\" as const, text: \"Test \" } satisfies StreamEvent,\n { type: \"text_delta\" as const, text: \"response\" } satisfies StreamEvent,\n {\n type: \"content_complete\" as const,\n content: \"Test response\",\n } satisfies StreamEvent,\n {\n type: \"usage\" as const,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n estimatedCost: 0,\n },\n } satisfies StreamEvent,\n ) as Stream.Stream<StreamEvent, LLMErrors>,\n ),\n\n completeStructured: (request) =>\n Effect.gen(function* () {\n const lastMessage = request.messages[request.messages.length - 1];\n const content =\n lastMessage && typeof lastMessage.content === \"string\"\n ? lastMessage.content\n : \"\";\n\n // Try to find a matching response\n let responseContent = \"Test response\";\n for (const [pattern, response] of Object.entries(responses)) {\n if (content.includes(pattern)) {\n responseContent = response;\n break;\n }\n }\n\n const parsed = JSON.parse(responseContent);\n return Schema.decodeUnknownSync(request.outputSchema)(parsed);\n }),\n\n embed: (texts) =>\n Effect.succeed(\n texts.map(() => new Array(768).fill(0).map(() => Math.random())),\n ),\n\n countTokens: (messages) =>\n Effect.succeed(\n messages.reduce(\n (sum, m) =>\n sum +\n (typeof m.content === \"string\"\n ? Math.ceil(m.content.length / 4)\n : 100),\n 0,\n ),\n ),\n\n getModelConfig: () =>\n Effect.succeed({\n provider: \"anthropic\" as const,\n model: \"test-model\",\n }),\n});\n\n/**\n * Create a test Layer for LLMService with optional pattern-matched responses.\n */\nexport const TestLLMServiceLayer = (\n responses: Record<string, string> = {},\n) => Layer.succeed(LLMService, LLMService.of(TestLLMService(responses)));\n","import { Schema } from \"effect\";\n\n// ─── Common Schemas for Reasoning Strategies ───\n\n/**\n * Schema for ReAct action parsing.\n */\nexport const ReActActionSchema = Schema.Struct({\n thought: Schema.String,\n action: Schema.optional(\n Schema.Struct({\n tool: Schema.String,\n input: Schema.Unknown,\n }),\n ),\n finalAnswer: Schema.optional(Schema.String),\n isComplete: Schema.Boolean,\n});\n\nexport type ReActAction = Schema.Schema.Type<typeof ReActActionSchema>;\n\n/**\n * Schema for plan generation.\n */\nexport const PlanSchema = Schema.Struct({\n goal: Schema.String,\n steps: Schema.Array(\n Schema.Struct({\n id: Schema.Number,\n description: Schema.String,\n tool: Schema.optional(Schema.String),\n dependsOn: Schema.optional(Schema.Array(Schema.Number)),\n estimatedDuration: Schema.optional(Schema.String),\n }),\n ),\n});\n\nexport type Plan = Schema.Schema.Type<typeof PlanSchema>;\n\n/**\n * Schema for reflection output.\n */\nexport const ReflectionSchema = Schema.Struct({\n taskAccomplished: Schema.Boolean,\n confidence: Schema.Number,\n strengths: Schema.Array(Schema.String),\n weaknesses: Schema.Array(Schema.String),\n needsRefinement: Schema.Boolean,\n refinementSuggestions: Schema.optional(Schema.Array(Schema.String)),\n});\n\nexport type Reflection = Schema.Schema.Type<typeof ReflectionSchema>;\n\n/**\n * Schema for strategy selection.\n */\nexport const StrategySelectionSchema = Schema.Struct({\n selectedStrategy: Schema.String,\n reasoning: Schema.String,\n confidence: Schema.Number,\n alternativeStrategies: Schema.Array(\n Schema.Struct({\n strategy: Schema.String,\n whyNot: Schema.String,\n }),\n ),\n});\n\nexport type StrategySelection = Schema.Schema.Type<\n typeof StrategySelectionSchema\n>;\n\n/**\n * Schema for thought evaluation (Tree-of-Thought).\n */\nexport const ThoughtEvaluationSchema = Schema.Struct({\n score: Schema.Number,\n reasoning: Schema.String,\n strengths: Schema.Array(Schema.String),\n weaknesses: Schema.Array(Schema.String),\n shouldExpand: Schema.Boolean,\n});\n\nexport type ThoughtEvaluation = Schema.Schema.Type<\n typeof ThoughtEvaluationSchema\n>;\n\n/**\n * Schema for task complexity analysis.\n */\nexport const ComplexityAnalysisSchema = Schema.Struct({\n score: Schema.Number,\n factors: Schema.Array(\n Schema.Struct({\n factor: Schema.String,\n weight: Schema.Number,\n reasoning: Schema.String,\n }),\n ),\n recommendedStrategy: Schema.String,\n recommendedModel: Schema.String,\n});\n\nexport type ComplexityAnalysis = Schema.Schema.Type<\n typeof ComplexityAnalysisSchema\n>;\n","import { Layer } from \"effect\";\nimport { LLMConfig, LLMConfigFromEnv, llmConfigFromEnv } from \"./llm-config.js\";\nimport { AnthropicProviderLive } from \"./providers/anthropic.js\";\nimport { OpenAIProviderLive } from \"./providers/openai.js\";\nimport { LocalProviderLive } from \"./providers/local.js\";\nimport { GeminiProviderLive } from \"./providers/gemini.js\";\nimport { PromptManagerLive } from \"./prompt-manager.js\";\nimport { TestLLMServiceLayer } from \"./testing.js\";\n\n/**\n * Create the LLM provider layer for a specific provider.\n * Uses env vars for configuration by default.\n */\nexport const createLLMProviderLayer = (\n provider: \"anthropic\" | \"openai\" | \"ollama\" | \"gemini\" | \"test\" = \"anthropic\",\n testResponses?: Record<string, string>,\n model?: string,\n) => {\n if (provider === \"test\") {\n return Layer.mergeAll(\n TestLLMServiceLayer(testResponses ?? {}),\n PromptManagerLive,\n );\n }\n\n const configLayer = model\n ? Layer.succeed(LLMConfig, LLMConfig.of({ ...llmConfigFromEnv, defaultModel: model }))\n : LLMConfigFromEnv;\n\n const providerLayer =\n provider === \"anthropic\"\n ? AnthropicProviderLive\n : provider === \"openai\"\n ? OpenAIProviderLive\n : provider === \"gemini\"\n ? GeminiProviderLive\n : LocalProviderLive;\n\n return Layer.mergeAll(\n providerLayer.pipe(Layer.provide(configLayer)),\n PromptManagerLive,\n );\n};\n\n/**\n * LLM layer with custom config (for programmatic use).\n */\nexport const createLLMProviderLayerWithConfig = (\n config: typeof LLMConfig.Service,\n provider: \"anthropic\" | \"openai\" | \"ollama\" | \"gemini\" = \"anthropic\",\n) => {\n const configLayer = Layer.succeed(LLMConfig, config);\n\n const providerLayer =\n provider === \"anthropic\"\n ? AnthropicProviderLive\n : provider === \"openai\"\n ? OpenAIProviderLive\n : provider === \"gemini\"\n ? GeminiProviderLive\n : LocalProviderLive;\n\n return Layer.mergeAll(\n providerLayer.pipe(Layer.provide(configLayer)),\n PromptManagerLive,\n );\n};\n"],"mappings":"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","names":["Headers","resolve","fetch","__defProp","fetch","Ollama","Context","Effect","Context","Layer","Effect","Context","Layer","Effect","Effect","Layer","Schema","Layer","Effect","Schema","Effect","Layer","Stream","Schema","toEffectError","Layer","Effect","Stream","Schema","Effect","Layer","Stream","Schema","Layer","Effect","Ollama","Stream","Schema","Effect","Layer","Stream","Schema","toEffectError","Layer","Effect","Stream","Schema","Effect","Layer","Stream","Schema","Effect","Stream","Schema","Layer","Schema","Layer","Layer"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/whatwg-fetch/fetch.js","../../../node_modules/ollama/dist/browser.mjs","../../../node_modules/ollama/dist/index.mjs","../src/types.ts","../src/errors.ts","../src/llm-service.ts","../src/llm-config.ts","../src/prompt-manager.ts","../src/token-counter.ts","../src/providers/anthropic.ts","../src/retry.ts","../src/providers/openai.ts","../src/providers/local.ts","../src/providers/gemini.ts","../src/testing.ts","../src/structured-output.ts","../src/runtime.ts"],"sourcesContent":["/* eslint-disable no-prototype-builtins */\nvar g =\n (typeof globalThis !== 'undefined' && globalThis) ||\n (typeof self !== 'undefined' && self) ||\n // eslint-disable-next-line no-undef\n (typeof global !== 'undefined' && global) ||\n {}\n\nvar support = {\n searchParams: 'URLSearchParams' in g,\n iterable: 'Symbol' in g && 'iterator' in Symbol,\n blob:\n 'FileReader' in g &&\n 'Blob' in g &&\n (function() {\n try {\n new Blob()\n return true\n } catch (e) {\n return false\n }\n })(),\n formData: 'FormData' in g,\n arrayBuffer: 'ArrayBuffer' in g\n}\n\nfunction isDataView(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n}\n\nif (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isArrayBufferView =\n ArrayBuffer.isView ||\n function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n}\n\nfunction normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.^_`|~!]/i.test(name) || name === '') {\n throw new TypeError('Invalid character in header field name: \"' + name + '\"')\n }\n return name.toLowerCase()\n}\n\nfunction normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n}\n\n// Build a destructive iterator for the value list\nfunction iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n}\n\nexport function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n if (header.length != 2) {\n throw new TypeError('Headers constructor: expected name/value pair to be length 2, found' + header.length)\n }\n this.append(header[0], header[1])\n }, this)\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n}\n\nHeaders.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue + ', ' + value : value\n}\n\nHeaders.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n}\n\nHeaders.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n}\n\nHeaders.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n}\n\nHeaders.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n}\n\nHeaders.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n}\n\nHeaders.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push(name)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.values = function() {\n var items = []\n this.forEach(function(value) {\n items.push(value)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push([name, value])\n })\n return iteratorFor(items)\n}\n\nif (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n}\n\nfunction consumed(body) {\n if (body._noBody) return\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n}\n\nfunction fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n}\n\nfunction readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n}\n\nfunction readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n var match = /charset=([A-Za-z0-9_-]+)/.exec(blob.type)\n var encoding = match ? match[1] : 'utf-8'\n reader.readAsText(blob, encoding)\n return promise\n}\n\nfunction readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n}\n\nfunction bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n}\n\nfunction Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n /*\n fetch-mock wraps the Response object in an ES6 Proxy to\n provide useful test harness features such as flush. However, on\n ES5 browsers without fetch or Proxy support pollyfills must be used;\n the proxy-pollyfill is unable to proxy an attribute unless it exists\n on the object before the Proxy is created. This change ensures\n Response.bodyUsed exists on the instance, while maintaining the\n semantic of setting Request.bodyUsed in the constructor before\n _initBody is called.\n */\n // eslint-disable-next-line no-self-assign\n this.bodyUsed = this.bodyUsed\n this._bodyInit = body\n if (!body) {\n this._noBody = true;\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n this._bodyText = body = Object.prototype.toString.call(body)\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n var isConsumed = consumed(this)\n if (isConsumed) {\n return isConsumed\n } else if (ArrayBuffer.isView(this._bodyArrayBuffer)) {\n return Promise.resolve(\n this._bodyArrayBuffer.buffer.slice(\n this._bodyArrayBuffer.byteOffset,\n this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength\n )\n )\n } else {\n return Promise.resolve(this._bodyArrayBuffer)\n }\n } else if (support.blob) {\n return this.blob().then(readBlobAsArrayBuffer)\n } else {\n throw new Error('could not read as ArrayBuffer')\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n}\n\n// HTTP methods whose capitalization should be normalized\nvar methods = ['CONNECT', 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'TRACE']\n\nfunction normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return methods.indexOf(upcased) > -1 ? upcased : method\n}\n\nexport function Request(input, options) {\n if (!(this instanceof Request)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n\n options = options || {}\n var body = options.body\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n this.signal = input.signal\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = String(input)\n }\n\n this.credentials = options.credentials || this.credentials || 'same-origin'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.signal = options.signal || this.signal || (function () {\n if ('AbortController' in g) {\n var ctrl = new AbortController();\n return ctrl.signal;\n }\n }());\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n\n if (this.method === 'GET' || this.method === 'HEAD') {\n if (options.cache === 'no-store' || options.cache === 'no-cache') {\n // Search for a '_' parameter in the query string\n var reParamSearch = /([?&])_=[^&]*/\n if (reParamSearch.test(this.url)) {\n // If it already exists then set the value with the current time\n this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime())\n } else {\n // Otherwise add a new '_' parameter to the end with the current time\n var reQueryString = /\\?/\n this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime()\n }\n }\n }\n}\n\nRequest.prototype.clone = function() {\n return new Request(this, {body: this._bodyInit})\n}\n\nfunction decode(body) {\n var form = new FormData()\n body\n .trim()\n .split('&')\n .forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n}\n\nfunction parseHeaders(rawHeaders) {\n var headers = new Headers()\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ')\n // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill\n // https://github.com/github/fetch/issues/748\n // https://github.com/zloirock/core-js/issues/751\n preProcessedHeaders\n .split('\\r')\n .map(function(header) {\n return header.indexOf('\\n') === 0 ? header.substr(1, header.length) : header\n })\n .forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n try {\n headers.append(key, value)\n } catch (error) {\n console.warn('Response ' + error.message)\n }\n }\n })\n return headers\n}\n\nBody.call(Request.prototype)\n\nexport function Response(bodyInit, options) {\n if (!(this instanceof Response)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = options.status === undefined ? 200 : options.status\n if (this.status < 200 || this.status > 599) {\n throw new RangeError(\"Failed to construct 'Response': The status provided (0) is outside the range [200, 599].\")\n }\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = options.statusText === undefined ? '' : '' + options.statusText\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n}\n\nBody.call(Response.prototype)\n\nResponse.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n}\n\nResponse.error = function() {\n var response = new Response(null, {status: 200, statusText: ''})\n response.ok = false\n response.status = 0\n response.type = 'error'\n return response\n}\n\nvar redirectStatuses = [301, 302, 303, 307, 308]\n\nResponse.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n}\n\nexport var DOMException = g.DOMException\ntry {\n new DOMException()\n} catch (err) {\n DOMException = function(message, name) {\n this.message = message\n this.name = name\n var error = Error(message)\n this.stack = error.stack\n }\n DOMException.prototype = Object.create(Error.prototype)\n DOMException.prototype.constructor = DOMException\n}\n\nexport function fetch(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n\n if (request.signal && request.signal.aborted) {\n return reject(new DOMException('Aborted', 'AbortError'))\n }\n\n var xhr = new XMLHttpRequest()\n\n function abortXhr() {\n xhr.abort()\n }\n\n xhr.onload = function() {\n var options = {\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n // This check if specifically for when a user fetches a file locally from the file system\n // Only if the status is out of a normal range\n if (request.url.indexOf('file://') === 0 && (xhr.status < 200 || xhr.status > 599)) {\n options.status = 200;\n } else {\n options.status = xhr.status;\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n setTimeout(function() {\n resolve(new Response(body, options))\n }, 0)\n }\n\n xhr.onerror = function() {\n setTimeout(function() {\n reject(new TypeError('Network request failed'))\n }, 0)\n }\n\n xhr.ontimeout = function() {\n setTimeout(function() {\n reject(new TypeError('Network request timed out'))\n }, 0)\n }\n\n xhr.onabort = function() {\n setTimeout(function() {\n reject(new DOMException('Aborted', 'AbortError'))\n }, 0)\n }\n\n function fixUrl(url) {\n try {\n return url === '' && g.location.href ? g.location.href : url\n } catch (e) {\n return url\n }\n }\n\n xhr.open(request.method, fixUrl(request.url), true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false\n }\n\n if ('responseType' in xhr) {\n if (support.blob) {\n xhr.responseType = 'blob'\n } else if (\n support.arrayBuffer\n ) {\n xhr.responseType = 'arraybuffer'\n }\n }\n\n if (init && typeof init.headers === 'object' && !(init.headers instanceof Headers || (g.Headers && init.headers instanceof g.Headers))) {\n var names = [];\n Object.getOwnPropertyNames(init.headers).forEach(function(name) {\n names.push(normalizeName(name))\n xhr.setRequestHeader(name, normalizeValue(init.headers[name]))\n })\n request.headers.forEach(function(value, name) {\n if (names.indexOf(name) === -1) {\n xhr.setRequestHeader(name, value)\n }\n })\n } else {\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n }\n\n if (request.signal) {\n request.signal.addEventListener('abort', abortXhr)\n\n xhr.onreadystatechange = function() {\n // DONE (success or failure)\n if (xhr.readyState === 4) {\n request.signal.removeEventListener('abort', abortXhr)\n }\n }\n }\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n}\n\nfetch.polyfill = true\n\nif (!g.fetch) {\n g.fetch = fetch\n g.Headers = Headers\n g.Request = Request\n g.Response = Response\n}\n","import 'whatwg-fetch';\n\nconst defaultPort = \"11434\";\nconst defaultHost = `http://127.0.0.1:${defaultPort}`;\n\nconst version = \"0.6.3\";\n\nvar __defProp$1 = Object.defineProperty;\nvar __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField$1 = (obj, key, value) => {\n __defNormalProp$1(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\nclass ResponseError extends Error {\n constructor(error, status_code) {\n super(error);\n this.error = error;\n this.status_code = status_code;\n this.name = \"ResponseError\";\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ResponseError);\n }\n }\n}\nclass AbortableAsyncIterator {\n constructor(abortController, itr, doneCallback) {\n __publicField$1(this, \"abortController\");\n __publicField$1(this, \"itr\");\n __publicField$1(this, \"doneCallback\");\n this.abortController = abortController;\n this.itr = itr;\n this.doneCallback = doneCallback;\n }\n abort() {\n this.abortController.abort();\n }\n async *[Symbol.asyncIterator]() {\n for await (const message of this.itr) {\n if (\"error\" in message) {\n throw new Error(message.error);\n }\n yield message;\n if (message.done || message.status === \"success\") {\n this.doneCallback();\n return;\n }\n }\n throw new Error(\"Did not receive done or success response in stream.\");\n }\n}\nconst checkOk = async (response) => {\n if (response.ok) {\n return;\n }\n let message = `Error ${response.status}: ${response.statusText}`;\n let errorData = null;\n if (response.headers.get(\"content-type\")?.includes(\"application/json\")) {\n try {\n errorData = await response.json();\n message = errorData.error || message;\n } catch (error) {\n console.log(\"Failed to parse error response as JSON\");\n }\n } else {\n try {\n console.log(\"Getting text from response\");\n const textResponse = await response.text();\n message = textResponse || message;\n } catch (error) {\n console.log(\"Failed to get text from error response\");\n }\n }\n throw new ResponseError(message, response.status);\n};\nfunction getPlatform() {\n if (typeof window !== \"undefined\" && window.navigator) {\n const nav = navigator;\n if (\"userAgentData\" in nav && nav.userAgentData?.platform) {\n return `${nav.userAgentData.platform.toLowerCase()} Browser/${navigator.userAgent};`;\n }\n if (navigator.platform) {\n return `${navigator.platform.toLowerCase()} Browser/${navigator.userAgent};`;\n }\n return `unknown Browser/${navigator.userAgent};`;\n } else if (typeof process !== \"undefined\") {\n return `${process.arch} ${process.platform} Node.js/${process.version}`;\n }\n return \"\";\n}\nfunction normalizeHeaders(headers) {\n if (headers instanceof Headers) {\n const obj = {};\n headers.forEach((value, key) => {\n obj[key] = value;\n });\n return obj;\n } else if (Array.isArray(headers)) {\n return Object.fromEntries(headers);\n } else {\n return headers || {};\n }\n}\nconst readEnvVar = (obj, key) => {\n return obj[key];\n};\nconst fetchWithHeaders = async (fetch, url, options = {}) => {\n const defaultHeaders = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"User-Agent\": `ollama-js/${version} (${getPlatform()})`\n };\n options.headers = normalizeHeaders(options.headers);\n try {\n const parsed = new URL(url);\n if (parsed.protocol === \"https:\" && parsed.hostname === \"ollama.com\") {\n const apiKey = typeof process === \"object\" && process !== null && typeof process.env === \"object\" && process.env !== null ? readEnvVar(process.env, \"OLLAMA_API_KEY\") : void 0;\n const authorization = options.headers[\"authorization\"] || options.headers[\"Authorization\"];\n if (!authorization && apiKey) {\n options.headers[\"Authorization\"] = `Bearer ${apiKey}`;\n }\n }\n } catch (error) {\n console.error(\"error parsing url\", error);\n }\n const customHeaders = Object.fromEntries(\n Object.entries(options.headers).filter(\n ([key]) => !Object.keys(defaultHeaders).some(\n (defaultKey) => defaultKey.toLowerCase() === key.toLowerCase()\n )\n )\n );\n options.headers = {\n ...defaultHeaders,\n ...customHeaders\n };\n return fetch(url, options);\n};\nconst get = async (fetch, host, options) => {\n const response = await fetchWithHeaders(fetch, host, {\n headers: options?.headers\n });\n await checkOk(response);\n return response;\n};\nconst post = async (fetch, host, data, options) => {\n const isRecord = (input) => {\n return input !== null && typeof input === \"object\" && !Array.isArray(input);\n };\n const formattedData = isRecord(data) ? JSON.stringify(data) : data;\n const response = await fetchWithHeaders(fetch, host, {\n method: \"POST\",\n body: formattedData,\n signal: options?.signal,\n headers: options?.headers\n });\n await checkOk(response);\n return response;\n};\nconst del = async (fetch, host, data, options) => {\n const response = await fetchWithHeaders(fetch, host, {\n method: \"DELETE\",\n body: JSON.stringify(data),\n headers: options?.headers\n });\n await checkOk(response);\n return response;\n};\nconst parseJSON = async function* (itr) {\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n const reader = itr.getReader();\n while (true) {\n const { done, value: chunk } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(chunk, { stream: true });\n const parts = buffer.split(\"\\n\");\n buffer = parts.pop() ?? \"\";\n for (const part of parts) {\n try {\n yield JSON.parse(part);\n } catch (error) {\n console.warn(\"invalid json: \", part);\n }\n }\n }\n buffer += decoder.decode();\n for (const part of buffer.split(\"\\n\").filter((p) => p !== \"\")) {\n try {\n yield JSON.parse(part);\n } catch (error) {\n console.warn(\"invalid json: \", part);\n }\n }\n};\nconst formatHost = (host) => {\n if (!host) {\n return defaultHost;\n }\n let isExplicitProtocol = host.includes(\"://\");\n if (host.startsWith(\":\")) {\n host = `http://127.0.0.1${host}`;\n isExplicitProtocol = true;\n }\n if (!isExplicitProtocol) {\n host = `http://${host}`;\n }\n const url = new URL(host);\n let port = url.port;\n if (!port) {\n if (!isExplicitProtocol) {\n port = defaultPort;\n } else {\n port = url.protocol === \"https:\" ? \"443\" : \"80\";\n }\n }\n let auth = \"\";\n if (url.username) {\n auth = url.username;\n if (url.password) {\n auth += `:${url.password}`;\n }\n auth += \"@\";\n }\n let formattedHost = `${url.protocol}//${auth}${url.hostname}:${port}${url.pathname}`;\n if (formattedHost.endsWith(\"/\")) {\n formattedHost = formattedHost.slice(0, -1);\n }\n return formattedHost;\n};\n\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => {\n __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\nlet Ollama$1 = class Ollama {\n constructor(config) {\n __publicField(this, \"config\");\n __publicField(this, \"fetch\");\n __publicField(this, \"ongoingStreamedRequests\", []);\n this.config = {\n host: \"\",\n headers: config?.headers\n };\n if (!config?.proxy) {\n this.config.host = formatHost(config?.host ?? defaultHost);\n }\n this.fetch = config?.fetch ?? fetch;\n }\n // Abort any ongoing streamed requests to Ollama\n abort() {\n for (const request of this.ongoingStreamedRequests) {\n request.abort();\n }\n this.ongoingStreamedRequests.length = 0;\n }\n /**\n * Processes a request to the Ollama server. If the request is streamable, it will return a\n * AbortableAsyncIterator that yields the response messages. Otherwise, it will return the response\n * object.\n * @param endpoint {string} - The endpoint to send the request to.\n * @param request {object} - The request object to send to the endpoint.\n * @protected {T | AbortableAsyncIterator<T>} - The response object or a AbortableAsyncIterator that yields\n * response messages.\n * @throws {Error} - If the response body is missing or if the response is an error.\n * @returns {Promise<T | AbortableAsyncIterator<T>>} - The response object or a AbortableAsyncIterator that yields the streamed response.\n */\n async processStreamableRequest(endpoint, request) {\n request.stream = request.stream ?? false;\n const host = `${this.config.host}/api/${endpoint}`;\n if (request.stream) {\n const abortController = new AbortController();\n const response2 = await post(this.fetch, host, request, {\n signal: abortController.signal,\n headers: this.config.headers\n });\n if (!response2.body) {\n throw new Error(\"Missing body\");\n }\n const itr = parseJSON(response2.body);\n const abortableAsyncIterator = new AbortableAsyncIterator(\n abortController,\n itr,\n () => {\n const i = this.ongoingStreamedRequests.indexOf(abortableAsyncIterator);\n if (i > -1) {\n this.ongoingStreamedRequests.splice(i, 1);\n }\n }\n );\n this.ongoingStreamedRequests.push(abortableAsyncIterator);\n return abortableAsyncIterator;\n }\n const response = await post(this.fetch, host, request, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Encodes an image to base64 if it is a Uint8Array.\n * @param image {Uint8Array | string} - The image to encode.\n * @returns {Promise<string>} - The base64 encoded image.\n */\n async encodeImage(image) {\n if (typeof image !== \"string\") {\n const uint8Array = new Uint8Array(image);\n let byteString = \"\";\n const len = uint8Array.byteLength;\n for (let i = 0; i < len; i++) {\n byteString += String.fromCharCode(uint8Array[i]);\n }\n return btoa(byteString);\n }\n return image;\n }\n /**\n * Generates a response from a text prompt.\n * @param request {GenerateRequest} - The request object.\n * @returns {Promise<GenerateResponse | AbortableAsyncIterator<GenerateResponse>>} - The response object or\n * an AbortableAsyncIterator that yields response messages.\n */\n async generate(request) {\n if (request.images) {\n request.images = await Promise.all(request.images.map(this.encodeImage.bind(this)));\n }\n return this.processStreamableRequest(\"generate\", request);\n }\n /**\n * Chats with the model. The request object can contain messages with images that are either\n * Uint8Arrays or base64 encoded strings. The images will be base64 encoded before sending the\n * request.\n * @param request {ChatRequest} - The request object.\n * @returns {Promise<ChatResponse | AbortableAsyncIterator<ChatResponse>>} - The response object or an\n * AbortableAsyncIterator that yields response messages.\n */\n async chat(request) {\n if (request.messages) {\n for (const message of request.messages) {\n if (message.images) {\n message.images = await Promise.all(\n message.images.map(this.encodeImage.bind(this))\n );\n }\n }\n }\n return this.processStreamableRequest(\"chat\", request);\n }\n /**\n * Creates a new model from a stream of data.\n * @param request {CreateRequest} - The request object.\n * @returns {Promise<ProgressResponse | AbortableAsyncIterator<ProgressResponse>>} - The response object or a stream of progress responses.\n */\n async create(request) {\n return this.processStreamableRequest(\"create\", {\n ...request\n });\n }\n /**\n * Pulls a model from the Ollama registry. The request object can contain a stream flag to indicate if the\n * response should be streamed.\n * @param request {PullRequest} - The request object.\n * @returns {Promise<ProgressResponse | AbortableAsyncIterator<ProgressResponse>>} - The response object or\n * an AbortableAsyncIterator that yields response messages.\n */\n async pull(request) {\n return this.processStreamableRequest(\"pull\", {\n name: request.model,\n stream: request.stream,\n insecure: request.insecure\n });\n }\n /**\n * Pushes a model to the Ollama registry. The request object can contain a stream flag to indicate if the\n * response should be streamed.\n * @param request {PushRequest} - The request object.\n * @returns {Promise<ProgressResponse | AbortableAsyncIterator<ProgressResponse>>} - The response object or\n * an AbortableAsyncIterator that yields response messages.\n */\n async push(request) {\n return this.processStreamableRequest(\"push\", {\n name: request.model,\n stream: request.stream,\n insecure: request.insecure\n });\n }\n /**\n * Deletes a model from the server. The request object should contain the name of the model to\n * delete.\n * @param request {DeleteRequest} - The request object.\n * @returns {Promise<StatusResponse>} - The response object.\n */\n async delete(request) {\n await del(\n this.fetch,\n `${this.config.host}/api/delete`,\n { name: request.model },\n { headers: this.config.headers }\n );\n return { status: \"success\" };\n }\n /**\n * Copies a model from one name to another. The request object should contain the name of the\n * model to copy and the new name.\n * @param request {CopyRequest} - The request object.\n * @returns {Promise<StatusResponse>} - The response object.\n */\n async copy(request) {\n await post(this.fetch, `${this.config.host}/api/copy`, { ...request }, {\n headers: this.config.headers\n });\n return { status: \"success\" };\n }\n /**\n * Lists the models on the server.\n * @returns {Promise<ListResponse>} - The response object.\n * @throws {Error} - If the response body is missing.\n */\n async list() {\n const response = await get(this.fetch, `${this.config.host}/api/tags`, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Shows the metadata of a model. The request object should contain the name of the model.\n * @param request {ShowRequest} - The request object.\n * @returns {Promise<ShowResponse>} - The response object.\n */\n async show(request) {\n const response = await post(this.fetch, `${this.config.host}/api/show`, {\n ...request\n }, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Embeds text input into vectors.\n * @param request {EmbedRequest} - The request object.\n * @returns {Promise<EmbedResponse>} - The response object.\n */\n async embed(request) {\n const response = await post(this.fetch, `${this.config.host}/api/embed`, {\n ...request\n }, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Embeds a text prompt into a vector.\n * @param request {EmbeddingsRequest} - The request object.\n * @returns {Promise<EmbeddingsResponse>} - The response object.\n */\n async embeddings(request) {\n const response = await post(this.fetch, `${this.config.host}/api/embeddings`, {\n ...request\n }, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Lists the running models on the server\n * @returns {Promise<ListResponse>} - The response object.\n * @throws {Error} - If the response body is missing.\n */\n async ps() {\n const response = await get(this.fetch, `${this.config.host}/api/ps`, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Returns the Ollama server version.\n * @returns {Promise<VersionResponse>} - The server version object.\n */\n async version() {\n const response = await get(this.fetch, `${this.config.host}/api/version`, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Performs web search using the Ollama web search API\n * @param request {WebSearchRequest} - The search request containing query and options\n * @returns {Promise<WebSearchResponse>} - The search results\n * @throws {Error} - If the request is invalid or the server returns an error\n */\n async webSearch(request) {\n if (!request.query || request.query.length === 0) {\n throw new Error(\"Query is required\");\n }\n const response = await post(this.fetch, `https://ollama.com/api/web_search`, { ...request }, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Fetches a single page using the Ollama web fetch API\n * @param request {WebFetchRequest} - The fetch request containing a URL\n * @returns {Promise<WebFetchResponse>} - The fetch result\n * @throws {Error} - If the request is invalid or the server returns an error\n */\n async webFetch(request) {\n if (!request.url || request.url.length === 0) {\n throw new Error(\"URL is required\");\n }\n const response = await post(this.fetch, `https://ollama.com/api/web_fetch`, { ...request }, { headers: this.config.headers });\n return await response.json();\n }\n};\nconst browser = new Ollama$1();\n\nexport { Ollama$1 as Ollama, browser as default };\n","import fs, { promises } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { Ollama as Ollama$1 } from './browser.mjs';\nimport 'whatwg-fetch';\n\nclass Ollama extends Ollama$1 {\n async encodeImage(image) {\n if (typeof image !== \"string\") {\n return Buffer.from(image).toString(\"base64\");\n }\n try {\n if (fs.existsSync(image)) {\n const fileBuffer = await promises.readFile(resolve(image));\n return Buffer.from(fileBuffer).toString(\"base64\");\n }\n } catch {\n }\n return image;\n }\n /**\n * checks if a file exists\n * @param path {string} - The path to the file\n * @private @internal\n * @returns {Promise<boolean>} - Whether the file exists or not\n */\n async fileExists(path) {\n try {\n await promises.access(path);\n return true;\n } catch {\n return false;\n }\n }\n async create(request) {\n if (request.from && await this.fileExists(resolve(request.from))) {\n throw Error(\"Creating with a local path is not currently supported from ollama-js\");\n }\n if (request.stream) {\n return super.create(request);\n } else {\n return super.create(request);\n }\n }\n}\nconst index = new Ollama();\n\nexport { Ollama, index as default };\n","import { Schema } from \"effect\";\n\n// ─── LLM Provider Type ───\n\nexport const LLMProviderType = Schema.Literal(\n \"anthropic\",\n \"openai\",\n \"ollama\",\n \"gemini\",\n \"custom\",\n);\nexport type LLMProvider = Schema.Schema.Type<typeof LLMProviderType>;\n\n// ─── Embedding Configuration ───\n\nexport const EmbeddingConfigSchema = Schema.Struct({\n model: Schema.String,\n dimensions: Schema.Number,\n provider: Schema.Literal(\"openai\", \"ollama\"),\n batchSize: Schema.optional(Schema.Number),\n});\n\nexport type EmbeddingConfig = Schema.Schema.Type<typeof EmbeddingConfigSchema>;\n\nexport const DefaultEmbeddingConfig: EmbeddingConfig = {\n model: \"text-embedding-3-small\",\n dimensions: 1536,\n provider: \"openai\",\n batchSize: 100,\n};\n\n// ─── Model Configuration ───\n\nexport const ModelConfigSchema = Schema.Struct({\n provider: LLMProviderType,\n model: Schema.String,\n maxTokens: Schema.optional(Schema.Number),\n temperature: Schema.optional(Schema.Number),\n topP: Schema.optional(Schema.Number),\n stopSequences: Schema.optional(Schema.Array(Schema.String)),\n});\n\nexport type ModelConfig = Schema.Schema.Type<typeof ModelConfigSchema>;\n\n// ─── Model Presets ───\n\nexport const ModelPresets = {\n \"claude-haiku\": {\n provider: \"anthropic\" as const,\n model: \"claude-3-5-haiku-20241022\",\n costPer1MInput: 1.0,\n costPer1MOutput: 5.0,\n maxContext: 200_000,\n quality: 0.6,\n },\n \"claude-sonnet\": {\n provider: \"anthropic\" as const,\n model: \"claude-sonnet-4-20250514\",\n costPer1MInput: 3.0,\n costPer1MOutput: 15.0,\n maxContext: 200_000,\n quality: 0.85,\n },\n \"claude-sonnet-4-5\": {\n provider: \"anthropic\" as const,\n model: \"claude-sonnet-4-5-20250929\",\n costPer1MInput: 3.0,\n costPer1MOutput: 15.0,\n maxContext: 200_000,\n quality: 0.9,\n },\n \"claude-opus\": {\n provider: \"anthropic\" as const,\n model: \"claude-opus-4-20250514\",\n costPer1MInput: 15.0,\n costPer1MOutput: 75.0,\n maxContext: 1_000_000,\n quality: 1.0,\n },\n \"gpt-4o-mini\": {\n provider: \"openai\" as const,\n model: \"gpt-4o-mini\",\n costPer1MInput: 0.15,\n costPer1MOutput: 0.6,\n maxContext: 128_000,\n quality: 0.55,\n },\n \"gpt-4o\": {\n provider: \"openai\" as const,\n model: \"gpt-4o\",\n costPer1MInput: 2.5,\n costPer1MOutput: 10.0,\n maxContext: 128_000,\n quality: 0.8,\n },\n \"gemini-2.0-flash\": {\n provider: \"gemini\" as const,\n model: \"gemini-2.0-flash\",\n costPer1MInput: 0.1,\n costPer1MOutput: 0.4,\n maxContext: 1_000_000,\n quality: 0.75,\n },\n \"gemini-2.5-pro\": {\n provider: \"gemini\" as const,\n model: \"gemini-2.5-pro-preview-03-25\",\n costPer1MInput: 1.25,\n costPer1MOutput: 10.0,\n maxContext: 1_000_000,\n quality: 0.95,\n },\n} as const;\n\nexport type ModelPresetName = keyof typeof ModelPresets;\n\n// ─── Cache Control (Anthropic Prompt Caching) ───\n\nexport const CacheControlSchema = Schema.Struct({\n type: Schema.Literal(\"ephemeral\"),\n});\n\nexport type CacheControl = Schema.Schema.Type<typeof CacheControlSchema>;\n\n// ─── Content Blocks ───\n\nexport const ImageSourceSchema = Schema.Struct({\n type: Schema.Literal(\"base64\", \"url\"),\n media_type: Schema.Literal(\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n ),\n data: Schema.String,\n});\n\nexport type ImageSource = Schema.Schema.Type<typeof ImageSourceSchema>;\n\nexport const TextContentBlockSchema = Schema.Struct({\n type: Schema.Literal(\"text\"),\n text: Schema.String,\n cache_control: Schema.optional(CacheControlSchema),\n});\n\nexport const ImageContentBlockSchema = Schema.Struct({\n type: Schema.Literal(\"image\"),\n source: ImageSourceSchema,\n});\n\nexport const ToolUseContentBlockSchema = Schema.Struct({\n type: Schema.Literal(\"tool_use\"),\n id: Schema.String,\n name: Schema.String,\n input: Schema.Unknown,\n});\n\nexport const ToolResultContentBlockSchema = Schema.Struct({\n type: Schema.Literal(\"tool_result\"),\n tool_use_id: Schema.String,\n content: Schema.String,\n});\n\nexport type ContentBlock =\n | {\n readonly type: \"text\";\n readonly text: string;\n readonly cache_control?: CacheControl;\n }\n | { readonly type: \"image\"; readonly source: ImageSource }\n | {\n readonly type: \"tool_use\";\n readonly id: string;\n readonly name: string;\n readonly input: unknown;\n }\n | {\n readonly type: \"tool_result\";\n readonly tool_use_id: string;\n readonly content: string;\n };\n\n// ─── Cacheable Content Block ───\n\nexport type CacheableContentBlock = {\n readonly type: \"text\";\n readonly text: string;\n readonly cache_control: CacheControl;\n};\n\n/**\n * Helper — wrap text in a cacheable content block.\n * Non-Anthropic providers silently ignore `cache_control`.\n */\nexport const makeCacheable = (text: string): CacheableContentBlock => ({\n type: \"text\",\n text,\n cache_control: { type: \"ephemeral\" },\n});\n\n// ─── Message Types ───\n\nexport type LLMMessage =\n | { readonly role: \"system\"; readonly content: string }\n | {\n readonly role: \"user\";\n readonly content: string | readonly ContentBlock[];\n }\n | {\n readonly role: \"assistant\";\n readonly content: string | readonly ContentBlock[];\n }\n | {\n readonly role: \"tool\";\n readonly toolCallId: string;\n readonly content: string;\n };\n\n// ─── Token Usage ───\n\nexport const TokenUsageSchema = Schema.Struct({\n inputTokens: Schema.Number,\n outputTokens: Schema.Number,\n totalTokens: Schema.Number,\n estimatedCost: Schema.Number,\n});\n\nexport type TokenUsage = Schema.Schema.Type<typeof TokenUsageSchema>;\n\n// ─── Stop Reason ───\n\nexport const StopReasonSchema = Schema.Literal(\n \"end_turn\",\n \"max_tokens\",\n \"stop_sequence\",\n \"tool_use\",\n);\n\nexport type StopReason = Schema.Schema.Type<typeof StopReasonSchema>;\n\n// ─── Tool Definition ───\n\nexport const ToolDefinitionSchema = Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n inputSchema: Schema.Record({ key: Schema.String, value: Schema.Unknown }),\n});\n\nexport type ToolDefinition = Schema.Schema.Type<typeof ToolDefinitionSchema>;\n\n// ─── Tool Call ───\n\nexport const ToolCallSchema = Schema.Struct({\n id: Schema.String,\n name: Schema.String,\n input: Schema.Unknown,\n});\n\nexport type ToolCall = Schema.Schema.Type<typeof ToolCallSchema>;\n\n// ─── Completion Request ───\n\nexport type CompletionRequest = {\n readonly messages: readonly LLMMessage[];\n readonly model?: ModelConfig;\n readonly maxTokens?: number;\n readonly temperature?: number;\n readonly stopSequences?: readonly string[];\n readonly tools?: readonly ToolDefinition[];\n readonly systemPrompt?: string;\n};\n\n// ─── Completion Response ───\n\nexport const CompletionResponseSchema = Schema.Struct({\n content: Schema.String,\n stopReason: StopReasonSchema,\n usage: TokenUsageSchema,\n model: Schema.String,\n toolCalls: Schema.optional(Schema.Array(ToolCallSchema)),\n});\n\nexport type CompletionResponse = Schema.Schema.Type<\n typeof CompletionResponseSchema\n>;\n\n// ─── Stream Events ───\n\nexport type StreamEvent =\n | { readonly type: \"text_delta\"; readonly text: string }\n | {\n readonly type: \"tool_use_start\";\n readonly id: string;\n readonly name: string;\n }\n | { readonly type: \"tool_use_delta\"; readonly input: string }\n | { readonly type: \"content_complete\"; readonly content: string }\n | { readonly type: \"usage\"; readonly usage: TokenUsage }\n | { readonly type: \"error\"; readonly error: string };\n\n// ─── Structured Output Config ───\n\nexport type StructuredCompletionRequest<A> = CompletionRequest & {\n readonly outputSchema: Schema.Schema<A>;\n readonly retryOnParseFail?: boolean;\n readonly maxParseRetries?: number;\n};\n\n// ─── Truncation Strategy ───\n\nexport type TruncationStrategy =\n | \"drop-oldest\"\n | \"summarize-middle\"\n | \"sliding-window\"\n | \"importance-based\";\n\n// ─── LLM Request Event ───\n// Emitted after every complete() call for observability consumers.\n\nexport type LLMRequestEvent = {\n /** Unique ID for this request/response pair */\n readonly requestId: string;\n readonly provider: string;\n readonly model: string;\n readonly timestamp: Date;\n readonly durationMs: number;\n /** Token budget consumed */\n readonly systemPromptLength: number;\n readonly messageCount: number;\n readonly toolCount: number;\n readonly response: {\n readonly contentLength: number;\n readonly stopReason: string;\n readonly toolCallCount: number;\n readonly usage: {\n readonly inputTokens: number;\n readonly outputTokens: number;\n readonly totalTokens: number;\n readonly estimatedCost: number;\n };\n };\n /** Full request payload — only present when verbosity = \"full\" */\n readonly fullRequest?: CompletionRequest;\n /** Full response payload — only present when verbosity = \"full\" */\n readonly fullResponse?: CompletionResponse;\n};\n\n// ─── Observability Verbosity ───\n\nexport type ObservabilityVerbosity = \"metadata\" | \"full\";\n","import { Data } from \"effect\";\nimport type { LLMProvider } from \"./types.js\";\n\n/**\n * General LLM error — catch-all for unexpected provider failures.\n */\nexport class LLMError extends Data.TaggedError(\"LLMError\")<{\n readonly message: string;\n readonly provider: LLMProvider;\n readonly cause?: unknown;\n}> {}\n\n/**\n * Rate limit exceeded — includes retry-after hint.\n */\nexport class LLMRateLimitError extends Data.TaggedError(\"LLMRateLimitError\")<{\n readonly message: string;\n readonly provider: LLMProvider;\n readonly retryAfterMs: number;\n}> {}\n\n/**\n * Request timeout.\n */\nexport class LLMTimeoutError extends Data.TaggedError(\"LLMTimeoutError\")<{\n readonly message: string;\n readonly provider: LLMProvider;\n readonly timeoutMs: number;\n}> {}\n\n/**\n * Structured output parse failure.\n */\nexport class LLMParseError extends Data.TaggedError(\"LLMParseError\")<{\n readonly message: string;\n readonly rawOutput: string;\n readonly expectedSchema: string;\n}> {}\n\n/**\n * Context window overflow — too many tokens for the model.\n */\nexport class LLMContextOverflowError extends Data.TaggedError(\n \"LLMContextOverflowError\",\n)<{\n readonly message: string;\n readonly tokenCount: number;\n readonly maxTokens: number;\n}> {}\n\n/**\n * Union of all LLM error types.\n */\nexport type LLMErrors =\n | LLMError\n | LLMRateLimitError\n | LLMTimeoutError\n | LLMParseError\n | LLMContextOverflowError;\n","import { Effect, Context, type Stream } from \"effect\";\nimport type {\n CompletionRequest,\n CompletionResponse,\n StreamEvent,\n StructuredCompletionRequest,\n LLMMessage,\n ModelConfig,\n} from \"./types.js\";\nimport type { LLMErrors } from \"./errors.js\";\n\n/**\n * Core LLM service — all LLM interactions go through this.\n * Layers 3, 4, 5, and 10 depend on this.\n */\nexport class LLMService extends Context.Tag(\"LLMService\")<\n LLMService,\n {\n /**\n * Complete a prompt (non-streaming).\n * Returns full response after generation completes.\n */\n readonly complete: (\n request: CompletionRequest,\n ) => Effect.Effect<CompletionResponse, LLMErrors>;\n\n /**\n * Stream a completion. Returns an Effect that yields a Stream of events.\n * Use for real-time UI updates (collaborative mode).\n */\n readonly stream: (\n request: CompletionRequest,\n ) => Effect.Effect<Stream.Stream<StreamEvent, LLMErrors>, LLMErrors>;\n\n /**\n * Complete with structured output.\n * Parses LLM response into a typed object using Effect Schema.\n * Retries with parse error feedback if parsing fails.\n */\n readonly completeStructured: <A>(\n request: StructuredCompletionRequest<A>,\n ) => Effect.Effect<A, LLMErrors>;\n\n /**\n * Generate embeddings for text.\n *\n * This is the SOLE embedding source for the entire framework.\n * Anthropic has no embeddings API — routes to OpenAI or Ollama\n * per LLMConfig.embeddingConfig.\n */\n readonly embed: (\n texts: readonly string[],\n model?: string,\n ) => Effect.Effect<readonly number[][], LLMErrors>;\n\n /**\n * Count tokens for a set of messages.\n * Used for context window management.\n */\n readonly countTokens: (\n messages: readonly LLMMessage[],\n ) => Effect.Effect<number, LLMErrors>;\n\n /**\n * Get current model configuration.\n */\n readonly getModelConfig: () => Effect.Effect<ModelConfig, never>;\n }\n>() {}\n","import { Context, Layer } from \"effect\";\nimport type { LLMProvider, EmbeddingConfig, ObservabilityVerbosity } from \"./types.js\";\n\n/**\n * LLM configuration — provided via environment or config file.\n */\nexport class LLMConfig extends Context.Tag(\"LLMConfig\")<\n LLMConfig,\n {\n readonly defaultProvider: LLMProvider;\n readonly defaultModel: string;\n readonly anthropicApiKey?: string;\n readonly openaiApiKey?: string;\n readonly googleApiKey?: string;\n readonly ollamaEndpoint?: string;\n /**\n * Embedding configuration. Anthropic has no embeddings API;\n * embeddings route to OpenAI (default) or Ollama.\n * This is the SOLE embedding config for the entire framework.\n */\n readonly embeddingConfig: EmbeddingConfig;\n /**\n * Enable Anthropic prompt caching.\n * When true, memory context injections are wrapped in\n * `cache_control: { type: \"ephemeral\" }` blocks.\n */\n readonly supportsPromptCaching: boolean;\n readonly maxRetries: number;\n readonly timeoutMs: number;\n readonly defaultMaxTokens: number;\n readonly defaultTemperature: number;\n /**\n * LLM request/response observability verbosity.\n * \"full\" captures the complete request and response payloads.\n * \"metadata\" captures only timing/token counts (cheaper for production).\n * Default: \"full\" — always capture everything during development.\n */\n readonly observabilityVerbosity: ObservabilityVerbosity;\n }\n>() {}\n\n/**\n * Raw LLMConfig value from environment variables.\n * Exported so callers can spread overrides (e.g. model) on top.\n */\nexport const llmConfigFromEnv = LLMConfig.of({\n defaultProvider: \"anthropic\",\n defaultModel:\n process.env.LLM_DEFAULT_MODEL ?? \"claude-sonnet-4-20250514\",\n anthropicApiKey: process.env.ANTHROPIC_API_KEY,\n openaiApiKey: process.env.OPENAI_API_KEY,\n googleApiKey: process.env.GOOGLE_API_KEY,\n ollamaEndpoint:\n process.env.OLLAMA_ENDPOINT ?? \"http://localhost:11434\",\n embeddingConfig: {\n model: process.env.EMBEDDING_MODEL ?? \"text-embedding-3-small\",\n dimensions: Number(process.env.EMBEDDING_DIMENSIONS ?? 1536),\n provider:\n (process.env.EMBEDDING_PROVIDER as \"openai\" | \"ollama\") ?? \"openai\",\n batchSize: 100,\n },\n supportsPromptCaching: (\n process.env.LLM_DEFAULT_MODEL ?? \"claude-sonnet-4-20250514\"\n ).startsWith(\"claude\"),\n maxRetries: Number(process.env.LLM_MAX_RETRIES ?? 3),\n timeoutMs: Number(process.env.LLM_TIMEOUT_MS ?? 30_000),\n defaultMaxTokens: 4096,\n defaultTemperature: Number(process.env.LLM_DEFAULT_TEMPERATURE ?? 0.7),\n observabilityVerbosity: (process.env.LLM_OBSERVABILITY_VERBOSITY as ObservabilityVerbosity | undefined) ?? \"full\",\n});\n\n/**\n * Build LLMConfig from environment variables.\n */\nexport const LLMConfigFromEnv = Layer.succeed(LLMConfig, llmConfigFromEnv);\n","import { Effect, Context, Layer } from \"effect\";\nimport type { LLMMessage, TruncationStrategy } from \"./types.js\";\nimport type { LLMErrors } from \"./errors.js\";\nimport { estimateTokenCount } from \"./token-counter.js\";\n\n/**\n * Manages context window budgets.\n * Ensures prompts don't exceed model limits.\n * Implements truncation strategies.\n */\nexport class PromptManager extends Context.Tag(\"PromptManager\")<\n PromptManager,\n {\n /**\n * Build a prompt within token budget.\n * Automatically truncates conversation history if needed.\n */\n readonly buildPrompt: (options: {\n readonly systemPrompt: string;\n readonly messages: readonly LLMMessage[];\n readonly reserveOutputTokens: number;\n readonly maxContextTokens: number;\n readonly truncationStrategy: TruncationStrategy;\n }) => Effect.Effect<readonly LLMMessage[], LLMErrors>;\n\n /**\n * Check if messages fit within context window.\n */\n readonly fitsInContext: (\n messages: readonly LLMMessage[],\n maxTokens: number,\n ) => Effect.Effect<boolean, LLMErrors>;\n }\n>() {}\n\n/**\n * Live PromptManager that uses heuristic token counting\n * and applies truncation strategies.\n */\nexport const PromptManagerLive = Layer.succeed(\n PromptManager,\n PromptManager.of({\n buildPrompt: (options) =>\n Effect.gen(function* () {\n const {\n systemPrompt,\n messages,\n reserveOutputTokens,\n maxContextTokens,\n truncationStrategy,\n } = options;\n\n const budget = maxContextTokens - reserveOutputTokens;\n\n // Always keep the system prompt\n const systemMessage: LLMMessage = {\n role: \"system\",\n content: systemPrompt,\n };\n const systemTokens = yield* estimateTokenCount([systemMessage]);\n\n if (systemTokens >= budget) {\n // System prompt alone exceeds budget — return just it (truncated scenario)\n return [systemMessage];\n }\n\n const remainingBudget = budget - systemTokens;\n\n // Apply truncation strategy\n const truncated = yield* applyTruncation(\n messages,\n remainingBudget,\n truncationStrategy,\n );\n\n return [systemMessage, ...truncated];\n }),\n\n fitsInContext: (messages, maxTokens) =>\n Effect.gen(function* () {\n const count = yield* estimateTokenCount(messages);\n return count <= maxTokens;\n }),\n }),\n);\n\n/**\n * Apply truncation strategy to fit messages within token budget.\n */\nconst applyTruncation = (\n messages: readonly LLMMessage[],\n budget: number,\n strategy: TruncationStrategy,\n): Effect.Effect<readonly LLMMessage[], never> =>\n Effect.gen(function* () {\n const totalTokens = yield* estimateTokenCount(messages);\n\n if (totalTokens <= budget) {\n return messages;\n }\n\n switch (strategy) {\n case \"drop-oldest\": {\n // Remove messages from the beginning until we fit\n const result: LLMMessage[] = [];\n let usedTokens = 0;\n\n // Work backwards — keep most recent messages\n for (let i = messages.length - 1; i >= 0; i--) {\n const msgTokens = yield* estimateTokenCount([messages[i]!]);\n if (usedTokens + msgTokens <= budget) {\n result.unshift(messages[i]!);\n usedTokens += msgTokens;\n } else {\n break;\n }\n }\n return result;\n }\n\n case \"sliding-window\": {\n // Keep last N messages that fit\n const result: LLMMessage[] = [];\n let usedTokens = 0;\n\n for (let i = messages.length - 1; i >= 0; i--) {\n const msgTokens = yield* estimateTokenCount([messages[i]!]);\n if (usedTokens + msgTokens <= budget) {\n result.unshift(messages[i]!);\n usedTokens += msgTokens;\n } else {\n break;\n }\n }\n return result;\n }\n\n case \"summarize-middle\":\n case \"importance-based\":\n // For Phase 1: fall back to sliding-window behavior\n // Full implementation requires LLM calls (circular dependency)\n {\n const result: LLMMessage[] = [];\n let usedTokens = 0;\n\n // Keep first message (often has important context)\n if (messages.length > 0) {\n const firstTokens = yield* estimateTokenCount([messages[0]!]);\n if (firstTokens <= budget) {\n result.push(messages[0]!);\n usedTokens += firstTokens;\n }\n }\n\n // Fill from the end\n const tail: LLMMessage[] = [];\n for (let i = messages.length - 1; i >= 1; i--) {\n const msgTokens = yield* estimateTokenCount([messages[i]!]);\n if (usedTokens + msgTokens <= budget) {\n tail.unshift(messages[i]!);\n usedTokens += msgTokens;\n } else {\n break;\n }\n }\n\n return [...result, ...tail];\n }\n }\n });\n","import { Effect } from \"effect\";\nimport type { LLMMessage } from \"./types.js\";\n\n/**\n * Estimate token count for messages.\n * Uses a simple heuristic: ~4 characters per token for English text.\n * This is used as a fallback when the provider's token counting API is unavailable.\n */\nexport const estimateTokenCount = (\n messages: readonly LLMMessage[],\n): Effect.Effect<number, never> =>\n Effect.sync(() => {\n let totalChars = 0;\n\n for (const msg of messages) {\n if (typeof msg.content === \"string\") {\n totalChars += msg.content.length;\n } else {\n // Content blocks\n for (const block of msg.content) {\n if (block.type === \"text\") {\n totalChars += block.text.length;\n } else if (block.type === \"tool_result\") {\n totalChars += block.content.length;\n } else if (block.type === \"tool_use\") {\n totalChars += JSON.stringify(block.input).length;\n }\n // Images not counted in token estimation\n }\n }\n // Add overhead for role/message framing (~4 tokens per message)\n totalChars += 16;\n }\n\n return Math.ceil(totalChars / 4);\n });\n\n/**\n * Calculate cost in USD given token counts and model name.\n */\nexport const calculateCost = (\n inputTokens: number,\n outputTokens: number,\n model: string,\n): number => {\n // Cost per 1M tokens lookup\n const costMap: Record<string, { input: number; output: number }> = {\n \"claude-3-5-haiku-20241022\": { input: 1.0, output: 5.0 },\n \"claude-sonnet-4-20250514\": { input: 3.0, output: 15.0 },\n \"claude-sonnet-4-5-20250929\": { input: 3.0, output: 15.0 },\n \"claude-opus-4-20250514\": { input: 15.0, output: 75.0 },\n \"gpt-4o-mini\": { input: 0.15, output: 0.6 },\n \"gpt-4o\": { input: 2.5, output: 10.0 },\n \"gemini-2.0-flash\": { input: 0.1, output: 0.4 },\n \"gemini-2.5-pro-preview-03-25\": { input: 1.25, output: 10.0 },\n \"gemini-embedding-001\": { input: 0.0, output: 0.0 },\n };\n\n const costs = costMap[model] ?? { input: 3.0, output: 15.0 };\n return (\n (inputTokens / 1_000_000) * costs.input +\n (outputTokens / 1_000_000) * costs.output\n );\n};\n","import { Effect, Layer, Stream, Schema } from \"effect\";\nimport { LLMService } from \"../llm-service.js\";\nimport { LLMConfig } from \"../llm-config.js\";\nimport {\n LLMError,\n LLMTimeoutError,\n LLMParseError,\n LLMRateLimitError,\n} from \"../errors.js\";\nimport type {\n LLMErrors } from \"../errors.js\";\nimport type {\n CompletionResponse,\n StreamEvent,\n LLMMessage,\n ContentBlock,\n} from \"../types.js\";\nimport { calculateCost, estimateTokenCount } from \"../token-counter.js\";\nimport { retryPolicy } from \"../retry.js\";\n\n// ─── Anthropic Message Conversion Helpers ───\n\ntype AnthropicRole = \"user\" | \"assistant\";\n\ntype AnthropicContentBlock =\n | { type: \"text\"; text: string; cache_control?: { type: \"ephemeral\" } }\n | { type: \"image\"; source: { type: string; media_type: string; data: string } }\n | { type: \"tool_use\"; id: string; name: string; input: unknown }\n | { type: \"tool_result\"; tool_use_id: string; content: string };\n\ntype AnthropicMessage = {\n role: AnthropicRole;\n content: string | AnthropicContentBlock[];\n};\n\nconst toAnthropicMessages = (\n messages: readonly LLMMessage[],\n): AnthropicMessage[] =>\n messages\n .filter((m) => m.role !== \"system\")\n .map((m) => {\n if (m.role === \"tool\") {\n // Convert tool result to Anthropic's tool_result content block format\n return {\n role: \"user\" as AnthropicRole,\n content: [{\n type: \"tool_result\" as const,\n tool_use_id: m.toolCallId,\n content: m.content,\n }] as unknown as AnthropicContentBlock[],\n };\n }\n return {\n role: m.role as AnthropicRole,\n content:\n typeof m.content === \"string\"\n ? m.content\n : (m.content as readonly ContentBlock[]).map(\n (b) => b as unknown as AnthropicContentBlock,\n ),\n };\n });\n\nconst toAnthropicTool = (tool: {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n}) => ({\n name: tool.name,\n description: tool.description,\n input_schema: {\n type: \"object\" as const,\n ...tool.inputSchema,\n },\n});\n\nconst toEffectError = (error: unknown, provider: \"anthropic\"): LLMErrors => {\n const err = error as { status?: number; message?: string; headers?: Record<string, string> };\n if (err.status === 429) {\n const retryAfter = err.headers?.[\"retry-after\"];\n return new LLMRateLimitError({\n message: err.message ?? \"Rate limit exceeded\",\n provider,\n retryAfterMs: retryAfter ? Number(retryAfter) * 1000 : 60_000,\n });\n }\n return new LLMError({\n message: err.message ?? String(error),\n provider,\n cause: error,\n });\n};\n\n// ─── Anthropic Provider Layer ───\n\nexport const AnthropicProviderLive = Layer.effect(\n LLMService,\n Effect.gen(function* () {\n const config = yield* LLMConfig;\n\n // Lazy-load the SDK to avoid hard dependency if not using Anthropic\n const createClient = () => {\n // Dynamic import is handled in Effect.tryPromise\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const Anthropic = require(\"@anthropic-ai/sdk\").default;\n return new Anthropic({ apiKey: config.anthropicApiKey });\n };\n\n let _client: ReturnType<typeof createClient> | null = null;\n const getClient = () => {\n if (!_client) _client = createClient();\n return _client;\n };\n\n return LLMService.of({\n complete: (request) =>\n Effect.gen(function* () {\n const client = getClient();\n const model = typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? config.defaultModel;\n\n const response = yield* Effect.tryPromise({\n try: () =>\n (client as { messages: { create: (opts: unknown) => Promise<unknown> } }).messages.create({\n model,\n max_tokens: request.maxTokens ?? config.defaultMaxTokens,\n temperature: request.temperature ?? config.defaultTemperature,\n system: request.systemPrompt,\n messages: toAnthropicMessages(request.messages),\n stop_sequences: request.stopSequences\n ? [...request.stopSequences]\n : undefined,\n tools: request.tools?.map(toAnthropicTool),\n }),\n catch: (error) => toEffectError(error, \"anthropic\"),\n });\n\n return mapAnthropicResponse(response as AnthropicRawResponse, model);\n }).pipe(\n Effect.retry(retryPolicy),\n Effect.timeout(\"30 seconds\"),\n Effect.catchTag(\"TimeoutException\", () =>\n Effect.fail(\n new LLMTimeoutError({\n message: \"LLM request timed out\",\n provider: \"anthropic\",\n timeoutMs: 30_000,\n }),\n ),\n ),\n ),\n\n stream: (request) =>\n Effect.gen(function* () {\n const client = getClient();\n const model = typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? config.defaultModel;\n\n return Stream.async<StreamEvent, LLMErrors>((emit) => {\n const stream = (client as { messages: { stream: (opts: unknown) => { on: (event: string, cb: (...args: unknown[]) => void) => void } } }).messages.stream({\n model,\n max_tokens: request.maxTokens ?? config.defaultMaxTokens,\n temperature: request.temperature ?? config.defaultTemperature,\n system: request.systemPrompt,\n messages: toAnthropicMessages(request.messages),\n });\n\n stream.on(\"text\", (text: unknown) => {\n emit.single({ type: \"text_delta\", text: text as string });\n });\n\n stream.on(\"finalMessage\", (message: unknown) => {\n const msg = message as AnthropicRawResponse;\n const content = msg.content\n .filter(\n (b: { type: string }): b is { type: \"text\"; text: string } =>\n b.type === \"text\",\n )\n .map((b: { text: string }) => b.text)\n .join(\"\");\n\n emit.single({ type: \"content_complete\", content });\n emit.single({\n type: \"usage\",\n usage: {\n inputTokens: msg.usage.input_tokens,\n outputTokens: msg.usage.output_tokens,\n totalTokens:\n msg.usage.input_tokens + msg.usage.output_tokens,\n estimatedCost: calculateCost(\n msg.usage.input_tokens,\n msg.usage.output_tokens,\n model,\n ),\n },\n });\n emit.end();\n });\n\n stream.on(\"error\", (error: unknown) => {\n const err = error as { message?: string };\n emit.fail(\n new LLMError({\n message: err.message ?? String(error),\n provider: \"anthropic\",\n cause: error,\n }),\n );\n });\n });\n }),\n\n completeStructured: (request) =>\n Effect.gen(function* () {\n const schemaStr = JSON.stringify(\n Schema.encodedSchema(request.outputSchema),\n null,\n 2,\n );\n\n const messagesWithFormat: LLMMessage[] = [\n ...request.messages,\n {\n role: \"user\" as const,\n content: `\\nRespond with ONLY valid JSON matching this schema:\\n${schemaStr}\\n\\nNo markdown, no code fences, just raw JSON.`,\n },\n ];\n\n let lastError: unknown = null;\n const maxRetries = request.maxParseRetries ?? 2;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const msgs =\n attempt === 0\n ? messagesWithFormat\n : [\n ...messagesWithFormat,\n {\n role: \"assistant\" as const,\n content: String(lastError),\n },\n {\n role: \"user\" as const,\n content: `That response was not valid JSON. The parse error was: ${String(lastError)}. Please try again with valid JSON only.`,\n },\n ];\n\n const completeResult = yield* Effect.tryPromise({\n try: () => {\n const client = getClient();\n return (client as { messages: { create: (opts: unknown) => Promise<unknown> } }).messages.create({\n model: typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? config.defaultModel,\n max_tokens:\n request.maxTokens ?? config.defaultMaxTokens,\n temperature: request.temperature ?? config.defaultTemperature,\n system: request.systemPrompt,\n messages: toAnthropicMessages(msgs),\n });\n },\n catch: (error) => toEffectError(error, \"anthropic\"),\n });\n\n const response = mapAnthropicResponse(\n completeResult as AnthropicRawResponse,\n typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? config.defaultModel,\n );\n\n try {\n const parsed = JSON.parse(response.content);\n const decoded = Schema.decodeUnknownEither(\n request.outputSchema,\n )(parsed);\n\n if (decoded._tag === \"Right\") {\n return decoded.right;\n }\n lastError = decoded.left;\n } catch (e) {\n lastError = e;\n }\n }\n\n return yield* Effect.fail(\n new LLMParseError({\n message: `Failed to parse structured output after ${maxRetries + 1} attempts`,\n rawOutput: String(lastError),\n expectedSchema: schemaStr,\n }),\n );\n }),\n\n embed: (texts, model) =>\n Effect.tryPromise({\n try: async () => {\n const embeddingModel = model ?? config.embeddingConfig.model;\n const embProvider = config.embeddingConfig.provider;\n\n if (embProvider === \"openai\") {\n const { default: OpenAI } = await import(\"openai\");\n const openaiClient = new OpenAI({\n apiKey: config.openaiApiKey,\n });\n const batchSize = config.embeddingConfig.batchSize ?? 100;\n const results: number[][] = [];\n\n for (let i = 0; i < texts.length; i += batchSize) {\n const batch = texts.slice(i, i + batchSize);\n const response = await openaiClient.embeddings.create({\n model: embeddingModel,\n input: [...batch],\n dimensions: config.embeddingConfig.dimensions,\n });\n results.push(\n ...response.data.map(\n (d: { embedding: number[] }) => d.embedding,\n ),\n );\n }\n\n return results;\n }\n\n // Ollama embeddings\n const endpoint =\n config.ollamaEndpoint ?? \"http://localhost:11434\";\n return Promise.all(\n [...texts].map(async (text) => {\n const res = await fetch(`${endpoint}/api/embed`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model: embeddingModel,\n input: text,\n }),\n });\n const data = (await res.json()) as {\n embeddings: number[][];\n };\n return data.embeddings[0]!;\n }),\n );\n },\n catch: (error) =>\n new LLMError({\n message: `Embedding failed: ${error}`,\n provider: \"anthropic\",\n cause: error,\n }),\n }),\n\n countTokens: (messages) =>\n Effect.gen(function* () {\n return yield* estimateTokenCount(messages);\n }),\n\n getModelConfig: () =>\n Effect.succeed({\n provider: \"anthropic\" as const,\n model: config.defaultModel,\n }),\n });\n }),\n);\n\n// ─── Anthropic Response Mapping ───\n\ntype AnthropicRawResponse = {\n content: Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: unknown }\n >;\n stop_reason: string;\n usage: { input_tokens: number; output_tokens: number };\n model: string;\n};\n\nconst mapAnthropicResponse = (\n response: AnthropicRawResponse,\n model: string,\n): CompletionResponse => {\n const textContent = response.content\n .filter(\n (b): b is { type: \"text\"; text: string } => b.type === \"text\",\n )\n .map((b) => b.text)\n .join(\"\");\n\n const toolCalls = response.content\n .filter(\n (\n b,\n ): b is {\n type: \"tool_use\";\n id: string;\n name: string;\n input: unknown;\n } => b.type === \"tool_use\",\n )\n .map((b) => ({\n id: b.id,\n name: b.name,\n input: b.input,\n }));\n\n const stopReason =\n response.stop_reason === \"end_turn\"\n ? (\"end_turn\" as const)\n : response.stop_reason === \"max_tokens\"\n ? (\"max_tokens\" as const)\n : response.stop_reason === \"stop_sequence\"\n ? (\"stop_sequence\" as const)\n : response.stop_reason === \"tool_use\"\n ? (\"tool_use\" as const)\n : (\"end_turn\" as const);\n\n return {\n content: textContent,\n stopReason,\n usage: {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n totalTokens:\n response.usage.input_tokens + response.usage.output_tokens,\n estimatedCost: calculateCost(\n response.usage.input_tokens,\n response.usage.output_tokens,\n model,\n ),\n },\n model: response.model ?? model,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n };\n};\n","import { Schedule } from \"effect\";\nimport type { LLMErrors } from \"./errors.js\";\n\n/**\n * Retry policy for LLM calls.\n * Handles rate limits with exponential backoff.\n * Only retries on rate limit and timeout errors.\n */\nexport const retryPolicy = Schedule.intersect(\n Schedule.recurs(3),\n Schedule.exponential(\"1 second\", 2.0),\n).pipe(\n Schedule.whileInput<LLMErrors>(\n (error) =>\n error._tag === \"LLMRateLimitError\" || error._tag === \"LLMTimeoutError\",\n ),\n);\n\n// ─── Circuit Breaker ───\n\nexport type CircuitBreakerConfig = {\n readonly failureThreshold: number;\n readonly cooldownMs: number;\n readonly halfOpenRequests: number;\n};\n\nexport const defaultCircuitBreakerConfig: CircuitBreakerConfig = {\n failureThreshold: 5,\n cooldownMs: 30_000,\n halfOpenRequests: 1,\n};\n","import { Effect, Layer, Stream, Schema } from \"effect\";\nimport { LLMService } from \"../llm-service.js\";\nimport { LLMConfig } from \"../llm-config.js\";\nimport {\n LLMError,\n LLMTimeoutError,\n LLMParseError,\n LLMRateLimitError,\n} from \"../errors.js\";\nimport type { LLMErrors } from \"../errors.js\";\nimport type {\n CompletionResponse,\n StreamEvent,\n LLMMessage,\n ToolDefinition,\n ToolCall,\n} from \"../types.js\";\nimport { calculateCost, estimateTokenCount } from \"../token-counter.js\";\nimport { retryPolicy } from \"../retry.js\";\n\n// ─── OpenAI Message Conversion ───\n\ntype OpenAIMessage =\n | { role: \"system\" | \"user\" | \"assistant\"; content: string }\n | { role: \"tool\"; tool_call_id: string; content: string };\n\nconst toOpenAIMessages = (\n messages: readonly LLMMessage[],\n): OpenAIMessage[] =>\n messages.map((m) => {\n if (m.role === \"tool\") {\n return {\n role: \"tool\" as const,\n tool_call_id: m.toolCallId,\n content: m.content,\n };\n }\n return {\n role: m.role as \"system\" | \"user\" | \"assistant\",\n content:\n typeof m.content === \"string\"\n ? m.content\n : (m.content as readonly { type: string; text?: string }[])\n .filter(\n (b): b is { type: \"text\"; text: string } => b.type === \"text\",\n )\n .map((b) => b.text)\n .join(\"\"),\n };\n });\n\nconst toEffectError = (error: unknown, provider: \"openai\"): LLMErrors => {\n const err = error as { status?: number; message?: string };\n if (err.status === 429) {\n return new LLMRateLimitError({\n message: err.message ?? \"Rate limit exceeded\",\n provider,\n retryAfterMs: 60_000,\n });\n }\n return new LLMError({\n message: err.message ?? String(error),\n provider,\n cause: error,\n });\n};\n\n// ─── OpenAI Tool Conversion ───\n\nconst toOpenAITool = (tool: ToolDefinition) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n});\n\n// ─── OpenAI Provider Layer ───\n\nexport const OpenAIProviderLive = Layer.effect(\n LLMService,\n Effect.gen(function* () {\n const config = yield* LLMConfig;\n\n const createClient = () => {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const OpenAI = require(\"openai\").default;\n return new OpenAI({ apiKey: config.openaiApiKey });\n };\n\n let _client: ReturnType<typeof createClient> | null = null;\n const getClient = () => {\n if (!_client) _client = createClient();\n return _client;\n };\n\n const defaultModel = config.defaultModel.startsWith(\"claude\")\n ? \"gpt-4o\"\n : config.defaultModel;\n\n return LLMService.of({\n complete: (request) =>\n Effect.gen(function* () {\n const client = getClient();\n const model = typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? defaultModel;\n\n const messages = toOpenAIMessages(request.messages);\n if (request.systemPrompt) {\n messages.unshift({ role: \"system\", content: request.systemPrompt });\n }\n\n const requestBody: Record<string, unknown> = {\n model,\n max_tokens: request.maxTokens ?? config.defaultMaxTokens,\n temperature: request.temperature ?? config.defaultTemperature,\n messages,\n stop: request.stopSequences\n ? [...request.stopSequences]\n : undefined,\n };\n\n if (request.tools && request.tools.length > 0) {\n requestBody.tools = request.tools.map(toOpenAITool);\n }\n\n const response = yield* Effect.tryPromise({\n try: () =>\n (client as { chat: { completions: { create: (opts: unknown) => Promise<unknown> } } }).chat.completions.create(requestBody),\n catch: (error) => toEffectError(error, \"openai\"),\n });\n\n return mapOpenAIResponse(response as OpenAIRawResponse, model);\n }).pipe(\n Effect.retry(retryPolicy),\n Effect.timeout(\"30 seconds\"),\n Effect.catchTag(\"TimeoutException\", () =>\n Effect.fail(\n new LLMTimeoutError({\n message: \"LLM request timed out\",\n provider: \"openai\",\n timeoutMs: 30_000,\n }),\n ),\n ),\n ),\n\n stream: (request) =>\n Effect.gen(function* () {\n const client = getClient();\n const model = typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? defaultModel;\n\n return Stream.async<StreamEvent, LLMErrors>((emit) => {\n const doStream = async () => {\n try {\n const stream = await (client as { chat: { completions: { create: (opts: unknown) => Promise<AsyncIterable<unknown>> } } }).chat.completions.create({\n model,\n max_tokens:\n request.maxTokens ?? config.defaultMaxTokens,\n temperature:\n request.temperature ?? config.defaultTemperature,\n messages: (() => {\n const msgs = toOpenAIMessages(request.messages);\n if (request.systemPrompt) {\n msgs.unshift({ role: \"system\", content: request.systemPrompt });\n }\n return msgs;\n })(),\n stream: true,\n });\n\n let fullContent = \"\";\n\n for await (const chunk of stream as AsyncIterable<{\n choices: Array<{\n delta: { content?: string };\n finish_reason?: string;\n }>;\n usage?: { prompt_tokens: number; completion_tokens: number };\n }>) {\n const delta = chunk.choices[0]?.delta?.content;\n if (delta) {\n fullContent += delta;\n emit.single({ type: \"text_delta\", text: delta });\n }\n\n if (chunk.choices[0]?.finish_reason) {\n emit.single({\n type: \"content_complete\",\n content: fullContent,\n });\n\n const inputTokens = chunk.usage?.prompt_tokens ?? 0;\n const outputTokens =\n chunk.usage?.completion_tokens ?? 0;\n emit.single({\n type: \"usage\",\n usage: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n estimatedCost: calculateCost(\n inputTokens,\n outputTokens,\n model,\n ),\n },\n });\n emit.end();\n }\n }\n } catch (error) {\n const err = error as { message?: string };\n emit.fail(\n new LLMError({\n message: err.message ?? String(error),\n provider: \"openai\",\n cause: error,\n }),\n );\n }\n };\n void doStream();\n });\n }),\n\n completeStructured: (request) =>\n Effect.gen(function* () {\n const schemaStr = JSON.stringify(\n Schema.encodedSchema(request.outputSchema),\n null,\n 2,\n );\n\n const messagesWithFormat: LLMMessage[] = [\n ...request.messages,\n {\n role: \"user\" as const,\n content: `\\nRespond with ONLY valid JSON matching this schema:\\n${schemaStr}\\n\\nNo markdown, no code fences, just raw JSON.`,\n },\n ];\n\n let lastError: unknown = null;\n const maxRetries = request.maxParseRetries ?? 2;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const msgs =\n attempt === 0\n ? messagesWithFormat\n : [\n ...messagesWithFormat,\n {\n role: \"assistant\" as const,\n content: String(lastError),\n },\n {\n role: \"user\" as const,\n content: `That response was not valid JSON. The parse error was: ${String(lastError)}. Please try again with valid JSON only.`,\n },\n ];\n\n const client = getClient();\n const completeResult = yield* Effect.tryPromise({\n try: () =>\n (client as { chat: { completions: { create: (opts: unknown) => Promise<unknown> } } }).chat.completions.create({\n model: typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? defaultModel,\n max_tokens:\n request.maxTokens ?? config.defaultMaxTokens,\n temperature:\n request.temperature ?? config.defaultTemperature,\n messages: toOpenAIMessages(msgs),\n }),\n catch: (error) => toEffectError(error, \"openai\"),\n });\n\n const response = mapOpenAIResponse(\n completeResult as OpenAIRawResponse,\n typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? defaultModel,\n );\n\n try {\n const parsed = JSON.parse(response.content);\n const decoded = Schema.decodeUnknownEither(\n request.outputSchema,\n )(parsed);\n\n if (decoded._tag === \"Right\") {\n return decoded.right;\n }\n lastError = decoded.left;\n } catch (e) {\n lastError = e;\n }\n }\n\n return yield* Effect.fail(\n new LLMParseError({\n message: `Failed to parse structured output after ${maxRetries + 1} attempts`,\n rawOutput: String(lastError),\n expectedSchema: schemaStr,\n }),\n );\n }),\n\n embed: (texts, model) =>\n Effect.tryPromise({\n try: async () => {\n const client = getClient();\n const embeddingModel =\n model ?? config.embeddingConfig.model;\n const batchSize = config.embeddingConfig.batchSize ?? 100;\n const results: number[][] = [];\n\n for (let i = 0; i < texts.length; i += batchSize) {\n const batch = texts.slice(i, i + batchSize);\n const response = await (client as { embeddings: { create: (opts: unknown) => Promise<{ data: Array<{ embedding: number[] }> }> } }).embeddings.create({\n model: embeddingModel,\n input: [...batch],\n dimensions: config.embeddingConfig.dimensions,\n });\n results.push(\n ...response.data.map(\n (d: { embedding: number[] }) => d.embedding,\n ),\n );\n }\n\n return results;\n },\n catch: (error) =>\n new LLMError({\n message: `Embedding failed: ${error}`,\n provider: \"openai\",\n cause: error,\n }),\n }),\n\n countTokens: (messages) =>\n Effect.gen(function* () {\n return yield* estimateTokenCount(messages);\n }),\n\n getModelConfig: () =>\n Effect.succeed({\n provider: \"openai\" as const,\n model: defaultModel,\n }),\n });\n }),\n);\n\n// ─── OpenAI Response Mapping ───\n\ntype OpenAIToolCall = {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n};\n\ntype OpenAIRawResponse = {\n choices: Array<{\n message: {\n content: string | null;\n role: string;\n tool_calls?: OpenAIToolCall[];\n };\n finish_reason: string;\n }>;\n usage: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n model: string;\n};\n\nconst mapOpenAIResponse = (\n response: OpenAIRawResponse,\n model: string,\n): CompletionResponse => {\n const message = response.choices[0]?.message;\n const content = message?.content ?? \"\";\n const rawToolCalls = message?.tool_calls;\n\n const hasToolCalls = rawToolCalls && rawToolCalls.length > 0;\n\n const stopReason =\n response.choices[0]?.finish_reason === \"tool_calls\" || hasToolCalls\n ? (\"tool_use\" as const)\n : response.choices[0]?.finish_reason === \"stop\"\n ? (\"end_turn\" as const)\n : response.choices[0]?.finish_reason === \"length\"\n ? (\"max_tokens\" as const)\n : (\"end_turn\" as const);\n\n const toolCalls: ToolCall[] | undefined = hasToolCalls\n ? rawToolCalls.map((tc) => {\n let input: unknown;\n try {\n input = JSON.parse(tc.function.arguments);\n } catch {\n input = { raw: tc.function.arguments };\n }\n return {\n id: tc.id,\n name: tc.function.name,\n input,\n };\n })\n : undefined;\n\n return {\n content,\n stopReason,\n usage: {\n inputTokens: response.usage?.prompt_tokens ?? 0,\n outputTokens: response.usage?.completion_tokens ?? 0,\n totalTokens: response.usage?.total_tokens ?? 0,\n estimatedCost: calculateCost(\n response.usage?.prompt_tokens ?? 0,\n response.usage?.completion_tokens ?? 0,\n model,\n ),\n },\n model: response.model ?? model,\n toolCalls,\n };\n};\n","import { Effect, Layer, Stream, Schema } from \"effect\";\nimport { LLMService } from \"../llm-service.js\";\nimport { LLMConfig } from \"../llm-config.js\";\nimport { LLMError, LLMTimeoutError, LLMParseError } from \"../errors.js\";\nimport type { LLMErrors } from \"../errors.js\";\nimport type {\n CompletionResponse,\n StreamEvent,\n LLMMessage,\n ToolDefinition,\n ToolCall,\n} from \"../types.js\";\nimport { estimateTokenCount } from \"../token-counter.js\";\nimport { retryPolicy } from \"../retry.js\";\n\n// ─── Ollama SDK types (from the `ollama` npm package) ───\n\ntype OllamaTool = {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n};\n\ntype OllamaMessage = {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n};\n\n// ─── Conversion Helpers ───\n\nconst toOllamaMessages = (\n messages: readonly LLMMessage[],\n): OllamaMessage[] =>\n messages\n .filter((m) => m.role !== \"tool\") // Ollama doesn't support tool messages — filter them\n .map((m) => ({\n role: m.role as \"system\" | \"user\" | \"assistant\",\n content:\n typeof m.content === \"string\"\n ? m.content\n : (m.content as readonly { type: string; text?: string }[])\n .filter(\n (b): b is { type: \"text\"; text: string } => b.type === \"text\",\n )\n .map((b) => b.text)\n .join(\"\"),\n }));\n\nconst toOllamaTools = (\n tools?: readonly ToolDefinition[],\n): OllamaTool[] | undefined => {\n if (!tools || tools.length === 0) return undefined;\n return tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema as Record<string, unknown>,\n },\n }));\n};\n\nconst parseToolCalls = (\n toolCalls?: Array<{\n function: { name: string; arguments: unknown };\n }>,\n): ToolCall[] | undefined => {\n if (!toolCalls || toolCalls.length === 0) return undefined;\n return toolCalls.map((tc, i) => ({\n id: `ollama-tc-${Date.now()}-${i}`,\n name: tc.function.name,\n input: tc.function.arguments,\n }));\n};\n\n// ─── Ollama / Local Provider Layer ───\n\nexport const LocalProviderLive = Layer.effect(\n LLMService,\n Effect.gen(function* () {\n const config = yield* LLMConfig;\n const endpoint = config.ollamaEndpoint ?? \"http://localhost:11434\";\n const defaultModel = config.defaultModel.startsWith(\"claude\") ||\n config.defaultModel.startsWith(\"gpt\")\n ? \"llama3\"\n : config.defaultModel;\n\n // Lazy-import the ollama SDK (same pattern as Gemini provider)\n const getClient = async () => {\n const { Ollama } = await import(\"ollama\");\n return new Ollama({ host: endpoint });\n };\n\n return LLMService.of({\n complete: (request) =>\n Effect.gen(function* () {\n const model = typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? defaultModel;\n\n const response = yield* Effect.tryPromise({\n try: async () => {\n const client = await getClient();\n\n const msgs = toOllamaMessages(request.messages);\n if (request.systemPrompt) {\n msgs.unshift({ role: \"system\", content: request.systemPrompt });\n }\n\n return client.chat({\n model,\n messages: msgs,\n tools: toOllamaTools(request.tools),\n stream: false,\n keep_alive: \"5m\",\n options: {\n temperature:\n request.temperature ?? config.defaultTemperature,\n num_predict:\n request.maxTokens ?? config.defaultMaxTokens,\n stop: request.stopSequences\n ? [...request.stopSequences]\n : undefined,\n },\n });\n },\n catch: (error) =>\n new LLMError({\n message: `Ollama request failed: ${error}`,\n provider: \"ollama\",\n cause: error,\n }),\n });\n\n const content = response.message?.content ?? \"\";\n const inputTokens = response.prompt_eval_count ?? 0;\n const outputTokens = response.eval_count ?? 0;\n const toolCalls = parseToolCalls(\n response.message?.tool_calls as Array<{\n function: { name: string; arguments: unknown };\n }> | undefined,\n );\n\n const hasToolCalls = toolCalls && toolCalls.length > 0;\n\n return {\n content,\n stopReason: hasToolCalls\n ? (\"tool_use\" as const)\n : response.done_reason === \"stop\"\n ? (\"end_turn\" as const)\n : response.done_reason === \"length\"\n ? (\"max_tokens\" as const)\n : (\"end_turn\" as const),\n usage: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n estimatedCost: 0, // Local models are free\n },\n model: response.model ?? model,\n toolCalls,\n } satisfies CompletionResponse;\n }).pipe(\n Effect.retry(retryPolicy),\n Effect.timeout(\"120 seconds\"),\n Effect.catchTag(\"TimeoutException\", () =>\n Effect.fail(\n new LLMTimeoutError({\n message: \"Local LLM request timed out\",\n provider: \"ollama\",\n timeoutMs: 120_000,\n }),\n ),\n ),\n ),\n\n stream: (request) =>\n Effect.gen(function* () {\n const model = typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? defaultModel;\n\n return Stream.async<StreamEvent, LLMErrors>((emit) => {\n const doStream = async () => {\n try {\n const client = await getClient();\n\n const msgs = toOllamaMessages(request.messages);\n if (request.systemPrompt) {\n msgs.unshift({ role: \"system\", content: request.systemPrompt });\n }\n\n const stream = await client.chat({\n model,\n messages: msgs,\n tools: toOllamaTools(request.tools),\n stream: true,\n keep_alive: \"5m\",\n options: {\n temperature:\n request.temperature ?? config.defaultTemperature,\n num_predict:\n request.maxTokens ?? config.defaultMaxTokens,\n },\n });\n\n let fullContent = \"\";\n\n for await (const chunk of stream) {\n if (chunk.message?.content) {\n fullContent += chunk.message.content;\n emit.single({\n type: \"text_delta\",\n text: chunk.message.content,\n });\n }\n\n if (chunk.done) {\n emit.single({\n type: \"content_complete\",\n content: fullContent,\n });\n emit.single({\n type: \"usage\",\n usage: {\n inputTokens: chunk.prompt_eval_count ?? 0,\n outputTokens: chunk.eval_count ?? 0,\n totalTokens:\n (chunk.prompt_eval_count ?? 0) +\n (chunk.eval_count ?? 0),\n estimatedCost: 0,\n },\n });\n emit.end();\n }\n }\n } catch (error) {\n const err = error as { message?: string };\n emit.fail(\n new LLMError({\n message: err.message ?? String(error),\n provider: \"ollama\",\n cause: error,\n }),\n );\n }\n };\n void doStream();\n });\n }),\n\n completeStructured: (request) =>\n Effect.gen(function* () {\n const schemaStr = JSON.stringify(\n Schema.encodedSchema(request.outputSchema),\n null,\n 2,\n );\n\n const model = typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? defaultModel;\n\n let lastError: unknown = null;\n const maxRetries = request.maxParseRetries ?? 2;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const msgs = toOllamaMessages(\n attempt === 0\n ? [\n ...request.messages,\n {\n role: \"user\" as const,\n content: `\\nRespond with ONLY valid JSON matching this schema:\\n${schemaStr}\\n\\nNo markdown, no code fences, just raw JSON.`,\n },\n ]\n : [\n ...request.messages,\n {\n role: \"user\" as const,\n content: `\\nRespond with ONLY valid JSON matching this schema:\\n${schemaStr}\\n\\nNo markdown, no code fences, just raw JSON.`,\n },\n {\n role: \"assistant\" as const,\n content: String(lastError),\n },\n {\n role: \"user\" as const,\n content: `That response was not valid JSON. The parse error was: ${String(lastError)}. Please try again with valid JSON only.`,\n },\n ],\n );\n\n if (request.systemPrompt) {\n msgs.unshift({ role: \"system\", content: request.systemPrompt });\n }\n\n const response = yield* Effect.tryPromise({\n try: async () => {\n const client = await getClient();\n return client.chat({\n model,\n messages: msgs,\n stream: false,\n format: \"json\",\n keep_alive: \"5m\",\n options: {\n temperature:\n request.temperature ?? config.defaultTemperature,\n num_predict:\n request.maxTokens ?? config.defaultMaxTokens,\n },\n });\n },\n catch: (error) =>\n new LLMError({\n message: `Ollama request failed: ${error}`,\n provider: \"ollama\",\n cause: error,\n }),\n });\n\n const content = response.message?.content ?? \"\";\n\n try {\n const parsed = JSON.parse(content);\n const decoded = Schema.decodeUnknownEither(\n request.outputSchema,\n )(parsed);\n\n if (decoded._tag === \"Right\") {\n return decoded.right;\n }\n lastError = decoded.left;\n } catch (e) {\n lastError = e;\n }\n }\n\n return yield* Effect.fail(\n new LLMParseError({\n message: `Failed to parse structured output after ${maxRetries + 1} attempts`,\n rawOutput: String(lastError),\n expectedSchema: schemaStr,\n }),\n );\n }),\n\n embed: (texts, model) =>\n Effect.tryPromise({\n try: async () => {\n const client = await getClient();\n const embeddingModel =\n model ?? config.embeddingConfig.model ?? \"nomic-embed-text\";\n\n const response = await client.embed({\n model: embeddingModel,\n input: [...texts],\n });\n\n return response.embeddings;\n },\n catch: (error) =>\n new LLMError({\n message: `Embedding failed: ${error}`,\n provider: \"ollama\",\n cause: error,\n }),\n }),\n\n countTokens: (messages) =>\n Effect.gen(function* () {\n return yield* estimateTokenCount(messages);\n }),\n\n getModelConfig: () =>\n Effect.succeed({\n provider: \"ollama\" as const,\n model: defaultModel,\n }),\n });\n }),\n);\n","import { Effect, Layer, Stream, Schema } from \"effect\";\nimport { LLMService } from \"../llm-service.js\";\nimport { LLMConfig } from \"../llm-config.js\";\nimport {\n LLMError,\n LLMTimeoutError,\n LLMParseError,\n LLMRateLimitError,\n} from \"../errors.js\";\nimport type { LLMErrors } from \"../errors.js\";\nimport type {\n CompletionResponse,\n StreamEvent,\n LLMMessage,\n ContentBlock,\n} from \"../types.js\";\nimport { calculateCost, estimateTokenCount } from \"../token-counter.js\";\nimport { retryPolicy } from \"../retry.js\";\n\n// ─── Gemini Message Conversion Helpers ───\n\ntype GeminiPart =\n | { text: string }\n | { functionCall: { name: string; args: unknown } }\n | { functionResponse: { name: string; response: unknown } };\n\ntype GeminiContent = {\n role: \"user\" | \"model\";\n parts: GeminiPart[];\n};\n\nconst toGeminiContents = (messages: readonly LLMMessage[]): GeminiContent[] => {\n const result: GeminiContent[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") continue; // handled via config.systemInstruction\n\n // Handle tool result messages\n if (msg.role === \"tool\") {\n result.push({\n role: \"user\",\n parts: [{\n functionResponse: {\n name: \"tool\",\n response: { content: msg.content },\n },\n }],\n });\n continue;\n }\n\n const role = msg.role === \"assistant\" ? \"model\" : \"user\";\n\n if (typeof msg.content === \"string\") {\n result.push({ role, parts: [{ text: msg.content }] });\n } else {\n const parts: GeminiPart[] = [];\n for (const block of msg.content as readonly ContentBlock[]) {\n if (block.type === \"text\") {\n parts.push({ text: block.text });\n } else if (block.type === \"tool_use\") {\n parts.push({\n functionCall: { name: block.name, args: block.input },\n });\n } else if (block.type === \"tool_result\") {\n parts.push({\n functionResponse: {\n name: \"tool\",\n response: { content: block.content },\n },\n });\n }\n // images not converted — Gemini multimodal requires separate file URIs\n }\n if (parts.length > 0) {\n result.push({ role, parts });\n }\n }\n }\n\n return result;\n};\n\nconst extractSystemPrompt = (\n messages: readonly LLMMessage[],\n): string | undefined => {\n const sys = messages.find((m) => m.role === \"system\");\n if (!sys) return undefined;\n return typeof sys.content === \"string\" ? sys.content : undefined;\n};\n\nconst toGeminiTools = (\n tools: { name: string; description: string; inputSchema: Record<string, unknown> }[],\n) =>\n tools.length === 0\n ? undefined\n : [\n {\n functionDeclarations: tools.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: { type: \"object\", ...t.inputSchema },\n })),\n },\n ];\n\nconst toEffectError = (error: unknown): LLMErrors => {\n const err = error as { status?: number; code?: number; message?: string };\n if (err.status === 429 || err.code === 429) {\n return new LLMRateLimitError({\n message: err.message ?? \"Rate limit exceeded\",\n provider: \"gemini\",\n retryAfterMs: 60_000,\n });\n }\n return new LLMError({\n message: err.message ?? String(error),\n provider: \"gemini\",\n cause: error,\n });\n};\n\n// ─── Gemini Response Types ───\n\ntype GeminiUsage = {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n};\n\ntype GeminiFunctionCall = { name: string; args: unknown };\n\ntype GeminiRawResponse = {\n text: string;\n functionCalls?: GeminiFunctionCall[];\n usageMetadata?: GeminiUsage;\n};\n\n// ─── Response Mapper ───\n\nconst mapGeminiResponse = (\n response: GeminiRawResponse,\n model: string,\n): CompletionResponse => {\n const toolCalls = response.functionCalls?.map((fc, i) => ({\n id: `call_${i}`,\n name: fc.name,\n input: fc.args,\n }));\n\n const inputTokens = response.usageMetadata?.promptTokenCount ?? 0;\n const outputTokens = response.usageMetadata?.candidatesTokenCount ?? 0;\n\n return {\n content: response.text ?? \"\",\n stopReason: toolCalls?.length ? \"tool_use\" : \"end_turn\",\n usage: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n estimatedCost: calculateCost(inputTokens, outputTokens, model),\n },\n model,\n toolCalls: toolCalls?.length ? toolCalls : undefined,\n };\n};\n\n// ─── Gemini Provider Layer ───\n\nconst GEMINI_DEFAULT_MODEL = \"gemini-2.5-flash\";\n\nexport const GeminiProviderLive = Layer.effect(\n LLMService,\n Effect.gen(function* () {\n const config = yield* LLMConfig;\n\n // ─── Lazy-load the SDK via dynamic import (interceptable by mock.module) ───\n\n type GoogleGenAIClient = {\n models: {\n generateContent: (opts: unknown) => Promise<GeminiRawResponse>;\n generateContentStream: (opts: unknown) => Promise<\n AsyncIterable<{\n text: string;\n usageMetadata?: GeminiUsage;\n }>\n >;\n embedContent: (opts: unknown) => Promise<{\n embeddings: Array<{ values: number[] }>;\n }>;\n };\n };\n\n type GoogleGenAIModule = {\n GoogleGenAI: new (opts: { apiKey?: string }) => GoogleGenAIClient;\n };\n\n let _clientPromise: Promise<GoogleGenAIClient> | null = null;\n const getClient = (): Promise<GoogleGenAIClient> => {\n if (!_clientPromise) {\n _clientPromise = (\n import(\"@google/genai\") as Promise<GoogleGenAIModule>\n ).then(({ GoogleGenAI }) => new GoogleGenAI({ apiKey: config.googleApiKey }));\n }\n return _clientPromise;\n };\n\n const buildGeminiConfig = (opts: {\n maxTokens?: number;\n temperature?: number;\n systemPrompt?: string;\n stopSequences?: readonly string[];\n tools?: readonly { name: string; description: string; inputSchema: Record<string, unknown> }[];\n }) => {\n const cfg: Record<string, unknown> = {\n maxOutputTokens: opts.maxTokens ?? config.defaultMaxTokens,\n temperature: opts.temperature ?? config.defaultTemperature,\n };\n const sys = opts.systemPrompt;\n if (sys) cfg.systemInstruction = sys;\n if (opts.stopSequences?.length) cfg.stopSequences = [...opts.stopSequences];\n if (opts.tools?.length) {\n cfg.tools = toGeminiTools([...opts.tools]);\n }\n return cfg;\n };\n\n return LLMService.of({\n complete: (request) =>\n Effect.gen(function* () {\n const client = yield* Effect.promise(() => getClient());\n let model = typeof request.model === 'string' \n ? request.model \n : request.model?.model ?? config.defaultModel;\n // If using non-Gemini default (e.g., Anthropic), fall back to Gemini default\n if (!model || model.startsWith(\"claude\") || model.startsWith(\"gpt-\")) {\n model = GEMINI_DEFAULT_MODEL;\n }\n const contents = toGeminiContents(request.messages);\n const systemPrompt =\n extractSystemPrompt(request.messages) ?? request.systemPrompt;\n\n const response = yield* Effect.tryPromise({\n try: () =>\n client.models.generateContent({\n model,\n contents,\n config: buildGeminiConfig({\n maxTokens: request.maxTokens,\n temperature: request.temperature,\n systemPrompt,\n stopSequences: request.stopSequences,\n tools: request.tools,\n }),\n }),\n catch: toEffectError,\n });\n\n return mapGeminiResponse(response, model);\n }).pipe(\n Effect.retry(retryPolicy),\n Effect.timeout(\"30 seconds\"),\n Effect.catchTag(\"TimeoutException\", () =>\n Effect.fail(\n new LLMTimeoutError({\n message: \"LLM request timed out\",\n provider: \"gemini\",\n timeoutMs: 30_000,\n }),\n ),\n ),\n ),\n\n stream: (request) =>\n Effect.gen(function* () {\n let model = typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? config.defaultModel;\n // If using non-Gemini default (e.g., Anthropic), fall back to Gemini default\n if (!model || model.startsWith(\"claude\") || model.startsWith(\"gpt-\")) {\n model = GEMINI_DEFAULT_MODEL;\n }\n const contents = toGeminiContents(request.messages);\n const systemPrompt =\n extractSystemPrompt(request.messages) ?? request.systemPrompt;\n\n return Stream.async<StreamEvent, LLMErrors>((emit) => {\n void (async () => {\n try {\n const client = await getClient();\n const stream = await client.models.generateContentStream({\n model,\n contents,\n config: buildGeminiConfig({\n maxTokens: request.maxTokens,\n temperature: request.temperature,\n systemPrompt,\n }),\n });\n\n let fullContent = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n\n for await (const chunk of stream) {\n if (chunk.text) {\n emit.single({ type: \"text_delta\", text: chunk.text });\n fullContent += chunk.text;\n }\n if (chunk.usageMetadata) {\n inputTokens = chunk.usageMetadata.promptTokenCount ?? 0;\n outputTokens =\n chunk.usageMetadata.candidatesTokenCount ?? 0;\n }\n }\n\n emit.single({ type: \"content_complete\", content: fullContent });\n emit.single({\n type: \"usage\",\n usage: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n estimatedCost: calculateCost(inputTokens, outputTokens, model),\n },\n });\n emit.end();\n } catch (error) {\n const err = error as { message?: string };\n emit.fail(\n new LLMError({\n message: err.message ?? String(error),\n provider: \"gemini\",\n cause: error,\n }),\n );\n }\n })();\n });\n }),\n\n completeStructured: (request) =>\n Effect.gen(function* () {\n const schemaStr = JSON.stringify(\n Schema.encodedSchema(request.outputSchema),\n null,\n 2,\n );\n\n const messagesWithFormat: LLMMessage[] = [\n ...request.messages,\n {\n role: \"user\" as const,\n content: `\\nRespond with ONLY valid JSON matching this schema:\\n${schemaStr}\\n\\nNo markdown, no code fences, just raw JSON.`,\n },\n ];\n\n let lastError: unknown = null;\n const maxRetries = request.maxParseRetries ?? 2;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const msgs =\n attempt === 0\n ? messagesWithFormat\n : [\n ...messagesWithFormat,\n {\n role: \"assistant\" as const,\n content: String(lastError),\n },\n {\n role: \"user\" as const,\n content: `That response was not valid JSON. The parse error was: ${String(lastError)}. Please try again with valid JSON only.`,\n },\n ];\n\n const client = yield* Effect.promise(() => getClient());\n let model = typeof request.model === 'string'\n ? request.model\n : request.model?.model ?? config.defaultModel;\n // If using non-Gemini default (e.g., Anthropic), fall back to Gemini default\n if (!model || model.startsWith(\"claude\") || model.startsWith(\"gpt-\")) {\n model = GEMINI_DEFAULT_MODEL;\n }\n\n const response = yield* Effect.tryPromise({\n try: () =>\n client.models.generateContent({\n model,\n contents: toGeminiContents(msgs),\n config: buildGeminiConfig({\n maxTokens: request.maxTokens,\n temperature: request.temperature,\n systemPrompt: request.systemPrompt,\n }),\n }),\n catch: toEffectError,\n });\n\n const mapped = mapGeminiResponse(response, model);\n\n try {\n const parsed = JSON.parse(mapped.content);\n const decoded = Schema.decodeUnknownEither(\n request.outputSchema,\n )(parsed);\n\n if (decoded._tag === \"Right\") {\n return decoded.right;\n }\n lastError = decoded.left;\n } catch (e) {\n lastError = e;\n }\n }\n\n return yield* Effect.fail(\n new LLMParseError({\n message: `Failed to parse structured output after ${maxRetries + 1} attempts`,\n rawOutput: String(lastError),\n expectedSchema: schemaStr,\n }),\n );\n }),\n\n embed: (texts, model) =>\n Effect.tryPromise({\n try: async () => {\n const client = await getClient();\n const embeddingModel = model ?? \"gemini-embedding-001\";\n\n const result = await client.models.embedContent({\n model: embeddingModel,\n contents: [...texts],\n config: {\n outputDimensionality: config.embeddingConfig.dimensions,\n },\n });\n\n return result.embeddings.map((e) => e.values);\n },\n catch: (error) =>\n new LLMError({\n message: `Embedding failed: ${error}`,\n provider: \"gemini\",\n cause: error,\n }),\n }),\n\n countTokens: (messages) =>\n Effect.gen(function* () {\n return yield* estimateTokenCount(messages);\n }),\n\n getModelConfig: () =>\n Effect.succeed({\n provider: \"gemini\" as const,\n model: config.defaultModel,\n }),\n });\n }),\n);\n","import { Effect, Layer, Stream, Schema } from \"effect\";\nimport { LLMService } from \"./llm-service.js\";\nimport type {\n CompletionResponse,\n StreamEvent,\n LLMMessage,\n} from \"./types.js\";\nimport type { LLMErrors } from \"./errors.js\";\n\n/**\n * Create a deterministic test LLM service.\n * Returns responses based on pattern matching against prompt content.\n *\n * Usage:\n * ```ts\n * const layer = TestLLMServiceLayer({\n * \"capital of France\": \"Paris\",\n * \"plan\": '{\"goal\":\"test\",\"steps\":[]}',\n * });\n * ```\n */\nexport const TestLLMService = (\n responses: Record<string, string>,\n): typeof LLMService.Service => ({\n complete: (request) =>\n Effect.gen(function* () {\n const lastMessage = request.messages[request.messages.length - 1];\n const content =\n lastMessage && typeof lastMessage.content === \"string\"\n ? lastMessage.content\n : \"\";\n\n // Also check systemPrompt for pattern matching\n const systemPrompt =\n typeof (request as any).systemPrompt === \"string\"\n ? (request as any).systemPrompt\n : \"\";\n const searchText = `${content} ${systemPrompt}`;\n\n // Match against registered patterns\n for (const [pattern, response] of Object.entries(responses)) {\n if (pattern.length > 0 && searchText.includes(pattern)) {\n return {\n content: response,\n stopReason: \"end_turn\" as const,\n usage: {\n inputTokens: Math.ceil(content.length / 4),\n outputTokens: Math.ceil(response.length / 4),\n totalTokens:\n Math.ceil(content.length / 4) +\n Math.ceil(response.length / 4),\n estimatedCost: 0,\n },\n model: \"test-model\",\n } satisfies CompletionResponse;\n }\n }\n\n // Default response\n return {\n content: \"Test response\",\n stopReason: \"end_turn\" as const,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n estimatedCost: 0,\n },\n model: \"test-model\",\n } satisfies CompletionResponse;\n }),\n\n stream: (_request) =>\n Effect.succeed(\n Stream.make(\n { type: \"text_delta\" as const, text: \"Test \" } satisfies StreamEvent,\n { type: \"text_delta\" as const, text: \"response\" } satisfies StreamEvent,\n {\n type: \"content_complete\" as const,\n content: \"Test response\",\n } satisfies StreamEvent,\n {\n type: \"usage\" as const,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n estimatedCost: 0,\n },\n } satisfies StreamEvent,\n ) as Stream.Stream<StreamEvent, LLMErrors>,\n ),\n\n completeStructured: (request) =>\n Effect.gen(function* () {\n const lastMessage = request.messages[request.messages.length - 1];\n const content =\n lastMessage && typeof lastMessage.content === \"string\"\n ? lastMessage.content\n : \"\";\n\n // Try to find a matching response\n let responseContent = \"Test response\";\n for (const [pattern, response] of Object.entries(responses)) {\n if (content.includes(pattern)) {\n responseContent = response;\n break;\n }\n }\n\n const parsed = JSON.parse(responseContent);\n return Schema.decodeUnknownSync(request.outputSchema)(parsed);\n }),\n\n embed: (texts) =>\n Effect.succeed(\n texts.map(() => new Array(768).fill(0).map(() => Math.random())),\n ),\n\n countTokens: (messages) =>\n Effect.succeed(\n messages.reduce(\n (sum, m) =>\n sum +\n (typeof m.content === \"string\"\n ? Math.ceil(m.content.length / 4)\n : 100),\n 0,\n ),\n ),\n\n getModelConfig: () =>\n Effect.succeed({\n provider: \"anthropic\" as const,\n model: \"test-model\",\n }),\n});\n\n/**\n * Create a test Layer for LLMService with optional pattern-matched responses.\n */\nexport const TestLLMServiceLayer = (\n responses: Record<string, string> = {},\n) => Layer.succeed(LLMService, LLMService.of(TestLLMService(responses)));\n","import { Schema } from \"effect\";\n\n// ─── Common Schemas for Reasoning Strategies ───\n\n/**\n * Schema for ReAct action parsing.\n */\nexport const ReActActionSchema = Schema.Struct({\n thought: Schema.String,\n action: Schema.optional(\n Schema.Struct({\n tool: Schema.String,\n input: Schema.Unknown,\n }),\n ),\n finalAnswer: Schema.optional(Schema.String),\n isComplete: Schema.Boolean,\n});\n\nexport type ReActAction = Schema.Schema.Type<typeof ReActActionSchema>;\n\n/**\n * Schema for plan generation.\n */\nexport const PlanSchema = Schema.Struct({\n goal: Schema.String,\n steps: Schema.Array(\n Schema.Struct({\n id: Schema.Number,\n description: Schema.String,\n tool: Schema.optional(Schema.String),\n dependsOn: Schema.optional(Schema.Array(Schema.Number)),\n estimatedDuration: Schema.optional(Schema.String),\n }),\n ),\n});\n\nexport type Plan = Schema.Schema.Type<typeof PlanSchema>;\n\n/**\n * Schema for reflection output.\n */\nexport const ReflectionSchema = Schema.Struct({\n taskAccomplished: Schema.Boolean,\n confidence: Schema.Number,\n strengths: Schema.Array(Schema.String),\n weaknesses: Schema.Array(Schema.String),\n needsRefinement: Schema.Boolean,\n refinementSuggestions: Schema.optional(Schema.Array(Schema.String)),\n});\n\nexport type Reflection = Schema.Schema.Type<typeof ReflectionSchema>;\n\n/**\n * Schema for strategy selection.\n */\nexport const StrategySelectionSchema = Schema.Struct({\n selectedStrategy: Schema.String,\n reasoning: Schema.String,\n confidence: Schema.Number,\n alternativeStrategies: Schema.Array(\n Schema.Struct({\n strategy: Schema.String,\n whyNot: Schema.String,\n }),\n ),\n});\n\nexport type StrategySelection = Schema.Schema.Type<\n typeof StrategySelectionSchema\n>;\n\n/**\n * Schema for thought evaluation (Tree-of-Thought).\n */\nexport const ThoughtEvaluationSchema = Schema.Struct({\n score: Schema.Number,\n reasoning: Schema.String,\n strengths: Schema.Array(Schema.String),\n weaknesses: Schema.Array(Schema.String),\n shouldExpand: Schema.Boolean,\n});\n\nexport type ThoughtEvaluation = Schema.Schema.Type<\n typeof ThoughtEvaluationSchema\n>;\n\n/**\n * Schema for task complexity analysis.\n */\nexport const ComplexityAnalysisSchema = Schema.Struct({\n score: Schema.Number,\n factors: Schema.Array(\n Schema.Struct({\n factor: Schema.String,\n weight: Schema.Number,\n reasoning: Schema.String,\n }),\n ),\n recommendedStrategy: Schema.String,\n recommendedModel: Schema.String,\n});\n\nexport type ComplexityAnalysis = Schema.Schema.Type<\n typeof ComplexityAnalysisSchema\n>;\n","import { Layer } from \"effect\";\nimport { LLMConfig, LLMConfigFromEnv, llmConfigFromEnv } from \"./llm-config.js\";\nimport { AnthropicProviderLive } from \"./providers/anthropic.js\";\nimport { OpenAIProviderLive } from \"./providers/openai.js\";\nimport { LocalProviderLive } from \"./providers/local.js\";\nimport { GeminiProviderLive } from \"./providers/gemini.js\";\nimport { PromptManagerLive } from \"./prompt-manager.js\";\nimport { TestLLMServiceLayer } from \"./testing.js\";\n\n/**\n * Create the LLM provider layer for a specific provider.\n * Uses env vars for configuration by default.\n */\nexport const createLLMProviderLayer = (\n provider: \"anthropic\" | \"openai\" | \"ollama\" | \"gemini\" | \"test\" = \"anthropic\",\n testResponses?: Record<string, string>,\n model?: string,\n) => {\n if (provider === \"test\") {\n return Layer.mergeAll(\n TestLLMServiceLayer(testResponses ?? {}),\n PromptManagerLive,\n );\n }\n\n const configLayer = model\n ? Layer.succeed(LLMConfig, LLMConfig.of({ ...llmConfigFromEnv, defaultModel: model }))\n : LLMConfigFromEnv;\n\n const providerLayer =\n provider === \"anthropic\"\n ? AnthropicProviderLive\n : provider === \"openai\"\n ? OpenAIProviderLive\n : provider === \"gemini\"\n ? GeminiProviderLive\n : LocalProviderLive;\n\n return Layer.mergeAll(\n providerLayer.pipe(Layer.provide(configLayer)),\n PromptManagerLive,\n );\n};\n\n/**\n * LLM layer with custom config (for programmatic use).\n */\nexport const createLLMProviderLayerWithConfig = (\n config: typeof LLMConfig.Service,\n provider: \"anthropic\" | \"openai\" | \"ollama\" | \"gemini\" = \"anthropic\",\n) => {\n const configLayer = Layer.succeed(LLMConfig, config);\n\n const providerLayer =\n provider === \"anthropic\"\n ? AnthropicProviderLive\n : provider === \"openai\"\n ? OpenAIProviderLive\n : provider === \"gemini\"\n ? GeminiProviderLive\n : LocalProviderLive;\n\n return Layer.mergeAll(\n providerLayer.pipe(Layer.provide(configLayer)),\n PromptManagerLive,\n );\n};\n"],"mappings":"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","names":["Headers","resolve","fetch","__defProp","fetch","Ollama","Context","Effect","Context","Layer","Effect","Context","Layer","Effect","Effect","Layer","Schema","Layer","Effect","Schema","Effect","Layer","Stream","Schema","toEffectError","Layer","Effect","Stream","Schema","Effect","Layer","Stream","Schema","Layer","Effect","Ollama","Stream","Schema","Effect","Layer","Stream","Schema","toEffectError","Layer","Effect","Stream","Schema","Effect","Layer","Stream","Schema","Effect","Stream","Schema","Layer","Schema","Layer","Layer"]}
|