@jaex/dstsx 0.1.0 → 0.1.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/signatures/Field.ts","../src/signatures/Signature.ts","../src/primitives/Example.ts","../src/primitives/Prediction.ts","../src/primitives/majority.ts","../src/primitives/Image.ts","../src/lm/cache.ts","../src/lm/DiskCache.ts","../src/lm/LM.ts","../src/lm/adapters/OpenAI.ts","../src/lm/adapters/Anthropic.ts","../src/lm/adapters/Cohere.ts","../src/lm/adapters/GoogleAI.ts","../src/lm/adapters/Ollama.ts","../src/lm/adapters/LMStudio.ts","../src/lm/adapters/HuggingFace.ts","../src/lm/adapters/MockLM.ts","../src/modules/Module.ts","../src/settings/Settings.ts","../src/modules/Predict.ts","../src/modules/ChainOfThought.ts","../src/modules/ChainOfThoughtWithHint.ts","../src/modules/MultiChainComparison.ts","../src/modules/ReAct.ts","../src/modules/ProgramOfThought.ts","../src/modules/Retrieve.ts","../src/assertions/Assert.ts","../src/assertions/Suggest.ts","../src/modules/Retry.ts","../src/modules/BestOfN.ts","../src/modules/Ensemble.ts","../src/modules/TypedPredictor.ts","../src/modules/Parallel.ts","../src/modules/Refine.ts","../src/modules/NativeReAct.ts","../src/retrieve/Retriever.ts","../src/retrieve/backends/ColBERTv2.ts","../src/retrieve/backends/PineconeRM.ts","../src/retrieve/backends/WeaviateRM.ts","../src/retrieve/backends/ChromadbRM.ts","../src/retrieve/backends/QdrantRM.ts","../src/retrieve/backends/FaissRM.ts","../src/retrieve/backends/YouRM.ts","../src/retrieve/backends/MockRetriever.ts","../src/optimizers/Optimizer.ts","../src/optimizers/LabeledFewShot.ts","../src/optimizers/BootstrapFewShot.ts","../src/evaluate/evaluate.ts","../src/evaluate/metrics.ts","../src/optimizers/BootstrapFewShotWithRandomSearch.ts","../src/optimizers/BootstrapFewShotWithOptuna.ts","../src/optimizers/COPRO.ts","../src/optimizers/MIPRO.ts","../src/optimizers/KNNFewShot.ts","../src/optimizers/Ensemble.ts","../src/optimizers/BootstrapFinetune.ts","../src/optimizers/GRPO.ts","../src/optimizers/SIMBA.ts","../src/optimizers/AvatarOptimizer.ts","../src/mcp/MCPAdapter.ts","../src/mcp/DSTsxMCPServer.ts","../src/tracking/Tracker.ts","../src/tracking/ConsoleTracker.ts","../src/tracking/JsonFileTracker.ts"],"sourcesContent":["// DSTsx — public barrel export\n// Re-exports every public symbol from all sub-modules.\n\nexport * from \"./signatures/index.js\";\nexport * from \"./primitives/index.js\";\nexport * from \"./lm/index.js\";\nexport * from \"./modules/index.js\";\nexport * from \"./retrieve/index.js\";\nexport * from \"./optimizers/index.js\";\nexport * from \"./evaluate/index.js\";\nexport * from \"./assertions/index.js\";\nexport * from \"./settings/index.js\";\nexport * from \"./mcp/index.js\";\nexport * from \"./tracking/index.js\";\n","import type { FieldMeta } from \"./types.js\";\n\n/**\n * Creates an input field descriptor for a {@link Signature}.\n *\n * @example\n * ```ts\n * const sig = new Signature({\n * inputs: new Map([[\"question\", InputField({ description: \"The question to answer\" })]]),\n * outputs: new Map([[\"answer\", OutputField({ description: \"A concise answer\" })]]),\n * });\n * ```\n */\nexport function InputField(meta: FieldMeta = {}): FieldMeta {\n return { type: \"string\", ...meta };\n}\n\n/**\n * Creates an output field descriptor for a {@link Signature}.\n */\nexport function OutputField(meta: FieldMeta = {}): FieldMeta {\n return { type: \"string\", ...meta };\n}\n","import type { FieldMeta, SignatureMeta } from \"./types.js\";\nimport { InputField, OutputField } from \"./Field.js\";\n\n/**\n * A Signature defines the typed interface (inputs and outputs) for a single\n * language-model call. It mirrors `dspy.Signature` in the Python library.\n *\n * Signatures can be created from a shorthand string:\n * ```ts\n * const sig = Signature.from(\"question -> answer\");\n * const sig2 = Signature.from(\"context, question -> answer, confidence\");\n * ```\n *\n * Or constructed explicitly:\n * ```ts\n * const sig = new Signature({\n * inputs: new Map([[\"question\", InputField({ description: \"The question\" })]]),\n * outputs: new Map([[\"answer\", OutputField({ description: \"The answer\" })]]),\n * instructions: \"Answer concisely.\",\n * });\n * ```\n */\nexport class Signature {\n readonly inputs: ReadonlyMap<string, FieldMeta>;\n readonly outputs: ReadonlyMap<string, FieldMeta>;\n readonly instructions: string | undefined;\n\n constructor(meta: SignatureMeta) {\n this.inputs = meta.inputs;\n this.outputs = meta.outputs;\n this.instructions = meta.instructions;\n }\n\n // ---------------------------------------------------------------------------\n // Factory helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Parse a shorthand signature string of the form:\n * `\"field1, field2? -> out1, out2\"`\n *\n * A trailing `?` marks the field as optional.\n */\n static from(shorthand: string, instructions?: string): Signature {\n const [inputPart, outputPart] = shorthand.split(\"->\").map((s) => s.trim());\n if (outputPart === undefined) {\n throw new Error(\n `Invalid signature shorthand \"${shorthand}\". Expected \"inputs -> outputs\".`,\n );\n }\n\n const parseFields = (part: string): Map<string, FieldMeta> => {\n const map = new Map<string, FieldMeta>();\n for (const raw of part.split(\",\")) {\n const trimmed = raw.trim();\n const isOptional = trimmed.endsWith(\"?\");\n const name = trimmed.replace(/\\?$/, \"\");\n if (name.length === 0) continue;\n map.set(name, InputField(isOptional ? { optional: true } : {}));\n }\n return map;\n };\n\n const inputs = parseFields(inputPart ?? \"\");\n const outputs = parseFields(outputPart);\n\n // Re-tag output fields using OutputField so callers can distinguish them.\n for (const [key, val] of outputs) {\n outputs.set(key, OutputField(val));\n }\n\n return new Signature({ inputs, outputs, instructions });\n }\n\n // ---------------------------------------------------------------------------\n // Mutation helpers (return new Signature; never mutates)\n // ---------------------------------------------------------------------------\n\n /**\n * Return a new Signature with additional or overridden fields / instructions.\n */\n with(overrides: Partial<SignatureMeta>): Signature {\n return new Signature({\n inputs: overrides.inputs ?? new Map(this.inputs),\n outputs: overrides.outputs ?? new Map(this.outputs),\n instructions: overrides.instructions ?? this.instructions,\n });\n }\n\n /**\n * Append an extra input field and return a new Signature.\n */\n withInput(name: string, meta: FieldMeta = {}): Signature {\n const inputs = new Map(this.inputs);\n inputs.set(name, InputField(meta));\n return this.with({ inputs });\n }\n\n /**\n * Append an extra output field and return a new Signature.\n */\n withOutput(name: string, meta: FieldMeta = {}): Signature {\n const outputs = new Map(this.outputs);\n outputs.set(name, OutputField(meta));\n return this.with({ outputs });\n }\n\n // ---------------------------------------------------------------------------\n // Serialization\n // ---------------------------------------------------------------------------\n\n toJSON(): object {\n return {\n inputs: Object.fromEntries(this.inputs),\n outputs: Object.fromEntries(this.outputs),\n instructions: this.instructions,\n };\n }\n\n static fromJSON(json: Record<string, unknown>): Signature {\n const toMap = (obj: unknown): Map<string, FieldMeta> => {\n if (typeof obj !== \"object\" || obj === null) return new Map();\n return new Map(Object.entries(obj as Record<string, FieldMeta>));\n };\n return new Signature({\n inputs: toMap(json[\"inputs\"]),\n outputs: toMap(json[\"outputs\"]),\n instructions:\n typeof json[\"instructions\"] === \"string\" ? json[\"instructions\"] : undefined,\n });\n }\n}\n","/**\n * An immutable record of named values used as a training example or a module\n * input. Mirrors `dspy.Example` in Python.\n *\n * @example\n * ```ts\n * const ex = new Example({ question: \"What is 2+2?\", answer: \"4\" });\n * const withLabel = ex.with({ answer: \"four\" });\n * ```\n */\nexport class Example {\n readonly #data: Readonly<Record<string, unknown>>;\n\n constructor(data: Record<string, unknown>) {\n this.#data = Object.freeze({ ...data });\n }\n\n /** Return the value for `key`, or `undefined` if absent. */\n get(key: string): unknown {\n return this.#data[key];\n }\n\n /** Return a shallow-frozen copy of the underlying data record. */\n toDict(): Readonly<Record<string, unknown>> {\n return this.#data;\n }\n\n /**\n * Return a new Example with the provided key-value pairs merged in.\n */\n with(overrides: Record<string, unknown>): Example {\n return new Example({ ...this.#data, ...overrides });\n }\n\n /**\n * Return a new Example containing only the keys listed in `keys`.\n */\n inputs(keys: string[]): Example {\n return new Example(\n Object.fromEntries(keys.filter((k) => k in this.#data).map((k) => [k, this.#data[k]])),\n );\n }\n\n /**\n * Return a new Example containing only the keys NOT listed in `inputKeys`\n * (i.e. the label / output keys).\n */\n labels(inputKeys: string[]): Example {\n return new Example(\n Object.fromEntries(\n Object.entries(this.#data).filter(([k]) => !inputKeys.includes(k)),\n ),\n );\n }\n\n // ---------------------------------------------------------------------------\n // Serialization\n // ---------------------------------------------------------------------------\n\n toJSON(): Record<string, unknown> {\n return { ...this.#data };\n }\n\n static fromDict(data: Record<string, unknown>): Example {\n return new Example(data);\n }\n}\n","import { Example } from \"./Example.js\";\n\n/**\n * The output of a {@link Predict} (or any module) call.\n * Extends {@link Example} by adding `completions` for multi-output calls.\n *\n * Mirrors `dspy.Prediction` in Python.\n */\nexport class Prediction extends Example {\n /** All candidate completions when `n > 1` was requested. */\n readonly completions: ReadonlyArray<Record<string, unknown>>;\n\n constructor(data: Record<string, unknown>, completions: Record<string, unknown>[] = []) {\n super(data);\n this.completions = Object.freeze([...completions]);\n }\n\n /** Typed accessor — casts the value to `T` (caller is responsible for type safety). */\n getTyped<T>(key: string): T {\n return this.get(key) as T;\n }\n\n // ---------------------------------------------------------------------------\n // Serialization\n // ---------------------------------------------------------------------------\n\n override toJSON(): Record<string, unknown> {\n return {\n ...super.toJSON(),\n completions: this.completions,\n };\n }\n}\n","import type { Prediction } from \"./Prediction.js\";\n\n/**\n * Returns a reducer function that picks the Prediction whose `field` value\n * appears most frequently. Ties go to the first occurrence.\n */\nexport function majority(field = \"answer\"): (predictions: Prediction[]) => Prediction {\n return (predictions: Prediction[]): Prediction => {\n if (predictions.length === 0) {\n throw new Error(\"majority: empty predictions array\");\n }\n\n const counts = new Map<string, number>();\n for (const p of predictions) {\n const val = JSON.stringify(p.get(field));\n counts.set(val, (counts.get(val) ?? 0) + 1);\n }\n\n let bestKey = \"\";\n let bestCount = 0;\n for (const [k, c] of counts) {\n if (c > bestCount) {\n bestCount = c;\n bestKey = k;\n }\n }\n\n return predictions.find((p) => JSON.stringify(p.get(field)) === bestKey)!;\n };\n}\n","import { readFileSync } from \"node:fs\";\n\n/** Supported image MIME types. */\nexport type ImageMimeType = \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n\n/**\n * A multi-modal image value that can be passed as a field in Predict/TypedPredictor.\n *\n * @example\n * ```ts\n * const captioner = new Predict(\"image, question -> caption\");\n * const result = await captioner.forward({\n * image: Image.fromURL(\"https://example.com/photo.jpg\"),\n * question: \"What is in this image?\",\n * });\n * ```\n */\nexport class Image {\n readonly url: string | undefined;\n readonly base64: string | undefined;\n readonly mimeType: ImageMimeType | undefined;\n\n private constructor(init: {\n url?: string | undefined;\n base64?: string | undefined;\n mimeType?: ImageMimeType | undefined;\n }) {\n this.url = init.url;\n this.base64 = init.base64;\n this.mimeType = init.mimeType;\n }\n\n /** Create an Image from a URL. */\n static fromURL(url: string): Image {\n return new Image({ url });\n }\n\n /** Create an Image from base64-encoded data. */\n static fromBase64(data: string, mimeType: ImageMimeType = \"image/jpeg\"): Image {\n return new Image({ base64: data, mimeType });\n }\n\n /** Create an Image by reading a local file synchronously. */\n static fromFile(path: string, mimeType?: ImageMimeType): Image {\n const data = readFileSync(path);\n const base64 = data.toString(\"base64\");\n const ext = path.split(\".\").pop()?.toLowerCase();\n const detectedMime: ImageMimeType =\n ext === \"png\" ? \"image/png\" :\n ext === \"gif\" ? \"image/gif\" :\n ext === \"webp\" ? \"image/webp\" :\n \"image/jpeg\";\n return new Image({ base64, mimeType: mimeType ?? detectedMime });\n }\n\n /** Serialize to an OpenAI-compatible image_url content part. */\n toOpenAIContentPart(): { type: \"image_url\"; image_url: { url: string } } {\n if (this.url) {\n return { type: \"image_url\", image_url: { url: this.url } };\n }\n if (this.base64 && this.mimeType) {\n return { type: \"image_url\", image_url: { url: `data:${this.mimeType};base64,${this.base64}` } };\n }\n throw new Error(\"Image: no url or base64 data available\");\n }\n\n /** Serialize to an Anthropic-compatible image content block. */\n toAnthropicContentBlock(): {\n type: \"image\";\n source: { type: \"base64\" | \"url\"; media_type?: string; data?: string; url?: string };\n } {\n if (this.url) {\n return { type: \"image\", source: { type: \"url\", url: this.url } };\n }\n if (this.base64 && this.mimeType) {\n return { type: \"image\", source: { type: \"base64\", media_type: this.mimeType, data: this.base64 } };\n }\n throw new Error(\"Image: no url or base64 data available\");\n }\n\n /** Returns a string representation (used when Image is serialized in prompts). */\n toString(): string {\n if (this.url) return `[Image: ${this.url}]`;\n if (this.base64) return `[Image: base64 data, ${this.mimeType ?? \"unknown type\"}]`;\n return \"[Image]\";\n }\n}\n","/**\n * A minimal LRU (Least Recently Used) cache used to memoize LM responses.\n *\n * Entries are evicted when `maxSize` is reached (oldest-first) or when their\n * TTL has expired.\n */\nexport class LRUCache<K, V> {\n readonly #maxSize: number;\n readonly #ttlMs: number;\n readonly #map = new Map<K, { value: V; expiresAt: number }>();\n\n constructor(maxSize = 512, ttlMs = 60_000 * 60) {\n this.#maxSize = maxSize;\n this.#ttlMs = ttlMs;\n }\n\n get(key: K): V | undefined {\n const entry = this.#map.get(key);\n if (!entry) return undefined;\n if (Date.now() > entry.expiresAt) {\n this.#map.delete(key);\n return undefined;\n }\n // Re-insert to mark as recently used.\n this.#map.delete(key);\n this.#map.set(key, entry);\n return entry.value;\n }\n\n set(key: K, value: V): void {\n if (this.#map.has(key)) this.#map.delete(key);\n else if (this.#map.size >= this.#maxSize) {\n // Evict the oldest entry (first inserted = first in Map iteration order).\n const oldest = this.#map.keys().next().value;\n if (oldest !== undefined) this.#map.delete(oldest);\n }\n this.#map.set(key, { value, expiresAt: Date.now() + this.#ttlMs });\n }\n\n has(key: K): boolean {\n return this.get(key) !== undefined;\n }\n\n delete(key: K): void {\n this.#map.delete(key);\n }\n\n clear(): void {\n this.#map.clear();\n }\n\n get size(): number {\n return this.#map.size;\n }\n}\n","import { createHash } from \"node:crypto\";\nimport {\n readFileSync,\n writeFileSync,\n readdirSync,\n unlinkSync,\n mkdirSync,\n statSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { LMResponse } from \"./types.js\";\n\ninterface CacheEntry {\n key: string;\n value: LMResponse;\n expiresAt: number | null;\n}\n\n/**\n * Disk-persistent JSON cache for LM responses.\n *\n * Cache entries are stored as individual JSON files named by a truncated\n * SHA-256 hash of the key. Supports optional TTL and LRU eviction.\n */\nexport class DiskCache {\n readonly #cacheDir: string;\n readonly #maxSize: number;\n readonly #ttlMs: number | undefined;\n\n constructor(cacheDir: string, maxSize = 500, ttlMs?: number) {\n this.#cacheDir = cacheDir;\n this.#maxSize = maxSize;\n this.#ttlMs = ttlMs;\n mkdirSync(cacheDir, { recursive: true });\n }\n\n get(key: string): LMResponse | undefined {\n const path = this.#pathFor(key);\n try {\n const raw = readFileSync(path, \"utf8\");\n const entry = JSON.parse(raw) as CacheEntry;\n if (entry.expiresAt !== null && Date.now() > entry.expiresAt) {\n unlinkSync(path);\n return undefined;\n }\n return entry.value;\n } catch {\n return undefined;\n }\n }\n\n set(key: string, value: LMResponse): void {\n this.#evictIfNeeded();\n const entry: CacheEntry = {\n key,\n value,\n expiresAt: this.#ttlMs != null ? Date.now() + this.#ttlMs : null,\n };\n writeFileSync(this.#pathFor(key), JSON.stringify(entry), \"utf8\");\n }\n\n clear(): void {\n try {\n for (const file of readdirSync(this.#cacheDir)) {\n if (file.endsWith(\".json\")) {\n try {\n unlinkSync(join(this.#cacheDir, file));\n } catch {\n // ignore\n }\n }\n }\n } catch {\n // ignore\n }\n }\n\n #pathFor(key: string): string {\n // 16 hex chars = 64 bits of the SHA-256 digest. The collision probability\n // over 10 M distinct prompts is ~2.7e-9, acceptable for a local LM cache.\n const hash = createHash(\"sha256\").update(key).digest(\"hex\").slice(0, 16);\n return join(this.#cacheDir, `${hash}.json`);\n }\n\n #evictIfNeeded(): void {\n let files: Array<{ name: string; mtime: number }>;\n try {\n files = readdirSync(this.#cacheDir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => {\n const p = join(this.#cacheDir, f);\n try {\n return { name: f, mtime: statSync(p).mtimeMs };\n } catch {\n return { name: f, mtime: 0 };\n }\n });\n } catch {\n return;\n }\n\n if (files.length < this.#maxSize) return;\n\n const sorted = files.sort((a, b) => a.mtime - b.mtime);\n const toDelete = sorted.slice(0, files.length - this.#maxSize + 1);\n for (const f of toDelete) {\n try {\n unlinkSync(join(this.#cacheDir, f.name));\n } catch {\n // ignore\n }\n }\n }\n}\n","import { LRUCache } from \"./cache.js\";\nimport { DiskCache } from \"./DiskCache.js\";\nimport type { LMCallConfig, LMResponse, Message, StreamChunk } from \"./types.js\";\n\n/**\n * Abstract base class for all language model adapters.\n *\n * Subclasses must implement {@link LM._call} which performs the actual\n * provider-specific API call.\n *\n * The base class handles:\n * - LRU response caching\n * - Request counting\n * - Token usage aggregation\n */\nexport abstract class LM {\n /** Human-readable name / identifier for this model instance. */\n readonly model: string;\n\n #cache: LRUCache<string, LMResponse>;\n #diskCache: DiskCache | undefined;\n #requestCount = 0;\n #tokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };\n\n constructor(\n model: string,\n cacheOptions: { maxSize?: number; ttlMs?: number; cacheDir?: string } = {},\n ) {\n this.model = model;\n this.#cache = new LRUCache(cacheOptions.maxSize, cacheOptions.ttlMs);\n this.#diskCache =\n cacheOptions.cacheDir !== undefined\n ? new DiskCache(cacheOptions.cacheDir, cacheOptions.maxSize, cacheOptions.ttlMs)\n : undefined;\n }\n\n // ---------------------------------------------------------------------------\n // Public API\n // ---------------------------------------------------------------------------\n\n /**\n * Call the language model with either a plain string prompt or a list of\n * chat messages.\n */\n async call(\n prompt: string | Message[],\n config: LMCallConfig = {},\n ): Promise<LMResponse> {\n const cacheKey = config.cacheKey ?? this.#buildCacheKey(prompt, config);\n const cached = this.#cache.get(cacheKey);\n if (cached) return cached;\n\n // Check disk cache (second-level)\n if (this.#diskCache) {\n const diskCached = this.#diskCache.get(cacheKey);\n if (diskCached) {\n this.#cache.set(cacheKey, diskCached);\n return diskCached;\n }\n }\n\n const response = await this._call(prompt, config);\n this.#cache.set(cacheKey, response);\n\n // Persist to disk cache\n if (this.#diskCache) {\n this.#diskCache.set(cacheKey, response);\n }\n\n this.#requestCount += 1;\n if (response.usage) {\n this.#tokenUsage.promptTokens += response.usage.promptTokens;\n this.#tokenUsage.completionTokens += response.usage.completionTokens;\n this.#tokenUsage.totalTokens += response.usage.totalTokens;\n }\n return response;\n }\n\n /** Total number of (non-cached) API calls made. */\n get requestCount(): number {\n return this.#requestCount;\n }\n\n /** Accumulated token usage across all (non-cached) calls. */\n get tokenUsage(): Readonly<{ promptTokens: number; completionTokens: number; totalTokens: number }> {\n return { ...this.#tokenUsage };\n }\n\n /** Clear the in-memory response cache. */\n clearCache(): void {\n this.#cache.clear();\n }\n\n /**\n * Stream the language model response token by token.\n *\n * Returns an `AsyncIterable<StreamChunk>`. The last chunk has `done: true`.\n * Subclasses override this to provide real streaming; the base implementation\n * falls back to calling {@link LM.call} and yielding the full response as a\n * single chunk.\n */\n async *stream(\n prompt: string | Message[],\n config: LMCallConfig = {},\n ): AsyncGenerator<StreamChunk> {\n const response = await this.call(prompt, config);\n yield { delta: response.text, done: true, raw: response.raw };\n }\n\n // ---------------------------------------------------------------------------\n // Abstract interface for subclasses\n // ---------------------------------------------------------------------------\n\n /**\n * Perform the actual provider API call. Subclasses must implement this.\n */\n protected abstract _call(\n prompt: string | Message[],\n config: LMCallConfig,\n ): Promise<LMResponse>;\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n #buildCacheKey(prompt: string | Message[], config: LMCallConfig): string {\n const promptStr = typeof prompt === \"string\" ? prompt : JSON.stringify(prompt);\n const configStr = JSON.stringify({\n model: config.model ?? this.model,\n temperature: config.temperature,\n maxTokens: config.maxTokens,\n stop: config.stop,\n n: config.n,\n });\n return `${promptStr}|||${configStr}`;\n }\n}\n","import { LM } from \"../LM.js\";\nimport type { LMCallConfig, LMResponse, Message } from \"../types.js\";\n\n/** Options for the OpenAI adapter. */\nexport interface OpenAIOptions {\n apiKey?: string;\n baseURL?: string;\n /** Default model, can be overridden per-call. */\n model?: string;\n maxRetries?: number;\n stream?: boolean;\n}\n\n/**\n * LM adapter for OpenAI chat-completion and text-completion models.\n *\n * Requires the `openai` package as a peer dependency:\n * ```\n * npm install openai\n * ```\n */\nexport class OpenAI extends LM {\n readonly #options: OpenAIOptions;\n\n constructor(options: OpenAIOptions = {}) {\n super(options.model ?? \"gpt-4o\");\n this.#options = options;\n }\n\n protected override async _call(\n prompt: string | Message[],\n config: LMCallConfig,\n ): Promise<LMResponse> {\n // Dynamically import so consumers who don't use OpenAI aren't forced to\n // install the package.\n const { default: OpenAIClient } = await import(\"openai\").catch(() => {\n throw new Error(\n \"The `openai` package is required for the OpenAI adapter.\\n\" +\n \"Install it with: npm install openai\",\n );\n });\n\n const client = new OpenAIClient({\n apiKey: this.#options.apiKey ?? process.env[\"OPENAI_API_KEY\"],\n baseURL: this.#options.baseURL,\n maxRetries: this.#options.maxRetries ?? 3,\n });\n\n const messages: Message[] =\n typeof prompt === \"string\"\n ? [{ role: \"user\", content: prompt }]\n : prompt;\n\n const response = await client.chat.completions.create({\n model: config.model ?? this.model,\n messages,\n temperature: config.temperature,\n max_tokens: config.maxTokens,\n stop: config.stop,\n n: config.n ?? 1,\n ...(config.extra ?? {}),\n });\n\n const texts = (response.choices ?? []).map(\n (c: { message?: { content?: string | null } }) => c.message?.content ?? \"\",\n );\n\n return {\n text: texts[0] ?? \"\",\n texts,\n usage: response.usage\n ? {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n totalTokens: response.usage.total_tokens,\n }\n : null,\n raw: response,\n };\n }\n\n override async *stream(\n prompt: string | Message[],\n config: LMCallConfig = {},\n ): AsyncGenerator<import(\"../types.js\").StreamChunk> {\n const { default: OpenAIClient } = await import(\"openai\").catch(() => {\n throw new Error(\n \"The `openai` package is required for the OpenAI adapter.\\n\" +\n \"Install it with: npm install openai\",\n );\n });\n\n const client = new OpenAIClient({\n apiKey: this.#options.apiKey ?? process.env[\"OPENAI_API_KEY\"],\n baseURL: this.#options.baseURL,\n maxRetries: this.#options.maxRetries ?? 3,\n });\n\n const messages: Message[] =\n typeof prompt === \"string\" ? [{ role: \"user\", content: prompt }] : prompt;\n\n const stream = await client.chat.completions.create({\n model: config.model ?? this.model,\n messages,\n temperature: config.temperature,\n max_tokens: config.maxTokens,\n stop: config.stop,\n stream: true as const,\n ...(config.extra ?? {}),\n });\n\n for await (const chunk of stream) {\n type StreamChoice = { delta?: { content?: string | null }; finish_reason?: string | null };\n type StreamResponse = { choices?: StreamChoice[] };\n const c = (chunk as StreamResponse).choices?.[0];\n const delta = c?.delta?.content ?? \"\";\n const done = c?.finish_reason != null;\n yield { delta, done, raw: chunk };\n if (done) break;\n }\n }\n}\n","import { LM } from \"../LM.js\";\nimport type { LMCallConfig, LMResponse, Message } from \"../types.js\";\n\n/** Options for the Anthropic adapter. */\nexport interface AnthropicOptions {\n apiKey?: string;\n model?: string;\n maxRetries?: number;\n}\n\n/**\n * LM adapter for Anthropic Claude models.\n *\n * Requires the `@anthropic-ai/sdk` package as a peer dependency:\n * ```\n * npm install @anthropic-ai/sdk\n * ```\n */\nexport class Anthropic extends LM {\n readonly #options: AnthropicOptions;\n\n constructor(options: AnthropicOptions = {}) {\n super(options.model ?? \"claude-3-5-sonnet-20241022\");\n this.#options = options;\n }\n\n protected override async _call(\n prompt: string | Message[],\n config: LMCallConfig,\n ): Promise<LMResponse> {\n const { default: Anthropic } = await import(\"@anthropic-ai/sdk\").catch(() => {\n throw new Error(\n \"The `@anthropic-ai/sdk` package is required for the Anthropic adapter.\\n\" +\n \"Install it with: npm install @anthropic-ai/sdk\",\n );\n });\n\n const client = new Anthropic({\n apiKey: this.#options.apiKey ?? process.env[\"ANTHROPIC_API_KEY\"],\n maxRetries: this.#options.maxRetries ?? 3,\n });\n\n const msgs: Message[] =\n typeof prompt === \"string\" ? [{ role: \"user\", content: prompt }] : prompt;\n\n const systemMsg = msgs.find((m) => m.role === \"system\");\n const userMsgs = msgs.filter((m) => m.role !== \"system\");\n\n const response = await client.messages.create({\n model: config.model ?? this.model,\n max_tokens: config.maxTokens ?? 1024,\n system: systemMsg?.content,\n messages: userMsgs.map((m) => ({ role: m.role as \"user\" | \"assistant\", content: m.content })),\n temperature: config.temperature,\n ...(config.extra ?? {}),\n });\n\n const text =\n response.content\n .filter((b: { type: string }) => b.type === \"text\")\n .map((b: { type: string; text?: string }) => b.text ?? \"\")\n .join(\"\") ?? \"\";\n\n return {\n text,\n texts: [text],\n usage: response.usage\n ? {\n promptTokens: response.usage.input_tokens,\n completionTokens: response.usage.output_tokens,\n totalTokens: response.usage.input_tokens + response.usage.output_tokens,\n }\n : null,\n raw: response,\n };\n }\n\n override async *stream(\n prompt: string | Message[],\n config: LMCallConfig = {},\n ): AsyncGenerator<import(\"../types.js\").StreamChunk> {\n const { default: Anthropic } = await import(\"@anthropic-ai/sdk\").catch(() => {\n throw new Error(\n \"The `@anthropic-ai/sdk` package is required for the Anthropic adapter.\\n\" +\n \"Install it with: npm install @anthropic-ai/sdk\",\n );\n });\n\n const client = new Anthropic({\n apiKey: this.#options.apiKey ?? process.env[\"ANTHROPIC_API_KEY\"],\n maxRetries: this.#options.maxRetries ?? 3,\n });\n\n const msgs: Message[] =\n typeof prompt === \"string\" ? [{ role: \"user\", content: prompt }] : prompt;\n\n const systemMsg = msgs.find((m) => m.role === \"system\");\n const userMsgs = msgs.filter((m) => m.role !== \"system\");\n\n const stream = client.messages.stream({\n model: config.model ?? this.model,\n max_tokens: config.maxTokens ?? 1024,\n system: systemMsg?.content,\n messages: userMsgs.map((m) => ({ role: m.role as \"user\" | \"assistant\", content: m.content })),\n ...(config.extra ?? {}),\n });\n\n for await (const event of stream) {\n type AnthropicStreamEvent = { type?: string; delta?: { type?: string; text?: string } };\n const e = event as AnthropicStreamEvent;\n if (e.type === \"content_block_delta\" && e.delta?.type === \"text_delta\") {\n yield { delta: e.delta.text ?? \"\", done: false, raw: event };\n } else if (e.type === \"message_stop\") {\n yield { delta: \"\", done: true, raw: event };\n break;\n }\n }\n }\n}\n","import { LM } from \"../LM.js\";\nimport type { LMCallConfig, LMResponse, Message } from \"../types.js\";\n\n/** Options for the Cohere adapter. */\nexport interface CohereOptions {\n apiKey?: string;\n model?: string;\n}\n\n/**\n * LM adapter for Cohere Command models.\n *\n * Requires the `cohere-ai` package as a peer dependency:\n * ```\n * npm install cohere-ai\n * ```\n */\nexport class Cohere extends LM {\n readonly #options: CohereOptions;\n\n constructor(options: CohereOptions = {}) {\n super(options.model ?? \"command-r-plus\");\n this.#options = options;\n }\n\n protected override async _call(\n prompt: string | Message[],\n config: LMCallConfig,\n ): Promise<LMResponse> {\n const { CohereClient } = await import(\"cohere-ai\").catch(() => {\n throw new Error(\n \"The `cohere-ai` package is required for the Cohere adapter.\\n\" +\n \"Install it with: npm install cohere-ai\",\n );\n });\n\n const client = new CohereClient({\n token: this.#options.apiKey ?? process.env[\"COHERE_API_KEY\"],\n });\n\n const text = typeof prompt === \"string\" ? prompt : this.#messagesToText(prompt);\n\n const response = await client.chat({\n model: config.model ?? this.model,\n message: text,\n temperature: config.temperature,\n maxTokens: config.maxTokens,\n ...(config.extra ?? {}),\n });\n\n const responseText = response.text ?? \"\";\n return {\n text: responseText,\n texts: [responseText],\n usage: response.meta?.tokens\n ? {\n promptTokens: response.meta.tokens.inputTokens ?? 0,\n completionTokens: response.meta.tokens.outputTokens ?? 0,\n totalTokens:\n (response.meta.tokens.inputTokens ?? 0) +\n (response.meta.tokens.outputTokens ?? 0),\n }\n : null,\n raw: response,\n };\n }\n\n #messagesToText(messages: Message[]): string {\n return messages.map((m) => `${m.role}: ${m.content}`).join(\"\\n\");\n }\n}\n","import { LM } from \"../LM.js\";\nimport type { LMCallConfig, LMResponse, Message } from \"../types.js\";\n\n/** Options for the Google Generative AI adapter. */\nexport interface GoogleAIOptions {\n apiKey?: string;\n model?: string;\n}\n\n/**\n * LM adapter for Google Gemini models via `@google/generative-ai`.\n *\n * Requires the `@google/generative-ai` package as a peer dependency:\n * ```\n * npm install @google/generative-ai\n * ```\n */\nexport class GoogleAI extends LM {\n readonly #options: GoogleAIOptions;\n\n constructor(options: GoogleAIOptions = {}) {\n super(options.model ?? \"gemini-1.5-pro\");\n this.#options = options;\n }\n\n protected override async _call(\n prompt: string | Message[],\n config: LMCallConfig,\n ): Promise<LMResponse> {\n const { GoogleGenerativeAI } = await import(\"@google/generative-ai\").catch(() => {\n throw new Error(\n \"The `@google/generative-ai` package is required for the GoogleAI adapter.\\n\" +\n \"Install it with: npm install @google/generative-ai\",\n );\n });\n\n const client = new GoogleGenerativeAI(\n this.#options.apiKey ?? process.env[\"GOOGLE_API_KEY\"] ?? \"\",\n );\n const genModel = client.getGenerativeModel({ model: config.model ?? this.model });\n\n const text = typeof prompt === \"string\" ? prompt : this.#messagesToText(prompt);\n const result = await genModel.generateContent({\n contents: [{ role: \"user\", parts: [{ text }] }],\n generationConfig: {\n temperature: config.temperature,\n maxOutputTokens: config.maxTokens,\n stopSequences: config.stop,\n candidateCount: config.n ?? 1,\n },\n });\n\n const texts = (result.response.candidates ?? []).map(\n (c: { content?: { parts?: Array<{ text?: string }> } }) =>\n c.content?.parts?.map((p) => p.text ?? \"\").join(\"\") ?? \"\",\n );\n\n return {\n text: texts[0] ?? \"\",\n texts,\n usage: null,\n raw: result,\n };\n }\n\n #messagesToText(messages: Message[]): string {\n return messages.map((m) => `${m.role}: ${m.content}`).join(\"\\n\");\n }\n}\n","import { LM } from \"../LM.js\";\nimport type { LMCallConfig, LMResponse, Message } from \"../types.js\";\n\n/** Options for the Ollama adapter. */\nexport interface OllamaOptions {\n /** Base URL of the Ollama server (default: http://localhost:11434). */\n baseURL?: string;\n model?: string;\n}\n\n/**\n * LM adapter for locally running Ollama models.\n * Communicates via the Ollama REST API (OpenAI-compatible `/v1` endpoint).\n */\nexport class Ollama extends LM {\n readonly #baseURL: string;\n\n constructor(options: OllamaOptions = {}) {\n super(options.model ?? \"llama3\");\n this.#baseURL = options.baseURL ?? \"http://localhost:11434\";\n }\n\n protected override async _call(\n prompt: string | Message[],\n config: LMCallConfig,\n ): Promise<LMResponse> {\n const messages: Message[] =\n typeof prompt === \"string\" ? [{ role: \"user\", content: prompt }] : prompt;\n\n const response = await fetch(`${this.#baseURL}/api/chat`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model: config.model ?? this.model,\n messages,\n stream: false,\n options: {\n temperature: config.temperature,\n num_predict: config.maxTokens,\n stop: config.stop,\n ...(config.extra ?? {}),\n },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Ollama request failed: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as {\n message?: { content?: string };\n prompt_eval_count?: number;\n eval_count?: number;\n };\n\n const text = data.message?.content ?? \"\";\n return {\n text,\n texts: [text],\n usage:\n data.prompt_eval_count != null\n ? {\n promptTokens: data.prompt_eval_count,\n completionTokens: data.eval_count ?? 0,\n totalTokens: (data.prompt_eval_count ?? 0) + (data.eval_count ?? 0),\n }\n : null,\n raw: data,\n };\n }\n}\n","import { LM } from \"../LM.js\";\nimport type { LMCallConfig, LMResponse, Message } from \"../types.js\";\n\n/** Options for the LM Studio adapter. */\nexport interface LMStudioOptions {\n /** Base URL of the LM Studio server (default: http://localhost:1234/v1). */\n baseURL?: string;\n model?: string;\n}\n\n/**\n * LM adapter for LM Studio's OpenAI-compatible REST endpoint.\n */\nexport class LMStudio extends LM {\n readonly #baseURL: string;\n\n constructor(options: LMStudioOptions = {}) {\n super(options.model ?? \"local-model\");\n this.#baseURL = options.baseURL ?? \"http://localhost:1234/v1\";\n }\n\n protected override async _call(\n prompt: string | Message[],\n config: LMCallConfig,\n ): Promise<LMResponse> {\n const messages: Message[] =\n typeof prompt === \"string\" ? [{ role: \"user\", content: prompt }] : prompt;\n\n const response = await fetch(`${this.#baseURL}/chat/completions`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model: config.model ?? this.model,\n messages,\n temperature: config.temperature,\n max_tokens: config.maxTokens,\n stop: config.stop,\n n: config.n ?? 1,\n ...(config.extra ?? {}),\n }),\n });\n\n if (!response.ok) {\n throw new Error(`LMStudio request failed: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as {\n choices?: Array<{ message?: { content?: string } }>;\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n };\n\n const texts = (data.choices ?? []).map((c) => c.message?.content ?? \"\");\n return {\n text: texts[0] ?? \"\",\n texts,\n usage: data.usage\n ? {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens,\n }\n : null,\n raw: data,\n };\n }\n}\n","import { LM } from \"../LM.js\";\nimport type { LMCallConfig, LMResponse, Message } from \"../types.js\";\n\n/** Options for the HuggingFace Inference API adapter. */\nexport interface HuggingFaceOptions {\n apiKey?: string;\n model?: string;\n /** Override the inference endpoint URL (for dedicated endpoints). */\n endpointURL?: string;\n}\n\n/**\n * LM adapter for HuggingFace Inference API text-generation models.\n *\n * Uses the HuggingFace HTTP inference API directly (no SDK required).\n */\nexport class HuggingFace extends LM {\n readonly #options: HuggingFaceOptions;\n\n constructor(options: HuggingFaceOptions = {}) {\n super(options.model ?? \"mistralai/Mistral-7B-Instruct-v0.3\");\n this.#options = options;\n }\n\n protected override async _call(\n prompt: string | Message[],\n config: LMCallConfig,\n ): Promise<LMResponse> {\n const apiKey = this.#options.apiKey ?? process.env[\"HF_API_KEY\"];\n const model = config.model ?? this.model;\n const url =\n this.#options.endpointURL ??\n `https://api-inference.huggingface.co/models/${model}`;\n\n const inputText =\n typeof prompt === \"string\" ? prompt : this.#messagesToText(prompt);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}),\n },\n body: JSON.stringify({\n inputs: inputText,\n parameters: {\n temperature: config.temperature,\n max_new_tokens: config.maxTokens,\n stop: config.stop,\n ...(config.extra ?? {}),\n },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`HuggingFace request failed: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as\n | Array<{ generated_text?: string }>\n | { generated_text?: string };\n\n const generated = Array.isArray(data)\n ? (data[0]?.generated_text ?? \"\")\n : (data.generated_text ?? \"\");\n\n return {\n text: generated,\n texts: [generated],\n usage: null,\n raw: data,\n };\n }\n\n #messagesToText(messages: Message[]): string {\n return messages.map((m) => `${m.role}: ${m.content}`).join(\"\\n\");\n }\n}\n","import { LM } from \"../LM.js\";\nimport type { LMCallConfig, LMResponse, Message } from \"../types.js\";\n\n/**\n * A deterministic mock LM adapter for use in unit tests.\n *\n * Responses are resolved from a lookup map keyed on the exact prompt string\n * (or the serialized messages array). If no match is found the adapter falls\n * back to `defaultResponse` (or throws if none is configured).\n *\n * @example\n * ```ts\n * const lm = new MockLM({\n * \"What is 2+2?\": \"4\",\n * });\n * settings.configure({ lm });\n * ```\n */\nexport class MockLM extends LM {\n readonly #responses: Map<string, string>;\n readonly #defaultResponse: string | undefined;\n\n constructor(\n responses: Record<string, string> = {},\n defaultResponse?: string,\n ) {\n super(\"mock\");\n this.#responses = new Map(Object.entries(responses));\n this.#defaultResponse = defaultResponse;\n }\n\n protected override async _call(\n prompt: string | Message[],\n config: LMCallConfig,\n ): Promise<LMResponse> {\n const key = typeof prompt === \"string\" ? prompt : JSON.stringify(prompt);\n const text =\n this.#responses.get(key) ??\n this.#defaultResponse ??\n (() => {\n throw new Error(`MockLM: no response configured for prompt: \"${key}\"`);\n })();\n\n const n = config.n ?? 1;\n return {\n text,\n texts: Array.from({ length: n }, () => text),\n usage: null,\n raw: null,\n };\n }\n\n /** Register (or overwrite) a prompt → response mapping at runtime. */\n addResponse(prompt: string, response: string): void {\n this.#responses.set(prompt, response);\n }\n}\n","import type { Prediction } from \"../primitives/index.js\";\n\n/**\n * Abstract base class for all DSTsx modules.\n *\n * A Module is a composable, serializable unit that encapsulates one or more\n * language model calls. Subclasses implement {@link Module.forward} to define\n * their behaviour.\n *\n * Mirrors `dspy.Module` in Python.\n *\n * @example\n * ```ts\n * class MyRAG extends Module {\n * retrieve = new Retrieve(3);\n * generate = new ChainOfThought(\"context, question -> answer\");\n *\n * async forward(question: string): Promise<Prediction> {\n * const { passages } = await this.retrieve.forward(question);\n * return this.generate.forward({ context: passages.join(\"\\n\"), question });\n * }\n * }\n * ```\n */\nexport abstract class Module {\n /**\n * Execute the module.\n *\n * Subclasses define their own parameter signatures; the base type uses\n * `unknown` so that TypeScript accepts any subclass override.\n */\n abstract forward(...args: unknown[]): Promise<Prediction>;\n\n /**\n * Recursively discover all {@link Predict} sub-modules by walking the own\n * enumerable properties of this instance.\n */\n namedPredictors(): Array<[string, Module]> {\n const results: Array<[string, Module]> = [];\n for (const [key, value] of Object.entries(this)) {\n if (value instanceof Module) {\n results.push([key, value]);\n results.push(...value.namedPredictors().map(([k, v]): [string, Module] => [`${key}.${k}`, v]));\n }\n }\n return results;\n }\n\n /**\n * Serialize the module's learnable parameters (e.g. `Predict.demos`) to a\n * plain JSON-compatible object.\n */\n dump(): Record<string, unknown> {\n const state: Record<string, unknown> = {};\n for (const [name, predictor] of this.namedPredictors()) {\n state[name] = predictor.dump();\n }\n return state;\n }\n\n /**\n * Restore learnable parameters from a plain object previously produced by\n * {@link Module.dump}.\n */\n load(state: Record<string, unknown>): void {\n for (const [name, predictor] of this.namedPredictors()) {\n const sub = state[name];\n if (sub && typeof sub === \"object\") {\n predictor.load(sub as Record<string, unknown>);\n }\n }\n }\n\n /**\n * Create a deep clone of this module.\n *\n * Returns a new module with the same prototype. All sub-{@link Module}\n * properties are recursively cloned so that mutating the clone's learnable\n * parameters (e.g. `Predict.demos`) does **not** affect the original.\n * Array properties are shallow-copied (their elements are not cloned).\n * All other properties are copied by reference.\n */\n clone(): this {\n const cloned = Object.create(Object.getPrototypeOf(this) as object) as this;\n for (const key of Object.keys(this)) {\n const value = (this as Record<string, unknown>)[key];\n if (value instanceof Module) {\n (cloned as Record<string, unknown>)[key] = value.clone();\n } else if (Array.isArray(value)) {\n (cloned as Record<string, unknown>)[key] = [...value];\n } else {\n (cloned as Record<string, unknown>)[key] = value;\n }\n }\n return cloned;\n }\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { LM } from \"../lm/index.js\";\nimport type { LMCallConfig } from \"../lm/types.js\";\nimport type { Retriever } from \"../retrieve/index.js\";\n\n/** Configuration options for the global DSTsx settings. */\nexport interface SettingsOptions {\n /** Default language model used by all Predict modules. */\n lm?: LM;\n /** Default retrieval model used by the Retrieve module. */\n rm?: Retriever;\n /** Default LM call configuration (temperature, maxTokens, etc.). */\n lmConfig?: LMCallConfig;\n /** Log level for internal messages. */\n logLevel?: \"silent\" | \"error\" | \"warn\" | \"info\" | \"debug\";\n /** Directory for caching compiled programs (JSON). */\n cacheDir?: string;\n}\n\n/**\n * Per-async-context storage. Each async call tree started via\n * {@link Settings.context} gets its own isolated snapshot of settings.\n * Concurrent requests never see each other's overrides.\n */\nconst contextStore = new AsyncLocalStorage<SettingsOptions>();\n\n/**\n * Global settings singleton for DSTsx.\n *\n * Configure the default LM and retriever before using any modules:\n * ```ts\n * import { settings } from \"dstsx\";\n * import { OpenAI } from \"dstsx\";\n *\n * settings.configure({ lm: new OpenAI({ model: \"gpt-4o\" }) });\n * ```\n *\n * Use {@link Settings.context} for per-request overrides in server environments.\n * Each invocation gets an isolated async context via `AsyncLocalStorage`, so\n * concurrent overlapping requests never interfere with each other:\n * ```ts\n * await settings.context({ lm: perRequestLM }, async () => {\n * return program.forward({ question });\n * });\n * ```\n */\nexport class Settings {\n #global: SettingsOptions = {};\n\n // ---------------------------------------------------------------------------\n // Effective settings: async-context overrides take precedence over globals.\n // ---------------------------------------------------------------------------\n\n get #current(): SettingsOptions {\n const ctx = contextStore.getStore();\n return ctx !== undefined ? { ...this.#global, ...ctx } : this.#global;\n }\n\n // ---------------------------------------------------------------------------\n // Accessors\n // ---------------------------------------------------------------------------\n\n get lm(): LM | undefined {\n return this.#current.lm;\n }\n\n get rm(): Retriever | undefined {\n return this.#current.rm;\n }\n\n get lmConfig(): LMCallConfig | undefined {\n return this.#current.lmConfig;\n }\n\n get logLevel(): SettingsOptions[\"logLevel\"] {\n return this.#current.logLevel ?? \"warn\";\n }\n\n get cacheDir(): string | undefined {\n return this.#current.cacheDir;\n }\n\n // ---------------------------------------------------------------------------\n // Mutation\n // ---------------------------------------------------------------------------\n\n /**\n * Merge `options` into the global settings. Existing keys are overwritten;\n * omitted keys are unchanged. This does NOT affect currently running\n * {@link Settings.context} scopes.\n */\n configure(options: SettingsOptions): void {\n this.#global = { ...this.#global, ...options };\n }\n\n /**\n * Reset all global settings to their defaults.\n */\n reset(): void {\n this.#global = {};\n }\n\n /**\n * Return a deep-frozen snapshot of the currently effective settings\n * (respects any active async-context overrides).\n */\n inspect(): Readonly<SettingsOptions> {\n return Object.freeze({ ...this.#current });\n }\n\n /**\n * Run `fn` inside an async-context-local settings scope.\n *\n * The `overrides` are merged on top of the current global settings and\n * stored in an `AsyncLocalStorage` context. Concurrent calls each get\n * their own isolated snapshot — they never overwrite each other's settings.\n *\n * @example\n * ```ts\n * // In an Express/Fastify handler:\n * await settings.context({ lm: perRequestLM }, () => program.forward(inputs));\n * ```\n */\n async context<T>(overrides: SettingsOptions, fn: () => Promise<T>): Promise<T> {\n const merged = { ...this.#global, ...overrides };\n return contextStore.run(merged, fn);\n }\n}\n\n/** The global DSTsx settings singleton. */\nexport const settings = new Settings();\n","import { Module } from \"./Module.js\";\nimport { Prediction, Example } from \"../primitives/index.js\";\nimport { Signature } from \"../signatures/index.js\";\nimport { settings } from \"../settings/index.js\";\n\n/**\n * The fundamental DSTsx module — formats a prompt for the configured LM and\n * parses the completion back into a typed {@link Prediction}.\n *\n * Mirrors `dspy.Predict` in Python.\n *\n * @example\n * ```ts\n * const qa = new Predict(\"question -> answer\");\n * const result = await qa.forward({ question: \"What is 2 + 2?\" });\n * console.log(result.get(\"answer\")); // \"4\"\n * ```\n */\nexport class Predict extends Module {\n readonly signature: Signature;\n\n /** Few-shot demonstration examples (learnable parameter). */\n demos: Example[];\n\n /** System instruction override (learnable parameter). */\n instructions: string | undefined;\n\n constructor(signature: string | Signature) {\n super();\n this.signature =\n typeof signature === \"string\" ? Signature.from(signature) : signature;\n this.demos = [];\n this.instructions = this.signature.instructions;\n }\n\n // ---------------------------------------------------------------------------\n // Forward pass\n // ---------------------------------------------------------------------------\n\n async forward(inputs: Record<string, unknown>): Promise<Prediction> {\n const lm = settings.lm;\n if (!lm) {\n throw new Error(\n \"No LM configured. Call settings.configure({ lm }) before using Predict.\",\n );\n }\n\n const prompt = this.#buildPrompt(inputs);\n const config = settings.lmConfig ?? {};\n const response = await lm.call(prompt, config);\n\n const outputs = this.#parseCompletion(response.text);\n const completions = response.texts.map((t) => this.#parseCompletion(t));\n\n return new Prediction(outputs, completions);\n }\n\n /**\n * Stream the LM response token by token.\n * Returns an `AsyncGenerator<StreamChunk>`.\n */\n async *stream(inputs: Record<string, unknown>): AsyncGenerator<import(\"../lm/types.js\").StreamChunk> {\n const lm = settings.lm;\n if (!lm) throw new Error(\"No LM configured. Call settings.configure({ lm }) before using Predict.\");\n const prompt = this.#buildPrompt(inputs);\n const config = settings.lmConfig ?? {};\n yield* lm.stream(prompt, config);\n }\n\n // ---------------------------------------------------------------------------\n // Serialization\n // ---------------------------------------------------------------------------\n\n override dump(): Record<string, unknown> {\n return {\n signature: this.signature.toJSON(),\n demos: this.demos.map((d) => d.toJSON()),\n instructions: this.instructions,\n };\n }\n\n override load(state: Record<string, unknown>): void {\n if (Array.isArray(state[\"demos\"])) {\n this.demos = (state[\"demos\"] as Record<string, unknown>[]).map(\n (d) => new Example(d),\n );\n }\n if (typeof state[\"instructions\"] === \"string\") {\n this.instructions = state[\"instructions\"];\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n #buildPrompt(inputs: Record<string, unknown>): string {\n const lines: string[] = [];\n\n if (this.instructions) {\n lines.push(this.instructions, \"\");\n }\n\n if (this.demos.length > 0) {\n for (const demo of this.demos) {\n lines.push(this.#formatExample(demo.toDict()));\n lines.push(\"---\");\n }\n }\n\n lines.push(this.#formatInputs(inputs));\n\n // Append output field prompts so the LM knows what to produce.\n for (const [name] of this.signature.outputs) {\n lines.push(`${name}:`);\n }\n\n return lines.join(\"\\n\");\n }\n\n #formatExample(data: Record<string, unknown>): string {\n return [...this.signature.inputs, ...this.signature.outputs]\n .map(([name]) => `${name}: ${String(data[name] ?? \"\")}`)\n .join(\"\\n\");\n }\n\n #formatInputs(inputs: Record<string, unknown>): string {\n return [...this.signature.inputs]\n .map(([name]) => `${name}: ${String(inputs[name] ?? \"\")}`)\n .join(\"\\n\");\n }\n\n /**\n * Parse a raw completion string into a map of field name → value.\n *\n * Looks for `fieldName: <value>` lines in the completion.\n */\n #parseCompletion(text: string): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n const outputKeys = [...this.signature.outputs.keys()];\n\n for (const key of outputKeys) {\n const regex = new RegExp(`^${key}:\\\\s*(.*)$`, \"mi\");\n const match = regex.exec(text);\n if (match) {\n result[key] = (match[1] ?? \"\").trim();\n }\n }\n\n // Fallback: if only one output field and no match was found, use the full\n // completion text.\n if (outputKeys.length === 1 && !(outputKeys[0]! in result)) {\n result[outputKeys[0]!] = text.trim();\n }\n\n return result;\n }\n}\n","import { Predict } from \"./Predict.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport { Signature } from \"../signatures/index.js\";\nimport type { FieldMeta } from \"../signatures/index.js\";\n\n/**\n * Chain-of-Thought module — extends {@link Predict} by prepending a hidden\n * `rationale` output field so the LM reasons before producing the answer.\n *\n * Mirrors `dspy.ChainOfThought` in Python.\n *\n * @example\n * ```ts\n * const cot = new ChainOfThought(\"question -> answer\");\n * const result = await cot.forward({ question: \"What is 9 * 8?\" });\n * console.log(result.get(\"answer\")); // \"72\"\n * ```\n */\nexport class ChainOfThought extends Predict {\n constructor(\n signature: string | Signature,\n options: { rationaleDescription?: string } = {},\n ) {\n const base = typeof signature === \"string\" ? Signature.from(signature) : signature;\n\n const rationaleSig = base.withOutput(\"rationale\", {\n description:\n options.rationaleDescription ??\n \"Think step by step to reason through the problem\",\n prefix: \"Reasoning:\",\n });\n\n // Ensure rationale is the FIRST output field.\n const reordered = new Signature({\n inputs: rationaleSig.inputs as Map<string, FieldMeta>,\n outputs: new Map([\n [\"rationale\", rationaleSig.outputs.get(\"rationale\")!],\n ...rationaleSig.outputs,\n ]),\n instructions: rationaleSig.instructions,\n });\n\n super(reordered);\n }\n\n /** Returns the answer without the internal rationale. */\n override async forward(inputs: Record<string, unknown>): Promise<Prediction> {\n const prediction = await super.forward(inputs);\n // Strip the rationale from the returned prediction so downstream modules\n // only see the actual output fields.\n const { rationale: _rationale, ...rest } = prediction.toDict() as Record<string, unknown>;\n void _rationale;\n return new Prediction(rest, prediction.completions as Record<string, unknown>[]);\n }\n}\n","import { ChainOfThought } from \"./ChainOfThought.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport type { Signature } from \"../signatures/index.js\";\n\n/**\n * Chain-of-Thought with an optional user-supplied hint injected into the\n * prompt at inference time.\n *\n * Mirrors `dspy.ChainOfThoughtWithHint` in Python.\n *\n * @example\n * ```ts\n * const cot = new ChainOfThoughtWithHint(\"question -> answer\");\n * const result = await cot.forward({\n * question: \"What is the capital of France?\",\n * hint: \"Think about European countries.\",\n * });\n * ```\n */\nexport class ChainOfThoughtWithHint extends ChainOfThought {\n constructor(signature: string | Signature, options: { rationaleDescription?: string } = {}) {\n const base = typeof signature === \"string\" ? signature : signature;\n super(base, options);\n // Add hint as an optional input field.\n const extendedSig = this.signature.withInput(\"hint\", {\n description: \"An optional hint to guide the reasoning\",\n optional: true,\n });\n // Re-assign the signature via a workaround (Predict stores it as readonly).\n Object.assign(this, { signature: extendedSig });\n }\n\n override async forward(inputs: Record<string, unknown>): Promise<Prediction> {\n return super.forward(inputs);\n }\n}\n","import { Module } from \"./Module.js\";\nimport { ChainOfThought } from \"./ChainOfThought.js\";\nimport { Predict } from \"./Predict.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport type { Signature } from \"../signatures/index.js\";\n\n/**\n * Runs a signature `M` times and selects the best completion via a final\n * aggregation call.\n *\n * Mirrors `dspy.MultiChainComparison` in Python.\n */\nexport class MultiChainComparison extends Module {\n readonly M: number;\n readonly #cot: ChainOfThought;\n readonly #aggregator: Predict;\n\n constructor(signature: string | Signature, M = 3) {\n super();\n this.M = M;\n this.#cot = new ChainOfThought(signature);\n\n // Aggregator chooses from the M completions.\n this.#aggregator = new Predict(\n \"completions -> answer\",\n );\n }\n\n async forward(inputs: Record<string, unknown>): Promise<Prediction> {\n const completions: string[] = [];\n for (let i = 0; i < this.M; i++) {\n const result = await this.#cot.forward(inputs);\n const outputKey = [...this.#cot.signature.outputs.keys()].find((k) => k !== \"rationale\");\n completions.push(String(result.get(outputKey ?? \"answer\") ?? \"\"));\n }\n\n return this.#aggregator.forward({\n completions: completions\n .map((c, i) => `Option ${i + 1}: ${c}`)\n .join(\"\\n\"),\n });\n }\n}\n","import { Module } from \"./Module.js\";\nimport { Predict } from \"./Predict.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport type { Signature } from \"../signatures/index.js\";\n\n/** A callable tool that ReAct can invoke. */\nexport interface Tool {\n /** Short unique name used in `Action: toolName[args]` syntax. */\n name: string;\n /** One-sentence description shown in the system prompt. */\n description: string;\n /** Async function that the tool executes. */\n fn: (args: string) => Promise<string>;\n}\n\n/**\n * ReAct (Reasoning + Acting) module that interleaves Thought, Action, and\n * Observation steps in a loop until a `Finish` action is emitted.\n *\n * Mirrors `dspy.ReAct` in Python.\n *\n * @example\n * ```ts\n * const react = new ReAct(\"question -> answer\", [searchTool]);\n * const result = await react.forward({ question: \"Who won the 2024 Olympics?\" });\n * ```\n */\nexport class ReAct extends Module {\n readonly tools: ReadonlyMap<string, Tool>;\n readonly maxIter: number;\n readonly #predictor: Predict;\n\n constructor(signature: string | Signature, tools: Tool[], maxIter = 5) {\n super();\n this.tools = new Map(tools.map((t) => [t.name, t]));\n this.maxIter = maxIter;\n\n const toolDescriptions = tools\n .map((t) => `${t.name}: ${t.description}`)\n .join(\"\\n\");\n\n const base = typeof signature === \"string\" ? signature : signature;\n const instructions =\n `You are an agent. Use the following tools:\\n${toolDescriptions}\\n\\n` +\n `Respond in the format:\\nThought: <reasoning>\\nAction: <tool>[<args>]\\nObservation: <result>\\n...\\nFinish[<answer>]`;\n\n this.#predictor = new Predict(\n typeof base === \"string\"\n ? `${base}`\n : base,\n );\n this.#predictor.instructions = instructions;\n }\n\n async forward(inputs: Record<string, unknown>): Promise<Prediction> {\n const trajectory: string[] = [];\n let finalAnswer = \"\";\n\n for (let i = 0; i < this.maxIter; i++) {\n const augmented = {\n ...inputs,\n trajectory: trajectory.join(\"\\n\"),\n };\n\n const result = await this.#predictor.forward(augmented);\n const text = String(result.get([...this.#predictor.signature.outputs.keys()][0] ?? \"\") ?? \"\");\n trajectory.push(text);\n\n // Check for Finish action.\n const finishMatch = /Finish\\[(.+)\\]/i.exec(text);\n if (finishMatch) {\n finalAnswer = finishMatch[1] ?? \"\";\n break;\n }\n\n // Execute any Action.\n const actionMatch = /Action:\\s*(\\w+)\\[(.+?)\\]/i.exec(text);\n if (actionMatch) {\n const toolName = actionMatch[1] ?? \"\";\n const toolArgs = actionMatch[2] ?? \"\";\n const tool = this.tools.get(toolName);\n const observation = tool\n ? await tool.fn(toolArgs)\n : `Tool \"${toolName}\" not found.`;\n trajectory.push(`Observation: ${observation}`);\n }\n }\n\n const outputKey = [...this.#predictor.signature.outputs.keys()][0] ?? \"answer\";\n return new Prediction({\n [outputKey]: finalAnswer || trajectory.at(-1) || \"\",\n trajectory: trajectory.join(\"\\n\"),\n });\n }\n}\n","import { Module } from \"./Module.js\";\nimport { Predict } from \"./Predict.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport { Signature, InputField, OutputField } from \"../signatures/index.js\";\n\n/**\n * Generates JavaScript code to answer a question, executes it in a sandboxed\n * manner, and returns the result.\n *\n * Mirrors `dspy.ProgramOfThought` in Python.\n *\n * ⚠️ Security: code runs inside the same process via `new Function()` with a\n * configurable wall-clock timeout (default 5 s). The timeout prevents\n * indefinite hangs but does **not** prevent access to Node.js APIs or the\n * global scope. Do NOT use with untrusted inputs in production without\n * an additional sandboxing layer (e.g. a Worker thread with a restricted\n * `MessageChannel`).\n */\nexport class ProgramOfThought extends Module {\n readonly maxAttempts: number;\n /** Wall-clock timeout (ms) for each code execution attempt. */\n readonly timeoutMs: number;\n readonly sandbox: \"worker\" | \"function\" | \"none\";\n readonly #codeGenerator: Predict;\n readonly #corrector: Predict;\n readonly #outputKey: string;\n\n constructor(signature: string | Signature, maxAttempts = 3, timeoutMs = 5_000, sandbox: \"worker\" | \"function\" | \"none\" = \"function\") {\n super();\n this.maxAttempts = maxAttempts;\n this.timeoutMs = timeoutMs;\n this.sandbox = sandbox;\n\n const base = typeof signature === \"string\" ? Signature.from(signature) : signature;\n\n // Build the generator signature programmatically to avoid a double `->`:\n // inputs from base + optional `instructions` -> `code`\n const genSig = new Signature({\n inputs: new Map([\n ...base.inputs,\n [\n \"instructions\",\n InputField({\n description: \"Task instructions for code generation\",\n optional: true,\n }),\n ],\n ]),\n outputs: new Map([\n [\n \"code\",\n OutputField({\n description:\n \"JavaScript code that computes and returns the answer via a `return` statement\",\n }),\n ],\n ]),\n instructions: base.instructions,\n });\n\n this.#codeGenerator = new Predict(genSig);\n this.#corrector = new Predict(\"code, error -> fixed_code\");\n this.#outputKey = [...base.outputs.keys()][0] ?? \"answer\";\n }\n\n async forward(inputs: Record<string, unknown>): Promise<Prediction> {\n let code = \"\";\n let result: unknown;\n let lastError = \"\";\n\n for (let attempt = 0; attempt < this.maxAttempts; attempt++) {\n const genInputs =\n attempt === 0\n ? {\n ...inputs,\n instructions:\n \"Write JavaScript code to compute the answer. Use a `return` statement for the final value.\",\n }\n : { code, error: lastError };\n\n const generated =\n attempt === 0\n ? await this.#codeGenerator.forward(genInputs)\n : await this.#corrector.forward(genInputs);\n\n code = String(generated.get(\"code\") ?? generated.get(\"fixed_code\") ?? \"\");\n\n try {\n if (this.sandbox === \"worker\") {\n result = await this.#executeInWorker(code, this.timeoutMs);\n } else if (this.sandbox === \"none\") {\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const fn = new Function(`return (async () => { ${code} })()`) as () => Promise<unknown>;\n result = await fn();\n } else {\n // \"function\" — default, with timeout\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const fn = new Function(`return (async () => { ${code} })()`) as () => Promise<unknown>;\n result = await this.#executeWithTimeout(fn(), this.timeoutMs);\n }\n break;\n } catch (err) {\n lastError = err instanceof Error ? err.message : String(err);\n result = undefined;\n }\n }\n\n return new Prediction({\n [this.#outputKey]: result !== undefined ? String(result) : \"\",\n code,\n });\n }\n\n async #executeInWorker(code: string, timeoutMs: number): Promise<string> {\n const { Worker } = await import(\"node:worker_threads\");\n const WORKER_CODE = `\nconst { workerData, parentPort } = require('node:worker_threads');\nconst { code } = workerData;\n(async () => {\n try {\n const fn = new Function('return (async () => { ' + code + ' })()');\n const result = await fn();\n parentPort.postMessage({ result: String(result ?? '') });\n } catch (err) {\n parentPort.postMessage({ error: err.message ?? String(err) });\n }\n})();\n`;\n\n return new Promise((resolve, reject) => {\n const worker = new Worker(WORKER_CODE, {\n eval: true,\n workerData: { code },\n });\n const timer = setTimeout(() => {\n void worker.terminate();\n reject(new Error(\"ProgramOfThought: worker execution timed out\"));\n }, timeoutMs);\n worker.on(\"message\", (msg: { result?: string; error?: string }) => {\n clearTimeout(timer);\n void worker.terminate();\n if (msg.error) reject(new Error(msg.error));\n else resolve(msg.result ?? \"\");\n });\n worker.on(\"error\", (err: Error) => {\n clearTimeout(timer);\n reject(err);\n });\n });\n }\n\n /**\n * Race `promise` against a wall-clock timer.\n * The underlying async work is not cancelled on timeout (no true abort), but\n * the returned Promise rejects promptly.\n */\n #executeWithTimeout(promise: Promise<unknown>, timeoutMs: number): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(\n () =>\n reject(\n new Error(\n `ProgramOfThought: code execution timed out after ${timeoutMs}ms`,\n ),\n ),\n timeoutMs,\n );\n promise.then(\n (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n (err: unknown) => {\n clearTimeout(timer);\n reject(err);\n },\n );\n });\n }\n}\n\n","import { Module } from \"./Module.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport { settings } from \"../settings/index.js\";\n\n/**\n * Retrieve module that calls the globally configured retriever.\n *\n * Mirrors `dspy.Retrieve` in Python.\n *\n * @example\n * ```ts\n * settings.configure({ rm: new ColBERTv2(\"http://colbert.host\") });\n * const retrieve = new Retrieve(3);\n * const result = await retrieve.forward(\"What is DSPy?\");\n * console.log(result.get(\"passages\")); // string[]\n * ```\n */\nexport class Retrieve extends Module {\n readonly k: number;\n\n constructor(k = 3) {\n super();\n this.k = k;\n }\n\n async forward(query: string): Promise<Prediction> {\n const rm = settings.rm;\n if (!rm) {\n throw new Error(\n \"No retriever configured. Call settings.configure({ rm }) before using Retrieve.\",\n );\n }\n const passages = await rm.retrieve(query, this.k);\n return new Prediction({ passages, query });\n }\n}\n","/**\n * A typed error thrown by {@link Assert} when a condition is not met.\n *\n * {@link Retry} catches this error and feeds the message back into the next\n * attempt as feedback.\n */\nexport class AssertionError extends Error {\n constructor(message = \"Assertion failed\") {\n super(message);\n this.name = \"AssertionError\";\n }\n}\n\n/**\n * Hard assertion — throws an {@link AssertionError} if `condition` is falsy.\n * Caught and retried by the {@link Retry} module.\n *\n * Mirrors `dspy.Assert` in Python.\n *\n * @example\n * ```ts\n * Assert(result.get(\"answer\") !== \"\", \"Answer must not be empty\");\n * ```\n */\nexport function Assert(condition: unknown, message?: string): asserts condition {\n if (!condition) {\n throw new AssertionError(message ?? \"Assertion failed\");\n }\n}\n","/**\n * Soft suggestion — logs a warning if `condition` is falsy but does NOT throw.\n *\n * Mirrors `dspy.Suggest` in Python.\n *\n * @example\n * ```ts\n * Suggest(result.get(\"confidence\") === \"high\", \"Low confidence in answer\");\n * ```\n */\nexport function Suggest(condition: unknown, message?: string): void {\n if (!condition) {\n // Use a non-throwing warning so the pipeline continues.\n console.warn(`[DSTsx Suggest] ${message ?? \"Condition not met\"}`);\n }\n}\n","import { Module } from \"./Module.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport { AssertionError } from \"../assertions/index.js\";\n\n/**\n * Wraps any module and retries on {@link AssertionError} up to `maxAttempts`,\n * feeding the failure message back into the next attempt.\n *\n * Mirrors `dspy.Retry` in Python.\n */\nexport class Retry extends Module {\n readonly #inner: Module;\n readonly maxAttempts: number;\n\n constructor(inner: Module, maxAttempts = 3) {\n super();\n this.#inner = inner;\n this.maxAttempts = maxAttempts;\n }\n\n async forward(...args: unknown[]): Promise<Prediction> {\n let lastError: AssertionError | undefined;\n\n for (let attempt = 0; attempt < this.maxAttempts; attempt++) {\n try {\n return await (this.#inner.forward as (...a: unknown[]) => Promise<Prediction>)(...args);\n } catch (err) {\n if (err instanceof AssertionError) {\n lastError = err;\n // If the inner module is a Predict-like module, inject the error\n // message as feedback via a \"past_outputs\" field.\n const firstArg = args[0];\n if (firstArg && typeof firstArg === \"object\") {\n (firstArg as Record<string, unknown>)[\"feedback\"] = err.message;\n }\n continue;\n }\n throw err;\n }\n }\n\n throw lastError ?? new Error(\"Retry: all attempts exhausted\");\n }\n}\n","import { Module } from \"./Module.js\";\nimport { Prediction } from \"../primitives/index.js\";\n\n/**\n * Runs `N` copies of a module in parallel and selects the best output via a\n * provided `reduceFunc` (defaults to returning the first result).\n *\n * Mirrors `dspy.BestOfN` in Python.\n */\nexport class BestOfN extends Module {\n readonly N: number;\n readonly #inner: Module;\n readonly #reduce: (predictions: Prediction[]) => Prediction;\n\n constructor(\n inner: Module,\n N = 3,\n reduceFunc?: (predictions: Prediction[]) => Prediction,\n ) {\n super();\n this.#inner = inner;\n this.N = N;\n this.#reduce = reduceFunc ?? ((preds) => preds[0] ?? new Prediction({}));\n }\n\n async forward(...args: unknown[]): Promise<Prediction> {\n const results = await Promise.all(\n Array.from({ length: this.N }, () =>\n (this.#inner.forward as (...a: unknown[]) => Promise<Prediction>)(...args),\n ),\n );\n return this.#reduce(results);\n }\n}\n","import { Module } from \"./Module.js\";\nimport { Prediction } from \"../primitives/index.js\";\n\n/**\n * Combines multiple modules into one via a voting or custom reduce function.\n *\n * Mirrors `dspy.Ensemble` (optimizer version) when used as a module.\n */\nexport class Ensemble extends Module {\n readonly #modules: Module[];\n readonly #reduce: (predictions: Prediction[]) => Prediction;\n\n constructor(\n modules: Module[],\n reduceFunc?: (predictions: Prediction[]) => Prediction,\n ) {\n super();\n this.#modules = modules;\n this.#reduce = reduceFunc ?? ((preds) => preds[0] ?? new Prediction({}));\n }\n\n async forward(...args: unknown[]): Promise<Prediction> {\n const results = await Promise.all(\n this.#modules.map((m) =>\n (m.forward as (...a: unknown[]) => Promise<Prediction>)(...args),\n ),\n );\n return this.#reduce(results);\n }\n}\n","import { Predict } from \"./Predict.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport { Signature } from \"../signatures/index.js\";\nimport type { FieldMeta } from \"../signatures/index.js\";\n\n/**\n * A Prediction that additionally carries a typed `.typed` field.\n */\nexport class TypedPrediction<T = unknown> extends Prediction {\n readonly typed: T;\n\n constructor(\n data: Record<string, unknown>,\n typed: T,\n completions: Record<string, unknown>[] = [],\n ) {\n super(data, completions);\n this.typed = typed;\n }\n}\n\n/**\n * TypedPredictor — like Predict but appends JSON formatting instructions and\n * parses the completion as JSON. If an optional schema is provided,\n * validates and returns `.typed`.\n */\nexport class TypedPredictor<T = unknown> extends Predict {\n readonly #schema: { parse: (v: unknown) => T } | undefined;\n readonly #maxRetries: number;\n\n constructor(\n signature: string | Signature,\n schema?: { parse: (v: unknown) => T },\n options: { maxRetries?: number } = {},\n ) {\n super(signature);\n this.#schema = schema;\n this.#maxRetries = options.maxRetries ?? 3;\n }\n\n override async forward(inputs: Record<string, unknown>): Promise<TypedPrediction<T>> {\n const origInstructions = this.instructions;\n const jsonSuffix = \"\\n\\nRespond with a JSON object matching the output schema.\";\n this.instructions = (origInstructions ?? \"\") + jsonSuffix;\n\n let lastError: unknown;\n try {\n for (let attempt = 0; attempt <= this.#maxRetries; attempt++) {\n try {\n const prediction = await super.forward(inputs);\n const dict = prediction.toDict() as Record<string, unknown>;\n\n // Try each output field's value as potential JSON source\n let parsed: unknown;\n let found = false;\n let lastParseError: unknown;\n for (const key of this.signature.outputs.keys()) {\n const val = dict[key];\n if (typeof val === \"string\" && val.length > 0) {\n try {\n parsed = TypedPredictor.#parseJSON(val);\n found = true;\n break;\n } catch (parseErr) {\n lastParseError = parseErr;\n }\n }\n }\n\n if (!found) {\n if (lastParseError !== undefined) {\n // Had non-empty string field(s) but none parsed as JSON\n throw lastParseError;\n }\n // No string field values — fall back to the dict (e.g. multi-field with empty results)\n parsed = dict;\n }\n\n let typed: T;\n if (this.#schema) {\n typed = this.#schema.parse(parsed);\n } else {\n typed = parsed as T;\n }\n\n return new TypedPrediction<T>(\n dict,\n typed,\n prediction.completions as Record<string, unknown>[],\n );\n } catch (err) {\n lastError = err;\n // continue to next attempt\n }\n }\n } finally {\n this.instructions = origInstructions;\n }\n\n throw lastError;\n }\n\n static #parseJSON(raw: unknown): unknown {\n if (typeof raw !== \"string\") return raw;\n let text = raw.trim();\n // Strip markdown code fences\n const fence = /^```(?:json)?\\s*([\\s\\S]*?)\\s*```$/m.exec(text);\n if (fence) text = (fence[1] ?? \"\").trim();\n return JSON.parse(text);\n }\n}\n\n/**\n * TypedChainOfThought — like TypedPredictor but adds a hidden rationale field\n * so the LM reasons before producing the answer.\n */\nexport class TypedChainOfThought<T = unknown> extends TypedPredictor<T> {\n constructor(\n signature: string | Signature,\n schema?: { parse: (v: unknown) => T },\n options: { maxRetries?: number } = {},\n ) {\n const base = typeof signature === \"string\" ? Signature.from(signature) : signature;\n\n const withRationale = base.withOutput(\"rationale\", {\n description: \"Think step by step to reason through the problem\",\n prefix: \"Reasoning:\",\n });\n\n // Ensure rationale is the FIRST output field\n const reordered = new Signature({\n inputs: withRationale.inputs as Map<string, FieldMeta>,\n outputs: new Map([\n [\"rationale\", withRationale.outputs.get(\"rationale\")!],\n ...withRationale.outputs,\n ]),\n instructions: withRationale.instructions,\n });\n\n super(reordered, schema, options);\n }\n\n override async forward(inputs: Record<string, unknown>): Promise<TypedPrediction<T>> {\n const result = await super.forward(inputs);\n // Destructure rationale out so it doesn't appear in the returned prediction.\n const { rationale: _rationale, ...rest } = result.toDict() as Record<string, unknown>;\n void _rationale;\n return new TypedPrediction<T>(\n rest,\n result.typed,\n result.completions as Record<string, unknown>[],\n );\n }\n}\n","import { Module } from \"./Module.js\";\nimport type { Prediction } from \"../primitives/index.js\";\n\n/**\n * Runs multiple modules in parallel and returns all their results.\n *\n * Note: `forward()` returns the first prediction for Module interface\n * compatibility. Use `run()` to get all predictions.\n */\nexport class Parallel extends Module {\n readonly #modules: Module[];\n readonly #timeoutMs: number | undefined;\n\n constructor(modules: Module[], options: { timeoutMs?: number } = {}) {\n super();\n this.#modules = modules;\n this.#timeoutMs = options.timeoutMs;\n }\n\n /** Run all modules in parallel and return all predictions. */\n async run(...args: unknown[]): Promise<Prediction[]> {\n const tasks = this.#modules.map((m) =>\n (m.forward as (...a: unknown[]) => Promise<Prediction>)(...args),\n );\n\n if (this.#timeoutMs !== undefined) {\n const timeoutMs = this.#timeoutMs;\n const withTimeout = tasks.map((t) =>\n Promise.race([\n t,\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(\"Parallel: timeout\")), timeoutMs),\n ),\n ]),\n );\n return Promise.all(withTimeout);\n }\n\n return Promise.all(tasks);\n }\n\n /** For Module interface compatibility — returns first prediction. */\n override async forward(...args: unknown[]): Promise<Prediction> {\n const results = await this.run(...args);\n return results[0]!;\n }\n}\n","import { Module } from \"./Module.js\";\nimport { Predict } from \"./Predict.js\";\nimport { Prediction } from \"../primitives/index.js\";\n\nexport interface RefineOptions {\n /** Maximum refinement iterations (default: 2). */\n maxRefinements?: number;\n /** Field name for feedback in the inner module re-run (default: \"feedback\"). */\n feedbackField?: string;\n /** If returns true, stop refining early. */\n stopCondition?: (prediction: Prediction) => boolean;\n}\n\n/**\n * Self-critique / iterative refinement loop.\n *\n * Runs the inner module, then uses a Predict critic to score the output.\n * If the output is not satisfactory, feeds critique back and re-runs.\n */\nexport class Refine extends Module {\n readonly #inner: Module;\n readonly #maxRefinements: number;\n readonly #feedbackField: string;\n readonly #stopCondition: ((p: Prediction) => boolean) | undefined;\n readonly #critic: Predict;\n\n constructor(inner: Module, options: RefineOptions = {}) {\n super();\n this.#inner = inner;\n this.#maxRefinements = options.maxRefinements ?? 2;\n this.#feedbackField = options.feedbackField ?? \"feedback\";\n this.#stopCondition = options.stopCondition;\n this.#critic = new Predict(\"output -> critique, is_satisfactory\");\n }\n\n override async forward(...args: unknown[]): Promise<Prediction> {\n const innerForward = this.#inner.forward.bind(this.#inner) as (\n ...a: unknown[]\n ) => Promise<Prediction>;\n\n let prediction = await innerForward(...args);\n\n for (let i = 0; i < this.#maxRefinements; i++) {\n if (this.#stopCondition?.(prediction)) break;\n\n const outputStr = JSON.stringify(prediction.toDict());\n let critique: Prediction;\n try {\n critique = await this.#critic.forward({ output: outputStr });\n } catch {\n break;\n }\n\n const isSatisfactory = String(\n critique.get(\"is_satisfactory\") ?? \"\",\n )\n .toLowerCase()\n .trim();\n if (isSatisfactory === \"yes\" || isSatisfactory === \"true\") break;\n\n const feedback = String(critique.get(\"critique\") ?? \"\");\n const newArgs = [...args];\n if (\n newArgs.length > 0 &&\n typeof newArgs[0] === \"object\" &&\n newArgs[0] !== null\n ) {\n newArgs[0] = {\n ...(newArgs[0] as Record<string, unknown>),\n [this.#feedbackField]: feedback,\n };\n }\n try {\n prediction = await innerForward(...newArgs);\n } catch {\n break;\n }\n }\n\n return prediction;\n }\n}\n","import { Module } from \"./Module.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport { Signature } from \"../signatures/index.js\";\nimport type { Tool } from \"./ReAct.js\";\nimport { settings } from \"../settings/index.js\";\nimport type { Message } from \"../lm/types.js\";\n\n/**\n * ReAct variant that uses provider-native tool/function calling instead of\n * text-based action parsing.\n *\n * For OpenAI models, this uses function calling (tools API). For Anthropic, it\n * uses tool_use. Other adapters fall back to the text-based ReAct format.\n *\n * @example\n * ```ts\n * const tools: Tool[] = [{ name: \"search\", description: \"Search\", fn: search }];\n * const agent = new NativeReAct(\"question -> answer\", tools);\n * const result = await agent.forward({ question: \"What is the capital of France?\" });\n * ```\n */\nexport class NativeReAct extends Module {\n readonly tools: ReadonlyMap<string, Tool>;\n readonly maxIter: number;\n readonly #signatureStr: string;\n readonly #outputKey: string;\n\n constructor(\n signatureStr: string,\n tools: Tool[],\n maxIter = 5,\n ) {\n super();\n this.#signatureStr = signatureStr;\n this.tools = new Map(tools.map((t) => [t.name, t]));\n this.maxIter = maxIter;\n // Parse the output field name from the signature string\n const sig = Signature.from(signatureStr);\n this.#outputKey = [...sig.outputs.keys()][0] ?? \"answer\";\n }\n\n override async forward(inputs: Record<string, unknown>): Promise<Prediction> {\n const lm = settings.lm;\n if (!lm) throw new Error(\"No LM configured.\");\n\n const toolSchemas = [...this.tools.values()].map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: {\n type: \"object\",\n properties: { args: { type: \"string\", description: \"Tool arguments as JSON or plain string\" } },\n required: [\"args\"],\n },\n },\n }));\n\n const inputStr = Object.entries(inputs)\n .map(([k, v]) => `${k}: ${String(v)}`)\n .join(\"\\n\");\n\n const messages: Message[] = [\n {\n role: \"system\",\n content: `You are a helpful assistant. Use tools when needed.\\nSignature: ${this.#signatureStr}\\nTools: ${[...this.tools.keys()].join(\", \")}`,\n },\n { role: \"user\", content: inputStr },\n ];\n\n let finalAnswer = \"\";\n const trajectory: Array<{ thought: string; action: string; observation: string }> = [];\n\n for (let i = 0; i < this.maxIter; i++) {\n const response = await lm.call(messages, {\n extra: { tools: toolSchemas, tool_choice: \"auto\" },\n });\n\n const raw = response.raw as Record<string, unknown> | null;\n const choices = (raw?.[\"choices\"] as Array<Record<string, unknown>>) ?? [];\n const choice = choices[0];\n const toolCalls = (\n choice?.[\"message\"] as Record<string, unknown> | undefined\n )?.[\"tool_calls\"] as\n | Array<{ function: { name: string; arguments: string } }>\n | undefined;\n\n if (toolCalls && toolCalls.length > 0) {\n for (const tc of toolCalls) {\n const toolName = tc.function.name;\n const args = tc.function.arguments;\n const tool = this.tools.get(toolName);\n const observation = tool\n ? await tool.fn(args).catch((e: unknown) => String(e))\n : `Unknown tool: ${toolName}`;\n\n trajectory.push({\n thought: `Using tool: ${toolName}`,\n action: `${toolName}(${args})`,\n observation,\n });\n messages.push({ role: \"assistant\", content: `Tool: ${toolName}\\nArgs: ${args}` });\n messages.push({ role: \"user\", content: `Observation: ${observation}` });\n }\n } else {\n finalAnswer = response.text;\n break;\n }\n }\n\n return new Prediction({ [this.#outputKey]: finalAnswer, trajectory: JSON.stringify(trajectory) });\n }\n}\n","/**\n * Abstract base class for all retrieval backends.\n *\n * Mirrors `dspy.Retrieve`'s underlying retriever protocol in Python.\n */\nexport abstract class Retriever {\n /**\n * Retrieve the top-`k` passages relevant to `query`.\n *\n * @param query - The search query string.\n * @param k - Number of passages to return.\n * @returns An ordered array of passage strings (most relevant first).\n */\n abstract retrieve(query: string, k: number): Promise<string[]>;\n}\n","import { Retriever } from \"../Retriever.js\";\n\n/** Options for the ColBERTv2 retriever. */\nexport interface ColBERTv2Options {\n /** Base URL of the ColBERT server. */\n url: string;\n /** Number of passages to request from the server (defaults to k). */\n passages?: number;\n}\n\n/**\n * Retriever that queries a ColBERTv2 REST endpoint.\n *\n * Mirrors `dspy.ColBERTv2` in Python.\n */\nexport class ColBERTv2 extends Retriever {\n readonly #url: string;\n\n constructor(options: ColBERTv2Options | string) {\n super();\n this.#url = typeof options === \"string\" ? options : options.url;\n }\n\n async retrieve(query: string, k: number): Promise<string[]> {\n const url = new URL(\"/search\", this.#url);\n url.searchParams.set(\"query\", query);\n url.searchParams.set(\"k\", String(k));\n\n const response = await fetch(url.toString());\n if (!response.ok) {\n throw new Error(`ColBERTv2 request failed: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as { topk?: Array<{ content?: string }> };\n return (data.topk ?? []).map((p) => p.content ?? \"\").filter(Boolean);\n }\n}\n","import { Retriever } from \"../Retriever.js\";\n\n/** Options for the Pinecone retriever. */\nexport interface PineconeRMOptions {\n apiKey?: string;\n indexName: string;\n namespace?: string;\n embeddingFn: (text: string) => Promise<number[]>;\n}\n\n/**\n * Retriever backed by Pinecone vector database.\n *\n * Requires the `@pinecone-database/pinecone` package:\n * ```\n * npm install @pinecone-database/pinecone\n * ```\n */\nexport class PineconeRM extends Retriever {\n readonly #options: PineconeRMOptions;\n\n constructor(options: PineconeRMOptions) {\n super();\n this.#options = options;\n }\n\n async retrieve(query: string, k: number): Promise<string[]> {\n const { Pinecone } = await import(\"@pinecone-database/pinecone\").catch(() => {\n throw new Error(\n \"The `@pinecone-database/pinecone` package is required.\\n\" +\n \"Install it with: npm install @pinecone-database/pinecone\",\n );\n });\n\n const client = new Pinecone({\n apiKey: this.#options.apiKey ?? process.env[\"PINECONE_API_KEY\"] ?? \"\",\n });\n\n const index = client.index(this.#options.indexName);\n const embedding = await this.#options.embeddingFn(query);\n\n const queryResponse = await index.namespace(this.#options.namespace ?? \"\").query({\n vector: embedding,\n topK: k,\n includeMetadata: true,\n });\n\n return (queryResponse.matches ?? [])\n .map((m: { metadata?: Record<string, unknown> }) =>\n String(m.metadata?.[\"text\"] ?? m.metadata?.[\"content\"] ?? \"\"),\n )\n .filter(Boolean);\n }\n}\n","import { Retriever } from \"../Retriever.js\";\n\n/** Options for the Weaviate retriever. */\nexport interface WeaviateRMOptions {\n url: string;\n apiKey?: string;\n /** The Weaviate class/collection to query. */\n className: string;\n /** Property name that holds the passage text. */\n textProperty?: string;\n embeddingFn: (text: string) => Promise<number[]>;\n}\n\n/**\n * Retriever backed by Weaviate vector database.\n *\n * Requires the `weaviate-client` package:\n * ```\n * npm install weaviate-client\n * ```\n */\nexport class WeaviateRM extends Retriever {\n readonly #options: WeaviateRMOptions;\n\n constructor(options: WeaviateRMOptions) {\n super();\n this.#options = options;\n }\n\n async retrieve(query: string, k: number): Promise<string[]> {\n const weaviate = await import(\"weaviate-client\").catch(() => {\n throw new Error(\n \"The `weaviate-client` package is required.\\n\" +\n \"Install it with: npm install weaviate-client\",\n );\n });\n\n const client = await weaviate.default.connectToCustom({\n httpHost: this.#options.url,\n ...(this.#options.apiKey ? { authCredentials: new weaviate.default.ApiKey(this.#options.apiKey) } : {}),\n });\n\n const embedding = await this.#options.embeddingFn(query);\n const textProp = this.#options.textProperty ?? \"text\";\n\n const result = await client.collections\n .get(this.#options.className)\n .query.nearVector(embedding, { limit: k, returnProperties: [textProp] });\n\n return (result.objects ?? [])\n .map((obj: { properties?: Record<string, unknown> }) =>\n String(obj.properties?.[textProp] ?? \"\"),\n )\n .filter(Boolean);\n }\n}\n","import { Retriever } from \"../Retriever.js\";\n\n/** Options for the ChromaDB retriever. */\nexport interface ChromadbRMOptions {\n /** ChromaDB server URL (default: http://localhost:8000). */\n url?: string;\n collectionName: string;\n embeddingFn?: (texts: string[]) => Promise<number[][]>;\n}\n\n/**\n * Retriever backed by ChromaDB.\n *\n * Requires the `chromadb` package:\n * ```\n * npm install chromadb\n * ```\n */\nexport class ChromadbRM extends Retriever {\n readonly #options: ChromadbRMOptions;\n\n constructor(options: ChromadbRMOptions) {\n super();\n this.#options = options;\n }\n\n async retrieve(query: string, k: number): Promise<string[]> {\n const { ChromaClient } = await import(\"chromadb\").catch(() => {\n throw new Error(\n \"The `chromadb` package is required.\\n\" +\n \"Install it with: npm install chromadb\",\n );\n });\n\n const client = new ChromaClient({ path: this.#options.url ?? \"http://localhost:8000\" });\n const collection = await client.getCollection({ name: this.#options.collectionName });\n\n const results = await collection.query({\n queryTexts: [query],\n nResults: k,\n });\n\n return (results.documents?.[0] ?? []).filter((d: unknown): d is string => d !== null);\n }\n}\n","import { Retriever } from \"../Retriever.js\";\n\n/** Options for the Qdrant retriever. */\nexport interface QdrantRMOptions {\n url?: string;\n apiKey?: string;\n collectionName: string;\n /** Property name that holds the passage text in the payload. */\n textField?: string;\n embeddingFn: (text: string) => Promise<number[]>;\n}\n\n/**\n * Retriever backed by Qdrant vector database.\n *\n * Requires the `@qdrant/js-client-rest` package:\n * ```\n * npm install @qdrant/js-client-rest\n * ```\n */\nexport class QdrantRM extends Retriever {\n readonly #options: QdrantRMOptions;\n\n constructor(options: QdrantRMOptions) {\n super();\n this.#options = options;\n }\n\n async retrieve(query: string, k: number): Promise<string[]> {\n const { QdrantClient } = await import(\"@qdrant/js-client-rest\").catch(() => {\n throw new Error(\n \"The `@qdrant/js-client-rest` package is required.\\n\" +\n \"Install it with: npm install @qdrant/js-client-rest\",\n );\n });\n\n const client = new QdrantClient({\n url: this.#options.url ?? \"http://localhost:6333\",\n apiKey: this.#options.apiKey,\n });\n\n const embedding = await this.#options.embeddingFn(query);\n const textField = this.#options.textField ?? \"text\";\n\n const result = await client.search(this.#options.collectionName, {\n vector: embedding,\n limit: k,\n with_payload: [textField],\n });\n\n return result\n .map((hit: { payload?: Record<string, unknown> }) =>\n String(hit.payload?.[textField] ?? \"\"),\n )\n .filter(Boolean);\n }\n}\n","import { Retriever } from \"../Retriever.js\";\n\n/** Options for the FAISS retriever. */\nexport interface FaissRMOptions {\n /** Array of passage strings (the corpus). */\n passages: string[];\n /**\n * Pre-computed embeddings (one per passage, in the same order as `passages`).\n * When omitted, embeddings are computed lazily on the first `retrieve()` call\n * using `embeddingFn` and cached for subsequent calls.\n */\n embeddings?: number[][];\n /**\n * Function that maps a text string to a dense embedding vector.\n * Required for computing the query embedding (and passage embeddings when\n * `embeddings` is not pre-supplied).\n */\n embeddingFn: (text: string) => Promise<number[]>;\n}\n\n/**\n * In-process FAISS-style retriever using cosine similarity over dense\n * embeddings. No external server required.\n *\n * For large corpora, consider using the `faiss-node` package instead.\n */\nexport class FaissRM extends Retriever {\n readonly #passages: string[];\n readonly #precomputedEmbeddings: number[][] | undefined;\n readonly #embeddingFn: (text: string) => Promise<number[]>;\n /** Lazily populated passage-embedding cache. */\n #cachedEmbeddings: number[][] | undefined;\n\n constructor(options: FaissRMOptions) {\n super();\n this.#passages = options.passages;\n this.#precomputedEmbeddings = options.embeddings;\n this.#embeddingFn = options.embeddingFn;\n }\n\n async retrieve(query: string, k: number): Promise<string[]> {\n // Always use embeddingFn for the query so we get a meaningful embedding.\n const queryEmbedding = await this.#embeddingFn(query);\n\n // Passage embeddings: use pre-computed ones, or compute & cache lazily.\n if (!this.#cachedEmbeddings) {\n this.#cachedEmbeddings = this.#precomputedEmbeddings\n ? [...this.#precomputedEmbeddings]\n : await Promise.all(this.#passages.map((p) => this.#embeddingFn(p)));\n }\n\n const scored = this.#cachedEmbeddings.map((emb, i) => ({\n index: i,\n score: this.#cosineSimilarity(queryEmbedding, emb),\n }));\n\n scored.sort((a, b) => b.score - a.score);\n return scored.slice(0, k).map((s) => this.#passages[s.index] ?? \"\");\n }\n\n #cosineSimilarity(a: number[], b: number[]): number {\n let dot = 0;\n let normA = 0;\n let normB = 0;\n for (let i = 0; i < a.length; i++) {\n dot += (a[i] ?? 0) * (b[i] ?? 0);\n normA += (a[i] ?? 0) ** 2;\n normB += (b[i] ?? 0) ** 2;\n }\n return normA === 0 || normB === 0 ? 0 : dot / (Math.sqrt(normA) * Math.sqrt(normB));\n }\n}\n","import { Retriever } from \"../Retriever.js\";\n\n/** Options for the You.com retriever. */\nexport interface YouRMOptions {\n apiKey?: string;\n /** Number of snippets per web result to include (default: 1). */\n numWeb?: number;\n}\n\n/**\n * Retriever backed by the You.com search API.\n */\nexport class YouRM extends Retriever {\n readonly #options: YouRMOptions;\n\n constructor(options: YouRMOptions = {}) {\n super();\n this.#options = options;\n }\n\n async retrieve(query: string, k: number): Promise<string[]> {\n const apiKey = this.#options.apiKey ?? process.env[\"YDC_API_KEY\"];\n const url = new URL(\"https://api.ydc-index.io/search\");\n url.searchParams.set(\"query\", query);\n url.searchParams.set(\"num_web_results\", String(k));\n\n const response = await fetch(url.toString(), {\n headers: {\n ...(apiKey ? { \"X-API-Key\": apiKey } : {}),\n },\n });\n\n if (!response.ok) {\n throw new Error(`YouRM request failed: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as {\n hits?: Array<{ snippets?: string[] }>;\n };\n\n return (data.hits ?? [])\n .flatMap((hit) => hit.snippets ?? [])\n .slice(0, k);\n }\n}\n","import { Retriever } from \"../Retriever.js\";\n\n/**\n * In-memory retriever for unit testing.\n *\n * Returns passages that contain the query string (case-insensitive), or the\n * first `k` passages if no matches are found.\n */\nexport class MockRetriever extends Retriever {\n readonly #passages: string[];\n\n constructor(passages: string[]) {\n super();\n this.#passages = passages;\n }\n\n async retrieve(query: string, k: number): Promise<string[]> {\n const lower = query.toLowerCase();\n const matches = this.#passages.filter((p) => p.toLowerCase().includes(lower));\n const results = matches.length > 0 ? matches : this.#passages;\n return results.slice(0, k);\n }\n}\n","import type { Module } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\n\n/**\n * Abstract base class for all DSTsx optimizers (teleprompters).\n *\n * An optimizer takes a student program and a training set, then returns a new\n * (optimized) program with better prompts / few-shot examples.\n *\n * Mirrors `dspy.Teleprompter` in Python.\n */\nexport abstract class Optimizer {\n /**\n * Compile (optimize) a `student` program.\n *\n * @param student - The module to optimize (must not be mutated).\n * @param trainset - Examples used to generate / score candidates.\n * @param metric - Function that scores a prediction.\n * @returns - A new, optimized copy of `student`.\n */\n abstract compile(\n student: Module,\n trainset: Example[],\n metric: Metric,\n ): Promise<Module>;\n}\n","import { Optimizer } from \"./Optimizer.js\";\nimport type { Module } from \"../modules/index.js\";\nimport { Predict } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\n\n/**\n * The simplest optimizer — directly assigns labeled examples as `demos` on\n * every `Predict` sub-module without running the LM at all.\n *\n * Mirrors `dspy.LabeledFewShot` in Python.\n */\nexport class LabeledFewShot extends Optimizer {\n readonly #k: number;\n\n /**\n * @param k - Maximum number of demos to assign per predictor (default: 16).\n */\n constructor(k = 16) {\n super();\n this.#k = k;\n }\n\n async compile(student: Module, trainset: Example[], _metric: Metric): Promise<Module> {\n const optimized = student.clone();\n\n for (const [, predictor] of optimized.namedPredictors()) {\n if (predictor instanceof Predict) {\n predictor.demos = trainset.slice(0, this.#k);\n }\n }\n\n return optimized;\n }\n}\n","import { Optimizer } from \"./Optimizer.js\";\nimport type { Module } from \"../modules/index.js\";\nimport { Predict } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\n\n/** Options for BootstrapFewShot. */\nexport interface BootstrapFewShotOptions {\n /** Maximum number of bootstrapped demos per predictor (default: 4). */\n maxBootstrappedDemos?: number;\n /** Maximum number of labeled demos per predictor (default: 16). */\n maxLabeledDemos?: number;\n /** Optional teacher module; defaults to the student. */\n teacher?: Module;\n}\n\n/**\n * Collects successful execution traces by running the student (or a teacher)\n * on the training set and uses them as few-shot demonstrations.\n *\n * Mirrors `dspy.BootstrapFewShot` in Python.\n */\nexport class BootstrapFewShot extends Optimizer {\n readonly #opts: Required<BootstrapFewShotOptions>;\n\n constructor(options: BootstrapFewShotOptions = {}) {\n super();\n this.#opts = {\n maxBootstrappedDemos: options.maxBootstrappedDemos ?? 4,\n maxLabeledDemos: options.maxLabeledDemos ?? 16,\n teacher: options.teacher ?? (null as unknown as Module),\n };\n }\n\n async compile(student: Module, trainset: Example[], metric: Metric): Promise<Module> {\n const teacher = this.#opts.teacher ?? student;\n\n const demos: Example[] = [];\n\n for (const example of trainset) {\n if (demos.length >= this.#opts.maxBootstrappedDemos) break;\n\n try {\n const inputs = example.toDict() as Record<string, unknown>;\n const prediction = await (teacher.forward as (i: Record<string, unknown>) => Promise<Prediction>)(inputs);\n const raw = metric(example, prediction);\n const passed = typeof raw === \"boolean\" ? raw : raw > 0;\n if (passed) {\n demos.push(example.with(prediction.toDict() as Record<string, unknown>));\n }\n } catch {\n // Skip examples that throw (e.g. assertion failures).\n }\n }\n\n const optimized = student.clone();\n\n for (const [, predictor] of optimized.namedPredictors()) {\n if (predictor instanceof Predict) {\n predictor.demos = demos.slice(0, this.#opts.maxBootstrappedDemos);\n }\n }\n\n return optimized;\n }\n}\n","import type { Module } from \"../modules/index.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric, EvaluationResult, ExampleResult } from \"./types.js\";\n\n/** Options for the {@link evaluate} function. */\nexport interface EvaluateOptions {\n /**\n * Number of concurrent evaluations (default: 1 — sequential).\n * Set > 1 to parallelise calls.\n */\n numThreads?: number;\n /** When true, logs per-example results to the console. */\n displayProgress?: boolean;\n}\n\n/**\n * Evaluate a `program` (any {@link Module}) on a set of `examples` using a\n * `metric` function.\n *\n * Mirrors `dspy.Evaluate` in Python.\n *\n * @example\n * ```ts\n * const result = await evaluate(rag, devset, exactMatch(\"answer\"));\n * console.log(`Score: ${result.score.toFixed(2)}`);\n * ```\n */\nexport async function evaluate(\n program: Module,\n examples: Example[],\n metric: Metric,\n options: EvaluateOptions = {},\n): Promise<EvaluationResult> {\n const { numThreads = 1, displayProgress = false } = options;\n const results: ExampleResult[] = [];\n\n const runExample = async (example: Example): Promise<ExampleResult> => {\n const inputs = example.toDict() as Record<string, unknown>;\n let prediction: Prediction;\n try {\n prediction = await (program.forward as (inputs: Record<string, unknown>) => Promise<Prediction>)(inputs);\n } catch {\n prediction = new Prediction({});\n }\n const raw = metric(example, prediction);\n const score = typeof raw === \"boolean\" ? (raw ? 1 : 0) : raw;\n return { example, prediction, score, passed: score > 0 };\n };\n\n if (numThreads <= 1) {\n for (let i = 0; i < examples.length; i++) {\n const result = await runExample(examples[i]!);\n results.push(result);\n if (displayProgress) {\n console.log(`[${i + 1}/${examples.length}] score=${result.score.toFixed(2)}`);\n }\n }\n } else {\n // Process in batches of `numThreads`.\n for (let i = 0; i < examples.length; i += numThreads) {\n const batch = examples.slice(i, i + numThreads);\n const batchResults = await Promise.all(batch.map(runExample));\n results.push(...batchResults);\n if (displayProgress) {\n console.log(`[${i + batchResults.length}/${examples.length}]`);\n }\n }\n }\n\n const total = results.length;\n const numPassed = results.filter((r) => r.passed).length;\n const score = total > 0 ? results.reduce((s, r) => s + r.score, 0) / total : 0;\n\n return { score, numPassed, total, results };\n}\n","import { Prediction } from \"../primitives/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Exact Match\n// ---------------------------------------------------------------------------\n\n/**\n * Returns 1 if the prediction's `field` exactly matches the example's `field`\n * (case-insensitive by default), 0 otherwise.\n */\nexport function exactMatch(field = \"answer\", caseSensitive = false): Metric {\n return (example, prediction) => {\n const expected = String(example.get(field) ?? \"\");\n const actual = String(prediction.get(field) ?? \"\");\n return caseSensitive\n ? expected === actual\n : expected.toLowerCase() === actual.toLowerCase();\n };\n}\n\n// ---------------------------------------------------------------------------\n// F1 Score (token-level)\n// ---------------------------------------------------------------------------\n\n/**\n * Token-level F1 metric (word overlap), commonly used for SQuAD-style QA.\n */\nexport function f1(field = \"answer\"): Metric {\n return (example, prediction) => {\n const expected = tokenize(String(example.get(field) ?? \"\"));\n const actual = tokenize(String(prediction.get(field) ?? \"\"));\n\n if (expected.length === 0 && actual.length === 0) return 1;\n if (expected.length === 0 || actual.length === 0) return 0;\n\n const expectedSet = new Set(expected);\n const actualSet = new Set(actual);\n\n const common = [...expectedSet].filter((t) => actualSet.has(t));\n const precision = common.length / actual.length;\n const recall = common.length / expected.length;\n\n if (precision + recall === 0) return 0;\n return (2 * precision * recall) / (precision + recall);\n };\n}\n\n// ---------------------------------------------------------------------------\n// Pass@K\n// ---------------------------------------------------------------------------\n\n/**\n * Returns 1 if at least one of the top-`k` completions passes the `innerMetric`.\n */\nexport function passAtK(innerMetric: Metric, k: number): Metric {\n return (example, prediction, trace) => {\n for (let i = 0; i < Math.min(k, prediction.completions.length + 1); i++) {\n const candidate =\n i === 0\n ? prediction\n : buildPrediction(prediction.completions[i - 1] ?? {});\n const result = innerMetric(example, candidate, trace);\n if (result === true || (typeof result === \"number\" && result > 0)) return 1;\n }\n return 0;\n };\n}\n\n// ---------------------------------------------------------------------------\n// BLEU (simplified 1-gram / 2-gram)\n// ---------------------------------------------------------------------------\n\n/**\n * Simplified BLEU score (1-gram + 2-gram precision) for a single field.\n */\nexport function bleu(field = \"answer\"): Metric {\n return (example, prediction) => {\n const reference = tokenize(String(example.get(field) ?? \"\"));\n const hypothesis = tokenize(String(prediction.get(field) ?? \"\"));\n\n if (hypothesis.length === 0) return 0;\n\n const refSet = new Set(reference);\n const uni = hypothesis.filter((t) => refSet.has(t)).length / hypothesis.length;\n\n if (hypothesis.length < 2) return uni;\n const refBigrams = new Set(\n reference.slice(0, -1).map((t, i) => `${t} ${reference[i + 1] ?? \"\"}`),\n );\n const hypBigrams = hypothesis.slice(0, -1).map((t, i) => `${t} ${hypothesis[i + 1] ?? \"\"}`);\n const bi = hypBigrams.filter((b) => refBigrams.has(b)).length / hypBigrams.length;\n\n return Math.sqrt(uni * bi);\n };\n}\n\n// ---------------------------------------------------------------------------\n// ROUGE-L (Longest Common Subsequence)\n// ---------------------------------------------------------------------------\n\n/**\n * ROUGE-L metric (LCS-based recall/precision/F1) for a single field.\n */\nexport function rouge(field = \"answer\"): Metric {\n return (example, prediction) => {\n const reference = tokenize(String(example.get(field) ?? \"\"));\n const hypothesis = tokenize(String(prediction.get(field) ?? \"\"));\n\n if (reference.length === 0 && hypothesis.length === 0) return 1;\n if (reference.length === 0 || hypothesis.length === 0) return 0;\n\n const lcsLen = lcs(reference, hypothesis);\n const precision = lcsLen / hypothesis.length;\n const recall = lcsLen / reference.length;\n\n if (precision + recall === 0) return 0;\n return (2 * precision * recall) / (precision + recall);\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction tokenize(text: string): string[] {\n return text.toLowerCase().replace(/[^\\w\\s]/g, \"\").split(/\\s+/).filter(Boolean);\n}\n\nfunction lcs(a: string[], b: string[]): number {\n const m = a.length;\n const n = b.length;\n const dp = Array.from({ length: m + 1 }, () => new Array<number>(n + 1).fill(0));\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i]![j] = a[i - 1] === b[j - 1] ? dp[i - 1]![j - 1]! + 1 : Math.max(dp[i - 1]![j]!, dp[i]![j - 1]!);\n }\n }\n return dp[m]![n]!;\n}\n\nfunction buildPrediction(data: Record<string, unknown>): Prediction {\n return new Prediction(data);\n}\n","import { BootstrapFewShot, type BootstrapFewShotOptions } from \"./BootstrapFewShot.js\";\nimport { evaluate } from \"../evaluate/index.js\";\nimport type { Module } from \"../modules/index.js\";\nimport { Predict } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\n\n/** Options for BootstrapFewShotWithRandomSearch. */\nexport interface BootstrapFewShotWithRandomSearchOptions extends BootstrapFewShotOptions {\n /** Number of candidate demo subsets to evaluate (default: 8). */\n numCandidatePrograms?: number;\n /** Held-out validation set. If omitted, the trainset is used for scoring. */\n valset?: Example[];\n}\n\n/**\n * Extends {@link BootstrapFewShot} by trying multiple random demo subsets and\n * selecting the combination with the highest validation score.\n *\n * Mirrors `dspy.BootstrapFewShotWithRandomSearch` in Python.\n */\nexport class BootstrapFewShotWithRandomSearch extends BootstrapFewShot {\n readonly #numCandidates: number;\n readonly #valset: Example[] | undefined;\n\n constructor(options: BootstrapFewShotWithRandomSearchOptions = {}) {\n super(options);\n this.#numCandidates = options.numCandidatePrograms ?? 8;\n this.#valset = options.valset;\n }\n\n override async compile(student: Module, trainset: Example[], metric: Metric): Promise<Module> {\n // First collect the bootstrapped demos via the parent class.\n const bootstrapped = await super.compile(student, trainset, metric);\n\n const allDemos: Example[] = [];\n for (const [, pred] of bootstrapped.namedPredictors()) {\n if (pred instanceof Predict) {\n allDemos.push(...pred.demos);\n }\n }\n\n if (allDemos.length === 0) return bootstrapped;\n\n const evalSet = this.#valset ?? trainset;\n let bestScore = -Infinity;\n let bestModule: Module = bootstrapped;\n\n for (let i = 0; i < this.#numCandidates; i++) {\n const candidate = bootstrapped.clone();\n\n const shuffle = [...allDemos].sort(() => Math.random() - 0.5);\n const k = Math.floor(Math.random() * allDemos.length) + 1;\n\n for (const [, pred] of candidate.namedPredictors()) {\n if (pred instanceof Predict) {\n pred.demos = shuffle.slice(0, k);\n }\n }\n\n const { score } = await evaluate(candidate, evalSet, metric);\n if (score > bestScore) {\n bestScore = score;\n bestModule = candidate;\n }\n }\n\n return bestModule;\n }\n}\n","import { BootstrapFewShot } from \"./BootstrapFewShot.js\";\nimport { Predict } from \"../modules/index.js\";\nimport type { Module } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\n\nexport interface BootstrapFewShotWithOptunaOptions {\n maxBootstrappedDemos?: number;\n maxLabeledDemos?: number;\n /** Number of TPE trials (default: 20). */\n numTrials?: number;\n valset?: Example[];\n}\n\n/**\n * Bayesian optimizer using a simplified TPE (Tree-structured Parzen Estimator).\n *\n * Extends BootstrapFewShot: first collects candidate demos via the parent,\n * then runs `numTrials` iterations sampling demo subsets using TPE to find\n * the best-scoring configuration.\n */\nexport class BootstrapFewShotWithOptuna extends BootstrapFewShot {\n readonly #numTrials: number;\n readonly #valset: Example[] | undefined;\n\n constructor(options: BootstrapFewShotWithOptunaOptions = {}) {\n super(options);\n this.#numTrials = options.numTrials ?? 20;\n this.#valset = options.valset;\n }\n\n override async compile(\n student: Module,\n trainset: Example[],\n metric: Metric,\n ): Promise<Module> {\n // Step 1: collect bootstrapped demos via parent\n const bootstrapped = await super.compile(student, trainset, metric);\n\n // Gather all demos from the bootstrapped module\n const allDemos: Example[] = [];\n for (const [, predictor] of bootstrapped.namedPredictors()) {\n if (predictor instanceof Predict) {\n allDemos.push(...predictor.demos);\n }\n }\n\n if (allDemos.length === 0) {\n return bootstrapped;\n }\n\n const evalSet = this.#valset ?? trainset;\n const maxDemos = Math.max(1, allDemos.length);\n\n /** Fraction of trials to consider \"good\" in TPE sampling. */\n const TOP_TRIALS_FRACTION = 0.25;\n /** Probability of sampling from the \"good\" trials pool vs random. */\n const GOOD_TRIAL_SAMPLING_PROBABILITY = 0.7;\n\n interface Trial {\n indices: number[];\n score: number;\n }\n const trials: Trial[] = [];\n\n const evaluate = async (candidate: Module): Promise<number> => {\n let score = 0;\n for (const example of evalSet) {\n try {\n const inputs = example.toDict() as Record<string, unknown>;\n const prediction = await (\n candidate.forward as (i: Record<string, unknown>) => Promise<Prediction>\n )(inputs);\n const raw = metric(example, prediction);\n score += typeof raw === \"boolean\" ? (raw ? 1 : 0) : raw;\n } catch {\n // skip failed examples\n }\n }\n return evalSet.length > 0 ? score / evalSet.length : 0;\n };\n\n const sampleIndices = (\n goodTrials: Trial[],\n badTrials: Trial[],\n n: number,\n ): number[] => {\n const useGood = goodTrials.length > 0 && Math.random() < GOOD_TRIAL_SAMPLING_PROBABILITY;\n const pool =\n useGood ? goodTrials : badTrials.length > 0 ? badTrials : null;\n\n if (pool !== null && pool.length > 0) {\n const base = pool[Math.floor(Math.random() * pool.length)]!;\n const result = new Set(base.indices);\n if (Math.random() < 0.5 && result.size < maxDemos) {\n result.add(Math.floor(Math.random() * maxDemos));\n } else if (result.size > 1) {\n const arr = [...result];\n result.delete(arr[Math.floor(Math.random() * arr.length)]!);\n }\n return [...result].slice(0, n);\n }\n\n // Random sample\n const indices = Array.from({ length: maxDemos }, (_, i) => i);\n return indices.sort(() => Math.random() - 0.5).slice(0, Math.min(n, maxDemos));\n };\n\n let bestScore = -Infinity;\n let bestModule = bootstrapped;\n\n for (let t = 0; t < this.#numTrials; t++) {\n const sortedTrials = [...trials].sort((a, b) => b.score - a.score);\n const topK = Math.max(1, Math.floor(sortedTrials.length * TOP_TRIALS_FRACTION));\n const goodTrials = sortedTrials.slice(0, topK);\n const badTrials = sortedTrials.slice(topK);\n\n // Use 50% of all available demos per trial. This is the starting\n // point for TPE exploration; mutations in sampleIndices() may grow or\n // shrink the subset by ±1 around this baseline.\n const numDemos = Math.max(1, Math.floor(maxDemos * 0.5));\n const indices = sampleIndices(goodTrials, badTrials, numDemos);\n const selectedDemos = indices\n .map((i) => allDemos[i])\n .filter((d): d is Example => d !== undefined);\n\n const candidate = bootstrapped.clone();\n for (const [, predictor] of candidate.namedPredictors()) {\n if (predictor instanceof Predict) {\n predictor.demos = selectedDemos;\n }\n }\n\n const score = await evaluate(candidate);\n trials.push({ indices, score });\n\n if (score > bestScore) {\n bestScore = score;\n bestModule = candidate;\n }\n }\n\n return bestModule;\n }\n}\n","import { Optimizer } from \"./Optimizer.js\";\nimport { Predict } from \"../modules/index.js\";\nimport type { Module } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\nimport { evaluate } from \"../evaluate/index.js\";\nimport { settings } from \"../settings/index.js\";\n\n/** Options for COPRO. */\nexport interface COPROOptions {\n /** Number of instruction candidates to generate per predictor (default: 5). */\n breadth?: number;\n /** Number of refinement rounds (default: 3). */\n depth?: number;\n}\n\n/**\n * Collaborative Prompt Optimizer (COPRO) — uses the LM to propose improved\n * instructions for each `Predict` sub-module and selects the best via\n * metric evaluation.\n *\n * Mirrors `dspy.COPRO` in Python.\n */\nexport class COPRO extends Optimizer {\n readonly #breadth: number;\n readonly #depth: number;\n\n constructor(options: COPROOptions = {}) {\n super();\n this.#breadth = options.breadth ?? 5;\n this.#depth = options.depth ?? 3;\n }\n\n async compile(student: Module, trainset: Example[], metric: Metric): Promise<Module> {\n const lm = settings.lm;\n if (!lm) throw new Error(\"COPRO requires a configured LM.\");\n\n let best = student;\n let bestScore = (await evaluate(student, trainset.slice(0, 10), metric)).score;\n\n for (let round = 0; round < this.#depth; round++) {\n for (const [name, predictor] of best.namedPredictors()) {\n if (!(predictor instanceof Predict)) continue;\n\n const candidates: string[] = [];\n for (let i = 0; i < this.#breadth; i++) {\n const prompt = this.#buildInstructionPrompt(predictor.instructions ?? \"\", name);\n const resp = await lm.call(prompt, { temperature: 0.9 });\n candidates.push(resp.text.trim());\n }\n\n for (const candidate of candidates) {\n const clone = best.clone();\n\n for (const [n, p] of clone.namedPredictors()) {\n if (n === name && p instanceof Predict) {\n p.instructions = candidate;\n }\n }\n\n const { score } = await evaluate(clone, trainset.slice(0, 10), metric);\n if (score > bestScore) {\n bestScore = score;\n best = clone;\n }\n }\n }\n }\n\n return best;\n }\n\n #buildInstructionPrompt(currentInstruction: string, fieldName: string): string {\n return (\n `You are an expert prompt engineer.\\n` +\n `Current instruction for the \"${fieldName}\" field: \"${currentInstruction}\"\\n\\n` +\n `Write an improved, concise instruction for this field that will produce ` +\n `better outputs from a language model. Output only the instruction text.`\n );\n }\n}\n","import { Optimizer } from \"./Optimizer.js\";\nimport { BootstrapFewShotWithRandomSearch } from \"./BootstrapFewShotWithRandomSearch.js\";\nimport { COPRO } from \"./COPRO.js\";\nimport type { Module } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\n\n/** Options for MIPRO. */\nexport interface MIPROOptions {\n /** Number of instruction candidates per predictor (default: 5). */\n numCandidates?: number;\n /** Temperature for instruction generation (default: 0.9). */\n initTemperature?: number;\n /** Number of random bootstrap candidate programs to evaluate (default: 8). */\n numCandidatePrograms?: number;\n /** Emit verbose progress logs (default: false). */\n verbose?: boolean;\n}\n\n/**\n * Multi-stage Instruction Prompt Optimizer (MIPRO) — combines COPRO-style\n * instruction proposal with BootstrapFewShotWithRandomSearch to jointly\n * optimize instructions and demonstrations.\n *\n * Mirrors `dspy.MIPRO` in Python.\n */\nexport class MIPRO extends Optimizer {\n readonly #opts: Required<MIPROOptions>;\n\n constructor(options: MIPROOptions = {}) {\n super();\n this.#opts = {\n numCandidates: options.numCandidates ?? 5,\n initTemperature: options.initTemperature ?? 0.9,\n numCandidatePrograms: options.numCandidatePrograms ?? 8,\n verbose: options.verbose ?? false,\n };\n }\n\n async compile(student: Module, trainset: Example[], metric: Metric): Promise<Module> {\n if (this.#opts.verbose) console.log(\"[MIPRO] Phase 1: Instruction optimization (COPRO)\");\n\n const copro = new COPRO({ breadth: this.#opts.numCandidates, depth: 2 });\n const instructionOptimized = await copro.compile(student, trainset, metric);\n\n if (this.#opts.verbose) console.log(\"[MIPRO] Phase 2: Demo optimization (BootstrapFewShotWithRandomSearch)\");\n\n const bootstrap = new BootstrapFewShotWithRandomSearch({\n numCandidatePrograms: this.#opts.numCandidatePrograms,\n });\n return bootstrap.compile(instructionOptimized, trainset, metric);\n }\n}\n","import { Optimizer } from \"./Optimizer.js\";\nimport { Predict } from \"../modules/index.js\";\nimport type { Module } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\n\n/** Options for KNNFewShot. */\nexport interface KNNFewShotOptions {\n /** Number of nearest neighbors to use as demos (default: 3). */\n k?: number;\n /**\n * Embedding function that maps a text string to a dense vector.\n * Required for computing similarity between examples.\n */\n embeddingFn: (text: string) => Promise<number[]>;\n /**\n * Which field of each example to embed for similarity comparison\n * (default: first input field of the signature).\n */\n keyField?: string;\n}\n\n/**\n * Dynamic few-shot optimizer that selects demonstrations at inference time\n * using k-nearest-neighbour search over the training set.\n *\n * Unlike static few-shot optimizers this one injects demos into a\n * `Predict.forward` call by wrapping each predictor at compile time.\n *\n * Mirrors `dspy.KNNFewShot` in Python.\n */\nexport class KNNFewShot extends Optimizer {\n readonly #opts: Required<KNNFewShotOptions>;\n\n constructor(options: KNNFewShotOptions) {\n super();\n this.#opts = {\n k: options.k ?? 3,\n embeddingFn: options.embeddingFn,\n keyField: options.keyField ?? \"\",\n };\n }\n\n async compile(student: Module, trainset: Example[], _metric: Metric): Promise<Module> {\n const embeddingFn = this.#opts.embeddingFn;\n const k = this.#opts.k;\n\n // Pre-compute embeddings for all training examples.\n const trainEmbeddings = await Promise.all(\n trainset.map(async (ex) => {\n const key = this.#opts.keyField\n ? String(ex.get(this.#opts.keyField) ?? \"\")\n : Object.values(ex.toDict()).join(\" \");\n return { ex, embedding: await embeddingFn(key) };\n }),\n );\n\n const optimized = student.clone();\n\n // Wrap each Predict.forward to inject KNN demos at call time.\n // Because `optimized` is a deep clone, wrapping forward here does not\n // affect the original `student`.\n for (const [, predictor] of optimized.namedPredictors()) {\n if (!(predictor instanceof Predict)) continue;\n\n const originalForward = predictor.forward.bind(predictor);\n\n predictor.forward = async (inputs: Record<string, unknown>) => {\n const queryText = Object.values(inputs).join(\" \");\n const queryEmb = await embeddingFn(queryText);\n\n const scored = trainEmbeddings.map(({ ex, embedding }) => ({\n ex,\n score: cosineSimilarity(queryEmb, embedding),\n }));\n scored.sort((a, b) => b.score - a.score);\n predictor.demos = scored.slice(0, k).map((s) => s.ex);\n\n return originalForward(inputs);\n };\n }\n\n return optimized;\n }\n}\n\nfunction cosineSimilarity(a: number[], b: number[]): number {\n let dot = 0;\n let normA = 0;\n let normB = 0;\n for (let i = 0; i < a.length; i++) {\n dot += (a[i] ?? 0) * (b[i] ?? 0);\n normA += (a[i] ?? 0) ** 2;\n normB += (b[i] ?? 0) ** 2;\n }\n return normA === 0 || normB === 0 ? 0 : dot / (Math.sqrt(normA) * Math.sqrt(normB));\n}\n","import { Optimizer } from \"./Optimizer.js\";\nimport { evaluate } from \"../evaluate/index.js\";\nimport type { Module } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\nimport type { Prediction } from \"../primitives/index.js\";\n\n/** Options for the Ensemble optimizer. */\nexport interface EnsembleOptimizerOptions {\n /**\n * Custom function to combine multiple predictions into one.\n * Defaults to majority vote on the first output field.\n */\n reduceFunc?: (predictions: Prediction[]) => Prediction;\n}\n\n/**\n * Combines multiple optimized programs into a single ensemble module.\n *\n * Mirrors `dspy.Ensemble` (optimizer version) in Python.\n */\nexport class EnsembleOptimizer extends Optimizer {\n readonly #reduceFunc: ((predictions: Prediction[]) => Prediction) | undefined;\n\n constructor(options: EnsembleOptimizerOptions = {}) {\n super();\n this.#reduceFunc = options.reduceFunc;\n }\n\n async compile(student: Module, _trainset: Example[], _metric: Metric): Promise<Module> {\n\n const reduceFunc = this.#reduceFunc;\n\n // Return a thin wrapper module that runs `student` (treated as the\n // representative member). Callers typically build their own ensemble by\n // passing multiple programs to the `Ensemble` module directly.\n const wrapper: Module = {\n namedPredictors: student.namedPredictors.bind(student),\n dump: student.dump.bind(student),\n load: student.load.bind(student),\n async forward(...args: unknown[]) {\n const pred = await (student.forward as (...a: unknown[]) => Promise<Prediction>)(\n ...args,\n );\n return reduceFunc ? reduceFunc([pred]) : pred;\n },\n } as unknown as Module;\n\n return wrapper;\n }\n}\n","import { writeFileSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { Optimizer } from \"./Optimizer.js\";\nimport { BootstrapFewShot } from \"./BootstrapFewShot.js\";\nimport { Predict } from \"../modules/index.js\";\nimport type { Module } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\n\n/** Output format for the exported fine-tuning data. */\nexport type FinetuneFormat = \"openai\" | \"generic\";\n\n/** Options for BootstrapFinetune. */\nexport interface BootstrapFinetuneOptions {\n /** Path to write the JSONL fine-tuning file (default: \"./finetune_data.jsonl\"). */\n exportPath?: string | undefined;\n /** Format of the exported data (default: \"openai\"). */\n format?: FinetuneFormat | undefined;\n /** Bootstrap options passed to BootstrapFewShot internally. */\n maxBootstrappedDemos?: number | undefined;\n}\n\n/**\n * Collects LM traces via BootstrapFewShot and exports them as a JSONL file\n * suitable for fine-tuning.\n *\n * - `\"openai\"` format: `{ messages: [{role, content}, ...] }` per line\n * - `\"generic\"` format: `{ prompt: string, completion: string }` per line\n *\n * @example\n * ```ts\n * const optimizer = new BootstrapFinetune({\n * exportPath: \"./finetune_data.jsonl\",\n * format: \"openai\",\n * });\n * const recipe = await optimizer.compile(program, trainset, metric);\n * ```\n */\nexport class BootstrapFinetune extends Optimizer {\n readonly #exportPath: string;\n readonly #format: FinetuneFormat;\n readonly #maxBootstrappedDemos: number;\n readonly #bootstrap: BootstrapFewShot;\n\n constructor(options: BootstrapFinetuneOptions = {}) {\n super();\n this.#exportPath = options.exportPath ?? \"./finetune_data.jsonl\";\n this.#format = options.format ?? \"openai\";\n this.#maxBootstrappedDemos = options.maxBootstrappedDemos ?? 4;\n this.#bootstrap = new BootstrapFewShot({\n maxBootstrappedDemos: this.#maxBootstrappedDemos,\n });\n }\n\n override async compile(student: Module, trainset: Example[], metric: Metric): Promise<Module> {\n const compiled = await this.#bootstrap.compile(student, trainset, metric);\n\n const records: string[] = [];\n for (const [, predictor] of compiled.namedPredictors()) {\n if (predictor instanceof Predict) {\n for (const demo of predictor.demos) {\n const dict = demo.toDict() as Record<string, unknown>;\n const inputFields = [...predictor.signature.inputs.keys()];\n const outputFields = [...predictor.signature.outputs.keys()];\n\n const inputStr = inputFields.map((k) => `${k}: ${String(dict[k] ?? \"\")}`).join(\"\\n\");\n const outputStr = outputFields.map((k) => `${k}: ${String(dict[k] ?? \"\")}`).join(\"\\n\");\n\n if (this.#format === \"openai\") {\n records.push(\n JSON.stringify({\n messages: [\n { role: \"user\", content: inputStr },\n { role: \"assistant\", content: outputStr },\n ],\n }),\n );\n } else {\n records.push(JSON.stringify({ prompt: inputStr, completion: outputStr }));\n }\n }\n }\n }\n\n const dir = dirname(this.#exportPath);\n mkdirSync(dir, { recursive: true });\n writeFileSync(this.#exportPath, records.join(\"\\n\"), \"utf8\");\n\n return compiled;\n }\n}\n","import { Optimizer } from \"./Optimizer.js\";\nimport { BootstrapFewShot } from \"./BootstrapFewShot.js\";\nimport type { Module } from \"../modules/index.js\";\nimport { Predict } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\nimport { evaluate } from \"../evaluate/index.js\";\nimport { settings } from \"../settings/index.js\";\n\n/** Options for GRPO. */\nexport interface GRPOOptions {\n /** Number of optimization steps (default: 20). */\n numSteps?: number | undefined;\n /** Number of candidates per group per step (default: 8). */\n groupSize?: number | undefined;\n /** Sampling temperature for candidate generation (default: 1.0). */\n temperature?: number | undefined;\n /** Max labeled demos (default: 16). */\n maxLabeledDemos?: number | undefined;\n}\n\n/**\n * Group Relative Policy Optimization optimizer.\n *\n * Mirrors `dspy.GRPO` in Python. Runs `numSteps` iterations where each step:\n * 1. Samples `groupSize` candidate instruction variants via the LM.\n * 2. Evaluates each against the training set.\n * 3. Updates the best instruction using group-relative scoring.\n *\n * Pure TypeScript — no external dependencies beyond the configured LM.\n */\nexport class GRPO extends Optimizer {\n readonly #numSteps: number;\n readonly #groupSize: number;\n readonly #temperature: number;\n readonly #maxLabeledDemos: number;\n\n constructor(options: GRPOOptions = {}) {\n super();\n this.#numSteps = options.numSteps ?? 20;\n this.#groupSize = options.groupSize ?? 8;\n this.#temperature = options.temperature ?? 1.0;\n this.#maxLabeledDemos = options.maxLabeledDemos ?? 16;\n }\n\n override async compile(student: Module, trainset: Example[], metric: Metric): Promise<Module> {\n const lm = settings.lm;\n if (!lm) throw new Error(\"GRPO requires a configured LM.\");\n\n const bootstrap = new BootstrapFewShot({\n maxBootstrappedDemos: this.#maxLabeledDemos,\n });\n let best = await bootstrap.compile(student, trainset, metric);\n\n const evalSet = trainset.slice(0, Math.min(10, trainset.length));\n let bestScore = (await evaluate(best, evalSet, metric)).score;\n\n for (let step = 0; step < this.#numSteps; step++) {\n const candidates: { module: Module; score: number }[] = [];\n\n for (let g = 0; g < this.#groupSize; g++) {\n const candidate = best.clone();\n\n for (const [, predictor] of candidate.namedPredictors()) {\n if (predictor instanceof Predict) {\n const currentInstr = predictor.instructions ?? \"\";\n const prompt =\n `You are an expert prompt engineer.\\n` +\n `Current instruction: \"${currentInstr}\"\\n\\n` +\n `Write an improved instruction for a language model. Output only the instruction text.`;\n const resp = await lm.call(prompt, { temperature: this.#temperature });\n predictor.instructions = resp.text.trim();\n }\n }\n\n const { score } = await evaluate(candidate, evalSet, metric);\n candidates.push({ module: candidate, score });\n }\n\n const scores = candidates.map((c) => c.score);\n const mean = scores.reduce((a, b) => a + b, 0) / scores.length;\n const std =\n Math.sqrt(scores.reduce((a, b) => a + (b - mean) ** 2, 0) / scores.length) || 1;\n const advantages = scores.map((s) => (s - mean) / std);\n\n const bestIdx = advantages.indexOf(Math.max(...advantages));\n const topScore = candidates[bestIdx]?.score ?? 0;\n if (topScore > bestScore) {\n bestScore = topScore;\n best = candidates[bestIdx]!.module;\n }\n }\n\n return best;\n }\n}\n","import { Optimizer } from \"./Optimizer.js\";\nimport { BootstrapFewShot } from \"./BootstrapFewShot.js\";\nimport { Predict } from \"../modules/index.js\";\nimport type { Module } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\nimport { evaluate } from \"../evaluate/index.js\";\n\n/** Options for SIMBA. */\nexport interface SIMBAOptions {\n /** Number of optimization iterations (default: 10). */\n numIter?: number | undefined;\n /** Mini-batch size for each evaluation (default: 8). */\n batchSize?: number | undefined;\n /** Max bootstrapped demos (default: 4). */\n maxBootstrappedDemos?: number | undefined;\n}\n\n/**\n * SIMBA (Stochastic Introspective Mini-Batch Ascent) optimizer.\n *\n * A lightweight stochastic optimizer that:\n * 1. Selects a random mini-batch from the training set each iteration.\n * 2. Proposes a candidate (via demo subset sampling).\n * 3. Accepts the candidate if it improves on the current best.\n * 4. Returns the overall best module found.\n */\nexport class SIMBA extends Optimizer {\n readonly #numIter: number;\n readonly #batchSize: number;\n readonly #maxBootstrappedDemos: number;\n\n constructor(options: SIMBAOptions = {}) {\n super();\n this.#numIter = options.numIter ?? 10;\n this.#batchSize = options.batchSize ?? 8;\n this.#maxBootstrappedDemos = options.maxBootstrappedDemos ?? 4;\n }\n\n override async compile(student: Module, trainset: Example[], metric: Metric): Promise<Module> {\n const bootstrap = new BootstrapFewShot({\n maxBootstrappedDemos: this.#maxBootstrappedDemos,\n });\n let best = await bootstrap.compile(student, trainset, metric);\n\n const evalBatch = trainset.slice(0, Math.min(this.#batchSize, trainset.length));\n let bestScore = (await evaluate(best, evalBatch, metric)).score;\n\n for (let iter = 0; iter < this.#numIter; iter++) {\n // Fisher-Yates shuffle for unbiased sampling\n const shuffled = [...trainset];\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [shuffled[i], shuffled[j]] = [shuffled[j]!, shuffled[i]!];\n }\n const batch = shuffled.slice(0, Math.min(this.#batchSize, shuffled.length));\n\n const candidate = best.clone();\n for (const [, predictor] of candidate.namedPredictors()) {\n if (predictor instanceof Predict && predictor.demos.length > 1) {\n const dropIdx = Math.floor(Math.random() * predictor.demos.length);\n predictor.demos = predictor.demos.filter((_, i) => i !== dropIdx);\n }\n }\n\n const { score } = await evaluate(candidate, batch, metric);\n if (score >= bestScore) {\n bestScore = score;\n best = candidate;\n }\n }\n\n return best;\n }\n}\n","import { Optimizer } from \"./Optimizer.js\";\nimport { Predict } from \"../modules/index.js\";\nimport type { Module } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\nimport { evaluate } from \"../evaluate/index.js\";\nimport { settings } from \"../settings/index.js\";\n\n/** Options for AvatarOptimizer. */\nexport interface AvatarOptimizerOptions {\n /** Number of avatar candidates to try per predictor (default: 4). */\n numAvatars?: number | undefined;\n /** Max labeled demos (default: 8). */\n maxLabeledDemos?: number | undefined;\n}\n\n/**\n * AvatarOptimizer iteratively proposes and evaluates \"avatar\" role descriptions\n * (persona prefixes) for each Predict module.\n *\n * Mirrors `dspy.AvatarOptimizer` in Python.\n *\n * For each predictor, proposes `numAvatars` different role/persona descriptions\n * and selects the one that scores highest on the training set.\n */\nexport class AvatarOptimizer extends Optimizer {\n readonly #numAvatars: number;\n readonly #maxLabeledDemos: number;\n\n constructor(options: AvatarOptimizerOptions = {}) {\n super();\n this.#numAvatars = options.numAvatars ?? 4;\n this.#maxLabeledDemos = options.maxLabeledDemos ?? 8;\n }\n\n override async compile(student: Module, trainset: Example[], metric: Metric): Promise<Module> {\n const lm = settings.lm;\n if (!lm) throw new Error(\"AvatarOptimizer requires a configured LM.\");\n\n let best = student.clone();\n const evalSet = trainset.slice(0, Math.min(this.#maxLabeledDemos, trainset.length));\n let bestScore = (await evaluate(best, evalSet, metric)).score;\n\n for (const [name, predictor] of best.namedPredictors()) {\n if (!(predictor instanceof Predict)) continue;\n\n const avatarCandidates: string[] = [];\n for (let i = 0; i < this.#numAvatars; i++) {\n const prompt =\n `You are an expert at designing AI personas.\\n` +\n `Task field: \"${name}\"\\n` +\n `Current instruction: \"${predictor.instructions ?? \"\"}\"\\n\\n` +\n `Write a concise role/persona prefix (1-2 sentences) for an AI assistant ` +\n `that excels at this task. Output only the persona description.`;\n const resp = await lm.call(prompt, { temperature: 0.9 });\n avatarCandidates.push(resp.text.trim());\n }\n\n for (const avatar of avatarCandidates) {\n const clone = best.clone();\n for (const [n, p] of clone.namedPredictors()) {\n if (n === name && p instanceof Predict) {\n const base = p.instructions ?? \"\";\n p.instructions = `${avatar}\\n\\n${base}`.trim();\n }\n }\n const { score } = await evaluate(clone, evalSet, metric);\n if (score > bestScore) {\n bestScore = score;\n best = clone;\n }\n }\n }\n\n return best;\n }\n}\n","import type { Tool } from \"../modules/ReAct.js\";\n\nexport interface MCPAdapterOptions {\n serverUrl?: string;\n tools?: Array<{\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n }>;\n callHandler?: (name: string, args: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * Wraps MCP server tools as DSTsx Tool objects.\n *\n * When `tools` + `callHandler` are provided, no network connection is needed.\n * A live MCP connection (via `serverUrl`) requires the\n * `@modelcontextprotocol/sdk` package to be installed.\n */\nexport class MCPToolAdapter {\n readonly #options: MCPAdapterOptions;\n #tools: Tool[] | undefined;\n\n constructor(options: MCPAdapterOptions = {}) {\n this.#options = options;\n }\n\n async getTools(): Promise<Tool[]> {\n if (this.#tools) return this.#tools;\n\n if (this.#options.tools && this.#options.callHandler) {\n const callHandler = this.#options.callHandler;\n this.#tools = this.#options.tools.map((t) => ({\n name: t.name,\n description: t.description,\n fn: async (args: string) => {\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(args) as Record<string, unknown>;\n } catch {\n parsed = { input: args };\n }\n const result = await callHandler(t.name, parsed);\n return typeof result === \"string\" ? result : JSON.stringify(result);\n },\n }));\n return this.#tools;\n }\n\n await import(\"@modelcontextprotocol/sdk/client/index.js\").catch(() => {\n throw new Error(\n \"The `@modelcontextprotocol/sdk` package is required for MCPToolAdapter.\\n\" +\n \"Install it with: npm install @modelcontextprotocol/sdk\",\n );\n });\n\n throw new Error(\n \"Live MCP connection not yet implemented. Use tools+callHandler for now.\",\n );\n }\n}\n","import type { Module } from \"../modules/index.js\";\nimport { Prediction } from \"../primitives/index.js\";\n\nexport interface MCPTool {\n name: string;\n description: string;\n inputSchema: {\n type: \"object\";\n properties: Record<string, { type: string; description?: string }>;\n required?: string[];\n };\n handler: (inputs: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * Exposes DSTsx modules as MCP-compatible tool definitions.\n *\n * Registered modules can be called via `callTool()`. To create a live stdio\n * server the `@modelcontextprotocol/sdk` package must be installed.\n */\nexport class DSTsxMCPServer {\n readonly #tools: Map<string, MCPTool> = new Map();\n\n registerModule(\n name: string,\n description: string,\n module: Module,\n inputFields: string[],\n ): this {\n const properties: Record<string, { type: string; description?: string }> = {};\n for (const field of inputFields) {\n properties[field] = { type: \"string\" };\n }\n this.#tools.set(name, {\n name,\n description,\n inputSchema: { type: \"object\", properties, required: inputFields },\n handler: async (inputs) => {\n const result = await (\n module.forward as (i: Record<string, unknown>) => Promise<Prediction>\n )(inputs);\n return result.toJSON();\n },\n });\n return this;\n }\n\n getToolDefinitions(): MCPTool[] {\n return [...this.#tools.values()];\n }\n\n async callTool(name: string, inputs: Record<string, unknown>): Promise<unknown> {\n const tool = this.#tools.get(name);\n if (!tool) throw new Error(`Tool \"${name}\" not found.`);\n return tool.handler(inputs);\n }\n\n async createStdioServer(): Promise<unknown> {\n await import(\"@modelcontextprotocol/sdk/server/index.js\").catch(() => {\n throw new Error(\n \"The `@modelcontextprotocol/sdk` package is required.\\n\" +\n \"Install it with: npm install @modelcontextprotocol/sdk\",\n );\n });\n throw new Error(\n \"createStdioServer requires @modelcontextprotocol/sdk to be installed.\",\n );\n }\n}\n","/** Event types emitted during optimization. */\nexport interface TrackerEvent {\n /** Type of event. */\n type: \"step\" | \"trial\" | \"best\" | \"done\";\n /** Current step number. */\n step?: number | undefined;\n /** Score at this event. */\n score?: number | undefined;\n /** Additional metadata. */\n metadata?: Record<string, unknown> | undefined;\n}\n\n/**\n * Abstract base class for experiment trackers.\n *\n * Implement this to log optimization events to console, files, or external\n * experiment tracking services.\n */\nexport abstract class Tracker {\n /** Log a single event. */\n abstract log(event: TrackerEvent): void;\n /** Flush any buffered events (e.g. write to disk). */\n abstract flush(): Promise<void>;\n}\n","import { Tracker } from \"./Tracker.js\";\nimport type { TrackerEvent } from \"./Tracker.js\";\n\n/**\n * A simple tracker that logs events to the console.\n */\nexport class ConsoleTracker extends Tracker {\n override log(event: TrackerEvent): void {\n const parts: string[] = [`[${event.type.toUpperCase()}]`];\n if (event.step !== undefined) parts.push(`step=${event.step}`);\n if (event.score !== undefined) parts.push(`score=${event.score.toFixed(4)}`);\n if (event.metadata) parts.push(JSON.stringify(event.metadata));\n console.log(parts.join(\" \"));\n }\n\n override async flush(): Promise<void> {\n // No buffering — nothing to flush.\n }\n}\n","import { mkdirSync } from \"node:fs\";\nimport { appendFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { Tracker } from \"./Tracker.js\";\nimport type { TrackerEvent } from \"./Tracker.js\";\n\n/**\n * A tracker that appends JSON-encoded events as lines to a file.\n *\n * @example\n * ```ts\n * const tracker = new JsonFileTracker(\"./runs/experiment1.jsonl\");\n * const optimizer = new GRPO({ numSteps: 10 });\n * ```\n */\nexport class JsonFileTracker extends Tracker {\n readonly #path: string;\n readonly #buffer: string[] = [];\n\n constructor(path: string) {\n super();\n this.#path = path;\n mkdirSync(dirname(path), { recursive: true });\n }\n\n override log(event: TrackerEvent): void {\n this.#buffer.push(JSON.stringify({ ...event, ts: new Date().toISOString() }));\n }\n\n override async flush(): Promise<void> {\n if (this.#buffer.length === 0) return;\n const content = this.#buffer.join(\"\\n\") + \"\\n\";\n this.#buffer.length = 0;\n await appendFile(this.#path, content, \"utf8\");\n }\n}\n"],"mappings":"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","names":["import_node_fs","Anthropic","score","evaluate","import_node_fs","import_node_path","module","import_node_fs","import_node_path"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/signatures/Field.ts","../src/signatures/Signature.ts","../src/primitives/Example.ts","../src/primitives/Prediction.ts","../src/primitives/majority.ts","../src/primitives/Image.ts","../src/lm/cache.ts","../src/lm/DiskCache.ts","../src/lm/LM.ts","../src/lm/adapters/OpenAI.ts","../src/settings/Settings.ts","../src/lm/adapters/Anthropic.ts","../src/lm/adapters/Cohere.ts","../src/lm/adapters/GoogleAI.ts","../src/lm/adapters/Ollama.ts","../src/lm/adapters/LMStudio.ts","../src/lm/adapters/HuggingFace.ts","../src/lm/adapters/MockLM.ts","../src/modules/Module.ts","../src/modules/Predict.ts","../src/modules/ChainOfThought.ts","../src/modules/ChainOfThoughtWithHint.ts","../src/modules/MultiChainComparison.ts","../src/modules/ReAct.ts","../src/modules/ProgramOfThought.ts","../src/modules/Retrieve.ts","../src/assertions/Assert.ts","../src/assertions/Suggest.ts","../src/modules/Retry.ts","../src/modules/BestOfN.ts","../src/modules/Ensemble.ts","../src/modules/TypedPredictor.ts","../src/modules/Parallel.ts","../src/modules/Refine.ts","../src/modules/NativeReAct.ts","../src/retrieve/Retriever.ts","../src/retrieve/backends/ColBERTv2.ts","../src/retrieve/backends/PineconeRM.ts","../src/retrieve/backends/WeaviateRM.ts","../src/retrieve/backends/ChromadbRM.ts","../src/retrieve/backends/QdrantRM.ts","../src/retrieve/backends/FaissRM.ts","../src/retrieve/backends/YouRM.ts","../src/retrieve/backends/MockRetriever.ts","../src/optimizers/Optimizer.ts","../src/optimizers/LabeledFewShot.ts","../src/optimizers/BootstrapFewShot.ts","../src/evaluate/evaluate.ts","../src/evaluate/metrics.ts","../src/optimizers/BootstrapFewShotWithRandomSearch.ts","../src/optimizers/BootstrapFewShotWithOptuna.ts","../src/optimizers/COPRO.ts","../src/optimizers/MIPRO.ts","../src/optimizers/KNNFewShot.ts","../src/optimizers/Ensemble.ts","../src/optimizers/BootstrapFinetune.ts","../src/optimizers/GRPO.ts","../src/optimizers/SIMBA.ts","../src/optimizers/AvatarOptimizer.ts","../src/mcp/MCPAdapter.ts","../src/mcp/DSTsxMCPServer.ts","../src/tracking/Tracker.ts","../src/tracking/ConsoleTracker.ts","../src/tracking/JsonFileTracker.ts"],"sourcesContent":["// DSTsx — public barrel export\n// Re-exports every public symbol from all sub-modules.\n\nexport * from \"./signatures/index.js\";\nexport * from \"./primitives/index.js\";\nexport * from \"./lm/index.js\";\nexport * from \"./modules/index.js\";\nexport * from \"./retrieve/index.js\";\nexport * from \"./optimizers/index.js\";\nexport * from \"./evaluate/index.js\";\nexport * from \"./assertions/index.js\";\nexport * from \"./settings/index.js\";\nexport * from \"./mcp/index.js\";\nexport * from \"./tracking/index.js\";\n","import type { FieldMeta } from \"./types.js\";\n\n/**\n * Creates an input field descriptor for a {@link Signature}.\n *\n * @example\n * ```ts\n * const sig = new Signature({\n * inputs: new Map([[\"question\", InputField({ description: \"The question to answer\" })]]),\n * outputs: new Map([[\"answer\", OutputField({ description: \"A concise answer\" })]]),\n * });\n * ```\n */\nexport function InputField(meta: FieldMeta = {}): FieldMeta {\n return { type: \"string\", ...meta };\n}\n\n/**\n * Creates an output field descriptor for a {@link Signature}.\n */\nexport function OutputField(meta: FieldMeta = {}): FieldMeta {\n return { type: \"string\", ...meta };\n}\n","import type { FieldMeta, SignatureMeta } from \"./types.js\";\nimport { InputField, OutputField } from \"./Field.js\";\n\n/**\n * A Signature defines the typed interface (inputs and outputs) for a single\n * language-model call. It mirrors `dspy.Signature` in the Python library.\n *\n * Signatures can be created from a shorthand string:\n * ```ts\n * const sig = Signature.from(\"question -> answer\");\n * const sig2 = Signature.from(\"context, question -> answer, confidence\");\n * ```\n *\n * Or constructed explicitly:\n * ```ts\n * const sig = new Signature({\n * inputs: new Map([[\"question\", InputField({ description: \"The question\" })]]),\n * outputs: new Map([[\"answer\", OutputField({ description: \"The answer\" })]]),\n * instructions: \"Answer concisely.\",\n * });\n * ```\n */\nexport class Signature {\n readonly inputs: ReadonlyMap<string, FieldMeta>;\n readonly outputs: ReadonlyMap<string, FieldMeta>;\n readonly instructions: string | undefined;\n\n constructor(meta: SignatureMeta) {\n this.inputs = meta.inputs;\n this.outputs = meta.outputs;\n this.instructions = meta.instructions;\n }\n\n // ---------------------------------------------------------------------------\n // Factory helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Parse a shorthand signature string of the form:\n * `\"field1, field2? -> out1, out2\"`\n *\n * A trailing `?` marks the field as optional.\n */\n static from(shorthand: string, instructions?: string): Signature {\n const [inputPart, outputPart] = shorthand.split(\"->\").map((s) => s.trim());\n if (outputPart === undefined) {\n throw new Error(\n `Invalid signature shorthand \"${shorthand}\". Expected \"inputs -> outputs\".`,\n );\n }\n\n const parseFields = (part: string): Map<string, FieldMeta> => {\n const map = new Map<string, FieldMeta>();\n for (const raw of part.split(\",\")) {\n const trimmed = raw.trim();\n const isOptional = trimmed.endsWith(\"?\");\n const name = trimmed.replace(/\\?$/, \"\");\n if (name.length === 0) continue;\n map.set(name, InputField(isOptional ? { optional: true } : {}));\n }\n return map;\n };\n\n const inputs = parseFields(inputPart ?? \"\");\n const outputs = parseFields(outputPart);\n\n // Re-tag output fields using OutputField so callers can distinguish them.\n for (const [key, val] of outputs) {\n outputs.set(key, OutputField(val));\n }\n\n return new Signature({ inputs, outputs, instructions });\n }\n\n // ---------------------------------------------------------------------------\n // Mutation helpers (return new Signature; never mutates)\n // ---------------------------------------------------------------------------\n\n /**\n * Return a new Signature with additional or overridden fields / instructions.\n */\n with(overrides: Partial<SignatureMeta>): Signature {\n return new Signature({\n inputs: overrides.inputs ?? new Map(this.inputs),\n outputs: overrides.outputs ?? new Map(this.outputs),\n instructions: overrides.instructions ?? this.instructions,\n });\n }\n\n /**\n * Append an extra input field and return a new Signature.\n */\n withInput(name: string, meta: FieldMeta = {}): Signature {\n const inputs = new Map(this.inputs);\n inputs.set(name, InputField(meta));\n return this.with({ inputs });\n }\n\n /**\n * Append an extra output field and return a new Signature.\n */\n withOutput(name: string, meta: FieldMeta = {}): Signature {\n const outputs = new Map(this.outputs);\n outputs.set(name, OutputField(meta));\n return this.with({ outputs });\n }\n\n // ---------------------------------------------------------------------------\n // Serialization\n // ---------------------------------------------------------------------------\n\n toJSON(): object {\n return {\n inputs: Object.fromEntries(this.inputs),\n outputs: Object.fromEntries(this.outputs),\n instructions: this.instructions,\n };\n }\n\n static fromJSON(json: Record<string, unknown>): Signature {\n const toMap = (obj: unknown): Map<string, FieldMeta> => {\n if (typeof obj !== \"object\" || obj === null) return new Map();\n return new Map(Object.entries(obj as Record<string, FieldMeta>));\n };\n return new Signature({\n inputs: toMap(json[\"inputs\"]),\n outputs: toMap(json[\"outputs\"]),\n instructions:\n typeof json[\"instructions\"] === \"string\" ? json[\"instructions\"] : undefined,\n });\n }\n}\n","/**\n * An immutable record of named values used as a training example or a module\n * input. Mirrors `dspy.Example` in Python.\n *\n * @example\n * ```ts\n * const ex = new Example({ question: \"What is 2+2?\", answer: \"4\" });\n * const withLabel = ex.with({ answer: \"four\" });\n * ```\n */\nexport class Example {\n readonly #data: Readonly<Record<string, unknown>>;\n\n constructor(data: Record<string, unknown>) {\n this.#data = Object.freeze({ ...data });\n }\n\n /** Return the value for `key`, or `undefined` if absent. */\n get(key: string): unknown {\n return this.#data[key];\n }\n\n /** Return a shallow-frozen copy of the underlying data record. */\n toDict(): Readonly<Record<string, unknown>> {\n return this.#data;\n }\n\n /**\n * Return a new Example with the provided key-value pairs merged in.\n */\n with(overrides: Record<string, unknown>): Example {\n return new Example({ ...this.#data, ...overrides });\n }\n\n /**\n * Return a new Example containing only the keys listed in `keys`.\n */\n inputs(keys: string[]): Example {\n return new Example(\n Object.fromEntries(keys.filter((k) => k in this.#data).map((k) => [k, this.#data[k]])),\n );\n }\n\n /**\n * Return a new Example containing only the keys NOT listed in `inputKeys`\n * (i.e. the label / output keys).\n */\n labels(inputKeys: string[]): Example {\n return new Example(\n Object.fromEntries(\n Object.entries(this.#data).filter(([k]) => !inputKeys.includes(k)),\n ),\n );\n }\n\n // ---------------------------------------------------------------------------\n // Serialization\n // ---------------------------------------------------------------------------\n\n toJSON(): Record<string, unknown> {\n return { ...this.#data };\n }\n\n static fromDict(data: Record<string, unknown>): Example {\n return new Example(data);\n }\n}\n","import { Example } from \"./Example.js\";\n\n/**\n * The output of a {@link Predict} (or any module) call.\n * Extends {@link Example} by adding `completions` for multi-output calls.\n *\n * Mirrors `dspy.Prediction` in Python.\n */\nexport class Prediction extends Example {\n /** All candidate completions when `n > 1` was requested. */\n readonly completions: ReadonlyArray<Record<string, unknown>>;\n\n constructor(data: Record<string, unknown>, completions: Record<string, unknown>[] = []) {\n super(data);\n this.completions = Object.freeze([...completions]);\n }\n\n /** Typed accessor — casts the value to `T` (caller is responsible for type safety). */\n getTyped<T>(key: string): T {\n return this.get(key) as T;\n }\n\n // ---------------------------------------------------------------------------\n // Serialization\n // ---------------------------------------------------------------------------\n\n override toJSON(): Record<string, unknown> {\n return {\n ...super.toJSON(),\n completions: this.completions,\n };\n }\n}\n","import type { Prediction } from \"./Prediction.js\";\n\n/**\n * Returns a reducer function that picks the Prediction whose `field` value\n * appears most frequently. Ties go to the first occurrence.\n */\nexport function majority(field = \"answer\"): (predictions: Prediction[]) => Prediction {\n return (predictions: Prediction[]): Prediction => {\n if (predictions.length === 0) {\n throw new Error(\"majority: empty predictions array\");\n }\n\n const counts = new Map<string, number>();\n for (const p of predictions) {\n const val = JSON.stringify(p.get(field));\n counts.set(val, (counts.get(val) ?? 0) + 1);\n }\n\n let bestKey = \"\";\n let bestCount = 0;\n for (const [k, c] of counts) {\n if (c > bestCount) {\n bestCount = c;\n bestKey = k;\n }\n }\n\n return predictions.find((p) => JSON.stringify(p.get(field)) === bestKey)!;\n };\n}\n","import { readFileSync } from \"node:fs\";\n\n/** Supported image MIME types. */\nexport type ImageMimeType = \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n\n/**\n * A multi-modal image value that can be passed as a field in Predict/TypedPredictor.\n *\n * @example\n * ```ts\n * const captioner = new Predict(\"image, question -> caption\");\n * const result = await captioner.forward({\n * image: Image.fromURL(\"https://example.com/photo.jpg\"),\n * question: \"What is in this image?\",\n * });\n * ```\n */\nexport class Image {\n readonly url: string | undefined;\n readonly base64: string | undefined;\n readonly mimeType: ImageMimeType | undefined;\n\n private constructor(init: {\n url?: string | undefined;\n base64?: string | undefined;\n mimeType?: ImageMimeType | undefined;\n }) {\n this.url = init.url;\n this.base64 = init.base64;\n this.mimeType = init.mimeType;\n }\n\n /** Create an Image from a URL. */\n static fromURL(url: string): Image {\n return new Image({ url });\n }\n\n /** Create an Image from base64-encoded data. */\n static fromBase64(data: string, mimeType: ImageMimeType = \"image/jpeg\"): Image {\n return new Image({ base64: data, mimeType });\n }\n\n /** Create an Image by reading a local file synchronously. */\n static fromFile(path: string, mimeType?: ImageMimeType): Image {\n const data = readFileSync(path);\n const base64 = data.toString(\"base64\");\n const ext = path.split(\".\").pop()?.toLowerCase();\n const detectedMime: ImageMimeType =\n ext === \"png\" ? \"image/png\" :\n ext === \"gif\" ? \"image/gif\" :\n ext === \"webp\" ? \"image/webp\" :\n \"image/jpeg\";\n return new Image({ base64, mimeType: mimeType ?? detectedMime });\n }\n\n /** Serialize to an OpenAI-compatible image_url content part. */\n toOpenAIContentPart(): { type: \"image_url\"; image_url: { url: string } } {\n if (this.url) {\n return { type: \"image_url\", image_url: { url: this.url } };\n }\n if (this.base64 && this.mimeType) {\n return { type: \"image_url\", image_url: { url: `data:${this.mimeType};base64,${this.base64}` } };\n }\n throw new Error(\"Image: no url or base64 data available\");\n }\n\n /** Serialize to an Anthropic-compatible image content block. */\n toAnthropicContentBlock(): {\n type: \"image\";\n source: { type: \"base64\" | \"url\"; media_type?: string; data?: string; url?: string };\n } {\n if (this.url) {\n return { type: \"image\", source: { type: \"url\", url: this.url } };\n }\n if (this.base64 && this.mimeType) {\n return { type: \"image\", source: { type: \"base64\", media_type: this.mimeType, data: this.base64 } };\n }\n throw new Error(\"Image: no url or base64 data available\");\n }\n\n /** Returns a string representation (used when Image is serialized in prompts). */\n toString(): string {\n if (this.url) return `[Image: ${this.url}]`;\n if (this.base64) return `[Image: base64 data, ${this.mimeType ?? \"unknown type\"}]`;\n return \"[Image]\";\n }\n}\n","/**\n * A minimal LRU (Least Recently Used) cache used to memoize LM responses.\n *\n * Entries are evicted when `maxSize` is reached (oldest-first) or when their\n * TTL has expired.\n */\nexport class LRUCache<K, V> {\n readonly #maxSize: number;\n readonly #ttlMs: number;\n readonly #map = new Map<K, { value: V; expiresAt: number }>();\n\n constructor(maxSize = 512, ttlMs = 60_000 * 60) {\n this.#maxSize = maxSize;\n this.#ttlMs = ttlMs;\n }\n\n get(key: K): V | undefined {\n const entry = this.#map.get(key);\n if (!entry) return undefined;\n if (Date.now() > entry.expiresAt) {\n this.#map.delete(key);\n return undefined;\n }\n // Re-insert to mark as recently used.\n this.#map.delete(key);\n this.#map.set(key, entry);\n return entry.value;\n }\n\n set(key: K, value: V): void {\n if (this.#map.has(key)) this.#map.delete(key);\n else if (this.#map.size >= this.#maxSize) {\n // Evict the oldest entry (first inserted = first in Map iteration order).\n const oldest = this.#map.keys().next().value;\n if (oldest !== undefined) this.#map.delete(oldest);\n }\n this.#map.set(key, { value, expiresAt: Date.now() + this.#ttlMs });\n }\n\n has(key: K): boolean {\n return this.get(key) !== undefined;\n }\n\n delete(key: K): void {\n this.#map.delete(key);\n }\n\n clear(): void {\n this.#map.clear();\n }\n\n get size(): number {\n return this.#map.size;\n }\n}\n","import { createHash } from \"node:crypto\";\nimport {\n readFileSync,\n writeFileSync,\n readdirSync,\n unlinkSync,\n mkdirSync,\n statSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { LMResponse } from \"./types.js\";\n\ninterface CacheEntry {\n key: string;\n value: LMResponse;\n expiresAt: number | null;\n}\n\n/**\n * Disk-persistent JSON cache for LM responses.\n *\n * Cache entries are stored as individual JSON files named by a truncated\n * SHA-256 hash of the key. Supports optional TTL and LRU eviction.\n */\nexport class DiskCache {\n readonly #cacheDir: string;\n readonly #maxSize: number;\n readonly #ttlMs: number | undefined;\n\n constructor(cacheDir: string, maxSize = 500, ttlMs?: number) {\n this.#cacheDir = cacheDir;\n this.#maxSize = maxSize;\n this.#ttlMs = ttlMs;\n mkdirSync(cacheDir, { recursive: true });\n }\n\n get(key: string): LMResponse | undefined {\n const path = this.#pathFor(key);\n try {\n const raw = readFileSync(path, \"utf8\");\n const entry = JSON.parse(raw) as CacheEntry;\n if (entry.expiresAt !== null && Date.now() > entry.expiresAt) {\n unlinkSync(path);\n return undefined;\n }\n return entry.value;\n } catch {\n return undefined;\n }\n }\n\n set(key: string, value: LMResponse): void {\n this.#evictIfNeeded();\n const entry: CacheEntry = {\n key,\n value,\n expiresAt: this.#ttlMs != null ? Date.now() + this.#ttlMs : null,\n };\n writeFileSync(this.#pathFor(key), JSON.stringify(entry), \"utf8\");\n }\n\n clear(): void {\n try {\n for (const file of readdirSync(this.#cacheDir)) {\n if (file.endsWith(\".json\")) {\n try {\n unlinkSync(join(this.#cacheDir, file));\n } catch {\n // ignore\n }\n }\n }\n } catch {\n // ignore\n }\n }\n\n #pathFor(key: string): string {\n // 16 hex chars = 64 bits of the SHA-256 digest. The collision probability\n // over 10 M distinct prompts is ~2.7e-9, acceptable for a local LM cache.\n const hash = createHash(\"sha256\").update(key).digest(\"hex\").slice(0, 16);\n return join(this.#cacheDir, `${hash}.json`);\n }\n\n #evictIfNeeded(): void {\n let files: Array<{ name: string; mtime: number }>;\n try {\n files = readdirSync(this.#cacheDir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => {\n const p = join(this.#cacheDir, f);\n try {\n return { name: f, mtime: statSync(p).mtimeMs };\n } catch {\n return { name: f, mtime: 0 };\n }\n });\n } catch {\n return;\n }\n\n if (files.length < this.#maxSize) return;\n\n const sorted = files.sort((a, b) => a.mtime - b.mtime);\n const toDelete = sorted.slice(0, files.length - this.#maxSize + 1);\n for (const f of toDelete) {\n try {\n unlinkSync(join(this.#cacheDir, f.name));\n } catch {\n // ignore\n }\n }\n }\n}\n","import { LRUCache } from \"./cache.js\";\nimport { DiskCache } from \"./DiskCache.js\";\nimport type { LMCallConfig, LMResponse, Message, StreamChunk } from \"./types.js\";\n\n/**\n * Abstract base class for all language model adapters.\n *\n * Subclasses must implement {@link LM._call} which performs the actual\n * provider-specific API call.\n *\n * The base class handles:\n * - LRU response caching\n * - Request counting\n * - Token usage aggregation\n */\nexport abstract class LM {\n /** Human-readable name / identifier for this model instance. */\n readonly model: string;\n\n #cache: LRUCache<string, LMResponse>;\n #diskCache: DiskCache | undefined;\n #requestCount = 0;\n #tokenUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0, cachedPromptTokens: 0 };\n\n constructor(\n model: string,\n cacheOptions: { maxSize?: number; ttlMs?: number; cacheDir?: string } = {},\n ) {\n this.model = model;\n this.#cache = new LRUCache(cacheOptions.maxSize, cacheOptions.ttlMs);\n this.#diskCache =\n cacheOptions.cacheDir !== undefined\n ? new DiskCache(cacheOptions.cacheDir, cacheOptions.maxSize, cacheOptions.ttlMs)\n : undefined;\n }\n\n // ---------------------------------------------------------------------------\n // Public API\n // ---------------------------------------------------------------------------\n\n /**\n * Call the language model with either a plain string prompt or a list of\n * chat messages.\n */\n async call(\n prompt: string | Message[],\n config: LMCallConfig = {},\n ): Promise<LMResponse> {\n const cacheKey = config.cacheKey ?? this.#buildCacheKey(prompt, config);\n const cached = this.#cache.get(cacheKey);\n if (cached) return cached;\n\n // Check disk cache (second-level)\n if (this.#diskCache) {\n const diskCached = this.#diskCache.get(cacheKey);\n if (diskCached) {\n this.#cache.set(cacheKey, diskCached);\n return diskCached;\n }\n }\n\n const response = await this._call(prompt, config);\n this.#cache.set(cacheKey, response);\n\n // Persist to disk cache\n if (this.#diskCache) {\n this.#diskCache.set(cacheKey, response);\n }\n\n this.#requestCount += 1;\n if (response.usage) {\n this.#tokenUsage.promptTokens += response.usage.promptTokens;\n this.#tokenUsage.completionTokens += response.usage.completionTokens;\n this.#tokenUsage.totalTokens += response.usage.totalTokens;\n if (response.usage.cachedPromptTokens) {\n this.#tokenUsage.cachedPromptTokens += response.usage.cachedPromptTokens;\n }\n }\n return response;\n }\n\n /** Total number of (non-cached) API calls made. */\n get requestCount(): number {\n return this.#requestCount;\n }\n\n /** Accumulated token usage across all (non-cached) calls. */\n get tokenUsage(): Readonly<{ promptTokens: number; completionTokens: number; totalTokens: number; cachedPromptTokens: number }> {\n return { ...this.#tokenUsage };\n }\n\n /** Clear the in-memory response cache. */\n clearCache(): void {\n this.#cache.clear();\n }\n\n /**\n * Stream the language model response token by token.\n *\n * Returns an `AsyncIterable<StreamChunk>`. The last chunk has `done: true`.\n * Subclasses override this to provide real streaming; the base implementation\n * falls back to calling {@link LM.call} and yielding the full response as a\n * single chunk.\n */\n async *stream(\n prompt: string | Message[],\n config: LMCallConfig = {},\n ): AsyncGenerator<StreamChunk> {\n const response = await this.call(prompt, config);\n yield { delta: response.text, done: true, raw: response.raw };\n }\n\n // ---------------------------------------------------------------------------\n // Abstract interface for subclasses\n // ---------------------------------------------------------------------------\n\n /**\n * Perform the actual provider API call. Subclasses must implement this.\n */\n protected abstract _call(\n prompt: string | Message[],\n config: LMCallConfig,\n ): Promise<LMResponse>;\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n #buildCacheKey(prompt: string | Message[], config: LMCallConfig): string {\n const promptStr = typeof prompt === \"string\" ? prompt : JSON.stringify(prompt);\n const configStr = JSON.stringify({\n model: config.model ?? this.model,\n temperature: config.temperature,\n maxTokens: config.maxTokens,\n stop: config.stop,\n n: config.n,\n });\n return `${promptStr}|||${configStr}`;\n }\n}\n","import { LM } from \"../LM.js\";\nimport type { LMCallConfig, LMResponse, Message } from \"../types.js\";\n\n/** Options for the OpenAI adapter. */\nexport interface OpenAIOptions {\n apiKey?: string;\n baseURL?: string;\n /** Default model, can be overridden per-call. */\n model?: string;\n maxRetries?: number;\n stream?: boolean;\n}\n\n/**\n * LM adapter for OpenAI chat-completion and text-completion models.\n *\n * Requires the `openai` package as a peer dependency:\n * ```\n * npm install openai\n * ```\n */\nexport class OpenAI extends LM {\n readonly #options: OpenAIOptions;\n #client: any;\n\n constructor(options: OpenAIOptions = {}) {\n super(options.model ?? \"gpt-4o\");\n this.#options = options;\n }\n\n async #getClient(): Promise<any> {\n if (!this.#client) {\n // Dynamically import so consumers who don't use OpenAI aren't forced to\n // install the package.\n const { default: Client } = await import(\"openai\").catch(() => {\n throw new Error(\n \"The `openai` package is required for the OpenAI adapter.\\n\" +\n \"Install it with: npm install openai\",\n );\n });\n\n this.#client = new Client({\n apiKey: this.#options.apiKey ?? process.env[\"OPENAI_API_KEY\"],\n baseURL: this.#options.baseURL,\n maxRetries: this.#options.maxRetries ?? 3,\n });\n }\n return this.#client;\n }\n\n protected override async _call(\n prompt: string | Message[],\n config: LMCallConfig,\n ): Promise<LMResponse> {\n const client = await this.#getClient();\n\n const messages: Message[] =\n typeof prompt === \"string\" ? [{ role: \"user\", content: prompt }] : prompt;\n\n const response = await client.chat.completions.create({\n model: config.model ?? this.model,\n messages,\n temperature: config.temperature,\n max_tokens: config.maxTokens,\n stop: config.stop,\n n: config.n ?? 1,\n ...(config.extra ?? {}),\n });\n\n const texts = (response.choices ?? []).map(\n (c: { message?: { content?: string | null } }) => c.message?.content ?? \"\",\n );\n\n const usageDetails = response.usage as\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n prompt_tokens_details?: { cached_tokens?: number };\n }\n | undefined;\n\n return {\n text: texts[0] ?? \"\",\n texts,\n usage: usageDetails\n ? {\n promptTokens: usageDetails.prompt_tokens,\n completionTokens: usageDetails.completion_tokens,\n totalTokens: usageDetails.total_tokens,\n ...(usageDetails.prompt_tokens_details?.cached_tokens\n ? { cachedPromptTokens: usageDetails.prompt_tokens_details.cached_tokens }\n : {}),\n }\n : null,\n raw: response,\n };\n }\n\n override async *stream(\n prompt: string | Message[],\n config: LMCallConfig = {},\n ): AsyncGenerator<import(\"../types.js\").StreamChunk> {\n const client = await this.#getClient();\n\n const messages: Message[] =\n typeof prompt === \"string\" ? [{ role: \"user\", content: prompt }] : prompt;\n\n const stream = await client.chat.completions.create({\n model: config.model ?? this.model,\n messages,\n temperature: config.temperature,\n max_tokens: config.maxTokens,\n stop: config.stop,\n stream: true as const,\n ...(config.extra ?? {}),\n });\n\n for await (const chunk of stream) {\n type StreamChoice = { delta?: { content?: string | null }; finish_reason?: string | null };\n type StreamResponse = { choices?: StreamChoice[] };\n const c = (chunk as StreamResponse).choices?.[0];\n const delta = c?.delta?.content ?? \"\";\n const done = c?.finish_reason != null;\n yield { delta, done, raw: chunk };\n if (done) break;\n }\n }\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { LM } from \"../lm/index.js\";\nimport type { LMCallConfig } from \"../lm/types.js\";\nimport type { Retriever } from \"../retrieve/index.js\";\n\n/** Configuration options for the global DSTsx settings. */\nexport interface SettingsOptions {\n /** Default language model used by all Predict modules. */\n lm?: LM;\n /** Default retrieval model used by the Retrieve module. */\n rm?: Retriever;\n /** Default LM call configuration (temperature, maxTokens, etc.). */\n lmConfig?: LMCallConfig;\n /** Log level for internal messages. */\n logLevel?: \"silent\" | \"error\" | \"warn\" | \"info\" | \"debug\";\n /** Directory for caching compiled programs (JSON). */\n cacheDir?: string;\n}\n\n/**\n * Per-async-context storage. Each async call tree started via\n * {@link Settings.context} gets its own isolated snapshot of settings.\n * Concurrent requests never see each other's overrides.\n */\nconst contextStore = new AsyncLocalStorage<SettingsOptions>();\n\n/**\n * Global settings singleton for DSTsx.\n *\n * Configure the default LM and retriever before using any modules:\n * ```ts\n * import { settings } from \"dstsx\";\n * import { OpenAI } from \"dstsx\";\n *\n * settings.configure({ lm: new OpenAI({ model: \"gpt-4o\" }) });\n * ```\n *\n * Use {@link Settings.context} for per-request overrides in server environments.\n * Each invocation gets an isolated async context via `AsyncLocalStorage`, so\n * concurrent overlapping requests never interfere with each other:\n * ```ts\n * await settings.context({ lm: perRequestLM }, async () => {\n * return program.forward({ question });\n * });\n * ```\n */\nexport class Settings {\n #global: SettingsOptions = {};\n\n // ---------------------------------------------------------------------------\n // Effective settings: async-context overrides take precedence over globals.\n // ---------------------------------------------------------------------------\n\n get #current(): SettingsOptions {\n const ctx = contextStore.getStore();\n return ctx !== undefined ? { ...this.#global, ...ctx } : this.#global;\n }\n\n // ---------------------------------------------------------------------------\n // Accessors\n // ---------------------------------------------------------------------------\n\n get lm(): LM | undefined {\n return this.#current.lm;\n }\n\n get rm(): Retriever | undefined {\n return this.#current.rm;\n }\n\n get lmConfig(): LMCallConfig | undefined {\n return this.#current.lmConfig;\n }\n\n get logLevel(): SettingsOptions[\"logLevel\"] {\n return this.#current.logLevel ?? \"warn\";\n }\n\n get cacheDir(): string | undefined {\n return this.#current.cacheDir;\n }\n\n // ---------------------------------------------------------------------------\n // Mutation\n // ---------------------------------------------------------------------------\n\n /**\n * Merge `options` into the global settings. Existing keys are overwritten;\n * omitted keys are unchanged. This does NOT affect currently running\n * {@link Settings.context} scopes.\n */\n configure(options: SettingsOptions): void {\n this.#global = { ...this.#global, ...options };\n }\n\n /**\n * Reset all global settings to their defaults.\n */\n reset(): void {\n this.#global = {};\n }\n\n /**\n * Return a deep-frozen snapshot of the currently effective settings\n * (respects any active async-context overrides).\n */\n inspect(): Readonly<SettingsOptions> {\n return Object.freeze({ ...this.#current });\n }\n\n /**\n * Run `fn` inside an async-context-local settings scope.\n *\n * The `overrides` are merged on top of the current global settings and\n * stored in an `AsyncLocalStorage` context. Concurrent calls each get\n * their own isolated snapshot — they never overwrite each other's settings.\n *\n * @example\n * ```ts\n * // In an Express/Fastify handler:\n * await settings.context({ lm: perRequestLM }, () => program.forward(inputs));\n * ```\n */\n async context<T>(overrides: SettingsOptions, fn: () => Promise<T>): Promise<T> {\n const merged = { ...this.#global, ...overrides };\n return contextStore.run(merged, fn);\n }\n}\n\n/** The global DSTsx settings singleton. */\nexport const settings = new Settings();\n","import { LM } from \"../LM.js\";\nimport type { LMCallConfig, LMResponse, Message } from \"../types.js\";\nimport { settings } from \"../../settings/index.js\";\n\n/** Options for the Anthropic adapter. */\nexport interface AnthropicOptions {\n apiKey?: string;\n model?: string;\n maxRetries?: number;\n /** Whether to enable prompt caching up-front. */\n promptCaching?: boolean;\n}\n\n/**\n * LM adapter for Anthropic Claude models.\n *\n * Requires the `@anthropic-ai/sdk` package as a peer dependency:\n * ```\n * npm install @anthropic-ai/sdk\n * ```\n */\nexport class Anthropic extends LM {\n readonly #options: AnthropicOptions;\n #client: any;\n\n constructor(options: AnthropicOptions = {}) {\n super(options.model ?? \"claude-3-5-sonnet-20241022\");\n this.#options = options;\n }\n\n async #getClient(): Promise<any> {\n if (!this.#client) {\n const { default: Client } = await import(\"@anthropic-ai/sdk\").catch(() => {\n throw new Error(\n \"The `@anthropic-ai/sdk` package is required for the Anthropic adapter.\\n\" +\n \"Install it with: npm install @anthropic-ai/sdk\",\n );\n });\n this.#client = new Client({\n apiKey: this.#options.apiKey ?? process.env[\"ANTHROPIC_API_KEY\"],\n maxRetries: this.#options.maxRetries ?? 3,\n });\n }\n return this.#client;\n }\n\n protected override async _call(\n prompt: string | Message[],\n config: LMCallConfig,\n ): Promise<LMResponse> {\n const client = await this.#getClient();\n\n const doCache = config.promptCaching ?? settings.lmConfig?.promptCaching ?? this.#options.promptCaching ?? false;\n\n const msgs: Message[] =\n typeof prompt === \"string\" ? [{ role: \"user\", content: prompt }] : prompt;\n\n const systemMsg = msgs.find((m) => m.role === \"system\");\n const userMsgs = msgs.filter((m) => m.role !== \"system\");\n\n let systemPayload: string | Array<{ type: \"text\"; text: string; cache_control?: { type: \"ephemeral\" } }> | undefined;\n if (systemMsg) {\n systemPayload = doCache\n ? [{ type: \"text\", text: systemMsg.content, cache_control: { type: \"ephemeral\" } }]\n : systemMsg.content;\n }\n\n const messagesPayload = userMsgs.map((m, idx) => {\n const isLast = idx === userMsgs.length - 1;\n return {\n role: m.role as \"user\" | \"assistant\",\n content: (doCache && isLast)\n ? [{ type: \"text\" as const, text: m.content, cache_control: { type: \"ephemeral\" as const } }]\n : m.content,\n };\n });\n\n const response = await client.messages.create({\n model: config.model ?? this.model,\n max_tokens: config.maxTokens ?? 1024,\n system: systemPayload,\n messages: messagesPayload,\n temperature: config.temperature,\n ...(config.extra ?? {}),\n });\n\n const text =\n response.content\n .filter((b: { type: string }) => b.type === \"text\")\n .map((b: { type: string; text?: string }) => b.text ?? \"\")\n .join(\"\") ?? \"\";\n\n const usage = response.usage as { \n input_tokens: number; \n output_tokens: number; \n cache_read_input_tokens?: number | null; \n cache_creation_input_tokens?: number | null; \n };\n\n const cachedInput = (usage.cache_read_input_tokens ?? 0) + (usage.cache_creation_input_tokens ?? 0);\n\n return {\n text,\n texts: [text],\n usage: usage\n ? {\n promptTokens: usage.input_tokens,\n completionTokens: usage.output_tokens,\n totalTokens: usage.input_tokens + usage.output_tokens,\n ...(cachedInput > 0 ? { cachedPromptTokens: cachedInput } : {}),\n }\n : null,\n raw: response,\n };\n }\n\n override async *stream(\n prompt: string | Message[],\n config: LMCallConfig = {},\n ): AsyncGenerator<import(\"../types.js\").StreamChunk> {\n const client = await this.#getClient();\n\n const doCache = config.promptCaching ?? settings.lmConfig?.promptCaching ?? this.#options.promptCaching ?? false;\n\n const msgs: Message[] =\n typeof prompt === \"string\" ? [{ role: \"user\", content: prompt }] : prompt;\n\n const systemMsg = msgs.find((m) => m.role === \"system\");\n const userMsgs = msgs.filter((m) => m.role !== \"system\");\n\n let systemPayload: string | Array<{ type: \"text\"; text: string; cache_control?: { type: \"ephemeral\" } }> | undefined;\n if (systemMsg) {\n systemPayload = doCache\n ? [{ type: \"text\", text: systemMsg.content, cache_control: { type: \"ephemeral\" } }]\n : systemMsg.content;\n }\n\n const messagesPayload = userMsgs.map((m, idx) => {\n const isLast = idx === userMsgs.length - 1;\n return {\n role: m.role as \"user\" | \"assistant\",\n content: (doCache && isLast)\n ? [{ type: \"text\" as const, text: m.content, cache_control: { type: \"ephemeral\" as const } }]\n : m.content,\n };\n });\n\n const stream = client.messages.stream({\n model: config.model ?? this.model,\n max_tokens: config.maxTokens ?? 1024,\n system: systemPayload,\n messages: messagesPayload,\n ...(config.extra ?? {}),\n });\n\n for await (const event of stream) {\n type AnthropicStreamEvent = { type?: string; delta?: { type?: string; text?: string } };\n const e = event as AnthropicStreamEvent;\n if (e.type === \"content_block_delta\" && e.delta?.type === \"text_delta\") {\n yield { delta: e.delta.text ?? \"\", done: false, raw: event };\n } else if (e.type === \"message_stop\") {\n yield { delta: \"\", done: true, raw: event };\n break;\n }\n }\n }\n}\n","import { LM } from \"../LM.js\";\nimport type { LMCallConfig, LMResponse, Message } from \"../types.js\";\n\n/** Options for the Cohere adapter. */\nexport interface CohereOptions {\n apiKey?: string;\n model?: string;\n}\n\n/**\n * LM adapter for Cohere Command models.\n *\n * Requires the `cohere-ai` package as a peer dependency:\n * ```\n * npm install cohere-ai\n * ```\n */\nexport class Cohere extends LM {\n readonly #options: CohereOptions;\n\n constructor(options: CohereOptions = {}) {\n super(options.model ?? \"command-r-plus\");\n this.#options = options;\n }\n\n protected override async _call(\n prompt: string | Message[],\n config: LMCallConfig,\n ): Promise<LMResponse> {\n const { CohereClient } = await import(\"cohere-ai\").catch(() => {\n throw new Error(\n \"The `cohere-ai` package is required for the Cohere adapter.\\n\" +\n \"Install it with: npm install cohere-ai\",\n );\n });\n\n const client = new CohereClient({\n token: this.#options.apiKey ?? process.env[\"COHERE_API_KEY\"],\n });\n\n const text = typeof prompt === \"string\" ? prompt : this.#messagesToText(prompt);\n\n const response = await client.chat({\n model: config.model ?? this.model,\n message: text,\n temperature: config.temperature,\n maxTokens: config.maxTokens,\n ...(config.extra ?? {}),\n });\n\n const responseText = response.text ?? \"\";\n return {\n text: responseText,\n texts: [responseText],\n usage: response.meta?.tokens\n ? {\n promptTokens: response.meta.tokens.inputTokens ?? 0,\n completionTokens: response.meta.tokens.outputTokens ?? 0,\n totalTokens:\n (response.meta.tokens.inputTokens ?? 0) +\n (response.meta.tokens.outputTokens ?? 0),\n }\n : null,\n raw: response,\n };\n }\n\n #messagesToText(messages: Message[]): string {\n return messages.map((m) => `${m.role}: ${m.content}`).join(\"\\n\");\n }\n}\n","import { LM } from \"../LM.js\";\nimport type { LMCallConfig, LMResponse, Message } from \"../types.js\";\n\n/** Options for the Google Generative AI adapter. */\nexport interface GoogleAIOptions {\n apiKey?: string;\n model?: string;\n}\n\n/**\n * LM adapter for Google Gemini models via `@google/generative-ai`.\n *\n * Requires the `@google/generative-ai` package as a peer dependency:\n * ```\n * npm install @google/generative-ai\n * ```\n */\nexport class GoogleAI extends LM {\n readonly #options: GoogleAIOptions;\n\n constructor(options: GoogleAIOptions = {}) {\n super(options.model ?? \"gemini-1.5-pro\");\n this.#options = options;\n }\n\n protected override async _call(\n prompt: string | Message[],\n config: LMCallConfig,\n ): Promise<LMResponse> {\n const { GoogleGenerativeAI } = await import(\"@google/generative-ai\").catch(() => {\n throw new Error(\n \"The `@google/generative-ai` package is required for the GoogleAI adapter.\\n\" +\n \"Install it with: npm install @google/generative-ai\",\n );\n });\n\n const client = new GoogleGenerativeAI(\n this.#options.apiKey ?? process.env[\"GOOGLE_API_KEY\"] ?? \"\",\n );\n const genModel = client.getGenerativeModel({ model: config.model ?? this.model });\n\n const text = typeof prompt === \"string\" ? prompt : this.#messagesToText(prompt);\n const result = await genModel.generateContent({\n contents: [{ role: \"user\", parts: [{ text }] }],\n generationConfig: {\n temperature: config.temperature,\n maxOutputTokens: config.maxTokens,\n stopSequences: config.stop,\n candidateCount: config.n ?? 1,\n },\n });\n\n const texts = (result.response.candidates ?? []).map(\n (c: { content?: { parts?: Array<{ text?: string }> } }) =>\n c.content?.parts?.map((p) => p.text ?? \"\").join(\"\") ?? \"\",\n );\n\n return {\n text: texts[0] ?? \"\",\n texts,\n usage: null,\n raw: result,\n };\n }\n\n #messagesToText(messages: Message[]): string {\n return messages.map((m) => `${m.role}: ${m.content}`).join(\"\\n\");\n }\n}\n","import { LM } from \"../LM.js\";\nimport type { LMCallConfig, LMResponse, Message } from \"../types.js\";\n\n/** Options for the Ollama adapter. */\nexport interface OllamaOptions {\n /** Base URL of the Ollama server (default: http://localhost:11434). */\n baseURL?: string;\n model?: string;\n}\n\n/**\n * LM adapter for locally running Ollama models.\n * Communicates via the Ollama REST API (OpenAI-compatible `/v1` endpoint).\n */\nexport class Ollama extends LM {\n readonly #baseURL: string;\n\n constructor(options: OllamaOptions = {}) {\n super(options.model ?? \"llama3\");\n this.#baseURL = options.baseURL ?? \"http://localhost:11434\";\n }\n\n protected override async _call(\n prompt: string | Message[],\n config: LMCallConfig,\n ): Promise<LMResponse> {\n const messages: Message[] =\n typeof prompt === \"string\" ? [{ role: \"user\", content: prompt }] : prompt;\n\n const response = await fetch(`${this.#baseURL}/api/chat`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model: config.model ?? this.model,\n messages,\n stream: false,\n options: {\n temperature: config.temperature,\n num_predict: config.maxTokens,\n stop: config.stop,\n ...(config.extra ?? {}),\n },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Ollama request failed: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as {\n message?: { content?: string };\n prompt_eval_count?: number;\n eval_count?: number;\n };\n\n const text = data.message?.content ?? \"\";\n return {\n text,\n texts: [text],\n usage:\n data.prompt_eval_count != null\n ? {\n promptTokens: data.prompt_eval_count,\n completionTokens: data.eval_count ?? 0,\n totalTokens: (data.prompt_eval_count ?? 0) + (data.eval_count ?? 0),\n }\n : null,\n raw: data,\n };\n }\n}\n","import { LM } from \"../LM.js\";\nimport type { LMCallConfig, LMResponse, Message } from \"../types.js\";\n\n/** Options for the LM Studio adapter. */\nexport interface LMStudioOptions {\n /** Base URL of the LM Studio server (default: http://localhost:1234/v1). */\n baseURL?: string;\n model?: string;\n}\n\n/**\n * LM adapter for LM Studio's OpenAI-compatible REST endpoint.\n */\nexport class LMStudio extends LM {\n readonly #baseURL: string;\n\n constructor(options: LMStudioOptions = {}) {\n super(options.model ?? \"local-model\");\n this.#baseURL = options.baseURL ?? \"http://localhost:1234/v1\";\n }\n\n protected override async _call(\n prompt: string | Message[],\n config: LMCallConfig,\n ): Promise<LMResponse> {\n const messages: Message[] =\n typeof prompt === \"string\" ? [{ role: \"user\", content: prompt }] : prompt;\n\n const response = await fetch(`${this.#baseURL}/chat/completions`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model: config.model ?? this.model,\n messages,\n temperature: config.temperature,\n max_tokens: config.maxTokens,\n stop: config.stop,\n n: config.n ?? 1,\n ...(config.extra ?? {}),\n }),\n });\n\n if (!response.ok) {\n throw new Error(`LMStudio request failed: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as {\n choices?: Array<{ message?: { content?: string } }>;\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n };\n\n const texts = (data.choices ?? []).map((c) => c.message?.content ?? \"\");\n return {\n text: texts[0] ?? \"\",\n texts,\n usage: data.usage\n ? {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens,\n }\n : null,\n raw: data,\n };\n }\n}\n","import { LM } from \"../LM.js\";\nimport type { LMCallConfig, LMResponse, Message } from \"../types.js\";\n\n/** Options for the HuggingFace Inference API adapter. */\nexport interface HuggingFaceOptions {\n apiKey?: string;\n model?: string;\n /** Override the inference endpoint URL (for dedicated endpoints). */\n endpointURL?: string;\n}\n\n/**\n * LM adapter for HuggingFace Inference API text-generation models.\n *\n * Uses the HuggingFace HTTP inference API directly (no SDK required).\n */\nexport class HuggingFace extends LM {\n readonly #options: HuggingFaceOptions;\n\n constructor(options: HuggingFaceOptions = {}) {\n super(options.model ?? \"mistralai/Mistral-7B-Instruct-v0.3\");\n this.#options = options;\n }\n\n protected override async _call(\n prompt: string | Message[],\n config: LMCallConfig,\n ): Promise<LMResponse> {\n const apiKey = this.#options.apiKey ?? process.env[\"HF_API_KEY\"];\n const model = config.model ?? this.model;\n const url =\n this.#options.endpointURL ??\n `https://api-inference.huggingface.co/models/${model}`;\n\n const inputText =\n typeof prompt === \"string\" ? prompt : this.#messagesToText(prompt);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}),\n },\n body: JSON.stringify({\n inputs: inputText,\n parameters: {\n temperature: config.temperature,\n max_new_tokens: config.maxTokens,\n stop: config.stop,\n ...(config.extra ?? {}),\n },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`HuggingFace request failed: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as\n | Array<{ generated_text?: string }>\n | { generated_text?: string };\n\n const generated = Array.isArray(data)\n ? (data[0]?.generated_text ?? \"\")\n : (data.generated_text ?? \"\");\n\n return {\n text: generated,\n texts: [generated],\n usage: null,\n raw: data,\n };\n }\n\n #messagesToText(messages: Message[]): string {\n return messages.map((m) => `${m.role}: ${m.content}`).join(\"\\n\");\n }\n}\n","import { LM } from \"../LM.js\";\nimport type { LMCallConfig, LMResponse, Message } from \"../types.js\";\n\n/**\n * A deterministic mock LM adapter for use in unit tests.\n *\n * Responses are resolved from a lookup map keyed on the exact prompt string\n * (or the serialized messages array). If no match is found the adapter falls\n * back to `defaultResponse` (or throws if none is configured).\n *\n * @example\n * ```ts\n * const lm = new MockLM({\n * \"What is 2+2?\": \"4\",\n * });\n * settings.configure({ lm });\n * ```\n */\nexport class MockLM extends LM {\n readonly #responses: Map<string, string>;\n readonly #defaultResponse: string | undefined;\n\n constructor(\n responses: Record<string, string> = {},\n defaultResponse?: string,\n ) {\n super(\"mock\");\n this.#responses = new Map(Object.entries(responses));\n this.#defaultResponse = defaultResponse;\n }\n\n protected override async _call(\n prompt: string | Message[],\n config: LMCallConfig,\n ): Promise<LMResponse> {\n const key = typeof prompt === \"string\" ? prompt : JSON.stringify(prompt);\n const text =\n this.#responses.get(key) ??\n this.#defaultResponse ??\n (() => {\n throw new Error(`MockLM: no response configured for prompt: \"${key}\"`);\n })();\n\n const n = config.n ?? 1;\n return {\n text,\n texts: Array.from({ length: n }, () => text),\n usage: null,\n raw: null,\n };\n }\n\n /** Register (or overwrite) a prompt → response mapping at runtime. */\n addResponse(prompt: string, response: string): void {\n this.#responses.set(prompt, response);\n }\n}\n","import { Prediction } from \"../primitives/index.js\";\n\n/**\n * The return type of {@link Module.forward} — either a single prediction or\n * an array of predictions for modules that produce multiple outputs (e.g.\n * {@link Parallel}).\n */\nexport type ModuleOutput = Prediction | Prediction[];\n\n/**\n * Extracts the first {@link Prediction} from a {@link ModuleOutput}.\n *\n * Useful when consuming an unknown module whose `forward()` may return either\n * a single prediction or an array.\n */\nexport function firstPrediction(result: ModuleOutput): Prediction {\n return Array.isArray(result) ? (result[0] ?? new Prediction({})) : result;\n}\n\n/**\n * Abstract base class for all DSTsx modules.\n *\n * A Module is a composable, serializable unit that encapsulates one or more\n * language model calls. Subclasses implement {@link Module[\"forward\"]} to define\n * their behaviour.\n *\n * Mirrors `dspy.Module` in Python.\n *\n * @example\n * ```ts\n * class MyRAG extends Module {\n * retrieve = new Retrieve(3);\n * generate = new ChainOfThought(\"context, question -> answer\");\n *\n * async forward(question: string): Promise<Prediction> {\n * const { passages } = await this.retrieve.forward(question);\n * return this.generate.forward({ context: passages.join(\"\\n\"), question });\n * }\n * }\n * ```\n */\nexport abstract class Module {\n /**\n * Execute the module.\n *\n * Subclasses define their own parameter signatures; the base type uses\n * `unknown` so that TypeScript accepts any subclass override.\n *\n * The return value is {@link ModuleOutput} — a single {@link Prediction} for\n * most modules, or a `Prediction[]` for multi-output modules such as\n * {@link Parallel}. Use {@link firstPrediction} to safely extract the first\n * result when consuming an unknown module.\n */\n abstract forward(...args: unknown[]): Promise<ModuleOutput>;\n\n /**\n * Recursively discover all {@link Predict} sub-modules by walking the own\n * enumerable properties of this instance.\n */\n namedPredictors(): Array<[string, Module]> {\n const results: Array<[string, Module]> = [];\n for (const [key, value] of Object.entries(this)) {\n if (value instanceof Module) {\n results.push([key, value]);\n results.push(...value.namedPredictors().map(([k, v]): [string, Module] => [`${key}.${k}`, v]));\n }\n }\n return results;\n }\n\n /**\n * Serialize the module's learnable parameters (e.g. `Predict.demos`) to a\n * plain JSON-compatible object.\n */\n dump(): Record<string, unknown> {\n const state: Record<string, unknown> = {};\n for (const [name, predictor] of this.namedPredictors()) {\n state[name] = predictor.dump();\n }\n return state;\n }\n\n /**\n * Restore learnable parameters from a plain object previously produced by\n * {@link Module.dump}.\n */\n load(state: Record<string, unknown>): void {\n for (const [name, predictor] of this.namedPredictors()) {\n const sub = state[name];\n if (sub && typeof sub === \"object\") {\n predictor.load(sub as Record<string, unknown>);\n }\n }\n }\n\n /**\n * Create a deep clone of this module.\n *\n * Returns a new module with the same prototype. All sub-{@link Module}\n * properties are recursively cloned so that mutating the clone's learnable\n * parameters (e.g. `Predict.demos`) does **not** affect the original.\n * Array properties are shallow-copied (their elements are not cloned).\n * All other properties are copied by reference.\n */\n clone(): this {\n const cloned = Object.create(Object.getPrototypeOf(this) as object) as this;\n for (const key of Object.keys(this)) {\n const value = (this as Record<string, unknown>)[key];\n if (value instanceof Module) {\n (cloned as Record<string, unknown>)[key] = value.clone();\n } else if (Array.isArray(value)) {\n (cloned as Record<string, unknown>)[key] = [...(value as unknown[])];\n } else {\n (cloned as Record<string, unknown>)[key] = value;\n }\n }\n return cloned;\n }\n}\n","import { Module } from \"./Module.js\";\nimport { Prediction, Example } from \"../primitives/index.js\";\nimport { Signature } from \"../signatures/index.js\";\nimport { settings } from \"../settings/index.js\";\n\n/**\n * The fundamental DSTsx module — formats a prompt for the configured LM and\n * parses the completion back into a typed {@link Prediction}.\n *\n * Mirrors `dspy.Predict` in Python.\n *\n * @example\n * ```ts\n * const qa = new Predict(\"question -> answer\");\n * const result = await qa.forward({ question: \"What is 2 + 2?\" });\n * console.log(result.get(\"answer\")); // \"4\"\n * ```\n */\nexport class Predict extends Module {\n readonly signature: Signature;\n\n /** Few-shot demonstration examples (learnable parameter). */\n demos: Example[];\n\n /** System instruction override (learnable parameter). */\n instructions: string | undefined;\n\n constructor(signature: string | Signature) {\n super();\n this.signature = typeof signature === \"string\" ? Signature.from(signature) : signature;\n this.demos = [];\n this.instructions = this.signature.instructions;\n }\n\n // ---------------------------------------------------------------------------\n // Forward pass\n // ---------------------------------------------------------------------------\n\n async forward(inputs: Record<string, unknown>): Promise<Prediction> {\n const lm = settings.lm;\n if (!lm) {\n throw new Error(\"No LM configured. Call settings.configure({ lm }) before using Predict.\");\n }\n\n const prompt = this.#buildPrompt(inputs);\n const config = settings.lmConfig ?? {};\n const response = await lm.call(prompt, config);\n\n const outputs = this.#parseCompletion(response.text);\n const completions = response.texts.map((t) => this.#parseCompletion(t));\n\n return new Prediction(outputs, completions);\n }\n\n /**\n * Stream the LM response token by token.\n * Returns an `AsyncGenerator<StreamChunk>`.\n */\n async *stream(\n inputs: Record<string, unknown>,\n ): AsyncGenerator<import(\"../lm/types.js\").StreamChunk> {\n const lm = settings.lm;\n if (!lm)\n throw new Error(\"No LM configured. Call settings.configure({ lm }) before using Predict.\");\n const prompt = this.#buildPrompt(inputs);\n const config = settings.lmConfig ?? {};\n yield* lm.stream(prompt, config);\n }\n\n // ---------------------------------------------------------------------------\n // Serialization\n // ---------------------------------------------------------------------------\n\n override dump(): Record<string, unknown> {\n return {\n signature: this.signature.toJSON(),\n demos: this.demos.map((d) => d.toJSON()),\n instructions: this.instructions,\n };\n }\n\n override load(state: Record<string, unknown>): void {\n if (Array.isArray(state[\"demos\"])) {\n this.demos = (state[\"demos\"] as Record<string, unknown>[]).map((d) => new Example(d));\n }\n if (typeof state[\"instructions\"] === \"string\") {\n this.instructions = state[\"instructions\"];\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n #buildPrompt(inputs: Record<string, unknown>): string {\n const lines: string[] = [];\n\n if (this.instructions) {\n lines.push(this.instructions, \"\");\n }\n\n if (this.demos.length > 0) {\n for (const demo of this.demos) {\n lines.push(this.#formatExample(demo.toDict()));\n lines.push(\"---\");\n }\n }\n\n lines.push(this.#formatInputs(inputs));\n\n // Append output field prompts so the LM knows what to produce.\n // Use prefix if available, otherwise use the field name.\n for (const [name, meta] of this.signature.outputs) {\n const label = meta.prefix ?? `${name}:`;\n lines.push(label.endsWith(\":\") ? label : `${label}:`);\n }\n\n return lines.join(\"\\n\");\n }\n\n #formatExample(data: Record<string, unknown>): string {\n const formatField = (name: string, meta: { prefix?: string } | undefined): string => {\n const label = meta?.prefix ?? `${name}:`;\n const prefix = label.endsWith(\":\") ? label : `${label}:`;\n return `${prefix} ${String(data[name] ?? \"\")}`;\n };\n\n return [\n ...[...this.signature.inputs].map(([name, meta]) => formatField(name, meta)),\n ...[...this.signature.outputs].map(([name, meta]) => formatField(name, meta)),\n ].join(\"\\n\");\n }\n\n #formatInputs(inputs: Record<string, unknown>): string {\n return [...this.signature.inputs]\n .map(([name, meta]) => {\n const label = meta.prefix ?? `${name}:`;\n const prefix = label.endsWith(\":\") ? label : `${label}:`;\n return `${prefix} ${String(inputs[name] ?? \"\")}`;\n })\n .join(\"\\n\");\n }\n\n /**\n * Parse a raw completion string into a map of field name → value.\n *\n * Looks for `fieldName: <value>` or `prefix: <value>` patterns in the completion.\n * Handles common LLM formatting like **bold**, *italic*, etc.\n * Supports multi-line values by extracting content between field markers.\n */\n #parseCompletion(text: string): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n const outputs = [...this.signature.outputs.entries()];\n\n // Build all possible field labels (name and prefix variants)\n const fieldLabels: Array<{ key: string; patterns: string[] }> = [];\n for (const [key, meta] of outputs) {\n const prefixBase = (meta.prefix ?? \"\").replace(/:$/, \"\").trim();\n const patterns = [key];\n if (prefixBase && prefixBase.toLowerCase() !== key.toLowerCase()) {\n patterns.push(prefixBase);\n }\n fieldLabels.push({ key, patterns });\n }\n\n // Create a combined regex to find all field markers\n const allPatterns = fieldLabels.flatMap((f) => f.patterns);\n const allPatternsEscaped = allPatterns.map((p) => p.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"));\n\n // Pattern matches: optional markdown, label, optional markdown, colon\n // e.g., \"**Answer:**\", \"Reasoning:\", \"*rationale:*\"\n const markerPattern = `(?:\\\\*\\\\*|\\\\*|_)?(${allPatternsEscaped.join(\"|\")})(?:\\\\*\\\\*|\\\\*|_)?:`;\n const markerRegex = new RegExp(markerPattern, \"gi\");\n\n // Find all marker positions\n const markers: Array<{ key: string; start: number; end: number }> = [];\n let markerMatch;\n while ((markerMatch = markerRegex.exec(text)) !== null) {\n const matchedLabel = markerMatch[1]!.toLowerCase();\n // Find which field this marker belongs to\n for (const { key, patterns } of fieldLabels) {\n if (patterns.some((p) => p.toLowerCase() === matchedLabel)) {\n markers.push({\n key,\n start: markerMatch.index,\n end: markerMatch.index + markerMatch[0].length,\n });\n break;\n }\n }\n }\n\n // Extract content between markers\n for (let i = 0; i < markers.length; i++) {\n const marker = markers[i]!;\n const contentStart = marker.end;\n const contentEnd = i + 1 < markers.length ? markers[i + 1]!.start : text.length;\n let content = text.slice(contentStart, contentEnd).trim();\n\n // Clean up common markdown artifacts at start/end of content\n // Remove leading ** or * or _ that got captured\n content = content.replace(/^(\\*\\*|\\*|_)+\\s*/, \"\");\n // Remove trailing ** or * or _ that might be present\n content = content.replace(/\\s*(\\*\\*|\\*|_)+$/, \"\");\n\n // Only set if we haven't already found a value for this key\n // (first occurrence wins)\n if (!(marker.key in result)) {\n result[marker.key] = content;\n }\n }\n\n // Fallback: if only one output field and no match was found, use the full\n // completion text.\n const outputKeys = outputs.map(([k]) => k);\n if (outputKeys.length === 1 && !(outputKeys[0]! in result)) {\n result[outputKeys[0]!] = text.trim();\n }\n\n return result;\n }\n}\n","import { Predict } from \"./Predict.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport { Signature } from \"../signatures/index.js\";\nimport type { FieldMeta } from \"../signatures/index.js\";\n\n/**\n * Chain-of-Thought module — extends {@link Predict} by prepending a hidden\n * `rationale` output field so the LM reasons before producing the answer.\n *\n * Mirrors `dspy.ChainOfThought` in Python.\n *\n * @example\n * ```ts\n * const cot = new ChainOfThought(\"question -> answer\");\n * const result = await cot.forward({ question: \"What is 9 * 8?\" });\n * console.log(result.get(\"answer\")); // \"72\"\n * ```\n */\nexport class ChainOfThought extends Predict {\n constructor(\n signature: string | Signature,\n options: { rationaleDescription?: string } = {},\n ) {\n const base = typeof signature === \"string\" ? Signature.from(signature) : signature;\n\n const rationaleSig = base.withOutput(\"rationale\", {\n description:\n options.rationaleDescription ??\n \"Think step by step to reason through the problem\",\n prefix: \"Reasoning:\",\n });\n\n // Ensure rationale is the FIRST output field.\n const reordered = new Signature({\n inputs: rationaleSig.inputs as Map<string, FieldMeta>,\n outputs: new Map([\n [\"rationale\", rationaleSig.outputs.get(\"rationale\")!],\n ...rationaleSig.outputs,\n ]),\n instructions: rationaleSig.instructions,\n });\n\n super(reordered);\n }\n\n /** Returns the answer without the internal rationale. */\n override async forward(inputs: Record<string, unknown>): Promise<Prediction> {\n const prediction = await super.forward(inputs);\n // Strip the rationale from the returned prediction so downstream modules\n // only see the actual output fields.\n const { rationale: _rationale, ...rest } = prediction.toDict() as Record<string, unknown>;\n void _rationale;\n return new Prediction(rest, prediction.completions as Record<string, unknown>[]);\n }\n}\n","import { ChainOfThought } from \"./ChainOfThought.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport type { Signature } from \"../signatures/index.js\";\n\n/**\n * Chain-of-Thought with an optional user-supplied hint injected into the\n * prompt at inference time.\n *\n * Mirrors `dspy.ChainOfThoughtWithHint` in Python.\n *\n * @example\n * ```ts\n * const cot = new ChainOfThoughtWithHint(\"question -> answer\");\n * const result = await cot.forward({\n * question: \"What is the capital of France?\",\n * hint: \"Think about European countries.\",\n * });\n * ```\n */\nexport class ChainOfThoughtWithHint extends ChainOfThought {\n constructor(signature: string | Signature, options: { rationaleDescription?: string } = {}) {\n const base = typeof signature === \"string\" ? signature : signature;\n super(base, options);\n // Add hint as an optional input field.\n const extendedSig = this.signature.withInput(\"hint\", {\n description: \"An optional hint to guide the reasoning\",\n optional: true,\n });\n // Re-assign the signature via a workaround (Predict stores it as readonly).\n Object.assign(this, { signature: extendedSig });\n }\n}\n","import { Module } from \"./Module.js\";\nimport { ChainOfThought } from \"./ChainOfThought.js\";\nimport { Predict } from \"./Predict.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport type { Signature } from \"../signatures/index.js\";\n\n/**\n * Runs a signature `M` times and selects the best completion via a final\n * aggregation call.\n *\n * Mirrors `dspy.MultiChainComparison` in Python.\n */\nexport class MultiChainComparison extends Module {\n readonly M: number;\n readonly #cot: ChainOfThought;\n readonly #aggregator: Predict;\n\n constructor(signature: string | Signature, M = 3) {\n super();\n this.M = M;\n this.#cot = new ChainOfThought(signature);\n\n // Aggregator chooses from the M completions.\n this.#aggregator = new Predict(\n \"completions -> answer\",\n );\n }\n\n async forward(inputs: Record<string, unknown>): Promise<Prediction> {\n const completions: string[] = [];\n const outputKey = [...this.#cot.signature.outputs.keys()].find((k) => k !== \"rationale\") ?? \"answer\";\n\n for (let i = 0; i < this.M; i++) {\n const result = await this.#cot.forward(inputs);\n completions.push(String(result.get(outputKey) ?? \"\"));\n }\n\n const aggregated = await this.#aggregator.forward({\n completions: completions\n .map((c, i) => `Option ${i + 1}: ${c}`)\n .join(\"\\n\"),\n });\n\n // Extract the actual answer from the selected option\n const rawAnswer = String(aggregated.get(\"answer\") ?? \"\");\n // If the model returned \"Option N\", extract the content of that option\n const optionMatch = /^Option\\s*(\\d+)/i.exec(rawAnswer);\n if (optionMatch) {\n const optionIdx = parseInt(optionMatch[1]!, 10) - 1;\n if (optionIdx >= 0 && optionIdx < completions.length) {\n return new Prediction({ answer: completions[optionIdx] ?? rawAnswer });\n }\n }\n\n return new Prediction({ answer: rawAnswer });\n }\n}\n","import { Module } from \"./Module.js\";\nimport { Predict } from \"./Predict.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport { Signature } from \"../signatures/index.js\";\n\n/** A callable tool that ReAct can invoke. */\nexport interface Tool {\n /** Short unique name used in `Action: toolName[args]` syntax. */\n name: string;\n /** One-sentence description shown in the system prompt. */\n description: string;\n /** Async function that the tool executes. */\n fn: (args: string) => Promise<string>;\n}\n\n/**\n * ReAct (Reasoning + Acting) module that interleaves Thought, Action, and\n * Observation steps in a loop until a `Finish` action is emitted.\n *\n * Mirrors `dspy.ReAct` in Python.\n *\n * @example\n * ```ts\n * const react = new ReAct(\"question -> answer\", [searchTool]);\n * const result = await react.forward({ question: \"Who won the 2024 Olympics?\" });\n * ```\n */\nexport class ReAct extends Module {\n readonly tools: ReadonlyMap<string, Tool>;\n readonly maxIter: number;\n readonly #predictor: Predict;\n\n constructor(signature: string | Signature, tools: Tool[], maxIter = 5) {\n super();\n this.tools = new Map(tools.map((t) => [t.name, t]));\n this.maxIter = maxIter;\n\n const toolDescriptions = tools\n .map((t) => `${t.name}: ${t.description}`)\n .join(\"\\n\");\n\n const instructions =\n `You are an agent. Use the following tools:\\n${toolDescriptions}\\n\\n` +\n `Respond in the format:\\nThought: <reasoning>\\nAction: <tool>[<args>]\\nObservation: <result>\\n...\\nFinish[<answer>]`;\n\n let baseSig = typeof signature === \"string\" ? Signature.from(signature) : signature;\n baseSig = baseSig.withInput(\"trajectory\", {\n description: \"Interleaved reasoning steps so far\",\n optional: true,\n });\n\n this.#predictor = new Predict(baseSig);\n this.#predictor.instructions = instructions;\n }\n\n async forward(inputs: Record<string, unknown>): Promise<Prediction> {\n const trajectory: string[] = [];\n let finalAnswer = \"\";\n\n for (let i = 0; i < this.maxIter; i++) {\n const augmented = {\n ...inputs,\n trajectory: trajectory.join(\"\\n\"),\n };\n\n const result = await this.#predictor.forward(augmented);\n const text = String(result.get([...this.#predictor.signature.outputs.keys()][0] ?? \"\") ?? \"\");\n trajectory.push(text);\n\n // Check for Finish action.\n const finishMatch = /Finish\\[(.+)\\]/i.exec(text);\n if (finishMatch) {\n finalAnswer = finishMatch[1] ?? \"\";\n break;\n }\n\n // Execute any Action.\n const actionMatch = /Action:\\s*(\\w+)\\[(.+?)\\]/i.exec(text);\n if (actionMatch) {\n const toolName = actionMatch[1] ?? \"\";\n const toolArgs = actionMatch[2] ?? \"\";\n const tool = this.tools.get(toolName);\n const observation = tool\n ? await tool.fn(toolArgs)\n : `Tool \"${toolName}\" not found.`;\n trajectory.push(`Observation: ${observation}`);\n }\n }\n\n const outputKey = [...this.#predictor.signature.outputs.keys()][0] ?? \"answer\";\n return new Prediction({\n [outputKey]: finalAnswer || trajectory.at(-1) || \"\",\n trajectory: trajectory.join(\"\\n\"),\n });\n }\n}\n","import { Module } from \"./Module.js\";\nimport { Predict } from \"./Predict.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport { Signature, InputField, OutputField } from \"../signatures/index.js\";\n\n/**\n * Generates JavaScript code to answer a question, executes it in a sandboxed\n * manner, and returns the result.\n *\n * Mirrors `dspy.ProgramOfThought` in Python.\n *\n * ⚠️ Security: code runs inside the same process via `new Function()` with a\n * configurable wall-clock timeout (default 5 s). The timeout prevents\n * indefinite hangs but does **not** prevent access to Node.js APIs or the\n * global scope. Do NOT use with untrusted inputs in production without\n * an additional sandboxing layer (e.g. a Worker thread with a restricted\n * `MessageChannel`).\n */\nexport class ProgramOfThought extends Module {\n readonly maxAttempts: number;\n /** Wall-clock timeout (ms) for each code execution attempt. */\n readonly timeoutMs: number;\n readonly sandbox: \"worker\" | \"function\" | \"none\";\n readonly #codeGenerator: Predict;\n readonly #corrector: Predict;\n readonly #outputKey: string;\n\n constructor(signature: string | Signature, maxAttempts = 3, timeoutMs = 5_000, sandbox: \"worker\" | \"function\" | \"none\" = \"function\") {\n super();\n this.maxAttempts = maxAttempts;\n this.timeoutMs = timeoutMs;\n this.sandbox = sandbox;\n\n const base = typeof signature === \"string\" ? Signature.from(signature) : signature;\n\n // Build the generator signature programmatically to avoid a double `->`:\n // inputs from base + optional `instructions` -> `code`\n const genSig = new Signature({\n inputs: new Map([\n ...base.inputs,\n [\n \"instructions\",\n InputField({\n description: \"Task instructions for code generation\",\n optional: true,\n }),\n ],\n ]),\n outputs: new Map([\n [\n \"code\",\n OutputField({\n description:\n \"JavaScript code that computes and returns the answer via a `return` statement\",\n }),\n ],\n ]),\n instructions: base.instructions,\n });\n\n this.#codeGenerator = new Predict(genSig);\n this.#corrector = new Predict(\"code, error -> fixed_code\");\n this.#outputKey = [...base.outputs.keys()][0] ?? \"answer\";\n }\n\n async forward(inputs: Record<string, unknown>): Promise<Prediction> {\n let code = \"\";\n let result: unknown;\n let lastError = \"\";\n\n for (let attempt = 0; attempt < this.maxAttempts; attempt++) {\n const genInputs =\n attempt === 0\n ? {\n ...inputs,\n instructions:\n \"Write JavaScript code to compute the answer. IMPORTANT: Use a `return` statement (not console.log) for the final value. Do not include markdown code fences.\",\n }\n : { code, error: lastError };\n\n const generated =\n attempt === 0\n ? await this.#codeGenerator.forward(genInputs)\n : await this.#corrector.forward(genInputs);\n\n code = String(generated.get(\"code\") ?? generated.get(\"fixed_code\") ?? \"\");\n\n // Strip markdown code fences if present (```javascript ... ``` or ``` ... ```)\n code = code.replace(/^```(?:\\w+)?\\s*\\n?/i, \"\").replace(/\\n?```\\s*$/i, \"\").trim();\n\n try {\n if (this.sandbox === \"worker\") {\n result = await this.#executeInWorker(code, this.timeoutMs);\n } else if (this.sandbox === \"none\") {\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const fn = new Function(`return (async () => { ${code} })()`) as () => Promise<unknown>;\n result = await fn();\n } else {\n // \"function\" — default, with timeout\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const fn = new Function(`return (async () => { ${code} })()`) as () => Promise<unknown>;\n result = await this.#executeWithTimeout(fn(), this.timeoutMs);\n }\n break;\n } catch (err) {\n lastError = err instanceof Error ? err.message : String(err);\n result = undefined;\n }\n }\n\n return new Prediction({\n [this.#outputKey]: result !== undefined ? String(result) : \"\",\n code,\n });\n }\n\n async #executeInWorker(code: string, timeoutMs: number): Promise<string> {\n const { Worker } = await import(\"node:worker_threads\");\n const WORKER_CODE = `\nconst { workerData, parentPort } = require('node:worker_threads');\nconst { code } = workerData;\n(async () => {\n try {\n const fn = new Function('return (async () => { ' + code + ' })()');\n const result = await fn();\n parentPort.postMessage({ result: String(result ?? '') });\n } catch (err) {\n parentPort.postMessage({ error: err.message ?? String(err) });\n }\n})();\n`;\n\n return new Promise((resolve, reject) => {\n const worker = new Worker(WORKER_CODE, {\n eval: true,\n workerData: { code },\n });\n const timer = setTimeout(() => {\n void worker.terminate();\n reject(new Error(\"ProgramOfThought: worker execution timed out\"));\n }, timeoutMs);\n worker.on(\"message\", (msg: { result?: string; error?: string }) => {\n clearTimeout(timer);\n void worker.terminate();\n if (msg.error) reject(new Error(msg.error));\n else resolve(msg.result ?? \"\");\n });\n worker.on(\"error\", (err: Error) => {\n clearTimeout(timer);\n reject(err);\n });\n });\n }\n\n /**\n * Race `promise` against a wall-clock timer.\n * The underlying async work is not cancelled on timeout (no true abort), but\n * the returned Promise rejects promptly.\n */\n #executeWithTimeout(promise: Promise<unknown>, timeoutMs: number): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(\n () =>\n reject(\n new Error(\n `ProgramOfThought: code execution timed out after ${timeoutMs}ms`,\n ),\n ),\n timeoutMs,\n );\n promise.then(\n (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n (err: unknown) => {\n clearTimeout(timer);\n reject(err);\n },\n );\n });\n }\n}\n\n","import { Module } from \"./Module.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport { settings } from \"../settings/index.js\";\n\n/**\n * Retrieve module that calls the globally configured retriever.\n *\n * Mirrors `dspy.Retrieve` in Python.\n *\n * @example\n * ```ts\n * settings.configure({ rm: new ColBERTv2(\"http://colbert.host\") });\n * const retrieve = new Retrieve(3);\n * const result = await retrieve.forward(\"What is DSPy?\");\n * console.log(result.get(\"passages\")); // string[]\n * ```\n */\nexport class Retrieve extends Module {\n readonly k: number;\n\n constructor(k = 3) {\n super();\n this.k = k;\n }\n\n async forward(query: string): Promise<Prediction> {\n const rm = settings.rm;\n if (!rm) {\n throw new Error(\n \"No retriever configured. Call settings.configure({ rm }) before using Retrieve.\",\n );\n }\n const passages = await rm.retrieve(query, this.k);\n return new Prediction({ passages, query });\n }\n}\n","/**\n * A typed error thrown by {@link Assert} when a condition is not met.\n *\n * {@link Retry} catches this error and feeds the message back into the next\n * attempt as feedback.\n */\nexport class AssertionError extends Error {\n constructor(message = \"Assertion failed\") {\n super(message);\n this.name = \"AssertionError\";\n }\n}\n\n/**\n * Hard assertion — throws an {@link AssertionError} if `condition` is falsy.\n * Caught and retried by the {@link Retry} module.\n *\n * Mirrors `dspy.Assert` in Python.\n *\n * @example\n * ```ts\n * Assert(result.get(\"answer\") !== \"\", \"Answer must not be empty\");\n * ```\n */\nexport function Assert(condition: unknown, message?: string): asserts condition {\n if (!condition) {\n throw new AssertionError(message ?? \"Assertion failed\");\n }\n}\n","/**\n * Soft suggestion — logs a warning if `condition` is falsy but does NOT throw.\n *\n * Mirrors `dspy.Suggest` in Python.\n *\n * @example\n * ```ts\n * Suggest(result.get(\"confidence\") === \"high\", \"Low confidence in answer\");\n * ```\n */\nexport function Suggest(condition: unknown, message?: string): void {\n if (!condition) {\n // Use a non-throwing warning so the pipeline continues.\n console.warn(`[DSTsx Suggest] ${message ?? \"Condition not met\"}`);\n }\n}\n","import { Module, firstPrediction, type ModuleOutput } from \"./Module.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport { AssertionError } from \"../assertions/index.js\";\n\n/**\n * Wraps any module and retries on {@link AssertionError} up to `maxAttempts`,\n * feeding the failure message back into the next attempt.\n *\n * Mirrors `dspy.Retry` in Python.\n */\nexport class Retry extends Module {\n readonly #inner: Module;\n readonly maxAttempts: number;\n\n constructor(inner: Module, maxAttempts = 3) {\n super();\n this.#inner = inner;\n this.maxAttempts = maxAttempts;\n }\n\n async forward(...args: unknown[]): Promise<Prediction> {\n let lastError: AssertionError | undefined;\n\n for (let attempt = 0; attempt < this.maxAttempts; attempt++) {\n try {\n return firstPrediction(\n await (this.#inner.forward as (...a: unknown[]) => Promise<ModuleOutput>)(...args),\n );\n } catch (err) {\n if (err instanceof AssertionError) {\n lastError = err;\n // If the inner module is a Predict-like module, inject the error\n // message as feedback via a \"past_outputs\" field.\n const firstArg = args[0];\n if (firstArg && typeof firstArg === \"object\") {\n (firstArg as Record<string, unknown>)[\"feedback\"] = err.message;\n }\n continue;\n }\n throw err;\n }\n }\n\n throw lastError ?? new Error(\"Retry: all attempts exhausted\");\n }\n}\n","import { Module, firstPrediction, type ModuleOutput } from \"./Module.js\";\nimport { Prediction } from \"../primitives/index.js\";\n\n/**\n * Runs `N` copies of a module in parallel and selects the best output via a\n * provided `reduceFunc` (defaults to returning the first result).\n *\n * Mirrors `dspy.BestOfN` in Python.\n */\nexport class BestOfN extends Module {\n readonly N: number;\n readonly #inner: Module;\n readonly #reduce: (predictions: Prediction[]) => Prediction;\n\n constructor(\n inner: Module,\n N = 3,\n reduceFunc?: (predictions: Prediction[]) => Prediction,\n ) {\n super();\n this.#inner = inner;\n this.N = N;\n this.#reduce = reduceFunc ?? ((preds) => preds[0] ?? new Prediction({}));\n }\n\n async forward(...args: unknown[]): Promise<Prediction> {\n const results = await Promise.all(\n Array.from({ length: this.N }, () =>\n (this.#inner.forward as (...a: unknown[]) => Promise<ModuleOutput>)(...args),\n ),\n );\n return this.#reduce(results.map(firstPrediction));\n }\n}\n","import { Module, firstPrediction, type ModuleOutput } from \"./Module.js\";\nimport { Prediction } from \"../primitives/index.js\";\n\n/**\n * Combines multiple modules into one via a voting or custom reduce function.\n *\n * Mirrors `dspy.Ensemble` (optimizer version) when used as a module.\n */\nexport class Ensemble extends Module {\n readonly #modules: Module[];\n readonly #reduce: (predictions: Prediction[]) => Prediction;\n\n constructor(\n modules: Module[],\n reduceFunc?: (predictions: Prediction[]) => Prediction,\n ) {\n super();\n this.#modules = modules;\n this.#reduce = reduceFunc ?? ((preds) => preds[0] ?? new Prediction({}));\n }\n\n async forward(...args: unknown[]): Promise<Prediction> {\n const results = await Promise.all(\n this.#modules.map((m) =>\n (m.forward as (...a: unknown[]) => Promise<ModuleOutput>)(...args),\n ),\n );\n return this.#reduce(results.map(firstPrediction));\n }\n}\n","import { Predict } from \"./Predict.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport { Signature } from \"../signatures/index.js\";\nimport type { FieldMeta } from \"../signatures/index.js\";\n\n/**\n * A Prediction that additionally carries a typed `.typed` field.\n */\nexport class TypedPrediction<T = unknown> extends Prediction {\n readonly typed: T;\n\n constructor(\n data: Record<string, unknown>,\n typed: T,\n completions: Record<string, unknown>[] = [],\n ) {\n super(data, completions);\n this.typed = typed;\n }\n}\n\n/**\n * TypedPredictor — like Predict but appends JSON formatting instructions and\n * parses the completion as JSON. If an optional schema is provided,\n * validates and returns `.typed`.\n */\nexport class TypedPredictor<T = unknown> extends Predict {\n readonly #schema: { parse: (v: unknown) => T } | undefined;\n readonly #maxRetries: number;\n\n constructor(\n signature: string | Signature,\n schema?: { parse: (v: unknown) => T },\n options: { maxRetries?: number } = {},\n ) {\n super(signature);\n this.#schema = schema;\n this.#maxRetries = options.maxRetries ?? 3;\n }\n\n override async forward(inputs: Record<string, unknown>): Promise<TypedPrediction<T>> {\n const origInstructions = this.instructions;\n const jsonSuffix = \"\\n\\nRespond with a JSON object matching the output schema.\";\n this.instructions = (origInstructions ?? \"\") + jsonSuffix;\n\n let lastError: unknown;\n try {\n for (let attempt = 0; attempt <= this.#maxRetries; attempt++) {\n try {\n const prediction = await super.forward(inputs);\n const dict = prediction.toDict() as Record<string, unknown>;\n\n // Try each output field's value as potential JSON source\n let parsed: unknown;\n let found = false;\n let lastParseError: unknown;\n for (const key of this.signature.outputs.keys()) {\n const val = dict[key];\n if (typeof val === \"string\" && val.length > 0) {\n try {\n parsed = TypedPredictor.#parseJSON(val);\n found = true;\n break;\n } catch (parseErr) {\n lastParseError = parseErr;\n }\n }\n }\n\n if (!found) {\n if (lastParseError !== undefined) {\n // Had non-empty string field(s) but none parsed as JSON\n throw lastParseError;\n }\n // No string field values — fall back to the dict (e.g. multi-field with empty results)\n parsed = dict;\n }\n\n let typed: T;\n if (this.#schema) {\n typed = this.#schema.parse(parsed);\n } else {\n typed = parsed as T;\n }\n\n return new TypedPrediction<T>(\n dict,\n typed,\n prediction.completions as Record<string, unknown>[],\n );\n } catch (err) {\n lastError = err;\n // continue to next attempt\n }\n }\n } finally {\n this.instructions = origInstructions;\n }\n\n throw lastError;\n }\n\n static #parseJSON(raw: unknown): unknown {\n if (typeof raw !== \"string\") return raw;\n let text = raw.trim();\n // Strip markdown code fences\n const fence = /^```(?:json)?\\s*([\\s\\S]*?)\\s*```$/m.exec(text);\n if (fence) text = (fence[1] ?? \"\").trim();\n return JSON.parse(text);\n }\n}\n\n/**\n * TypedChainOfThought — like TypedPredictor but adds a hidden rationale field\n * so the LM reasons before producing the answer.\n */\nexport class TypedChainOfThought<T = unknown> extends TypedPredictor<T> {\n constructor(\n signature: string | Signature,\n schema?: { parse: (v: unknown) => T },\n options: { maxRetries?: number } = {},\n ) {\n const base = typeof signature === \"string\" ? Signature.from(signature) : signature;\n\n const withRationale = base.withOutput(\"rationale\", {\n description: \"Think step by step to reason through the problem\",\n prefix: \"Reasoning:\",\n });\n\n // Ensure rationale is the FIRST output field\n const reordered = new Signature({\n inputs: withRationale.inputs as Map<string, FieldMeta>,\n outputs: new Map([\n [\"rationale\", withRationale.outputs.get(\"rationale\")!],\n ...withRationale.outputs,\n ]),\n instructions: withRationale.instructions,\n });\n\n super(reordered, schema, options);\n }\n\n override async forward(inputs: Record<string, unknown>): Promise<TypedPrediction<T>> {\n const result = await super.forward(inputs);\n // Destructure rationale out so it doesn't appear in the returned prediction.\n const { rationale: _rationale, ...rest } = result.toDict() as Record<string, unknown>;\n void _rationale;\n return new TypedPrediction<T>(\n rest,\n result.typed,\n result.completions as Record<string, unknown>[],\n );\n }\n}\n","import { setTimeout } from \"node:timers\";\nimport { Module, firstPrediction, type ModuleOutput } from \"./Module.js\";\nimport type { Prediction } from \"../primitives/index.js\";\n\n/**\n * Runs multiple modules in parallel and returns all their results as a\n * `Prediction[]`.\n *\n * Because `forward()` now returns `Prediction[]`, consumers can use the\n * results directly without needing the separate `run()` method. `run()` is\n * retained as a more explicit, named alternative.\n */\nexport class Parallel extends Module {\n readonly #modules: Module[];\n readonly #timeoutMs: number | undefined;\n\n constructor(modules: Module[], options: { timeoutMs?: number } = {}) {\n super();\n this.#modules = modules;\n this.#timeoutMs = options.timeoutMs;\n }\n\n /**\n * Run all modules in parallel and return one {@link Prediction} per module.\n * If a module's `forward()` returns multiple predictions, the first is used.\n */\n async run(...args: unknown[]): Promise<Prediction[]> {\n const tasks = this.#modules.map((m) =>\n (m.forward as (...a: unknown[]) => Promise<ModuleOutput>)(...args),\n );\n\n let settled: Promise<ModuleOutput[]>;\n if (this.#timeoutMs !== undefined) {\n const timeoutMs = this.#timeoutMs;\n const withTimeout = tasks.map((t) =>\n Promise.race([\n t,\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(\"Parallel: timeout\")), timeoutMs),\n ),\n ]),\n );\n settled = Promise.all(withTimeout);\n } else {\n settled = Promise.all(tasks);\n }\n\n return (await settled).map(firstPrediction);\n }\n\n /**\n * Execute all modules in parallel and return all predictions as an array\n * (one entry per module).\n */\n override async forward(...args: unknown[]): Promise<Prediction[]> {\n return this.run(...args);\n }\n}\n\n","import { Module, firstPrediction, type ModuleOutput } from \"./Module.js\";\nimport { Predict } from \"./Predict.js\";\nimport { Prediction } from \"../primitives/index.js\";\n\nexport interface RefineOptions {\n /** Maximum refinement iterations (default: 2). */\n maxRefinements?: number;\n /** Field name for feedback in the inner module re-run (default: \"feedback\"). */\n feedbackField?: string;\n /** If returns true, stop refining early. */\n stopCondition?: (prediction: Prediction) => boolean;\n}\n\n/**\n * Self-critique / iterative refinement loop.\n *\n * Runs the inner module, then uses a Predict critic to score the output.\n * If the output is not satisfactory, feeds critique back and re-runs.\n */\nexport class Refine extends Module {\n readonly #inner: Module;\n readonly #maxRefinements: number;\n readonly #feedbackField: string;\n readonly #stopCondition: ((p: Prediction) => boolean) | undefined;\n readonly #critic: Predict;\n\n constructor(inner: Module, options: RefineOptions = {}) {\n super();\n this.#inner = inner;\n this.#maxRefinements = options.maxRefinements ?? 2;\n this.#feedbackField = options.feedbackField ?? \"feedback\";\n this.#stopCondition = options.stopCondition;\n this.#critic = new Predict(\"output -> critique, is_satisfactory\");\n }\n\n override async forward(...args: unknown[]): Promise<Prediction> {\n const innerForward = this.#inner.forward.bind(this.#inner) as (\n ...a: unknown[]\n ) => Promise<ModuleOutput>;\n\n let prediction = firstPrediction(await innerForward(...args));\n\n for (let i = 0; i < this.#maxRefinements; i++) {\n if (this.#stopCondition?.(prediction)) break;\n\n const outputStr = JSON.stringify(prediction.toDict());\n let critique: Prediction;\n try {\n critique = await this.#critic.forward({ output: outputStr });\n } catch {\n break;\n }\n\n const isSatisfactory = String(\n critique.get(\"is_satisfactory\") ?? \"\",\n )\n .toLowerCase()\n .trim();\n if (isSatisfactory === \"yes\" || isSatisfactory === \"true\") break;\n\n const feedback = String(critique.get(\"critique\") ?? \"\");\n const newArgs = [...args];\n if (\n newArgs.length > 0 &&\n typeof newArgs[0] === \"object\" &&\n newArgs[0] !== null\n ) {\n newArgs[0] = {\n ...(newArgs[0] as Record<string, unknown>),\n [this.#feedbackField]: feedback,\n };\n }\n try {\n prediction = firstPrediction(await innerForward(...newArgs));\n } catch {\n break;\n }\n }\n\n return prediction;\n }\n}\n","import { Module } from \"./Module.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport { Signature } from \"../signatures/index.js\";\nimport type { Tool } from \"./ReAct.js\";\nimport { settings } from \"../settings/index.js\";\nimport type { Message } from \"../lm/types.js\";\n\n/**\n * ReAct variant that uses provider-native tool/function calling instead of\n * text-based action parsing.\n *\n * For OpenAI models, this uses function calling (tools API). For Anthropic, it\n * uses tool_use. Other adapters fall back to the text-based ReAct format.\n *\n * @example\n * ```ts\n * const tools: Tool[] = [{ name: \"search\", description: \"Search\", fn: search }];\n * const agent = new NativeReAct(\"question -> answer\", tools);\n * const result = await agent.forward({ question: \"What is the capital of France?\" });\n * ```\n */\nexport class NativeReAct extends Module {\n readonly tools: ReadonlyMap<string, Tool>;\n readonly maxIter: number;\n readonly #signatureStr: string;\n readonly #outputKey: string;\n\n constructor(\n signatureStr: string,\n tools: Tool[],\n maxIter = 5,\n ) {\n super();\n this.#signatureStr = signatureStr;\n this.tools = new Map(tools.map((t) => [t.name, t]));\n this.maxIter = maxIter;\n // Parse the output field name from the signature string\n const sig = Signature.from(signatureStr);\n this.#outputKey = [...sig.outputs.keys()][0] ?? \"answer\";\n }\n\n override async forward(inputs: Record<string, unknown>): Promise<Prediction> {\n const lm = settings.lm;\n if (!lm) throw new Error(\"No LM configured.\");\n\n const toolSchemas = [...this.tools.values()].map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: {\n type: \"object\",\n properties: { args: { type: \"string\", description: \"Tool arguments as JSON or plain string\" } },\n required: [\"args\"],\n },\n },\n }));\n\n const inputStr = Object.entries(inputs)\n .map(([k, v]) => `${k}: ${String(v)}`)\n .join(\"\\n\");\n\n const messages: Message[] = [\n {\n role: \"system\",\n content: `You are a helpful assistant. Use tools when needed.\\nSignature: ${this.#signatureStr}\\nTools: ${[...this.tools.keys()].join(\", \")}`,\n },\n { role: \"user\", content: inputStr },\n ];\n\n let finalAnswer = \"\";\n const trajectory: Array<{ thought: string; action: string; observation: string }> = [];\n\n for (let i = 0; i < this.maxIter; i++) {\n const response = await lm.call(messages, {\n extra: { tools: toolSchemas, tool_choice: \"auto\" },\n });\n\n const raw = response.raw as Record<string, unknown> | null;\n const choices = (raw?.[\"choices\"] as Array<Record<string, unknown>>) ?? [];\n const choice = choices[0];\n const toolCalls = (\n choice?.[\"message\"] as Record<string, unknown> | undefined\n )?.[\"tool_calls\"] as\n | Array<{ function: { name: string; arguments: string } }>\n | undefined;\n\n if (toolCalls && toolCalls.length > 0) {\n for (const tc of toolCalls) {\n const toolName = tc.function.name;\n const args = tc.function.arguments;\n const tool = this.tools.get(toolName);\n const observation = tool\n ? await tool.fn(args).catch((e: unknown) => String(e))\n : `Unknown tool: ${toolName}`;\n\n trajectory.push({\n thought: `Using tool: ${toolName}`,\n action: `${toolName}(${args})`,\n observation,\n });\n messages.push({ role: \"assistant\", content: `Tool: ${toolName}\\nArgs: ${args}` });\n messages.push({ role: \"user\", content: `Observation: ${observation}` });\n }\n } else {\n finalAnswer = response.text;\n break;\n }\n }\n\n return new Prediction({ [this.#outputKey]: finalAnswer, trajectory: JSON.stringify(trajectory) });\n }\n}\n","/**\n * Abstract base class for all retrieval backends.\n *\n * Mirrors `dspy.Retrieve`'s underlying retriever protocol in Python.\n */\nexport abstract class Retriever {\n /**\n * Retrieve the top-`k` passages relevant to `query`.\n *\n * @param query - The search query string.\n * @param k - Number of passages to return.\n * @returns An ordered array of passage strings (most relevant first).\n */\n abstract retrieve(query: string, k: number): Promise<string[]>;\n}\n","import { Retriever } from \"../Retriever.js\";\n\n/** Options for the ColBERTv2 retriever. */\nexport interface ColBERTv2Options {\n /** Base URL of the ColBERT server. */\n url: string;\n /** Number of passages to request from the server (defaults to k). */\n passages?: number;\n}\n\n/**\n * Retriever that queries a ColBERTv2 REST endpoint.\n *\n * Mirrors `dspy.ColBERTv2` in Python.\n */\nexport class ColBERTv2 extends Retriever {\n readonly #url: string;\n\n constructor(options: ColBERTv2Options | string) {\n super();\n this.#url = typeof options === \"string\" ? options : options.url;\n }\n\n async retrieve(query: string, k: number): Promise<string[]> {\n const url = new URL(\"/search\", this.#url);\n url.searchParams.set(\"query\", query);\n url.searchParams.set(\"k\", String(k));\n\n const response = await fetch(url.toString());\n if (!response.ok) {\n throw new Error(`ColBERTv2 request failed: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as { topk?: Array<{ content?: string }> };\n return (data.topk ?? []).map((p) => p.content ?? \"\").filter(Boolean);\n }\n}\n","import { Retriever } from \"../Retriever.js\";\n\n/** Options for the Pinecone retriever. */\nexport interface PineconeRMOptions {\n apiKey?: string;\n indexName: string;\n namespace?: string;\n embeddingFn: (text: string) => Promise<number[]>;\n}\n\n/**\n * Retriever backed by Pinecone vector database.\n *\n * Requires the `@pinecone-database/pinecone` package:\n * ```\n * npm install @pinecone-database/pinecone\n * ```\n */\nexport class PineconeRM extends Retriever {\n readonly #options: PineconeRMOptions;\n\n constructor(options: PineconeRMOptions) {\n super();\n this.#options = options;\n }\n\n async retrieve(query: string, k: number): Promise<string[]> {\n const { Pinecone } = await import(\"@pinecone-database/pinecone\").catch(() => {\n throw new Error(\n \"The `@pinecone-database/pinecone` package is required.\\n\" +\n \"Install it with: npm install @pinecone-database/pinecone\",\n );\n });\n\n const client = new Pinecone({\n apiKey: this.#options.apiKey ?? process.env[\"PINECONE_API_KEY\"] ?? \"\",\n });\n\n const index = client.index(this.#options.indexName);\n const embedding = await this.#options.embeddingFn(query);\n\n const queryResponse = await index.namespace(this.#options.namespace ?? \"\").query({\n vector: embedding,\n topK: k,\n includeMetadata: true,\n });\n\n return (queryResponse.matches ?? [])\n .map((m: { metadata?: Record<string, unknown> }) =>\n String(m.metadata?.[\"text\"] ?? m.metadata?.[\"content\"] ?? \"\"),\n )\n .filter(Boolean);\n }\n}\n","import { Retriever } from \"../Retriever.js\";\n\n/** Options for the Weaviate retriever. */\nexport interface WeaviateRMOptions {\n url: string;\n apiKey?: string;\n /** The Weaviate class/collection to query. */\n className: string;\n /** Property name that holds the passage text. */\n textProperty?: string;\n embeddingFn: (text: string) => Promise<number[]>;\n}\n\n/**\n * Retriever backed by Weaviate vector database.\n *\n * Requires the `weaviate-client` package:\n * ```\n * npm install weaviate-client\n * ```\n */\nexport class WeaviateRM extends Retriever {\n readonly #options: WeaviateRMOptions;\n\n constructor(options: WeaviateRMOptions) {\n super();\n this.#options = options;\n }\n\n async retrieve(query: string, k: number): Promise<string[]> {\n const weaviate = await import(\"weaviate-client\").catch(() => {\n throw new Error(\n \"The `weaviate-client` package is required.\\n\" +\n \"Install it with: npm install weaviate-client\",\n );\n });\n\n const client = await weaviate.default.connectToCustom({\n httpHost: this.#options.url,\n ...(this.#options.apiKey ? { authCredentials: new weaviate.default.ApiKey(this.#options.apiKey) } : {}),\n });\n\n const embedding = await this.#options.embeddingFn(query);\n const textProp = this.#options.textProperty ?? \"text\";\n\n const result = await client.collections\n .get(this.#options.className)\n .query.nearVector(embedding, { limit: k, returnProperties: [textProp] });\n\n return (result.objects ?? [])\n .map((obj: { properties?: Record<string, unknown> }) =>\n String(obj.properties?.[textProp] ?? \"\"),\n )\n .filter(Boolean);\n }\n}\n","import { Retriever } from \"../Retriever.js\";\n\n/** Options for the ChromaDB retriever. */\nexport interface ChromadbRMOptions {\n /** ChromaDB server URL (default: http://localhost:8000). */\n url?: string;\n collectionName: string;\n embeddingFn?: (texts: string[]) => Promise<number[][]>;\n}\n\n/**\n * Retriever backed by ChromaDB.\n *\n * Requires the `chromadb` package:\n * ```\n * npm install chromadb\n * ```\n */\nexport class ChromadbRM extends Retriever {\n readonly #options: ChromadbRMOptions;\n\n constructor(options: ChromadbRMOptions) {\n super();\n this.#options = options;\n }\n\n async retrieve(query: string, k: number): Promise<string[]> {\n const { ChromaClient } = await import(\"chromadb\").catch(() => {\n throw new Error(\n \"The `chromadb` package is required.\\n\" +\n \"Install it with: npm install chromadb\",\n );\n });\n\n const client = new ChromaClient({ path: this.#options.url ?? \"http://localhost:8000\" });\n const collection = await client.getCollection({ name: this.#options.collectionName });\n\n const results = await collection.query({\n queryTexts: [query],\n nResults: k,\n });\n\n return (results.documents?.[0] ?? []).filter((d: unknown): d is string => d !== null);\n }\n}\n","import { Retriever } from \"../Retriever.js\";\n\n/** Options for the Qdrant retriever. */\nexport interface QdrantRMOptions {\n url?: string;\n apiKey?: string;\n collectionName: string;\n /** Property name that holds the passage text in the payload. */\n textField?: string;\n embeddingFn: (text: string) => Promise<number[]>;\n}\n\n/**\n * Retriever backed by Qdrant vector database.\n *\n * Requires the `@qdrant/js-client-rest` package:\n * ```\n * npm install @qdrant/js-client-rest\n * ```\n */\nexport class QdrantRM extends Retriever {\n readonly #options: QdrantRMOptions;\n\n constructor(options: QdrantRMOptions) {\n super();\n this.#options = options;\n }\n\n async retrieve(query: string, k: number): Promise<string[]> {\n const { QdrantClient } = await import(\"@qdrant/js-client-rest\").catch(() => {\n throw new Error(\n \"The `@qdrant/js-client-rest` package is required.\\n\" +\n \"Install it with: npm install @qdrant/js-client-rest\",\n );\n });\n\n const client = new QdrantClient({\n url: this.#options.url ?? \"http://localhost:6333\",\n apiKey: this.#options.apiKey,\n });\n\n const embedding = await this.#options.embeddingFn(query);\n const textField = this.#options.textField ?? \"text\";\n\n const result = await client.search(this.#options.collectionName, {\n vector: embedding,\n limit: k,\n with_payload: [textField],\n });\n\n return result\n .map((hit: { payload?: Record<string, unknown> }) =>\n String(hit.payload?.[textField] ?? \"\"),\n )\n .filter(Boolean);\n }\n}\n","import { Retriever } from \"../Retriever.js\";\n\n/** Options for the FAISS retriever. */\nexport interface FaissRMOptions {\n /** Array of passage strings (the corpus). */\n passages: string[];\n /**\n * Pre-computed embeddings (one per passage, in the same order as `passages`).\n * When omitted, embeddings are computed lazily on the first `retrieve()` call\n * using `embeddingFn` and cached for subsequent calls.\n */\n embeddings?: number[][];\n /**\n * Function that maps a text string to a dense embedding vector.\n * Required for computing the query embedding (and passage embeddings when\n * `embeddings` is not pre-supplied).\n */\n embeddingFn: (text: string) => Promise<number[]>;\n}\n\n/**\n * In-process FAISS-style retriever using cosine similarity over dense\n * embeddings. No external server required.\n *\n * For large corpora, consider using the `faiss-node` package instead.\n */\nexport class FaissRM extends Retriever {\n readonly #passages: string[];\n readonly #precomputedEmbeddings: number[][] | undefined;\n readonly #embeddingFn: (text: string) => Promise<number[]>;\n /** Lazily populated passage-embedding cache. */\n #cachedEmbeddings: number[][] | undefined;\n\n constructor(options: FaissRMOptions) {\n super();\n this.#passages = options.passages;\n this.#precomputedEmbeddings = options.embeddings;\n this.#embeddingFn = options.embeddingFn;\n }\n\n async retrieve(query: string, k: number): Promise<string[]> {\n // Always use embeddingFn for the query so we get a meaningful embedding.\n const queryEmbedding = await this.#embeddingFn(query);\n\n // Passage embeddings: use pre-computed ones, or compute & cache lazily.\n if (!this.#cachedEmbeddings) {\n this.#cachedEmbeddings = this.#precomputedEmbeddings\n ? [...this.#precomputedEmbeddings]\n : await Promise.all(this.#passages.map((p) => this.#embeddingFn(p)));\n }\n\n const scored = this.#cachedEmbeddings.map((emb, i) => ({\n index: i,\n score: this.#cosineSimilarity(queryEmbedding, emb),\n }));\n\n scored.sort((a, b) => b.score - a.score);\n return scored.slice(0, k).map((s) => this.#passages[s.index] ?? \"\");\n }\n\n #cosineSimilarity(a: number[], b: number[]): number {\n let dot = 0;\n let normA = 0;\n let normB = 0;\n for (let i = 0; i < a.length; i++) {\n dot += (a[i] ?? 0) * (b[i] ?? 0);\n normA += (a[i] ?? 0) ** 2;\n normB += (b[i] ?? 0) ** 2;\n }\n return normA === 0 || normB === 0 ? 0 : dot / (Math.sqrt(normA) * Math.sqrt(normB));\n }\n}\n","import { Retriever } from \"../Retriever.js\";\n\n/** Options for the You.com retriever. */\nexport interface YouRMOptions {\n apiKey?: string;\n /** Number of snippets per web result to include (default: 1). */\n numWeb?: number;\n}\n\n/**\n * Retriever backed by the You.com search API.\n */\nexport class YouRM extends Retriever {\n readonly #options: YouRMOptions;\n\n constructor(options: YouRMOptions = {}) {\n super();\n this.#options = options;\n }\n\n async retrieve(query: string, k: number): Promise<string[]> {\n const apiKey = this.#options.apiKey ?? process.env[\"YDC_API_KEY\"];\n const url = new URL(\"https://api.ydc-index.io/search\");\n url.searchParams.set(\"query\", query);\n url.searchParams.set(\"num_web_results\", String(k));\n\n const response = await fetch(url.toString(), {\n headers: {\n ...(apiKey ? { \"X-API-Key\": apiKey } : {}),\n },\n });\n\n if (!response.ok) {\n throw new Error(`YouRM request failed: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as {\n hits?: Array<{ snippets?: string[] }>;\n };\n\n return (data.hits ?? [])\n .flatMap((hit) => hit.snippets ?? [])\n .slice(0, k);\n }\n}\n","import { Retriever } from \"../Retriever.js\";\n\n/**\n * In-memory retriever for unit testing.\n *\n * Returns passages that contain the query string (case-insensitive), or the\n * first `k` passages if no matches are found.\n */\nexport class MockRetriever extends Retriever {\n readonly #passages: string[];\n\n constructor(passages: string[]) {\n super();\n this.#passages = passages;\n }\n\n async retrieve(query: string, k: number): Promise<string[]> {\n const lower = query.toLowerCase();\n const matches = this.#passages.filter((p) => p.toLowerCase().includes(lower));\n const results = matches.length > 0 ? matches : this.#passages;\n return results.slice(0, k);\n }\n}\n","import type { Module } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\n\n/**\n * Abstract base class for all DSTsx optimizers (teleprompters).\n *\n * An optimizer takes a student program and a training set, then returns a new\n * (optimized) program with better prompts / few-shot examples.\n *\n * Mirrors `dspy.Teleprompter` in Python.\n */\nexport abstract class Optimizer {\n /**\n * Compile (optimize) a `student` program.\n *\n * @param student - The module to optimize (must not be mutated).\n * @param trainset - Examples used to generate / score candidates.\n * @param metric - Function that scores a prediction.\n * @returns - A new, optimized copy of `student`.\n */\n abstract compile(\n student: Module,\n trainset: Example[],\n metric: Metric,\n ): Promise<Module>;\n}\n","import { Optimizer } from \"./Optimizer.js\";\nimport type { Module } from \"../modules/index.js\";\nimport { Predict } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\n\n/**\n * The simplest optimizer — directly assigns labeled examples as `demos` on\n * every `Predict` sub-module without running the LM at all.\n *\n * Mirrors `dspy.LabeledFewShot` in Python.\n */\nexport class LabeledFewShot extends Optimizer {\n readonly #k: number;\n\n /**\n * @param k - Maximum number of demos to assign per predictor (default: 16).\n */\n constructor(k = 16) {\n super();\n this.#k = k;\n }\n\n async compile(student: Module, trainset: Example[], _metric: Metric): Promise<Module> {\n const optimized = student.clone();\n\n for (const [, predictor] of optimized.namedPredictors()) {\n if (predictor instanceof Predict) {\n predictor.demos = trainset.slice(0, this.#k);\n }\n }\n\n return optimized;\n }\n}\n","import { Optimizer } from \"./Optimizer.js\";\nimport type { Module } from \"../modules/index.js\";\nimport { Predict } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\n\n/** Options for BootstrapFewShot. */\nexport interface BootstrapFewShotOptions {\n /** Maximum number of bootstrapped demos per predictor (default: 4). */\n maxBootstrappedDemos?: number;\n /** Maximum number of labeled demos per predictor (default: 16). */\n maxLabeledDemos?: number;\n /** Optional teacher module; defaults to the student. */\n teacher?: Module;\n}\n\n/**\n * Collects successful execution traces by running the student (or a teacher)\n * on the training set and uses them as few-shot demonstrations.\n *\n * Mirrors `dspy.BootstrapFewShot` in Python.\n */\nexport class BootstrapFewShot extends Optimizer {\n readonly #opts: Required<BootstrapFewShotOptions>;\n\n constructor(options: BootstrapFewShotOptions = {}) {\n super();\n this.#opts = {\n maxBootstrappedDemos: options.maxBootstrappedDemos ?? 4,\n maxLabeledDemos: options.maxLabeledDemos ?? 16,\n teacher: options.teacher ?? (null as unknown as Module),\n };\n }\n\n async compile(student: Module, trainset: Example[], metric: Metric): Promise<Module> {\n const teacher = this.#opts.teacher ?? student;\n\n const demos: Example[] = [];\n\n for (const example of trainset) {\n if (demos.length >= this.#opts.maxBootstrappedDemos) break;\n\n try {\n const inputs = example.toDict() as Record<string, unknown>;\n const prediction = await (teacher.forward as (i: Record<string, unknown>) => Promise<Prediction>)(inputs);\n const raw = metric(example, prediction);\n const passed = typeof raw === \"boolean\" ? raw : raw > 0;\n if (passed) {\n demos.push(example.with(prediction.toDict() as Record<string, unknown>));\n }\n } catch {\n // Skip examples that throw (e.g. assertion failures).\n }\n }\n\n const optimized = student.clone();\n\n for (const [, predictor] of optimized.namedPredictors()) {\n if (predictor instanceof Predict) {\n predictor.demos = demos.slice(0, this.#opts.maxBootstrappedDemos);\n }\n }\n\n return optimized;\n }\n}\n","import type { Module } from \"../modules/index.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric, EvaluationResult, ExampleResult } from \"./types.js\";\n\n/** Options for the {@link evaluate} function. */\nexport interface EvaluateOptions {\n /**\n * Number of concurrent evaluations (default: 1 — sequential).\n * Set > 1 to parallelise calls.\n */\n numThreads?: number;\n /** When true, logs per-example results to the console. */\n displayProgress?: boolean;\n}\n\n/**\n * Evaluate a `program` (any {@link Module}) on a set of `examples` using a\n * `metric` function.\n *\n * Mirrors `dspy.Evaluate` in Python.\n *\n * @example\n * ```ts\n * const result = await evaluate(rag, devset, exactMatch(\"answer\"));\n * console.log(`Score: ${result.score.toFixed(2)}`);\n * ```\n */\nexport async function evaluate(\n program: Module,\n examples: Example[],\n metric: Metric,\n options: EvaluateOptions = {},\n): Promise<EvaluationResult> {\n const { numThreads = 1, displayProgress = false } = options;\n const results: ExampleResult[] = [];\n\n const runExample = async (example: Example): Promise<ExampleResult> => {\n const inputs = example.toDict() as Record<string, unknown>;\n let prediction: Prediction;\n try {\n prediction = await (program.forward as (inputs: Record<string, unknown>) => Promise<Prediction>)(inputs);\n } catch {\n prediction = new Prediction({});\n }\n const raw = metric(example, prediction);\n const score = typeof raw === \"boolean\" ? (raw ? 1 : 0) : raw;\n return { example, prediction, score, passed: score > 0 };\n };\n\n if (numThreads <= 1) {\n for (let i = 0; i < examples.length; i++) {\n const result = await runExample(examples[i]!);\n results.push(result);\n if (displayProgress) {\n console.log(`[${i + 1}/${examples.length}] score=${result.score.toFixed(2)}`);\n }\n }\n } else {\n // Process in batches of `numThreads`.\n for (let i = 0; i < examples.length; i += numThreads) {\n const batch = examples.slice(i, i + numThreads);\n const batchResults = await Promise.all(batch.map(runExample));\n results.push(...batchResults);\n if (displayProgress) {\n console.log(`[${i + batchResults.length}/${examples.length}]`);\n }\n }\n }\n\n const total = results.length;\n const numPassed = results.filter((r) => r.passed).length;\n const score = total > 0 ? results.reduce((s, r) => s + r.score, 0) / total : 0;\n\n return { score, numPassed, total, results };\n}\n","import { Prediction } from \"../primitives/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Exact Match\n// ---------------------------------------------------------------------------\n\n/**\n * Returns 1 if the prediction's `field` exactly matches the example's `field`\n * (case-insensitive by default), 0 otherwise.\n */\nexport function exactMatch(field = \"answer\", caseSensitive = false): Metric {\n return (example, prediction) => {\n const expected = String(example.get(field) ?? \"\");\n const actual = String(prediction.get(field) ?? \"\");\n return caseSensitive\n ? expected === actual\n : expected.toLowerCase() === actual.toLowerCase();\n };\n}\n\n// ---------------------------------------------------------------------------\n// F1 Score (token-level)\n// ---------------------------------------------------------------------------\n\n/**\n * Token-level F1 metric (word overlap), commonly used for SQuAD-style QA.\n */\nexport function f1(field = \"answer\"): Metric {\n return (example, prediction) => {\n const expected = tokenize(String(example.get(field) ?? \"\"));\n const actual = tokenize(String(prediction.get(field) ?? \"\"));\n\n if (expected.length === 0 && actual.length === 0) return 1;\n if (expected.length === 0 || actual.length === 0) return 0;\n\n const expectedSet = new Set(expected);\n const actualSet = new Set(actual);\n\n const common = [...expectedSet].filter((t) => actualSet.has(t));\n const precision = common.length / actual.length;\n const recall = common.length / expected.length;\n\n if (precision + recall === 0) return 0;\n return (2 * precision * recall) / (precision + recall);\n };\n}\n\n// ---------------------------------------------------------------------------\n// Pass@K\n// ---------------------------------------------------------------------------\n\n/**\n * Returns 1 if at least one of the top-`k` completions passes the `innerMetric`.\n */\nexport function passAtK(innerMetric: Metric, k: number): Metric {\n return (example, prediction, trace) => {\n for (let i = 0; i < Math.min(k, prediction.completions.length + 1); i++) {\n const candidate =\n i === 0\n ? prediction\n : buildPrediction(prediction.completions[i - 1] ?? {});\n const result = innerMetric(example, candidate, trace);\n if (result === true || (typeof result === \"number\" && result > 0)) return 1;\n }\n return 0;\n };\n}\n\n// ---------------------------------------------------------------------------\n// BLEU (simplified 1-gram / 2-gram)\n// ---------------------------------------------------------------------------\n\n/**\n * Simplified BLEU score (1-gram + 2-gram precision) for a single field.\n */\nexport function bleu(field = \"answer\"): Metric {\n return (example, prediction) => {\n const reference = tokenize(String(example.get(field) ?? \"\"));\n const hypothesis = tokenize(String(prediction.get(field) ?? \"\"));\n\n if (hypothesis.length === 0) return 0;\n\n const refSet = new Set(reference);\n const uni = hypothesis.filter((t) => refSet.has(t)).length / hypothesis.length;\n\n if (hypothesis.length < 2) return uni;\n const refBigrams = new Set(\n reference.slice(0, -1).map((t, i) => `${t} ${reference[i + 1] ?? \"\"}`),\n );\n const hypBigrams = hypothesis.slice(0, -1).map((t, i) => `${t} ${hypothesis[i + 1] ?? \"\"}`);\n const bi = hypBigrams.filter((b) => refBigrams.has(b)).length / hypBigrams.length;\n\n return Math.sqrt(uni * bi);\n };\n}\n\n// ---------------------------------------------------------------------------\n// ROUGE-L (Longest Common Subsequence)\n// ---------------------------------------------------------------------------\n\n/**\n * ROUGE-L metric (LCS-based recall/precision/F1) for a single field.\n */\nexport function rouge(field = \"answer\"): Metric {\n return (example, prediction) => {\n const reference = tokenize(String(example.get(field) ?? \"\"));\n const hypothesis = tokenize(String(prediction.get(field) ?? \"\"));\n\n if (reference.length === 0 && hypothesis.length === 0) return 1;\n if (reference.length === 0 || hypothesis.length === 0) return 0;\n\n const lcsLen = lcs(reference, hypothesis);\n const precision = lcsLen / hypothesis.length;\n const recall = lcsLen / reference.length;\n\n if (precision + recall === 0) return 0;\n return (2 * precision * recall) / (precision + recall);\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction tokenize(text: string): string[] {\n return text.toLowerCase().replace(/[^\\w\\s]/g, \"\").split(/\\s+/).filter(Boolean);\n}\n\nfunction lcs(a: string[], b: string[]): number {\n const m = a.length;\n const n = b.length;\n const dp = Array.from({ length: m + 1 }, () => new Array<number>(n + 1).fill(0));\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i]![j] = a[i - 1] === b[j - 1] ? dp[i - 1]![j - 1]! + 1 : Math.max(dp[i - 1]![j]!, dp[i]![j - 1]!);\n }\n }\n return dp[m]![n]!;\n}\n\nfunction buildPrediction(data: Record<string, unknown>): Prediction {\n return new Prediction(data);\n}\n","import { BootstrapFewShot, type BootstrapFewShotOptions } from \"./BootstrapFewShot.js\";\nimport { evaluate } from \"../evaluate/index.js\";\nimport type { Module } from \"../modules/index.js\";\nimport { Predict } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\n\n/** Options for BootstrapFewShotWithRandomSearch. */\nexport interface BootstrapFewShotWithRandomSearchOptions extends BootstrapFewShotOptions {\n /** Number of candidate demo subsets to evaluate (default: 8). */\n numCandidatePrograms?: number;\n /** Held-out validation set. If omitted, the trainset is used for scoring. */\n valset?: Example[];\n}\n\n/**\n * Extends {@link BootstrapFewShot} by trying multiple random demo subsets and\n * selecting the combination with the highest validation score.\n *\n * Mirrors `dspy.BootstrapFewShotWithRandomSearch` in Python.\n */\nexport class BootstrapFewShotWithRandomSearch extends BootstrapFewShot {\n readonly #numCandidates: number;\n readonly #valset: Example[] | undefined;\n\n constructor(options: BootstrapFewShotWithRandomSearchOptions = {}) {\n super(options);\n this.#numCandidates = options.numCandidatePrograms ?? 8;\n this.#valset = options.valset;\n }\n\n override async compile(student: Module, trainset: Example[], metric: Metric): Promise<Module> {\n // First collect the bootstrapped demos via the parent class.\n const bootstrapped = await super.compile(student, trainset, metric);\n\n const allDemos: Example[] = [];\n for (const [, pred] of bootstrapped.namedPredictors()) {\n if (pred instanceof Predict) {\n allDemos.push(...pred.demos);\n }\n }\n\n if (allDemos.length === 0) return bootstrapped;\n\n const evalSet = this.#valset ?? trainset;\n let bestScore = -Infinity;\n let bestModule: Module = bootstrapped;\n\n for (let i = 0; i < this.#numCandidates; i++) {\n const candidate = bootstrapped.clone();\n\n const shuffle = [...allDemos].sort(() => Math.random() - 0.5);\n const k = Math.floor(Math.random() * allDemos.length) + 1;\n\n for (const [, pred] of candidate.namedPredictors()) {\n if (pred instanceof Predict) {\n pred.demos = shuffle.slice(0, k);\n }\n }\n\n const { score } = await evaluate(candidate, evalSet, metric);\n if (score > bestScore) {\n bestScore = score;\n bestModule = candidate;\n }\n }\n\n return bestModule;\n }\n}\n","import { BootstrapFewShot } from \"./BootstrapFewShot.js\";\nimport { Predict } from \"../modules/index.js\";\nimport type { Module } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport { Prediction } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\n\nexport interface BootstrapFewShotWithOptunaOptions {\n maxBootstrappedDemos?: number;\n maxLabeledDemos?: number;\n /** Number of TPE trials (default: 20). */\n numTrials?: number;\n valset?: Example[];\n}\n\n/**\n * Bayesian optimizer using a simplified TPE (Tree-structured Parzen Estimator).\n *\n * Extends BootstrapFewShot: first collects candidate demos via the parent,\n * then runs `numTrials` iterations sampling demo subsets using TPE to find\n * the best-scoring configuration.\n */\nexport class BootstrapFewShotWithOptuna extends BootstrapFewShot {\n readonly #numTrials: number;\n readonly #valset: Example[] | undefined;\n\n constructor(options: BootstrapFewShotWithOptunaOptions = {}) {\n super(options);\n this.#numTrials = options.numTrials ?? 20;\n this.#valset = options.valset;\n }\n\n override async compile(\n student: Module,\n trainset: Example[],\n metric: Metric,\n ): Promise<Module> {\n // Step 1: collect bootstrapped demos via parent\n const bootstrapped = await super.compile(student, trainset, metric);\n\n // Gather all demos from the bootstrapped module\n const allDemos: Example[] = [];\n for (const [, predictor] of bootstrapped.namedPredictors()) {\n if (predictor instanceof Predict) {\n allDemos.push(...predictor.demos);\n }\n }\n\n if (allDemos.length === 0) {\n return bootstrapped;\n }\n\n const evalSet = this.#valset ?? trainset;\n const maxDemos = Math.max(1, allDemos.length);\n\n /** Fraction of trials to consider \"good\" in TPE sampling. */\n const TOP_TRIALS_FRACTION = 0.25;\n /** Probability of sampling from the \"good\" trials pool vs random. */\n const GOOD_TRIAL_SAMPLING_PROBABILITY = 0.7;\n\n interface Trial {\n indices: number[];\n score: number;\n }\n const trials: Trial[] = [];\n\n const evaluate = async (candidate: Module): Promise<number> => {\n let score = 0;\n for (const example of evalSet) {\n try {\n const inputs = example.toDict() as Record<string, unknown>;\n const prediction = await (\n candidate.forward as (i: Record<string, unknown>) => Promise<Prediction>\n )(inputs);\n const raw = metric(example, prediction);\n score += typeof raw === \"boolean\" ? (raw ? 1 : 0) : raw;\n } catch {\n // skip failed examples\n }\n }\n return evalSet.length > 0 ? score / evalSet.length : 0;\n };\n\n const sampleIndices = (\n goodTrials: Trial[],\n badTrials: Trial[],\n n: number,\n ): number[] => {\n const useGood = goodTrials.length > 0 && Math.random() < GOOD_TRIAL_SAMPLING_PROBABILITY;\n const pool =\n useGood ? goodTrials : badTrials.length > 0 ? badTrials : null;\n\n if (pool !== null && pool.length > 0) {\n const base = pool[Math.floor(Math.random() * pool.length)]!;\n const result = new Set(base.indices);\n if (Math.random() < 0.5 && result.size < maxDemos) {\n result.add(Math.floor(Math.random() * maxDemos));\n } else if (result.size > 1) {\n const arr = [...result];\n result.delete(arr[Math.floor(Math.random() * arr.length)]!);\n }\n return [...result].slice(0, n);\n }\n\n // Random sample\n const indices = Array.from({ length: maxDemos }, (_, i) => i);\n return indices.sort(() => Math.random() - 0.5).slice(0, Math.min(n, maxDemos));\n };\n\n let bestScore = -Infinity;\n let bestModule = bootstrapped;\n\n for (let t = 0; t < this.#numTrials; t++) {\n const sortedTrials = [...trials].sort((a, b) => b.score - a.score);\n const topK = Math.max(1, Math.floor(sortedTrials.length * TOP_TRIALS_FRACTION));\n const goodTrials = sortedTrials.slice(0, topK);\n const badTrials = sortedTrials.slice(topK);\n\n // Use 50% of all available demos per trial. This is the starting\n // point for TPE exploration; mutations in sampleIndices() may grow or\n // shrink the subset by ±1 around this baseline.\n const numDemos = Math.max(1, Math.floor(maxDemos * 0.5));\n const indices = sampleIndices(goodTrials, badTrials, numDemos);\n const selectedDemos = indices\n .map((i) => allDemos[i])\n .filter((d): d is Example => d !== undefined);\n\n const candidate = bootstrapped.clone();\n for (const [, predictor] of candidate.namedPredictors()) {\n if (predictor instanceof Predict) {\n predictor.demos = selectedDemos;\n }\n }\n\n const score = await evaluate(candidate);\n trials.push({ indices, score });\n\n if (score > bestScore) {\n bestScore = score;\n bestModule = candidate;\n }\n }\n\n return bestModule;\n }\n}\n","import { Optimizer } from \"./Optimizer.js\";\nimport { Predict } from \"../modules/index.js\";\nimport type { Module } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\nimport { evaluate } from \"../evaluate/index.js\";\nimport { settings } from \"../settings/index.js\";\n\n/** Options for COPRO. */\nexport interface COPROOptions {\n /** Number of instruction candidates to generate per predictor (default: 5). */\n breadth?: number;\n /** Number of refinement rounds (default: 3). */\n depth?: number;\n}\n\n/**\n * Collaborative Prompt Optimizer (COPRO) — uses the LM to propose improved\n * instructions for each `Predict` sub-module and selects the best via\n * metric evaluation.\n *\n * Mirrors `dspy.COPRO` in Python.\n */\nexport class COPRO extends Optimizer {\n readonly #breadth: number;\n readonly #depth: number;\n\n constructor(options: COPROOptions = {}) {\n super();\n this.#breadth = options.breadth ?? 5;\n this.#depth = options.depth ?? 3;\n }\n\n async compile(student: Module, trainset: Example[], metric: Metric): Promise<Module> {\n const lm = settings.lm;\n if (!lm) throw new Error(\"COPRO requires a configured LM.\");\n\n let best = student;\n let bestScore = (await evaluate(student, trainset.slice(0, 10), metric)).score;\n\n for (let round = 0; round < this.#depth; round++) {\n for (const [name, predictor] of best.namedPredictors()) {\n if (!(predictor instanceof Predict)) continue;\n\n const candidates: string[] = [];\n for (let i = 0; i < this.#breadth; i++) {\n const prompt = this.#buildInstructionPrompt(predictor.instructions ?? \"\", name);\n const resp = await lm.call(prompt, { temperature: 0.9 });\n candidates.push(resp.text.trim());\n }\n\n for (const candidate of candidates) {\n const clone = best.clone();\n\n for (const [n, p] of clone.namedPredictors()) {\n if (n === name && p instanceof Predict) {\n p.instructions = candidate;\n }\n }\n\n const { score } = await evaluate(clone, trainset.slice(0, 10), metric);\n if (score > bestScore) {\n bestScore = score;\n best = clone;\n }\n }\n }\n }\n\n return best;\n }\n\n #buildInstructionPrompt(currentInstruction: string, fieldName: string): string {\n return (\n `You are an expert prompt engineer.\\n` +\n `Current instruction for the \"${fieldName}\" field: \"${currentInstruction}\"\\n\\n` +\n `Write an improved, concise instruction for this field that will produce ` +\n `better outputs from a language model. Output only the instruction text.`\n );\n }\n}\n","import { Optimizer } from \"./Optimizer.js\";\nimport { BootstrapFewShotWithRandomSearch } from \"./BootstrapFewShotWithRandomSearch.js\";\nimport { COPRO } from \"./COPRO.js\";\nimport type { Module } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\n\n/** Options for MIPRO. */\nexport interface MIPROOptions {\n /** Number of instruction candidates per predictor (default: 5). */\n numCandidates?: number;\n /** Temperature for instruction generation (default: 0.9). */\n initTemperature?: number;\n /** Number of random bootstrap candidate programs to evaluate (default: 8). */\n numCandidatePrograms?: number;\n /** Emit verbose progress logs (default: false). */\n verbose?: boolean;\n}\n\n/**\n * Multi-stage Instruction Prompt Optimizer (MIPRO) — combines COPRO-style\n * instruction proposal with BootstrapFewShotWithRandomSearch to jointly\n * optimize instructions and demonstrations.\n *\n * Mirrors `dspy.MIPRO` in Python.\n */\nexport class MIPRO extends Optimizer {\n readonly #opts: Required<MIPROOptions>;\n\n constructor(options: MIPROOptions = {}) {\n super();\n this.#opts = {\n numCandidates: options.numCandidates ?? 5,\n initTemperature: options.initTemperature ?? 0.9,\n numCandidatePrograms: options.numCandidatePrograms ?? 8,\n verbose: options.verbose ?? false,\n };\n }\n\n async compile(student: Module, trainset: Example[], metric: Metric): Promise<Module> {\n if (this.#opts.verbose) console.log(\"[MIPRO] Phase 1: Instruction optimization (COPRO)\");\n\n const copro = new COPRO({ breadth: this.#opts.numCandidates, depth: 2 });\n const instructionOptimized = await copro.compile(student, trainset, metric);\n\n if (this.#opts.verbose) console.log(\"[MIPRO] Phase 2: Demo optimization (BootstrapFewShotWithRandomSearch)\");\n\n const bootstrap = new BootstrapFewShotWithRandomSearch({\n numCandidatePrograms: this.#opts.numCandidatePrograms,\n });\n return bootstrap.compile(instructionOptimized, trainset, metric);\n }\n}\n","import { Optimizer } from \"./Optimizer.js\";\nimport { Predict } from \"../modules/index.js\";\nimport type { Module } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\n\n/** Options for KNNFewShot. */\nexport interface KNNFewShotOptions {\n /** Number of nearest neighbors to use as demos (default: 3). */\n k?: number;\n /**\n * Embedding function that maps a text string to a dense vector.\n * Required for computing similarity between examples.\n */\n embeddingFn: (text: string) => Promise<number[]>;\n /**\n * Which field of each example to embed for similarity comparison\n * (default: first input field of the signature).\n */\n keyField?: string;\n}\n\n/**\n * Dynamic few-shot optimizer that selects demonstrations at inference time\n * using k-nearest-neighbour search over the training set.\n *\n * Unlike static few-shot optimizers this one injects demos into a\n * `Predict.forward` call by wrapping each predictor at compile time.\n *\n * Mirrors `dspy.KNNFewShot` in Python.\n */\nexport class KNNFewShot extends Optimizer {\n readonly #opts: Required<KNNFewShotOptions>;\n\n constructor(options: KNNFewShotOptions) {\n super();\n this.#opts = {\n k: options.k ?? 3,\n embeddingFn: options.embeddingFn,\n keyField: options.keyField ?? \"\",\n };\n }\n\n async compile(student: Module, trainset: Example[], _metric: Metric): Promise<Module> {\n const embeddingFn = this.#opts.embeddingFn;\n const k = this.#opts.k;\n\n // Pre-compute embeddings for all training examples.\n const trainEmbeddings = await Promise.all(\n trainset.map(async (ex) => {\n const key = this.#opts.keyField\n ? String(ex.get(this.#opts.keyField) ?? \"\")\n : Object.values(ex.toDict()).join(\" \");\n return { ex, embedding: await embeddingFn(key) };\n }),\n );\n\n const optimized = student.clone();\n\n // Wrap each Predict.forward to inject KNN demos at call time.\n // Because `optimized` is a deep clone, wrapping forward here does not\n // affect the original `student`.\n for (const [, predictor] of optimized.namedPredictors()) {\n if (!(predictor instanceof Predict)) continue;\n\n const originalForward = predictor.forward.bind(predictor);\n\n predictor.forward = async (inputs: Record<string, unknown>) => {\n const queryText = Object.values(inputs).join(\" \");\n const queryEmb = await embeddingFn(queryText);\n\n const scored = trainEmbeddings.map(({ ex, embedding }) => ({\n ex,\n score: cosineSimilarity(queryEmb, embedding),\n }));\n scored.sort((a, b) => b.score - a.score);\n predictor.demos = scored.slice(0, k).map((s) => s.ex);\n\n return originalForward(inputs);\n };\n }\n\n return optimized;\n }\n}\n\nfunction cosineSimilarity(a: number[], b: number[]): number {\n let dot = 0;\n let normA = 0;\n let normB = 0;\n for (let i = 0; i < a.length; i++) {\n dot += (a[i] ?? 0) * (b[i] ?? 0);\n normA += (a[i] ?? 0) ** 2;\n normB += (b[i] ?? 0) ** 2;\n }\n return normA === 0 || normB === 0 ? 0 : dot / (Math.sqrt(normA) * Math.sqrt(normB));\n}\n","import { Optimizer } from \"./Optimizer.js\";\nimport { evaluate } from \"../evaluate/index.js\";\nimport type { Module } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\nimport type { Prediction } from \"../primitives/index.js\";\n\n/** Options for the Ensemble optimizer. */\nexport interface EnsembleOptimizerOptions {\n /**\n * Custom function to combine multiple predictions into one.\n * Defaults to majority vote on the first output field.\n */\n reduceFunc?: (predictions: Prediction[]) => Prediction;\n}\n\n/**\n * Combines multiple optimized programs into a single ensemble module.\n *\n * Mirrors `dspy.Ensemble` (optimizer version) in Python.\n */\nexport class EnsembleOptimizer extends Optimizer {\n readonly #reduceFunc: ((predictions: Prediction[]) => Prediction) | undefined;\n\n constructor(options: EnsembleOptimizerOptions = {}) {\n super();\n this.#reduceFunc = options.reduceFunc;\n }\n\n async compile(student: Module, _trainset: Example[], _metric: Metric): Promise<Module> {\n\n const reduceFunc = this.#reduceFunc;\n\n // Return a thin wrapper module that runs `student` (treated as the\n // representative member). Callers typically build their own ensemble by\n // passing multiple programs to the `Ensemble` module directly.\n const wrapper: Module = {\n namedPredictors: student.namedPredictors.bind(student),\n dump: student.dump.bind(student),\n load: student.load.bind(student),\n async forward(...args: unknown[]) {\n const pred = await (student.forward as (...a: unknown[]) => Promise<Prediction>)(\n ...args,\n );\n return reduceFunc ? reduceFunc([pred]) : pred;\n },\n } as unknown as Module;\n\n return wrapper;\n }\n}\n","import { writeFileSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { Optimizer } from \"./Optimizer.js\";\nimport { BootstrapFewShot } from \"./BootstrapFewShot.js\";\nimport { Predict } from \"../modules/index.js\";\nimport type { Module } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\n\n/** Output format for the exported fine-tuning data. */\nexport type FinetuneFormat = \"openai\" | \"generic\";\n\n/** Options for BootstrapFinetune. */\nexport interface BootstrapFinetuneOptions {\n /** Path to write the JSONL fine-tuning file (default: \"./finetune_data.jsonl\"). */\n exportPath?: string | undefined;\n /** Format of the exported data (default: \"openai\"). */\n format?: FinetuneFormat | undefined;\n /** Bootstrap options passed to BootstrapFewShot internally. */\n maxBootstrappedDemos?: number | undefined;\n}\n\n/**\n * Collects LM traces via BootstrapFewShot and exports them as a JSONL file\n * suitable for fine-tuning.\n *\n * - `\"openai\"` format: `{ messages: [{role, content}, ...] }` per line\n * - `\"generic\"` format: `{ prompt: string, completion: string }` per line\n *\n * @example\n * ```ts\n * const optimizer = new BootstrapFinetune({\n * exportPath: \"./finetune_data.jsonl\",\n * format: \"openai\",\n * });\n * const recipe = await optimizer.compile(program, trainset, metric);\n * ```\n */\nexport class BootstrapFinetune extends Optimizer {\n readonly #exportPath: string;\n readonly #format: FinetuneFormat;\n readonly #maxBootstrappedDemos: number;\n readonly #bootstrap: BootstrapFewShot;\n\n constructor(options: BootstrapFinetuneOptions = {}) {\n super();\n this.#exportPath = options.exportPath ?? \"./finetune_data.jsonl\";\n this.#format = options.format ?? \"openai\";\n this.#maxBootstrappedDemos = options.maxBootstrappedDemos ?? 4;\n this.#bootstrap = new BootstrapFewShot({\n maxBootstrappedDemos: this.#maxBootstrappedDemos,\n });\n }\n\n override async compile(student: Module, trainset: Example[], metric: Metric): Promise<Module> {\n const compiled = await this.#bootstrap.compile(student, trainset, metric);\n\n const records: string[] = [];\n for (const [, predictor] of compiled.namedPredictors()) {\n if (predictor instanceof Predict) {\n for (const demo of predictor.demos) {\n const dict = demo.toDict() as Record<string, unknown>;\n const inputFields = [...predictor.signature.inputs.keys()];\n const outputFields = [...predictor.signature.outputs.keys()];\n\n const inputStr = inputFields.map((k) => `${k}: ${String(dict[k] ?? \"\")}`).join(\"\\n\");\n const outputStr = outputFields.map((k) => `${k}: ${String(dict[k] ?? \"\")}`).join(\"\\n\");\n\n if (this.#format === \"openai\") {\n records.push(\n JSON.stringify({\n messages: [\n { role: \"user\", content: inputStr },\n { role: \"assistant\", content: outputStr },\n ],\n }),\n );\n } else {\n records.push(JSON.stringify({ prompt: inputStr, completion: outputStr }));\n }\n }\n }\n }\n\n const dir = dirname(this.#exportPath);\n mkdirSync(dir, { recursive: true });\n writeFileSync(this.#exportPath, records.join(\"\\n\"), \"utf8\");\n\n return compiled;\n }\n}\n","import { Optimizer } from \"./Optimizer.js\";\nimport { BootstrapFewShot } from \"./BootstrapFewShot.js\";\nimport type { Module } from \"../modules/index.js\";\nimport { Predict } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\nimport { evaluate } from \"../evaluate/index.js\";\nimport { settings } from \"../settings/index.js\";\n\n/** Options for GRPO. */\nexport interface GRPOOptions {\n /** Number of optimization steps (default: 20). */\n numSteps?: number | undefined;\n /** Number of candidates per group per step (default: 8). */\n groupSize?: number | undefined;\n /** Sampling temperature for candidate generation (default: 1.0). */\n temperature?: number | undefined;\n /** Max labeled demos (default: 16). */\n maxLabeledDemos?: number | undefined;\n}\n\n/**\n * Group Relative Policy Optimization optimizer.\n *\n * Mirrors `dspy.GRPO` in Python. Runs `numSteps` iterations where each step:\n * 1. Samples `groupSize` candidate instruction variants via the LM.\n * 2. Evaluates each against the training set.\n * 3. Updates the best instruction using group-relative scoring.\n *\n * Pure TypeScript — no external dependencies beyond the configured LM.\n */\nexport class GRPO extends Optimizer {\n readonly #numSteps: number;\n readonly #groupSize: number;\n readonly #temperature: number;\n readonly #maxLabeledDemos: number;\n\n constructor(options: GRPOOptions = {}) {\n super();\n this.#numSteps = options.numSteps ?? 20;\n this.#groupSize = options.groupSize ?? 8;\n this.#temperature = options.temperature ?? 1.0;\n this.#maxLabeledDemos = options.maxLabeledDemos ?? 16;\n }\n\n override async compile(student: Module, trainset: Example[], metric: Metric): Promise<Module> {\n const lm = settings.lm;\n if (!lm) throw new Error(\"GRPO requires a configured LM.\");\n\n const bootstrap = new BootstrapFewShot({\n maxBootstrappedDemos: this.#maxLabeledDemos,\n });\n let best = await bootstrap.compile(student, trainset, metric);\n\n const evalSet = trainset.slice(0, Math.min(10, trainset.length));\n let bestScore = (await evaluate(best, evalSet, metric)).score;\n\n for (let step = 0; step < this.#numSteps; step++) {\n const candidates: { module: Module; score: number }[] = [];\n\n for (let g = 0; g < this.#groupSize; g++) {\n const candidate = best.clone();\n\n for (const [, predictor] of candidate.namedPredictors()) {\n if (predictor instanceof Predict) {\n const currentInstr = predictor.instructions ?? \"\";\n const prompt =\n `You are an expert prompt engineer.\\n` +\n `Current instruction: \"${currentInstr}\"\\n\\n` +\n `Write an improved instruction for a language model. Output only the instruction text.`;\n const resp = await lm.call(prompt, { temperature: this.#temperature });\n predictor.instructions = resp.text.trim();\n }\n }\n\n const { score } = await evaluate(candidate, evalSet, metric);\n candidates.push({ module: candidate, score });\n }\n\n const scores = candidates.map((c) => c.score);\n const mean = scores.reduce((a, b) => a + b, 0) / scores.length;\n const std =\n Math.sqrt(scores.reduce((a, b) => a + (b - mean) ** 2, 0) / scores.length) || 1;\n const advantages = scores.map((s) => (s - mean) / std);\n\n const bestIdx = advantages.indexOf(Math.max(...advantages));\n const topScore = candidates[bestIdx]?.score ?? 0;\n if (topScore > bestScore) {\n bestScore = topScore;\n best = candidates[bestIdx]!.module;\n }\n }\n\n return best;\n }\n}\n","import { Optimizer } from \"./Optimizer.js\";\nimport { BootstrapFewShot } from \"./BootstrapFewShot.js\";\nimport { Predict } from \"../modules/index.js\";\nimport type { Module } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\nimport { evaluate } from \"../evaluate/index.js\";\n\n/** Options for SIMBA. */\nexport interface SIMBAOptions {\n /** Number of optimization iterations (default: 10). */\n numIter?: number | undefined;\n /** Mini-batch size for each evaluation (default: 8). */\n batchSize?: number | undefined;\n /** Max bootstrapped demos (default: 4). */\n maxBootstrappedDemos?: number | undefined;\n}\n\n/**\n * SIMBA (Stochastic Introspective Mini-Batch Ascent) optimizer.\n *\n * A lightweight stochastic optimizer that:\n * 1. Selects a random mini-batch from the training set each iteration.\n * 2. Proposes a candidate (via demo subset sampling).\n * 3. Accepts the candidate if it improves on the current best.\n * 4. Returns the overall best module found.\n */\nexport class SIMBA extends Optimizer {\n readonly #numIter: number;\n readonly #batchSize: number;\n readonly #maxBootstrappedDemos: number;\n\n constructor(options: SIMBAOptions = {}) {\n super();\n this.#numIter = options.numIter ?? 10;\n this.#batchSize = options.batchSize ?? 8;\n this.#maxBootstrappedDemos = options.maxBootstrappedDemos ?? 4;\n }\n\n override async compile(student: Module, trainset: Example[], metric: Metric): Promise<Module> {\n const bootstrap = new BootstrapFewShot({\n maxBootstrappedDemos: this.#maxBootstrappedDemos,\n });\n let best = await bootstrap.compile(student, trainset, metric);\n\n const evalBatch = trainset.slice(0, Math.min(this.#batchSize, trainset.length));\n let bestScore = (await evaluate(best, evalBatch, metric)).score;\n\n for (let iter = 0; iter < this.#numIter; iter++) {\n // Fisher-Yates shuffle for unbiased sampling\n const shuffled = [...trainset];\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [shuffled[i], shuffled[j]] = [shuffled[j]!, shuffled[i]!];\n }\n const batch = shuffled.slice(0, Math.min(this.#batchSize, shuffled.length));\n\n const candidate = best.clone();\n for (const [, predictor] of candidate.namedPredictors()) {\n if (predictor instanceof Predict && predictor.demos.length > 1) {\n const dropIdx = Math.floor(Math.random() * predictor.demos.length);\n predictor.demos = predictor.demos.filter((_, i) => i !== dropIdx);\n }\n }\n\n const { score } = await evaluate(candidate, batch, metric);\n if (score >= bestScore) {\n bestScore = score;\n best = candidate;\n }\n }\n\n return best;\n }\n}\n","import { Optimizer } from \"./Optimizer.js\";\nimport { Predict } from \"../modules/index.js\";\nimport type { Module } from \"../modules/index.js\";\nimport type { Example } from \"../primitives/index.js\";\nimport type { Metric } from \"../evaluate/index.js\";\nimport { evaluate } from \"../evaluate/index.js\";\nimport { settings } from \"../settings/index.js\";\n\n/** Options for AvatarOptimizer. */\nexport interface AvatarOptimizerOptions {\n /** Number of avatar candidates to try per predictor (default: 4). */\n numAvatars?: number | undefined;\n /** Max labeled demos (default: 8). */\n maxLabeledDemos?: number | undefined;\n}\n\n/**\n * AvatarOptimizer iteratively proposes and evaluates \"avatar\" role descriptions\n * (persona prefixes) for each Predict module.\n *\n * Mirrors `dspy.AvatarOptimizer` in Python.\n *\n * For each predictor, proposes `numAvatars` different role/persona descriptions\n * and selects the one that scores highest on the training set.\n */\nexport class AvatarOptimizer extends Optimizer {\n readonly #numAvatars: number;\n readonly #maxLabeledDemos: number;\n\n constructor(options: AvatarOptimizerOptions = {}) {\n super();\n this.#numAvatars = options.numAvatars ?? 4;\n this.#maxLabeledDemos = options.maxLabeledDemos ?? 8;\n }\n\n override async compile(student: Module, trainset: Example[], metric: Metric): Promise<Module> {\n const lm = settings.lm;\n if (!lm) throw new Error(\"AvatarOptimizer requires a configured LM.\");\n\n let best = student.clone();\n const evalSet = trainset.slice(0, Math.min(this.#maxLabeledDemos, trainset.length));\n let bestScore = (await evaluate(best, evalSet, metric)).score;\n\n for (const [name, predictor] of best.namedPredictors()) {\n if (!(predictor instanceof Predict)) continue;\n\n const avatarCandidates: string[] = [];\n for (let i = 0; i < this.#numAvatars; i++) {\n const prompt =\n `You are an expert at designing AI personas.\\n` +\n `Task field: \"${name}\"\\n` +\n `Current instruction: \"${predictor.instructions ?? \"\"}\"\\n\\n` +\n `Write a concise role/persona prefix (1-2 sentences) for an AI assistant ` +\n `that excels at this task. Output only the persona description.`;\n const resp = await lm.call(prompt, { temperature: 0.9 });\n avatarCandidates.push(resp.text.trim());\n }\n\n for (const avatar of avatarCandidates) {\n const clone = best.clone();\n for (const [n, p] of clone.namedPredictors()) {\n if (n === name && p instanceof Predict) {\n const base = p.instructions ?? \"\";\n p.instructions = `${avatar}\\n\\n${base}`.trim();\n }\n }\n const { score } = await evaluate(clone, evalSet, metric);\n if (score > bestScore) {\n bestScore = score;\n best = clone;\n }\n }\n }\n\n return best;\n }\n}\n","import type { Tool } from \"../modules/ReAct.js\";\n\nexport interface MCPAdapterOptions {\n serverUrl?: string;\n tools?: Array<{\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n }>;\n callHandler?: (name: string, args: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * Wraps MCP server tools as DSTsx Tool objects.\n *\n * When `tools` + `callHandler` are provided, no network connection is needed.\n * A live MCP connection (via `serverUrl`) requires the\n * `@modelcontextprotocol/sdk` package to be installed.\n */\nexport class MCPToolAdapter {\n readonly #options: MCPAdapterOptions;\n #tools: Tool[] | undefined;\n\n constructor(options: MCPAdapterOptions = {}) {\n this.#options = options;\n }\n\n async getTools(): Promise<Tool[]> {\n if (this.#tools) return this.#tools;\n\n if (this.#options.tools && this.#options.callHandler) {\n const callHandler = this.#options.callHandler;\n this.#tools = this.#options.tools.map((t) => ({\n name: t.name,\n description: t.description,\n fn: async (args: string) => {\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(args) as Record<string, unknown>;\n } catch {\n parsed = { input: args };\n }\n const result = await callHandler(t.name, parsed);\n return typeof result === \"string\" ? result : JSON.stringify(result);\n },\n }));\n return this.#tools;\n }\n\n await import(\"@modelcontextprotocol/sdk/client/index.js\").catch(() => {\n throw new Error(\n \"The `@modelcontextprotocol/sdk` package is required for MCPToolAdapter.\\n\" +\n \"Install it with: npm install @modelcontextprotocol/sdk\",\n );\n });\n\n throw new Error(\n \"Live MCP connection not yet implemented. Use tools+callHandler for now.\",\n );\n }\n}\n","import type { Module } from \"../modules/index.js\";\nimport { Prediction } from \"../primitives/index.js\";\n\nexport interface MCPTool {\n name: string;\n description: string;\n inputSchema: {\n type: \"object\";\n properties: Record<string, { type: string; description?: string }>;\n required?: string[];\n };\n handler: (inputs: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * Exposes DSTsx modules as MCP-compatible tool definitions.\n *\n * Registered modules can be called via `callTool()`. To create a live stdio\n * server the `@modelcontextprotocol/sdk` package must be installed.\n */\nexport class DSTsxMCPServer {\n readonly #tools: Map<string, MCPTool> = new Map();\n\n registerModule(\n name: string,\n description: string,\n module: Module,\n inputFields: string[],\n ): this {\n const properties: Record<string, { type: string; description?: string }> = {};\n for (const field of inputFields) {\n properties[field] = { type: \"string\" };\n }\n this.#tools.set(name, {\n name,\n description,\n inputSchema: { type: \"object\", properties, required: inputFields },\n handler: async (inputs) => {\n const result = await (\n module.forward as (i: Record<string, unknown>) => Promise<Prediction>\n )(inputs);\n return result.toJSON();\n },\n });\n return this;\n }\n\n getToolDefinitions(): MCPTool[] {\n return [...this.#tools.values()];\n }\n\n async callTool(name: string, inputs: Record<string, unknown>): Promise<unknown> {\n const tool = this.#tools.get(name);\n if (!tool) throw new Error(`Tool \"${name}\" not found.`);\n return tool.handler(inputs);\n }\n\n async createStdioServer(): Promise<unknown> {\n await import(\"@modelcontextprotocol/sdk/server/index.js\").catch(() => {\n throw new Error(\n \"The `@modelcontextprotocol/sdk` package is required.\\n\" +\n \"Install it with: npm install @modelcontextprotocol/sdk\",\n );\n });\n throw new Error(\n \"createStdioServer requires @modelcontextprotocol/sdk to be installed.\",\n );\n }\n}\n","/** Event types emitted during optimization. */\nexport interface TrackerEvent {\n /** Type of event. */\n type: \"step\" | \"trial\" | \"best\" | \"done\";\n /** Current step number. */\n step?: number | undefined;\n /** Score at this event. */\n score?: number | undefined;\n /** Additional metadata. */\n metadata?: Record<string, unknown> | undefined;\n}\n\n/**\n * Abstract base class for experiment trackers.\n *\n * Implement this to log optimization events to console, files, or external\n * experiment tracking services.\n */\nexport abstract class Tracker {\n /** Log a single event. */\n abstract log(event: TrackerEvent): void;\n /** Flush any buffered events (e.g. write to disk). */\n abstract flush(): Promise<void>;\n}\n","import { Tracker } from \"./Tracker.js\";\nimport type { TrackerEvent } from \"./Tracker.js\";\n\n/**\n * A simple tracker that logs events to the console.\n */\nexport class ConsoleTracker extends Tracker {\n override log(event: TrackerEvent): void {\n const parts: string[] = [`[${event.type.toUpperCase()}]`];\n if (event.step !== undefined) parts.push(`step=${event.step}`);\n if (event.score !== undefined) parts.push(`score=${event.score.toFixed(4)}`);\n if (event.metadata) parts.push(JSON.stringify(event.metadata));\n console.log(parts.join(\" \"));\n }\n\n override async flush(): Promise<void> {\n // No buffering — nothing to flush.\n }\n}\n","import { mkdirSync } from \"node:fs\";\nimport { appendFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { Tracker } from \"./Tracker.js\";\nimport type { TrackerEvent } from \"./Tracker.js\";\n\n/**\n * A tracker that appends JSON-encoded events as lines to a file.\n *\n * @example\n * ```ts\n * const tracker = new JsonFileTracker(\"./runs/experiment1.jsonl\");\n * const optimizer = new GRPO({ numSteps: 10 });\n * ```\n */\nexport class JsonFileTracker extends Tracker {\n readonly #path: string;\n readonly #buffer: string[] = [];\n\n constructor(path: string) {\n super();\n this.#path = path;\n mkdirSync(dirname(path), { recursive: true });\n }\n\n override log(event: TrackerEvent): void {\n this.#buffer.push(JSON.stringify({ ...event, ts: new Date().toISOString() }));\n }\n\n override async flush(): Promise<void> {\n if (this.#buffer.length === 0) return;\n const content = this.#buffer.join(\"\\n\") + \"\\n\";\n this.#buffer.length = 0;\n await appendFile(this.#path, content, \"utf8\");\n }\n}\n"],"mappings":"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","names":["import_node_fs","score","evaluate","import_node_fs","import_node_path","module","import_node_fs","import_node_path"]}