@struktur/telemetry 2.1.2 → 2.2.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/{src/adapters/langfuse/LangfuseAdapter.ts → dist/adapters/langfuse.js} +60 -149
- package/dist/adapters/langfuse.js.map +1 -0
- package/{src/adapters/phoenix/PhoenixAdapter.ts → dist/adapters/phoenix.js} +61 -159
- package/dist/adapters/phoenix.js.map +1 -0
- package/dist/factory.js +592 -0
- package/dist/factory.js.map +1 -0
- package/dist/index.js +601 -0
- package/dist/index.js.map +1 -0
- package/dist/types.js +37 -0
- package/dist/types.js.map +1 -0
- package/package.json +31 -10
- package/src/adapters/langfuse/index.ts +0 -6
- package/src/adapters/phoenix/index.ts +0 -6
- package/src/factory.ts +0 -133
- package/src/index.ts +0 -55
- package/src/types.ts +0 -453
- package/tests/adapters/langfuse.test.ts +0 -118
- package/tests/adapters/phoenix.test.ts +0 -132
- package/tests/factory.test.ts +0 -93
- package/tests/types.test.ts +0 -248
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/phoenix/PhoenixAdapter.ts","../src/adapters/phoenix/index.ts","../src/adapters/langfuse/LangfuseAdapter.ts","../src/adapters/langfuse/index.ts","../src/types.ts","../src/factory.ts"],"sourcesContent":["/**\n * Phoenix (Arize) telemetry adapter\n * \n * Implements TelemetryAdapter for Phoenix using OpenTelemetry and\n * OpenInference semantic conventions.\n */\n\nimport type {\n TelemetryAdapter,\n SpanContext,\n Span,\n SpanResult,\n TelemetryEvent,\n TelemetryContext,\n PhoenixConfig,\n LLMCallEvent,\n ValidationEvent,\n ChunkEvent,\n ToolCallEvent,\n MergeEvent,\n ParseEvent,\n TokenUsage,\n} from \"../../types.js\";\n\ntype OtelSpan = {\n spanContext: () => { spanId: string; traceId: string };\n setStatus: (status: { code: number; message?: string }) => void;\n setAttribute: (key: string, value: string | number | boolean | undefined) => void;\n setAttributes: (attrs: Record<string, string | number | boolean>) => void;\n recordException: (error: Error) => void;\n end: () => void;\n};\n\n/**\n * Phoenix telemetry adapter using OpenTelemetry\n */\nexport class PhoenixAdapter implements TelemetryAdapter {\n readonly name = \"phoenix\";\n readonly version = \"1.0.0\";\n\n private config: PhoenixConfig;\n private tracerProvider: { forceFlush?: () => Promise<void> } | null = null;\n private activeSpans = new Map<string, OtelSpan>();\n private otelApi: typeof import(\"@opentelemetry/api\") | null = null;\n private phoenixOtel: typeof import(\"@arizeai/phoenix-otel\") | null = null;\n\n constructor(config: PhoenixConfig) {\n this.config = {\n url: \"http://localhost:6006\",\n batch: true,\n ...config,\n };\n }\n\n async initialize(): Promise<void> {\n // Dynamically import OTel dependencies\n const [{ register }, otelApi] = await Promise.all([\n import(\"@arizeai/phoenix-otel\"),\n import(\"@opentelemetry/api\"),\n ]);\n\n this.otelApi = otelApi;\n this.phoenixOtel = { register } as typeof import(\"@arizeai/phoenix-otel\");\n\n this.tracerProvider = register({\n projectName: this.config.projectName,\n url: this.config.url,\n apiKey: this.config.apiKey,\n batch: this.config.batch,\n headers: this.config.headers,\n });\n }\n\n async shutdown(): Promise<void> {\n if (this.tracerProvider?.forceFlush) {\n await this.tracerProvider.forceFlush();\n }\n }\n\n startSpan(context: SpanContext): Span {\n if (!this.otelApi) {\n throw new Error(\"PhoenixAdapter not initialized\");\n }\n\n const tracer = this.otelApi.trace.getTracer(\"struktur\");\n \n const spanKind = context.kind;\n const otelSpan = tracer.startSpan(context.name, {\n attributes: {\n \"openinference.span.kind\": spanKind,\n ...context.attributes,\n },\n }) as OtelSpan;\n\n const spanContext = otelSpan.spanContext();\n const span: Span = {\n id: spanContext.spanId,\n traceId: spanContext.traceId,\n name: context.name,\n kind: context.kind,\n startTime: context.startTime ?? Date.now(),\n parentId: context.parentSpan?.id,\n };\n\n this.activeSpans.set(span.id, otelSpan);\n return span;\n }\n\n endSpan(span: Span, result?: SpanResult): void {\n const otelSpan = this.activeSpans.get(span.id);\n if (!otelSpan) return;\n\n if (result) {\n // OTel status codes: 1 = OK, 2 = ERROR\n otelSpan.setStatus({\n code: result.status === \"ok\" ? 1 : 2,\n message: result.error?.message,\n });\n\n if (result.output !== undefined) {\n try {\n const outputStr = typeof result.output === \"string\" \n ? result.output \n : JSON.stringify(result.output);\n otelSpan.setAttribute(\"output.value\", outputStr);\n } catch {\n otelSpan.setAttribute(\"output.value\", \"[object]\");\n }\n }\n\n if (result.latencyMs !== undefined) {\n otelSpan.setAttribute(\"latency_ms\", result.latencyMs);\n }\n }\n\n otelSpan.end();\n this.activeSpans.delete(span.id);\n }\n\n recordEvent(span: Span, event: TelemetryEvent): void {\n const otelSpan = this.activeSpans.get(span.id);\n if (!otelSpan) return;\n\n switch (event.type) {\n case \"llm_call\":\n this.recordLLMCall(otelSpan, event);\n break;\n case \"validation\":\n this.recordValidation(otelSpan, event);\n break;\n case \"chunk\":\n this.recordChunk(otelSpan, event);\n break;\n case \"tool_call\":\n this.recordToolCall(otelSpan, event);\n break;\n case \"merge\":\n this.recordMerge(otelSpan, event);\n break;\n case \"parse\":\n this.recordParse(otelSpan, event);\n break;\n }\n }\n\n setAttributes(span: Span, attributes: Record<string, unknown>): void {\n const otelSpan = this.activeSpans.get(span.id);\n if (!otelSpan) return;\n\n const stringAttrs: Record<string, string | number | boolean> = {};\n for (const [key, value] of Object.entries(attributes)) {\n if (value !== undefined && value !== null) {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n stringAttrs[key] = value;\n } else {\n try {\n stringAttrs[key] = JSON.stringify(value);\n } catch {\n stringAttrs[key] = String(value);\n }\n }\n }\n }\n\n otelSpan.setAttributes(stringAttrs);\n }\n\n setContext(_context: TelemetryContext): void {\n // Phoenix/OpenInference supports context via OTel context propagation\n // This would require setting up context managers\n // For now, attributes can be set on spans directly\n }\n\n private recordLLMCall(span: OtelSpan, event: LLMCallEvent): void {\n const attrs: Record<string, string | number | boolean> = {\n \"llm.model_name\": event.model,\n \"llm.provider\": event.provider,\n \"llm.temperature\": event.input.temperature ?? \"\",\n \"llm.max_tokens\": event.input.maxTokens ?? \"\",\n };\n\n // Record input messages\n if (event.input.messages.length > 0) {\n attrs[\"llm.input_messages\"] = JSON.stringify(event.input.messages);\n }\n\n // Record schema if present\n if (event.input.schema) {\n try {\n attrs[\"llm.schema\"] = JSON.stringify(event.input.schema);\n } catch {\n // Ignore schema serialization errors\n }\n }\n\n // Record output\n if (event.output) {\n attrs[\"output.value\"] = event.output.content;\n attrs[\"llm.structured_output\"] = event.output.structured ?? false;\n\n // Record token usage\n if (event.output.usage) {\n this.setTokenUsageAttrs(attrs, event.output.usage);\n }\n }\n\n attrs[\"latency_ms\"] = event.latencyMs;\n\n if (event.error) {\n span.recordException(event.error);\n }\n\n span.setAttributes(attrs);\n }\n\n private setTokenUsageAttrs(attrs: Record<string, string | number | boolean>, usage: TokenUsage): void {\n attrs[\"llm.token_count.prompt\"] = usage.input;\n attrs[\"llm.token_count.completion\"] = usage.output;\n attrs[\"llm.token_count.total\"] = usage.total;\n }\n\n private recordValidation(span: OtelSpan, event: ValidationEvent): void {\n const attrs: Record<string, string | number | boolean> = {\n \"validation.attempt\": event.attempt,\n \"validation.max_attempts\": event.maxAttempts,\n \"validation.success\": event.success,\n };\n\n if (event.errors && event.errors.length > 0) {\n attrs[\"validation.errors\"] = JSON.stringify(event.errors);\n }\n\n if (event.latencyMs !== undefined) {\n attrs[\"latency_ms\"] = event.latencyMs;\n }\n\n span.setAttributes(attrs);\n }\n\n private recordChunk(span: OtelSpan, event: ChunkEvent): void {\n span.setAttributes({\n \"chunk.index\": event.chunkIndex,\n \"chunk.total\": event.totalChunks,\n \"chunk.tokens\": event.tokens,\n \"chunk.images\": event.images,\n });\n\n if (event.content) {\n span.setAttribute(\"chunk.content_preview\", event.content.slice(0, 1000));\n }\n }\n\n private recordToolCall(span: OtelSpan, event: ToolCallEvent): void {\n const attrs: Record<string, string | number | boolean> = {\n \"tool.name\": event.toolName,\n \"tool.args\": JSON.stringify(event.args),\n };\n\n if (event.result !== undefined) {\n try {\n attrs[\"tool.result\"] = JSON.stringify(event.result);\n } catch {\n attrs[\"tool.result\"] = \"[object]\";\n }\n }\n\n if (event.error) {\n attrs[\"tool.error\"] = event.error.message;\n }\n\n if (event.latencyMs !== undefined) {\n attrs[\"latency_ms\"] = event.latencyMs;\n }\n\n span.setAttributes(attrs);\n\n if (event.error) {\n span.recordException(event.error);\n }\n }\n\n private recordMerge(span: OtelSpan, event: MergeEvent): void {\n const attrs: Record<string, string | number | boolean> = {\n \"merge.strategy\": event.strategy,\n \"merge.input_count\": event.inputCount,\n \"merge.output_count\": event.outputCount,\n };\n\n if (event.deduped !== undefined) {\n attrs[\"merge.deduped\"] = event.deduped;\n }\n\n span.setAttributes(attrs);\n }\n\n private recordParse(span: OtelSpan, event: ParseEvent): void {\n span.setAttributes({\n \"parse.mime_type\": event.mimeType,\n \"parse.parser\": event.parser,\n \"parse.input_size\": event.inputSize,\n \"parse.output_tokens\": event.outputTokens,\n \"parse.output_images\": event.outputImages,\n \"latency_ms\": event.latencyMs,\n });\n }\n}\n\n/**\n * Create a Phoenix telemetry adapter\n * \n * @param config - Phoenix configuration\n * @returns Phoenix telemetry adapter\n */\nexport function createPhoenixAdapter(config: PhoenixConfig): PhoenixAdapter {\n return new PhoenixAdapter(config);\n}\n\nexport type { PhoenixConfig };\n","/**\n * Phoenix (Arize) telemetry adapter exports\n */\n\nexport { PhoenixAdapter, createPhoenixAdapter } from \"./PhoenixAdapter.js\";\nexport type { PhoenixConfig } from \"../../types.js\";\n","/**\n * Langfuse telemetry adapter\n * \n * Implements TelemetryAdapter for Langfuse using their OpenTelemetry SDK.\n */\n\nimport type {\n TelemetryAdapter,\n SpanContext,\n Span,\n SpanResult,\n TelemetryEvent,\n TelemetryContext,\n LangfuseConfig,\n LLMCallEvent,\n ValidationEvent,\n ChunkEvent,\n ToolCallEvent,\n MergeEvent,\n ParseEvent,\n} from \"../../types.js\";\n\ntype OtelSpan = {\n spanContext: () => { spanId: string; traceId: string };\n setStatus: (status: { code: number; message?: string }) => void;\n setAttribute: (key: string, value: string | number | boolean | undefined) => void;\n setAttributes: (attrs: Record<string, string | number | boolean>) => void;\n recordException: (error: Error) => void;\n end: () => void;\n};\n\n/**\n * Langfuse telemetry adapter using OpenTelemetry\n */\nexport class LangfuseAdapter implements TelemetryAdapter {\n readonly name = \"langfuse\";\n readonly version = \"1.0.0\";\n\n private config: LangfuseConfig;\n private sdk: { shutdown: () => Promise<void> } | null = null;\n private activeSpans = new Map<string, OtelSpan>();\n private otelApi: typeof import(\"@opentelemetry/api\") | null = null;\n\n constructor(config: LangfuseConfig) {\n this.config = {\n baseUrl: \"https://cloud.langfuse.com\",\n ...config,\n };\n }\n\n async initialize(): Promise<void> {\n // Dynamically import Langfuse OTel SDK\n const [{ LangfuseSpanProcessor }, { NodeSDK }, otelApi] = await Promise.all([\n import(\"@langfuse/otel\"),\n import(\"@opentelemetry/sdk-node\"),\n import(\"@opentelemetry/api\"),\n ]);\n\n this.otelApi = otelApi;\n\n const processor = new LangfuseSpanProcessor({\n publicKey: this.config.publicKey,\n secretKey: this.config.secretKey,\n baseUrl: this.config.baseUrl,\n });\n\n const sdk = new NodeSDK({\n spanProcessors: [processor],\n });\n\n sdk.start();\n this.sdk = sdk;\n }\n\n async shutdown(): Promise<void> {\n if (this.sdk) {\n await this.sdk.shutdown();\n }\n }\n\n startSpan(context: SpanContext): Span {\n if (!this.otelApi) {\n throw new Error(\"LangfuseAdapter not initialized\");\n }\n\n const tracer = this.otelApi.trace.getTracer(\"struktur\");\n\n const otelSpan = tracer.startSpan(context.name, {\n attributes: {\n \"observation.type\": context.kind.toLowerCase(),\n ...context.attributes,\n },\n }) as OtelSpan;\n\n const spanContext = otelSpan.spanContext();\n const span: Span = {\n id: spanContext.spanId,\n traceId: spanContext.traceId,\n name: context.name,\n kind: context.kind,\n startTime: context.startTime ?? Date.now(),\n parentId: context.parentSpan?.id,\n };\n\n this.activeSpans.set(span.id, otelSpan);\n return span;\n }\n\n endSpan(span: Span, result?: SpanResult): void {\n const otelSpan = this.activeSpans.get(span.id);\n if (!otelSpan) return;\n\n if (result) {\n otelSpan.setStatus({\n code: result.status === \"ok\" ? 1 : 2,\n message: result.error?.message,\n });\n\n if (result.output !== undefined) {\n try {\n const outputStr = typeof result.output === \"string\"\n ? result.output\n : JSON.stringify(result.output);\n otelSpan.setAttribute(\"output\", outputStr);\n } catch {\n otelSpan.setAttribute(\"output\", \"[object]\");\n }\n }\n\n if (result.latencyMs !== undefined) {\n otelSpan.setAttribute(\"latency_ms\", result.latencyMs);\n }\n }\n\n otelSpan.end();\n this.activeSpans.delete(span.id);\n }\n\n recordEvent(span: Span, event: TelemetryEvent): void {\n const otelSpan = this.activeSpans.get(span.id);\n if (!otelSpan) return;\n\n switch (event.type) {\n case \"llm_call\":\n this.recordLLMCall(otelSpan, event);\n break;\n case \"validation\":\n this.recordValidation(otelSpan, event);\n break;\n case \"chunk\":\n this.recordChunk(otelSpan, event);\n break;\n case \"tool_call\":\n this.recordToolCall(otelSpan, event);\n break;\n case \"merge\":\n this.recordMerge(otelSpan, event);\n break;\n case \"parse\":\n this.recordParse(otelSpan, event);\n break;\n }\n }\n\n setAttributes(span: Span, attributes: Record<string, unknown>): void {\n const otelSpan = this.activeSpans.get(span.id);\n if (!otelSpan) return;\n\n const stringAttrs: Record<string, string | number | boolean> = {};\n for (const [key, value] of Object.entries(attributes)) {\n if (value !== undefined && value !== null) {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n stringAttrs[key] = value;\n } else {\n try {\n stringAttrs[key] = JSON.stringify(value);\n } catch {\n stringAttrs[key] = String(value);\n }\n }\n }\n }\n\n otelSpan.setAttributes(stringAttrs);\n }\n\n setContext(_context: TelemetryContext): void {\n // Langfuse supports session_id, user_id, metadata, tags via span attributes\n // These would be set on individual spans\n }\n\n private recordLLMCall(span: OtelSpan, event: LLMCallEvent): void {\n const attrs: Record<string, string | number | boolean> = {\n model: event.model,\n provider: event.provider,\n input: JSON.stringify(event.input.messages),\n temperature: event.input.temperature ?? \"\",\n max_tokens: event.input.maxTokens ?? \"\",\n };\n\n if (event.output) {\n attrs.output = event.output.content;\n \n if (event.output.usage) {\n attrs[\"usage.input\"] = event.output.usage.input;\n attrs[\"usage.output\"] = event.output.usage.output;\n attrs[\"usage.total\"] = event.output.usage.total;\n }\n }\n\n attrs.latency_ms = event.latencyMs;\n\n if (event.error) {\n attrs.error = event.error.message;\n span.recordException(event.error);\n }\n\n span.setAttributes(attrs);\n }\n\n private recordValidation(span: OtelSpan, event: ValidationEvent): void {\n const attrs: Record<string, string | number | boolean> = {\n attempt: event.attempt,\n max_attempts: event.maxAttempts,\n success: event.success,\n };\n\n if (event.errors && event.errors.length > 0) {\n attrs.errors = JSON.stringify(event.errors);\n }\n\n if (event.latencyMs !== undefined) {\n attrs.latency_ms = event.latencyMs;\n }\n\n span.setAttributes(attrs);\n }\n\n private recordChunk(span: OtelSpan, event: ChunkEvent): void {\n const attrs: Record<string, string | number | boolean> = {\n chunk_index: event.chunkIndex,\n chunk_total: event.totalChunks,\n chunk_tokens: event.tokens,\n chunk_images: event.images,\n };\n\n if (event.content) {\n attrs.chunk_content = event.content.slice(0, 1000);\n }\n\n span.setAttributes(attrs);\n }\n\n private recordToolCall(span: OtelSpan, event: ToolCallEvent): void {\n const attrs: Record<string, string | number | boolean> = {\n tool_name: event.toolName,\n tool_args: JSON.stringify(event.args),\n };\n\n if (event.result !== undefined) {\n try {\n attrs.tool_result = JSON.stringify(event.result);\n } catch {\n attrs.tool_result = \"[object]\";\n }\n }\n\n if (event.error) {\n attrs.tool_error = event.error.message;\n }\n\n if (event.latencyMs !== undefined) {\n attrs.latency_ms = event.latencyMs;\n }\n\n span.setAttributes(attrs);\n\n if (event.error) {\n span.recordException(event.error);\n }\n }\n\n private recordMerge(span: OtelSpan, event: MergeEvent): void {\n const attrs: Record<string, string | number | boolean> = {\n strategy: event.strategy,\n input_count: event.inputCount,\n output_count: event.outputCount,\n };\n\n if (event.deduped !== undefined) {\n attrs.deduped = event.deduped;\n }\n\n span.setAttributes(attrs);\n }\n\n private recordParse(span: OtelSpan, event: ParseEvent): void {\n span.setAttributes({\n mime_type: event.mimeType,\n parser: event.parser,\n input_size: event.inputSize,\n output_tokens: event.outputTokens,\n output_images: event.outputImages,\n latency_ms: event.latencyMs,\n });\n }\n}\n\n/**\n * Create a Langfuse telemetry adapter\n * \n * @param config - Langfuse configuration\n * @returns Langfuse telemetry adapter\n */\nexport function createLangfuseAdapter(config: LangfuseConfig): LangfuseAdapter {\n return new LangfuseAdapter(config);\n}\n\nexport type { LangfuseConfig };\n","/**\n * Langfuse telemetry adapter exports\n */\n\nexport { LangfuseAdapter, createLangfuseAdapter } from \"./LangfuseAdapter.js\";\nexport type { LangfuseConfig } from \"../../types.js\";\n","/**\n * Core telemetry types and interfaces for Struktur\n * \n * This module defines the TelemetryAdapter interface that all telemetry providers\n * must implement. The SDK uses this interface to emit telemetry events without\n * knowing about specific provider implementations.\n */\n\n/**\n * Represents the different kinds of spans that can be created during extraction\n */\nexport type SpanKind = \n | \"CHAIN\" // Extraction pipeline, strategies\n | \"LLM\" // LLM calls (generateText, generateObject)\n | \"TOOL\" // Agent tool calls (bash, read, etc.)\n | \"AGENT\" // Agent strategy execution\n | \"RETRIEVER\" // Document parsing, chunking\n | \"EMBEDDING\" // Vector embeddings (future)\n | \"RERANKER\"; // Reranking (future)\n\n/**\n * Context for creating a new span\n */\nexport interface SpanContext {\n /** Human-readable name for the span */\n name: string;\n \n /** Type of span */\n kind: SpanKind;\n \n /** Parent span for creating hierarchical traces */\n parentSpan?: Span;\n \n /** Initial attributes to set on the span */\n attributes?: Record<string, unknown>;\n \n /** Start time (defaults to now) */\n startTime?: number;\n}\n\n/**\n * Represents an active span in the telemetry system\n */\nexport interface Span {\n /** Unique identifier for this span */\n id: string;\n \n /** Trace identifier that groups related spans */\n traceId: string;\n \n /** Human-readable name */\n name: string;\n \n /** Type of span */\n kind: SpanKind;\n \n /** Unix timestamp when span started */\n startTime: number;\n \n /** Parent span ID (if any) */\n parentId?: string;\n}\n\n/**\n * Result of a completed span\n */\nexport interface SpanResult {\n /** Whether the operation succeeded or failed */\n status: \"ok\" | \"error\";\n \n /** Error details if status is \"error\" */\n error?: Error;\n \n /** Output data from the operation */\n output?: unknown;\n \n /** Latency in milliseconds */\n latencyMs?: number;\n}\n\n/**\n * Context that applies to all spans in a trace\n */\nexport interface TelemetryContext {\n /** Session identifier for grouping related extractions */\n sessionId?: string;\n \n /** User identifier */\n userId?: string;\n \n /** Additional metadata */\n metadata?: Record<string, unknown>;\n \n /** Tags for categorization */\n tags?: string[];\n}\n\n/**\n * Token usage information from LLM calls\n */\nexport interface TokenUsage {\n /** Input/prompt tokens */\n input: number;\n \n /** Output/completion tokens */\n output: number;\n \n /** Total tokens (input + output) */\n total: number;\n}\n\n/**\n * Event emitted when an LLM call is made\n */\nexport interface LLMCallEvent {\n type: \"llm_call\";\n \n /** Model identifier (e.g., \"gpt-4o\", \"claude-3-opus\") */\n model: string;\n \n /** Provider name (e.g., \"openai\", \"anthropic\") */\n provider: string;\n \n /** Input parameters */\n input: {\n /** Messages sent to the LLM */\n messages: Array<{ role: string; content: string }>;\n \n /** Temperature parameter (if set) */\n temperature?: number;\n \n /** Max tokens parameter (if set) */\n maxTokens?: number;\n \n /** JSON schema for structured output (if set) */\n schema?: unknown;\n };\n \n /** Output from the LLM (if successful) */\n output?: {\n /** Raw content from the LLM */\n content: string;\n \n /** Whether this was structured (JSON) output */\n structured?: boolean;\n \n /** Token usage information */\n usage?: TokenUsage;\n };\n \n /** Latency in milliseconds */\n latencyMs: number;\n \n /** Error if the call failed */\n error?: Error;\n}\n\n/**\n * Event emitted during schema validation\n */\nexport interface ValidationEvent {\n type: \"validation\";\n \n /** Current attempt number */\n attempt: number;\n \n /** Maximum allowed attempts */\n maxAttempts: number;\n \n /** Schema being validated against */\n schema: unknown;\n \n /** Input data being validated */\n input: unknown;\n \n /** Whether validation succeeded */\n success: boolean;\n \n /** Validation errors (if failed) */\n errors?: Array<{ path: string; message: string }>;\n \n /** Latency in milliseconds */\n latencyMs?: number;\n}\n\n/**\n * Event emitted when chunking documents\n */\nexport interface ChunkEvent {\n type: \"chunk\";\n \n /** Index of this chunk (0-based) */\n chunkIndex: number;\n \n /** Total number of chunks */\n totalChunks: number;\n \n /** Number of tokens in this chunk */\n tokens: number;\n \n /** Number of images in this chunk */\n images: number;\n \n /** Preview of chunk content (optional) */\n content?: string;\n}\n\n/**\n * Event emitted when agent tools are called\n */\nexport interface ToolCallEvent {\n type: \"tool_call\";\n \n /** Name of the tool */\n toolName: string;\n \n /** Arguments passed to the tool */\n args: Record<string, unknown>;\n \n /** Result from the tool (if successful) */\n result?: unknown;\n \n /** Error if the tool failed */\n error?: Error;\n \n /** Latency in milliseconds */\n latencyMs?: number;\n}\n\n/**\n * Event emitted when merging results from multiple chunks\n */\nexport interface MergeEvent {\n type: \"merge\";\n \n /** Merge strategy used */\n strategy: string;\n \n /** Number of input items merged */\n inputCount: number;\n \n /** Number of items after merge */\n outputCount: number;\n \n /** Number of items removed during deduplication (if applicable) */\n deduped?: number;\n}\n\n/**\n * Event emitted when parsing input files\n */\nexport interface ParseEvent {\n type: \"parse\";\n \n /** MIME type of the file */\n mimeType: string;\n \n /** Parser used (e.g., \"pdf-parse\", \"text\") */\n parser: string;\n \n /** Input file size in bytes */\n inputSize: number;\n \n /** Number of tokens in output */\n outputTokens: number;\n \n /** Number of images extracted */\n outputImages: number;\n \n /** Latency in milliseconds */\n latencyMs: number;\n}\n\n/**\n * All possible telemetry events\n */\nexport type TelemetryEvent =\n | LLMCallEvent\n | ValidationEvent\n | ChunkEvent\n | ToolCallEvent\n | MergeEvent\n | ParseEvent;\n\n/**\n * Interface that all telemetry adapters must implement.\n * This allows the SDK to emit telemetry without knowing about specific providers.\n */\nexport interface TelemetryAdapter {\n /** Provider name */\n readonly name: string;\n \n /** Adapter version */\n readonly version: string;\n \n /**\n * Initialize the telemetry adapter.\n * Must be called before any other operations.\n */\n initialize(): Promise<void>;\n \n /**\n * Shutdown the telemetry adapter.\n * Flushes any pending telemetry data.\n */\n shutdown(): Promise<void>;\n \n /**\n * Start a new span.\n * @param context - Span creation context\n * @returns The created span\n */\n startSpan(context: SpanContext): Span;\n \n /**\n * End a span and record its result.\n * @param span - Span to end\n * @param result - Optional result of the operation\n */\n endSpan(span: Span, result?: SpanResult): void;\n \n /**\n * Record an event within a span.\n * @param span - Active span to record event in\n * @param event - Event to record\n */\n recordEvent(span: Span, event: TelemetryEvent): void;\n \n /**\n * Set attributes on a span.\n * @param span - Active span\n * @param attributes - Attributes to set\n */\n setAttributes(span: Span, attributes: Record<string, unknown>): void;\n \n /**\n * Set context that applies to all spans in this trace.\n * @param context - Context to set\n */\n setContext(context: TelemetryContext): void;\n}\n\n/**\n * Configuration options for creating a telemetry adapter\n */\nexport interface TelemetryOptions {\n /** Provider name */\n provider: string;\n \n /** Provider-specific configuration */\n config: Record<string, unknown>;\n \n /** Whether telemetry is enabled (defaults to true) */\n enabled?: boolean;\n \n /** Sampling rate from 0.0 to 1.0 (1.0 = all traces) */\n sampleRate?: number;\n \n /** Whether to redact PII from traces */\n redactPii?: boolean;\n \n /** Maximum length for input content (truncate if longer) */\n maxInputLength?: number;\n \n /** Maximum length for output content (truncate if longer) */\n maxOutputLength?: number;\n}\n\n/**\n * Configuration for Phoenix telemetry\n */\nexport interface PhoenixConfig {\n /** Project name in Phoenix */\n projectName: string;\n \n /** Phoenix collector endpoint URL (defaults to http://localhost:6006) */\n url?: string;\n \n /** API key for Phoenix Cloud */\n apiKey?: string;\n \n /** Use batch processing (defaults to true for production) */\n batch?: boolean;\n \n /** Additional headers for OTLP requests */\n headers?: Record<string, string>;\n}\n\n/**\n * Configuration for Langfuse telemetry\n */\nexport interface LangfuseConfig {\n /** Langfuse public key */\n publicKey: string;\n \n /** Langfuse secret key */\n secretKey: string;\n \n /** Langfuse base URL (defaults to https://cloud.langfuse.com) */\n baseUrl?: string;\n \n /** Project name (optional) */\n projectName?: string;\n}\n\n/**\n * No-op adapter for when telemetry is disabled\n */\nexport class NoopTelemetryAdapter implements TelemetryAdapter {\n readonly name = \"noop\";\n readonly version = \"1.0.0\";\n \n private currentId = 0;\n private mockSpans = new Map<string, Span>();\n \n async initialize(): Promise<void> {\n // No-op\n }\n \n async shutdown(): Promise<void> {\n // No-op\n }\n \n startSpan(context: SpanContext): Span {\n const id = `noop-${++this.currentId}`;\n const span: Span = {\n id,\n traceId: `trace-${this.currentId}`,\n name: context.name,\n kind: context.kind,\n startTime: Date.now(),\n parentId: context.parentSpan?.id,\n };\n this.mockSpans.set(id, span);\n return span;\n }\n \n endSpan(span: Span, _result?: SpanResult): void {\n this.mockSpans.delete(span.id);\n }\n \n recordEvent(_span: Span, _event: TelemetryEvent): void {\n // No-op\n }\n \n setAttributes(_span: Span, _attributes: Record<string, unknown>): void {\n // No-op\n }\n \n setContext(_context: TelemetryContext): void {\n // No-op\n }\n}\n","/**\n * Factory function for creating telemetry adapters\n * \n * This module provides a factory function to create telemetry adapters\n * based on the specified provider. It supports lazy loading of adapter\n * implementations to avoid loading unused dependencies.\n */\n\nimport type { \n TelemetryAdapter, \n TelemetryOptions, \n PhoenixConfig, \n LangfuseConfig \n} from \"./types.js\";\nimport { NoopTelemetryAdapter } from \"./types.js\";\n\n/**\n * Create a telemetry adapter based on the specified provider.\n * \n * @param options - Telemetry configuration options\n * @returns A telemetry adapter instance, or null if disabled\n * @throws Error if the provider is unknown or required deps are missing\n * \n * @example\n * ```typescript\n * // Phoenix\n * const telemetry = await createTelemetry({\n * provider: \"phoenix\",\n * config: {\n * projectName: \"my-app\",\n * url: \"http://localhost:6006\",\n * } satisfies PhoenixConfig\n * });\n * \n * // Langfuse\n * const telemetry = await createTelemetry({\n * provider: \"langfuse\",\n * config: {\n * publicKey: \"pk-lf-xxx\",\n * secretKey: \"sk-lf-xxx\",\n * } satisfies LangfuseConfig\n * });\n * ```\n */\nexport async function createTelemetry(options: TelemetryOptions): Promise<TelemetryAdapter | null> {\n if (options.enabled === false) {\n return null;\n }\n\n const { provider, config } = options;\n\n try {\n switch (provider) {\n case \"phoenix\": {\n const { PhoenixAdapter } = await import(\"./adapters/phoenix/index.js\");\n return new PhoenixAdapter(config as unknown as PhoenixConfig);\n }\n \n case \"langfuse\": {\n const { LangfuseAdapter } = await import(\"./adapters/langfuse/index.js\");\n return new LangfuseAdapter(config as unknown as LangfuseConfig);\n }\n \n default:\n throw new Error(\n `Unknown telemetry provider: ${provider}. ` +\n `Supported providers: phoenix, langfuse`\n );\n }\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"Cannot find module\")) {\n throw new Error(\n `Provider '${provider}' requires optional dependencies. ` +\n `Install them with: bun add @arizeai/phoenix-otel @arizeai/openinference-core ` +\n `or bun add @langfuse/otel`\n );\n }\n throw error;\n }\n}\n\n/**\n * Create a Phoenix telemetry adapter.\n * \n * @param config - Phoenix configuration\n * @returns Phoenix telemetry adapter\n * \n * @example\n * ```typescript\n * import { createPhoenixTelemetry } from \"@struktur/telemetry\";\n * \n * const telemetry = await createPhoenixTelemetry({\n * projectName: \"production-extractions\",\n * url: \"https://app.phoenix.arize.com/s/my-space\",\n * apiKey: process.env.PHOENIX_API_KEY,\n * });\n * ```\n */\nexport async function createPhoenixTelemetry(config: PhoenixConfig): Promise<TelemetryAdapter> {\n const { PhoenixAdapter } = await import(\"./adapters/phoenix/index.js\");\n return new PhoenixAdapter(config);\n}\n\n/**\n * Create a Langfuse telemetry adapter.\n * \n * @param config - Langfuse configuration\n * @returns Langfuse telemetry adapter\n * \n * @example\n * ```typescript\n * import { createLangfuseTelemetry } from \"@struktur/telemetry\";\n * \n * const telemetry = await createLangfuseTelemetry({\n * publicKey: process.env.LANGFUSE_PUBLIC_KEY,\n * secretKey: process.env.LANGFUSE_SECRET_KEY,\n * baseUrl: \"https://cloud.langfuse.com\",\n * });\n * ```\n */\nexport async function createLangfuseTelemetry(config: LangfuseConfig): Promise<TelemetryAdapter> {\n const { LangfuseAdapter } = await import(\"./adapters/langfuse/index.js\");\n return new LangfuseAdapter(config);\n}\n\n/**\n * Create a no-op telemetry adapter (for testing or when telemetry is disabled).\n * \n * @returns No-op telemetry adapter\n */\nexport function createNoopTelemetry(): TelemetryAdapter {\n return new NoopTelemetryAdapter();\n}\n"],"mappings":"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","names":["PhoenixAdapter","LangfuseAdapter"]}
|