@langfuse/tracing 4.0.0-alpha.2 → 4.0.0-beta.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/dist/index.d.ts CHANGED
@@ -1,32 +1,122 @@
1
- import { TimeInput, SpanContext } from "@opentelemetry/api";
2
- import { LangfuseEvent, LangfuseGeneration, LangfuseSpan } from "./spanWrapper.js";
3
- import { LangfuseEventAttributes, LangfuseGenerationAttributes, LangfuseSpanAttributes, LangfuseTraceAttributes } from "./types.js";
4
- export type { LangfuseObservationType, ObservationLevel, LangfuseSpanAttributes, LangfuseEventAttributes, LangfuseGenerationAttributes, LangfuseAttributes, LangfuseTraceAttributes, } from "./types.js";
5
- export * from "./spanWrapper.js";
6
- export { createTraceAttributes, createSpanAttributes, createGenerationAttributes, } from "./attributes.js";
7
- export { LangfuseOtelSpanAttributes } from "@langfuse/core";
8
- export type StartObservationOptions = {
1
+ import * as _opentelemetry_api from '@opentelemetry/api';
2
+ import { Span, TimeInput, Attributes, SpanContext } from '@opentelemetry/api';
3
+ import { OpenAiUsage } from '@langfuse/core';
4
+ export { LangfuseOtelSpanAttributes } from '@langfuse/core';
5
+
6
+ type LangfuseObservationType = "span" | "generation" | "event";
7
+ type ObservationLevel = "DEBUG" | "DEFAULT" | "WARNING" | "ERROR";
8
+ type LangfuseSpanAttributes = {
9
+ input?: unknown;
10
+ output?: unknown;
11
+ metadata?: Record<string, unknown>;
12
+ level?: ObservationLevel;
13
+ statusMessage?: string;
14
+ version?: string;
15
+ environment?: string;
16
+ };
17
+ type LangfuseEventAttributes = LangfuseSpanAttributes;
18
+ type LangfuseGenerationAttributes = LangfuseSpanAttributes & {
19
+ completionStartTime?: Date;
20
+ model?: string | null;
21
+ modelParameters?: {
22
+ [key: string]: string | number | null;
23
+ };
24
+ usageDetails?: {
25
+ [key: string]: number;
26
+ } | OpenAiUsage;
27
+ costDetails?: {
28
+ [key: string]: number;
29
+ };
30
+ prompt?: {
31
+ name: string;
32
+ version: number;
33
+ isFallback: boolean;
34
+ };
35
+ };
36
+ type LangfuseAttributes = LangfuseSpanAttributes | LangfuseGenerationAttributes | LangfuseEventAttributes;
37
+ type LangfuseTraceAttributes = {
38
+ name?: string;
39
+ userId?: string;
40
+ sessionId?: string;
41
+ version?: string;
42
+ release?: string;
43
+ input?: unknown;
44
+ output?: unknown;
45
+ metadata?: unknown;
46
+ tags?: string[];
47
+ public?: boolean;
48
+ environment?: string;
49
+ };
50
+
51
+ type LangfuseObservation = LangfuseSpan | LangfuseGeneration | LangfuseEvent;
52
+ type LangfuseSpanWrapperParams = {
53
+ otelSpan: Span;
54
+ attributes?: LangfuseSpanAttributes | LangfuseGenerationAttributes | LangfuseEventAttributes;
55
+ };
56
+ declare abstract class LangfuseSpanWrapper {
57
+ readonly otelSpan: Span;
58
+ id: string;
59
+ traceId: string;
60
+ constructor(params: LangfuseSpanWrapperParams);
61
+ protected get tracer(): _opentelemetry_api.Tracer;
62
+ end(endTime?: TimeInput): void;
63
+ updateTrace(attributes: LangfuseTraceAttributes): this;
64
+ }
65
+ type LangfuseSpanParams = {
66
+ otelSpan: Span;
67
+ attributes?: LangfuseSpanAttributes;
68
+ };
69
+ declare class LangfuseSpan extends LangfuseSpanWrapper {
70
+ constructor(params: LangfuseSpanParams);
71
+ update(attributes: LangfuseSpanAttributes): LangfuseSpan;
72
+ startSpan(name: string, attributes?: LangfuseSpanAttributes): LangfuseSpan;
73
+ startGeneration(name: string, attributes?: LangfuseGenerationAttributes): LangfuseGeneration;
74
+ createEvent(name: string, attributes?: LangfuseEventAttributes): LangfuseEvent;
75
+ }
76
+ type LangfuseGenerationParams = {
77
+ otelSpan: Span;
78
+ attributes?: LangfuseGenerationAttributes;
79
+ };
80
+ declare class LangfuseGeneration extends LangfuseSpanWrapper {
81
+ constructor(params: LangfuseGenerationParams);
82
+ update(attributes: LangfuseGenerationAttributes): LangfuseGeneration;
83
+ createEvent(name: string, attributes?: LangfuseEventAttributes): LangfuseEvent;
84
+ }
85
+ type LangfuseEventParams = {
86
+ otelSpan: Span;
87
+ attributes?: LangfuseEventAttributes;
88
+ timestamp: TimeInput;
89
+ };
90
+ declare class LangfuseEvent extends LangfuseSpanWrapper {
91
+ constructor(params: LangfuseEventParams);
92
+ }
93
+
94
+ declare function createTraceAttributes({ name, userId, sessionId, version, release, input, output, metadata, tags, environment, public: isPublic, }?: LangfuseTraceAttributes): Attributes;
95
+ declare function createSpanAttributes({ metadata, input, output, level, statusMessage, version, }: LangfuseSpanAttributes): Attributes;
96
+ declare function createGenerationAttributes({ completionStartTime, metadata, level, statusMessage, version, model, modelParameters, input, output, usageDetails, costDetails, prompt, }: LangfuseGenerationAttributes): Attributes;
97
+
98
+ type StartObservationOptions = {
9
99
  startTime?: Date;
10
100
  parentSpanContext?: SpanContext;
11
101
  };
12
- export declare function startSpan(name: string, attributes?: LangfuseSpanAttributes, options?: {
102
+ declare function startSpan(name: string, attributes?: LangfuseSpanAttributes, options?: {
13
103
  startTime?: TimeInput;
14
104
  parentSpanContext?: SpanContext;
15
105
  }): LangfuseSpan;
16
- export declare function startGeneration(name: string, attributes?: LangfuseGenerationAttributes, options?: StartObservationOptions): LangfuseGeneration;
17
- export declare function createEvent(name: string, attributes?: LangfuseEventAttributes, options?: StartObservationOptions): LangfuseEvent;
18
- export declare function startActiveSpan<F extends (span: LangfuseSpan) => unknown>(name: string, fn: F, options?: StartObservationOptions): ReturnType<F>;
19
- export declare function startActiveGeneration<F extends (span: LangfuseGeneration) => unknown>(name: string, fn: F, options?: StartObservationOptions): ReturnType<F>;
20
- export declare function updateActiveTrace(attributes: LangfuseTraceAttributes): void;
21
- export declare function updateActiveSpan(attributes: LangfuseSpanAttributes): void;
22
- export declare function updateActiveGeneration(attributes: LangfuseGenerationAttributes): void;
23
- export interface ObserveOptions {
106
+ declare function startGeneration(name: string, attributes?: LangfuseGenerationAttributes, options?: StartObservationOptions): LangfuseGeneration;
107
+ declare function createEvent(name: string, attributes?: LangfuseEventAttributes, options?: StartObservationOptions): LangfuseEvent;
108
+ declare function startActiveSpan<F extends (span: LangfuseSpan) => unknown>(name: string, fn: F, options?: StartObservationOptions): ReturnType<F>;
109
+ declare function startActiveGeneration<F extends (span: LangfuseGeneration) => unknown>(name: string, fn: F, options?: StartObservationOptions): ReturnType<F>;
110
+ declare function updateActiveTrace(attributes: LangfuseTraceAttributes): void;
111
+ declare function updateActiveSpan(attributes: LangfuseSpanAttributes): void;
112
+ declare function updateActiveGeneration(attributes: LangfuseGenerationAttributes): void;
113
+ interface ObserveOptions {
24
114
  name?: string;
25
115
  asType?: "span" | "generation";
26
116
  captureInput?: boolean;
27
117
  captureOutput?: boolean;
28
118
  }
29
- export declare function observe<T extends (...args: unknown[]) => unknown>(fn: T, options?: ObserveOptions): T;
119
+ declare function observe<T extends (...args: unknown[]) => unknown>(fn: T, options?: ObserveOptions): T;
30
120
  /**
31
121
  * Creates a trace ID for OpenTelemetry spans.
32
122
  *
@@ -71,5 +161,6 @@ export declare function observe<T extends (...args: unknown[]) => unknown>(fn: T
71
161
  * console.log(traceId === scoringTraceId); // true - can now find and score the trace
72
162
  * ```
73
163
  */
74
- export declare function createTraceId(seed?: string): Promise<string>;
75
- //# sourceMappingURL=index.d.ts.map
164
+ declare function createTraceId(seed?: string): Promise<string>;
165
+
166
+ export { type LangfuseAttributes, LangfuseEvent, type LangfuseEventAttributes, LangfuseGeneration, type LangfuseGenerationAttributes, type LangfuseObservation, type LangfuseObservationType, LangfuseSpan, type LangfuseSpanAttributes, type LangfuseTraceAttributes, type ObservationLevel, type ObserveOptions, type StartObservationOptions, createEvent, createGenerationAttributes, createSpanAttributes, createTraceAttributes, createTraceId, observe, startActiveGeneration, startActiveSpan, startGeneration, startSpan, updateActiveGeneration, updateActiveSpan, updateActiveTrace };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@langfuse/tracing",
3
- "version": "4.0.0-alpha.2",
3
+ "version": "4.0.0-beta.0",
4
4
  "author": "Langfuse",
5
5
  "license": "MIT",
6
6
  "engines": {
@@ -23,7 +23,7 @@
23
23
  "dist"
24
24
  ],
25
25
  "dependencies": {
26
- "@langfuse/core": "^4.0.0-alpha.2"
26
+ "@langfuse/core": "^4.0.0-beta.0"
27
27
  },
28
28
  "peerDependencies": {
29
29
  "@opentelemetry/api": "^1.9.0"
@@ -1,7 +0,0 @@
1
- import { type Attributes } from "@opentelemetry/api";
2
- import { LangfuseGenerationAttributes, LangfuseSpanAttributes, LangfuseTraceAttributes } from "./types.js";
3
- export declare function createTraceAttributes({ name, userId, sessionId, version, release, input, output, metadata, tags, environment, public: isPublic, }?: LangfuseTraceAttributes): Attributes;
4
- export declare function createSpanAttributes({ metadata, input, output, level, statusMessage, version, }: LangfuseSpanAttributes): Attributes;
5
- export declare function createGenerationAttributes({ completionStartTime, metadata, level, statusMessage, version, model, modelParameters, input, output, usageDetails, costDetails, prompt, }: LangfuseGenerationAttributes): Attributes;
6
- export declare function createEventAttributes({ metadata, input, output, level, statusMessage, version, }: LangfuseSpanAttributes): Attributes;
7
- //# sourceMappingURL=attributes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"attributes.d.ts","sourceRoot":"","sources":["../src/attributes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EACL,4BAA4B,EAC5B,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,qBAAqB,CAAC,EACpC,IAAI,EACJ,MAAM,EACN,SAAS,EACT,OAAO,EACP,OAAO,EACP,KAAK,EACL,MAAM,EACN,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,MAAM,EAAE,QAAQ,GACjB,GAAE,uBAA4B,GAAG,UAAU,CAkB3C;AAED,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,KAAK,EACL,MAAM,EACN,KAAK,EACL,aAAa,EACb,OAAO,GACR,EAAE,sBAAsB,GAAG,UAAU,CAcrC;AAED,wBAAgB,0BAA0B,CAAC,EACzC,mBAAmB,EACnB,QAAQ,EACR,KAAK,EACL,aAAa,EACb,OAAO,EACP,KAAK,EACL,eAAe,EACf,KAAK,EACL,MAAM,EACN,YAAY,EACZ,WAAW,EACX,MAAM,GACP,EAAE,4BAA4B,GAAG,UAAU,CA8B3C;AAED,wBAAgB,qBAAqB,CAAC,EACpC,QAAQ,EACR,KAAK,EACL,MAAM,EACN,KAAK,EACL,aAAa,EACb,OAAO,GACR,EAAE,sBAAsB,GAAG,UAAU,CAcrC"}
@@ -1,96 +0,0 @@
1
- import { LangfuseOtelSpanAttributes } from "@langfuse/core";
2
- export function createTraceAttributes({ name, userId, sessionId, version, release, input, output, metadata, tags, environment, public: isPublic, } = {}) {
3
- const attributes = {
4
- [LangfuseOtelSpanAttributes.TRACE_NAME]: name,
5
- [LangfuseOtelSpanAttributes.TRACE_USER_ID]: userId,
6
- [LangfuseOtelSpanAttributes.TRACE_SESSION_ID]: sessionId,
7
- [LangfuseOtelSpanAttributes.VERSION]: version,
8
- [LangfuseOtelSpanAttributes.RELEASE]: release,
9
- [LangfuseOtelSpanAttributes.TRACE_INPUT]: _serialize(input),
10
- [LangfuseOtelSpanAttributes.TRACE_OUTPUT]: _serialize(output),
11
- [LangfuseOtelSpanAttributes.TRACE_TAGS]: tags,
12
- [LangfuseOtelSpanAttributes.ENVIRONMENT]: environment,
13
- [LangfuseOtelSpanAttributes.TRACE_PUBLIC]: isPublic,
14
- ..._flattenAndSerializeMetadata(metadata, "trace"),
15
- };
16
- return Object.fromEntries(Object.entries(attributes).filter(([_, v]) => v != null));
17
- }
18
- export function createSpanAttributes({ metadata, input, output, level, statusMessage, version, }) {
19
- const attributes = {
20
- [LangfuseOtelSpanAttributes.OBSERVATION_TYPE]: "span",
21
- [LangfuseOtelSpanAttributes.OBSERVATION_LEVEL]: level,
22
- [LangfuseOtelSpanAttributes.OBSERVATION_STATUS_MESSAGE]: statusMessage,
23
- [LangfuseOtelSpanAttributes.VERSION]: version,
24
- [LangfuseOtelSpanAttributes.OBSERVATION_INPUT]: _serialize(input),
25
- [LangfuseOtelSpanAttributes.OBSERVATION_OUTPUT]: _serialize(output),
26
- ..._flattenAndSerializeMetadata(metadata, "observation"),
27
- };
28
- return Object.fromEntries(Object.entries(attributes).filter(([_, v]) => v != null));
29
- }
30
- export function createGenerationAttributes({ completionStartTime, metadata, level, statusMessage, version, model, modelParameters, input, output, usageDetails, costDetails, prompt, }) {
31
- const attributes = {
32
- [LangfuseOtelSpanAttributes.OBSERVATION_TYPE]: "generation",
33
- [LangfuseOtelSpanAttributes.OBSERVATION_LEVEL]: level,
34
- [LangfuseOtelSpanAttributes.OBSERVATION_STATUS_MESSAGE]: statusMessage,
35
- [LangfuseOtelSpanAttributes.VERSION]: version,
36
- [LangfuseOtelSpanAttributes.OBSERVATION_INPUT]: _serialize(input),
37
- [LangfuseOtelSpanAttributes.OBSERVATION_OUTPUT]: _serialize(output),
38
- [LangfuseOtelSpanAttributes.OBSERVATION_MODEL]: model,
39
- [LangfuseOtelSpanAttributes.OBSERVATION_USAGE_DETAILS]: _serialize(usageDetails),
40
- [LangfuseOtelSpanAttributes.OBSERVATION_COST_DETAILS]: _serialize(costDetails),
41
- [LangfuseOtelSpanAttributes.OBSERVATION_COMPLETION_START_TIME]: _serialize(completionStartTime),
42
- [LangfuseOtelSpanAttributes.OBSERVATION_MODEL_PARAMETERS]: _serialize(modelParameters),
43
- ...(prompt && !prompt.isFallback
44
- ? {
45
- [LangfuseOtelSpanAttributes.OBSERVATION_PROMPT_NAME]: prompt.name,
46
- [LangfuseOtelSpanAttributes.OBSERVATION_PROMPT_VERSION]: prompt.version,
47
- }
48
- : {}),
49
- ..._flattenAndSerializeMetadata(metadata, "observation"),
50
- };
51
- return Object.fromEntries(Object.entries(attributes).filter(([_, v]) => v != null));
52
- }
53
- export function createEventAttributes({ metadata, input, output, level, statusMessage, version, }) {
54
- const attributes = {
55
- [LangfuseOtelSpanAttributes.OBSERVATION_TYPE]: "event",
56
- [LangfuseOtelSpanAttributes.OBSERVATION_LEVEL]: level,
57
- [LangfuseOtelSpanAttributes.OBSERVATION_STATUS_MESSAGE]: statusMessage,
58
- [LangfuseOtelSpanAttributes.VERSION]: version,
59
- [LangfuseOtelSpanAttributes.OBSERVATION_INPUT]: _serialize(input),
60
- [LangfuseOtelSpanAttributes.OBSERVATION_OUTPUT]: _serialize(output),
61
- ..._flattenAndSerializeMetadata(metadata, "observation"),
62
- };
63
- return Object.fromEntries(Object.entries(attributes).filter(([_, v]) => v != null));
64
- }
65
- function _serialize(obj) {
66
- try {
67
- return obj != null ? JSON.stringify(obj) : undefined;
68
- }
69
- catch {
70
- return "<failed to serialize>";
71
- }
72
- }
73
- function _flattenAndSerializeMetadata(metadata, type) {
74
- const prefix = type === "observation"
75
- ? LangfuseOtelSpanAttributes.OBSERVATION_METADATA
76
- : LangfuseOtelSpanAttributes.TRACE_METADATA;
77
- const metadataAttributes = {};
78
- if (metadata === undefined || metadata === null) {
79
- return metadataAttributes;
80
- }
81
- if (typeof metadata !== "object" || Array.isArray(metadata)) {
82
- const serialized = _serialize(metadata);
83
- if (serialized) {
84
- metadataAttributes[prefix] = serialized;
85
- }
86
- }
87
- else {
88
- for (const [key, value] of Object.entries(metadata)) {
89
- const serialized = typeof value === "string" ? value : _serialize(value);
90
- if (serialized) {
91
- metadataAttributes[`${prefix}.${key}`] = serialized;
92
- }
93
- }
94
- }
95
- return metadataAttributes;
96
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,SAAS,EAIT,WAAW,EACZ,MAAM,oBAAoB,CAAC;AAO5B,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,YAAY,EACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,4BAA4B,EAC5B,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,uBAAuB,EACvB,gBAAgB,EAChB,sBAAsB,EACtB,uBAAuB,EACvB,4BAA4B,EAC5B,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AAEpB,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,iBAAiB,CAAC,EAAE,WAAW,CAAC;CACjC,CAAC;AA0CF,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,sBAAsB,EACnC,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,iBAAiB,CAAC,EAAE,WAAW,CAAC;CACjC,GACA,YAAY,CAOd;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,4BAA4B,EACzC,OAAO,CAAC,EAAE,uBAAuB,GAChC,kBAAkB,CAOpB;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,uBAAuB,EACpC,OAAO,CAAC,EAAE,uBAAuB,iBAWlC;AAED,wBAAgB,eAAe,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,EACvE,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,EACL,OAAO,CAAC,EAAE,uBAAuB,GAChC,UAAU,CAAC,CAAC,CAAC,CA4Bf;AAED,wBAAgB,qBAAqB,CACnC,CAAC,SAAS,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,EAC/C,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,UAAU,CAAC,CAAC,CAAC,CA4BvE;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,uBAAuB,QAYpE;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,sBAAsB,QAYlE;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,4BAA4B,QAazC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,OAAO,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAC/D,EAAE,EAAE,CAAC,EACL,OAAO,GAAE,cAAmB,GAC3B,CAAC,CA2EH;AA6BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAsB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAalE"}
package/dist/index.js DELETED
@@ -1,271 +0,0 @@
1
- import { getGlobalLogger } from "@langfuse/core";
2
- import { trace, context, SpanStatusCode, } from "@opentelemetry/api";
3
- import { createGenerationAttributes, createSpanAttributes, createTraceAttributes, } from "./attributes.js";
4
- import { LangfuseEvent, LangfuseGeneration, LangfuseSpan, } from "./spanWrapper.js";
5
- import { getLangfuseTracer } from "./utils.js";
6
- export * from "./spanWrapper.js";
7
- export { createTraceAttributes, createSpanAttributes, createGenerationAttributes, } from "./attributes.js";
8
- export { LangfuseOtelSpanAttributes } from "@langfuse/core";
9
- function createOtelSpan(params) {
10
- return getLangfuseTracer().startSpan(params.name, { startTime: params.startTime }, createParentContext(params.parentSpanContext));
11
- }
12
- function createParentContext(parentSpanContext) {
13
- if (!parentSpanContext)
14
- return;
15
- return trace.setSpanContext(context.active(), parentSpanContext);
16
- }
17
- function wrapPromise(promise, span) {
18
- return promise.then((value) => {
19
- span.end(); // End span AFTER Promise resolves
20
- return value;
21
- }, (err) => {
22
- span
23
- .setStatus({
24
- code: SpanStatusCode.ERROR,
25
- message: err instanceof Error ? err.message : "Unknown error",
26
- })
27
- .end(); // End span AFTER Promise rejects
28
- throw err;
29
- });
30
- }
31
- export function startSpan(name, attributes, options) {
32
- const otelSpan = createOtelSpan({
33
- name,
34
- ...options,
35
- });
36
- return new LangfuseSpan({ otelSpan, attributes });
37
- }
38
- export function startGeneration(name, attributes, options) {
39
- const otelSpan = createOtelSpan({
40
- name,
41
- ...options,
42
- });
43
- return new LangfuseGeneration({ otelSpan, attributes });
44
- }
45
- export function createEvent(name, attributes, options) {
46
- var _a;
47
- const timestamp = (_a = options === null || options === void 0 ? void 0 : options.startTime) !== null && _a !== void 0 ? _a : new Date();
48
- const otelSpan = createOtelSpan({
49
- name,
50
- ...options,
51
- startTime: timestamp,
52
- });
53
- return new LangfuseEvent({ otelSpan, attributes, timestamp });
54
- }
55
- export function startActiveSpan(name, fn, options) {
56
- var _a;
57
- return getLangfuseTracer().startActiveSpan(name, { startTime: options === null || options === void 0 ? void 0 : options.startTime }, (_a = createParentContext(options === null || options === void 0 ? void 0 : options.parentSpanContext)) !== null && _a !== void 0 ? _a : context.active(), (span) => {
58
- try {
59
- const result = fn(new LangfuseSpan({ otelSpan: span }));
60
- if (result instanceof Promise) {
61
- return wrapPromise(result, span);
62
- }
63
- else {
64
- span.end();
65
- return result;
66
- }
67
- }
68
- catch (err) {
69
- span
70
- .setStatus({
71
- code: SpanStatusCode.ERROR,
72
- message: err instanceof Error ? err.message : "Unknown error",
73
- })
74
- .end();
75
- throw err;
76
- }
77
- });
78
- }
79
- export function startActiveGeneration(name, fn, options) {
80
- var _a;
81
- return getLangfuseTracer().startActiveSpan(name, { startTime: options === null || options === void 0 ? void 0 : options.startTime }, (_a = createParentContext(options === null || options === void 0 ? void 0 : options.parentSpanContext)) !== null && _a !== void 0 ? _a : context.active(), (span) => {
82
- try {
83
- const result = fn(new LangfuseGeneration({ otelSpan: span }));
84
- if (result instanceof Promise) {
85
- return wrapPromise(result, span);
86
- }
87
- else {
88
- span.end();
89
- return result;
90
- }
91
- }
92
- catch (err) {
93
- span
94
- .setStatus({
95
- code: SpanStatusCode.ERROR,
96
- message: err instanceof Error ? err.message : "Unknown error",
97
- })
98
- .end();
99
- throw err;
100
- }
101
- });
102
- }
103
- export function updateActiveTrace(attributes) {
104
- const span = trace.getActiveSpan();
105
- if (!span) {
106
- getGlobalLogger().warn("No active OTEL span in context. Skipping trace update.");
107
- return;
108
- }
109
- span.setAttributes(createTraceAttributes(attributes));
110
- }
111
- export function updateActiveSpan(attributes) {
112
- const span = trace.getActiveSpan();
113
- if (!span) {
114
- getGlobalLogger().warn("No active OTEL span in context. Skipping span update.");
115
- return;
116
- }
117
- span.setAttributes(createSpanAttributes(attributes));
118
- }
119
- export function updateActiveGeneration(attributes) {
120
- const span = trace.getActiveSpan();
121
- if (!span) {
122
- getGlobalLogger().warn("No active OTEL span in context. Skipping generation update.");
123
- return;
124
- }
125
- span.setAttributes(createGenerationAttributes(attributes));
126
- }
127
- export function observe(fn, options = {}) {
128
- const { name = fn.name || "anonymous-function", asType = "span", captureInput = true, captureOutput = true, } = options;
129
- const wrappedFunction = (...args) => {
130
- // Prepare input data
131
- const inputData = captureInput ? _captureArguments(args) : undefined;
132
- // Create the appropriate observation type
133
- const observation = asType === "generation"
134
- ? startGeneration(name, inputData ? { input: inputData } : {})
135
- : startSpan(name, inputData ? { input: inputData } : {});
136
- // Set the observation span as active in the context
137
- const activeContext = trace.setSpan(context.active(), observation.otelSpan);
138
- try {
139
- const result = context.with(activeContext, () => fn(...args));
140
- // Handle async functions - check if result is a Promise
141
- // TODO: handle returned generators for streamed responses
142
- if (result instanceof Promise) {
143
- return result.then((value) => {
144
- if (captureOutput) {
145
- observation.update({ output: _captureOutput(value) });
146
- }
147
- observation.end();
148
- return value;
149
- }, (error) => {
150
- observation
151
- .update({
152
- level: "ERROR",
153
- statusMessage: (error instanceof Error ? error.message : String(error)) ||
154
- "Function threw an error",
155
- output: captureOutput ? { error: String(error) } : undefined,
156
- })
157
- .end();
158
- throw error;
159
- });
160
- }
161
- else {
162
- // Handle sync functions
163
- if (captureOutput) {
164
- observation.update({ output: _captureOutput(result) });
165
- }
166
- observation.end();
167
- return result;
168
- }
169
- }
170
- catch (error) {
171
- observation
172
- .update({
173
- level: "ERROR",
174
- statusMessage: (error instanceof Error ? error.message : String(error)) ||
175
- "Function threw an error",
176
- output: captureOutput ? { error: String(error) } : undefined,
177
- })
178
- .end();
179
- throw error;
180
- }
181
- };
182
- return wrappedFunction;
183
- }
184
- // Helper function to safely capture function arguments
185
- function _captureArguments(args) {
186
- try {
187
- if (args.length === 0)
188
- return undefined;
189
- if (args.length === 1)
190
- return args[0];
191
- return args;
192
- }
193
- catch {
194
- return "<failed to capture arguments>";
195
- }
196
- }
197
- // Helper function to safely capture function output
198
- function _captureOutput(value) {
199
- try {
200
- // Handle undefined/null
201
- if (value === undefined || value === null)
202
- return value;
203
- // For primitive types, return as-is
204
- if (typeof value !== "object")
205
- return value;
206
- // For objects, return them directly (serialization happens in span processor)
207
- return value;
208
- }
209
- catch {
210
- return "<failed to capture output>";
211
- }
212
- }
213
- /**
214
- * Creates a trace ID for OpenTelemetry spans.
215
- *
216
- * @param seed - A seed string for deterministic trace ID generation.
217
- * If provided (non-empty), the same seed will always generate the same trace ID.
218
- * If empty or falsy, generates a random trace ID.
219
- *
220
- * Using a seed is especially useful when trying to correlate external,
221
- * non-W3C compliant IDs with Langfuse trace IDs. This allows you to later
222
- * have a method available for scoring the Langfuse trace given only the
223
- * external ID by regenerating the same trace ID from the external ID.
224
- *
225
- * @returns A Promise that resolves to a 32-character lowercase hexadecimal string suitable for use as an OpenTelemetry trace ID.
226
- *
227
- * @example
228
- * ```typescript
229
- * // Deterministic trace ID from seed
230
- * const traceId1 = await createTraceId("my-session-123");
231
- * const traceId2 = await createTraceId("my-session-123");
232
- * console.log(traceId1 === traceId2); // true
233
- *
234
- * // Random trace ID
235
- * const randomId1 = await createTraceId("");
236
- * const randomId2 = await createTraceId("");
237
- * console.log(randomId1 === randomId2); // false
238
- *
239
- * // Use with spans
240
- * const span = startSpan("my-span", {}, {
241
- * parentSpanContext: {
242
- * traceId: await createTraceId("session-456"),
243
- * spanId: "0123456789abcdef",
244
- * traceFlags: 1
245
- * }
246
- * });
247
- *
248
- * // Correlating external IDs with Langfuse traces
249
- * const externalId = "ext-12345-67890";
250
- * const traceId = await createTraceId(externalId);
251
- *
252
- * // Later, when you need to score this trace, regenerate the same ID
253
- * const scoringTraceId = await createTraceId(externalId);
254
- * console.log(traceId === scoringTraceId); // true - can now find and score the trace
255
- * ```
256
- */
257
- export async function createTraceId(seed) {
258
- if (seed) {
259
- const data = new TextEncoder().encode(seed);
260
- const hashBuffer = await crypto.subtle.digest("SHA-256", data);
261
- const hashArray = new Uint8Array(hashBuffer);
262
- return uint8ArrayToHex(hashArray).slice(0, 32);
263
- }
264
- const randomValues = crypto.getRandomValues(new Uint8Array(16));
265
- return uint8ArrayToHex(randomValues);
266
- }
267
- function uint8ArrayToHex(array) {
268
- return Array.from(array)
269
- .map((b) => b.toString(16).padStart(2, "0"))
270
- .join("");
271
- }
@@ -1,46 +0,0 @@
1
- import { Span, TimeInput } from "@opentelemetry/api";
2
- import { LangfuseGenerationAttributes, LangfuseSpanAttributes, LangfuseEventAttributes, LangfuseTraceAttributes } from "./types.js";
3
- export type LangfuseObservation = LangfuseSpan | LangfuseGeneration | LangfuseEvent;
4
- type LangfuseSpanWrapperParams = {
5
- otelSpan: Span;
6
- attributes?: LangfuseSpanAttributes | LangfuseGenerationAttributes | LangfuseEventAttributes;
7
- };
8
- declare abstract class LangfuseSpanWrapper {
9
- readonly otelSpan: Span;
10
- id: string;
11
- traceId: string;
12
- constructor(params: LangfuseSpanWrapperParams);
13
- protected get tracer(): import("@opentelemetry/api").Tracer;
14
- end(endTime?: TimeInput): void;
15
- updateTrace(attributes: LangfuseTraceAttributes): this;
16
- }
17
- type LangfuseSpanParams = {
18
- otelSpan: Span;
19
- attributes?: LangfuseSpanAttributes;
20
- };
21
- export declare class LangfuseSpan extends LangfuseSpanWrapper {
22
- constructor(params: LangfuseSpanParams);
23
- update(attributes: LangfuseSpanAttributes): LangfuseSpan;
24
- startSpan(name: string, attributes?: LangfuseSpanAttributes): LangfuseSpan;
25
- startGeneration(name: string, attributes?: LangfuseGenerationAttributes): LangfuseGeneration;
26
- createEvent(name: string, attributes?: LangfuseEventAttributes): LangfuseEvent;
27
- }
28
- type LangfuseGenerationParams = {
29
- otelSpan: Span;
30
- attributes?: LangfuseGenerationAttributes;
31
- };
32
- export declare class LangfuseGeneration extends LangfuseSpanWrapper {
33
- constructor(params: LangfuseGenerationParams);
34
- update(attributes: LangfuseGenerationAttributes): LangfuseGeneration;
35
- createEvent(name: string, attributes?: LangfuseEventAttributes): LangfuseEvent;
36
- }
37
- type LangfuseEventParams = {
38
- otelSpan: Span;
39
- attributes?: LangfuseEventAttributes;
40
- timestamp: TimeInput;
41
- };
42
- export declare class LangfuseEvent extends LangfuseSpanWrapper {
43
- constructor(params: LangfuseEventParams);
44
- }
45
- export {};
46
- //# sourceMappingURL=spanWrapper.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spanWrapper.d.ts","sourceRoot":"","sources":["../src/spanWrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAQrD,OAAO,EACL,4BAA4B,EAC5B,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAKpB,MAAM,MAAM,mBAAmB,GAC3B,YAAY,GACZ,kBAAkB,GAClB,aAAa,CAAC;AAElB,KAAK,yBAAyB,GAAG;IAC/B,QAAQ,EAAE,IAAI,CAAC;IACf,UAAU,CAAC,EACP,sBAAsB,GACtB,4BAA4B,GAC5B,uBAAuB,CAAC;CAC7B,CAAC;AAEF,uBAAe,mBAAmB;IAChC,SAAgB,QAAQ,EAAE,IAAI,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;gBAEX,MAAM,EAAE,yBAAyB;IAM7C,SAAS,KAAK,MAAM,wCAEnB;IAEM,GAAG,CAAC,OAAO,CAAC,EAAE,SAAS;IAIvB,WAAW,CAAC,UAAU,EAAE,uBAAuB;CAKvD;AAED,KAAK,kBAAkB,GAAG;IACxB,QAAQ,EAAE,IAAI,CAAC;IACf,UAAU,CAAC,EAAE,sBAAsB,CAAC;CACrC,CAAC;AACF,qBAAa,YAAa,SAAQ,mBAAmB;gBACvC,MAAM,EAAE,kBAAkB;IAO/B,MAAM,CAAC,UAAU,EAAE,sBAAsB,GAAG,YAAY;IAMxD,SAAS,CACd,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,sBAAsB,GAClC,YAAY;IAMR,eAAe,CACpB,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,4BAA4B,GACxC,kBAAkB;IAMd,WAAW,CAChB,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,uBAAuB,GACnC,aAAa;CAKjB;AAED,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,EAAE,IAAI,CAAC;IACf,UAAU,CAAC,EAAE,4BAA4B,CAAC;CAC3C,CAAC;AACF,qBAAa,kBAAmB,SAAQ,mBAAmB;gBAC7C,MAAM,EAAE,wBAAwB;IAS5C,MAAM,CAAC,UAAU,EAAE,4BAA4B,GAAG,kBAAkB;IAMpE,WAAW,CACT,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,uBAAuB,GACnC,aAAa;CAKjB;AAED,KAAK,mBAAmB,GAAG;IACzB,QAAQ,EAAE,IAAI,CAAC;IACf,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,SAAS,EAAE,SAAS,CAAC;CACtB,CAAC;AACF,qBAAa,aAAc,SAAQ,mBAAmB;gBACxC,MAAM,EAAE,mBAAmB;CASxC"}
@@ -1,73 +0,0 @@
1
- import { createEventAttributes, createGenerationAttributes, createSpanAttributes, createTraceAttributes, } from "./attributes.js";
2
- import { getLangfuseTracer } from "./utils.js";
3
- import { createEvent, startGeneration, startSpan } from "./index.js";
4
- class LangfuseSpanWrapper {
5
- constructor(params) {
6
- this.otelSpan = params.otelSpan;
7
- this.id = params.otelSpan.spanContext().spanId;
8
- this.traceId = params.otelSpan.spanContext().traceId;
9
- }
10
- get tracer() {
11
- return getLangfuseTracer();
12
- }
13
- end(endTime) {
14
- this.otelSpan.end(endTime);
15
- }
16
- updateTrace(attributes) {
17
- this.otelSpan.setAttributes(createTraceAttributes(attributes));
18
- return this;
19
- }
20
- }
21
- export class LangfuseSpan extends LangfuseSpanWrapper {
22
- constructor(params) {
23
- super(params);
24
- if (params.attributes) {
25
- this.otelSpan.setAttributes(createSpanAttributes(params.attributes));
26
- }
27
- }
28
- update(attributes) {
29
- this.otelSpan.setAttributes(createSpanAttributes(attributes));
30
- return this;
31
- }
32
- startSpan(name, attributes) {
33
- return startSpan(name, attributes, {
34
- parentSpanContext: this.otelSpan.spanContext(),
35
- });
36
- }
37
- startGeneration(name, attributes) {
38
- return startGeneration(name, attributes, {
39
- parentSpanContext: this.otelSpan.spanContext(),
40
- });
41
- }
42
- createEvent(name, attributes) {
43
- return createEvent(name, attributes, {
44
- parentSpanContext: this.otelSpan.spanContext(),
45
- });
46
- }
47
- }
48
- export class LangfuseGeneration extends LangfuseSpanWrapper {
49
- constructor(params) {
50
- super(params);
51
- if (params.attributes) {
52
- this.otelSpan.setAttributes(createGenerationAttributes(params.attributes));
53
- }
54
- }
55
- update(attributes) {
56
- this.otelSpan.setAttributes(createGenerationAttributes(attributes));
57
- return this;
58
- }
59
- createEvent(name, attributes) {
60
- return createEvent(name, attributes, {
61
- parentSpanContext: this.otelSpan.spanContext(),
62
- });
63
- }
64
- }
65
- export class LangfuseEvent extends LangfuseSpanWrapper {
66
- constructor(params) {
67
- super(params);
68
- if (params.attributes) {
69
- this.otelSpan.setAttributes(createEventAttributes(params.attributes));
70
- }
71
- this.otelSpan.end(params.timestamp);
72
- }
73
- }
package/dist/types.d.ts DELETED
@@ -1,50 +0,0 @@
1
- import { OpenAiUsage } from "@langfuse/core";
2
- export type LangfuseObservationType = "span" | "generation" | "event";
3
- export type ObservationLevel = "DEBUG" | "DEFAULT" | "WARNING" | "ERROR";
4
- export type LangfuseSpanAttributes = {
5
- input?: unknown;
6
- output?: unknown;
7
- metadata?: Record<string, unknown>;
8
- level?: ObservationLevel;
9
- statusMessage?: string;
10
- version?: string;
11
- environment?: string;
12
- };
13
- export type LangfuseEventAttributes = LangfuseSpanAttributes;
14
- export type LangfuseGenerationAttributes = LangfuseSpanAttributes & {
15
- completionStartTime?: Date;
16
- model?: string | null;
17
- modelParameters?: {
18
- [key: string]: string | number | null;
19
- };
20
- usageDetails?: {
21
- [key: string]: number;
22
- } | OpenAiUsage;
23
- costDetails?: {
24
- [key: string]: number;
25
- };
26
- prompt?: {
27
- name: string;
28
- version: number;
29
- isFallback: boolean;
30
- };
31
- };
32
- export type LangfuseAttributes = LangfuseSpanAttributes | LangfuseGenerationAttributes | LangfuseEventAttributes;
33
- export type LangfuseTraceAttributes = {
34
- name?: string;
35
- userId?: string;
36
- sessionId?: string;
37
- version?: string;
38
- release?: string;
39
- input?: unknown;
40
- output?: unknown;
41
- metadata?: unknown;
42
- tags?: string[];
43
- public?: boolean;
44
- environment?: string;
45
- };
46
- export type TraceContext = {
47
- traceId: string;
48
- parentObservationId?: string;
49
- };
50
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,YAAY,GAAG,OAAO,CAAC;AACtE,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AACzE,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG,sBAAsB,CAAC;AAC7D,MAAM,MAAM,4BAA4B,GAAG,sBAAsB,GAAG;IAClE,mBAAmB,CAAC,EAAE,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,eAAe,CAAC,EAAE;QAChB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;KACvC,CAAC;IACF,YAAY,CAAC,EACT;QACE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;KACvB,GACD,WAAW,CAAC;IAChB,WAAW,CAAC,EAAE;QACZ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;KACvB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B,sBAAsB,GACtB,4BAA4B,GAC5B,uBAAuB,CAAC;AAE5B,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC"}
package/dist/types.js DELETED
@@ -1 +0,0 @@
1
- export {};
package/dist/utils.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export declare function getLangfuseTracer(): import("@opentelemetry/api").Tracer;
2
- //# sourceMappingURL=utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAGA,wBAAgB,iBAAiB,wCAEhC"}
package/dist/utils.js DELETED
@@ -1,5 +0,0 @@
1
- import { LANGFUSE_SDK_VERSION, LANGFUSE_TRACER_NAME } from "@langfuse/core";
2
- import { trace } from "@opentelemetry/api";
3
- export function getLangfuseTracer() {
4
- return trace.getTracer(LANGFUSE_TRACER_NAME, LANGFUSE_SDK_VERSION);
5
- }