@narumitw/pi-langfuse 0.50.4 → 0.50.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/runtime.ts"],
4
- "sourcesContent": ["import { createHash } from \"node:crypto\";\nimport { LangfuseSpanProcessor } from \"@langfuse/otel\";\nimport {\n\ttype LangfuseObservation,\n\ttype LangfuseObservationAttributes,\n\tLangfuseOtelSpanAttributes,\n\tsetLangfuseTracerProvider,\n\tstartObservation,\n} from \"@langfuse/tracing\";\nimport type { SpanProcessor } from \"@opentelemetry/sdk-trace-base\";\nimport { NodeTracerProvider } from \"@opentelemetry/sdk-trace-node\";\nimport type { LangfuseConfig } from \"./config.js\";\nimport type {\n\tObservation,\n\tObservationAttributes,\n\tObservationType,\n\tTraceBackend,\n} from \"./tracing.js\";\n\nconst RUNTIME_KEY = Symbol.for(\"@narumitw/pi-langfuse/runtime/v1\");\n\ninterface SharedRuntime {\n\tfingerprint: string;\n\tbackend: ProductionTraceBackend;\n\tshutdown: boolean;\n}\n\ntype GlobalWithRuntime = typeof globalThis & {\n\t[RUNTIME_KEY]?: Promise<SharedRuntime>;\n};\n\nexport interface RuntimeFactories {\n\tcreateProcessor(config: LangfuseConfig): SpanProcessor;\n\tcreateProvider(processor: SpanProcessor): NodeTracerProvider;\n\tselectProvider(provider: NodeTracerProvider): void;\n}\n\nclass ProductionObservation implements Observation {\n\tconstructor(readonly native: LangfuseObservation) {}\n\n\tupdate(attributes: ObservationAttributes): Observation {\n\t\tconst { sessionId, userId, ...observationAttributes } = attributes;\n\t\tthis.native.updateOtelSpanAttributes(observationAttributes as LangfuseObservationAttributes);\n\t\tapplySessionId(this.native, sessionId);\n\t\tapplyUserId(this.native, userId);\n\t\treturn this;\n\t}\n\n\tupdateTrace(attributes: ObservationAttributes): Observation {\n\t\tconst { input, output, metadata, name, sessionId, userId, tags, version } = attributes;\n\t\tif (input !== undefined || output !== undefined) {\n\t\t\tthis.native.setTraceIO({ input, output });\n\t\t}\n\t\tif (name !== undefined) {\n\t\t\tthis.native.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_NAME, name);\n\t\t}\n\t\tapplySessionId(this.native, sessionId);\n\t\tapplyUserId(this.native, userId);\n\t\tif (tags !== undefined) {\n\t\t\tthis.native.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_TAGS, tags);\n\t\t}\n\t\tif (version !== undefined) {\n\t\t\tthis.native.otelSpan.setAttribute(LangfuseOtelSpanAttributes.VERSION, version);\n\t\t}\n\t\tfor (const [key, value] of Object.entries(metadata ?? {})) {\n\t\t\tthis.native.otelSpan.setAttribute(\n\t\t\t\t`${LangfuseOtelSpanAttributes.TRACE_METADATA}.${key}`,\n\t\t\t\tString(value),\n\t\t\t);\n\t\t}\n\t\treturn this;\n\t}\n\n\tend(endTime?: number): Observation {\n\t\tthis.native.end(endTime);\n\t\treturn this;\n\t}\n}\n\nclass ProductionTraceBackend implements TraceBackend {\n\tconstructor(\n\t\tprivate readonly provider: NodeTracerProvider,\n\t\tprivate readonly processor: SpanProcessor,\n\t) {}\n\n\tstart(\n\t\tname: string,\n\t\tattributes: ObservationAttributes,\n\t\toptions: { asType: ObservationType; parent?: Observation },\n\t): Observation {\n\t\tconst { sessionId, userId, ...observationAttributes } = attributes;\n\t\tconst parent = options.parent;\n\t\tconst native =\n\t\t\tparent instanceof ProductionObservation\n\t\t\t\t? startChild(parent.native, name, observationAttributes, options.asType)\n\t\t\t\t: startRoot(name, observationAttributes, options.asType);\n\t\tapplySessionId(native, sessionId);\n\t\tapplyUserId(native, userId);\n\t\treturn new ProductionObservation(native);\n\t}\n\n\tasync forceFlush(): Promise<void> {\n\t\tawait this.processor.forceFlush();\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\tawait this.provider.shutdown();\n\t}\n}\n\nexport async function createProductionBackend(\n\tconfig: LangfuseConfig,\n\tfactoryOverrides: Partial<RuntimeFactories> = {},\n): Promise<TraceBackend> {\n\tconst globalRuntime = globalThis as GlobalWithRuntime;\n\tconst fingerprint = configFingerprint(config);\n\tconst existing = globalRuntime[RUNTIME_KEY];\n\tif (existing) {\n\t\tconst runtime = await existing;\n\t\tif (runtime.shutdown) {\n\t\t\tthrow new Error(\"Langfuse tracing was already shut down; restart Pi to enable it again.\");\n\t\t}\n\t\tif (runtime.fingerprint !== fingerprint) {\n\t\t\tthrow new Error(\"Langfuse configuration changed; restart Pi to apply the new credentials.\");\n\t\t}\n\t\treturn runtime.backend;\n\t}\n\n\tconst factories = { ...defaultFactories, ...factoryOverrides };\n\tconst initializing = initializeRuntime(config, fingerprint, factories);\n\tglobalRuntime[RUNTIME_KEY] = initializing;\n\ttry {\n\t\treturn (await initializing).backend;\n\t} catch (error) {\n\t\tdelete globalRuntime[RUNTIME_KEY];\n\t\tthrow error;\n\t}\n}\n\nasync function initializeRuntime(\n\tconfig: LangfuseConfig,\n\tfingerprint: string,\n\tfactories: RuntimeFactories,\n): Promise<SharedRuntime> {\n\tconst processor = factories.createProcessor(config);\n\tlet provider: NodeTracerProvider | undefined;\n\ttry {\n\t\tprovider = factories.createProvider(processor);\n\t\tfactories.selectProvider(provider);\n\t} catch (error) {\n\t\tawait (provider?.shutdown() ?? processor.shutdown()).catch(() => undefined);\n\t\tthrow error;\n\t}\n\tconst backend = new ProductionTraceBackend(provider, processor);\n\tconst runtime: SharedRuntime = { fingerprint, backend, shutdown: false };\n\tconst originalShutdown = backend.shutdown.bind(backend);\n\tbackend.shutdown = async () => {\n\t\tif (runtime.shutdown) return;\n\t\truntime.shutdown = true;\n\t\tawait originalShutdown();\n\t};\n\treturn runtime;\n}\n\nconst defaultFactories: RuntimeFactories = {\n\tcreateProcessor: (config) => {\n\t\tconst secrets = [config.secretKey, config.publicKey];\n\t\treturn new LangfuseSpanProcessor({\n\t\t\tpublicKey: config.publicKey,\n\t\t\tsecretKey: config.secretKey,\n\t\t\tbaseUrl: config.baseUrl,\n\t\t\tenvironment: config.environment ?? \"\",\n\t\t\trelease: config.release ?? \"\",\n\t\t\tflushAt: 512,\n\t\t\tflushInterval: 5,\n\t\t\ttimeout: 5,\n\t\t\tmask: ({ data }) => maskSecrets(data, secrets),\n\t\t\tshouldExportSpan: ({ otelSpan }) =>\n\t\t\t\ttypeof otelSpan.attributes[\"langfuse.observation.type\"] === \"string\",\n\t\t});\n\t},\n\tcreateProvider: (processor) => new NodeTracerProvider({ spanProcessors: [processor] }),\n\tselectProvider: setLangfuseTracerProvider,\n};\n\nfunction applySessionId(observation: LangfuseObservation, sessionId: string | undefined): void {\n\tif (sessionId !== undefined) {\n\t\tobservation.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_SESSION_ID, sessionId);\n\t}\n}\n\nfunction applyUserId(observation: LangfuseObservation, userId: string | undefined): void {\n\tif (userId !== undefined) {\n\t\tobservation.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_USER_ID, userId);\n\t}\n}\n\nfunction startRoot(\n\tname: string,\n\tattributes: ObservationAttributes,\n\ttype: ObservationType,\n): LangfuseObservation {\n\tif (type === \"agent\") {\n\t\treturn startObservation(name, attributes as LangfuseObservationAttributes, { asType: \"agent\" });\n\t}\n\tif (type === \"generation\") {\n\t\treturn startObservation(name, attributes as LangfuseObservationAttributes, {\n\t\t\tasType: \"generation\",\n\t\t});\n\t}\n\tif (type === \"tool\") {\n\t\treturn startObservation(name, attributes as LangfuseObservationAttributes, { asType: \"tool\" });\n\t}\n\treturn startObservation(name, attributes as LangfuseObservationAttributes, { asType: \"span\" });\n}\n\nfunction startChild(\n\tparent: LangfuseObservation,\n\tname: string,\n\tattributes: ObservationAttributes,\n\ttype: ObservationType,\n): LangfuseObservation {\n\tif (type === \"agent\") {\n\t\treturn parent.startObservation(name, attributes as LangfuseObservationAttributes, {\n\t\t\tasType: \"agent\",\n\t\t});\n\t}\n\tif (type === \"generation\") {\n\t\treturn parent.startObservation(name, attributes as LangfuseObservationAttributes, {\n\t\t\tasType: \"generation\",\n\t\t});\n\t}\n\tif (type === \"tool\") {\n\t\treturn parent.startObservation(name, attributes as LangfuseObservationAttributes, {\n\t\t\tasType: \"tool\",\n\t\t});\n\t}\n\treturn parent.startObservation(name, attributes as LangfuseObservationAttributes, {\n\t\tasType: \"span\",\n\t});\n}\n\nfunction configFingerprint(config: LangfuseConfig): string {\n\treturn createHash(\"sha256\")\n\t\t.update(\n\t\t\t`${config.publicKey}\\0${config.secretKey}\\0${config.baseUrl}\\0${config.environment ?? \"\"}\\0${config.release ?? \"\"}`,\n\t\t)\n\t\t.digest(\"hex\");\n}\n\nexport function maskSecrets(data: unknown, secrets: readonly string[]): unknown {\n\treturn maskSecretValue(data, secrets, new WeakSet<object>());\n}\n\nfunction maskSecretValue(\n\tdata: unknown,\n\tsecrets: readonly string[],\n\tactive: WeakSet<object>,\n): unknown {\n\tif (typeof data === \"string\") {\n\t\tlet masked = data.replace(/\\b(?:sk|pk)-lf-[A-Za-z0-9_-]+\\b/g, \"[LANGFUSE_KEY_REDACTED]\");\n\t\tfor (const secret of secrets) {\n\t\t\tif (secret) masked = masked.replaceAll(secret, \"[LANGFUSE_KEY_REDACTED]\");\n\t\t}\n\t\treturn masked;\n\t}\n\tif (!data || typeof data !== \"object\") return data;\n\tif (active.has(data)) return \"[circular]\";\n\n\tactive.add(data);\n\ttry {\n\t\tif (Array.isArray(data)) {\n\t\t\treturn data.map((item) => maskSecretValue(item, secrets, active));\n\t\t}\n\t\treturn Object.fromEntries(\n\t\t\tObject.entries(data).map(([key, value]) => [key, maskSecretValue(value, secrets, active)]),\n\t\t);\n\t} finally {\n\t\tactive.delete(data);\n\t}\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }