@introspection-sdk/introspection-node 0.4.2 → 0.4.4

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.
Files changed (219) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/client.d.ts +42 -132
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +67 -366
  5. package/dist/client.js.map +1 -0
  6. package/dist/converters/claude.d.ts +4 -0
  7. package/dist/converters/claude.d.ts.map +1 -1
  8. package/dist/converters/claude.js +7 -0
  9. package/dist/converters/claude.js.map +1 -0
  10. package/dist/converters/gemini.d.ts +90 -0
  11. package/dist/converters/gemini.d.ts.map +1 -0
  12. package/dist/converters/gemini.js +171 -0
  13. package/dist/converters/gemini.js.map +1 -0
  14. package/dist/converters/index.d.ts +1 -1
  15. package/dist/converters/index.d.ts.map +1 -1
  16. package/dist/converters/index.js +2 -1
  17. package/dist/converters/index.js.map +1 -0
  18. package/dist/converters/openai.js +1 -0
  19. package/dist/converters/openai.js.map +1 -0
  20. package/dist/converters/openinference.js +1 -0
  21. package/dist/converters/openinference.js.map +1 -0
  22. package/dist/converters/vercel.d.ts.map +1 -1
  23. package/dist/converters/vercel.js +31 -3
  24. package/dist/converters/vercel.js.map +1 -0
  25. package/dist/http.d.ts +36 -0
  26. package/dist/http.d.ts.map +1 -0
  27. package/dist/http.js +145 -0
  28. package/dist/http.js.map +1 -0
  29. package/dist/index.d.ts +24 -27
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +22 -32
  32. package/dist/index.js.map +1 -0
  33. package/dist/{anthropic.d.ts → otel/anthropic.d.ts} +23 -13
  34. package/dist/otel/anthropic.d.ts.map +1 -0
  35. package/dist/{anthropic.js → otel/anthropic.js} +132 -40
  36. package/dist/otel/anthropic.js.map +1 -0
  37. package/dist/{claude-hooks.d.ts → otel/claude-hooks.d.ts} +19 -1
  38. package/dist/otel/claude-hooks.d.ts.map +1 -0
  39. package/dist/{claude-hooks.js → otel/claude-hooks.js} +94 -20
  40. package/dist/otel/claude-hooks.js.map +1 -0
  41. package/dist/otel/claude-wrapper.d.ts.map +1 -0
  42. package/dist/{claude-wrapper.js → otel/claude-wrapper.js} +2 -1
  43. package/dist/otel/claude-wrapper.js.map +1 -0
  44. package/dist/otel/gemini.d.ts +56 -0
  45. package/dist/otel/gemini.d.ts.map +1 -0
  46. package/dist/otel/gemini.js +348 -0
  47. package/dist/otel/gemini.js.map +1 -0
  48. package/dist/otel/index.d.ts +32 -0
  49. package/dist/otel/index.d.ts.map +1 -0
  50. package/dist/otel/index.js +41 -0
  51. package/dist/otel/index.js.map +1 -0
  52. package/dist/otel/init.d.ts +126 -0
  53. package/dist/otel/init.d.ts.map +1 -0
  54. package/dist/otel/init.js +259 -0
  55. package/dist/otel/init.js.map +1 -0
  56. package/dist/otel/integrations/anthropic.d.ts +10 -0
  57. package/dist/otel/integrations/anthropic.d.ts.map +1 -0
  58. package/dist/otel/integrations/anthropic.js +22 -0
  59. package/dist/otel/integrations/anthropic.js.map +1 -0
  60. package/dist/otel/integrations/base.d.ts +83 -0
  61. package/dist/otel/integrations/base.d.ts.map +1 -0
  62. package/dist/otel/integrations/base.js +23 -0
  63. package/dist/otel/integrations/base.js.map +1 -0
  64. package/dist/otel/integrations/claude-agent.d.ts +13 -0
  65. package/dist/otel/integrations/claude-agent.d.ts.map +1 -0
  66. package/dist/otel/integrations/claude-agent.js +27 -0
  67. package/dist/otel/integrations/claude-agent.js.map +1 -0
  68. package/dist/otel/integrations/gemini.d.ts +11 -0
  69. package/dist/otel/integrations/gemini.d.ts.map +1 -0
  70. package/dist/otel/integrations/gemini.js +21 -0
  71. package/dist/otel/integrations/gemini.js.map +1 -0
  72. package/dist/otel/integrations/index.d.ts +39 -0
  73. package/dist/otel/integrations/index.d.ts.map +1 -0
  74. package/dist/otel/integrations/index.js +131 -0
  75. package/dist/otel/integrations/index.js.map +1 -0
  76. package/dist/otel/integrations/langchain.d.ts +16 -0
  77. package/dist/otel/integrations/langchain.d.ts.map +1 -0
  78. package/dist/otel/integrations/langchain.js +41 -0
  79. package/dist/otel/integrations/langchain.js.map +1 -0
  80. package/dist/otel/integrations/mastra.d.ts +14 -0
  81. package/dist/otel/integrations/mastra.d.ts.map +1 -0
  82. package/dist/otel/integrations/mastra.js +27 -0
  83. package/dist/otel/integrations/mastra.js.map +1 -0
  84. package/dist/otel/integrations/openai-agents.d.ts +11 -0
  85. package/dist/otel/integrations/openai-agents.d.ts.map +1 -0
  86. package/dist/otel/integrations/openai-agents.js +25 -0
  87. package/dist/otel/integrations/openai-agents.js.map +1 -0
  88. package/dist/otel/integrations/pi.d.ts +12 -0
  89. package/dist/otel/integrations/pi.d.ts.map +1 -0
  90. package/dist/otel/integrations/pi.js +20 -0
  91. package/dist/otel/integrations/pi.js.map +1 -0
  92. package/dist/otel/integrations/vercel.d.ts +15 -0
  93. package/dist/otel/integrations/vercel.d.ts.map +1 -0
  94. package/dist/otel/integrations/vercel.js +20 -0
  95. package/dist/otel/integrations/vercel.js.map +1 -0
  96. package/dist/{langchain-handler.d.ts → otel/langchain-handler.d.ts} +10 -1
  97. package/dist/otel/langchain-handler.d.ts.map +1 -0
  98. package/dist/{langchain-handler.js → otel/langchain-handler.js} +43 -6
  99. package/dist/otel/langchain-handler.js.map +1 -0
  100. package/dist/otel/logs.d.ts +82 -0
  101. package/dist/otel/logs.d.ts.map +1 -0
  102. package/dist/otel/logs.js +271 -0
  103. package/dist/otel/logs.js.map +1 -0
  104. package/dist/{mastra-exporter.d.ts → otel/mastra-exporter.d.ts} +3 -1
  105. package/dist/otel/mastra-exporter.d.ts.map +1 -0
  106. package/dist/{mastra-exporter.js → otel/mastra-exporter.js} +71 -17
  107. package/dist/otel/mastra-exporter.js.map +1 -0
  108. package/dist/otel/pi.d.ts +59 -0
  109. package/dist/otel/pi.d.ts.map +1 -0
  110. package/dist/otel/pi.js +67 -0
  111. package/dist/otel/pi.js.map +1 -0
  112. package/dist/otel/register.d.ts +8 -0
  113. package/dist/otel/register.d.ts.map +1 -0
  114. package/dist/otel/register.js +48 -0
  115. package/dist/otel/register.js.map +1 -0
  116. package/dist/otel/setup.d.ts +52 -0
  117. package/dist/otel/setup.d.ts.map +1 -0
  118. package/dist/otel/setup.js +146 -0
  119. package/dist/otel/setup.js.map +1 -0
  120. package/dist/{span-processor.d.ts → otel/span-processor.d.ts} +1 -1
  121. package/dist/otel/span-processor.d.ts.map +1 -0
  122. package/dist/{span-processor.js → otel/span-processor.js} +11 -5
  123. package/dist/otel/span-processor.js.map +1 -0
  124. package/dist/{tracing-processor.d.ts → otel/tracing-processor.d.ts} +4 -1
  125. package/dist/otel/tracing-processor.d.ts.map +1 -0
  126. package/dist/{tracing-processor.js → otel/tracing-processor.js} +64 -14
  127. package/dist/otel/tracing-processor.js.map +1 -0
  128. package/dist/resources/experiments.d.ts +31 -0
  129. package/dist/resources/experiments.d.ts.map +1 -0
  130. package/dist/resources/experiments.js +133 -0
  131. package/dist/resources/experiments.js.map +1 -0
  132. package/dist/resources/recipes.d.ts +22 -0
  133. package/dist/resources/recipes.d.ts.map +1 -0
  134. package/dist/resources/recipes.js +61 -0
  135. package/dist/resources/recipes.js.map +1 -0
  136. package/dist/resources/runtimes.d.ts +76 -0
  137. package/dist/resources/runtimes.d.ts.map +1 -0
  138. package/dist/resources/runtimes.js +179 -0
  139. package/dist/resources/runtimes.js.map +1 -0
  140. package/dist/runner-resources/files.d.ts +35 -0
  141. package/dist/runner-resources/files.d.ts.map +1 -0
  142. package/dist/runner-resources/files.js +131 -0
  143. package/dist/runner-resources/files.js.map +1 -0
  144. package/dist/runner-resources/tasks.d.ts +39 -0
  145. package/dist/runner-resources/tasks.d.ts.map +1 -0
  146. package/dist/runner-resources/tasks.js +129 -0
  147. package/dist/runner-resources/tasks.js.map +1 -0
  148. package/dist/runner.d.ts +80 -0
  149. package/dist/runner.d.ts.map +1 -0
  150. package/dist/runner.js +159 -0
  151. package/dist/runner.js.map +1 -0
  152. package/dist/streaming.d.ts +8 -0
  153. package/dist/streaming.d.ts.map +1 -0
  154. package/dist/streaming.js +67 -0
  155. package/dist/streaming.js.map +1 -0
  156. package/dist/types.js +1 -0
  157. package/dist/types.js.map +1 -0
  158. package/dist/utils.d.ts +10 -0
  159. package/dist/utils.d.ts.map +1 -1
  160. package/dist/utils.js +13 -4
  161. package/dist/utils.js.map +1 -0
  162. package/dist/version.js +1 -0
  163. package/dist/version.js.map +1 -0
  164. package/package.json +91 -22
  165. package/src/client.ts +76 -473
  166. package/src/converters/claude.ts +10 -0
  167. package/src/converters/gemini.ts +243 -0
  168. package/src/converters/index.ts +13 -7
  169. package/src/converters/vercel.ts +41 -3
  170. package/src/http.ts +163 -0
  171. package/src/index.ts +110 -75
  172. package/src/{anthropic.ts → otel/anthropic.ts} +206 -54
  173. package/src/{claude-hooks.ts → otel/claude-hooks.ts} +119 -20
  174. package/src/{claude-wrapper.ts → otel/claude-wrapper.ts} +1 -1
  175. package/src/otel/gemini.ts +491 -0
  176. package/src/otel/index.ts +121 -0
  177. package/src/otel/init.ts +411 -0
  178. package/src/otel/integrations/anthropic.ts +26 -0
  179. package/src/otel/integrations/base.ts +95 -0
  180. package/src/otel/integrations/claude-agent.ts +32 -0
  181. package/src/otel/integrations/gemini.ts +25 -0
  182. package/src/otel/integrations/index.ts +151 -0
  183. package/src/otel/integrations/langchain.ts +45 -0
  184. package/src/otel/integrations/mastra.ts +30 -0
  185. package/src/otel/integrations/openai-agents.ts +31 -0
  186. package/src/otel/integrations/pi.ts +24 -0
  187. package/src/otel/integrations/vercel.ts +24 -0
  188. package/src/{langchain-handler.ts → otel/langchain-handler.ts} +53 -6
  189. package/src/otel/logs.ts +394 -0
  190. package/src/{mastra-exporter.ts → otel/mastra-exporter.ts} +83 -22
  191. package/src/otel/pi.ts +88 -0
  192. package/src/otel/register.ts +50 -0
  193. package/src/otel/setup.ts +215 -0
  194. package/src/{span-processor.ts → otel/span-processor.ts} +11 -6
  195. package/src/{tracing-processor.ts → otel/tracing-processor.ts} +94 -19
  196. package/src/resources/experiments.ts +170 -0
  197. package/src/resources/recipes.ts +73 -0
  198. package/src/resources/runtimes.ts +231 -0
  199. package/src/runner-resources/files.ts +163 -0
  200. package/src/runner-resources/tasks.ts +156 -0
  201. package/src/runner.ts +194 -0
  202. package/src/streaming.ts +57 -0
  203. package/src/utils.ts +12 -5
  204. package/dist/ai-sdk-integration.d.ts +0 -123
  205. package/dist/ai-sdk-integration.d.ts.map +0 -1
  206. package/dist/ai-sdk-integration.js +0 -475
  207. package/dist/anthropic.d.ts.map +0 -1
  208. package/dist/claude-hooks.d.ts.map +0 -1
  209. package/dist/claude-wrapper.d.ts.map +0 -1
  210. package/dist/converters/ai-sdk.d.ts +0 -65
  211. package/dist/converters/ai-sdk.d.ts.map +0 -1
  212. package/dist/converters/ai-sdk.js +0 -261
  213. package/dist/langchain-handler.d.ts.map +0 -1
  214. package/dist/mastra-exporter.d.ts.map +0 -1
  215. package/dist/span-processor.d.ts.map +0 -1
  216. package/dist/tracing-processor.d.ts.map +0 -1
  217. package/src/ai-sdk-integration.ts +0 -691
  218. package/src/converters/ai-sdk.ts +0 -323
  219. /package/dist/{claude-wrapper.d.ts → otel/claude-wrapper.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.d.ts","sourceRoot":"","sources":["../../src/otel/pi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAGL,KAAK,SAAS,EAEf,MAAM,qCAAqC,CAAC;AAG7C,YAAY,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAErE,MAAM,WAAW,kCAAkC;IACjD,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,qBAAa,2BAA2B;IACtC,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,iBAAiB,CAA8B;gBAE3C,IAAI,GAAE,kCAAuC;IAOzD;;;;;;;;OAQG;IACH,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAU/C;;OAEG;IACH,IAAI,IAAI,IAAI;CAIb"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * High-level pi Agent SDK integration for Introspection.
3
+ *
4
+ * Wraps {@link @introspection-sdk/introspection-pi} behind a zero-config
5
+ * interface so users don't need to manage OpenTelemetry tracers directly.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { IntrospectionPiInstrumentor, setupTracing } from "@introspection-sdk/introspection-node";
10
+ * import { Agent } from "@mariozechner/pi-agent-core";
11
+ *
12
+ * setupTracing({ serviceName: "my-app" });
13
+ * const instrumentor = new IntrospectionPiInstrumentor();
14
+ *
15
+ * const agent = new Agent({ ... });
16
+ * instrumentor.instrument(agent, {
17
+ * conversationId: "conv-123",
18
+ * agentId: "weather-agent",
19
+ * agentName: "Weather",
20
+ * });
21
+ *
22
+ * await agent.prompt("What's the weather in Tokyo?");
23
+ * instrumentor.stop();
24
+ * ```
25
+ */
26
+ import { trace } from "@opentelemetry/api";
27
+ import { instrumentStream, instrumentAgent, } from "@introspection-sdk/introspection-pi";
28
+ import { VERSION } from "../version.js";
29
+ /**
30
+ * Zero-config pi Agent SDK integration for Introspection.
31
+ *
32
+ * Uses the global OTel tracer provider (registered by {@link setupTracing}).
33
+ * Call {@link instrument} once per {@link Agent} instance, then {@link stop}
34
+ * to unsubscribe all tool instrumentation and finalize open spans.
35
+ */
36
+ export class IntrospectionPiInstrumentor {
37
+ _tracer;
38
+ _instrumentations = [];
39
+ constructor(opts = {}) {
40
+ this._tracer = trace.getTracer(opts.tracerName ?? "introspection-pi", VERSION);
41
+ }
42
+ /**
43
+ * Instrument a pi {@link Agent}:
44
+ * - Wraps `agent.streamFn` to emit a `chat ${provider}` span per LLM call.
45
+ * - Subscribes to the agent loop to emit an `execute_tool ${name}` span per
46
+ * tool execution.
47
+ *
48
+ * @param agent - The pi Agent instance to instrument.
49
+ * @param meta - Identity metadata stamped on every span produced by this agent.
50
+ */
51
+ instrument(agent, meta) {
52
+ agent.streamFn = instrumentStream(agent.streamFn, {
53
+ tracer: this._tracer,
54
+ meta,
55
+ });
56
+ this._instrumentations.push(instrumentAgent(agent, { tracer: this._tracer, meta }));
57
+ }
58
+ /**
59
+ * Unsubscribe all active tool instrumentations and finalize any open spans.
60
+ */
61
+ stop() {
62
+ for (const inst of this._instrumentations)
63
+ inst.stop();
64
+ this._instrumentations = [];
65
+ }
66
+ }
67
+ //# sourceMappingURL=pi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.js","sourceRoot":"","sources":["../../src/otel/pi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EACL,gBAAgB,EAChB,eAAe,GAGhB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AASxC;;;;;;GAMG;AACH,MAAM,OAAO,2BAA2B;IAC9B,OAAO,CAAqC;IAC5C,iBAAiB,GAA2B,EAAE,CAAC;IAEvD,YAAY,OAA2C,EAAE;QACvD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,CAC5B,IAAI,CAAC,UAAU,IAAI,kBAAkB,EACrC,OAAO,CACR,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,UAAU,CAAC,KAAY,EAAE,IAAe;QACtC,KAAK,CAAC,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE;YAChD,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,IAAI;SACL,CAAC,CAAC;QACH,IAAI,CAAC,iBAAiB,CAAC,IAAI,CACzB,eAAe,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CACvD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,IAAI;QACF,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,iBAAiB;YAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACvD,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Run `init()` if a token is configured. Exported (and awaited at module load)
3
+ * so tests can invoke it deterministically; the module-level `await` below
4
+ * guarantees the preload finishes — including framework auto-discovery and the
5
+ * prototype patch — before Node evaluates the application entry point.
6
+ */
7
+ export declare function registerFromEnv(): Promise<void>;
8
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/otel/register.ts"],"names":[],"mappings":"AA2BA;;;;;GAKG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAcrD"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Zero-code preload entry point for Introspection tracing.
3
+ *
4
+ * Usage (ESM):
5
+ *
6
+ * ```bash
7
+ * node --import @introspection-sdk/introspection-node/otel/register app.js
8
+ * ```
9
+ *
10
+ * Runs `introspection.init()` from the environment **before** the app's module
11
+ * graph executes, so no `init()` call is needed in application source. Because
12
+ * the Anthropic / Gemini one-liner works by prototype-patching the SDK classes
13
+ * (see `AnthropicInstrumentor.instrumentClass`), every client constructed after
14
+ * this preload is traced with zero code changes.
15
+ *
16
+ * Configuration is read from the usual environment variables
17
+ * (`INTROSPECTION_TOKEN`, `INTROSPECTION_SERVICE_NAME`,
18
+ * `INTROSPECTION_BASE_OTEL_URL`). If no token is configured the preload logs a
19
+ * warning and does nothing, so it never crashes the host application.
20
+ *
21
+ * This is the counterpart to the private SDK's `register.ts`, adapted to the
22
+ * `src/otel` surface: it drives the existing `init()` rather than registering an
23
+ * import-in-the-middle loader hook (the prototype-patch path does not need one).
24
+ */
25
+ import { logger } from "../utils.js";
26
+ import { init } from "./init.js";
27
+ /**
28
+ * Run `init()` if a token is configured. Exported (and awaited at module load)
29
+ * so tests can invoke it deterministically; the module-level `await` below
30
+ * guarantees the preload finishes — including framework auto-discovery and the
31
+ * prototype patch — before Node evaluates the application entry point.
32
+ */
33
+ export async function registerFromEnv() {
34
+ if (!process.env.INTROSPECTION_TOKEN) {
35
+ logger.warn("[introspection] register: INTROSPECTION_TOKEN not set; tracing not initialised.");
36
+ return;
37
+ }
38
+ try {
39
+ await init();
40
+ logger.debug("[introspection] register: tracing initialised from preload.");
41
+ }
42
+ catch (err) {
43
+ // Never let a preload failure take down the host application.
44
+ logger.warn(`[introspection] register: init failed: ${String(err)}`);
45
+ }
46
+ }
47
+ await registerFromEnv();
48
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/otel/register.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CACT,iFAAiF,CAClF,CAAC;QACF,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,8DAA8D;QAC9D,MAAM,CAAC,IAAI,CAAC,0CAA0C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED,MAAM,eAAe,EAAE,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
2
+ import type { SpanProcessor } from "@opentelemetry/sdk-trace-base";
3
+ import { type IntrospectionSpanProcessorOptions } from "./span-processor.js";
4
+ export type ConflictBehavior = "warn" | "throw" | "replace";
5
+ export interface SetupTracingOptions extends IntrospectionSpanProcessorOptions {
6
+ /**
7
+ * What to do if a context manager or propagator is already registered.
8
+ *
9
+ * - `"warn"` (default) — log a warning and continue with the existing
10
+ * registration. Spans still flow but baggage may not propagate as
11
+ * expected. Set `INTROSPECTION_STRICT_TRACING=1` to upgrade to throw.
12
+ * - `"throw"` — throw an error. Use in environments where a silent
13
+ * baggage drop is unacceptable (production telemetry pipelines).
14
+ * - `"replace"` — force-register over the existing manager / propagator.
15
+ * Useful in tests or when migrating from another tracer; can break
16
+ * other libraries that relied on the previous registration.
17
+ */
18
+ onConflict?: ConflictBehavior;
19
+ /**
20
+ * Extra span processors attached to the same `NodeTracerProvider`, so a
21
+ * single set of spans fans out to other backends (Langfuse, Arize, …).
22
+ * This is the low-level dual-export hook:
23
+ *
24
+ * ```ts
25
+ * setupTracing({
26
+ * serviceName: "my-app",
27
+ * additionalSpanProcessors: [new BatchSpanProcessor(langfuseExporter)],
28
+ * });
29
+ * ```
30
+ *
31
+ * Note: the {@link IntrospectionSpanProcessor} forwards its *own* converted
32
+ * copy of each span to Introspection — it does not mutate the shared span —
33
+ * so these processors receive the raw span and run independently of it.
34
+ * Order is therefore irrelevant. `introspection.init({ spanProcessors })`
35
+ * is the equivalent for the one-liner surface.
36
+ */
37
+ additionalSpanProcessors?: SpanProcessor[];
38
+ }
39
+ /**
40
+ * Install the OTel context manager + W3C (trace-context + baggage) propagator
41
+ * that Introspection's baggage scopes depend on.
42
+ *
43
+ * Shared by {@link setupTracing} and `introspection.init()`. `behavior`
44
+ * controls what happens when a manager / propagator is already registered
45
+ * (see {@link ConflictBehavior}).
46
+ */
47
+ export declare function registerOTelGlobals(behavior?: ConflictBehavior): void;
48
+ /**
49
+ * Initialise Introspection tracing for a Node.js process.
50
+ */
51
+ export declare function setupTracing(options?: SetupTracingOptions): NodeTracerProvider;
52
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/otel/setup.ts"],"names":[],"mappings":"AA8DA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAGnE,OAAO,EAEL,KAAK,iCAAiC,EACvC,MAAM,qBAAqB,CAAC;AAI7B,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAE5D,MAAM,WAAW,mBAAoB,SAAQ,iCAAiC;IAC5E;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAE9B;;;;;;;;;;;;;;;;;OAiBG;IACH,wBAAwB,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5C;AA8DD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAIrE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,kBAAkB,CAwBpB"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * One-call tracing bootstrap for Introspection.
3
+ *
4
+ * Wires up the three things every host process needs for baggage-based
5
+ * agent / conversation propagation to work:
6
+ *
7
+ * 1. `AsyncLocalStorageContextManager` — without this, `context.with()` is a
8
+ * no-op (the default `NOOP_CONTEXT_MANAGER` silently drops the context),
9
+ * which makes `IntrospectionClient.withAgent()`, `.withConversation()`,
10
+ * etc. dead code.
11
+ * 2. `W3CBaggagePropagator` — so baggage is carried across HTTP boundaries
12
+ * via the `baggage` header (alongside W3C trace-context).
13
+ * 3. A registered `NodeTracerProvider` with an `IntrospectionSpanProcessor`
14
+ * on it — so spans are exported to Introspection and baggage values
15
+ * (conversation / agent IDs) are merged into span attributes at
16
+ * `onEnd()` time.
17
+ *
18
+ * Call this once at process start (before any instrumentors run). It is
19
+ * idempotent across re-invocations — the cached provider is returned and
20
+ * the global registrations are not touched a second time.
21
+ *
22
+ * **Loud-by-default registration.** OTel's `setGlobalContextManager` /
23
+ * `setGlobalPropagator` silently refuse to replace an existing
24
+ * registration. If anything (another lib, a stale call, a test fixture)
25
+ * has already installed a context manager that does NOT propagate W3C
26
+ * baggage, our `withAgent` / `withConversation` calls become silent
27
+ * no-ops and users get spans with no identity attached — exactly the
28
+ * footgun this SDK exists to prevent.
29
+ *
30
+ * `setupTracing` defends against that:
31
+ * - If no manager / propagator is registered: install ours.
32
+ * - If one is registered: WARN (default) or THROW (strict mode) so the
33
+ * host author sees it, rather than discovering missing baggage in
34
+ * production telemetry weeks later.
35
+ *
36
+ * Pass `{ onConflict: "throw" }` (or set `INTROSPECTION_STRICT_TRACING=1`
37
+ * in the env) for the strict variant. Pass `{ onConflict: "replace" }`
38
+ * to force replacement when you know the prior registration is wrong
39
+ * (e.g. test setup, or migrating from another tracer).
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * import { setupTracing, IntrospectionClient } from "@introspection-sdk/introspection-node";
44
+ *
45
+ * setupTracing();
46
+ *
47
+ * const introspect = new IntrospectionClient();
48
+ *
49
+ * await introspect.withAgent("researcher", "researcher-1", () =>
50
+ * introspect.withConversation(conversationId, undefined, () =>
51
+ * client.messages.create({ ... }),
52
+ * ),
53
+ * );
54
+ * ```
55
+ */
56
+ import { context, propagation } from "@opentelemetry/api";
57
+ import { AsyncLocalStorageContextManager } from "@opentelemetry/context-async-hooks";
58
+ import { CompositePropagator, W3CBaggagePropagator, W3CTraceContextPropagator, } from "@opentelemetry/core";
59
+ import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
60
+ import { logger } from "../utils.js";
61
+ import { IntrospectionSpanProcessor, } from "./span-processor.js";
62
+ let registeredProvider;
63
+ function defaultConflictBehavior() {
64
+ return process.env.INTROSPECTION_STRICT_TRACING ? "throw" : "warn";
65
+ }
66
+ function registerContextManager(behavior) {
67
+ const ok = context.setGlobalContextManager(new AsyncLocalStorageContextManager().enable());
68
+ if (ok)
69
+ return;
70
+ // OTel silently refuses replacement — we have to disable+retry to force.
71
+ const msg = "setupTracing: another OTel context manager was already registered. " +
72
+ "withAgent / withConversation baggage scopes will not propagate unless " +
73
+ "that manager is an AsyncLocalStorageContextManager honoring W3C baggage.";
74
+ if (behavior === "throw") {
75
+ throw new Error(`[introspection] ${msg}`);
76
+ }
77
+ if (behavior === "replace") {
78
+ context.disable();
79
+ if (!context.setGlobalContextManager(new AsyncLocalStorageContextManager().enable())) {
80
+ throw new Error("[introspection] setupTracing: failed to replace context manager " +
81
+ "even after disable(); the OTel global registry is in a bad state.");
82
+ }
83
+ return;
84
+ }
85
+ logger.warn(msg);
86
+ }
87
+ function registerPropagator(behavior) {
88
+ const propagator = new CompositePropagator({
89
+ propagators: [new W3CTraceContextPropagator(), new W3CBaggagePropagator()],
90
+ });
91
+ const ok = propagation.setGlobalPropagator(propagator);
92
+ if (ok)
93
+ return;
94
+ const msg = "setupTracing: another OTel propagator was already registered. " +
95
+ "Cross-process baggage propagation depends on the existing propagator " +
96
+ "carrying the W3C `baggage` header.";
97
+ if (behavior === "throw") {
98
+ throw new Error(`[introspection] ${msg}`);
99
+ }
100
+ if (behavior === "replace") {
101
+ propagation.disable();
102
+ if (!propagation.setGlobalPropagator(propagator)) {
103
+ throw new Error("[introspection] setupTracing: failed to replace propagator even " +
104
+ "after disable(); the OTel global registry is in a bad state.");
105
+ }
106
+ return;
107
+ }
108
+ logger.warn(msg);
109
+ }
110
+ /**
111
+ * Install the OTel context manager + W3C (trace-context + baggage) propagator
112
+ * that Introspection's baggage scopes depend on.
113
+ *
114
+ * Shared by {@link setupTracing} and `introspection.init()`. `behavior`
115
+ * controls what happens when a manager / propagator is already registered
116
+ * (see {@link ConflictBehavior}).
117
+ */
118
+ export function registerOTelGlobals(behavior) {
119
+ const resolved = behavior ?? defaultConflictBehavior();
120
+ registerContextManager(resolved);
121
+ registerPropagator(resolved);
122
+ }
123
+ /**
124
+ * Initialise Introspection tracing for a Node.js process.
125
+ */
126
+ export function setupTracing(options) {
127
+ if (registeredProvider) {
128
+ return registeredProvider;
129
+ }
130
+ const behavior = options?.onConflict ?? defaultConflictBehavior();
131
+ registerOTelGlobals(behavior);
132
+ const provider = new NodeTracerProvider({
133
+ // Order is irrelevant: IntrospectionSpanProcessor exports its own converted
134
+ // copy and does not mutate the shared span, so co-located dual-export
135
+ // processors receive the raw span regardless of position. Listed first here
136
+ // (and in init()) purely for a consistent, readable ordering story.
137
+ spanProcessors: [
138
+ new IntrospectionSpanProcessor(options),
139
+ ...(options?.additionalSpanProcessors ?? []),
140
+ ],
141
+ });
142
+ provider.register();
143
+ registeredProvider = provider;
144
+ return provider;
145
+ }
146
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/otel/setup.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Context } from "@opentelemetry/api";
2
2
  import { SpanProcessor, ReadableSpan, Span } from "@opentelemetry/sdk-trace-base";
3
- import type { AdvancedOptions } from "./types.js";
3
+ import type { AdvancedOptions } from "../types.js";
4
4
  export interface IntrospectionSpanProcessorOptions {
5
5
  /** Authentication token (env: INTROSPECTION_TOKEN) */
6
6
  token?: string;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span-processor.d.ts","sourceRoot":"","sources":["../../src/otel/span-processor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAIR,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,aAAa,EACb,YAAY,EACZ,IAAI,EAGL,MAAM,+BAA+B,CAAC;AAMvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA8FnD,MAAM,WAAW,iCAAiC;IAChD,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,0BAA2B,YAAW,aAAa;IAC9D,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,gBAAgB,CAAkC;gBAE9C,OAAO,GAAE,iCAAsC;IA0H3D;;;;;OAKG;IACH,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,GAAG,IAAI;IAIjD;;;;;;OAMG;IACH,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAgI/B;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}
@@ -5,8 +5,8 @@ import { ATTR_SERVICE_NAME } from "@opentelemetry/semantic-conventions";
5
5
  import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto";
6
6
  import { ExportResultCode } from "@opentelemetry/core";
7
7
  import { randomUUID } from "crypto";
8
- import { logger, withOtlpHttpsProxy } from "./utils.js";
9
- import { isOpenInferenceSpan, replaceOpenInferenceWithGenAI, isVercelAISpan, convertVercelAIToGenAI, } from "./converters/index.js";
8
+ import { logger, withOtlpHttpsProxy } from "../utils.js";
9
+ import { isOpenInferenceSpan, replaceOpenInferenceWithGenAI, isVercelAISpan, convertVercelAIToGenAI, } from "../converters/index.js";
10
10
  /**
11
11
  * A {@link ReadableSpan} wrapper that substitutes the original attributes with
12
12
  * a converted set while delegating every other property to the original span.
@@ -103,7 +103,7 @@ export class IntrospectionSpanProcessor {
103
103
  this._serviceName = serviceName;
104
104
  const advanced = options.advanced || {};
105
105
  const baseUrl = advanced.baseUrl ||
106
- process.env.INTROSPECTION_BASE_URL ||
106
+ process.env.INTROSPECTION_BASE_OTEL_URL ||
107
107
  "https://otel.introspection.dev";
108
108
  const headers = {
109
109
  Authorization: `Bearer ${token}`,
@@ -281,11 +281,16 @@ export class IntrospectionSpanProcessor {
281
281
  (attrs["gen_ai.input.messages"] || attrs["gen_ai.output.messages"])) {
282
282
  attrs["gen_ai.operation.name"] = "chat";
283
283
  }
284
- // Agent name from baggage
284
+ // Agent name / id from baggage (baggage wins so per-call agent identity
285
+ // overrides any default stamped at instrumentor-construction time).
285
286
  const baggageAgentName = baggage?.getEntry("gen_ai.agent.name")?.value;
286
- if (baggageAgentName && !attrs["gen_ai.agent.name"]) {
287
+ if (baggageAgentName) {
287
288
  attrs["gen_ai.agent.name"] = baggageAgentName;
288
289
  }
290
+ const baggageAgentId = baggage?.getEntry("gen_ai.agent.id")?.value;
291
+ if (baggageAgentId) {
292
+ attrs["gen_ai.agent.id"] = baggageAgentId;
293
+ }
289
294
  // Override resource with service name if provided
290
295
  let resource;
291
296
  if (this._serviceName) {
@@ -311,3 +316,4 @@ export class IntrospectionSpanProcessor {
311
316
  await this._spanProcessor.forceFlush();
312
317
  }
313
318
  }
319
+ //# sourceMappingURL=span-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span-processor.js","sourceRoot":"","sources":["../../src/otel/span-processor.ts"],"names":[],"mappings":"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"}
@@ -36,7 +36,7 @@ export interface TracingProcessorAdvancedOptions {
36
36
  export interface IntrospectionTracingProcessorOptions {
37
37
  /** Authentication token (env: INTROSPECTION_TOKEN) */
38
38
  token?: string;
39
- /** Base URL for the API (env: INTROSPECTION_BASE_URL, default: "https://otel.introspection.dev") */
39
+ /** Base URL for the API (env: INTROSPECTION_BASE_OTEL_URL, default: "https://otel.introspection.dev") */
40
40
  baseUrl?: string;
41
41
  /** Service name for telemetry (env: INTROSPECTION_SERVICE_NAME) */
42
42
  serviceName?: string;
@@ -114,6 +114,9 @@ export declare class IntrospectionTracingProcessor implements TracingProcessor {
114
114
  private _processResponseSpan;
115
115
  /**
116
116
  * Extract attributes from generation spans.
117
+ * Handles both structured GenerationUsageData (spanData.usage) and raw
118
+ * Chat Completions API responses stored in spanData.output[0] by
119
+ * OpenAIChatCompletionsModel.
117
120
  */
118
121
  private _processGenerationSpan;
119
122
  /**
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracing-processor.d.ts","sourceRoot":"","sources":["../../src/otel/tracing-processor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,WAAW,EACjB,MAAM,+BAA+B,CAAC;AAoBvC,OAAO,KAAK,EACV,gBAAgB,EAChB,KAAK,EACL,IAAI,EACJ,QAAQ,EAMT,MAAM,gBAAgB,CAAC;AAExB;;;GAGG;AACH,MAAM,WAAW,+BAA+B;IAC9C,oEAAoE;IACpE,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,qEAAqE;IACrE,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,0EAA0E;IAC1E,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,+DAA+D;AAC/D,MAAM,WAAW,oCAAoC;IACnD,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yGAAyG;IACzG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,qDAAqD;IACrD,QAAQ,CAAC,EAAE,+BAA+B,CAAC;CAC5C;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,6BAA8B,YAAW,gBAAgB;IACpE,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,OAAO,CAA+C;IAC9D,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,gBAAgB,CAAkC;gBAE9C,OAAO,GAAE,oCAAyC;IA2F9D;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAc/C;;;;OAIG;IACG,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAa7C;;;;OAIG;IACG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BtD;;;;;OAKG;IACG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAyCpD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA0BzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAkG5B;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAyG9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}
@@ -10,9 +10,9 @@ import { resourceFromAttributes } from "@opentelemetry/resources";
10
10
  import { ATTR_SERVICE_NAME } from "@opentelemetry/semantic-conventions";
11
11
  import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto";
12
12
  import { randomUUID } from "crypto";
13
- import { convertResponsesInputsToSemconv, convertResponsesOutputsToSemconv, convertResponsesToolsToSemconv, convertResponsesInstructionsToSemconv, } from "./converters/openai.js";
14
- import { logger, withOtlpHttpsProxy } from "./utils.js";
15
- import { VERSION } from "./version.js";
13
+ import { convertResponsesInputsToSemconv, convertResponsesOutputsToSemconv, convertResponsesToolsToSemconv, convertResponsesInstructionsToSemconv, } from "../converters/openai.js";
14
+ import { logger, withOtlpHttpsProxy } from "../utils.js";
15
+ import { VERSION } from "../version.js";
16
16
  /**
17
17
  * {@link TracingProcessor} that forwards OpenAI agent traces to the
18
18
  * Introspection backend via OTLP.
@@ -50,7 +50,7 @@ export class IntrospectionTracingProcessor {
50
50
  throw new Error("INTROSPECTION_TOKEN is required");
51
51
  }
52
52
  const baseUrl = options.baseUrl ||
53
- process.env.INTROSPECTION_BASE_URL ||
53
+ process.env.INTROSPECTION_BASE_OTEL_URL ||
54
54
  "https://otel.introspection.dev";
55
55
  const headers = {
56
56
  "User-Agent": `introspection-sdk/${VERSION}`,
@@ -121,7 +121,9 @@ export class IntrospectionTracingProcessor {
121
121
  async onTraceStart(trace) {
122
122
  logger.debug(`onTraceStart called: ${trace?.name} (${trace?.traceId})`);
123
123
  if (trace) {
124
- const conversationId = `intro_conv_${randomUUID().replace(/-/g, "")}`;
124
+ // Use groupId as conversationId when provided so callers can link
125
+ // multiple traces (e.g. multi-turn orchestrator runs) into one conversation.
126
+ const conversationId = trace.groupId ?? `intro_conv_${randomUUID().replace(/-/g, "")}`;
125
127
  this._conversationIds.set(trace.traceId, conversationId);
126
128
  const otelSpan = this._tracer.startSpan(trace.name);
127
129
  this._spans.set(trace.traceId, otelSpan);
@@ -181,12 +183,10 @@ export class IntrospectionTracingProcessor {
181
183
  * @param span - The OpenAI Agents SDK span.
182
184
  */
183
185
  async onSpanEnd(span) {
184
- logger.debug(`onSpanEnd called: ${span?.spanId} (type: ${span?.spanData?.type})`);
185
186
  if (!span)
186
187
  return;
187
188
  const otelSpan = this._spans.get(span.spanId);
188
189
  if (!otelSpan) {
189
- logger.debug(`No OTel span found for spanId: ${span.spanId}`);
190
190
  return;
191
191
  }
192
192
  this._spans.delete(span.spanId);
@@ -295,6 +295,11 @@ export class IntrospectionTracingProcessor {
295
295
  if (usage.output_tokens) {
296
296
  otelSpan.setAttribute("gen_ai.usage.output_tokens", usage.output_tokens);
297
297
  }
298
+ // OpenAI returns cached token count in input_tokens_details.cached_tokens
299
+ const cachedTokens = usage.input_tokens_details?.cached_tokens;
300
+ if (cachedTokens) {
301
+ otelSpan.setAttribute("gen_ai.usage.cache_read.input_tokens", cachedTokens);
302
+ }
298
303
  }
299
304
  // Model info
300
305
  if (response.model) {
@@ -314,6 +319,9 @@ export class IntrospectionTracingProcessor {
314
319
  }
315
320
  /**
316
321
  * Extract attributes from generation spans.
322
+ * Handles both structured GenerationUsageData (spanData.usage) and raw
323
+ * Chat Completions API responses stored in spanData.output[0] by
324
+ * OpenAIChatCompletionsModel.
317
325
  */
318
326
  _processGenerationSpan(otelSpan, spanData) {
319
327
  otelSpan.setAttribute("gen_ai.operation.name", "chat");
@@ -322,19 +330,60 @@ export class IntrospectionTracingProcessor {
322
330
  if (spanData.model) {
323
331
  otelSpan.setAttribute("gen_ai.request.model", spanData.model);
324
332
  }
325
- if (spanData.usage) {
326
- const usage = spanData.usage;
327
- if (usage.input_tokens) {
328
- otelSpan.setAttribute("gen_ai.usage.input_tokens", usage.input_tokens);
333
+ // GenerationUsageData uses snake_case: input_tokens / output_tokens.
334
+ if (spanData.usage?.input_tokens) {
335
+ otelSpan.setAttribute("gen_ai.usage.input_tokens", spanData.usage.input_tokens);
336
+ }
337
+ if (spanData.usage?.output_tokens) {
338
+ otelSpan.setAttribute("gen_ai.usage.output_tokens", spanData.usage.output_tokens);
339
+ }
340
+ // OpenAIChatCompletionsModel stores the raw ChatCompletion response object
341
+ // in spanData.output[0] (it never sets spanData.usage). Extract usage,
342
+ // response ID, response model, and the actual assistant message from it.
343
+ if (!spanData.usage) {
344
+ const rawResponse = spanData.output?.[0];
345
+ // Response ID — required by the backend processor to register this span
346
+ // as a conversation item (build_request returns None without it).
347
+ const responseId = rawResponse?.id;
348
+ if (typeof responseId === "string" && responseId) {
349
+ otelSpan.setAttribute("gen_ai.response.id", responseId);
329
350
  }
330
- if (usage.output_tokens) {
331
- otelSpan.setAttribute("gen_ai.usage.output_tokens", usage.output_tokens);
351
+ // Resolved model name (e.g. "gpt-4o-mini-2024-07-18" vs "gpt-4o-mini").
352
+ const responseModel = rawResponse?.model;
353
+ if (typeof responseModel === "string" && responseModel) {
354
+ otelSpan.setAttribute("gen_ai.response.model", responseModel);
355
+ }
356
+ const rawUsage = rawResponse?.usage;
357
+ if (rawUsage) {
358
+ const promptTokens = rawUsage.prompt_tokens;
359
+ const completionTokens = rawUsage.completion_tokens;
360
+ if (typeof promptTokens === "number") {
361
+ otelSpan.setAttribute("gen_ai.usage.input_tokens", promptTokens);
362
+ }
363
+ if (typeof completionTokens === "number") {
364
+ otelSpan.setAttribute("gen_ai.usage.output_tokens", completionTokens);
365
+ }
366
+ const promptDetails = rawUsage.prompt_tokens_details;
367
+ const cachedTokens = promptDetails?.cached_tokens;
368
+ if (typeof cachedTokens === "number" && cachedTokens > 0) {
369
+ otelSpan.setAttribute("gen_ai.usage.cache_read.input_tokens", cachedTokens);
370
+ }
371
+ }
372
+ // Extract the actual assistant message from choices[0].message so that
373
+ // gen_ai.output.messages is a proper [{role, content}] array rather than
374
+ // the full ChatCompletion envelope (which the backend cannot parse).
375
+ const choices = rawResponse?.choices;
376
+ const assistantMessage = choices?.[0]?.message;
377
+ if (assistantMessage) {
378
+ otelSpan.setAttribute("gen_ai.output.messages", JSON.stringify([assistantMessage]));
332
379
  }
333
380
  }
334
381
  if (spanData.input) {
335
382
  otelSpan.setAttribute("gen_ai.input.messages", JSON.stringify(spanData.input));
336
383
  }
337
- if (spanData.output) {
384
+ // For non-Chat-Completions generation spans that do have usage set,
385
+ // still export output messages in the standard format if present.
386
+ if (spanData.usage && spanData.output) {
338
387
  otelSpan.setAttribute("gen_ai.output.messages", JSON.stringify(spanData.output));
339
388
  }
340
389
  }
@@ -366,3 +415,4 @@ export class IntrospectionTracingProcessor {
366
415
  await this._tracerProvider.forceFlush();
367
416
  }
368
417
  }
418
+ //# sourceMappingURL=tracing-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracing-processor.js","sourceRoot":"","sources":["../../src/otel/tracing-processor.ts"],"names":[],"mappings":"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"}