@narumitw/pi-langfuse 0.50.6 → 0.51.1
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 +82 -4
- package/dist/chunks/chunk-DBQAWNKG.ts +316 -0
- package/dist/chunks/chunk-DBQAWNKG.ts.map +7 -0
- package/dist/chunks/runtime-6ZHLVC3A.ts +352 -0
- package/dist/chunks/runtime-6ZHLVC3A.ts.map +7 -0
- package/dist/config.d.ts +33 -0
- package/dist/git.d.ts +5 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1551 -0
- package/dist/index.js.map +7 -0
- package/dist/index.ts +588 -479
- package/dist/index.ts.map +4 -4
- package/dist/langfuse.d.ts +13 -0
- package/dist/library-chunks/chunk-SAJ76IYU.js +316 -0
- package/dist/library-chunks/chunk-SAJ76IYU.js.map +7 -0
- package/dist/library-chunks/runtime-A6SQ6VEH.js +352 -0
- package/dist/library-chunks/runtime-A6SQ6VEH.js.map +7 -0
- package/dist/pi-session.d.ts +43 -0
- package/dist/public-api.d.ts +4 -0
- package/dist/runtime-core.d.ts +26 -0
- package/dist/runtime.d.ts +22 -0
- package/dist/sanitizer.d.ts +2 -0
- package/dist/tracing.d.ts +202 -0
- package/package.json +11 -3
- package/src/git.ts +60 -0
- package/src/index.ts +9 -0
- package/src/langfuse.ts +88 -292
- package/src/pi-session.ts +570 -0
- package/src/public-api.ts +17 -0
- package/src/runtime-core.ts +113 -0
- package/src/runtime.ts +234 -51
- package/src/sanitizer.ts +10 -7
- package/src/tracing.ts +52 -14
- package/dist/chunks/runtime-X75FRK2E.js +0 -215
- package/dist/chunks/runtime-X75FRK2E.js.map +0 -7
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
// @generated by scripts/build-runtime.mjs; do not edit.
|
|
2
|
+
// @ts-nocheck -- the generated entry uses a .ts extension for Pi's Jiti loader.
|
|
3
|
+
import {
|
|
4
|
+
DEFAULT_BASE_URL,
|
|
5
|
+
createLangfuseRuntimeFromBackend,
|
|
6
|
+
getLangfuseRuntimeInternal
|
|
7
|
+
} from "./chunk-SAJ76IYU.js";
|
|
8
|
+
|
|
9
|
+
// src/runtime.ts
|
|
10
|
+
import { createHash } from "node:crypto";
|
|
11
|
+
import { LangfuseSpanProcessor } from "@langfuse/otel";
|
|
12
|
+
import {
|
|
13
|
+
LangfuseOtelSpanAttributes,
|
|
14
|
+
setLangfuseTracerProvider,
|
|
15
|
+
startObservation
|
|
16
|
+
} from "@langfuse/tracing";
|
|
17
|
+
import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
|
|
18
|
+
var RUNTIME_KEY = /* @__PURE__ */ Symbol.for("@narumitw/pi-langfuse/runtime/v2");
|
|
19
|
+
var LEGACY_RUNTIME_KEY = /* @__PURE__ */ Symbol.for("@narumitw/pi-langfuse/runtime/v1");
|
|
20
|
+
var ProductionObservation = class {
|
|
21
|
+
constructor(native, secrets) {
|
|
22
|
+
this.native = native;
|
|
23
|
+
this.secrets = secrets;
|
|
24
|
+
this.traceId = native.traceId;
|
|
25
|
+
}
|
|
26
|
+
native;
|
|
27
|
+
secrets;
|
|
28
|
+
traceId;
|
|
29
|
+
update(attributes) {
|
|
30
|
+
const { sessionId, userId, ...observationAttributes } = maskObservationAttributes(attributes, this.secrets);
|
|
31
|
+
this.native.updateOtelSpanAttributes(observationAttributes);
|
|
32
|
+
applySessionId(this.native, sessionId);
|
|
33
|
+
applyUserId(this.native, userId);
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
updateTrace(attributes) {
|
|
37
|
+
const { input, output, metadata, name, sessionId, userId, tags, version } = maskObservationAttributes(
|
|
38
|
+
attributes,
|
|
39
|
+
this.secrets
|
|
40
|
+
);
|
|
41
|
+
if (input !== void 0 || output !== void 0) {
|
|
42
|
+
this.native.setTraceIO({ input, output });
|
|
43
|
+
}
|
|
44
|
+
if (name !== void 0) {
|
|
45
|
+
this.native.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_NAME, name);
|
|
46
|
+
}
|
|
47
|
+
applySessionId(this.native, sessionId);
|
|
48
|
+
applyUserId(this.native, userId);
|
|
49
|
+
if (tags !== void 0) {
|
|
50
|
+
this.native.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_TAGS, tags);
|
|
51
|
+
}
|
|
52
|
+
if (version !== void 0) {
|
|
53
|
+
this.native.otelSpan.setAttribute(LangfuseOtelSpanAttributes.VERSION, version);
|
|
54
|
+
}
|
|
55
|
+
for (const [key, value] of Object.entries(metadata ?? {})) {
|
|
56
|
+
const serialized = serializeMetadataValue(value);
|
|
57
|
+
if (serialized !== void 0) {
|
|
58
|
+
this.native.otelSpan.setAttribute(`${LangfuseOtelSpanAttributes.TRACE_METADATA}.${key}`, serialized);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
end(endTime) {
|
|
64
|
+
this.native.end(endTime);
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
var ProductionTraceBackend = class {
|
|
69
|
+
constructor(provider, processor, secrets) {
|
|
70
|
+
this.provider = provider;
|
|
71
|
+
this.processor = processor;
|
|
72
|
+
this.secrets = secrets;
|
|
73
|
+
}
|
|
74
|
+
provider;
|
|
75
|
+
processor;
|
|
76
|
+
secrets;
|
|
77
|
+
start(name, attributes, options) {
|
|
78
|
+
const maskedName = maskSecretString(name, this.secrets);
|
|
79
|
+
const { sessionId, userId, ...observationAttributes } = maskObservationAttributes(attributes, this.secrets);
|
|
80
|
+
const parent = options.parent;
|
|
81
|
+
const native = parent instanceof ProductionObservation ? startChild(parent.native, maskedName, observationAttributes, options.asType, options.startTime) : startRoot(maskedName, observationAttributes, options.asType, options.startTime);
|
|
82
|
+
applySessionId(native, sessionId);
|
|
83
|
+
applyUserId(native, userId);
|
|
84
|
+
return new ProductionObservation(native, this.secrets);
|
|
85
|
+
}
|
|
86
|
+
async forceFlush() {
|
|
87
|
+
await this.processor.forceFlush();
|
|
88
|
+
}
|
|
89
|
+
async shutdown() {
|
|
90
|
+
await this.provider.shutdown();
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
async function createLangfuseRuntime(options = {}) {
|
|
94
|
+
return createSharedRuntime(resolveLangfuseRuntimeConfig(options), defaultFactories);
|
|
95
|
+
}
|
|
96
|
+
async function createProductionBackend(config, factoryOverrides = {}) {
|
|
97
|
+
const runtime = await createSharedRuntime(resolveLangfuseRuntimeConfig({ config, env: false }), {
|
|
98
|
+
...defaultFactories,
|
|
99
|
+
...factoryOverrides
|
|
100
|
+
});
|
|
101
|
+
return getLangfuseRuntimeInternal(runtime).backend;
|
|
102
|
+
}
|
|
103
|
+
async function createSharedRuntime(config, factories) {
|
|
104
|
+
const globalRuntime = globalThis;
|
|
105
|
+
const fingerprint = configFingerprint(config);
|
|
106
|
+
const existing = globalRuntime[RUNTIME_KEY];
|
|
107
|
+
const legacyRuntime = globalRuntime[LEGACY_RUNTIME_KEY];
|
|
108
|
+
if (legacyRuntime !== void 0 && legacyRuntime !== existing) {
|
|
109
|
+
throw new Error("An older Langfuse runtime is already loaded; restart the process before enabling this version.");
|
|
110
|
+
}
|
|
111
|
+
if (existing) {
|
|
112
|
+
if (legacyRuntime === void 0) globalRuntime[LEGACY_RUNTIME_KEY] = existing;
|
|
113
|
+
const shared = await existing;
|
|
114
|
+
if (shared.runtime.closed) {
|
|
115
|
+
throw new Error("Langfuse tracing was already shut down; restart the process to enable it again.");
|
|
116
|
+
}
|
|
117
|
+
if (shared.fingerprint !== fingerprint) {
|
|
118
|
+
throw new Error("Langfuse configuration changed; restart the process to apply the new credentials.");
|
|
119
|
+
}
|
|
120
|
+
return shared.runtime;
|
|
121
|
+
}
|
|
122
|
+
const initializing = initializeRuntime(config, fingerprint, factories);
|
|
123
|
+
globalRuntime[RUNTIME_KEY] = initializing;
|
|
124
|
+
globalRuntime[LEGACY_RUNTIME_KEY] = initializing;
|
|
125
|
+
try {
|
|
126
|
+
return (await initializing).runtime;
|
|
127
|
+
} catch (error) {
|
|
128
|
+
if (globalRuntime[RUNTIME_KEY] === initializing) delete globalRuntime[RUNTIME_KEY];
|
|
129
|
+
if (globalRuntime[LEGACY_RUNTIME_KEY] === initializing) delete globalRuntime[LEGACY_RUNTIME_KEY];
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async function initializeRuntime(config, fingerprint, factories) {
|
|
134
|
+
const processor = factories.createProcessor(config);
|
|
135
|
+
let provider;
|
|
136
|
+
try {
|
|
137
|
+
provider = factories.createProvider(processor);
|
|
138
|
+
factories.selectProvider(provider);
|
|
139
|
+
} catch (error) {
|
|
140
|
+
await (provider?.shutdown() ?? processor.shutdown()).catch(() => void 0);
|
|
141
|
+
throw error;
|
|
142
|
+
}
|
|
143
|
+
const runtime = getLangfuseRuntimeInternal(
|
|
144
|
+
createLangfuseRuntimeFromBackend(
|
|
145
|
+
new ProductionTraceBackend(provider, processor, [config.publicKey, config.secretKey])
|
|
146
|
+
)
|
|
147
|
+
);
|
|
148
|
+
return { fingerprint, runtime, shutdown: true };
|
|
149
|
+
}
|
|
150
|
+
var defaultFactories = {
|
|
151
|
+
createProcessor: (config) => {
|
|
152
|
+
const secrets = [config.secretKey, config.publicKey];
|
|
153
|
+
return new LangfuseSpanProcessor({
|
|
154
|
+
publicKey: config.publicKey,
|
|
155
|
+
secretKey: config.secretKey,
|
|
156
|
+
baseUrl: config.baseUrl,
|
|
157
|
+
environment: config.environment ?? "",
|
|
158
|
+
release: config.release ?? "",
|
|
159
|
+
flushAt: 512,
|
|
160
|
+
flushInterval: 5,
|
|
161
|
+
timeout: 5,
|
|
162
|
+
mask: ({ data }) => maskSecrets(data, secrets),
|
|
163
|
+
shouldExportSpan: ({ otelSpan }) => typeof otelSpan.attributes["langfuse.observation.type"] === "string"
|
|
164
|
+
});
|
|
165
|
+
},
|
|
166
|
+
createProvider: (processor) => new NodeTracerProvider({ spanProcessors: [processor] }),
|
|
167
|
+
selectProvider: setLangfuseTracerProvider
|
|
168
|
+
};
|
|
169
|
+
function resolveLangfuseRuntimeConfig(options) {
|
|
170
|
+
const env = options.env === false ? void 0 : options.env ?? process.env;
|
|
171
|
+
const publicKey = requiredSetting("publicKey", options.config?.publicKey, env?.LANGFUSE_PUBLIC_KEY);
|
|
172
|
+
const secretKey = requiredSetting("secretKey", options.config?.secretKey, env?.LANGFUSE_SECRET_KEY);
|
|
173
|
+
const explicitBaseUrl = options.config?.baseUrl;
|
|
174
|
+
if (explicitBaseUrl !== void 0 && !normalizeString(explicitBaseUrl)) {
|
|
175
|
+
throw new Error("Langfuse baseUrl must be a non-empty string.");
|
|
176
|
+
}
|
|
177
|
+
const rawBaseUrl = selectedSetting(explicitBaseUrl, env?.LANGFUSE_BASE_URL) ?? DEFAULT_BASE_URL;
|
|
178
|
+
const baseUrl = normalizeBaseUrl(rawBaseUrl);
|
|
179
|
+
if (!baseUrl) {
|
|
180
|
+
throw new Error("Langfuse baseUrl must use HTTP or HTTPS without credentials, a query, or a fragment.");
|
|
181
|
+
}
|
|
182
|
+
const environment = optionalSetting("environment", options.config?.environment, env?.LANGFUSE_TRACING_ENVIRONMENT);
|
|
183
|
+
if (environment && (environment.length > 40 || !/^(?!langfuse)[a-z0-9_-]+$/u.test(environment))) {
|
|
184
|
+
throw new Error(
|
|
185
|
+
"Langfuse environment must be at most 40 lowercase letters, numbers, hyphens, or underscores and must not start with langfuse."
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
const release = optionalSetting("release", options.config?.release, env?.LANGFUSE_RELEASE);
|
|
189
|
+
return { publicKey, secretKey, baseUrl, ...environment ? { environment } : {}, ...release ? { release } : {} };
|
|
190
|
+
}
|
|
191
|
+
function requiredSetting(name, explicit, environment) {
|
|
192
|
+
const value = selectedSetting(explicit, environment);
|
|
193
|
+
if (!value) throw new Error(`Langfuse ${name} is required.`);
|
|
194
|
+
return value;
|
|
195
|
+
}
|
|
196
|
+
function optionalSetting(name, explicit, environment) {
|
|
197
|
+
const selected = explicit !== void 0 ? explicit : environment;
|
|
198
|
+
if (selected === void 0) return void 0;
|
|
199
|
+
const value = normalizeString(selected);
|
|
200
|
+
if (!value) throw new Error(`Langfuse ${name} must be a non-empty string.`);
|
|
201
|
+
return value;
|
|
202
|
+
}
|
|
203
|
+
function selectedSetting(explicit, environment) {
|
|
204
|
+
if (explicit !== void 0) return normalizeString(explicit);
|
|
205
|
+
return normalizeString(environment);
|
|
206
|
+
}
|
|
207
|
+
function normalizeBaseUrl(value) {
|
|
208
|
+
try {
|
|
209
|
+
const url = new URL(value);
|
|
210
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") return void 0;
|
|
211
|
+
if (url.username || url.password || url.search || url.hash) return void 0;
|
|
212
|
+
return url.toString().replace(/\/+$/, "");
|
|
213
|
+
} catch {
|
|
214
|
+
return void 0;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
function normalizeString(value) {
|
|
218
|
+
return typeof value === "string" && value.trim() ? value.trim() : void 0;
|
|
219
|
+
}
|
|
220
|
+
function serializeMetadataValue(value) {
|
|
221
|
+
return typeof value === "string" ? value : JSON.stringify(value);
|
|
222
|
+
}
|
|
223
|
+
function maskObservationAttributes(attributes, secrets) {
|
|
224
|
+
return {
|
|
225
|
+
...attributes,
|
|
226
|
+
...attributes.metadata ? { metadata: maskSecrets(attributes.metadata, secrets) } : {},
|
|
227
|
+
...attributes.name ? { name: maskSecretString(attributes.name, secrets) } : {},
|
|
228
|
+
...attributes.sessionId ? { sessionId: maskSecretString(attributes.sessionId, secrets) } : {},
|
|
229
|
+
...attributes.userId ? { userId: maskSecretString(attributes.userId, secrets) } : {},
|
|
230
|
+
...attributes.tags ? { tags: attributes.tags.map((tag) => maskSecretString(tag, secrets)) } : {},
|
|
231
|
+
...attributes.statusMessage ? { statusMessage: maskSecretString(attributes.statusMessage, secrets) } : {},
|
|
232
|
+
...attributes.model ? { model: maskSecretString(attributes.model, secrets) } : {},
|
|
233
|
+
...attributes.version ? { version: maskSecretString(attributes.version, secrets) } : {},
|
|
234
|
+
...attributes.modelParameters ? {
|
|
235
|
+
modelParameters: Object.fromEntries(
|
|
236
|
+
Object.entries(attributes.modelParameters).map(([key, value]) => [
|
|
237
|
+
maskSecretString(key, secrets),
|
|
238
|
+
typeof value === "string" ? maskSecretString(value, secrets) : value
|
|
239
|
+
])
|
|
240
|
+
)
|
|
241
|
+
} : {}
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
function maskSecretString(value, secrets) {
|
|
245
|
+
return maskSecrets(value, secrets);
|
|
246
|
+
}
|
|
247
|
+
function applySessionId(observation, sessionId) {
|
|
248
|
+
if (sessionId !== void 0) {
|
|
249
|
+
observation.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_SESSION_ID, sessionId);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
function applyUserId(observation, userId) {
|
|
253
|
+
if (userId !== void 0) {
|
|
254
|
+
observation.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_USER_ID, userId);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
function startRoot(name, attributes, type, startTime) {
|
|
258
|
+
if (type === "agent") {
|
|
259
|
+
return startObservation(name, attributes, { asType: "agent", startTime });
|
|
260
|
+
}
|
|
261
|
+
if (type === "generation") {
|
|
262
|
+
return startObservation(name, attributes, {
|
|
263
|
+
asType: "generation",
|
|
264
|
+
startTime
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
if (type === "tool") {
|
|
268
|
+
return startObservation(name, attributes, { asType: "tool", startTime });
|
|
269
|
+
}
|
|
270
|
+
return startObservation(name, attributes, { asType: "span", startTime });
|
|
271
|
+
}
|
|
272
|
+
function startChild(parent, name, attributes, type, startTime) {
|
|
273
|
+
if (startTime) {
|
|
274
|
+
const parentSpanContext = parent.otelSpan.spanContext();
|
|
275
|
+
if (type === "agent") {
|
|
276
|
+
return startObservation(name, attributes, {
|
|
277
|
+
asType: "agent",
|
|
278
|
+
parentSpanContext,
|
|
279
|
+
startTime
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
if (type === "generation") {
|
|
283
|
+
return startObservation(name, attributes, {
|
|
284
|
+
asType: "generation",
|
|
285
|
+
parentSpanContext,
|
|
286
|
+
startTime
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
if (type === "tool") {
|
|
290
|
+
return startObservation(name, attributes, {
|
|
291
|
+
asType: "tool",
|
|
292
|
+
parentSpanContext,
|
|
293
|
+
startTime
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
return startObservation(name, attributes, {
|
|
297
|
+
asType: "span",
|
|
298
|
+
parentSpanContext,
|
|
299
|
+
startTime
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
if (type === "agent") {
|
|
303
|
+
return parent.startObservation(name, attributes, { asType: "agent" });
|
|
304
|
+
}
|
|
305
|
+
if (type === "generation") {
|
|
306
|
+
return parent.startObservation(name, attributes, { asType: "generation" });
|
|
307
|
+
}
|
|
308
|
+
if (type === "tool") {
|
|
309
|
+
return parent.startObservation(name, attributes, { asType: "tool" });
|
|
310
|
+
}
|
|
311
|
+
return parent.startObservation(name, attributes, { asType: "span" });
|
|
312
|
+
}
|
|
313
|
+
function configFingerprint(config) {
|
|
314
|
+
return createHash("sha256").update(
|
|
315
|
+
`${config.publicKey}\0${config.secretKey}\0${config.baseUrl}\0${config.environment ?? ""}\0${config.release ?? ""}`
|
|
316
|
+
).digest("hex");
|
|
317
|
+
}
|
|
318
|
+
function maskSecrets(data, secrets) {
|
|
319
|
+
return maskSecretValue(data, secrets, /* @__PURE__ */ new WeakSet());
|
|
320
|
+
}
|
|
321
|
+
function maskSecretValue(data, secrets, active) {
|
|
322
|
+
if (typeof data === "string") {
|
|
323
|
+
let masked = data.replace(/\b(?:sk|pk)-lf-[A-Za-z0-9_-]+\b/g, "[LANGFUSE_KEY_REDACTED]");
|
|
324
|
+
for (const secret of secrets) {
|
|
325
|
+
if (secret) masked = masked.replaceAll(secret, "[LANGFUSE_KEY_REDACTED]");
|
|
326
|
+
}
|
|
327
|
+
return masked;
|
|
328
|
+
}
|
|
329
|
+
if (!data || typeof data !== "object") return data;
|
|
330
|
+
if (active.has(data)) return "[circular]";
|
|
331
|
+
active.add(data);
|
|
332
|
+
try {
|
|
333
|
+
if (Array.isArray(data)) {
|
|
334
|
+
return data.map((item) => maskSecretValue(item, secrets, active));
|
|
335
|
+
}
|
|
336
|
+
return Object.fromEntries(
|
|
337
|
+
Object.entries(data).map(([key, value]) => [
|
|
338
|
+
maskSecretString(key, secrets),
|
|
339
|
+
maskSecretValue(value, secrets, active)
|
|
340
|
+
])
|
|
341
|
+
);
|
|
342
|
+
} finally {
|
|
343
|
+
active.delete(data);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
export {
|
|
347
|
+
createLangfuseRuntime,
|
|
348
|
+
createProductionBackend,
|
|
349
|
+
maskSecrets,
|
|
350
|
+
resolveLangfuseRuntimeConfig
|
|
351
|
+
};
|
|
352
|
+
//# sourceMappingURL=runtime-A6SQ6VEH.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/runtime.ts"],
|
|
4
|
+
"sourcesContent": ["import { createHash } from \"node:crypto\";\nimport { LangfuseSpanProcessor } from \"@langfuse/otel\";\nimport {\n type LangfuseObservation,\n type LangfuseObservationAttributes,\n LangfuseOtelSpanAttributes,\n setLangfuseTracerProvider,\n startObservation,\n} from \"@langfuse/tracing\";\nimport type { SpanProcessor } from \"@opentelemetry/sdk-trace-base\";\nimport { NodeTracerProvider } from \"@opentelemetry/sdk-trace-node\";\nimport { DEFAULT_BASE_URL, type LangfuseConfig } from \"./config.js\";\nimport {\n type CreateLangfuseRuntimeOptions,\n createLangfuseRuntimeFromBackend,\n getLangfuseRuntimeInternal,\n type LangfuseRuntime,\n type LangfuseRuntimeInternal,\n} from \"./runtime-core.js\";\nimport type { Observation, ObservationAttributes, ObservationType, TraceBackend } from \"./tracing.js\";\n\nexport type {\n CreateLangfuseRuntimeOptions,\n LangfuseRuntime,\n LangfuseRuntimeConfig,\n} from \"./runtime-core.js\";\n\nconst RUNTIME_KEY = Symbol.for(\"@narumitw/pi-langfuse/runtime/v2\");\nconst LEGACY_RUNTIME_KEY = Symbol.for(\"@narumitw/pi-langfuse/runtime/v1\");\n\ninterface ResolvedRuntimeConfig {\n publicKey: string;\n secretKey: string;\n baseUrl: string;\n environment?: string;\n release?: string;\n}\n\ninterface SharedRuntime {\n fingerprint: string;\n runtime: LangfuseRuntimeInternal;\n shutdown: true;\n}\n\ntype GlobalWithRuntime = typeof globalThis & {\n [RUNTIME_KEY]?: Promise<SharedRuntime>;\n [LEGACY_RUNTIME_KEY]?: unknown;\n};\n\nexport interface RuntimeFactories {\n createProcessor(config: ResolvedRuntimeConfig): SpanProcessor;\n createProvider(processor: SpanProcessor): NodeTracerProvider;\n selectProvider(provider: NodeTracerProvider): void;\n}\n\nclass ProductionObservation implements Observation {\n readonly traceId: string;\n\n constructor(\n readonly native: LangfuseObservation,\n private readonly secrets: readonly string[],\n ) {\n this.traceId = native.traceId;\n }\n\n update(attributes: ObservationAttributes): Observation {\n const { sessionId, userId, ...observationAttributes } = maskObservationAttributes(attributes, this.secrets);\n this.native.updateOtelSpanAttributes(observationAttributes as LangfuseObservationAttributes);\n applySessionId(this.native, sessionId);\n applyUserId(this.native, userId);\n return this;\n }\n\n updateTrace(attributes: ObservationAttributes): Observation {\n const { input, output, metadata, name, sessionId, userId, tags, version } = maskObservationAttributes(\n attributes,\n this.secrets,\n );\n if (input !== undefined || output !== undefined) {\n this.native.setTraceIO({ input, output });\n }\n if (name !== undefined) {\n this.native.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_NAME, name);\n }\n applySessionId(this.native, sessionId);\n applyUserId(this.native, userId);\n if (tags !== undefined) {\n this.native.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_TAGS, tags);\n }\n if (version !== undefined) {\n this.native.otelSpan.setAttribute(LangfuseOtelSpanAttributes.VERSION, version);\n }\n for (const [key, value] of Object.entries(metadata ?? {})) {\n const serialized = serializeMetadataValue(value);\n if (serialized !== undefined) {\n this.native.otelSpan.setAttribute(`${LangfuseOtelSpanAttributes.TRACE_METADATA}.${key}`, serialized);\n }\n }\n return this;\n }\n\n end(endTime?: number): Observation {\n this.native.end(endTime);\n return this;\n }\n}\n\nclass ProductionTraceBackend implements TraceBackend {\n constructor(\n private readonly provider: NodeTracerProvider,\n private readonly processor: SpanProcessor,\n private readonly secrets: readonly string[],\n ) {}\n\n start(\n name: string,\n attributes: ObservationAttributes,\n options: { asType: ObservationType; parent?: Observation; startTime?: Date },\n ): Observation {\n const maskedName = maskSecretString(name, this.secrets);\n const { sessionId, userId, ...observationAttributes } = maskObservationAttributes(attributes, this.secrets);\n const parent = options.parent;\n const native =\n parent instanceof ProductionObservation\n ? startChild(parent.native, maskedName, observationAttributes, options.asType, options.startTime)\n : startRoot(maskedName, observationAttributes, options.asType, options.startTime);\n applySessionId(native, sessionId);\n applyUserId(native, userId);\n return new ProductionObservation(native, this.secrets);\n }\n\n async forceFlush(): Promise<void> {\n await this.processor.forceFlush();\n }\n\n async shutdown(): Promise<void> {\n await this.provider.shutdown();\n }\n}\n\nexport async function createLangfuseRuntime(options: CreateLangfuseRuntimeOptions = {}): Promise<LangfuseRuntime> {\n return createSharedRuntime(resolveLangfuseRuntimeConfig(options), defaultFactories);\n}\n\nexport async function createProductionBackend(\n config: LangfuseConfig,\n factoryOverrides: Partial<RuntimeFactories> = {},\n): Promise<TraceBackend> {\n const runtime = await createSharedRuntime(resolveLangfuseRuntimeConfig({ config, env: false }), {\n ...defaultFactories,\n ...factoryOverrides,\n });\n return getLangfuseRuntimeInternal(runtime).backend;\n}\n\nasync function createSharedRuntime(\n config: ResolvedRuntimeConfig,\n factories: RuntimeFactories,\n): Promise<LangfuseRuntime> {\n const globalRuntime = globalThis as GlobalWithRuntime;\n const fingerprint = configFingerprint(config);\n const existing = globalRuntime[RUNTIME_KEY];\n const legacyRuntime = globalRuntime[LEGACY_RUNTIME_KEY];\n if (legacyRuntime !== undefined && legacyRuntime !== existing) {\n throw new Error(\"An older Langfuse runtime is already loaded; restart the process before enabling this version.\");\n }\n if (existing) {\n if (legacyRuntime === undefined) globalRuntime[LEGACY_RUNTIME_KEY] = existing;\n const shared = await existing;\n if (shared.runtime.closed) {\n throw new Error(\"Langfuse tracing was already shut down; restart the process to enable it again.\");\n }\n if (shared.fingerprint !== fingerprint) {\n throw new Error(\"Langfuse configuration changed; restart the process to apply the new credentials.\");\n }\n return shared.runtime;\n }\n\n const initializing = initializeRuntime(config, fingerprint, factories);\n globalRuntime[RUNTIME_KEY] = initializing;\n globalRuntime[LEGACY_RUNTIME_KEY] = initializing;\n try {\n return (await initializing).runtime;\n } catch (error) {\n if (globalRuntime[RUNTIME_KEY] === initializing) delete globalRuntime[RUNTIME_KEY];\n if (globalRuntime[LEGACY_RUNTIME_KEY] === initializing) delete globalRuntime[LEGACY_RUNTIME_KEY];\n throw error;\n }\n}\n\nasync function initializeRuntime(\n config: ResolvedRuntimeConfig,\n fingerprint: string,\n factories: RuntimeFactories,\n): Promise<SharedRuntime> {\n const processor = factories.createProcessor(config);\n let provider: NodeTracerProvider | undefined;\n try {\n provider = factories.createProvider(processor);\n factories.selectProvider(provider);\n } catch (error) {\n await (provider?.shutdown() ?? processor.shutdown()).catch(() => undefined);\n throw error;\n }\n const runtime = getLangfuseRuntimeInternal(\n createLangfuseRuntimeFromBackend(\n new ProductionTraceBackend(provider, processor, [config.publicKey, config.secretKey]),\n ),\n );\n return { fingerprint, runtime, shutdown: true };\n}\n\nconst defaultFactories: RuntimeFactories = {\n createProcessor: (config) => {\n const secrets = [config.secretKey, config.publicKey];\n return new LangfuseSpanProcessor({\n publicKey: config.publicKey,\n secretKey: config.secretKey,\n baseUrl: config.baseUrl,\n environment: config.environment ?? \"\",\n release: config.release ?? \"\",\n flushAt: 512,\n flushInterval: 5,\n timeout: 5,\n mask: ({ data }) => maskSecrets(data, secrets),\n shouldExportSpan: ({ otelSpan }) => typeof otelSpan.attributes[\"langfuse.observation.type\"] === \"string\",\n });\n },\n createProvider: (processor) => new NodeTracerProvider({ spanProcessors: [processor] }),\n selectProvider: setLangfuseTracerProvider,\n};\n\nexport function resolveLangfuseRuntimeConfig(options: CreateLangfuseRuntimeOptions): ResolvedRuntimeConfig {\n const env = options.env === false ? undefined : (options.env ?? process.env);\n const publicKey = requiredSetting(\"publicKey\", options.config?.publicKey, env?.LANGFUSE_PUBLIC_KEY);\n const secretKey = requiredSetting(\"secretKey\", options.config?.secretKey, env?.LANGFUSE_SECRET_KEY);\n const explicitBaseUrl = options.config?.baseUrl;\n if (explicitBaseUrl !== undefined && !normalizeString(explicitBaseUrl)) {\n throw new Error(\"Langfuse baseUrl must be a non-empty string.\");\n }\n const rawBaseUrl = selectedSetting(explicitBaseUrl, env?.LANGFUSE_BASE_URL) ?? DEFAULT_BASE_URL;\n const baseUrl = normalizeBaseUrl(rawBaseUrl);\n if (!baseUrl) {\n throw new Error(\"Langfuse baseUrl must use HTTP or HTTPS without credentials, a query, or a fragment.\");\n }\n const environment = optionalSetting(\"environment\", options.config?.environment, env?.LANGFUSE_TRACING_ENVIRONMENT);\n if (environment && (environment.length > 40 || !/^(?!langfuse)[a-z0-9_-]+$/u.test(environment))) {\n throw new Error(\n \"Langfuse environment must be at most 40 lowercase letters, numbers, hyphens, or underscores and must not start with langfuse.\",\n );\n }\n const release = optionalSetting(\"release\", options.config?.release, env?.LANGFUSE_RELEASE);\n return { publicKey, secretKey, baseUrl, ...(environment ? { environment } : {}), ...(release ? { release } : {}) };\n}\n\nfunction requiredSetting(name: string, explicit: string | undefined, environment: string | undefined): string {\n const value = selectedSetting(explicit, environment);\n if (!value) throw new Error(`Langfuse ${name} is required.`);\n return value;\n}\n\nfunction optionalSetting(\n name: string,\n explicit: string | undefined,\n environment: string | undefined,\n): string | undefined {\n const selected = explicit !== undefined ? explicit : environment;\n if (selected === undefined) return undefined;\n const value = normalizeString(selected);\n if (!value) throw new Error(`Langfuse ${name} must be a non-empty string.`);\n return value;\n}\n\nfunction selectedSetting(explicit: string | undefined, environment: string | undefined): string | undefined {\n if (explicit !== undefined) return normalizeString(explicit);\n return normalizeString(environment);\n}\n\nfunction normalizeBaseUrl(value: string): string | undefined {\n try {\n const url = new URL(value);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") return undefined;\n if (url.username || url.password || url.search || url.hash) return undefined;\n return url.toString().replace(/\\/+$/, \"\");\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction serializeMetadataValue(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : JSON.stringify(value);\n}\n\nfunction maskObservationAttributes(\n attributes: ObservationAttributes,\n secrets: readonly string[],\n): ObservationAttributes {\n return {\n ...attributes,\n ...(attributes.metadata ? { metadata: maskSecrets(attributes.metadata, secrets) as Record<string, unknown> } : {}),\n ...(attributes.name ? { name: maskSecretString(attributes.name, secrets) } : {}),\n ...(attributes.sessionId ? { sessionId: maskSecretString(attributes.sessionId, secrets) } : {}),\n ...(attributes.userId ? { userId: maskSecretString(attributes.userId, secrets) } : {}),\n ...(attributes.tags ? { tags: attributes.tags.map((tag) => maskSecretString(tag, secrets)) } : {}),\n ...(attributes.statusMessage ? { statusMessage: maskSecretString(attributes.statusMessage, secrets) } : {}),\n ...(attributes.model ? { model: maskSecretString(attributes.model, secrets) } : {}),\n ...(attributes.version ? { version: maskSecretString(attributes.version, secrets) } : {}),\n ...(attributes.modelParameters\n ? {\n modelParameters: Object.fromEntries(\n Object.entries(attributes.modelParameters).map(([key, value]) => [\n maskSecretString(key, secrets),\n typeof value === \"string\" ? maskSecretString(value, secrets) : value,\n ]),\n ),\n }\n : {}),\n };\n}\n\nfunction maskSecretString(value: string, secrets: readonly string[]): string {\n return maskSecrets(value, secrets) as string;\n}\n\nfunction applySessionId(observation: LangfuseObservation, sessionId: string | undefined): void {\n if (sessionId !== undefined) {\n observation.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_SESSION_ID, sessionId);\n }\n}\n\nfunction applyUserId(observation: LangfuseObservation, userId: string | undefined): void {\n if (userId !== undefined) {\n observation.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_USER_ID, userId);\n }\n}\n\nfunction startRoot(\n name: string,\n attributes: ObservationAttributes,\n type: ObservationType,\n startTime?: Date,\n): LangfuseObservation {\n if (type === \"agent\") {\n return startObservation(name, attributes as LangfuseObservationAttributes, { asType: \"agent\", startTime });\n }\n if (type === \"generation\") {\n return startObservation(name, attributes as LangfuseObservationAttributes, {\n asType: \"generation\",\n startTime,\n });\n }\n if (type === \"tool\") {\n return startObservation(name, attributes as LangfuseObservationAttributes, { asType: \"tool\", startTime });\n }\n return startObservation(name, attributes as LangfuseObservationAttributes, { asType: \"span\", startTime });\n}\n\nfunction startChild(\n parent: LangfuseObservation,\n name: string,\n attributes: ObservationAttributes,\n type: ObservationType,\n startTime?: Date,\n): LangfuseObservation {\n if (startTime) {\n const parentSpanContext = parent.otelSpan.spanContext();\n if (type === \"agent\") {\n return startObservation(name, attributes as LangfuseObservationAttributes, {\n asType: \"agent\",\n parentSpanContext,\n startTime,\n });\n }\n if (type === \"generation\") {\n return startObservation(name, attributes as LangfuseObservationAttributes, {\n asType: \"generation\",\n parentSpanContext,\n startTime,\n });\n }\n if (type === \"tool\") {\n return startObservation(name, attributes as LangfuseObservationAttributes, {\n asType: \"tool\",\n parentSpanContext,\n startTime,\n });\n }\n return startObservation(name, attributes as LangfuseObservationAttributes, {\n asType: \"span\",\n parentSpanContext,\n startTime,\n });\n }\n if (type === \"agent\") {\n return parent.startObservation(name, attributes as LangfuseObservationAttributes, { asType: \"agent\" });\n }\n if (type === \"generation\") {\n return parent.startObservation(name, attributes as LangfuseObservationAttributes, { asType: \"generation\" });\n }\n if (type === \"tool\") {\n return parent.startObservation(name, attributes as LangfuseObservationAttributes, { asType: \"tool\" });\n }\n return parent.startObservation(name, attributes as LangfuseObservationAttributes, { asType: \"span\" });\n}\n\nfunction configFingerprint(config: ResolvedRuntimeConfig): string {\n return createHash(\"sha256\")\n .update(\n `${config.publicKey}\\0${config.secretKey}\\0${config.baseUrl}\\0${config.environment ?? \"\"}\\0${config.release ?? \"\"}`,\n )\n .digest(\"hex\");\n}\n\nexport function maskSecrets(data: unknown, secrets: readonly string[]): unknown {\n return maskSecretValue(data, secrets, new WeakSet<object>());\n}\n\nfunction maskSecretValue(data: unknown, secrets: readonly string[], active: WeakSet<object>): unknown {\n if (typeof data === \"string\") {\n let masked = data.replace(/\\b(?:sk|pk)-lf-[A-Za-z0-9_-]+\\b/g, \"[LANGFUSE_KEY_REDACTED]\");\n for (const secret of secrets) {\n if (secret) masked = masked.replaceAll(secret, \"[LANGFUSE_KEY_REDACTED]\");\n }\n return masked;\n }\n if (!data || typeof data !== \"object\") return data;\n if (active.has(data)) return \"[circular]\";\n\n active.add(data);\n try {\n if (Array.isArray(data)) {\n return data.map((item) => maskSecretValue(item, secrets, active));\n }\n return Object.fromEntries(\n Object.entries(data).map(([key, value]) => [\n maskSecretString(key, secrets),\n maskSecretValue(value, secrets, active),\n ]),\n );\n } finally {\n active.delete(data);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ExtensionAPI, ExtensionContext, ExtensionFactory } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { type LangfuseRuntime } from "./runtime-core.js";
|
|
3
|
+
import { type GitMetadata } from "./tracing.js";
|
|
4
|
+
export interface PiLangfuseSessionOptions {
|
|
5
|
+
traceName?: string;
|
|
6
|
+
sessionId?: string;
|
|
7
|
+
userId?: string;
|
|
8
|
+
tags?: readonly string[];
|
|
9
|
+
metadata?: Readonly<Record<string, unknown>>;
|
|
10
|
+
captureContent?: boolean;
|
|
11
|
+
onTraceId?: (traceId: string) => void;
|
|
12
|
+
}
|
|
13
|
+
export interface PiLangfuseSession {
|
|
14
|
+
readonly extension: ExtensionFactory;
|
|
15
|
+
setRequestId(requestId?: string): void;
|
|
16
|
+
dispose(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
interface ResolvedSession {
|
|
19
|
+
runtime: LangfuseRuntime;
|
|
20
|
+
options?: PiLangfuseSessionOptions;
|
|
21
|
+
releaseIfStale?(reason: string): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
interface PiLangfuseSessionControllerOptions {
|
|
24
|
+
resolveSession(ctx: ExtensionContext, isCurrent: () => boolean): Promise<ResolvedSession | undefined>;
|
|
25
|
+
resolveGitMetadata?(pi: ExtensionAPI, cwd: string): Promise<GitMetadata | undefined>;
|
|
26
|
+
onSessionStart?(): void;
|
|
27
|
+
onSessionShutdown?(): void;
|
|
28
|
+
onSessionReady?(session: ResolvedSession): void;
|
|
29
|
+
onSessionUnavailable?(): void;
|
|
30
|
+
onInitializationError?(error: unknown, ctx: ExtensionContext): void;
|
|
31
|
+
beforeSessionDispose?(): Promise<void>;
|
|
32
|
+
onShutdownError?(error: unknown, ctx: ExtensionContext): void;
|
|
33
|
+
flushOnReplacement?: boolean;
|
|
34
|
+
shutdownRuntimeOnQuit?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface PiLangfuseSessionController extends PiLangfuseSession {
|
|
37
|
+
readonly active: boolean;
|
|
38
|
+
readonly runtime: LangfuseRuntime | undefined;
|
|
39
|
+
flush(): Promise<void>;
|
|
40
|
+
}
|
|
41
|
+
export declare function createPiLangfuseSession(runtime: LangfuseRuntime, options?: PiLangfuseSessionOptions): PiLangfuseSession;
|
|
42
|
+
export declare function createPiLangfuseSessionController(options: PiLangfuseSessionControllerOptions): PiLangfuseSessionController;
|
|
43
|
+
export {};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CreateLangfuseRuntimeOptions, LangfuseRuntime } from "./runtime-core.js";
|
|
2
|
+
export { createPiLangfuseSession, type PiLangfuseSession, type PiLangfuseSessionOptions, } from "./pi-session.js";
|
|
3
|
+
export type { CreateLangfuseRuntimeOptions, LangfuseRuntime, LangfuseRuntimeConfig, } from "./runtime-core.js";
|
|
4
|
+
export declare function createLangfuseRuntime(options?: CreateLangfuseRuntimeOptions): Promise<LangfuseRuntime>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { TraceBackend } from "./tracing.js";
|
|
2
|
+
export interface LangfuseRuntimeConfig {
|
|
3
|
+
publicKey?: string;
|
|
4
|
+
secretKey?: string;
|
|
5
|
+
baseUrl?: string;
|
|
6
|
+
environment?: string;
|
|
7
|
+
release?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface CreateLangfuseRuntimeOptions {
|
|
10
|
+
config?: LangfuseRuntimeConfig;
|
|
11
|
+
env?: NodeJS.ProcessEnv | false;
|
|
12
|
+
}
|
|
13
|
+
export interface LangfuseRuntime {
|
|
14
|
+
readonly closed: boolean;
|
|
15
|
+
flush(): Promise<void>;
|
|
16
|
+
shutdown(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
type RuntimeSessionDisposer = (statusMessage: string) => void | Promise<void>;
|
|
19
|
+
export interface LangfuseRuntimeInternal extends LangfuseRuntime {
|
|
20
|
+
readonly backend: TraceBackend;
|
|
21
|
+
registerSession(disposer: RuntimeSessionDisposer): () => void;
|
|
22
|
+
}
|
|
23
|
+
export declare function getLangfuseRuntimeInternal(runtime: LangfuseRuntime): LangfuseRuntimeInternal;
|
|
24
|
+
export declare function createLangfuseRuntimeFromBackend(backend: TraceBackend): LangfuseRuntime;
|
|
25
|
+
export declare function registerLangfuseRuntime(runtime: LangfuseRuntimeInternal): LangfuseRuntimeInternal;
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { SpanProcessor } from "@opentelemetry/sdk-trace-base";
|
|
2
|
+
import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
|
|
3
|
+
import { type LangfuseConfig } from "./config.js";
|
|
4
|
+
import { type CreateLangfuseRuntimeOptions, type LangfuseRuntime } from "./runtime-core.js";
|
|
5
|
+
import type { TraceBackend } from "./tracing.js";
|
|
6
|
+
export type { CreateLangfuseRuntimeOptions, LangfuseRuntime, LangfuseRuntimeConfig, } from "./runtime-core.js";
|
|
7
|
+
interface ResolvedRuntimeConfig {
|
|
8
|
+
publicKey: string;
|
|
9
|
+
secretKey: string;
|
|
10
|
+
baseUrl: string;
|
|
11
|
+
environment?: string;
|
|
12
|
+
release?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface RuntimeFactories {
|
|
15
|
+
createProcessor(config: ResolvedRuntimeConfig): SpanProcessor;
|
|
16
|
+
createProvider(processor: SpanProcessor): NodeTracerProvider;
|
|
17
|
+
selectProvider(provider: NodeTracerProvider): void;
|
|
18
|
+
}
|
|
19
|
+
export declare function createLangfuseRuntime(options?: CreateLangfuseRuntimeOptions): Promise<LangfuseRuntime>;
|
|
20
|
+
export declare function createProductionBackend(config: LangfuseConfig, factoryOverrides?: Partial<RuntimeFactories>): Promise<TraceBackend>;
|
|
21
|
+
export declare function resolveLangfuseRuntimeConfig(options: CreateLangfuseRuntimeOptions): ResolvedRuntimeConfig;
|
|
22
|
+
export declare function maskSecrets(data: unknown, secrets: readonly string[]): unknown;
|