@uselemma/tracing 2.11.0 → 2.12.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.
@@ -5,23 +5,17 @@ export type TraceContext = {
5
5
  /** Unique identifier for this agent run. */
6
6
  runId: string;
7
7
  /**
8
- * Signal the run is complete. When `autoEndRoot` is enabled (the default),
9
- * this is a no-op and returns `false` the span is ended automatically.
10
- * When `autoEndRoot` is disabled, this ends the top-level span and returns `true`.
8
+ * Record the run output. Sets `ai.agent.output` on the span — call this
9
+ * before returning to store a specific value. If omitted, the function's
10
+ * return value is captured automatically.
11
11
  */
12
- onComplete: (result: unknown) => boolean;
12
+ onComplete: (result: unknown) => void;
13
13
  /** Record an error on the span. Marks the span as errored. */
14
14
  recordError: (error: unknown) => void;
15
15
  };
16
16
  export type WrapAgentOptions = {
17
17
  /** Mark this run as an experiment in Lemma. */
18
18
  isExperiment?: boolean;
19
- /**
20
- * If `true` (the default), the top-level span is automatically ended when
21
- * the wrapped function returns or throws. Set to `false` to manage span
22
- * lifetime manually via `ctx.onComplete`.
23
- */
24
- autoEndRoot?: boolean;
25
19
  };
26
20
  /**
27
21
  * Wraps an agent function with OpenTelemetry tracing, automatically creating
@@ -31,7 +25,8 @@ export type WrapAgentOptions = {
31
25
  * agent metadata (name, run ID, experiment flag), and handles error recording.
32
26
  *
33
27
  * `ai.agent.input` and `ai.agent.output` are set as JSON strings for Lemma
34
- * ingestion and UI.
28
+ * ingestion and UI. The span ends automatically when the wrapped function
29
+ * returns or throws.
35
30
  *
36
31
  * @example
37
32
  * const myAgent = wrapAgent<{ topic: string }>(
@@ -47,7 +42,6 @@ export type WrapAgentOptions = {
47
42
  * @param fn - The agent function to wrap. Receives a {@link TraceContext} as its first argument and the call-time input as its second.
48
43
  * @param options - Configuration for the agent trace.
49
44
  * @param options.isExperiment - Mark this run as an experiment in Lemma.
50
- * @param options.autoEndRoot - Automatically end the top-level span when the wrapped function returns or throws (default: `true`). Set to `false` to end manually via `ctx.onComplete`.
51
45
  * @returns An async function that accepts an `input`, executes `fn` inside a traced context, and returns `{ result, runId, span }`.
52
46
  */
53
47
  export declare function wrapAgent<Input = unknown>(agentName: string, fn: (traceContext: TraceContext, input: Input) => any, options?: WrapAgentOptions): (this: any, input: Input) => Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"trace-wrapper.d.ts","sourceRoot":"","sources":["../src/trace-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAKxE,MAAM,MAAM,YAAY,GAAG;IACzB,wDAAwD;IACxD,IAAI,EAAE,IAAI,CAAC;IACX,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;IACzC,8DAA8D;IAC9D,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+CAA+C;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,SAAS,CAAC,KAAK,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,EAAE,OAAO,CAAC,EAAE,gBAAgB,UAC/F,GAAG,SAAS,KAAK;;;;GAsEhE"}
1
+ {"version":3,"file":"trace-wrapper.d.ts","sourceRoot":"","sources":["../src/trace-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAKxE,MAAM,MAAM,YAAY,GAAG;IACzB,wDAAwD;IACxD,IAAI,EAAE,IAAI,CAAC;IACX,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,8DAA8D;IAC9D,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+CAA+C;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,SAAS,CAAC,KAAK,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,EAAE,OAAO,CAAC,EAAE,gBAAgB,UAC/F,GAAG,SAAS,KAAK;;;;GAqDhE"}
@@ -13,7 +13,8 @@ const experiment_mode_1 = require("./experiment-mode");
13
13
  * agent metadata (name, run ID, experiment flag), and handles error recording.
14
14
  *
15
15
  * `ai.agent.input` and `ai.agent.output` are set as JSON strings for Lemma
16
- * ingestion and UI.
16
+ * ingestion and UI. The span ends automatically when the wrapped function
17
+ * returns or throws.
17
18
  *
18
19
  * @example
19
20
  * const myAgent = wrapAgent<{ topic: string }>(
@@ -29,66 +30,48 @@ const experiment_mode_1 = require("./experiment-mode");
29
30
  * @param fn - The agent function to wrap. Receives a {@link TraceContext} as its first argument and the call-time input as its second.
30
31
  * @param options - Configuration for the agent trace.
31
32
  * @param options.isExperiment - Mark this run as an experiment in Lemma.
32
- * @param options.autoEndRoot - Automatically end the top-level span when the wrapped function returns or throws (default: `true`). Set to `false` to end manually via `ctx.onComplete`.
33
33
  * @returns An async function that accepts an `input`, executes `fn` inside a traced context, and returns `{ result, runId, span }`.
34
34
  */
35
35
  function wrapAgent(agentName, fn, options) {
36
36
  const wrappedFunction = async function (input) {
37
- // Obtain the Lemma tracer from the global OTel provider
38
37
  const tracer = api_1.trace.getTracer("lemma");
39
- // Generate a unique run ID and open a new span for this agent invocation
40
38
  const runId = (0, uuid_1.v4)();
41
- const autoEndRoot = options?.autoEndRoot !== false; // default true
42
39
  const span = tracer.startSpan("ai.agent.run", {
43
40
  attributes: {
44
41
  "ai.agent.name": agentName,
45
42
  "lemma.run_id": runId,
46
43
  "lemma.is_experiment": (0, experiment_mode_1.isExperimentModeEnabled)() || options?.isExperiment === true,
47
- "lemma.auto_end_root": autoEndRoot,
48
44
  },
49
45
  }, api_1.ROOT_CONTEXT);
50
46
  span.setAttribute("ai.agent.input", JSON.stringify(input) ?? "null");
51
- (0, debug_mode_1.lemmaDebug)("trace-wrapper", "span started", { agentName, runId, autoEndRoot });
52
- // Propagate the span as the active context so child spans are nested correctly
47
+ (0, debug_mode_1.lemmaDebug)("trace-wrapper", "span started", { agentName, runId });
53
48
  const ctx = api_1.trace.setSpan(api_1.ROOT_CONTEXT, span);
54
- let rootEnded = false;
49
+ let outputSet = false;
55
50
  try {
56
51
  return await api_1.context.with(ctx, async () => {
57
- const onComplete = (resultFromComplete) => {
58
- if (!autoEndRoot && !rootEnded) {
59
- span.setAttribute("ai.agent.output", JSON.stringify(resultFromComplete) ?? "null");
60
- rootEnded = true;
61
- span.end();
62
- (0, debug_mode_1.lemmaDebug)("trace-wrapper", "span ended via onComplete", { runId });
63
- return true;
64
- }
65
- (0, debug_mode_1.lemmaDebug)("trace-wrapper", "onComplete called but span not ended (autoEndRoot active or already ended)", { runId });
66
- return false;
52
+ const onComplete = (result) => {
53
+ span.setAttribute("ai.agent.output", JSON.stringify(result) ?? "null");
54
+ outputSet = true;
55
+ (0, debug_mode_1.lemmaDebug)("trace-wrapper", "onComplete called", { runId });
67
56
  };
68
57
  const recordError = (error) => {
69
58
  span.recordException(error instanceof Error ? error : new Error(String(error)));
70
59
  span.setStatus({ code: 2 }); // SpanStatusCode.ERROR
71
60
  };
72
61
  const result = await fn.call(this, { span, runId, onComplete, recordError }, input);
73
- // Auto-end the span if autoEndRoot is enabled and onComplete hasn't ended it yet
74
- if (autoEndRoot && !rootEnded) {
62
+ if (!outputSet) {
75
63
  span.setAttribute("ai.agent.output", JSON.stringify(result) ?? "null");
76
- rootEnded = true;
77
- span.end();
78
- (0, debug_mode_1.lemmaDebug)("trace-wrapper", "span auto-ended after fn returned", { runId });
79
64
  }
65
+ span.end();
66
+ (0, debug_mode_1.lemmaDebug)("trace-wrapper", "span ended after fn returned", { runId });
80
67
  return { result, runId, span };
81
68
  });
82
69
  }
83
70
  catch (err) {
84
- // Record the exception on the span, mark it as errored, and end it
85
71
  span.recordException(err);
86
72
  span.setStatus({ code: 2 }); // SpanStatusCode.ERROR
87
- if (!rootEnded) {
88
- rootEnded = true;
89
- span.end();
90
- (0, debug_mode_1.lemmaDebug)("trace-wrapper", "span ended on error", { runId, error: String(err) });
91
- }
73
+ span.end();
74
+ (0, debug_mode_1.lemmaDebug)("trace-wrapper", "span ended on error", { runId, error: String(err) });
92
75
  throw err;
93
76
  }
94
77
  };
@@ -1 +1 @@
1
- {"version":3,"file":"trace-wrapper.js","sourceRoot":"","sources":["../src/trace-wrapper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trace-wrapper.js","sourceRoot":"","sources":["../src/trace-wrapper.ts"],"names":[],"mappings":";;AAoDA,8BAsDC;AA1GD,4CAAwE;AACxE,+BAAoC;AACpC,6CAA0C;AAC1C,uDAA4D;AAsB5D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,SAAgB,SAAS,CAAkB,SAAiB,EAAE,EAAqD,EAAE,OAA0B;IAC7I,MAAM,eAAe,GAAG,KAAK,WAAsB,KAAY;QAC7D,MAAM,MAAM,GAAG,WAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,IAAA,SAAM,GAAE,CAAC;QAEvB,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE;YAC5C,UAAU,EAAE;gBACV,eAAe,EAAE,SAAS;gBAC1B,cAAc,EAAE,KAAK;gBACrB,qBAAqB,EAAE,IAAA,yCAAuB,GAAE,IAAI,OAAO,EAAE,YAAY,KAAK,IAAI;aACnF;SACF,EAAE,kBAAY,CAAC,CAAC;QAEjB,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC;QAErE,IAAA,uBAAU,EAAC,eAAe,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAElE,MAAM,GAAG,GAAG,WAAK,CAAC,OAAO,CAAC,kBAAY,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,IAAI,CAAC;YACH,OAAO,MAAM,aAAO,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE;gBACxC,MAAM,UAAU,GAAG,CAAC,MAAe,EAAQ,EAAE;oBAC3C,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC;oBACvE,SAAS,GAAG,IAAI,CAAC;oBACjB,IAAA,uBAAU,EAAC,eAAe,EAAE,mBAAmB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC9D,CAAC,CAAC;gBAEF,MAAM,WAAW,GAAG,CAAC,KAAc,EAAE,EAAE;oBACrC,IAAI,CAAC,eAAe,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAChF,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB;gBACtD,CAAC,CAAC;gBAEF,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;gBAEpF,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC;gBACzE,CAAC;gBAED,IAAI,CAAC,GAAG,EAAE,CAAC;gBACX,IAAA,uBAAU,EAAC,eAAe,EAAE,8BAA8B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBAEvE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YACjC,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,eAAe,CAAC,GAAY,CAAC,CAAC;YACnC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB;YACpD,IAAI,CAAC,GAAG,EAAE,CAAC;YACX,IAAA,uBAAU,EAAC,eAAe,EAAE,qBAAqB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClF,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,eAAe,CAAC;AACzB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uselemma/tracing",
3
- "version": "2.11.0",
3
+ "version": "2.12.0",
4
4
  "description": "OpenTelemetry-based tracing module for Lemma",
5
5
  "license": "MIT",
6
6
  "author": "Lemma",