@anvia/langfuse 1.0.0-rc.6 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -51,7 +51,7 @@ const result = await agent.generate({
51
51
  },
52
52
  });
53
53
 
54
- if (result.status === "completed") {
54
+ if (result.type === "response") {
55
55
  console.log(result.output);
56
56
  console.log(result.trace); // { observer: "langfuse", traceId, observationId }
57
57
  }
package/dist/index.js CHANGED
@@ -2052,12 +2052,12 @@ var LangfuseToolObserver = class {
2052
2052
  }
2053
2053
  return;
2054
2054
  }
2055
- if (child.type === "final") {
2056
- const result = isRecord(child.result) ? child.result : {};
2055
+ if (child.type === "response" || child.type === "interaction" || child.type === "blocked") {
2056
+ const result = child;
2057
2057
  const update = {
2058
2058
  output: this.run.redactOutputValue({
2059
- status: result.status,
2060
- output: result.output,
2059
+ type: result.type,
2060
+ output: result.type === "response" ? result.output : void 0,
2061
2061
  text: result.text
2062
2062
  })
2063
2063
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/redaction.ts","../src/scoring.ts","../src/tracing.ts","../src/capture.ts","../src/helpers.ts","../src/config.ts","../src/dataset-client.ts","../src/eval-reporter.ts","../src/experiment-runner.ts","../src/prompt-client.ts"],"sourcesContent":["import type { Message } from \"@anvia/core/completion\";\n\nexport type RedactorPattern = {\n name: string;\n regex: RegExp;\n};\n\nexport type LangfuseRedactionOptions = {\n patterns?: RedactorPattern[];\n replacement?: string;\n};\n\nexport type PiiRedactor = {\n redactString(input: string): string;\n redactObject<T>(input: T): T;\n redactMessages(input: Message[]): Message[];\n patternNames(): string[];\n};\n\nconst DEFAULT_REPLACEMENT = \"[REDACTED]\";\nconst MAX_DEPTH = 16;\n\nexport function createPiiRedactor(options: LangfuseRedactionOptions = {}): PiiRedactor {\n const patterns = options.patterns ?? DEFAULT_PATTERNS;\n const replacement = options.replacement ?? DEFAULT_REPLACEMENT;\n const compiled = patterns.map((p) => ({\n name: p.name,\n regex: cloneRegex(p.regex, \"g\"),\n }));\n const patternNamesList = patterns.map((p) => p.name);\n\n function redactString(input: string): string {\n if (typeof input !== \"string\") return input;\n let out = input;\n for (const { name, regex } of compiled) {\n out = applyPattern(out, name, regex, replacement);\n }\n return out;\n }\n\n function redactObject<T>(input: T): T {\n return redactValue(input, 0, redactString) as T;\n }\n\n function redactMessages(input: Message[]): Message[] {\n return input.map((message) => redactMessage(message, redactString));\n }\n\n function patternNames(): string[] {\n return patternNamesList;\n }\n\n return { redactString, redactObject, redactMessages, patternNames };\n}\n\nexport const DEFAULT_PATTERNS: RedactorPattern[] = [\n { name: \"email\", regex: /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}/g },\n { name: \"creditCard\", regex: /\\b(?:\\d[ -]?){13,19}\\b/g },\n { name: \"ipv4\", regex: /\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b/g },\n {\n name: \"phone\",\n regex:\n /(?<!\\d)(?:\\+\\d{1,3}[\\s.-]?)?(?:\\(\\d{2,4}\\)[\\s.-]?)?\\d{3,4}[\\s.-]?\\d{3,4}(?:[\\s.-]?\\d{3,4})?(?!\\d)/g,\n },\n { name: \"jwt\", regex: /\\beyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+/g },\n {\n name: \"apiKey\",\n regex: /\\b(?:sk|pk|api|key|token)[-_][A-Za-z0-9]{16,}\\b/gi,\n },\n];\n\nfunction applyPattern(input: string, name: string, regex: RegExp, replacement: string): string {\n if (name === \"creditCard\") {\n return redactCreditCards(input, replacement);\n }\n return input.replace(regex, replacement);\n}\n\nfunction redactCreditCards(input: string, replacement: string): string {\n let out = \"\";\n let i = 0;\n while (i < input.length) {\n const ch = input.charAt(i);\n if (/\\d/.test(ch)) {\n const { length, valid } = longestLuhnChunk(input.slice(i));\n if (valid) {\n out += replacement;\n i += length;\n continue;\n }\n }\n out += ch;\n i += 1;\n }\n return out;\n}\n\nfunction longestLuhnChunk(s: string): { length: number; valid: boolean } {\n let length = 0;\n let bestValid = 0;\n while (length < s.length && length < 40) {\n const ch = s.charAt(length);\n if (!/\\d/.test(ch) && ch !== \"-\") break;\n length += 1;\n const candidate = s.slice(0, length).replace(/\\D/g, \"\");\n if (candidate.length >= 13 && candidate.length <= 19) {\n if (startsWithKnownPrefix(candidate) && passesLuhn(candidate)) {\n bestValid = length;\n }\n }\n }\n return { length: bestValid, valid: bestValid > 0 };\n}\n\nfunction startsWithKnownPrefix(digits: string): boolean {\n if (digits.startsWith(\"4\")) return true;\n const two = digits.slice(0, 2);\n if (two === \"51\" || two === \"52\" || two === \"53\" || two === \"54\" || two === \"55\") return true;\n const four = digits.slice(0, 4);\n if (four === \"2221\" || four === \"2720\") return true;\n const twoAgain = digits.slice(0, 2);\n if (twoAgain === \"34\" || twoAgain === \"37\") return true;\n if (four === \"6011\" || twoAgain === \"65\") return true;\n return digits.startsWith(\"35\");\n}\n\nexport function passesLuhn(digits: string): boolean {\n if (!/^\\d+$/.test(digits)) return false;\n let sum = 0;\n let alt = false;\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n const raw = digits.charCodeAt(i) - 48;\n let value = raw;\n if (alt) {\n value *= 2;\n if (value > 9) value -= 9;\n }\n sum += value;\n alt = !alt;\n }\n return sum % 10 === 0;\n}\n\nfunction cloneRegex(source: RegExp, flags: string): RegExp {\n return new RegExp(source.source, flags + source.flags.replace(/g/g, \"\"));\n}\n\nfunction redactValue(\n value: unknown,\n depth: number,\n redactStringFn: (s: string) => string,\n): unknown {\n if (depth > MAX_DEPTH) return value;\n if (typeof value === \"string\") {\n return isBase64DataUrl(value) ? value : redactStringFn(value);\n }\n if (Array.isArray(value))\n return value.map((entry) => redactValue(entry, depth + 1, redactStringFn));\n if (value !== null && typeof value === \"object\") {\n if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n return value;\n }\n const record = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(record)) {\n if (\n key === \"data\" &&\n typeof entry === \"string\" &&\n (record.type === \"base64\" ||\n record.type === \"image\" ||\n record.type === \"encrypted\" ||\n record.type === \"redacted\")\n ) {\n out[key] = entry;\n } else {\n out[key] = redactValue(entry, depth + 1, redactStringFn);\n }\n }\n return out;\n }\n return value;\n}\n\nfunction redactMessage(message: Message, redactStringFn: (s: string) => string): Message {\n if (message.role === \"system\") {\n return { ...message, content: redactStringFn(message.content) };\n }\n return {\n ...message,\n content: redactMessageContent(message.content, redactStringFn) as never,\n };\n}\n\nfunction redactMessageContent(value: unknown, redactStringFn: (s: string) => string): unknown {\n return redactValue(value, 0, redactStringFn);\n}\n\nfunction isBase64DataUrl(value: string): boolean {\n return /^data:[^;,]+;base64,/i.test(value);\n}\n","import type { LangfuseScoreArgs } from \"./types.js\";\n\nexport class LangfuseScoreError extends Error {\n readonly scores: LangfuseScoreArgs[];\n override readonly cause?: unknown;\n\n constructor(message: string, scores: LangfuseScoreArgs[], cause?: unknown) {\n super(message);\n this.name = \"LangfuseScoreError\";\n this.scores = scores;\n if (cause !== undefined) {\n this.cause = cause;\n }\n }\n}\n\nclass RetryableLangfuseScoreError extends LangfuseScoreError {}\n\nexport type ScoreQueueOptions = {\n baseUrl: string;\n publicKey: string;\n secretKey: string;\n timeoutMs: number;\n batchSize: number;\n flushIntervalMs: number;\n maxAttempts: number;\n fetchImpl?: typeof fetch;\n sleep?: (ms: number) => Promise<void>;\n setTimer?: (handler: () => void, ms: number) => unknown;\n clearTimer?: (handle: unknown) => void;\n};\n\nconst defaultSleep = (ms: number): Promise<void> =>\n new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n\nconst defaultSetTimer = (handler: () => void, ms: number): unknown => setTimeout(handler, ms);\nconst defaultClearTimer = (handle: unknown): void => {\n clearTimeout(handle as ReturnType<typeof setTimeout>);\n};\n\nexport function computeBackoff(attempt: number, jitter: number = Math.random()): number {\n const base = 200;\n const exponential = base * 2 ** attempt;\n const capped = Math.min(exponential, 5_000);\n const jitterAmount = capped * 0.25 * (jitter * 2 - 1);\n return Math.max(0, Math.round(capped + jitterAmount));\n}\n\nexport class ScoreQueue {\n private readonly pending: LangfuseScoreArgs[] = [];\n private timer: unknown = null;\n private flushing: Promise<void> | null = null;\n private closed = false;\n private readonly baseUrl: string;\n private readonly publicKey: string;\n private readonly secretKey: string;\n private readonly timeoutMs: number;\n private readonly batchSize: number;\n private readonly flushIntervalMs: number;\n private readonly maxAttempts: number;\n private readonly fetchImpl: typeof fetch;\n private readonly sleep: (ms: number) => Promise<void>;\n private readonly setTimer: (handler: () => void, ms: number) => unknown;\n private readonly clearTimer: (handle: unknown) => void;\n\n constructor(options: ScoreQueueOptions) {\n this.baseUrl = options.baseUrl;\n this.publicKey = options.publicKey;\n this.secretKey = options.secretKey;\n this.timeoutMs = options.timeoutMs;\n this.batchSize = options.batchSize;\n this.flushIntervalMs = options.flushIntervalMs;\n this.maxAttempts = options.maxAttempts;\n this.fetchImpl = options.fetchImpl ?? fetch;\n this.sleep = options.sleep ?? defaultSleep;\n this.setTimer = options.setTimer ?? defaultSetTimer;\n this.clearTimer = options.clearTimer ?? defaultClearTimer;\n }\n\n enqueue(score: LangfuseScoreArgs): void {\n if (this.closed) {\n throw new Error(\"Langfuse score queue is shut down\");\n }\n this.pending.push(score);\n if (this.pending.length >= this.batchSize) {\n this.triggerBackgroundFlush();\n return;\n }\n this.scheduleTimer();\n }\n\n depth(): number {\n return this.pending.length;\n }\n\n async flush(): Promise<void> {\n this.clearScheduledTimer();\n while (true) {\n if (this.flushing !== null) {\n await this.flushing;\n if (this.pending.length === 0) {\n return;\n }\n continue;\n }\n if (this.pending.length === 0) {\n return;\n }\n const draining = this.drain();\n this.flushing = draining;\n try {\n await draining;\n } finally {\n if (this.flushing === draining) {\n this.flushing = null;\n }\n }\n }\n }\n\n async shutdown(): Promise<void> {\n this.closed = true;\n this.clearScheduledTimer();\n await this.flush();\n }\n\n private scheduleTimer(): void {\n if (this.timer !== null) {\n return;\n }\n this.timer = this.setTimer(() => {\n this.timer = null;\n this.triggerBackgroundFlush();\n }, this.flushIntervalMs);\n }\n\n private triggerBackgroundFlush(): void {\n void this.flush().catch(() => {});\n }\n\n private clearScheduledTimer(): void {\n if (this.timer !== null) {\n this.clearTimer(this.timer);\n this.timer = null;\n }\n }\n\n private async sendBatch(scores: LangfuseScoreArgs[]): Promise<void> {\n const body = scores.map((score) => buildScoreBody(score));\n let lastError: unknown;\n for (let attempt = 0; attempt < this.maxAttempts; attempt += 1) {\n try {\n const response = await this.fetchImpl(`${this.baseUrl}/api/public/scores`, {\n method: \"POST\",\n headers: {\n Authorization: `Basic ${Buffer.from(`${this.publicKey}:${this.secretKey}`).toString(\"base64\")}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n if (response.ok) {\n return;\n }\n if (response.status === 429 || response.status >= 500) {\n lastError = new Error(`Langfuse score batch failed with HTTP ${response.status}`);\n } else {\n const text = await response.text();\n throw new LangfuseScoreError(\n `Langfuse score batch failed with HTTP ${response.status}: ${text}`,\n scores,\n );\n }\n } catch (error) {\n if (error instanceof LangfuseScoreError) {\n throw error;\n }\n lastError = error;\n }\n if (attempt < this.maxAttempts - 1) {\n await this.sleep(computeBackoff(attempt));\n }\n }\n throw new RetryableLangfuseScoreError(\n `Langfuse score batch failed after ${this.maxAttempts} attempts`,\n scores,\n lastError,\n );\n }\n\n private async drain(): Promise<void> {\n let permanentError: LangfuseScoreError | undefined;\n while (this.pending.length > 0) {\n const batch = this.pending.splice(0, this.batchSize);\n try {\n await this.sendBatch(batch);\n } catch (error) {\n if (error instanceof RetryableLangfuseScoreError) {\n this.pending.unshift(...batch);\n throw error;\n }\n if (error instanceof LangfuseScoreError) {\n permanentError ??= error;\n continue;\n }\n this.pending.unshift(...batch);\n throw error;\n }\n }\n if (permanentError !== undefined) {\n throw permanentError;\n }\n }\n}\n\nfunction buildScoreBody(score: LangfuseScoreArgs): Record<string, unknown> {\n const body: Record<string, unknown> = {\n traceId: score.traceId,\n name: score.name,\n value: score.value,\n };\n if (score.observationId !== undefined) body.observationId = score.observationId;\n if (score.dataType !== undefined) body.dataType = score.dataType;\n if (score.comment !== undefined) body.comment = score.comment;\n if (score.metadata !== undefined) body.metadata = score.metadata;\n const configId = score.configId ?? score.scoreConfigId;\n if (configId !== undefined) body.configId = configId;\n if (score.environment !== undefined) body.environment = score.environment;\n if (score.timestamp !== undefined) {\n body.timestamp =\n score.timestamp instanceof Date ? score.timestamp.toISOString() : score.timestamp;\n }\n return body;\n}\n","import type { Message } from \"@anvia/core/completion\";\nimport type { EvalReporter } from \"@anvia/core/evals\";\nimport type {\n AgentGenerationEndArgs,\n AgentGenerationErrorArgs,\n AgentGenerationObserver,\n AgentGenerationStartArgs,\n AgentGenerationUpdateArgs,\n AgentObserver,\n AgentObserverTraceInfo,\n AgentRunEndArgs,\n AgentRunErrorArgs,\n AgentRunEventArgs,\n AgentRunObserver,\n AgentRunPromptRef,\n AgentRunStartArgs,\n AgentToolEndArgs,\n AgentToolErrorArgs,\n AgentToolObserver,\n AgentToolStartArgs,\n AgentToolStreamEventArgs,\n AgentToolSuspendedArgs,\n} from \"@anvia/core/observability\";\nimport { LangfuseSpanProcessor } from \"@langfuse/otel\";\nimport {\n LangfuseAgent,\n LangfuseEvent,\n type LangfuseEventAttributes,\n LangfuseGeneration,\n type LangfuseGenerationAttributes,\n LangfuseGuardrail,\n LangfuseOtelSpanAttributes,\n LangfuseSpan,\n LangfuseTool,\n} from \"@langfuse/tracing\";\nimport {\n ROOT_CONTEXT,\n type Span,\n type SpanContext,\n TraceFlags,\n type Tracer,\n trace,\n} from \"@opentelemetry/api\";\nimport { resourceFromAttributes } from \"@opentelemetry/resources\";\nimport { NodeTracerProvider } from \"@opentelemetry/sdk-trace-node\";\nimport { SEMRESATTRS_SERVICE_NAME } from \"@opentelemetry/semantic-conventions\";\nimport { sanitizeTraceValue, validateCaptureMaxBytes } from \"./capture.js\";\nimport {\n type LangfuseResolvedConfig,\n langfuseResolvedConfigSymbol,\n resolveLangfuseConfig,\n} from \"./config.js\";\nimport { createLangfuseDatasetClient } from \"./dataset-client.js\";\nimport { createLangfuseEvalReporter } from \"./eval-reporter.js\";\nimport {\n type LangfuseEvalExperimentOptions,\n type LangfuseEvalExperimentResult,\n runLangfuseEvalExperiment,\n} from \"./experiment-runner.js\";\nimport {\n agentLabel,\n childMetadata,\n errorMessage,\n generationKey,\n isRecord,\n modelInputMessage,\n modelInputMessages,\n modelParameters,\n usageDetails,\n usageDetailsFromRecord,\n} from \"./helpers.js\";\nimport { createLangfusePromptClient } from \"./prompt-client.js\";\nimport { createPiiRedactor, type PiiRedactor } from \"./redaction.js\";\nimport { ScoreQueue } from \"./scoring.js\";\nimport type {\n LangfuseCaptureMode,\n LangfuseClientOptions,\n LangfuseDatasetClient,\n LangfuseDatasetClientOptions,\n LangfuseDatasetItem,\n LangfuseEvalReporterOptions,\n LangfuseObserverOptions,\n LangfusePromptClient,\n LangfusePromptClientOptions,\n LangfuseRedactionMode,\n LangfuseRunExperimentOptions,\n LangfuseScoreArgs,\n} from \"./types.js\";\n\ntype LangfuseResources = {\n readonly processor: LangfuseSpanProcessor;\n readonly provider: NodeTracerProvider;\n readonly observations: LangfuseObservationFactory;\n readonly queue: ScoreQueue | null;\n};\n\ntype LangfuseCapture = {\n readonly redactor: PiiRedactor | undefined;\n readonly redactInputs: LangfuseRedactionMode | undefined;\n readonly redactOutputs: LangfuseRedactionMode | undefined;\n readonly captureMode: LangfuseCaptureMode;\n readonly captureMaxBytes: number;\n};\n\ntype LangfuseParent = { readonly otelSpan: Span } | SpanContext;\n\nclass LangfuseObservationFactory {\n constructor(private readonly tracer: Tracer) {}\n\n agent(\n name: string,\n attributes: Parameters<LangfuseAgent[\"update\"]>[0],\n parent?: LangfuseParent | undefined,\n ): LangfuseAgent {\n return new LangfuseAgent({ otelSpan: this.startSpan(name, parent), attributes });\n }\n\n span(\n name: string,\n attributes: Parameters<LangfuseSpan[\"update\"]>[0],\n parent: LangfuseParent,\n ): LangfuseSpan {\n return new LangfuseSpan({ otelSpan: this.startSpan(name, parent), attributes });\n }\n\n generation(\n name: string,\n attributes: LangfuseGenerationAttributes,\n parent: LangfuseParent,\n ): LangfuseGeneration {\n return new LangfuseGeneration({ otelSpan: this.startSpan(name, parent), attributes });\n }\n\n tool(\n name: string,\n attributes: Parameters<LangfuseTool[\"update\"]>[0],\n parent: LangfuseParent,\n ): LangfuseTool {\n return new LangfuseTool({ otelSpan: this.startSpan(name, parent), attributes });\n }\n\n guardrail(\n name: string,\n attributes: Parameters<LangfuseGuardrail[\"update\"]>[0],\n parent: LangfuseParent,\n ): LangfuseGuardrail {\n return new LangfuseGuardrail({ otelSpan: this.startSpan(name, parent), attributes });\n }\n\n event(\n name: string,\n attributes: LangfuseEventAttributes,\n parent: LangfuseParent,\n timestamp?: Date | undefined,\n ): LangfuseEvent {\n const endTime = timestamp ?? new Date();\n return new LangfuseEvent({\n otelSpan: this.startSpan(name, parent, timestamp),\n attributes,\n timestamp: endTime,\n });\n }\n\n private startSpan(name: string, parent?: LangfuseParent, startTime?: Date): Span {\n const parentContext =\n parent === undefined\n ? ROOT_CONTEXT\n : \"otelSpan\" in parent\n ? trace.setSpan(ROOT_CONTEXT, parent.otelSpan)\n : trace.setSpanContext(ROOT_CONTEXT, parent);\n return this.tracer.startSpan(name, startTime === undefined ? {} : { startTime }, parentContext);\n }\n}\n\nexport class LangfuseClient {\n readonly [langfuseResolvedConfigSymbol]: LangfuseResolvedConfig;\n private readonly publicKey: string | undefined;\n private readonly secretKey: string | undefined;\n private readonly baseUrl: string;\n private readonly serviceName: string | undefined;\n private readonly timeoutMs: number;\n private readonly options: LangfuseClientOptions;\n private resource: LangfuseResources | undefined;\n private initialization: Promise<LangfuseResources> | undefined;\n private closePromise: Promise<void> | undefined;\n private closed = false;\n\n constructor(options: LangfuseClientOptions = {}) {\n this.options = options;\n const resolvedConfig = resolveLangfuseConfig(options);\n this[langfuseResolvedConfigSymbol] = resolvedConfig;\n this.publicKey = resolvedConfig.publicKey;\n this.secretKey = resolvedConfig.secretKey;\n this.baseUrl = resolvedConfig.baseUrl;\n this.serviceName = resolvedConfig.serviceName;\n this.timeoutMs = resolvedConfig.timeoutMs;\n }\n\n observer(options: LangfuseObserverOptions = {}): AgentObserver {\n this.assertOpen();\n return new LangfuseAgentObserver(this, resolveLangfuseCapture(options));\n }\n\n evalReporter<Input = unknown, Output = unknown, Expected = unknown>(\n options: LangfuseEvalReporterOptions = {},\n ): EvalReporter<Input, Output, Expected> {\n this.assertOpen();\n const reporter = createLangfuseEvalReporter<Input, Output, Expected>(this, options);\n return {\n report: (args) => {\n this.assertOpen();\n return reporter.report(args);\n },\n };\n }\n\n promptClient(options: LangfusePromptClientOptions = {}): LangfusePromptClient {\n this.assertOpen();\n const prompts = createLangfusePromptClient(this, options);\n return {\n getPrompt: (getOptions) => {\n this.assertOpen();\n return prompts.getPrompt(getOptions);\n },\n getPromptText: (getOptions) => {\n this.assertOpen();\n return prompts.getPromptText(getOptions);\n },\n getPromptChat: (getOptions) => {\n this.assertOpen();\n return prompts.getPromptChat(getOptions);\n },\n refresh: () => {\n this.assertOpen();\n prompts.refresh();\n },\n };\n }\n\n datasetClient(options: LangfuseDatasetClientOptions = {}): LangfuseDatasetClient {\n this.assertOpen();\n const datasets = createLangfuseDatasetClient(this, options);\n const client = this;\n return {\n createDataset(dataset) {\n client.assertOpen();\n return datasets.createDataset(dataset);\n },\n getDataset<Input, Expected>(getOptions: { name: string }) {\n client.assertOpen();\n return datasets.getDataset<Input, Expected>(getOptions);\n },\n upsertItems<Input, Expected>(upsertOptions: {\n name: string;\n items: readonly LangfuseDatasetItem<Input, Expected>[];\n }) {\n client.assertOpen();\n return datasets.upsertItems(upsertOptions);\n },\n runExperiment<Input, Output, Expected>(\n experimentOptions: LangfuseRunExperimentOptions<Input, Output, Expected>,\n ) {\n client.assertOpen();\n return datasets.runExperiment<Input, Output, Expected>(experimentOptions);\n },\n };\n }\n\n runEvalExperiment<Input, Output, Expected = unknown>(\n options: LangfuseEvalExperimentOptions<Input, Output, Expected>,\n ): Promise<LangfuseEvalExperimentResult<Input, Output, Expected>> {\n this.assertOpen();\n return runLangfuseEvalExperiment(this, options);\n }\n\n async startObservedRun(\n args: AgentRunStartArgs,\n capture: LangfuseCapture,\n ): Promise<AgentRunObserver> {\n const resource = await this.resources();\n const traceId = args.trace?.traceId;\n const capturedInput = captureInput(\n {\n instructions: args.instructions,\n prompt: args.prompt,\n history: args.history,\n },\n capture,\n );\n const capturedTraceMetadata = captureInput(args.trace?.metadata ?? {}, capture);\n const metadata: Record<string, unknown> = {\n agentName: args.agentName,\n agentDescription: args.agentDescription,\n maxTurns: args.maxTurns,\n };\n if (this.serviceName !== undefined) metadata.serviceName = this.serviceName;\n if (isRecord(capturedTraceMetadata)) {\n Object.assign(metadata, capturedTraceMetadata);\n } else {\n metadata.traceMetadata = capturedTraceMetadata;\n }\n const rootAttributes: Parameters<LangfuseAgent[\"update\"]>[0] = {\n input: capturedInput,\n metadata,\n };\n if (args.trace?.version !== undefined) rootAttributes.version = args.trace.version;\n const root = resource.observations.agent(\n args.agentName ?? \"agent.run\",\n rootAttributes,\n traceId === undefined\n ? undefined\n : {\n traceId,\n spanId: \"0000000000000001\",\n traceFlags: TraceFlags.SAMPLED,\n },\n );\n applyTraceAttributes(root, args, capturedTraceMetadata);\n return new LangfuseRunObserver(\n root,\n resource.observations,\n { traceId: root.traceId, observationId: root.id },\n resolvePromptRef(args),\n capture,\n );\n }\n\n async flush(): Promise<void> {\n this.assertOpen();\n const resource =\n this.resource ?? (this.initialization === undefined ? undefined : await this.initialization);\n if (resource === undefined) return;\n await resource.queue?.flush();\n await resource.processor.forceFlush();\n }\n\n close(): Promise<void> {\n this.closePromise ??= this.closeResources();\n return this.closePromise;\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.close();\n }\n\n scoreQueueDepth(): number {\n return this.resource?.queue?.depth() ?? 0;\n }\n\n async score(args: LangfuseScoreArgs): Promise<void> {\n if (args.traceId === undefined || args.traceId.length === 0) {\n throw new Error(\"Langfuse score requires traceId\");\n }\n if (this.publicKey === undefined || this.secretKey === undefined) {\n throw new Error(\"Langfuse score requires publicKey and secretKey\");\n }\n assertScoreValue(args.value, args.dataType);\n const resource = await this.resources();\n if (resource.queue !== null) {\n resource.queue.enqueue(args);\n return;\n }\n await this.sendScore(args);\n }\n\n private resources(): Promise<LangfuseResources> {\n this.assertOpen();\n if (this.resource !== undefined) return Promise.resolve(this.resource);\n this.initialization ??= this.createResources()\n .then((resource) => {\n this.resource = resource;\n return resource;\n })\n .catch((error: unknown) => {\n this.initialization = undefined;\n throw error;\n });\n return this.initialization;\n }\n\n private async createResources(): Promise<LangfuseResources> {\n const resolvedConfig = this[langfuseResolvedConfigSymbol];\n const processorOptions: ConstructorParameters<typeof LangfuseSpanProcessor>[0] = {\n baseUrl: this.baseUrl,\n };\n if (this.publicKey !== undefined) processorOptions.publicKey = this.publicKey;\n if (this.secretKey !== undefined) processorOptions.secretKey = this.secretKey;\n if (resolvedConfig.environment !== undefined) {\n processorOptions.environment = resolvedConfig.environment;\n }\n if (resolvedConfig.release !== undefined) processorOptions.release = resolvedConfig.release;\n const processor = new LangfuseSpanProcessor(processorOptions);\n const providerOptions: ConstructorParameters<typeof NodeTracerProvider>[0] = {\n spanProcessors: [processor],\n };\n if (this.serviceName !== undefined) {\n providerOptions.resource = resourceFromAttributes({\n [SEMRESATTRS_SERVICE_NAME]: this.serviceName,\n });\n }\n let provider: NodeTracerProvider;\n try {\n provider = new NodeTracerProvider(providerOptions);\n } catch (error) {\n await processor.shutdown().catch(() => undefined);\n throw error;\n }\n try {\n const batchSize = this.options.scores?.batchSize ?? 0;\n const queue =\n batchSize > 0 && this.publicKey !== undefined && this.secretKey !== undefined\n ? new ScoreQueue({\n baseUrl: this.baseUrl,\n publicKey: this.publicKey,\n secretKey: this.secretKey,\n timeoutMs: this.timeoutMs,\n batchSize,\n flushIntervalMs: this.options.scores?.flushIntervalMs ?? 250,\n maxAttempts: scoreMaxAttempts(this.options.scores?.retries),\n })\n : null;\n return {\n processor,\n provider,\n observations: new LangfuseObservationFactory(\n provider.getTracer(\"@anvia/langfuse\", \"1.0.0\"),\n ),\n queue,\n };\n } catch (error) {\n await provider.shutdown().catch(() => undefined);\n throw error;\n }\n }\n\n private async closeResources(): Promise<void> {\n this.closed = true;\n const pending =\n this.resource === undefined ? this.initialization : Promise.resolve(this.resource);\n if (pending === undefined) return;\n let resource: LangfuseResources;\n try {\n resource = await pending;\n } catch {\n return;\n }\n const settled = await Promise.allSettled([\n resource.queue?.shutdown() ?? Promise.resolve(),\n resource.provider.shutdown(),\n ]);\n const failures = settled.flatMap((result) =>\n result.status === \"rejected\" ? [result.reason] : [],\n );\n if (failures.length > 0) {\n throw new AggregateError(failures, \"Failed to close LangfuseClient.\");\n }\n }\n\n private assertOpen(): void {\n if (this.closed) throw new Error(\"LangfuseClient is closed.\");\n }\n\n private async sendScore(args: LangfuseScoreArgs): Promise<void> {\n const body = buildScoreBody(args);\n const response = await fetch(`${this.baseUrl}/api/public/scores`, {\n method: \"POST\",\n headers: {\n Authorization: `Basic ${Buffer.from(`${this.publicKey}:${this.secretKey}`).toString(\"base64\")}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n if (!response.ok) {\n throw new Error(\n `Langfuse score failed with HTTP ${response.status}: ${await response.text()}`,\n );\n }\n }\n}\n\nclass LangfuseAgentObserver implements AgentObserver {\n constructor(\n private readonly client: LangfuseClient,\n private readonly capture: LangfuseCapture,\n ) {}\n\n startRun(args: AgentRunStartArgs): Promise<AgentRunObserver> {\n return this.client.startObservedRun(args, this.capture);\n }\n}\n\nfunction resolveLangfuseCapture(options: LangfuseObserverOptions): LangfuseCapture {\n return {\n redactor:\n options.redactInputs !== undefined || options.redactOutputs !== undefined\n ? createPiiRedactor(options.redaction)\n : undefined,\n redactInputs: options.redactInputs,\n redactOutputs: options.redactOutputs,\n captureMode: options.captureMode ?? \"safe\",\n captureMaxBytes: validateCaptureMaxBytes(options.captureMaxBytes),\n };\n}\n\nfunction captureInput<T>(value: T, capture: LangfuseCapture): unknown {\n const redacted =\n capture.redactor === undefined || capture.redactInputs === undefined\n ? value\n : applyRedaction(capture.redactor, value, capture.redactInputs);\n return sanitizeTraceValue(redacted, capture.captureMaxBytes);\n}\n\nfunction scoreMaxAttempts(retries: { maxAttempts: number } | undefined): number {\n if (retries === undefined) return 3;\n if (!Number.isSafeInteger(retries.maxAttempts) || retries.maxAttempts < 1) {\n throw new TypeError(\"Langfuse score retries.maxAttempts must be a positive integer.\");\n }\n return retries.maxAttempts;\n}\n\nfunction assertScoreValue(value: number | string, dataType: LangfuseScoreArgs[\"dataType\"]): void {\n if (dataType === \"NUMERIC\") {\n if (typeof value !== \"number\") {\n throw new TypeError(`Langfuse score dataType=NUMERIC requires a number value`);\n }\n return;\n }\n if (dataType === \"CATEGORICAL\") {\n if (typeof value !== \"string\") {\n throw new TypeError(`Langfuse score dataType=CATEGORICAL requires a string value`);\n }\n return;\n }\n if (dataType === \"BOOLEAN\") {\n if (value !== 0 && value !== 1) {\n throw new TypeError(`Langfuse score dataType=BOOLEAN requires value 0 or 1`);\n }\n return;\n }\n}\n\nfunction buildScoreBody(score: LangfuseScoreArgs): Record<string, unknown> {\n const body: Record<string, unknown> = {\n traceId: score.traceId,\n name: score.name,\n value: score.value,\n };\n if (score.observationId !== undefined) body.observationId = score.observationId;\n if (score.dataType !== undefined) body.dataType = score.dataType;\n if (score.comment !== undefined) body.comment = score.comment;\n if (score.metadata !== undefined) body.metadata = score.metadata;\n const configId = score.configId ?? score.scoreConfigId;\n if (configId !== undefined) body.configId = configId;\n if (score.environment !== undefined) body.environment = score.environment;\n if (score.timestamp !== undefined) {\n body.timestamp =\n score.timestamp instanceof Date ? score.timestamp.toISOString() : score.timestamp;\n }\n return body;\n}\n\nfunction applyTraceAttributes(\n root: LangfuseAgent,\n args: AgentRunStartArgs,\n capturedMetadata: unknown,\n): void {\n const traceName = args.trace?.name ?? args.agentName;\n if (traceName !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_NAME, traceName);\n }\n if (args.trace?.userId !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_USER_ID, args.trace.userId);\n }\n if (args.trace?.sessionId !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_SESSION_ID, args.trace.sessionId);\n }\n if (args.trace?.tags !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_TAGS, [...args.trace.tags]);\n }\n for (const [key, value] of Object.entries(\n isRecord(capturedMetadata) ? capturedMetadata : { value: capturedMetadata },\n )) {\n const serialized = serializeMetadataValue(value);\n if (serialized === undefined) {\n continue;\n }\n root.otelSpan.setAttribute(`${LangfuseOtelSpanAttributes.TRACE_METADATA}.${key}`, serialized);\n }\n const promptRef = resolvePromptRef(args);\n if (promptRef !== undefined) {\n root.otelSpan.setAttribute(\n `${LangfuseOtelSpanAttributes.TRACE_METADATA}.promptName`,\n promptRef.name,\n );\n if (promptRef.version !== undefined) {\n root.otelSpan.setAttribute(\n `${LangfuseOtelSpanAttributes.TRACE_METADATA}.promptVersion`,\n String(promptRef.version),\n );\n }\n }\n}\n\nfunction applyRedaction<T>(redactor: PiiRedactor, value: T, mode: LangfuseRedactionMode): T {\n if (mode === \"deep\") {\n return redactor.redactObject(value);\n }\n if (typeof value === \"string\") {\n return redactor.redactString(value) as unknown as T;\n }\n if (value !== null && typeof value === \"object\") {\n return redactor.redactObject(value);\n }\n return value;\n}\n\nfunction resolvePromptRef(args: AgentRunStartArgs): AgentRunPromptRef | undefined {\n if (args.promptRef !== undefined) {\n return args.promptRef;\n }\n if (args.trace?.promptRef !== undefined) {\n return args.trace.promptRef;\n }\n const metadata = args.trace?.metadata;\n if (metadata === undefined) {\n return undefined;\n }\n const name = metadata.promptName;\n if (typeof name !== \"string\" || name.length === 0) {\n return undefined;\n }\n const rawVersion = metadata.promptVersion;\n if (rawVersion === undefined || rawVersion === null) {\n return { name };\n }\n const version =\n typeof rawVersion === \"number\"\n ? rawVersion\n : typeof rawVersion === \"string\" && rawVersion.trim().length > 0\n ? Number(rawVersion)\n : undefined;\n if (version === undefined || !Number.isFinite(version)) {\n return { name };\n }\n return { name, version };\n}\n\nfunction promptMetadata(\n ref: AgentRunPromptRef | undefined,\n): Record<string, string | number | undefined> {\n if (ref === undefined) {\n return {};\n }\n const metadata: Record<string, string | number | undefined> = {\n promptName: ref.name,\n };\n if (ref.version !== undefined) metadata.promptVersion = ref.version;\n return metadata;\n}\n\nfunction serializeMetadataValue(value: unknown): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return \"<failed to serialize>\";\n }\n}\n\nfunction asMetadata(value: unknown): Record<string, unknown> {\n return isRecord(value) ? value : { value };\n}\n\nfunction eventStartTime(value: string | undefined): Date | undefined {\n if (value === undefined) return undefined;\n const parsed = new Date(value);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n}\n\nclass LangfuseRunObserver implements AgentRunObserver {\n private readonly turnSpans = new Map<number, LangfuseSpan>();\n private readonly promptRef: AgentRunPromptRef | undefined;\n private readonly redactor: PiiRedactor | undefined;\n private readonly redactInputs: LangfuseRedactionMode | undefined;\n private readonly redactOutputs: LangfuseRedactionMode | undefined;\n private readonly captureMode: LangfuseCaptureMode;\n private readonly captureMaxBytes: number;\n\n constructor(\n private readonly root: LangfuseAgent,\n private readonly observations: LangfuseObservationFactory,\n readonly trace: AgentObserverTraceInfo,\n promptRef: AgentRunPromptRef | undefined,\n redaction: {\n redactor: PiiRedactor | undefined;\n redactInputs: LangfuseRedactionMode | undefined;\n redactOutputs: LangfuseRedactionMode | undefined;\n captureMode: LangfuseCaptureMode;\n captureMaxBytes: number;\n },\n ) {\n this.promptRef = promptRef;\n this.redactor = redaction.redactor;\n this.redactInputs = redaction.redactInputs;\n this.redactOutputs = redaction.redactOutputs;\n this.captureMode = redaction.captureMode;\n this.captureMaxBytes = redaction.captureMaxBytes;\n }\n\n redactInputValue<T>(value: T): unknown {\n const redacted =\n this.redactor === undefined || this.redactInputs === undefined\n ? value\n : applyRedaction(this.redactor, value, this.redactInputs);\n return sanitizeTraceValue(redacted, this.captureMaxBytes);\n }\n\n redactOutputValue<T>(value: T): unknown {\n const redacted =\n this.redactor === undefined || this.redactOutputs === undefined\n ? value\n : applyRedaction(this.redactor, value, this.redactOutputs);\n return sanitizeTraceValue(redacted, this.captureMaxBytes);\n }\n\n startGeneration(args: AgentGenerationStartArgs): AgentGenerationObserver {\n this.closeEarlierTurns(args.turn);\n const turn = this.turnSpan(args.turn);\n const safeInput: Record<string, unknown> = {\n instructions: args.request.instructions,\n messages: modelInputMessages(args.request.chatHistory),\n };\n if (this.captureMode === \"full\") {\n safeInput.documents = args.request.documents;\n safeInput.tools = args.request.tools;\n safeInput.providerTools = args.request.providerTools;\n safeInput.outputSchema = args.request.outputSchema;\n safeInput.providerOptions = args.request.providerOptions;\n }\n const metadata: Record<string, unknown> = {\n turn: args.turn,\n documentCount: args.request.documents.length,\n toolNames: args.request.tools.map((tool) => tool.name),\n providerToolNames: args.request.providerTools?.map((tool) => tool.name) ?? [],\n hasOutputSchema: args.request.outputSchema !== undefined,\n providerOptionKeys: isRecord(args.request.providerOptions)\n ? Object.keys(args.request.providerOptions)\n : [],\n };\n if (this.captureMode === \"full\" && args.providerRequest !== undefined) {\n metadata.providerRequest = args.providerRequest;\n }\n if (args.modelInfo !== undefined) {\n const modelInfo: Record<string, unknown> = {\n provider: args.modelInfo.provider,\n modelId: args.modelInfo.modelId,\n };\n if (args.modelInfo.capabilities !== undefined) {\n modelInfo.capabilities = args.modelInfo.capabilities;\n }\n metadata.modelInfo = modelInfo;\n }\n Object.assign(metadata, promptMetadata(this.promptRef));\n const generationAttributes: LangfuseGenerationAttributes = {\n input: this.redactInputValue(safeInput),\n model: args.modelInfo?.modelId ?? \"unknown\",\n modelParameters: modelParameters(args.request),\n metadata: asMetadata(this.redactInputValue(metadata)),\n };\n if (this.promptRef?.version !== undefined) {\n generationAttributes.prompt = {\n name: this.promptRef.name,\n version: this.promptRef.version,\n isFallback: false,\n };\n }\n const generation = this.observations.generation(\n `model.turn.${args.turn}`,\n generationAttributes,\n turn,\n );\n return new LangfuseGenerationObserver(generation, this, new Date());\n }\n\n startTool(args: AgentToolStartArgs): AgentToolObserver {\n const turn = this.turnSpan(args.turn);\n const metadata: Record<string, unknown> = {\n turn: args.turn,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n };\n if (this.captureMode === \"full\") {\n if (args.toolDefinition !== undefined) metadata.toolDefinition = args.toolDefinition;\n if (args.toolMetadata !== undefined) metadata.toolMetadata = args.toolMetadata;\n }\n const tool = this.observations.tool(\n `tool.${args.toolName}`,\n {\n input: this.redactInputValue({\n args: args.args,\n toolCall: args.toolCall,\n }),\n metadata: asMetadata(this.redactInputValue(metadata)),\n },\n turn,\n );\n return new LangfuseToolObserver(tool, this, this.observations);\n }\n\n end(args: AgentRunEndArgs): void {\n this.closeAllTurns();\n const observedOutput =\n args.status === \"completed\"\n ? { status: args.status, output: args.output, text: args.text }\n : args.status === \"blocked\"\n ? { status: args.status, stage: args.stage, text: args.text }\n : { status: args.status, interaction: args.interaction, text: args.text };\n const redactedOutput = this.redactOutputValue(observedOutput);\n const metadata: Record<string, unknown> = {\n runId: args.runId,\n status: args.status,\n usage: args.usage,\n messageCount: args.messages.length,\n sources: this.redactOutputValue(args.sources),\n providerToolCalls: this.redactOutputValue(args.providerToolCalls),\n resumedFrom: this.redactOutputValue(args.resumedFrom),\n };\n if (this.captureMode === \"full\") {\n metadata.messages = this.redactTranscript(args.messages);\n }\n this.root\n .update({\n output: redactedOutput,\n metadata,\n })\n .end();\n }\n\n error(args: AgentRunErrorArgs): void {\n this.closeAllTurns();\n const redactedError = this.redactOutputValue(errorMessage(args.error));\n const metadata: Record<string, unknown> = {\n usage: args.usage,\n messageCount: args.messages.length,\n };\n if (this.captureMode === \"full\") {\n metadata.messages = this.redactTranscript(args.messages);\n }\n this.root\n .update({\n level: \"ERROR\",\n statusMessage: typeof redactedError === \"string\" ? redactedError : \"Agent run failed\",\n output: {\n error: redactedError,\n },\n metadata,\n })\n .end();\n }\n\n event(args: AgentRunEventArgs): void {\n const metadata = asMetadata(this.redactOutputValue(args.attributes ?? {}));\n const attributes: LangfuseEventAttributes = { metadata };\n if (args.level !== undefined) {\n attributes.level = args.level;\n }\n const startTime = eventStartTime(args.timestamp);\n this.observations.event(args.name, attributes, this.root, startTime);\n }\n\n private turnSpan(turn: number): LangfuseSpan {\n const existing = this.turnSpans.get(turn);\n if (existing !== undefined) {\n return existing;\n }\n\n const span = this.observations.span(\n `turn.${turn}`,\n {\n metadata: { turn },\n },\n this.root,\n );\n this.turnSpans.set(turn, span);\n return span;\n }\n\n private closeEarlierTurns(currentTurn: number): void {\n for (const [turn, span] of this.turnSpans) {\n if (turn < currentTurn) {\n span.end();\n this.turnSpans.delete(turn);\n }\n }\n }\n\n private closeAllTurns(): void {\n for (const span of this.turnSpans.values()) {\n span.end();\n }\n this.turnSpans.clear();\n }\n\n isFullCapture(): boolean {\n return this.captureMode === \"full\";\n }\n\n redactTranscript(messages: AgentRunEndArgs[\"messages\"]): unknown {\n const inputRedacted =\n this.redactor === undefined || this.redactInputs === undefined\n ? messages\n : applyRedaction(this.redactor, messages, this.redactInputs);\n const outputRedacted =\n this.redactor === undefined || this.redactOutputs === undefined\n ? inputRedacted\n : applyRedaction(this.redactor, inputRedacted, this.redactOutputs);\n return sanitizeTraceValue(outputRedacted, this.captureMaxBytes);\n }\n}\n\nclass LangfuseGenerationObserver implements AgentGenerationObserver {\n constructor(\n private readonly generation: LangfuseGeneration,\n private readonly run: LangfuseRunObserver,\n private readonly startedAt: Date,\n ) {}\n\n update(args: AgentGenerationUpdateArgs): void {\n this.generation.update({\n output: this.run.redactOutputValue({ delta: args.delta }),\n });\n }\n\n end(args: AgentGenerationEndArgs): void {\n const redactedText = this.run.redactOutputValue(\n textFromObservedAssistantContent(args.response.choice),\n );\n const redactedChoice = this.run.redactOutputValue(args.response.choice);\n const metadata: Record<string, unknown> = { turn: args.turn };\n if (args.firstDeltaMs !== undefined) metadata.firstDeltaMs = args.firstDeltaMs;\n const output: Record<string, unknown> = {\n messageId: args.response.messageId,\n content: redactedChoice,\n text: redactedText,\n sources: this.run.redactOutputValue(args.response.sources),\n providerToolCalls: this.run.redactOutputValue(args.response.providerToolCalls),\n };\n const completionStartTime =\n args.firstDeltaMs === undefined\n ? undefined\n : new Date(this.startedAt.getTime() + args.firstDeltaMs);\n const update: LangfuseGenerationAttributes = {\n output,\n usageDetails: usageDetails(args.response.usage),\n metadata,\n };\n if (completionStartTime !== undefined) {\n update.completionStartTime = completionStartTime;\n }\n this.generation.update(update).end();\n }\n\n error(args: AgentGenerationErrorArgs): void {\n const redactedError = this.run.redactOutputValue(errorMessage(args.error));\n this.generation\n .update({\n level: \"ERROR\",\n statusMessage: typeof redactedError === \"string\" ? redactedError : \"Generation failed\",\n output: { error: redactedError },\n metadata: { turn: args.turn },\n })\n .end();\n }\n}\n\nfunction textFromObservedAssistantContent(\n content: AgentGenerationEndArgs[\"response\"][\"choice\"],\n): string {\n return content.flatMap((item) => (item.type === \"text\" ? [item.text] : [])).join(\"\\n\");\n}\n\nclass LangfuseToolObserver implements AgentToolObserver {\n private readonly childAgents = new Map<string, LangfuseAgent>();\n private readonly childGenerations = new Map<\n string,\n { generation: LangfuseGeneration; startedAt: Date }\n >();\n private readonly childTools: Array<{\n agentId: string;\n toolName: string;\n toolCallId?: string;\n tool: LangfuseTool;\n ended: boolean;\n }> = [];\n\n constructor(\n private readonly tool: LangfuseTool,\n private readonly run: LangfuseRunObserver,\n private readonly observations: LangfuseObservationFactory,\n ) {}\n\n streamEvent(args: AgentToolStreamEventArgs): void {\n const wrapper = args.event;\n const child = isRecord(wrapper.event) ? wrapper.event : undefined;\n if (child === undefined) {\n return;\n }\n\n const agentId = wrapper.agentId;\n const agentName = wrapper.agentName;\n const childTurn = typeof child.turn === \"number\" ? child.turn : args.turn;\n const agent = this.childAgent(agentId, agentName, args);\n\n if (child.type === \"turn_start\") {\n const promptMessage = isRecord(child.prompt) ? (child.prompt as Message) : undefined;\n const historyMessages = Array.isArray(child.history)\n ? (child.history.filter(isRecord) as Message[])\n : [];\n this.observations.event(\n `${agentLabel(agentId, agentName)}.turn.${childTurn}.start`,\n {\n input: this.run.redactInputValue({\n prompt: promptMessage === undefined ? undefined : modelInputMessage(promptMessage),\n history: modelInputMessages(historyMessages),\n }),\n metadata: asMetadata(\n this.run.redactInputValue(childMetadata(args, agentId, agentName, childTurn)),\n ),\n },\n agent,\n );\n return;\n }\n\n if (child.type === \"generation_start\" && isRecord(child.request)) {\n const request = child.request;\n const modelInfo = isRecord(child.modelInfo) ? child.modelInfo : undefined;\n const messages = Array.isArray(request.chatHistory)\n ? modelInputMessages(request.chatHistory.filter(isRecord) as Message[])\n : [];\n const input: Record<string, unknown> = {\n instructions: typeof request.instructions === \"string\" ? request.instructions : undefined,\n messages,\n };\n if (this.run.isFullCapture()) {\n input.documents = request.documents;\n input.tools = request.tools;\n input.providerTools = request.providerTools;\n input.outputSchema = request.outputSchema;\n input.providerOptions = request.providerOptions;\n }\n const toolNames = Array.isArray(request.tools)\n ? request.tools\n .filter(isRecord)\n .map((tool) => tool.name)\n .filter((name): name is string => typeof name === \"string\")\n : [];\n const providerToolNames = Array.isArray(request.providerTools)\n ? request.providerTools\n .filter(isRecord)\n .map((tool) => tool.name)\n .filter((name): name is string => typeof name === \"string\")\n : [];\n const generation = this.observations.generation(\n `${agentLabel(agentId, agentName)}.model.turn.${childTurn}`,\n {\n input: this.run.redactInputValue(input),\n model: typeof modelInfo?.modelId === \"string\" ? modelInfo.modelId : \"unknown\",\n modelParameters: modelParameters(request as AgentGenerationStartArgs[\"request\"]),\n metadata: asMetadata(\n this.run.redactInputValue({\n ...childMetadata(args, agentId, agentName, childTurn),\n documentCount: Array.isArray(request.documents) ? request.documents.length : 0,\n toolNames,\n providerToolNames,\n hasOutputSchema: request.outputSchema !== undefined,\n modelInfo,\n }),\n ),\n },\n agent,\n );\n this.childGenerations.set(generationKey(agentId, childTurn), {\n generation,\n startedAt: new Date(),\n });\n return;\n }\n\n if (child.type === \"turn_end\") {\n const childGeneration = this.childGenerations.get(generationKey(agentId, childTurn));\n if (childGeneration !== undefined) {\n const update: Parameters<LangfuseGeneration[\"update\"]>[0] = {\n output: this.run.redactOutputValue(child.response),\n metadata: asMetadata(\n this.run.redactOutputValue(childMetadata(args, agentId, agentName, childTurn)),\n ),\n };\n if (isRecord(child.response) && isRecord(child.response.usage)) {\n update.usageDetails = usageDetailsFromRecord(child.response.usage);\n }\n if (typeof child.firstDeltaMs === \"number\") {\n update.completionStartTime = new Date(\n childGeneration.startedAt.getTime() + child.firstDeltaMs,\n );\n }\n childGeneration.generation.update(update).end();\n this.childGenerations.delete(generationKey(agentId, childTurn));\n }\n return;\n }\n\n if (\n child.type === \"text_delta\" ||\n child.type === \"reasoning_delta\" ||\n child.type === \"tool_call_delta\"\n ) {\n const childGeneration = this.childGenerations.get(generationKey(agentId, childTurn));\n childGeneration?.generation.update({\n output: this.run.redactOutputValue({ delta: child }),\n });\n return;\n }\n\n if (child.type === \"source\" || child.type === \"provider_tool_call\") {\n const childGeneration = this.childGenerations.get(generationKey(agentId, childTurn));\n const parent = childGeneration?.generation ?? agent;\n this.observations.event(\n `${agentLabel(agentId, agentName)}.${child.type}`,\n {\n output: this.run.redactOutputValue(\n child.type === \"source\" ? child.source : child.toolCall,\n ),\n metadata: asMetadata(\n this.run.redactOutputValue(childMetadata(args, agentId, agentName, childTurn)),\n ),\n },\n parent,\n );\n return;\n }\n\n if (child.type === \"guardrail_decision\") {\n this.observations\n .guardrail(\n `${agentLabel(agentId, agentName)}.guardrail`,\n {\n output: this.run.redactOutputValue(child.decision),\n metadata: asMetadata(\n this.run.redactOutputValue(childMetadata(args, agentId, agentName, childTurn)),\n ),\n },\n agent,\n )\n .end();\n return;\n }\n\n if (child.type === \"tool_call\" && isRecord(child.toolCall)) {\n const childGeneration = this.childGenerations.get(generationKey(agentId, childTurn));\n childGeneration?.generation.update({\n output: this.run.redactOutputValue({ toolCall: child.toolCall }),\n });\n const toolCall = child.toolCall;\n const toolName = typeof toolCall.toolName === \"string\" ? toolCall.toolName : \"tool\";\n const toolCallId =\n typeof toolCall.toolCallId === \"string\"\n ? toolCall.toolCallId\n : typeof toolCall.callId === \"string\"\n ? toolCall.callId\n : undefined;\n const childTool = this.observations.tool(\n `${agentLabel(agentId, agentName)}.${toolName}`,\n {\n input: this.run.redactInputValue({\n args: toolCall.input,\n toolCall,\n }),\n metadata: asMetadata(\n this.run.redactInputValue({\n ...childMetadata(args, agentId, agentName, childTurn),\n toolName,\n toolCallId,\n }),\n ),\n },\n agent,\n );\n const childToolRecord: (typeof this.childTools)[number] = {\n agentId,\n toolName,\n tool: childTool,\n ended: false,\n };\n if (toolCallId !== undefined) childToolRecord.toolCallId = toolCallId;\n this.childTools.push(childToolRecord);\n return;\n }\n\n if (child.type === \"tool_result\") {\n const toolName = typeof child.toolName === \"string\" ? child.toolName : \"tool\";\n const toolCallId = typeof child.toolCallId === \"string\" ? child.toolCallId : undefined;\n const childTool = this.findChildTool(agentId, toolName, toolCallId);\n if (childTool !== undefined) {\n childTool.ended = true;\n childTool.tool\n .update({\n output: this.run.redactOutputValue(\n typeof child.result === \"string\" ? child.result : child,\n ),\n metadata: asMetadata(\n this.run.redactInputValue({\n ...childMetadata(args, agentId, agentName, childTurn),\n toolName,\n toolCallId,\n internalCallId:\n typeof child.internalCallId === \"string\" ? child.internalCallId : undefined,\n args: typeof child.args === \"string\" ? child.args : undefined,\n }),\n ),\n })\n .end();\n }\n return;\n }\n\n if (child.type === \"final\") {\n const result = isRecord(child.result) ? child.result : {};\n const update: Parameters<LangfuseAgent[\"update\"]>[0] = {\n output: this.run.redactOutputValue({\n status: result.status,\n output: result.output,\n text: result.text,\n }),\n };\n const metadata: Record<string, unknown> = {};\n if (isRecord(result.usage)) metadata.usage = result.usage;\n if (this.run.isFullCapture() && Array.isArray(result.messages)) {\n metadata.messages = this.run.redactTranscript(result.messages as Message[]);\n }\n if (Object.keys(metadata).length > 0) update.metadata = metadata;\n agent.update(update).end();\n this.childAgents.delete(agentId);\n return;\n }\n\n if (child.type === \"error\") {\n const redactedError = this.run.redactOutputValue(errorMessage(child.error));\n const childGeneration = this.childGenerations.get(generationKey(agentId, childTurn));\n childGeneration?.generation\n .update({\n level: \"ERROR\",\n statusMessage: typeof redactedError === \"string\" ? redactedError : \"Generation failed\",\n output: { error: redactedError },\n })\n .end();\n this.childGenerations.delete(generationKey(agentId, childTurn));\n const update: Parameters<LangfuseAgent[\"update\"]>[0] = {\n level: \"ERROR\",\n statusMessage: typeof redactedError === \"string\" ? redactedError : \"Child agent failed\",\n output: { error: redactedError },\n };\n if (isRecord(child.usage)) update.metadata = { usage: child.usage };\n agent.update(update).end();\n this.childAgents.delete(agentId);\n }\n }\n\n end(args: AgentToolEndArgs): void {\n this.endOpenChildren();\n const redactedResult = this.run.redactOutputValue(args.result);\n const redactedStructured = this.run.redactOutputValue(args.structuredResult);\n const metadata: Record<string, unknown> = {\n turn: args.turn,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n skipped: args.skipped,\n };\n if (redactedStructured !== undefined) metadata.structuredResult = redactedStructured;\n const attributes: Parameters<LangfuseTool[\"update\"]>[0] = {\n output: redactedResult,\n metadata,\n level: args.skipped ? \"WARNING\" : \"DEFAULT\",\n };\n if (args.skipped) {\n attributes.statusMessage = \"Tool call skipped by hook\";\n }\n this.tool.update(attributes).end();\n }\n\n suspend(args: AgentToolSuspendedArgs): void {\n this.endOpenChildren();\n this.tool\n .update({\n output: this.run.redactOutputValue({\n status: \"suspended\",\n interaction: args.interaction,\n }),\n metadata: {\n turn: args.turn,\n internalCallId: args.internalCallId,\n interactionId: args.interaction.id,\n interactionType: args.interaction.type,\n },\n level: \"WARNING\",\n statusMessage: \"Tool call suspended for human interaction\",\n })\n .end();\n }\n\n error(args: AgentToolErrorArgs): void {\n this.endOpenChildren();\n const redactedError = this.run.redactOutputValue(errorMessage(args.error));\n this.tool\n .update({\n level: \"ERROR\",\n statusMessage: typeof redactedError === \"string\" ? redactedError : \"Tool failed\",\n output: { error: redactedError },\n metadata: {\n turn: args.turn,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n },\n })\n .end();\n }\n\n private childAgent(\n agentId: string,\n agentName: string | undefined,\n args: AgentToolStartArgs,\n ): LangfuseAgent {\n const existing = this.childAgents.get(agentId);\n if (existing !== undefined) {\n return existing;\n }\n const agent = this.observations.agent(\n `${agentLabel(agentId, agentName)}.run`,\n {\n metadata: asMetadata(\n this.run.redactInputValue(childMetadata(args, agentId, agentName, args.turn)),\n ),\n },\n this.tool,\n );\n this.childAgents.set(agentId, agent);\n return agent;\n }\n\n private findChildTool(\n agentId: string,\n toolName: string,\n toolCallId: string | undefined,\n ): (typeof this.childTools)[number] | undefined {\n for (let index = this.childTools.length - 1; index >= 0; index -= 1) {\n const childTool = this.childTools[index];\n if (\n childTool === undefined ||\n childTool.ended ||\n childTool.agentId !== agentId ||\n childTool.toolName !== toolName\n ) {\n continue;\n }\n if (toolCallId === undefined || childTool.toolCallId === toolCallId) {\n return childTool;\n }\n }\n return undefined;\n }\n\n private endOpenChildren(): void {\n for (const generation of this.childGenerations.values()) {\n generation.generation.end();\n }\n this.childGenerations.clear();\n for (const tool of this.childTools) {\n if (!tool.ended) {\n tool.tool.end();\n tool.ended = true;\n }\n }\n for (const agent of this.childAgents.values()) {\n agent.end();\n }\n this.childAgents.clear();\n }\n}\n","export const DEFAULT_CAPTURE_MAX_BYTES = 262_144;\nexport const MIN_CAPTURE_MAX_BYTES = 96;\n\ntype TruncatedTraceValue = {\n anviaTraceValue: \"truncated\";\n originalBytes: number;\n preview: string;\n};\n\ntype OmittedTraceValue = {\n anviaTraceValue: \"omitted\";\n reason: \"base64\" | \"binary\" | \"circular\" | \"depth\" | \"unserializable\";\n originalBytes?: number;\n};\n\nexport function validateCaptureMaxBytes(value: number | undefined): number {\n const resolved = value ?? DEFAULT_CAPTURE_MAX_BYTES;\n if (!Number.isInteger(resolved) || resolved < MIN_CAPTURE_MAX_BYTES) {\n throw new TypeError(\n `Langfuse captureMaxBytes must be an integer of at least ${MIN_CAPTURE_MAX_BYTES}`,\n );\n }\n return resolved;\n}\n\nexport function sanitizeTraceValue<T>(\n value: T,\n maxBytes: number,\n): T | TruncatedTraceValue | OmittedTraceValue {\n validateCaptureMaxBytes(maxBytes);\n const sanitized = sanitizeValue(value, 0, new WeakSet<object>()) as T;\n let serialized: string;\n try {\n serialized = JSON.stringify(sanitized) ?? String(sanitized);\n } catch {\n return omitted(\"unserializable\");\n }\n const originalBytes = utf8Bytes(serialized);\n if (originalBytes <= maxBytes) {\n return sanitized;\n }\n const preview = boundedPreview(serialized, originalBytes, maxBytes);\n return {\n anviaTraceValue: \"truncated\",\n originalBytes,\n preview,\n };\n}\n\nfunction sanitizeValue(value: unknown, depth: number, seen: WeakSet<object>): unknown {\n if (depth > 16) {\n return omitted(\"depth\");\n }\n if (typeof value === \"string\") {\n if (/^data:[^;,]+;base64,/i.test(value)) {\n return omitted(\"base64\", utf8Bytes(value));\n }\n return value;\n }\n if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n const byteLength = value.byteLength;\n return omitted(\"binary\", byteLength);\n }\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n if (seen.has(value)) {\n return omitted(\"circular\");\n }\n seen.add(value);\n if (Array.isArray(value)) {\n const result = value.map((entry) => sanitizeValue(entry, depth + 1, seen));\n seen.delete(value);\n return result;\n }\n const record = value as Record<string, unknown>;\n const result: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(record)) {\n if (\n key === \"data\" &&\n typeof entry === \"string\" &&\n (record.type === \"base64\" ||\n (record.type === \"image\" && typeof record.mediaType === \"string\"))\n ) {\n result[key] = omitted(\"base64\", utf8Bytes(entry));\n continue;\n }\n result[key] = sanitizeValue(entry, depth + 1, seen);\n }\n seen.delete(value);\n return result;\n}\n\nfunction omitted(reason: OmittedTraceValue[\"reason\"], originalBytes?: number): OmittedTraceValue {\n const value: OmittedTraceValue = {\n anviaTraceValue: \"omitted\",\n reason,\n };\n if (originalBytes !== undefined) value.originalBytes = originalBytes;\n return value;\n}\n\nfunction boundedPreview(value: string, originalBytes: number, maxBytes: number): string {\n let low = 0;\n let high = value.length;\n while (low < high) {\n const middle = Math.ceil((low + high) / 2);\n const candidate = {\n anviaTraceValue: \"truncated\" as const,\n originalBytes,\n preview: value.slice(0, middle),\n };\n if (utf8Bytes(JSON.stringify(candidate)) <= maxBytes) {\n low = middle;\n } else {\n high = middle - 1;\n }\n }\n return value.slice(0, low);\n}\n\nfunction utf8Bytes(value: string): number {\n return typeof Buffer === \"undefined\"\n ? new TextEncoder().encode(value).byteLength\n : Buffer.byteLength(value, \"utf8\");\n}\n","import type {\n AgentGenerationEndArgs,\n AgentGenerationStartArgs,\n AgentRunStartArgs,\n AgentToolStartArgs,\n} from \"@anvia/core/observability\";\n\ntype ObservedMessage = AgentRunStartArgs[\"prompt\"];\n\nexport function modelInputMessage(message: ObservedMessage): Omit<ObservedMessage, \"metadata\"> {\n const { metadata: _metadata, ...result } = message;\n return result;\n}\n\nexport function modelInputMessages(\n messages: readonly ObservedMessage[],\n): Array<Omit<ObservedMessage, \"metadata\">> {\n return messages.map(modelInputMessage);\n}\n\nexport function modelParameters(\n request: AgentGenerationStartArgs[\"request\"],\n): Record<string, string | number> {\n const params: Record<string, string | number> = {};\n if (request.temperature !== undefined) params.temperature = request.temperature;\n if (request.maxTokens !== undefined) params.maxTokens = request.maxTokens;\n if (request.toolChoice !== undefined) {\n params.toolChoice =\n typeof request.toolChoice === \"string\" ? request.toolChoice : request.toolChoice.name;\n }\n return params;\n}\n\nexport function usageDetails(\n usage: AgentGenerationEndArgs[\"response\"][\"usage\"],\n): Record<string, number> {\n if (usage.details !== undefined && Object.keys(usage.details).length > 0) {\n return { ...usage.details };\n }\n return {\n input: usage.inputTokens,\n output: usage.outputTokens,\n total: usage.totalTokens,\n };\n}\n\nexport function usageDetailsFromRecord(usage: Record<string, unknown>): Record<string, number> {\n if (isRecord(usage.details)) {\n const details = Object.fromEntries(\n Object.entries(usage.details).filter(\n (entry): entry is [string, number] =>\n typeof entry[1] === \"number\" && Number.isFinite(entry[1]) && entry[1] >= 0,\n ),\n );\n if (Object.keys(details).length > 0) {\n return details;\n }\n }\n return {\n input: numberValue(usage.inputTokens) ?? 0,\n output: numberValue(usage.outputTokens) ?? 0,\n total:\n numberValue(usage.totalTokens) ??\n (numberValue(usage.inputTokens) ?? 0) + (numberValue(usage.outputTokens) ?? 0),\n };\n}\n\nexport function childMetadata(\n args: AgentToolStartArgs,\n agentId: string,\n agentName: string | undefined,\n childTurn: number,\n): Record<string, unknown> {\n return {\n source: \"agent_tool_event\",\n childAgentId: agentId,\n childAgentName: agentName,\n childTurn,\n parentToolName: args.toolName,\n parentInternalCallId: args.internalCallId,\n parentToolCallId: args.toolCallId,\n };\n}\n\nexport function generationKey(agentId: string, turn: number): string {\n return `${agentId}:${turn}`;\n}\n\nexport function agentLabel(agentId: string, agentName: string | undefined): string {\n return (agentName ?? agentId).replaceAll(/\\s+/g, \"_\");\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n\nexport function emptyToUndefined(value: string | undefined): string | undefined {\n return value === undefined || value.length === 0 ? undefined : value;\n}\n\n/**\n * Resolve an option value: prefer the explicit option, fall back to the\n * env var, and treat empty strings as missing. Empty env vars are common\n * when a process inherits a process manager that injects blank values.\n */\nexport function resolveOption(\n option: string | undefined,\n envVar: string | undefined,\n): string | undefined {\n return emptyToUndefined(option) ?? emptyToUndefined(envVar);\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { emptyToUndefined } from \"./helpers.js\";\n\nexport const langfuseResolvedConfigSymbol: unique symbol = Symbol.for(\n \"@anvia/langfuse.resolvedConfig\",\n);\n\nexport type LangfuseResolvedConfig = {\n publicKey?: string | undefined;\n secretKey?: string | undefined;\n baseUrl: string;\n environment?: string | undefined;\n release?: string | undefined;\n serviceName?: string | undefined;\n timeoutMs: number;\n};\n\nexport type LangfuseConfigOptions = {\n publicKey?: string | undefined;\n secretKey?: string | undefined;\n baseUrl?: string | undefined;\n environment?: string | undefined;\n release?: string | undefined;\n serviceName?: string | undefined;\n timeoutMs?: number | undefined;\n};\n\nexport type LangfuseResolvedConfigCarrier = {\n [langfuseResolvedConfigSymbol]?: LangfuseResolvedConfig | undefined;\n};\n\nexport function resolveLangfuseConfig(\n options: LangfuseConfigOptions = {},\n fallback?: Partial<LangfuseResolvedConfig> | undefined,\n): LangfuseResolvedConfig {\n return {\n publicKey: resolveStringOption(\n options.publicKey,\n fallback?.publicKey,\n process.env.LANGFUSE_PUBLIC_KEY,\n ),\n secretKey: resolveStringOption(\n options.secretKey,\n fallback?.secretKey,\n process.env.LANGFUSE_SECRET_KEY,\n ),\n baseUrl:\n resolveStringOption(options.baseUrl, fallback?.baseUrl, process.env.LANGFUSE_BASE_URL) ??\n \"https://cloud.langfuse.com\",\n environment: resolveStringOption(\n options.environment,\n fallback?.environment,\n process.env.LANGFUSE_TRACING_ENVIRONMENT,\n ),\n release: resolveStringOption(options.release, fallback?.release, process.env.LANGFUSE_RELEASE),\n serviceName: resolveStringOption(\n options.serviceName,\n fallback?.serviceName,\n process.env.LANGFUSE_SERVICE_NAME,\n ),\n timeoutMs: options.timeoutMs ?? fallback?.timeoutMs ?? 30_000,\n };\n}\n\nexport function getResolvedLangfuseConfig(value: unknown): LangfuseResolvedConfig | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n return (value as LangfuseResolvedConfigCarrier)[langfuseResolvedConfigSymbol];\n}\n\nfunction resolveStringOption(\n option: string | undefined,\n fallback: string | undefined,\n envVar: string | undefined,\n): string | undefined {\n return emptyToUndefined(option) ?? emptyToUndefined(fallback) ?? emptyToUndefined(envVar);\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport { getResolvedLangfuseConfig, resolveLangfuseConfig } from \"./config.js\";\nimport { LangfuseScoreError } from \"./scoring.js\";\nimport type {\n LangfuseDataset,\n LangfuseDatasetClient,\n LangfuseDatasetClientOptions,\n LangfuseDatasetItem,\n LangfuseRunExperimentOptions,\n LangfuseRunExperimentResult,\n LangfuseRunItemError,\n LangfuseScorer,\n} from \"./types.js\";\n\nconst DEFAULT_PAGE_SIZE = 50;\nconst MAX_PAGINATION_PAGES = 100;\n\nexport function createLangfuseDatasetClient(\n tracing: LangfuseScorer,\n options: LangfuseDatasetClientOptions = {},\n): LangfuseDatasetClient {\n const resolvedConfig = resolveLangfuseConfig(options, getResolvedLangfuseConfig(tracing));\n const baseUrl = resolvedConfig.baseUrl;\n const publicKey = resolvedConfig.publicKey;\n const secretKey = resolvedConfig.secretKey;\n const pageSize = options.pageSize ?? DEFAULT_PAGE_SIZE;\n const timeoutMs = resolvedConfig.timeoutMs;\n\n const fetchImpl: typeof fetch = (...args) => {\n const init: RequestInit = {};\n Object.assign(init, args[1]);\n init.signal = AbortSignal.timeout(timeoutMs);\n return fetch(args[0], init);\n };\n\n const authHeader = buildAuthHeader(publicKey, secretKey);\n\n async function request<T>(input: string, init: RequestInit): Promise<T> {\n const headers: Record<string, string> = {};\n Object.assign(headers, init.headers, authHeader);\n headers[\"Content-Type\"] = \"application/json\";\n const response = await fetchImpl(input, {\n ...init,\n headers,\n });\n if (!response.ok) {\n const body = await readErrorBody(response);\n throw new LangfuseScoreError(\n `Langfuse request failed: ${response.status} ${response.statusText}: ${body}`,\n [],\n );\n }\n if (response.status === 204) {\n return undefined as T;\n }\n return (await response.json()) as T;\n }\n\n return {\n async createDataset(dataset) {\n const url = `${baseUrl}/api/public/datasets/${encodeURIComponent(dataset.name)}`;\n await request<unknown>(url, {\n method: \"PUT\",\n body: JSON.stringify({\n name: dataset.name,\n description: dataset.description,\n metadata: dataset.metadata,\n }),\n });\n const result: LangfuseDataset<unknown, unknown> = {\n name: dataset.name,\n items: [],\n };\n if (dataset.description !== undefined) result.description = dataset.description;\n if (dataset.metadata !== undefined) result.metadata = dataset.metadata;\n return result;\n },\n\n async getDataset<Input, Expected>(options: {\n name: string;\n }): Promise<LangfuseDataset<Input, Expected>> {\n const { name } = options;\n const items: LangfuseDatasetItem<Input, Expected>[] = [];\n let description: string | undefined;\n let metadata: Record<string, JsonValue | undefined> | undefined;\n for (let page = 1; page <= MAX_PAGINATION_PAGES; page += 1) {\n const url = new URL(`${baseUrl}/api/public/datasets/${encodeURIComponent(name)}`);\n url.searchParams.set(\"page\", String(page));\n url.searchParams.set(\"limit\", String(pageSize));\n const response = await request<{\n name: string;\n description?: string | undefined;\n metadata?: Record<string, JsonValue | undefined> | undefined;\n items: Array<{\n id: string;\n input: Input;\n expected?: Expected | undefined;\n metadata?: Record<string, JsonValue | undefined> | undefined;\n }>;\n meta?: { totalPages?: number | undefined };\n }>(url.toString(), { method: \"GET\" });\n if (description === undefined && response.description !== undefined) {\n description = response.description;\n }\n if (metadata === undefined && response.metadata !== undefined) {\n metadata = response.metadata;\n }\n for (const item of response.items) {\n const normalized: LangfuseDatasetItem<Input, Expected> = {\n id: item.id,\n input: item.input,\n };\n if (item.expected !== undefined) normalized.expected = item.expected;\n if (item.metadata !== undefined) normalized.metadata = item.metadata;\n items.push(normalized);\n }\n const totalPages = response.meta?.totalPages;\n if (totalPages !== undefined && page >= totalPages) {\n break;\n }\n if (totalPages === undefined && response.items.length < pageSize) {\n break;\n }\n }\n const dataset: LangfuseDataset<Input, Expected> = {\n name,\n items,\n };\n if (description !== undefined) dataset.description = description;\n if (metadata !== undefined) dataset.metadata = metadata;\n return dataset;\n },\n\n async upsertItems<Input, Expected>(options: {\n name: string;\n items: readonly LangfuseDatasetItem<Input, Expected>[];\n }): Promise<void> {\n const { name, items } = options;\n const url = `${baseUrl}/api/public/datasets/${encodeURIComponent(name)}/items`;\n await request<unknown>(url, {\n method: \"POST\",\n body: JSON.stringify({ items }),\n });\n },\n\n async runExperiment<Input, Output, Expected>(\n opts: LangfuseRunExperimentOptions<Input, Output, Expected>,\n ): Promise<LangfuseRunExperimentResult> {\n let items = opts.items;\n if (items === undefined) {\n const dataset = await this.getDataset<Input, Expected>({ name: opts.datasetName });\n items = dataset.items;\n }\n if (items === undefined || items.length === 0) {\n return {\n runName: opts.runName,\n datasetName: opts.datasetName,\n posted: 0,\n errors: [],\n };\n }\n const datasetItemRuns: Array<{\n datasetItemId: string;\n traceId?: string;\n observationId?: string;\n output: JsonValue;\n }> = [];\n const errors: LangfuseRunItemError[] = [];\n for (const item of items) {\n try {\n const result = await opts.run(item);\n const datasetItemRun: (typeof datasetItemRuns)[number] = {\n datasetItemId: item.id,\n output: toJsonValue(result.output),\n };\n if (result.trace?.traceId !== undefined) datasetItemRun.traceId = result.trace.traceId;\n if (result.trace?.observationId !== undefined) {\n datasetItemRun.observationId = result.trace.observationId;\n }\n datasetItemRuns.push(datasetItemRun);\n } catch (error) {\n errors.push({ itemId: item.id, error });\n }\n }\n const url = `${baseUrl}/api/public/dataset-run-items`;\n const body: Record<string, unknown> = {\n runName: opts.runName,\n datasetItemRuns,\n };\n if (opts.description !== undefined) body.runDescription = opts.description;\n if (opts.metadata !== undefined) body.metadata = opts.metadata;\n await request<unknown>(url, {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n return {\n runName: opts.runName,\n datasetName: opts.datasetName,\n posted: datasetItemRuns.length,\n errors,\n };\n },\n };\n}\n\nfunction buildAuthHeader(\n publicKey: string | undefined,\n secretKey: string | undefined,\n): Record<string, string> {\n if (publicKey === undefined || secretKey === undefined) {\n return {};\n }\n const encoded = Buffer.from(`${publicKey}:${secretKey}`).toString(\"base64\");\n return { Authorization: `Basic ${encoded}` };\n}\n\nasync function readErrorBody(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return \"<unreadable>\";\n }\n}\n\nfunction toJsonValue(value: unknown): JsonValue {\n if (value === null) return null;\n if (typeof value === \"string\" || typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value;\n try {\n return JSON.parse(JSON.stringify(value)) as JsonValue;\n } catch {\n return String(value);\n }\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport {\n type EvalReportArgs,\n type EvalReporter,\n projectEvalOutcome,\n resolveEvalTraceRef,\n} from \"@anvia/core/evals\";\nimport type { LangfuseEvalReporterOptions, LangfuseScoreArgs, LangfuseScorer } from \"./types.js\";\n\nconst DEFAULT_TRUNCATE_BYTES = 2048;\n\nexport function createLangfuseEvalReporter<Input = unknown, Output = unknown, Expected = unknown>(\n tracing: LangfuseScorer,\n options: LangfuseEvalReporterOptions = {},\n): EvalReporter<Input, Output, Expected> {\n const onMissingTrace = options.onMissingTrace ?? \"ignore\";\n const traceObserver = options.traceObserver ?? \"langfuse\";\n const truncateAt = options.truncateInputAt ?? DEFAULT_TRUNCATE_BYTES;\n const includeMessages = options.includeMessages ?? true;\n const includeContext = options.includeContext ?? false;\n\n return {\n async report(args) {\n if (args.outcome.outcome === \"invalid\" && options.publishInvalid !== true) {\n return;\n }\n\n const trace =\n args.trace ??\n resolveEvalTraceRef({\n output: args.output,\n input: args.case.input,\n metadata: args.case.metadata,\n });\n if (\n trace?.traceId === undefined ||\n trace.traceId.length === 0 ||\n (trace.observer !== undefined && trace.observer !== traceObserver)\n ) {\n if (onMissingTrace === \"throw\") {\n throw new Error(\n `Langfuse eval reporter requires traceId from observer ${JSON.stringify(traceObserver)}`,\n );\n }\n if (onMissingTrace === \"warn\") {\n // eslint-disable-next-line no-console\n console.warn(\n \"[anvia/langfuse] eval reporter dropped score because no matching trace was found\",\n { caseId: args.case.id, metric: args.metric.name },\n );\n }\n return;\n }\n\n const projection = projectEvalOutcome(\n args.outcome,\n args.metric.dataType,\n args.metric.projectScore,\n );\n const metadata = buildScoreMetadata({\n args,\n truncateAt,\n includeMessages,\n includeContext,\n });\n const configId = resolveConfigId(args.metric);\n\n const score: LangfuseScoreArgs = {\n traceId: trace.traceId,\n name: args.metric.name,\n value: projection.value,\n };\n if (trace.observationId !== undefined) score.observationId = trace.observationId;\n if (args.metric.dataType !== undefined) score.dataType = args.metric.dataType;\n if (configId !== undefined) score.configId = configId;\n if (projection.explanation !== undefined) score.comment = projection.explanation;\n if (metadata !== undefined) score.metadata = metadata;\n await tracing.score(score);\n },\n };\n}\n\nfunction resolveConfigId(metric: {\n scoreConfigId?: string | undefined;\n configId?: string | undefined;\n}): string | undefined {\n return metric.configId ?? metric.scoreConfigId;\n}\n\nfunction buildScoreMetadata<Input, Output, Score, Expected>({\n args,\n truncateAt,\n includeMessages,\n includeContext,\n}: {\n args: EvalReportArgs<Input, Output, Score, Expected>;\n truncateAt: number;\n includeMessages: boolean;\n includeContext: boolean;\n}): Record<string, JsonValue | undefined> | undefined {\n const merged: Record<string, JsonValue | undefined> = {\n suiteName: args.suiteName,\n caseId: args.case.id,\n outcome: args.outcome.outcome,\n required: args.metric.required ?? true,\n };\n if (args.metric.direction !== undefined) merged.scoreDirection = args.metric.direction;\n if (args.metric.threshold !== undefined) merged.threshold = args.metric.threshold;\n if (args.outcome.usage !== undefined) merged.evaluationUsage = { ...args.outcome.usage };\n mergeMetadata(merged, args.outcome.metadata);\n mergeMetadata(merged, args.metric.metadata);\n if (args.case.metadata !== undefined) {\n merged.caseMetadata = { ...args.case.metadata };\n }\n if (includeContext && args.case.context !== undefined) {\n merged.context = [...args.case.context];\n }\n if (includeContext && args.case.retrievalContext !== undefined) {\n merged.retrievalContext = [...args.case.retrievalContext];\n }\n const inputSummary = truncateValue(args.case.input, truncateAt);\n if (inputSummary !== undefined) {\n merged.caseInputSummary = inputSummary;\n }\n if (args.case.expected !== undefined) {\n const expectedSummary = truncateValue(args.case.expected, truncateAt);\n if (expectedSummary !== undefined) {\n merged.caseExpectedSummary = expectedSummary;\n }\n }\n if (includeMessages) {\n const messages = readMessages(args.output);\n if (messages !== undefined) {\n merged.messages = messages;\n }\n }\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction mergeMetadata(\n target: Record<string, JsonValue | undefined>,\n source: Record<string, JsonValue | undefined> | undefined,\n): void {\n if (source === undefined) return;\n for (const [key, value] of Object.entries(source)) {\n target[key] = value;\n }\n}\n\nfunction truncateValue(value: unknown, maxBytes: number): string | undefined {\n if (value === undefined) return undefined;\n let serialized: string;\n try {\n serialized = typeof value === \"string\" ? value : JSON.stringify(value);\n } catch {\n return undefined;\n }\n if (serialized === undefined) return undefined;\n const encoder = new TextEncoder();\n const bytes = encoder.encode(serialized);\n if (bytes.length <= maxBytes) {\n return serialized;\n }\n // Truncate at byte boundary by slicing, then append the marker.\n const truncatedBytes = bytes.subarray(0, maxBytes);\n const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n return `${decoder.decode(truncatedBytes)}<truncated>`;\n}\n\nfunction readMessages(output: unknown): JsonValue[] | undefined {\n if (typeof output !== \"object\" || output === null) return undefined;\n const messages = (output as { messages?: unknown }).messages;\n if (!Array.isArray(messages)) return undefined;\n const serialized: JsonValue[] = [];\n for (const entry of messages) {\n if (entry === null || typeof entry !== \"object\") return undefined;\n try {\n // Round-trip via JSON to make sure we never put non-JSON values\n // into a JsonValue-typed slot.\n serialized.push(JSON.parse(JSON.stringify(entry)) as JsonValue);\n } catch {\n return undefined;\n }\n }\n return serialized;\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport type { EvalCaseResult, EvalSuiteResult, RunEvalSuiteOptions } from \"@anvia/core/evals\";\nimport { runEvalSuite } from \"@anvia/core/evals\";\nimport { createLangfuseEvalReporter } from \"./eval-reporter.js\";\nimport type {\n LangfuseDatasetClient,\n LangfuseDatasetClientOptions,\n LangfuseDatasetItem,\n LangfuseEvalReporterOptions,\n LangfuseRunExperimentOptions,\n LangfuseRunExperimentResult,\n LangfuseScorer,\n} from \"./types.js\";\n\nexport type LangfuseEvalExperimentOptions<Input, Output, Expected = unknown> = {\n suite: RunEvalSuiteOptions<Input, Output, Expected>;\n experiment: Omit<LangfuseRunExperimentOptions<Input, Output, Expected>, \"items\" | \"run\"> & {\n pageSize?: number | undefined;\n timeoutMs?: number | undefined;\n publishScores?: boolean | undefined;\n reporterOptions?: LangfuseEvalReporterOptions | undefined;\n includeContexts?: boolean | undefined;\n };\n};\n\nexport type LangfuseEvalExperimentResult<Input, Output, Expected = unknown> = {\n suite: EvalSuiteResult<Input, Output, Expected>;\n datasetRun: LangfuseRunExperimentResult;\n};\n\nexport async function runLangfuseEvalExperiment<Input, Output, Expected = unknown>(\n client: LangfuseScorer & {\n datasetClient(options?: LangfuseDatasetClientOptions): LangfuseDatasetClient;\n },\n options: LangfuseEvalExperimentOptions<Input, Output, Expected>,\n): Promise<LangfuseEvalExperimentResult<Input, Output, Expected>> {\n const evalOptions = options.suite;\n const experimentOptions = options.experiment;\n const clientOptions: LangfuseDatasetClientOptions = {};\n if (experimentOptions.pageSize !== undefined) clientOptions.pageSize = experimentOptions.pageSize;\n if (experimentOptions.timeoutMs !== undefined)\n clientOptions.timeoutMs = experimentOptions.timeoutMs;\n const datasetClient = client.datasetClient(clientOptions);\n\n const suiteOptions: RunEvalSuiteOptions<Input, Output, Expected> =\n experimentOptions.publishScores === true\n ? {\n ...evalOptions,\n reporters: [\n ...(evalOptions.reporters ?? []),\n createLangfuseEvalReporter<Input, Output, Expected>(\n client,\n experimentOptions.reporterOptions,\n ),\n ],\n }\n : evalOptions;\n const suite = await runEvalSuite(suiteOptions);\n\n const items: LangfuseDatasetItem<Input, Expected>[] = evalOptions.cases.map((testCase) => {\n const item: LangfuseDatasetItem<Input, Expected> = {\n id: testCase.id,\n input: testCase.input,\n };\n if (testCase.expected !== undefined) {\n item.expected = testCase.expected;\n }\n const metadata: Record<string, JsonValue | undefined> = {\n ...(testCase.metadata ?? {}),\n };\n if (experimentOptions.includeContexts === true && testCase.context !== undefined) {\n metadata.context = [...testCase.context];\n }\n if (experimentOptions.includeContexts === true && testCase.retrievalContext !== undefined) {\n metadata.retrievalContext = [...testCase.retrievalContext];\n }\n if (Object.keys(metadata).length > 0) {\n item.metadata = metadata;\n }\n return item;\n });\n\n const datasetItemMap = new Map<string, EvalCaseResult<Input, Output, Expected>>();\n for (const result of suite.results) {\n datasetItemMap.set(result.case.id, result);\n }\n\n const runOptions: LangfuseRunExperimentOptions<Input, Output, Expected> = {\n datasetName: experimentOptions.datasetName,\n runName: experimentOptions.runName,\n items,\n run: (item) => {\n const result = datasetItemMap.get(item.id);\n if (result === undefined) {\n return {\n output: undefined as Output,\n trace: undefined,\n };\n }\n const output = (result.output ?? undefined) as Output;\n const trace = readTraceFromOutput(result.output);\n return { output, trace };\n },\n };\n if (experimentOptions.description !== undefined) {\n runOptions.description = experimentOptions.description;\n }\n if (experimentOptions.metadata !== undefined) runOptions.metadata = experimentOptions.metadata;\n const datasetRun = await datasetClient.runExperiment<Input, Output, Expected>(runOptions);\n\n return { suite, datasetRun };\n}\n\nfunction readTraceFromOutput(\n output: unknown,\n): { traceId: string; observationId?: string | undefined } | undefined {\n if (typeof output !== \"object\" || output === null || !(\"trace\" in output)) {\n return undefined;\n }\n const trace = (output as { trace?: unknown }).trace;\n if (typeof trace !== \"object\" || trace === null) {\n return undefined;\n }\n const traceId = (trace as { traceId?: unknown }).traceId;\n if (typeof traceId !== \"string\") {\n return undefined;\n }\n const observationId = (trace as { observationId?: unknown }).observationId;\n if (typeof observationId === \"string\") {\n return { traceId, observationId };\n }\n return { traceId };\n}\n","import { getResolvedLangfuseConfig, resolveLangfuseConfig } from \"./config.js\";\nimport { LangfuseScoreError } from \"./scoring.js\";\nimport type {\n LangfuseChatMessage,\n LangfusePrompt,\n LangfusePromptClient,\n LangfusePromptClientOptions,\n LangfusePromptGetOptions,\n LangfuseScorer,\n} from \"./types.js\";\n\nconst DEFAULT_CACHE_TTL_MS = 60_000;\n\nexport function createLangfusePromptClient(\n tracing: LangfuseScorer,\n options: LangfusePromptClientOptions = {},\n): LangfusePromptClient {\n const resolvedConfig = resolveLangfuseConfig(options, getResolvedLangfuseConfig(tracing));\n const baseUrl = resolvedConfig.baseUrl;\n const publicKey = resolvedConfig.publicKey;\n const secretKey = resolvedConfig.secretKey;\n const defaultTtl = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;\n const timeoutMs = resolvedConfig.timeoutMs;\n\n const cache = new Map<string, { prompt: LangfusePrompt; expiresAt: number }>();\n const authHeader = buildAuthHeader(publicKey, secretKey);\n\n async function request<T>(input: string): Promise<T> {\n const response = await fetch(input, {\n method: \"GET\",\n headers: { ...authHeader },\n signal: AbortSignal.timeout(timeoutMs),\n });\n if (!response.ok) {\n const body = await readErrorBody(response);\n throw new LangfuseScoreError(\n `Langfuse request failed: ${response.status} ${response.statusText}: ${body}`,\n [],\n );\n }\n return (await response.json()) as T;\n }\n\n async function getPrompt(options: LangfusePromptGetOptions): Promise<LangfusePrompt> {\n const { name, ...opts } = options;\n const key = `${name}::${opts.version ?? \"\"}::${opts.label ?? \"\"}`;\n const ttl = opts.cacheTtlMs ?? defaultTtl;\n if (opts.refresh !== true) {\n const cached = cache.get(key);\n if (cached !== undefined && cached.expiresAt > Date.now()) {\n return cached.prompt;\n }\n }\n const url = new URL(`${baseUrl}/api/public/v2/prompts/${encodeURIComponent(name)}`);\n if (opts.version !== undefined) {\n url.searchParams.set(\"version\", String(opts.version));\n }\n if (opts.label !== undefined) {\n url.searchParams.set(\"label\", opts.label);\n }\n const raw = await request<{\n name: string;\n version: number;\n labels?: string[];\n prompt: unknown;\n type: \"text\" | \"chat\";\n tags?: string[];\n }>(url.toString());\n const prompt: LangfusePrompt = {\n name: raw.name,\n version: raw.version,\n labels: raw.labels ?? [],\n prompt: normalizePrompt(raw.prompt, raw.type),\n type: raw.type,\n resolvedAt: new Date(),\n };\n if (raw.tags !== undefined) prompt.tags = raw.tags;\n cache.set(key, { prompt, expiresAt: Date.now() + ttl });\n return prompt;\n }\n\n function getPromptText(options: LangfusePromptGetOptions): Promise<string> {\n return getPrompt(options).then((prompt) => {\n if (typeof prompt.prompt !== \"string\") {\n throw new Error(`Prompt ${options.name} is a chat prompt; expected text`);\n }\n return prompt.prompt;\n });\n }\n\n function getPromptChat(options: LangfusePromptGetOptions): Promise<LangfuseChatMessage[]> {\n return getPrompt(options).then((prompt) => {\n if (typeof prompt.prompt === \"string\") {\n throw new Error(`Prompt ${options.name} is a text prompt; expected chat`);\n }\n return prompt.prompt;\n });\n }\n\n function refresh(): void {\n cache.clear();\n }\n\n return { getPrompt, getPromptText, getPromptChat, refresh };\n}\n\nfunction normalizePrompt(raw: unknown, type: \"text\" | \"chat\"): string | LangfuseChatMessage[] {\n if (type === \"text\") {\n if (typeof raw === \"string\") return raw;\n throw new Error(\"Expected text prompt to be a string\");\n }\n if (!Array.isArray(raw)) {\n throw new Error(\"Expected chat prompt to be an array of messages\");\n }\n return raw.map((entry) => {\n if (typeof entry !== \"object\" || entry === null) {\n throw new Error(\"Expected chat message to be an object\");\n }\n const role = (entry as { role?: unknown }).role;\n const content = (entry as { content?: unknown }).content;\n if (typeof content !== \"string\") {\n throw new Error(\"Expected chat message content to be a string\");\n }\n if (role !== \"system\" && role !== \"user\" && role !== \"assistant\" && role !== \"tool\") {\n throw new Error(`Unexpected chat message role: ${String(role)}`);\n }\n return { role, content };\n });\n}\n\nfunction buildAuthHeader(\n publicKey: string | undefined,\n secretKey: string | undefined,\n): Record<string, string> {\n if (publicKey === undefined || secretKey === undefined) {\n return {};\n }\n const encoded = Buffer.from(`${publicKey}:${secretKey}`).toString(\"base64\");\n return { Authorization: `Basic ${encoded}` };\n}\n\nasync function readErrorBody(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return \"<unreadable>\";\n }\n}\n"],"mappings":"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","names":["result","options","trace","trace","buildAuthHeader","readErrorBody","options","buildScoreBody","trace"]}
1
+ {"version":3,"sources":["../src/redaction.ts","../src/scoring.ts","../src/tracing.ts","../src/capture.ts","../src/helpers.ts","../src/config.ts","../src/dataset-client.ts","../src/eval-reporter.ts","../src/experiment-runner.ts","../src/prompt-client.ts"],"sourcesContent":["import type { Message } from \"@anvia/core/completion\";\n\nexport type RedactorPattern = {\n name: string;\n regex: RegExp;\n};\n\nexport type LangfuseRedactionOptions = {\n patterns?: RedactorPattern[];\n replacement?: string;\n};\n\nexport type PiiRedactor = {\n redactString(input: string): string;\n redactObject<T>(input: T): T;\n redactMessages(input: Message[]): Message[];\n patternNames(): string[];\n};\n\nconst DEFAULT_REPLACEMENT = \"[REDACTED]\";\nconst MAX_DEPTH = 16;\n\nexport function createPiiRedactor(options: LangfuseRedactionOptions = {}): PiiRedactor {\n const patterns = options.patterns ?? DEFAULT_PATTERNS;\n const replacement = options.replacement ?? DEFAULT_REPLACEMENT;\n const compiled = patterns.map((p) => ({\n name: p.name,\n regex: cloneRegex(p.regex, \"g\"),\n }));\n const patternNamesList = patterns.map((p) => p.name);\n\n function redactString(input: string): string {\n if (typeof input !== \"string\") return input;\n let out = input;\n for (const { name, regex } of compiled) {\n out = applyPattern(out, name, regex, replacement);\n }\n return out;\n }\n\n function redactObject<T>(input: T): T {\n return redactValue(input, 0, redactString) as T;\n }\n\n function redactMessages(input: Message[]): Message[] {\n return input.map((message) => redactMessage(message, redactString));\n }\n\n function patternNames(): string[] {\n return patternNamesList;\n }\n\n return { redactString, redactObject, redactMessages, patternNames };\n}\n\nexport const DEFAULT_PATTERNS: RedactorPattern[] = [\n { name: \"email\", regex: /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}/g },\n { name: \"creditCard\", regex: /\\b(?:\\d[ -]?){13,19}\\b/g },\n { name: \"ipv4\", regex: /\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b/g },\n {\n name: \"phone\",\n regex:\n /(?<!\\d)(?:\\+\\d{1,3}[\\s.-]?)?(?:\\(\\d{2,4}\\)[\\s.-]?)?\\d{3,4}[\\s.-]?\\d{3,4}(?:[\\s.-]?\\d{3,4})?(?!\\d)/g,\n },\n { name: \"jwt\", regex: /\\beyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+/g },\n {\n name: \"apiKey\",\n regex: /\\b(?:sk|pk|api|key|token)[-_][A-Za-z0-9]{16,}\\b/gi,\n },\n];\n\nfunction applyPattern(input: string, name: string, regex: RegExp, replacement: string): string {\n if (name === \"creditCard\") {\n return redactCreditCards(input, replacement);\n }\n return input.replace(regex, replacement);\n}\n\nfunction redactCreditCards(input: string, replacement: string): string {\n let out = \"\";\n let i = 0;\n while (i < input.length) {\n const ch = input.charAt(i);\n if (/\\d/.test(ch)) {\n const { length, valid } = longestLuhnChunk(input.slice(i));\n if (valid) {\n out += replacement;\n i += length;\n continue;\n }\n }\n out += ch;\n i += 1;\n }\n return out;\n}\n\nfunction longestLuhnChunk(s: string): { length: number; valid: boolean } {\n let length = 0;\n let bestValid = 0;\n while (length < s.length && length < 40) {\n const ch = s.charAt(length);\n if (!/\\d/.test(ch) && ch !== \"-\") break;\n length += 1;\n const candidate = s.slice(0, length).replace(/\\D/g, \"\");\n if (candidate.length >= 13 && candidate.length <= 19) {\n if (startsWithKnownPrefix(candidate) && passesLuhn(candidate)) {\n bestValid = length;\n }\n }\n }\n return { length: bestValid, valid: bestValid > 0 };\n}\n\nfunction startsWithKnownPrefix(digits: string): boolean {\n if (digits.startsWith(\"4\")) return true;\n const two = digits.slice(0, 2);\n if (two === \"51\" || two === \"52\" || two === \"53\" || two === \"54\" || two === \"55\") return true;\n const four = digits.slice(0, 4);\n if (four === \"2221\" || four === \"2720\") return true;\n const twoAgain = digits.slice(0, 2);\n if (twoAgain === \"34\" || twoAgain === \"37\") return true;\n if (four === \"6011\" || twoAgain === \"65\") return true;\n return digits.startsWith(\"35\");\n}\n\nexport function passesLuhn(digits: string): boolean {\n if (!/^\\d+$/.test(digits)) return false;\n let sum = 0;\n let alt = false;\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n const raw = digits.charCodeAt(i) - 48;\n let value = raw;\n if (alt) {\n value *= 2;\n if (value > 9) value -= 9;\n }\n sum += value;\n alt = !alt;\n }\n return sum % 10 === 0;\n}\n\nfunction cloneRegex(source: RegExp, flags: string): RegExp {\n return new RegExp(source.source, flags + source.flags.replace(/g/g, \"\"));\n}\n\nfunction redactValue(\n value: unknown,\n depth: number,\n redactStringFn: (s: string) => string,\n): unknown {\n if (depth > MAX_DEPTH) return value;\n if (typeof value === \"string\") {\n return isBase64DataUrl(value) ? value : redactStringFn(value);\n }\n if (Array.isArray(value))\n return value.map((entry) => redactValue(entry, depth + 1, redactStringFn));\n if (value !== null && typeof value === \"object\") {\n if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n return value;\n }\n const record = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(record)) {\n if (\n key === \"data\" &&\n typeof entry === \"string\" &&\n (record.type === \"base64\" ||\n record.type === \"image\" ||\n record.type === \"encrypted\" ||\n record.type === \"redacted\")\n ) {\n out[key] = entry;\n } else {\n out[key] = redactValue(entry, depth + 1, redactStringFn);\n }\n }\n return out;\n }\n return value;\n}\n\nfunction redactMessage(message: Message, redactStringFn: (s: string) => string): Message {\n if (message.role === \"system\") {\n return { ...message, content: redactStringFn(message.content) };\n }\n return {\n ...message,\n content: redactMessageContent(message.content, redactStringFn) as never,\n };\n}\n\nfunction redactMessageContent(value: unknown, redactStringFn: (s: string) => string): unknown {\n return redactValue(value, 0, redactStringFn);\n}\n\nfunction isBase64DataUrl(value: string): boolean {\n return /^data:[^;,]+;base64,/i.test(value);\n}\n","import type { LangfuseScoreArgs } from \"./types.js\";\n\nexport class LangfuseScoreError extends Error {\n readonly scores: LangfuseScoreArgs[];\n override readonly cause?: unknown;\n\n constructor(message: string, scores: LangfuseScoreArgs[], cause?: unknown) {\n super(message);\n this.name = \"LangfuseScoreError\";\n this.scores = scores;\n if (cause !== undefined) {\n this.cause = cause;\n }\n }\n}\n\nclass RetryableLangfuseScoreError extends LangfuseScoreError {}\n\nexport type ScoreQueueOptions = {\n baseUrl: string;\n publicKey: string;\n secretKey: string;\n timeoutMs: number;\n batchSize: number;\n flushIntervalMs: number;\n maxAttempts: number;\n fetchImpl?: typeof fetch;\n sleep?: (ms: number) => Promise<void>;\n setTimer?: (handler: () => void, ms: number) => unknown;\n clearTimer?: (handle: unknown) => void;\n};\n\nconst defaultSleep = (ms: number): Promise<void> =>\n new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n\nconst defaultSetTimer = (handler: () => void, ms: number): unknown => setTimeout(handler, ms);\nconst defaultClearTimer = (handle: unknown): void => {\n clearTimeout(handle as ReturnType<typeof setTimeout>);\n};\n\nexport function computeBackoff(attempt: number, jitter: number = Math.random()): number {\n const base = 200;\n const exponential = base * 2 ** attempt;\n const capped = Math.min(exponential, 5_000);\n const jitterAmount = capped * 0.25 * (jitter * 2 - 1);\n return Math.max(0, Math.round(capped + jitterAmount));\n}\n\nexport class ScoreQueue {\n private readonly pending: LangfuseScoreArgs[] = [];\n private timer: unknown = null;\n private flushing: Promise<void> | null = null;\n private closed = false;\n private readonly baseUrl: string;\n private readonly publicKey: string;\n private readonly secretKey: string;\n private readonly timeoutMs: number;\n private readonly batchSize: number;\n private readonly flushIntervalMs: number;\n private readonly maxAttempts: number;\n private readonly fetchImpl: typeof fetch;\n private readonly sleep: (ms: number) => Promise<void>;\n private readonly setTimer: (handler: () => void, ms: number) => unknown;\n private readonly clearTimer: (handle: unknown) => void;\n\n constructor(options: ScoreQueueOptions) {\n this.baseUrl = options.baseUrl;\n this.publicKey = options.publicKey;\n this.secretKey = options.secretKey;\n this.timeoutMs = options.timeoutMs;\n this.batchSize = options.batchSize;\n this.flushIntervalMs = options.flushIntervalMs;\n this.maxAttempts = options.maxAttempts;\n this.fetchImpl = options.fetchImpl ?? fetch;\n this.sleep = options.sleep ?? defaultSleep;\n this.setTimer = options.setTimer ?? defaultSetTimer;\n this.clearTimer = options.clearTimer ?? defaultClearTimer;\n }\n\n enqueue(score: LangfuseScoreArgs): void {\n if (this.closed) {\n throw new Error(\"Langfuse score queue is shut down\");\n }\n this.pending.push(score);\n if (this.pending.length >= this.batchSize) {\n this.triggerBackgroundFlush();\n return;\n }\n this.scheduleTimer();\n }\n\n depth(): number {\n return this.pending.length;\n }\n\n async flush(): Promise<void> {\n this.clearScheduledTimer();\n while (true) {\n if (this.flushing !== null) {\n await this.flushing;\n if (this.pending.length === 0) {\n return;\n }\n continue;\n }\n if (this.pending.length === 0) {\n return;\n }\n const draining = this.drain();\n this.flushing = draining;\n try {\n await draining;\n } finally {\n if (this.flushing === draining) {\n this.flushing = null;\n }\n }\n }\n }\n\n async shutdown(): Promise<void> {\n this.closed = true;\n this.clearScheduledTimer();\n await this.flush();\n }\n\n private scheduleTimer(): void {\n if (this.timer !== null) {\n return;\n }\n this.timer = this.setTimer(() => {\n this.timer = null;\n this.triggerBackgroundFlush();\n }, this.flushIntervalMs);\n }\n\n private triggerBackgroundFlush(): void {\n void this.flush().catch(() => {});\n }\n\n private clearScheduledTimer(): void {\n if (this.timer !== null) {\n this.clearTimer(this.timer);\n this.timer = null;\n }\n }\n\n private async sendBatch(scores: LangfuseScoreArgs[]): Promise<void> {\n const body = scores.map((score) => buildScoreBody(score));\n let lastError: unknown;\n for (let attempt = 0; attempt < this.maxAttempts; attempt += 1) {\n try {\n const response = await this.fetchImpl(`${this.baseUrl}/api/public/scores`, {\n method: \"POST\",\n headers: {\n Authorization: `Basic ${Buffer.from(`${this.publicKey}:${this.secretKey}`).toString(\"base64\")}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n if (response.ok) {\n return;\n }\n if (response.status === 429 || response.status >= 500) {\n lastError = new Error(`Langfuse score batch failed with HTTP ${response.status}`);\n } else {\n const text = await response.text();\n throw new LangfuseScoreError(\n `Langfuse score batch failed with HTTP ${response.status}: ${text}`,\n scores,\n );\n }\n } catch (error) {\n if (error instanceof LangfuseScoreError) {\n throw error;\n }\n lastError = error;\n }\n if (attempt < this.maxAttempts - 1) {\n await this.sleep(computeBackoff(attempt));\n }\n }\n throw new RetryableLangfuseScoreError(\n `Langfuse score batch failed after ${this.maxAttempts} attempts`,\n scores,\n lastError,\n );\n }\n\n private async drain(): Promise<void> {\n let permanentError: LangfuseScoreError | undefined;\n while (this.pending.length > 0) {\n const batch = this.pending.splice(0, this.batchSize);\n try {\n await this.sendBatch(batch);\n } catch (error) {\n if (error instanceof RetryableLangfuseScoreError) {\n this.pending.unshift(...batch);\n throw error;\n }\n if (error instanceof LangfuseScoreError) {\n permanentError ??= error;\n continue;\n }\n this.pending.unshift(...batch);\n throw error;\n }\n }\n if (permanentError !== undefined) {\n throw permanentError;\n }\n }\n}\n\nfunction buildScoreBody(score: LangfuseScoreArgs): Record<string, unknown> {\n const body: Record<string, unknown> = {\n traceId: score.traceId,\n name: score.name,\n value: score.value,\n };\n if (score.observationId !== undefined) body.observationId = score.observationId;\n if (score.dataType !== undefined) body.dataType = score.dataType;\n if (score.comment !== undefined) body.comment = score.comment;\n if (score.metadata !== undefined) body.metadata = score.metadata;\n const configId = score.configId ?? score.scoreConfigId;\n if (configId !== undefined) body.configId = configId;\n if (score.environment !== undefined) body.environment = score.environment;\n if (score.timestamp !== undefined) {\n body.timestamp =\n score.timestamp instanceof Date ? score.timestamp.toISOString() : score.timestamp;\n }\n return body;\n}\n","import type { Message } from \"@anvia/core/completion\";\nimport type { EvalReporter } from \"@anvia/core/evals\";\nimport type {\n AgentGenerationEndArgs,\n AgentGenerationErrorArgs,\n AgentGenerationObserver,\n AgentGenerationStartArgs,\n AgentGenerationUpdateArgs,\n AgentObserver,\n AgentObserverTraceInfo,\n AgentRunEndArgs,\n AgentRunErrorArgs,\n AgentRunEventArgs,\n AgentRunObserver,\n AgentRunPromptRef,\n AgentRunStartArgs,\n AgentToolEndArgs,\n AgentToolErrorArgs,\n AgentToolObserver,\n AgentToolStartArgs,\n AgentToolStreamEventArgs,\n AgentToolSuspendedArgs,\n} from \"@anvia/core/observability\";\nimport { LangfuseSpanProcessor } from \"@langfuse/otel\";\nimport {\n LangfuseAgent,\n LangfuseEvent,\n type LangfuseEventAttributes,\n LangfuseGeneration,\n type LangfuseGenerationAttributes,\n LangfuseGuardrail,\n LangfuseOtelSpanAttributes,\n LangfuseSpan,\n LangfuseTool,\n} from \"@langfuse/tracing\";\nimport {\n ROOT_CONTEXT,\n type Span,\n type SpanContext,\n TraceFlags,\n type Tracer,\n trace,\n} from \"@opentelemetry/api\";\nimport { resourceFromAttributes } from \"@opentelemetry/resources\";\nimport { NodeTracerProvider } from \"@opentelemetry/sdk-trace-node\";\nimport { SEMRESATTRS_SERVICE_NAME } from \"@opentelemetry/semantic-conventions\";\nimport { sanitizeTraceValue, validateCaptureMaxBytes } from \"./capture.js\";\nimport {\n type LangfuseResolvedConfig,\n langfuseResolvedConfigSymbol,\n resolveLangfuseConfig,\n} from \"./config.js\";\nimport { createLangfuseDatasetClient } from \"./dataset-client.js\";\nimport { createLangfuseEvalReporter } from \"./eval-reporter.js\";\nimport {\n type LangfuseEvalExperimentOptions,\n type LangfuseEvalExperimentResult,\n runLangfuseEvalExperiment,\n} from \"./experiment-runner.js\";\nimport {\n agentLabel,\n childMetadata,\n errorMessage,\n generationKey,\n isRecord,\n modelInputMessage,\n modelInputMessages,\n modelParameters,\n usageDetails,\n usageDetailsFromRecord,\n} from \"./helpers.js\";\nimport { createLangfusePromptClient } from \"./prompt-client.js\";\nimport { createPiiRedactor, type PiiRedactor } from \"./redaction.js\";\nimport { ScoreQueue } from \"./scoring.js\";\nimport type {\n LangfuseCaptureMode,\n LangfuseClientOptions,\n LangfuseDatasetClient,\n LangfuseDatasetClientOptions,\n LangfuseDatasetItem,\n LangfuseEvalReporterOptions,\n LangfuseObserverOptions,\n LangfusePromptClient,\n LangfusePromptClientOptions,\n LangfuseRedactionMode,\n LangfuseRunExperimentOptions,\n LangfuseScoreArgs,\n} from \"./types.js\";\n\ntype LangfuseResources = {\n readonly processor: LangfuseSpanProcessor;\n readonly provider: NodeTracerProvider;\n readonly observations: LangfuseObservationFactory;\n readonly queue: ScoreQueue | null;\n};\n\ntype LangfuseCapture = {\n readonly redactor: PiiRedactor | undefined;\n readonly redactInputs: LangfuseRedactionMode | undefined;\n readonly redactOutputs: LangfuseRedactionMode | undefined;\n readonly captureMode: LangfuseCaptureMode;\n readonly captureMaxBytes: number;\n};\n\ntype LangfuseParent = { readonly otelSpan: Span } | SpanContext;\n\nclass LangfuseObservationFactory {\n constructor(private readonly tracer: Tracer) {}\n\n agent(\n name: string,\n attributes: Parameters<LangfuseAgent[\"update\"]>[0],\n parent?: LangfuseParent | undefined,\n ): LangfuseAgent {\n return new LangfuseAgent({ otelSpan: this.startSpan(name, parent), attributes });\n }\n\n span(\n name: string,\n attributes: Parameters<LangfuseSpan[\"update\"]>[0],\n parent: LangfuseParent,\n ): LangfuseSpan {\n return new LangfuseSpan({ otelSpan: this.startSpan(name, parent), attributes });\n }\n\n generation(\n name: string,\n attributes: LangfuseGenerationAttributes,\n parent: LangfuseParent,\n ): LangfuseGeneration {\n return new LangfuseGeneration({ otelSpan: this.startSpan(name, parent), attributes });\n }\n\n tool(\n name: string,\n attributes: Parameters<LangfuseTool[\"update\"]>[0],\n parent: LangfuseParent,\n ): LangfuseTool {\n return new LangfuseTool({ otelSpan: this.startSpan(name, parent), attributes });\n }\n\n guardrail(\n name: string,\n attributes: Parameters<LangfuseGuardrail[\"update\"]>[0],\n parent: LangfuseParent,\n ): LangfuseGuardrail {\n return new LangfuseGuardrail({ otelSpan: this.startSpan(name, parent), attributes });\n }\n\n event(\n name: string,\n attributes: LangfuseEventAttributes,\n parent: LangfuseParent,\n timestamp?: Date | undefined,\n ): LangfuseEvent {\n const endTime = timestamp ?? new Date();\n return new LangfuseEvent({\n otelSpan: this.startSpan(name, parent, timestamp),\n attributes,\n timestamp: endTime,\n });\n }\n\n private startSpan(name: string, parent?: LangfuseParent, startTime?: Date): Span {\n const parentContext =\n parent === undefined\n ? ROOT_CONTEXT\n : \"otelSpan\" in parent\n ? trace.setSpan(ROOT_CONTEXT, parent.otelSpan)\n : trace.setSpanContext(ROOT_CONTEXT, parent);\n return this.tracer.startSpan(name, startTime === undefined ? {} : { startTime }, parentContext);\n }\n}\n\nexport class LangfuseClient {\n readonly [langfuseResolvedConfigSymbol]: LangfuseResolvedConfig;\n private readonly publicKey: string | undefined;\n private readonly secretKey: string | undefined;\n private readonly baseUrl: string;\n private readonly serviceName: string | undefined;\n private readonly timeoutMs: number;\n private readonly options: LangfuseClientOptions;\n private resource: LangfuseResources | undefined;\n private initialization: Promise<LangfuseResources> | undefined;\n private closePromise: Promise<void> | undefined;\n private closed = false;\n\n constructor(options: LangfuseClientOptions = {}) {\n this.options = options;\n const resolvedConfig = resolveLangfuseConfig(options);\n this[langfuseResolvedConfigSymbol] = resolvedConfig;\n this.publicKey = resolvedConfig.publicKey;\n this.secretKey = resolvedConfig.secretKey;\n this.baseUrl = resolvedConfig.baseUrl;\n this.serviceName = resolvedConfig.serviceName;\n this.timeoutMs = resolvedConfig.timeoutMs;\n }\n\n observer(options: LangfuseObserverOptions = {}): AgentObserver {\n this.assertOpen();\n return new LangfuseAgentObserver(this, resolveLangfuseCapture(options));\n }\n\n evalReporter<Input = unknown, Output = unknown, Expected = unknown>(\n options: LangfuseEvalReporterOptions = {},\n ): EvalReporter<Input, Output, Expected> {\n this.assertOpen();\n const reporter = createLangfuseEvalReporter<Input, Output, Expected>(this, options);\n return {\n report: (args) => {\n this.assertOpen();\n return reporter.report(args);\n },\n };\n }\n\n promptClient(options: LangfusePromptClientOptions = {}): LangfusePromptClient {\n this.assertOpen();\n const prompts = createLangfusePromptClient(this, options);\n return {\n getPrompt: (getOptions) => {\n this.assertOpen();\n return prompts.getPrompt(getOptions);\n },\n getPromptText: (getOptions) => {\n this.assertOpen();\n return prompts.getPromptText(getOptions);\n },\n getPromptChat: (getOptions) => {\n this.assertOpen();\n return prompts.getPromptChat(getOptions);\n },\n refresh: () => {\n this.assertOpen();\n prompts.refresh();\n },\n };\n }\n\n datasetClient(options: LangfuseDatasetClientOptions = {}): LangfuseDatasetClient {\n this.assertOpen();\n const datasets = createLangfuseDatasetClient(this, options);\n const client = this;\n return {\n createDataset(dataset) {\n client.assertOpen();\n return datasets.createDataset(dataset);\n },\n getDataset<Input, Expected>(getOptions: { name: string }) {\n client.assertOpen();\n return datasets.getDataset<Input, Expected>(getOptions);\n },\n upsertItems<Input, Expected>(upsertOptions: {\n name: string;\n items: readonly LangfuseDatasetItem<Input, Expected>[];\n }) {\n client.assertOpen();\n return datasets.upsertItems(upsertOptions);\n },\n runExperiment<Input, Output, Expected>(\n experimentOptions: LangfuseRunExperimentOptions<Input, Output, Expected>,\n ) {\n client.assertOpen();\n return datasets.runExperiment<Input, Output, Expected>(experimentOptions);\n },\n };\n }\n\n runEvalExperiment<Input, Output, Expected = unknown>(\n options: LangfuseEvalExperimentOptions<Input, Output, Expected>,\n ): Promise<LangfuseEvalExperimentResult<Input, Output, Expected>> {\n this.assertOpen();\n return runLangfuseEvalExperiment(this, options);\n }\n\n async startObservedRun(\n args: AgentRunStartArgs,\n capture: LangfuseCapture,\n ): Promise<AgentRunObserver> {\n const resource = await this.resources();\n const traceId = args.trace?.traceId;\n const capturedInput = captureInput(\n {\n instructions: args.instructions,\n prompt: args.prompt,\n history: args.history,\n },\n capture,\n );\n const capturedTraceMetadata = captureInput(args.trace?.metadata ?? {}, capture);\n const metadata: Record<string, unknown> = {\n agentName: args.agentName,\n agentDescription: args.agentDescription,\n maxTurns: args.maxTurns,\n };\n if (this.serviceName !== undefined) metadata.serviceName = this.serviceName;\n if (isRecord(capturedTraceMetadata)) {\n Object.assign(metadata, capturedTraceMetadata);\n } else {\n metadata.traceMetadata = capturedTraceMetadata;\n }\n const rootAttributes: Parameters<LangfuseAgent[\"update\"]>[0] = {\n input: capturedInput,\n metadata,\n };\n if (args.trace?.version !== undefined) rootAttributes.version = args.trace.version;\n const root = resource.observations.agent(\n args.agentName ?? \"agent.run\",\n rootAttributes,\n traceId === undefined\n ? undefined\n : {\n traceId,\n spanId: \"0000000000000001\",\n traceFlags: TraceFlags.SAMPLED,\n },\n );\n applyTraceAttributes(root, args, capturedTraceMetadata);\n return new LangfuseRunObserver(\n root,\n resource.observations,\n { traceId: root.traceId, observationId: root.id },\n resolvePromptRef(args),\n capture,\n );\n }\n\n async flush(): Promise<void> {\n this.assertOpen();\n const resource =\n this.resource ?? (this.initialization === undefined ? undefined : await this.initialization);\n if (resource === undefined) return;\n await resource.queue?.flush();\n await resource.processor.forceFlush();\n }\n\n close(): Promise<void> {\n this.closePromise ??= this.closeResources();\n return this.closePromise;\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.close();\n }\n\n scoreQueueDepth(): number {\n return this.resource?.queue?.depth() ?? 0;\n }\n\n async score(args: LangfuseScoreArgs): Promise<void> {\n if (args.traceId === undefined || args.traceId.length === 0) {\n throw new Error(\"Langfuse score requires traceId\");\n }\n if (this.publicKey === undefined || this.secretKey === undefined) {\n throw new Error(\"Langfuse score requires publicKey and secretKey\");\n }\n assertScoreValue(args.value, args.dataType);\n const resource = await this.resources();\n if (resource.queue !== null) {\n resource.queue.enqueue(args);\n return;\n }\n await this.sendScore(args);\n }\n\n private resources(): Promise<LangfuseResources> {\n this.assertOpen();\n if (this.resource !== undefined) return Promise.resolve(this.resource);\n this.initialization ??= this.createResources()\n .then((resource) => {\n this.resource = resource;\n return resource;\n })\n .catch((error: unknown) => {\n this.initialization = undefined;\n throw error;\n });\n return this.initialization;\n }\n\n private async createResources(): Promise<LangfuseResources> {\n const resolvedConfig = this[langfuseResolvedConfigSymbol];\n const processorOptions: ConstructorParameters<typeof LangfuseSpanProcessor>[0] = {\n baseUrl: this.baseUrl,\n };\n if (this.publicKey !== undefined) processorOptions.publicKey = this.publicKey;\n if (this.secretKey !== undefined) processorOptions.secretKey = this.secretKey;\n if (resolvedConfig.environment !== undefined) {\n processorOptions.environment = resolvedConfig.environment;\n }\n if (resolvedConfig.release !== undefined) processorOptions.release = resolvedConfig.release;\n const processor = new LangfuseSpanProcessor(processorOptions);\n const providerOptions: ConstructorParameters<typeof NodeTracerProvider>[0] = {\n spanProcessors: [processor],\n };\n if (this.serviceName !== undefined) {\n providerOptions.resource = resourceFromAttributes({\n [SEMRESATTRS_SERVICE_NAME]: this.serviceName,\n });\n }\n let provider: NodeTracerProvider;\n try {\n provider = new NodeTracerProvider(providerOptions);\n } catch (error) {\n await processor.shutdown().catch(() => undefined);\n throw error;\n }\n try {\n const batchSize = this.options.scores?.batchSize ?? 0;\n const queue =\n batchSize > 0 && this.publicKey !== undefined && this.secretKey !== undefined\n ? new ScoreQueue({\n baseUrl: this.baseUrl,\n publicKey: this.publicKey,\n secretKey: this.secretKey,\n timeoutMs: this.timeoutMs,\n batchSize,\n flushIntervalMs: this.options.scores?.flushIntervalMs ?? 250,\n maxAttempts: scoreMaxAttempts(this.options.scores?.retries),\n })\n : null;\n return {\n processor,\n provider,\n observations: new LangfuseObservationFactory(\n provider.getTracer(\"@anvia/langfuse\", \"1.0.0\"),\n ),\n queue,\n };\n } catch (error) {\n await provider.shutdown().catch(() => undefined);\n throw error;\n }\n }\n\n private async closeResources(): Promise<void> {\n this.closed = true;\n const pending =\n this.resource === undefined ? this.initialization : Promise.resolve(this.resource);\n if (pending === undefined) return;\n let resource: LangfuseResources;\n try {\n resource = await pending;\n } catch {\n return;\n }\n const settled = await Promise.allSettled([\n resource.queue?.shutdown() ?? Promise.resolve(),\n resource.provider.shutdown(),\n ]);\n const failures = settled.flatMap((result) =>\n result.status === \"rejected\" ? [result.reason] : [],\n );\n if (failures.length > 0) {\n throw new AggregateError(failures, \"Failed to close LangfuseClient.\");\n }\n }\n\n private assertOpen(): void {\n if (this.closed) throw new Error(\"LangfuseClient is closed.\");\n }\n\n private async sendScore(args: LangfuseScoreArgs): Promise<void> {\n const body = buildScoreBody(args);\n const response = await fetch(`${this.baseUrl}/api/public/scores`, {\n method: \"POST\",\n headers: {\n Authorization: `Basic ${Buffer.from(`${this.publicKey}:${this.secretKey}`).toString(\"base64\")}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n if (!response.ok) {\n throw new Error(\n `Langfuse score failed with HTTP ${response.status}: ${await response.text()}`,\n );\n }\n }\n}\n\nclass LangfuseAgentObserver implements AgentObserver {\n constructor(\n private readonly client: LangfuseClient,\n private readonly capture: LangfuseCapture,\n ) {}\n\n startRun(args: AgentRunStartArgs): Promise<AgentRunObserver> {\n return this.client.startObservedRun(args, this.capture);\n }\n}\n\nfunction resolveLangfuseCapture(options: LangfuseObserverOptions): LangfuseCapture {\n return {\n redactor:\n options.redactInputs !== undefined || options.redactOutputs !== undefined\n ? createPiiRedactor(options.redaction)\n : undefined,\n redactInputs: options.redactInputs,\n redactOutputs: options.redactOutputs,\n captureMode: options.captureMode ?? \"safe\",\n captureMaxBytes: validateCaptureMaxBytes(options.captureMaxBytes),\n };\n}\n\nfunction captureInput<T>(value: T, capture: LangfuseCapture): unknown {\n const redacted =\n capture.redactor === undefined || capture.redactInputs === undefined\n ? value\n : applyRedaction(capture.redactor, value, capture.redactInputs);\n return sanitizeTraceValue(redacted, capture.captureMaxBytes);\n}\n\nfunction scoreMaxAttempts(retries: { maxAttempts: number } | undefined): number {\n if (retries === undefined) return 3;\n if (!Number.isSafeInteger(retries.maxAttempts) || retries.maxAttempts < 1) {\n throw new TypeError(\"Langfuse score retries.maxAttempts must be a positive integer.\");\n }\n return retries.maxAttempts;\n}\n\nfunction assertScoreValue(value: number | string, dataType: LangfuseScoreArgs[\"dataType\"]): void {\n if (dataType === \"NUMERIC\") {\n if (typeof value !== \"number\") {\n throw new TypeError(`Langfuse score dataType=NUMERIC requires a number value`);\n }\n return;\n }\n if (dataType === \"CATEGORICAL\") {\n if (typeof value !== \"string\") {\n throw new TypeError(`Langfuse score dataType=CATEGORICAL requires a string value`);\n }\n return;\n }\n if (dataType === \"BOOLEAN\") {\n if (value !== 0 && value !== 1) {\n throw new TypeError(`Langfuse score dataType=BOOLEAN requires value 0 or 1`);\n }\n return;\n }\n}\n\nfunction buildScoreBody(score: LangfuseScoreArgs): Record<string, unknown> {\n const body: Record<string, unknown> = {\n traceId: score.traceId,\n name: score.name,\n value: score.value,\n };\n if (score.observationId !== undefined) body.observationId = score.observationId;\n if (score.dataType !== undefined) body.dataType = score.dataType;\n if (score.comment !== undefined) body.comment = score.comment;\n if (score.metadata !== undefined) body.metadata = score.metadata;\n const configId = score.configId ?? score.scoreConfigId;\n if (configId !== undefined) body.configId = configId;\n if (score.environment !== undefined) body.environment = score.environment;\n if (score.timestamp !== undefined) {\n body.timestamp =\n score.timestamp instanceof Date ? score.timestamp.toISOString() : score.timestamp;\n }\n return body;\n}\n\nfunction applyTraceAttributes(\n root: LangfuseAgent,\n args: AgentRunStartArgs,\n capturedMetadata: unknown,\n): void {\n const traceName = args.trace?.name ?? args.agentName;\n if (traceName !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_NAME, traceName);\n }\n if (args.trace?.userId !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_USER_ID, args.trace.userId);\n }\n if (args.trace?.sessionId !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_SESSION_ID, args.trace.sessionId);\n }\n if (args.trace?.tags !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_TAGS, [...args.trace.tags]);\n }\n for (const [key, value] of Object.entries(\n isRecord(capturedMetadata) ? capturedMetadata : { value: capturedMetadata },\n )) {\n const serialized = serializeMetadataValue(value);\n if (serialized === undefined) {\n continue;\n }\n root.otelSpan.setAttribute(`${LangfuseOtelSpanAttributes.TRACE_METADATA}.${key}`, serialized);\n }\n const promptRef = resolvePromptRef(args);\n if (promptRef !== undefined) {\n root.otelSpan.setAttribute(\n `${LangfuseOtelSpanAttributes.TRACE_METADATA}.promptName`,\n promptRef.name,\n );\n if (promptRef.version !== undefined) {\n root.otelSpan.setAttribute(\n `${LangfuseOtelSpanAttributes.TRACE_METADATA}.promptVersion`,\n String(promptRef.version),\n );\n }\n }\n}\n\nfunction applyRedaction<T>(redactor: PiiRedactor, value: T, mode: LangfuseRedactionMode): T {\n if (mode === \"deep\") {\n return redactor.redactObject(value);\n }\n if (typeof value === \"string\") {\n return redactor.redactString(value) as unknown as T;\n }\n if (value !== null && typeof value === \"object\") {\n return redactor.redactObject(value);\n }\n return value;\n}\n\nfunction resolvePromptRef(args: AgentRunStartArgs): AgentRunPromptRef | undefined {\n if (args.promptRef !== undefined) {\n return args.promptRef;\n }\n if (args.trace?.promptRef !== undefined) {\n return args.trace.promptRef;\n }\n const metadata = args.trace?.metadata;\n if (metadata === undefined) {\n return undefined;\n }\n const name = metadata.promptName;\n if (typeof name !== \"string\" || name.length === 0) {\n return undefined;\n }\n const rawVersion = metadata.promptVersion;\n if (rawVersion === undefined || rawVersion === null) {\n return { name };\n }\n const version =\n typeof rawVersion === \"number\"\n ? rawVersion\n : typeof rawVersion === \"string\" && rawVersion.trim().length > 0\n ? Number(rawVersion)\n : undefined;\n if (version === undefined || !Number.isFinite(version)) {\n return { name };\n }\n return { name, version };\n}\n\nfunction promptMetadata(\n ref: AgentRunPromptRef | undefined,\n): Record<string, string | number | undefined> {\n if (ref === undefined) {\n return {};\n }\n const metadata: Record<string, string | number | undefined> = {\n promptName: ref.name,\n };\n if (ref.version !== undefined) metadata.promptVersion = ref.version;\n return metadata;\n}\n\nfunction serializeMetadataValue(value: unknown): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return \"<failed to serialize>\";\n }\n}\n\nfunction asMetadata(value: unknown): Record<string, unknown> {\n return isRecord(value) ? value : { value };\n}\n\nfunction eventStartTime(value: string | undefined): Date | undefined {\n if (value === undefined) return undefined;\n const parsed = new Date(value);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n}\n\nclass LangfuseRunObserver implements AgentRunObserver {\n private readonly turnSpans = new Map<number, LangfuseSpan>();\n private readonly promptRef: AgentRunPromptRef | undefined;\n private readonly redactor: PiiRedactor | undefined;\n private readonly redactInputs: LangfuseRedactionMode | undefined;\n private readonly redactOutputs: LangfuseRedactionMode | undefined;\n private readonly captureMode: LangfuseCaptureMode;\n private readonly captureMaxBytes: number;\n\n constructor(\n private readonly root: LangfuseAgent,\n private readonly observations: LangfuseObservationFactory,\n readonly trace: AgentObserverTraceInfo,\n promptRef: AgentRunPromptRef | undefined,\n redaction: {\n redactor: PiiRedactor | undefined;\n redactInputs: LangfuseRedactionMode | undefined;\n redactOutputs: LangfuseRedactionMode | undefined;\n captureMode: LangfuseCaptureMode;\n captureMaxBytes: number;\n },\n ) {\n this.promptRef = promptRef;\n this.redactor = redaction.redactor;\n this.redactInputs = redaction.redactInputs;\n this.redactOutputs = redaction.redactOutputs;\n this.captureMode = redaction.captureMode;\n this.captureMaxBytes = redaction.captureMaxBytes;\n }\n\n redactInputValue<T>(value: T): unknown {\n const redacted =\n this.redactor === undefined || this.redactInputs === undefined\n ? value\n : applyRedaction(this.redactor, value, this.redactInputs);\n return sanitizeTraceValue(redacted, this.captureMaxBytes);\n }\n\n redactOutputValue<T>(value: T): unknown {\n const redacted =\n this.redactor === undefined || this.redactOutputs === undefined\n ? value\n : applyRedaction(this.redactor, value, this.redactOutputs);\n return sanitizeTraceValue(redacted, this.captureMaxBytes);\n }\n\n startGeneration(args: AgentGenerationStartArgs): AgentGenerationObserver {\n this.closeEarlierTurns(args.turn);\n const turn = this.turnSpan(args.turn);\n const safeInput: Record<string, unknown> = {\n instructions: args.request.instructions,\n messages: modelInputMessages(args.request.chatHistory),\n };\n if (this.captureMode === \"full\") {\n safeInput.documents = args.request.documents;\n safeInput.tools = args.request.tools;\n safeInput.providerTools = args.request.providerTools;\n safeInput.outputSchema = args.request.outputSchema;\n safeInput.providerOptions = args.request.providerOptions;\n }\n const metadata: Record<string, unknown> = {\n turn: args.turn,\n documentCount: args.request.documents.length,\n toolNames: args.request.tools.map((tool) => tool.name),\n providerToolNames: args.request.providerTools?.map((tool) => tool.name) ?? [],\n hasOutputSchema: args.request.outputSchema !== undefined,\n providerOptionKeys: isRecord(args.request.providerOptions)\n ? Object.keys(args.request.providerOptions)\n : [],\n };\n if (this.captureMode === \"full\" && args.providerRequest !== undefined) {\n metadata.providerRequest = args.providerRequest;\n }\n if (args.modelInfo !== undefined) {\n const modelInfo: Record<string, unknown> = {\n provider: args.modelInfo.provider,\n modelId: args.modelInfo.modelId,\n };\n if (args.modelInfo.capabilities !== undefined) {\n modelInfo.capabilities = args.modelInfo.capabilities;\n }\n metadata.modelInfo = modelInfo;\n }\n Object.assign(metadata, promptMetadata(this.promptRef));\n const generationAttributes: LangfuseGenerationAttributes = {\n input: this.redactInputValue(safeInput),\n model: args.modelInfo?.modelId ?? \"unknown\",\n modelParameters: modelParameters(args.request),\n metadata: asMetadata(this.redactInputValue(metadata)),\n };\n if (this.promptRef?.version !== undefined) {\n generationAttributes.prompt = {\n name: this.promptRef.name,\n version: this.promptRef.version,\n isFallback: false,\n };\n }\n const generation = this.observations.generation(\n `model.turn.${args.turn}`,\n generationAttributes,\n turn,\n );\n return new LangfuseGenerationObserver(generation, this, new Date());\n }\n\n startTool(args: AgentToolStartArgs): AgentToolObserver {\n const turn = this.turnSpan(args.turn);\n const metadata: Record<string, unknown> = {\n turn: args.turn,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n };\n if (this.captureMode === \"full\") {\n if (args.toolDefinition !== undefined) metadata.toolDefinition = args.toolDefinition;\n if (args.toolMetadata !== undefined) metadata.toolMetadata = args.toolMetadata;\n }\n const tool = this.observations.tool(\n `tool.${args.toolName}`,\n {\n input: this.redactInputValue({\n args: args.args,\n toolCall: args.toolCall,\n }),\n metadata: asMetadata(this.redactInputValue(metadata)),\n },\n turn,\n );\n return new LangfuseToolObserver(tool, this, this.observations);\n }\n\n end(args: AgentRunEndArgs): void {\n this.closeAllTurns();\n const observedOutput =\n args.status === \"completed\"\n ? { status: args.status, output: args.output, text: args.text }\n : args.status === \"blocked\"\n ? { status: args.status, stage: args.stage, text: args.text }\n : { status: args.status, interaction: args.interaction, text: args.text };\n const redactedOutput = this.redactOutputValue(observedOutput);\n const metadata: Record<string, unknown> = {\n runId: args.runId,\n status: args.status,\n usage: args.usage,\n messageCount: args.messages.length,\n sources: this.redactOutputValue(args.sources),\n providerToolCalls: this.redactOutputValue(args.providerToolCalls),\n resumedFrom: this.redactOutputValue(args.resumedFrom),\n };\n if (this.captureMode === \"full\") {\n metadata.messages = this.redactTranscript(args.messages);\n }\n this.root\n .update({\n output: redactedOutput,\n metadata,\n })\n .end();\n }\n\n error(args: AgentRunErrorArgs): void {\n this.closeAllTurns();\n const redactedError = this.redactOutputValue(errorMessage(args.error));\n const metadata: Record<string, unknown> = {\n usage: args.usage,\n messageCount: args.messages.length,\n };\n if (this.captureMode === \"full\") {\n metadata.messages = this.redactTranscript(args.messages);\n }\n this.root\n .update({\n level: \"ERROR\",\n statusMessage: typeof redactedError === \"string\" ? redactedError : \"Agent run failed\",\n output: {\n error: redactedError,\n },\n metadata,\n })\n .end();\n }\n\n event(args: AgentRunEventArgs): void {\n const metadata = asMetadata(this.redactOutputValue(args.attributes ?? {}));\n const attributes: LangfuseEventAttributes = { metadata };\n if (args.level !== undefined) {\n attributes.level = args.level;\n }\n const startTime = eventStartTime(args.timestamp);\n this.observations.event(args.name, attributes, this.root, startTime);\n }\n\n private turnSpan(turn: number): LangfuseSpan {\n const existing = this.turnSpans.get(turn);\n if (existing !== undefined) {\n return existing;\n }\n\n const span = this.observations.span(\n `turn.${turn}`,\n {\n metadata: { turn },\n },\n this.root,\n );\n this.turnSpans.set(turn, span);\n return span;\n }\n\n private closeEarlierTurns(currentTurn: number): void {\n for (const [turn, span] of this.turnSpans) {\n if (turn < currentTurn) {\n span.end();\n this.turnSpans.delete(turn);\n }\n }\n }\n\n private closeAllTurns(): void {\n for (const span of this.turnSpans.values()) {\n span.end();\n }\n this.turnSpans.clear();\n }\n\n isFullCapture(): boolean {\n return this.captureMode === \"full\";\n }\n\n redactTranscript(messages: AgentRunEndArgs[\"messages\"]): unknown {\n const inputRedacted =\n this.redactor === undefined || this.redactInputs === undefined\n ? messages\n : applyRedaction(this.redactor, messages, this.redactInputs);\n const outputRedacted =\n this.redactor === undefined || this.redactOutputs === undefined\n ? inputRedacted\n : applyRedaction(this.redactor, inputRedacted, this.redactOutputs);\n return sanitizeTraceValue(outputRedacted, this.captureMaxBytes);\n }\n}\n\nclass LangfuseGenerationObserver implements AgentGenerationObserver {\n constructor(\n private readonly generation: LangfuseGeneration,\n private readonly run: LangfuseRunObserver,\n private readonly startedAt: Date,\n ) {}\n\n update(args: AgentGenerationUpdateArgs): void {\n this.generation.update({\n output: this.run.redactOutputValue({ delta: args.delta }),\n });\n }\n\n end(args: AgentGenerationEndArgs): void {\n const redactedText = this.run.redactOutputValue(\n textFromObservedAssistantContent(args.response.choice),\n );\n const redactedChoice = this.run.redactOutputValue(args.response.choice);\n const metadata: Record<string, unknown> = { turn: args.turn };\n if (args.firstDeltaMs !== undefined) metadata.firstDeltaMs = args.firstDeltaMs;\n const output: Record<string, unknown> = {\n messageId: args.response.messageId,\n content: redactedChoice,\n text: redactedText,\n sources: this.run.redactOutputValue(args.response.sources),\n providerToolCalls: this.run.redactOutputValue(args.response.providerToolCalls),\n };\n const completionStartTime =\n args.firstDeltaMs === undefined\n ? undefined\n : new Date(this.startedAt.getTime() + args.firstDeltaMs);\n const update: LangfuseGenerationAttributes = {\n output,\n usageDetails: usageDetails(args.response.usage),\n metadata,\n };\n if (completionStartTime !== undefined) {\n update.completionStartTime = completionStartTime;\n }\n this.generation.update(update).end();\n }\n\n error(args: AgentGenerationErrorArgs): void {\n const redactedError = this.run.redactOutputValue(errorMessage(args.error));\n this.generation\n .update({\n level: \"ERROR\",\n statusMessage: typeof redactedError === \"string\" ? redactedError : \"Generation failed\",\n output: { error: redactedError },\n metadata: { turn: args.turn },\n })\n .end();\n }\n}\n\nfunction textFromObservedAssistantContent(\n content: AgentGenerationEndArgs[\"response\"][\"choice\"],\n): string {\n return content.flatMap((item) => (item.type === \"text\" ? [item.text] : [])).join(\"\\n\");\n}\n\nclass LangfuseToolObserver implements AgentToolObserver {\n private readonly childAgents = new Map<string, LangfuseAgent>();\n private readonly childGenerations = new Map<\n string,\n { generation: LangfuseGeneration; startedAt: Date }\n >();\n private readonly childTools: Array<{\n agentId: string;\n toolName: string;\n toolCallId?: string;\n tool: LangfuseTool;\n ended: boolean;\n }> = [];\n\n constructor(\n private readonly tool: LangfuseTool,\n private readonly run: LangfuseRunObserver,\n private readonly observations: LangfuseObservationFactory,\n ) {}\n\n streamEvent(args: AgentToolStreamEventArgs): void {\n const wrapper = args.event;\n const child = isRecord(wrapper.event) ? wrapper.event : undefined;\n if (child === undefined) {\n return;\n }\n\n const agentId = wrapper.agentId;\n const agentName = wrapper.agentName;\n const childTurn = typeof child.turn === \"number\" ? child.turn : args.turn;\n const agent = this.childAgent(agentId, agentName, args);\n\n if (child.type === \"turn_start\") {\n const promptMessage = isRecord(child.prompt) ? (child.prompt as Message) : undefined;\n const historyMessages = Array.isArray(child.history)\n ? (child.history.filter(isRecord) as Message[])\n : [];\n this.observations.event(\n `${agentLabel(agentId, agentName)}.turn.${childTurn}.start`,\n {\n input: this.run.redactInputValue({\n prompt: promptMessage === undefined ? undefined : modelInputMessage(promptMessage),\n history: modelInputMessages(historyMessages),\n }),\n metadata: asMetadata(\n this.run.redactInputValue(childMetadata(args, agentId, agentName, childTurn)),\n ),\n },\n agent,\n );\n return;\n }\n\n if (child.type === \"generation_start\" && isRecord(child.request)) {\n const request = child.request;\n const modelInfo = isRecord(child.modelInfo) ? child.modelInfo : undefined;\n const messages = Array.isArray(request.chatHistory)\n ? modelInputMessages(request.chatHistory.filter(isRecord) as Message[])\n : [];\n const input: Record<string, unknown> = {\n instructions: typeof request.instructions === \"string\" ? request.instructions : undefined,\n messages,\n };\n if (this.run.isFullCapture()) {\n input.documents = request.documents;\n input.tools = request.tools;\n input.providerTools = request.providerTools;\n input.outputSchema = request.outputSchema;\n input.providerOptions = request.providerOptions;\n }\n const toolNames = Array.isArray(request.tools)\n ? request.tools\n .filter(isRecord)\n .map((tool) => tool.name)\n .filter((name): name is string => typeof name === \"string\")\n : [];\n const providerToolNames = Array.isArray(request.providerTools)\n ? request.providerTools\n .filter(isRecord)\n .map((tool) => tool.name)\n .filter((name): name is string => typeof name === \"string\")\n : [];\n const generation = this.observations.generation(\n `${agentLabel(agentId, agentName)}.model.turn.${childTurn}`,\n {\n input: this.run.redactInputValue(input),\n model: typeof modelInfo?.modelId === \"string\" ? modelInfo.modelId : \"unknown\",\n modelParameters: modelParameters(request as AgentGenerationStartArgs[\"request\"]),\n metadata: asMetadata(\n this.run.redactInputValue({\n ...childMetadata(args, agentId, agentName, childTurn),\n documentCount: Array.isArray(request.documents) ? request.documents.length : 0,\n toolNames,\n providerToolNames,\n hasOutputSchema: request.outputSchema !== undefined,\n modelInfo,\n }),\n ),\n },\n agent,\n );\n this.childGenerations.set(generationKey(agentId, childTurn), {\n generation,\n startedAt: new Date(),\n });\n return;\n }\n\n if (child.type === \"turn_end\") {\n const childGeneration = this.childGenerations.get(generationKey(agentId, childTurn));\n if (childGeneration !== undefined) {\n const update: Parameters<LangfuseGeneration[\"update\"]>[0] = {\n output: this.run.redactOutputValue(child.response),\n metadata: asMetadata(\n this.run.redactOutputValue(childMetadata(args, agentId, agentName, childTurn)),\n ),\n };\n if (isRecord(child.response) && isRecord(child.response.usage)) {\n update.usageDetails = usageDetailsFromRecord(child.response.usage);\n }\n if (typeof child.firstDeltaMs === \"number\") {\n update.completionStartTime = new Date(\n childGeneration.startedAt.getTime() + child.firstDeltaMs,\n );\n }\n childGeneration.generation.update(update).end();\n this.childGenerations.delete(generationKey(agentId, childTurn));\n }\n return;\n }\n\n if (\n child.type === \"text_delta\" ||\n child.type === \"reasoning_delta\" ||\n child.type === \"tool_call_delta\"\n ) {\n const childGeneration = this.childGenerations.get(generationKey(agentId, childTurn));\n childGeneration?.generation.update({\n output: this.run.redactOutputValue({ delta: child }),\n });\n return;\n }\n\n if (child.type === \"source\" || child.type === \"provider_tool_call\") {\n const childGeneration = this.childGenerations.get(generationKey(agentId, childTurn));\n const parent = childGeneration?.generation ?? agent;\n this.observations.event(\n `${agentLabel(agentId, agentName)}.${child.type}`,\n {\n output: this.run.redactOutputValue(\n child.type === \"source\" ? child.source : child.toolCall,\n ),\n metadata: asMetadata(\n this.run.redactOutputValue(childMetadata(args, agentId, agentName, childTurn)),\n ),\n },\n parent,\n );\n return;\n }\n\n if (child.type === \"guardrail_decision\") {\n this.observations\n .guardrail(\n `${agentLabel(agentId, agentName)}.guardrail`,\n {\n output: this.run.redactOutputValue(child.decision),\n metadata: asMetadata(\n this.run.redactOutputValue(childMetadata(args, agentId, agentName, childTurn)),\n ),\n },\n agent,\n )\n .end();\n return;\n }\n\n if (child.type === \"tool_call\" && isRecord(child.toolCall)) {\n const childGeneration = this.childGenerations.get(generationKey(agentId, childTurn));\n childGeneration?.generation.update({\n output: this.run.redactOutputValue({ toolCall: child.toolCall }),\n });\n const toolCall = child.toolCall;\n const toolName = typeof toolCall.toolName === \"string\" ? toolCall.toolName : \"tool\";\n const toolCallId =\n typeof toolCall.toolCallId === \"string\"\n ? toolCall.toolCallId\n : typeof toolCall.callId === \"string\"\n ? toolCall.callId\n : undefined;\n const childTool = this.observations.tool(\n `${agentLabel(agentId, agentName)}.${toolName}`,\n {\n input: this.run.redactInputValue({\n args: toolCall.input,\n toolCall,\n }),\n metadata: asMetadata(\n this.run.redactInputValue({\n ...childMetadata(args, agentId, agentName, childTurn),\n toolName,\n toolCallId,\n }),\n ),\n },\n agent,\n );\n const childToolRecord: (typeof this.childTools)[number] = {\n agentId,\n toolName,\n tool: childTool,\n ended: false,\n };\n if (toolCallId !== undefined) childToolRecord.toolCallId = toolCallId;\n this.childTools.push(childToolRecord);\n return;\n }\n\n if (child.type === \"tool_result\") {\n const toolName = typeof child.toolName === \"string\" ? child.toolName : \"tool\";\n const toolCallId = typeof child.toolCallId === \"string\" ? child.toolCallId : undefined;\n const childTool = this.findChildTool(agentId, toolName, toolCallId);\n if (childTool !== undefined) {\n childTool.ended = true;\n childTool.tool\n .update({\n output: this.run.redactOutputValue(\n typeof child.result === \"string\" ? child.result : child,\n ),\n metadata: asMetadata(\n this.run.redactInputValue({\n ...childMetadata(args, agentId, agentName, childTurn),\n toolName,\n toolCallId,\n internalCallId:\n typeof child.internalCallId === \"string\" ? child.internalCallId : undefined,\n args: typeof child.args === \"string\" ? child.args : undefined,\n }),\n ),\n })\n .end();\n }\n return;\n }\n\n if (child.type === \"response\" || child.type === \"interaction\" || child.type === \"blocked\") {\n const result = child;\n const update: Parameters<LangfuseAgent[\"update\"]>[0] = {\n output: this.run.redactOutputValue({\n type: result.type,\n output: result.type === \"response\" ? result.output : undefined,\n text: result.text,\n }),\n };\n const metadata: Record<string, unknown> = {};\n if (isRecord(result.usage)) metadata.usage = result.usage;\n if (this.run.isFullCapture() && Array.isArray(result.messages)) {\n metadata.messages = this.run.redactTranscript(result.messages as Message[]);\n }\n if (Object.keys(metadata).length > 0) update.metadata = metadata;\n agent.update(update).end();\n this.childAgents.delete(agentId);\n return;\n }\n\n if (child.type === \"error\") {\n const redactedError = this.run.redactOutputValue(errorMessage(child.error));\n const childGeneration = this.childGenerations.get(generationKey(agentId, childTurn));\n childGeneration?.generation\n .update({\n level: \"ERROR\",\n statusMessage: typeof redactedError === \"string\" ? redactedError : \"Generation failed\",\n output: { error: redactedError },\n })\n .end();\n this.childGenerations.delete(generationKey(agentId, childTurn));\n const update: Parameters<LangfuseAgent[\"update\"]>[0] = {\n level: \"ERROR\",\n statusMessage: typeof redactedError === \"string\" ? redactedError : \"Child agent failed\",\n output: { error: redactedError },\n };\n if (isRecord(child.usage)) update.metadata = { usage: child.usage };\n agent.update(update).end();\n this.childAgents.delete(agentId);\n }\n }\n\n end(args: AgentToolEndArgs): void {\n this.endOpenChildren();\n const redactedResult = this.run.redactOutputValue(args.result);\n const redactedStructured = this.run.redactOutputValue(args.structuredResult);\n const metadata: Record<string, unknown> = {\n turn: args.turn,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n skipped: args.skipped,\n };\n if (redactedStructured !== undefined) metadata.structuredResult = redactedStructured;\n const attributes: Parameters<LangfuseTool[\"update\"]>[0] = {\n output: redactedResult,\n metadata,\n level: args.skipped ? \"WARNING\" : \"DEFAULT\",\n };\n if (args.skipped) {\n attributes.statusMessage = \"Tool call skipped by hook\";\n }\n this.tool.update(attributes).end();\n }\n\n suspend(args: AgentToolSuspendedArgs): void {\n this.endOpenChildren();\n this.tool\n .update({\n output: this.run.redactOutputValue({\n status: \"suspended\",\n interaction: args.interaction,\n }),\n metadata: {\n turn: args.turn,\n internalCallId: args.internalCallId,\n interactionId: args.interaction.id,\n interactionType: args.interaction.type,\n },\n level: \"WARNING\",\n statusMessage: \"Tool call suspended for human interaction\",\n })\n .end();\n }\n\n error(args: AgentToolErrorArgs): void {\n this.endOpenChildren();\n const redactedError = this.run.redactOutputValue(errorMessage(args.error));\n this.tool\n .update({\n level: \"ERROR\",\n statusMessage: typeof redactedError === \"string\" ? redactedError : \"Tool failed\",\n output: { error: redactedError },\n metadata: {\n turn: args.turn,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n },\n })\n .end();\n }\n\n private childAgent(\n agentId: string,\n agentName: string | undefined,\n args: AgentToolStartArgs,\n ): LangfuseAgent {\n const existing = this.childAgents.get(agentId);\n if (existing !== undefined) {\n return existing;\n }\n const agent = this.observations.agent(\n `${agentLabel(agentId, agentName)}.run`,\n {\n metadata: asMetadata(\n this.run.redactInputValue(childMetadata(args, agentId, agentName, args.turn)),\n ),\n },\n this.tool,\n );\n this.childAgents.set(agentId, agent);\n return agent;\n }\n\n private findChildTool(\n agentId: string,\n toolName: string,\n toolCallId: string | undefined,\n ): (typeof this.childTools)[number] | undefined {\n for (let index = this.childTools.length - 1; index >= 0; index -= 1) {\n const childTool = this.childTools[index];\n if (\n childTool === undefined ||\n childTool.ended ||\n childTool.agentId !== agentId ||\n childTool.toolName !== toolName\n ) {\n continue;\n }\n if (toolCallId === undefined || childTool.toolCallId === toolCallId) {\n return childTool;\n }\n }\n return undefined;\n }\n\n private endOpenChildren(): void {\n for (const generation of this.childGenerations.values()) {\n generation.generation.end();\n }\n this.childGenerations.clear();\n for (const tool of this.childTools) {\n if (!tool.ended) {\n tool.tool.end();\n tool.ended = true;\n }\n }\n for (const agent of this.childAgents.values()) {\n agent.end();\n }\n this.childAgents.clear();\n }\n}\n","export const DEFAULT_CAPTURE_MAX_BYTES = 262_144;\nexport const MIN_CAPTURE_MAX_BYTES = 96;\n\ntype TruncatedTraceValue = {\n anviaTraceValue: \"truncated\";\n originalBytes: number;\n preview: string;\n};\n\ntype OmittedTraceValue = {\n anviaTraceValue: \"omitted\";\n reason: \"base64\" | \"binary\" | \"circular\" | \"depth\" | \"unserializable\";\n originalBytes?: number;\n};\n\nexport function validateCaptureMaxBytes(value: number | undefined): number {\n const resolved = value ?? DEFAULT_CAPTURE_MAX_BYTES;\n if (!Number.isInteger(resolved) || resolved < MIN_CAPTURE_MAX_BYTES) {\n throw new TypeError(\n `Langfuse captureMaxBytes must be an integer of at least ${MIN_CAPTURE_MAX_BYTES}`,\n );\n }\n return resolved;\n}\n\nexport function sanitizeTraceValue<T>(\n value: T,\n maxBytes: number,\n): T | TruncatedTraceValue | OmittedTraceValue {\n validateCaptureMaxBytes(maxBytes);\n const sanitized = sanitizeValue(value, 0, new WeakSet<object>()) as T;\n let serialized: string;\n try {\n serialized = JSON.stringify(sanitized) ?? String(sanitized);\n } catch {\n return omitted(\"unserializable\");\n }\n const originalBytes = utf8Bytes(serialized);\n if (originalBytes <= maxBytes) {\n return sanitized;\n }\n const preview = boundedPreview(serialized, originalBytes, maxBytes);\n return {\n anviaTraceValue: \"truncated\",\n originalBytes,\n preview,\n };\n}\n\nfunction sanitizeValue(value: unknown, depth: number, seen: WeakSet<object>): unknown {\n if (depth > 16) {\n return omitted(\"depth\");\n }\n if (typeof value === \"string\") {\n if (/^data:[^;,]+;base64,/i.test(value)) {\n return omitted(\"base64\", utf8Bytes(value));\n }\n return value;\n }\n if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n const byteLength = value.byteLength;\n return omitted(\"binary\", byteLength);\n }\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n if (seen.has(value)) {\n return omitted(\"circular\");\n }\n seen.add(value);\n if (Array.isArray(value)) {\n const result = value.map((entry) => sanitizeValue(entry, depth + 1, seen));\n seen.delete(value);\n return result;\n }\n const record = value as Record<string, unknown>;\n const result: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(record)) {\n if (\n key === \"data\" &&\n typeof entry === \"string\" &&\n (record.type === \"base64\" ||\n (record.type === \"image\" && typeof record.mediaType === \"string\"))\n ) {\n result[key] = omitted(\"base64\", utf8Bytes(entry));\n continue;\n }\n result[key] = sanitizeValue(entry, depth + 1, seen);\n }\n seen.delete(value);\n return result;\n}\n\nfunction omitted(reason: OmittedTraceValue[\"reason\"], originalBytes?: number): OmittedTraceValue {\n const value: OmittedTraceValue = {\n anviaTraceValue: \"omitted\",\n reason,\n };\n if (originalBytes !== undefined) value.originalBytes = originalBytes;\n return value;\n}\n\nfunction boundedPreview(value: string, originalBytes: number, maxBytes: number): string {\n let low = 0;\n let high = value.length;\n while (low < high) {\n const middle = Math.ceil((low + high) / 2);\n const candidate = {\n anviaTraceValue: \"truncated\" as const,\n originalBytes,\n preview: value.slice(0, middle),\n };\n if (utf8Bytes(JSON.stringify(candidate)) <= maxBytes) {\n low = middle;\n } else {\n high = middle - 1;\n }\n }\n return value.slice(0, low);\n}\n\nfunction utf8Bytes(value: string): number {\n return typeof Buffer === \"undefined\"\n ? new TextEncoder().encode(value).byteLength\n : Buffer.byteLength(value, \"utf8\");\n}\n","import type {\n AgentGenerationEndArgs,\n AgentGenerationStartArgs,\n AgentRunStartArgs,\n AgentToolStartArgs,\n} from \"@anvia/core/observability\";\n\ntype ObservedMessage = AgentRunStartArgs[\"prompt\"];\n\nexport function modelInputMessage(message: ObservedMessage): Omit<ObservedMessage, \"metadata\"> {\n const { metadata: _metadata, ...result } = message;\n return result;\n}\n\nexport function modelInputMessages(\n messages: readonly ObservedMessage[],\n): Array<Omit<ObservedMessage, \"metadata\">> {\n return messages.map(modelInputMessage);\n}\n\nexport function modelParameters(\n request: AgentGenerationStartArgs[\"request\"],\n): Record<string, string | number> {\n const params: Record<string, string | number> = {};\n if (request.temperature !== undefined) params.temperature = request.temperature;\n if (request.maxTokens !== undefined) params.maxTokens = request.maxTokens;\n if (request.toolChoice !== undefined) {\n params.toolChoice =\n typeof request.toolChoice === \"string\" ? request.toolChoice : request.toolChoice.name;\n }\n return params;\n}\n\nexport function usageDetails(\n usage: AgentGenerationEndArgs[\"response\"][\"usage\"],\n): Record<string, number> {\n if (usage.details !== undefined && Object.keys(usage.details).length > 0) {\n return { ...usage.details };\n }\n return {\n input: usage.inputTokens,\n output: usage.outputTokens,\n total: usage.totalTokens,\n };\n}\n\nexport function usageDetailsFromRecord(usage: Record<string, unknown>): Record<string, number> {\n if (isRecord(usage.details)) {\n const details = Object.fromEntries(\n Object.entries(usage.details).filter(\n (entry): entry is [string, number] =>\n typeof entry[1] === \"number\" && Number.isFinite(entry[1]) && entry[1] >= 0,\n ),\n );\n if (Object.keys(details).length > 0) {\n return details;\n }\n }\n return {\n input: numberValue(usage.inputTokens) ?? 0,\n output: numberValue(usage.outputTokens) ?? 0,\n total:\n numberValue(usage.totalTokens) ??\n (numberValue(usage.inputTokens) ?? 0) + (numberValue(usage.outputTokens) ?? 0),\n };\n}\n\nexport function childMetadata(\n args: AgentToolStartArgs,\n agentId: string,\n agentName: string | undefined,\n childTurn: number,\n): Record<string, unknown> {\n return {\n source: \"agent_tool_event\",\n childAgentId: agentId,\n childAgentName: agentName,\n childTurn,\n parentToolName: args.toolName,\n parentInternalCallId: args.internalCallId,\n parentToolCallId: args.toolCallId,\n };\n}\n\nexport function generationKey(agentId: string, turn: number): string {\n return `${agentId}:${turn}`;\n}\n\nexport function agentLabel(agentId: string, agentName: string | undefined): string {\n return (agentName ?? agentId).replaceAll(/\\s+/g, \"_\");\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n\nexport function emptyToUndefined(value: string | undefined): string | undefined {\n return value === undefined || value.length === 0 ? undefined : value;\n}\n\n/**\n * Resolve an option value: prefer the explicit option, fall back to the\n * env var, and treat empty strings as missing. Empty env vars are common\n * when a process inherits a process manager that injects blank values.\n */\nexport function resolveOption(\n option: string | undefined,\n envVar: string | undefined,\n): string | undefined {\n return emptyToUndefined(option) ?? emptyToUndefined(envVar);\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { emptyToUndefined } from \"./helpers.js\";\n\nexport const langfuseResolvedConfigSymbol: unique symbol = Symbol.for(\n \"@anvia/langfuse.resolvedConfig\",\n);\n\nexport type LangfuseResolvedConfig = {\n publicKey?: string | undefined;\n secretKey?: string | undefined;\n baseUrl: string;\n environment?: string | undefined;\n release?: string | undefined;\n serviceName?: string | undefined;\n timeoutMs: number;\n};\n\nexport type LangfuseConfigOptions = {\n publicKey?: string | undefined;\n secretKey?: string | undefined;\n baseUrl?: string | undefined;\n environment?: string | undefined;\n release?: string | undefined;\n serviceName?: string | undefined;\n timeoutMs?: number | undefined;\n};\n\nexport type LangfuseResolvedConfigCarrier = {\n [langfuseResolvedConfigSymbol]?: LangfuseResolvedConfig | undefined;\n};\n\nexport function resolveLangfuseConfig(\n options: LangfuseConfigOptions = {},\n fallback?: Partial<LangfuseResolvedConfig> | undefined,\n): LangfuseResolvedConfig {\n return {\n publicKey: resolveStringOption(\n options.publicKey,\n fallback?.publicKey,\n process.env.LANGFUSE_PUBLIC_KEY,\n ),\n secretKey: resolveStringOption(\n options.secretKey,\n fallback?.secretKey,\n process.env.LANGFUSE_SECRET_KEY,\n ),\n baseUrl:\n resolveStringOption(options.baseUrl, fallback?.baseUrl, process.env.LANGFUSE_BASE_URL) ??\n \"https://cloud.langfuse.com\",\n environment: resolveStringOption(\n options.environment,\n fallback?.environment,\n process.env.LANGFUSE_TRACING_ENVIRONMENT,\n ),\n release: resolveStringOption(options.release, fallback?.release, process.env.LANGFUSE_RELEASE),\n serviceName: resolveStringOption(\n options.serviceName,\n fallback?.serviceName,\n process.env.LANGFUSE_SERVICE_NAME,\n ),\n timeoutMs: options.timeoutMs ?? fallback?.timeoutMs ?? 30_000,\n };\n}\n\nexport function getResolvedLangfuseConfig(value: unknown): LangfuseResolvedConfig | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n return (value as LangfuseResolvedConfigCarrier)[langfuseResolvedConfigSymbol];\n}\n\nfunction resolveStringOption(\n option: string | undefined,\n fallback: string | undefined,\n envVar: string | undefined,\n): string | undefined {\n return emptyToUndefined(option) ?? emptyToUndefined(fallback) ?? emptyToUndefined(envVar);\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport { getResolvedLangfuseConfig, resolveLangfuseConfig } from \"./config.js\";\nimport { LangfuseScoreError } from \"./scoring.js\";\nimport type {\n LangfuseDataset,\n LangfuseDatasetClient,\n LangfuseDatasetClientOptions,\n LangfuseDatasetItem,\n LangfuseRunExperimentOptions,\n LangfuseRunExperimentResult,\n LangfuseRunItemError,\n LangfuseScorer,\n} from \"./types.js\";\n\nconst DEFAULT_PAGE_SIZE = 50;\nconst MAX_PAGINATION_PAGES = 100;\n\nexport function createLangfuseDatasetClient(\n tracing: LangfuseScorer,\n options: LangfuseDatasetClientOptions = {},\n): LangfuseDatasetClient {\n const resolvedConfig = resolveLangfuseConfig(options, getResolvedLangfuseConfig(tracing));\n const baseUrl = resolvedConfig.baseUrl;\n const publicKey = resolvedConfig.publicKey;\n const secretKey = resolvedConfig.secretKey;\n const pageSize = options.pageSize ?? DEFAULT_PAGE_SIZE;\n const timeoutMs = resolvedConfig.timeoutMs;\n\n const fetchImpl: typeof fetch = (...args) => {\n const init: RequestInit = {};\n Object.assign(init, args[1]);\n init.signal = AbortSignal.timeout(timeoutMs);\n return fetch(args[0], init);\n };\n\n const authHeader = buildAuthHeader(publicKey, secretKey);\n\n async function request<T>(input: string, init: RequestInit): Promise<T> {\n const headers: Record<string, string> = {};\n Object.assign(headers, init.headers, authHeader);\n headers[\"Content-Type\"] = \"application/json\";\n const response = await fetchImpl(input, {\n ...init,\n headers,\n });\n if (!response.ok) {\n const body = await readErrorBody(response);\n throw new LangfuseScoreError(\n `Langfuse request failed: ${response.status} ${response.statusText}: ${body}`,\n [],\n );\n }\n if (response.status === 204) {\n return undefined as T;\n }\n return (await response.json()) as T;\n }\n\n return {\n async createDataset(dataset) {\n const url = `${baseUrl}/api/public/datasets/${encodeURIComponent(dataset.name)}`;\n await request<unknown>(url, {\n method: \"PUT\",\n body: JSON.stringify({\n name: dataset.name,\n description: dataset.description,\n metadata: dataset.metadata,\n }),\n });\n const result: LangfuseDataset<unknown, unknown> = {\n name: dataset.name,\n items: [],\n };\n if (dataset.description !== undefined) result.description = dataset.description;\n if (dataset.metadata !== undefined) result.metadata = dataset.metadata;\n return result;\n },\n\n async getDataset<Input, Expected>(options: {\n name: string;\n }): Promise<LangfuseDataset<Input, Expected>> {\n const { name } = options;\n const items: LangfuseDatasetItem<Input, Expected>[] = [];\n let description: string | undefined;\n let metadata: Record<string, JsonValue | undefined> | undefined;\n for (let page = 1; page <= MAX_PAGINATION_PAGES; page += 1) {\n const url = new URL(`${baseUrl}/api/public/datasets/${encodeURIComponent(name)}`);\n url.searchParams.set(\"page\", String(page));\n url.searchParams.set(\"limit\", String(pageSize));\n const response = await request<{\n name: string;\n description?: string | undefined;\n metadata?: Record<string, JsonValue | undefined> | undefined;\n items: Array<{\n id: string;\n input: Input;\n expected?: Expected | undefined;\n metadata?: Record<string, JsonValue | undefined> | undefined;\n }>;\n meta?: { totalPages?: number | undefined };\n }>(url.toString(), { method: \"GET\" });\n if (description === undefined && response.description !== undefined) {\n description = response.description;\n }\n if (metadata === undefined && response.metadata !== undefined) {\n metadata = response.metadata;\n }\n for (const item of response.items) {\n const normalized: LangfuseDatasetItem<Input, Expected> = {\n id: item.id,\n input: item.input,\n };\n if (item.expected !== undefined) normalized.expected = item.expected;\n if (item.metadata !== undefined) normalized.metadata = item.metadata;\n items.push(normalized);\n }\n const totalPages = response.meta?.totalPages;\n if (totalPages !== undefined && page >= totalPages) {\n break;\n }\n if (totalPages === undefined && response.items.length < pageSize) {\n break;\n }\n }\n const dataset: LangfuseDataset<Input, Expected> = {\n name,\n items,\n };\n if (description !== undefined) dataset.description = description;\n if (metadata !== undefined) dataset.metadata = metadata;\n return dataset;\n },\n\n async upsertItems<Input, Expected>(options: {\n name: string;\n items: readonly LangfuseDatasetItem<Input, Expected>[];\n }): Promise<void> {\n const { name, items } = options;\n const url = `${baseUrl}/api/public/datasets/${encodeURIComponent(name)}/items`;\n await request<unknown>(url, {\n method: \"POST\",\n body: JSON.stringify({ items }),\n });\n },\n\n async runExperiment<Input, Output, Expected>(\n opts: LangfuseRunExperimentOptions<Input, Output, Expected>,\n ): Promise<LangfuseRunExperimentResult> {\n let items = opts.items;\n if (items === undefined) {\n const dataset = await this.getDataset<Input, Expected>({ name: opts.datasetName });\n items = dataset.items;\n }\n if (items === undefined || items.length === 0) {\n return {\n runName: opts.runName,\n datasetName: opts.datasetName,\n posted: 0,\n errors: [],\n };\n }\n const datasetItemRuns: Array<{\n datasetItemId: string;\n traceId?: string;\n observationId?: string;\n output: JsonValue;\n }> = [];\n const errors: LangfuseRunItemError[] = [];\n for (const item of items) {\n try {\n const result = await opts.run(item);\n const datasetItemRun: (typeof datasetItemRuns)[number] = {\n datasetItemId: item.id,\n output: toJsonValue(result.output),\n };\n if (result.trace?.traceId !== undefined) datasetItemRun.traceId = result.trace.traceId;\n if (result.trace?.observationId !== undefined) {\n datasetItemRun.observationId = result.trace.observationId;\n }\n datasetItemRuns.push(datasetItemRun);\n } catch (error) {\n errors.push({ itemId: item.id, error });\n }\n }\n const url = `${baseUrl}/api/public/dataset-run-items`;\n const body: Record<string, unknown> = {\n runName: opts.runName,\n datasetItemRuns,\n };\n if (opts.description !== undefined) body.runDescription = opts.description;\n if (opts.metadata !== undefined) body.metadata = opts.metadata;\n await request<unknown>(url, {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n return {\n runName: opts.runName,\n datasetName: opts.datasetName,\n posted: datasetItemRuns.length,\n errors,\n };\n },\n };\n}\n\nfunction buildAuthHeader(\n publicKey: string | undefined,\n secretKey: string | undefined,\n): Record<string, string> {\n if (publicKey === undefined || secretKey === undefined) {\n return {};\n }\n const encoded = Buffer.from(`${publicKey}:${secretKey}`).toString(\"base64\");\n return { Authorization: `Basic ${encoded}` };\n}\n\nasync function readErrorBody(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return \"<unreadable>\";\n }\n}\n\nfunction toJsonValue(value: unknown): JsonValue {\n if (value === null) return null;\n if (typeof value === \"string\" || typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value;\n try {\n return JSON.parse(JSON.stringify(value)) as JsonValue;\n } catch {\n return String(value);\n }\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport {\n type EvalReportArgs,\n type EvalReporter,\n projectEvalOutcome,\n resolveEvalTraceRef,\n} from \"@anvia/core/evals\";\nimport type { LangfuseEvalReporterOptions, LangfuseScoreArgs, LangfuseScorer } from \"./types.js\";\n\nconst DEFAULT_TRUNCATE_BYTES = 2048;\n\nexport function createLangfuseEvalReporter<Input = unknown, Output = unknown, Expected = unknown>(\n tracing: LangfuseScorer,\n options: LangfuseEvalReporterOptions = {},\n): EvalReporter<Input, Output, Expected> {\n const onMissingTrace = options.onMissingTrace ?? \"ignore\";\n const traceObserver = options.traceObserver ?? \"langfuse\";\n const truncateAt = options.truncateInputAt ?? DEFAULT_TRUNCATE_BYTES;\n const includeMessages = options.includeMessages ?? true;\n const includeContext = options.includeContext ?? false;\n\n return {\n async report(args) {\n if (args.outcome.outcome === \"invalid\" && options.publishInvalid !== true) {\n return;\n }\n\n const trace =\n args.trace ??\n resolveEvalTraceRef({\n output: args.output,\n input: args.case.input,\n metadata: args.case.metadata,\n });\n if (\n trace?.traceId === undefined ||\n trace.traceId.length === 0 ||\n (trace.observer !== undefined && trace.observer !== traceObserver)\n ) {\n if (onMissingTrace === \"throw\") {\n throw new Error(\n `Langfuse eval reporter requires traceId from observer ${JSON.stringify(traceObserver)}`,\n );\n }\n if (onMissingTrace === \"warn\") {\n // eslint-disable-next-line no-console\n console.warn(\n \"[anvia/langfuse] eval reporter dropped score because no matching trace was found\",\n { caseId: args.case.id, metric: args.metric.name },\n );\n }\n return;\n }\n\n const projection = projectEvalOutcome(\n args.outcome,\n args.metric.dataType,\n args.metric.projectScore,\n );\n const metadata = buildScoreMetadata({\n args,\n truncateAt,\n includeMessages,\n includeContext,\n });\n const configId = resolveConfigId(args.metric);\n\n const score: LangfuseScoreArgs = {\n traceId: trace.traceId,\n name: args.metric.name,\n value: projection.value,\n };\n if (trace.observationId !== undefined) score.observationId = trace.observationId;\n if (args.metric.dataType !== undefined) score.dataType = args.metric.dataType;\n if (configId !== undefined) score.configId = configId;\n if (projection.explanation !== undefined) score.comment = projection.explanation;\n if (metadata !== undefined) score.metadata = metadata;\n await tracing.score(score);\n },\n };\n}\n\nfunction resolveConfigId(metric: {\n scoreConfigId?: string | undefined;\n configId?: string | undefined;\n}): string | undefined {\n return metric.configId ?? metric.scoreConfigId;\n}\n\nfunction buildScoreMetadata<Input, Output, Score, Expected>({\n args,\n truncateAt,\n includeMessages,\n includeContext,\n}: {\n args: EvalReportArgs<Input, Output, Score, Expected>;\n truncateAt: number;\n includeMessages: boolean;\n includeContext: boolean;\n}): Record<string, JsonValue | undefined> | undefined {\n const merged: Record<string, JsonValue | undefined> = {\n suiteName: args.suiteName,\n caseId: args.case.id,\n outcome: args.outcome.outcome,\n required: args.metric.required ?? true,\n };\n if (args.metric.direction !== undefined) merged.scoreDirection = args.metric.direction;\n if (args.metric.threshold !== undefined) merged.threshold = args.metric.threshold;\n if (args.outcome.usage !== undefined) merged.evaluationUsage = { ...args.outcome.usage };\n mergeMetadata(merged, args.outcome.metadata);\n mergeMetadata(merged, args.metric.metadata);\n if (args.case.metadata !== undefined) {\n merged.caseMetadata = { ...args.case.metadata };\n }\n if (includeContext && args.case.context !== undefined) {\n merged.context = [...args.case.context];\n }\n if (includeContext && args.case.retrievalContext !== undefined) {\n merged.retrievalContext = [...args.case.retrievalContext];\n }\n const inputSummary = truncateValue(args.case.input, truncateAt);\n if (inputSummary !== undefined) {\n merged.caseInputSummary = inputSummary;\n }\n if (args.case.expected !== undefined) {\n const expectedSummary = truncateValue(args.case.expected, truncateAt);\n if (expectedSummary !== undefined) {\n merged.caseExpectedSummary = expectedSummary;\n }\n }\n if (includeMessages) {\n const messages = readMessages(args.output);\n if (messages !== undefined) {\n merged.messages = messages;\n }\n }\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction mergeMetadata(\n target: Record<string, JsonValue | undefined>,\n source: Record<string, JsonValue | undefined> | undefined,\n): void {\n if (source === undefined) return;\n for (const [key, value] of Object.entries(source)) {\n target[key] = value;\n }\n}\n\nfunction truncateValue(value: unknown, maxBytes: number): string | undefined {\n if (value === undefined) return undefined;\n let serialized: string;\n try {\n serialized = typeof value === \"string\" ? value : JSON.stringify(value);\n } catch {\n return undefined;\n }\n if (serialized === undefined) return undefined;\n const encoder = new TextEncoder();\n const bytes = encoder.encode(serialized);\n if (bytes.length <= maxBytes) {\n return serialized;\n }\n // Truncate at byte boundary by slicing, then append the marker.\n const truncatedBytes = bytes.subarray(0, maxBytes);\n const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n return `${decoder.decode(truncatedBytes)}<truncated>`;\n}\n\nfunction readMessages(output: unknown): JsonValue[] | undefined {\n if (typeof output !== \"object\" || output === null) return undefined;\n const messages = (output as { messages?: unknown }).messages;\n if (!Array.isArray(messages)) return undefined;\n const serialized: JsonValue[] = [];\n for (const entry of messages) {\n if (entry === null || typeof entry !== \"object\") return undefined;\n try {\n // Round-trip via JSON to make sure we never put non-JSON values\n // into a JsonValue-typed slot.\n serialized.push(JSON.parse(JSON.stringify(entry)) as JsonValue);\n } catch {\n return undefined;\n }\n }\n return serialized;\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport type { EvalCaseResult, EvalSuiteResult, RunEvalSuiteOptions } from \"@anvia/core/evals\";\nimport { runEvalSuite } from \"@anvia/core/evals\";\nimport { createLangfuseEvalReporter } from \"./eval-reporter.js\";\nimport type {\n LangfuseDatasetClient,\n LangfuseDatasetClientOptions,\n LangfuseDatasetItem,\n LangfuseEvalReporterOptions,\n LangfuseRunExperimentOptions,\n LangfuseRunExperimentResult,\n LangfuseScorer,\n} from \"./types.js\";\n\nexport type LangfuseEvalExperimentOptions<Input, Output, Expected = unknown> = {\n suite: RunEvalSuiteOptions<Input, Output, Expected>;\n experiment: Omit<LangfuseRunExperimentOptions<Input, Output, Expected>, \"items\" | \"run\"> & {\n pageSize?: number | undefined;\n timeoutMs?: number | undefined;\n publishScores?: boolean | undefined;\n reporterOptions?: LangfuseEvalReporterOptions | undefined;\n includeContexts?: boolean | undefined;\n };\n};\n\nexport type LangfuseEvalExperimentResult<Input, Output, Expected = unknown> = {\n suite: EvalSuiteResult<Input, Output, Expected>;\n datasetRun: LangfuseRunExperimentResult;\n};\n\nexport async function runLangfuseEvalExperiment<Input, Output, Expected = unknown>(\n client: LangfuseScorer & {\n datasetClient(options?: LangfuseDatasetClientOptions): LangfuseDatasetClient;\n },\n options: LangfuseEvalExperimentOptions<Input, Output, Expected>,\n): Promise<LangfuseEvalExperimentResult<Input, Output, Expected>> {\n const evalOptions = options.suite;\n const experimentOptions = options.experiment;\n const clientOptions: LangfuseDatasetClientOptions = {};\n if (experimentOptions.pageSize !== undefined) clientOptions.pageSize = experimentOptions.pageSize;\n if (experimentOptions.timeoutMs !== undefined)\n clientOptions.timeoutMs = experimentOptions.timeoutMs;\n const datasetClient = client.datasetClient(clientOptions);\n\n const suiteOptions: RunEvalSuiteOptions<Input, Output, Expected> =\n experimentOptions.publishScores === true\n ? {\n ...evalOptions,\n reporters: [\n ...(evalOptions.reporters ?? []),\n createLangfuseEvalReporter<Input, Output, Expected>(\n client,\n experimentOptions.reporterOptions,\n ),\n ],\n }\n : evalOptions;\n const suite = await runEvalSuite(suiteOptions);\n\n const items: LangfuseDatasetItem<Input, Expected>[] = evalOptions.cases.map((testCase) => {\n const item: LangfuseDatasetItem<Input, Expected> = {\n id: testCase.id,\n input: testCase.input,\n };\n if (testCase.expected !== undefined) {\n item.expected = testCase.expected;\n }\n const metadata: Record<string, JsonValue | undefined> = {\n ...(testCase.metadata ?? {}),\n };\n if (experimentOptions.includeContexts === true && testCase.context !== undefined) {\n metadata.context = [...testCase.context];\n }\n if (experimentOptions.includeContexts === true && testCase.retrievalContext !== undefined) {\n metadata.retrievalContext = [...testCase.retrievalContext];\n }\n if (Object.keys(metadata).length > 0) {\n item.metadata = metadata;\n }\n return item;\n });\n\n const datasetItemMap = new Map<string, EvalCaseResult<Input, Output, Expected>>();\n for (const result of suite.results) {\n datasetItemMap.set(result.case.id, result);\n }\n\n const runOptions: LangfuseRunExperimentOptions<Input, Output, Expected> = {\n datasetName: experimentOptions.datasetName,\n runName: experimentOptions.runName,\n items,\n run: (item) => {\n const result = datasetItemMap.get(item.id);\n if (result === undefined) {\n return {\n output: undefined as Output,\n trace: undefined,\n };\n }\n const output = (result.output ?? undefined) as Output;\n const trace = readTraceFromOutput(result.output);\n return { output, trace };\n },\n };\n if (experimentOptions.description !== undefined) {\n runOptions.description = experimentOptions.description;\n }\n if (experimentOptions.metadata !== undefined) runOptions.metadata = experimentOptions.metadata;\n const datasetRun = await datasetClient.runExperiment<Input, Output, Expected>(runOptions);\n\n return { suite, datasetRun };\n}\n\nfunction readTraceFromOutput(\n output: unknown,\n): { traceId: string; observationId?: string | undefined } | undefined {\n if (typeof output !== \"object\" || output === null || !(\"trace\" in output)) {\n return undefined;\n }\n const trace = (output as { trace?: unknown }).trace;\n if (typeof trace !== \"object\" || trace === null) {\n return undefined;\n }\n const traceId = (trace as { traceId?: unknown }).traceId;\n if (typeof traceId !== \"string\") {\n return undefined;\n }\n const observationId = (trace as { observationId?: unknown }).observationId;\n if (typeof observationId === \"string\") {\n return { traceId, observationId };\n }\n return { traceId };\n}\n","import { getResolvedLangfuseConfig, resolveLangfuseConfig } from \"./config.js\";\nimport { LangfuseScoreError } from \"./scoring.js\";\nimport type {\n LangfuseChatMessage,\n LangfusePrompt,\n LangfusePromptClient,\n LangfusePromptClientOptions,\n LangfusePromptGetOptions,\n LangfuseScorer,\n} from \"./types.js\";\n\nconst DEFAULT_CACHE_TTL_MS = 60_000;\n\nexport function createLangfusePromptClient(\n tracing: LangfuseScorer,\n options: LangfusePromptClientOptions = {},\n): LangfusePromptClient {\n const resolvedConfig = resolveLangfuseConfig(options, getResolvedLangfuseConfig(tracing));\n const baseUrl = resolvedConfig.baseUrl;\n const publicKey = resolvedConfig.publicKey;\n const secretKey = resolvedConfig.secretKey;\n const defaultTtl = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;\n const timeoutMs = resolvedConfig.timeoutMs;\n\n const cache = new Map<string, { prompt: LangfusePrompt; expiresAt: number }>();\n const authHeader = buildAuthHeader(publicKey, secretKey);\n\n async function request<T>(input: string): Promise<T> {\n const response = await fetch(input, {\n method: \"GET\",\n headers: { ...authHeader },\n signal: AbortSignal.timeout(timeoutMs),\n });\n if (!response.ok) {\n const body = await readErrorBody(response);\n throw new LangfuseScoreError(\n `Langfuse request failed: ${response.status} ${response.statusText}: ${body}`,\n [],\n );\n }\n return (await response.json()) as T;\n }\n\n async function getPrompt(options: LangfusePromptGetOptions): Promise<LangfusePrompt> {\n const { name, ...opts } = options;\n const key = `${name}::${opts.version ?? \"\"}::${opts.label ?? \"\"}`;\n const ttl = opts.cacheTtlMs ?? defaultTtl;\n if (opts.refresh !== true) {\n const cached = cache.get(key);\n if (cached !== undefined && cached.expiresAt > Date.now()) {\n return cached.prompt;\n }\n }\n const url = new URL(`${baseUrl}/api/public/v2/prompts/${encodeURIComponent(name)}`);\n if (opts.version !== undefined) {\n url.searchParams.set(\"version\", String(opts.version));\n }\n if (opts.label !== undefined) {\n url.searchParams.set(\"label\", opts.label);\n }\n const raw = await request<{\n name: string;\n version: number;\n labels?: string[];\n prompt: unknown;\n type: \"text\" | \"chat\";\n tags?: string[];\n }>(url.toString());\n const prompt: LangfusePrompt = {\n name: raw.name,\n version: raw.version,\n labels: raw.labels ?? [],\n prompt: normalizePrompt(raw.prompt, raw.type),\n type: raw.type,\n resolvedAt: new Date(),\n };\n if (raw.tags !== undefined) prompt.tags = raw.tags;\n cache.set(key, { prompt, expiresAt: Date.now() + ttl });\n return prompt;\n }\n\n function getPromptText(options: LangfusePromptGetOptions): Promise<string> {\n return getPrompt(options).then((prompt) => {\n if (typeof prompt.prompt !== \"string\") {\n throw new Error(`Prompt ${options.name} is a chat prompt; expected text`);\n }\n return prompt.prompt;\n });\n }\n\n function getPromptChat(options: LangfusePromptGetOptions): Promise<LangfuseChatMessage[]> {\n return getPrompt(options).then((prompt) => {\n if (typeof prompt.prompt === \"string\") {\n throw new Error(`Prompt ${options.name} is a text prompt; expected chat`);\n }\n return prompt.prompt;\n });\n }\n\n function refresh(): void {\n cache.clear();\n }\n\n return { getPrompt, getPromptText, getPromptChat, refresh };\n}\n\nfunction normalizePrompt(raw: unknown, type: \"text\" | \"chat\"): string | LangfuseChatMessage[] {\n if (type === \"text\") {\n if (typeof raw === \"string\") return raw;\n throw new Error(\"Expected text prompt to be a string\");\n }\n if (!Array.isArray(raw)) {\n throw new Error(\"Expected chat prompt to be an array of messages\");\n }\n return raw.map((entry) => {\n if (typeof entry !== \"object\" || entry === null) {\n throw new Error(\"Expected chat message to be an object\");\n }\n const role = (entry as { role?: unknown }).role;\n const content = (entry as { content?: unknown }).content;\n if (typeof content !== \"string\") {\n throw new Error(\"Expected chat message content to be a string\");\n }\n if (role !== \"system\" && role !== \"user\" && role !== \"assistant\" && role !== \"tool\") {\n throw new Error(`Unexpected chat message role: ${String(role)}`);\n }\n return { role, content };\n });\n}\n\nfunction buildAuthHeader(\n publicKey: string | undefined,\n secretKey: string | undefined,\n): Record<string, string> {\n if (publicKey === undefined || secretKey === undefined) {\n return {};\n }\n const encoded = Buffer.from(`${publicKey}:${secretKey}`).toString(\"base64\");\n return { Authorization: `Basic ${encoded}` };\n}\n\nasync function readErrorBody(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return \"<unreadable>\";\n }\n}\n"],"mappings":"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","names":["result","options","trace","trace","buildAuthHeader","readErrorBody","options","buildScoreBody","trace"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anvia/langfuse",
3
- "version": "1.0.0-rc.6",
3
+ "version": "1.0.0",
4
4
  "description": "Langfuse tracing adapter for Anvia.",
5
5
  "author": "anvia",
6
6
  "maintainer": "Indra Zulfi",
@@ -38,10 +38,10 @@
38
38
  "tsup": "^8.5.0",
39
39
  "typescript": "^5.9.3",
40
40
  "vitest": "^4.0.8",
41
- "@anvia/core": "1.0.0-rc.6"
41
+ "@anvia/core": "1.0.0"
42
42
  },
43
43
  "peerDependencies": {
44
- "@anvia/core": "1.0.0-rc.6"
44
+ "@anvia/core": "1.0.0"
45
45
  },
46
46
  "scripts": {
47
47
  "build": "tsup src/index.ts --format esm --dts --sourcemap --clean",