@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,348 @@
1
+ /**
2
+ * Lightweight Google Gemini (`@google/genai`) instrumentor for Introspection SDK.
3
+ *
4
+ * Captures the full Gemini response including per-part `thoughtSignature`
5
+ * payloads (Gemini 3.x extended thinking) as gen_ai `thinking` parts with
6
+ * `signature` set — mirroring how the {@link AnthropicInstrumentor} captures
7
+ * Anthropic thinking blocks.
8
+ *
9
+ * Supports both non-streaming (`client.models.generateContent`) and streaming
10
+ * (`client.models.generateContentStream`) calls.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import { GoogleGenAI } from "@google/genai";
15
+ * import { GeminiInstrumentor } from "@introspection-sdk/introspection-node";
16
+ *
17
+ * const client = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
18
+ * new GeminiInstrumentor().instrument({ tracerProvider: provider, client });
19
+ * // All client.models.generateContent / generateContentStream calls are now traced
20
+ * ```
21
+ *
22
+ * @see https://ai.google.dev/gemini-api/docs/thought-signatures
23
+ */
24
+ import { trace, SpanKind, SpanStatusCode } from "@opentelemetry/api";
25
+ import { convertGeminiContentsToInputMessages, convertGeminiCandidatesToOutputMessages, convertGeminiSystemInstructionToSemconv, convertGeminiToolsToToolDefinitions, GEMINI_PROVIDER_NAME, } from "../converters/gemini.js";
26
+ // ---------------------------------------------------------------------------
27
+ // Span helpers
28
+ // ---------------------------------------------------------------------------
29
+ function serializeMessages(msgs) {
30
+ return JSON.stringify(msgs.map((m) => {
31
+ const obj = { role: m.role, parts: m.parts };
32
+ if ("finish_reason" in m && m.finish_reason) {
33
+ obj.finish_reason = m.finish_reason;
34
+ }
35
+ return obj;
36
+ }));
37
+ }
38
+ function startSpan(tracer, model, conversationId) {
39
+ return tracer.startSpan("chat", {
40
+ kind: SpanKind.CLIENT,
41
+ attributes: {
42
+ "gen_ai.system": GEMINI_PROVIDER_NAME,
43
+ "gen_ai.provider.name": GEMINI_PROVIDER_NAME,
44
+ "gen_ai.operation.name": "chat",
45
+ "gen_ai.request.model": model,
46
+ "openinference.span.kind": "LLM",
47
+ ...(conversationId
48
+ ? { "gen_ai.conversation.id": conversationId }
49
+ : undefined),
50
+ },
51
+ });
52
+ }
53
+ function setRequestAttrs(span, kwargs) {
54
+ const contents = kwargs.contents;
55
+ const inputMsgs = convertGeminiContentsToInputMessages(contents);
56
+ if (inputMsgs.length > 0) {
57
+ span.setAttribute("gen_ai.input.messages", serializeMessages(inputMsgs));
58
+ }
59
+ const config = kwargs.config || {};
60
+ const systemInstruction = config.systemInstruction;
61
+ const systemInstructions = convertGeminiSystemInstructionToSemconv(systemInstruction);
62
+ if (systemInstructions && systemInstructions.length > 0) {
63
+ span.setAttribute("gen_ai.system_instructions", JSON.stringify(systemInstructions));
64
+ }
65
+ const tools = config.tools;
66
+ const toolDefs = convertGeminiToolsToToolDefinitions(tools);
67
+ if (toolDefs && toolDefs.length > 0) {
68
+ span.setAttribute("gen_ai.tool.definitions", JSON.stringify(toolDefs));
69
+ }
70
+ }
71
+ function setUsageAttrs(span, usage) {
72
+ if (!usage)
73
+ return;
74
+ const promptTokens = usage.promptTokenCount;
75
+ const candidateTokens = usage.candidatesTokenCount;
76
+ const cachedTokens = usage.cachedContentTokenCount;
77
+ const thoughtTokens = usage.thoughtsTokenCount;
78
+ if (typeof promptTokens === "number") {
79
+ span.setAttribute("gen_ai.usage.input_tokens", promptTokens);
80
+ }
81
+ if (typeof candidateTokens === "number") {
82
+ // Gemini reports candidatesTokenCount separately from thoughtsTokenCount;
83
+ // sum them so output_tokens reflects everything billed as model output.
84
+ const total = candidateTokens + (thoughtTokens ?? 0);
85
+ span.setAttribute("gen_ai.usage.output_tokens", total);
86
+ }
87
+ else if (typeof thoughtTokens === "number") {
88
+ span.setAttribute("gen_ai.usage.output_tokens", thoughtTokens);
89
+ }
90
+ if (typeof cachedTokens === "number") {
91
+ span.setAttribute("gen_ai.usage.cache_read.input_tokens", cachedTokens);
92
+ }
93
+ }
94
+ function setResponseAttrs(span, response) {
95
+ const candidates = response.candidates;
96
+ const outputMsgs = convertGeminiCandidatesToOutputMessages(candidates);
97
+ if (outputMsgs.length > 0) {
98
+ span.setAttribute("gen_ai.output.messages", serializeMessages(outputMsgs));
99
+ const finishReasons = outputMsgs
100
+ .map((m) => m.finish_reason)
101
+ .filter((r) => typeof r === "string");
102
+ if (finishReasons.length > 0) {
103
+ span.setAttribute("gen_ai.response.finish_reasons", finishReasons);
104
+ }
105
+ }
106
+ const responseId = response.responseId;
107
+ if (responseId)
108
+ span.setAttribute("gen_ai.response.id", responseId);
109
+ const modelVersion = response.modelVersion;
110
+ if (modelVersion)
111
+ span.setAttribute("gen_ai.response.model", modelVersion);
112
+ setUsageAttrs(span, response.usageMetadata);
113
+ span.setStatus({ code: SpanStatusCode.OK });
114
+ }
115
+ /** True if a streamed part is just incremental text with no metadata to preserve. */
116
+ function isPlainTextPart(part) {
117
+ return (typeof part.text === "string" &&
118
+ part.thought !== true &&
119
+ !part.thoughtSignature &&
120
+ !part.functionCall &&
121
+ !part.functionResponse);
122
+ }
123
+ /**
124
+ * Async-iterable wrapper that aggregates streamed `GenerateContentResponse`
125
+ * chunks so the underlying span captures the complete final message — including
126
+ * the final per-part `thoughtSignature` values that only arrive on the last
127
+ * chunk of a streamed turn.
128
+ */
129
+ class TracedStream {
130
+ inner;
131
+ span;
132
+ aggregated = new Map();
133
+ usage;
134
+ responseId;
135
+ modelVersion;
136
+ finalized = false;
137
+ constructor(inner, span) {
138
+ this.inner = inner;
139
+ this.span = span;
140
+ }
141
+ async *[Symbol.asyncIterator]() {
142
+ try {
143
+ for await (const chunk of this.inner) {
144
+ this.processChunk(chunk);
145
+ yield chunk;
146
+ }
147
+ }
148
+ catch (err) {
149
+ this.span.setStatus({
150
+ code: SpanStatusCode.ERROR,
151
+ message: String(err),
152
+ });
153
+ this.span.end();
154
+ this.finalized = true;
155
+ throw err;
156
+ }
157
+ finally {
158
+ this.finalize();
159
+ }
160
+ }
161
+ processChunk(chunk) {
162
+ if (chunk.responseId)
163
+ this.responseId = chunk.responseId;
164
+ if (chunk.modelVersion)
165
+ this.modelVersion = chunk.modelVersion;
166
+ if (chunk.usageMetadata)
167
+ this.usage = chunk.usageMetadata;
168
+ for (const cand of chunk.candidates ?? []) {
169
+ const idx = cand.index ?? 0;
170
+ const existing = this.aggregated.get(idx);
171
+ if (!existing) {
172
+ this.aggregated.set(idx, {
173
+ index: idx,
174
+ finishReason: cand.finishReason,
175
+ content: {
176
+ role: cand.content?.role,
177
+ parts: [...(cand.content?.parts ?? [])],
178
+ },
179
+ });
180
+ continue;
181
+ }
182
+ if (cand.finishReason)
183
+ existing.finishReason = cand.finishReason;
184
+ if (cand.content?.role && !existing.content?.role) {
185
+ existing.content.role = cand.content.role;
186
+ }
187
+ this.mergeParts(existing.content.parts, cand.content?.parts ?? []);
188
+ }
189
+ }
190
+ /**
191
+ * Merge streamed parts into the aggregated parts list.
192
+ *
193
+ * Gemini streams text incrementally as separate `text`-only parts; thought
194
+ * signatures and function calls arrive as their own parts. Consecutive
195
+ * plain-text parts are coalesced into a single accumulating text part so the
196
+ * final thought signature on a block survives on its trailing part.
197
+ */
198
+ mergeParts(target, incoming) {
199
+ for (const part of incoming) {
200
+ const last = target[target.length - 1];
201
+ if (isPlainTextPart(part) && last && isPlainTextPart(last)) {
202
+ last.text = (last.text || "") + (part.text || "");
203
+ continue;
204
+ }
205
+ target.push({ ...part });
206
+ }
207
+ }
208
+ finalize() {
209
+ if (this.finalized)
210
+ return;
211
+ this.finalized = true;
212
+ setResponseAttrs(this.span, {
213
+ candidates: Array.from(this.aggregated.values()),
214
+ usageMetadata: this.usage,
215
+ responseId: this.responseId,
216
+ modelVersion: this.modelVersion,
217
+ });
218
+ this.span.end();
219
+ }
220
+ }
221
+ /**
222
+ * Auto-instrumentor that wraps a `@google/genai` client instance to add
223
+ * Introspection tracing with full thought-signature capture.
224
+ *
225
+ * Captures all content parts including thought summaries and signed
226
+ * `thoughtSignature` payloads required for multi-turn replay.
227
+ */
228
+ /**
229
+ * Build the traced replacement for a non-streaming `generateContent`-style
230
+ * method. Shared by {@link GeminiInstrumentor.instrument} (patches a client's
231
+ * public `models.generateContent`) and {@link GeminiInstrumentor.instrumentClass}
232
+ * (patches `Models.prototype.generateContentInternal` so every client is
233
+ * auto-traced). Preserves the call-site `this`.
234
+ */
235
+ function buildTracedGenerate(origGenerate, tracer, conversationId) {
236
+ return async function tracedGenerate(...args) {
237
+ const kwargs = args[0] || {};
238
+ const span = startSpan(tracer, kwargs.model || "unknown", conversationId);
239
+ setRequestAttrs(span, kwargs);
240
+ try {
241
+ const response = (await origGenerate.apply(this, args));
242
+ setResponseAttrs(span, response);
243
+ return response;
244
+ }
245
+ catch (err) {
246
+ span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) });
247
+ throw err;
248
+ }
249
+ finally {
250
+ span.end();
251
+ }
252
+ };
253
+ }
254
+ /** Build the traced replacement for a streaming `generateContentStream`-style method. */
255
+ function buildTracedGenerateStream(origStream, tracer, conversationId) {
256
+ return async function tracedGenerateStream(...args) {
257
+ const kwargs = args[0] || {};
258
+ const span = startSpan(tracer, kwargs.model || "unknown", conversationId);
259
+ setRequestAttrs(span, kwargs);
260
+ try {
261
+ const stream = (await origStream.apply(this, args));
262
+ return new TracedStream(stream, span);
263
+ }
264
+ catch (err) {
265
+ span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) });
266
+ span.end();
267
+ throw err;
268
+ }
269
+ };
270
+ }
271
+ /**
272
+ * Marker placed on a patched `Models.prototype` method so repeated
273
+ * `instrumentClass()` calls (e.g. a second `introspection.init()`) are no-ops.
274
+ */
275
+ const PATCHED = Symbol.for("introspection.gemini.patched");
276
+ export class GeminiInstrumentor {
277
+ tracer = null;
278
+ restores = [];
279
+ conversationId;
280
+ instrument(opts) {
281
+ const { client } = opts;
282
+ if (!client?.models?.generateContent) {
283
+ throw new Error("Invalid client — pass a GoogleGenAI client instance (new GoogleGenAI({...}))");
284
+ }
285
+ this.conversationId = opts.conversationId ?? crypto.randomUUID();
286
+ const provider = opts.tracerProvider ?? trace.getTracerProvider();
287
+ this.tracer = provider.getTracer("introspection-gemini");
288
+ const tracer = this.tracer;
289
+ const conversationId = this.conversationId;
290
+ const api = client.models;
291
+ const origGenerate = api.generateContent.bind(api);
292
+ const origGenerateStream = api.generateContentStream?.bind(api);
293
+ this.restores.push(() => {
294
+ api.generateContent = origGenerate;
295
+ if (origGenerateStream)
296
+ api.generateContentStream = origGenerateStream;
297
+ });
298
+ api.generateContent = buildTracedGenerate(origGenerate, tracer, conversationId);
299
+ if (origGenerateStream) {
300
+ api.generateContentStream = buildTracedGenerateStream(origGenerateStream, tracer, conversationId);
301
+ }
302
+ }
303
+ /**
304
+ * Patch `Models.prototype.generateContentInternal` / `…StreamInternal` so
305
+ * **every** `GoogleGenAI` client is traced — the one-liner path used by
306
+ * `introspection.init()`. The public `generateContent` /
307
+ * `generateContentStream` are per-instance bound class fields that delegate
308
+ * to these prototype methods, so patching the prototype covers all clients.
309
+ * Idempotent: a second call is a no-op.
310
+ *
311
+ * @param opts.genai The `@google/genai` module (must expose `Models`).
312
+ */
313
+ instrumentClass(opts) {
314
+ const proto = opts.genai?.Models?.prototype;
315
+ if (typeof proto?.generateContentInternal !== "function") {
316
+ throw new Error("Invalid @google/genai module — expected `Models.prototype.generateContentInternal`");
317
+ }
318
+ if (proto.generateContentInternal[PATCHED])
319
+ return;
320
+ this.conversationId = opts.conversationId ?? crypto.randomUUID();
321
+ const provider = opts.tracerProvider ?? trace.getTracerProvider();
322
+ this.tracer = provider.getTracer("introspection-gemini");
323
+ const conversationId = this.conversationId;
324
+ const origGenerate = proto.generateContentInternal;
325
+ const patchedGenerate = buildTracedGenerate(origGenerate, this.tracer, conversationId);
326
+ patchedGenerate[PATCHED] = true;
327
+ proto.generateContentInternal = patchedGenerate;
328
+ this.restores.push(() => {
329
+ proto.generateContentInternal = origGenerate;
330
+ });
331
+ if (typeof proto.generateContentStreamInternal === "function") {
332
+ const origStream = proto.generateContentStreamInternal;
333
+ const patchedStream = buildTracedGenerateStream(origStream, this.tracer, conversationId);
334
+ patchedStream[PATCHED] = true;
335
+ proto.generateContentStreamInternal = patchedStream;
336
+ this.restores.push(() => {
337
+ proto.generateContentStreamInternal = origStream;
338
+ });
339
+ }
340
+ }
341
+ uninstrument() {
342
+ for (const restore of this.restores)
343
+ restore();
344
+ this.restores = [];
345
+ this.tracer = null;
346
+ }
347
+ }
348
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/otel/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * OpenTelemetry surface for the Introspection Node SDK.
3
+ *
4
+ * Subpath entry point: `@introspection-sdk/introspection-node/otel`.
5
+ *
6
+ * Importing from here pulls in OTel SDK packages (peer deps). The
7
+ * REST-only `IntrospectionClient` is available from the package root
8
+ * and does not require these to be installed.
9
+ */
10
+ export { IntrospectionLogs } from "./logs.js";
11
+ export type { IntrospectionLogsOptions } from "./logs.js";
12
+ export { setupTracing } from "./setup.js";
13
+ export type { SetupTracingOptions, ConflictBehavior } from "./setup.js";
14
+ export { IntrospectionSpanProcessor } from "./span-processor.js";
15
+ export type { IntrospectionSpanProcessorOptions } from "./span-processor.js";
16
+ export { IntrospectionTracingProcessor } from "./tracing-processor.js";
17
+ export type { IntrospectionTracingProcessorOptions, TracingProcessorAdvancedOptions, } from "./tracing-processor.js";
18
+ export { IntrospectionClaudeHooks } from "./claude-hooks.js";
19
+ export type { IntrospectionClaudeHooksOptions, ClaudeHooksAdvancedOptions, ClaudeHooksConfig, ClaudeHookCallbackMatcher, ClaudeHookEvent, ClaudeHookInput, ClaudeHookOutput, ClaudeHookCallback, ClaudeUsage, ClaudeModelUsage, ClaudeResultMessage, ClaudeAssistantMessage, ClaudeSDKMessage, } from "./claude-hooks.js";
20
+ export { withIntrospection } from "./claude-wrapper.js";
21
+ export type { WithIntrospectionOptions, InstrumentedClaudeAgentSDK, ClaudeAgentSDKModule, } from "./claude-wrapper.js";
22
+ export { AnthropicInstrumentor, tracedMessagesCreate, REDACTED_THINKING_CONTENT, } from "./anthropic.js";
23
+ export { IntrospectionPiInstrumentor } from "./pi.js";
24
+ export type { IntrospectionPiInstrumentorOptions, AgentMeta as PiAgentMeta, } from "./pi.js";
25
+ export { GeminiInstrumentor } from "./gemini.js";
26
+ export { addOpenInferenceAttributes, OpenInferenceSpanExporter, } from "../converters/openinference.js";
27
+ export { init, shutdown, track, feedback, identify, conversation, withAgent, withConversation, withUserId, withAnonymousId, newConversationId, getClient, getTracerProvider, getLangchainHandler, getMastraExporter, instrumentPi, instrumentClaudeAgent, _resetForTests, } from "./init.js";
28
+ export type { InitOptions } from "./init.js";
29
+ export { registerOTelGlobals } from "./setup.js";
30
+ export { DidNotEnable, discoverIntegrations, setupIntegrations, resetInstalledForTests, } from "./integrations/index.js";
31
+ export type { Integration, IntegrationSetupContext, IntegrationHandles, } from "./integrations/index.js";
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/otel/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAI1D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,YAAY,EAAE,iCAAiC,EAAE,MAAM,qBAAqB,CAAC;AAG7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AACvE,YAAY,EACV,oCAAoC,EACpC,+BAA+B,GAChC,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,YAAY,EACV,+BAA+B,EAC/B,0BAA0B,EAC1B,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EACV,wBAAwB,EACxB,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AACtD,YAAY,EACV,kCAAkC,EAClC,SAAS,IAAI,WAAW,GACzB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAIjD,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,gCAAgC,CAAC;AAKxC,OAAO,EACL,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,SAAS,EACT,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,qBAAqB,EACrB,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGjD,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,WAAW,EACX,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * OpenTelemetry surface for the Introspection Node SDK.
3
+ *
4
+ * Subpath entry point: `@introspection-sdk/introspection-node/otel`.
5
+ *
6
+ * Importing from here pulls in OTel SDK packages (peer deps). The
7
+ * REST-only `IntrospectionClient` is available from the package root
8
+ * and does not require these to be installed.
9
+ */
10
+ // IntrospectionLogs — OTel logs exporter with track/feedback/identify
11
+ // and baggage context helpers (extracted from the old IntrospectionClient).
12
+ export { IntrospectionLogs } from "./logs.js";
13
+ // One-call tracing bootstrap (NodeTracerProvider + AsyncLocalStorage +
14
+ // W3C baggage propagator + IntrospectionSpanProcessor).
15
+ export { setupTracing } from "./setup.js";
16
+ // Span processor — attach to your own TracerProvider.
17
+ export { IntrospectionSpanProcessor } from "./span-processor.js";
18
+ // OpenAI Agents SDK tracing processor.
19
+ export { IntrospectionTracingProcessor } from "./tracing-processor.js";
20
+ // Claude Agent SDK hooks.
21
+ export { IntrospectionClaudeHooks } from "./claude-hooks.js";
22
+ // Claude Agent SDK wrapper.
23
+ export { withIntrospection } from "./claude-wrapper.js";
24
+ // Anthropic SDK instrumentor.
25
+ export { AnthropicInstrumentor, tracedMessagesCreate, REDACTED_THINKING_CONTENT, } from "./anthropic.js";
26
+ // Pi Agent SDK instrumentor.
27
+ export { IntrospectionPiInstrumentor } from "./pi.js";
28
+ // Gemini SDK instrumentor.
29
+ export { GeminiInstrumentor } from "./gemini.js";
30
+ // OpenInference span exporter (drops Arize/OpenInference attrs onto a
31
+ // downstream OTel SpanExporter).
32
+ export { addOpenInferenceAttributes, OpenInferenceSpanExporter, } from "../converters/openinference.js";
33
+ // One-liner bootstrap (`introspection.init()`) + analytics proxies and the
34
+ // per-framework handle accessors it binds. Auto-detects installed frameworks
35
+ // and wires them into one shared provider.
36
+ export { init, shutdown, track, feedback, identify, conversation, withAgent, withConversation, withUserId, withAnonymousId, newConversationId, getClient, getTracerProvider, getLangchainHandler, getMastraExporter, instrumentPi, instrumentClaudeAgent, _resetForTests, } from "./init.js";
37
+ // Low-level OTel registration helper (also used by `init`).
38
+ export { registerOTelGlobals } from "./setup.js";
39
+ // Integration registry — for custom integrations passed to `init`.
40
+ export { DidNotEnable, discoverIntegrations, setupIntegrations, resetInstalledForTests, } from "./integrations/index.js";
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/otel/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,sEAAsE;AACtE,4EAA4E;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAG9C,uEAAuE;AACvE,wDAAwD;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,sDAAsD;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAGjE,uCAAuC;AACvC,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAMvE,0BAA0B;AAC1B,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAiB7D,4BAA4B;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAOxD,8BAA8B;AAC9B,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AAExB,6BAA6B;AAC7B,OAAO,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAMtD,2BAA2B;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,sEAAsE;AACtE,iCAAiC;AACjC,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,gCAAgC,CAAC;AAExC,2EAA2E;AAC3E,6EAA6E;AAC7E,2CAA2C;AAC3C,OAAO,EACL,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,SAAS,EACT,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,qBAAqB,EACrB,cAAc,GACf,MAAM,WAAW,CAAC;AAGnB,4DAA4D;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,mEAAmE;AACnE,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * One-liner bootstrap for the Introspection OTel surface.
3
+ *
4
+ * `init()` detects the installed LLM frameworks and wires them into one shared
5
+ * pipeline, mirroring the Python SDK's `introspection.init()`:
6
+ *
7
+ * ```ts
8
+ * import * as introspection from "@introspection-sdk/introspection-node/otel";
9
+ * import Anthropic from "@anthropic-ai/sdk";
10
+ *
11
+ * await introspection.init({ serviceName: "my-app" });
12
+ *
13
+ * const client = new Anthropic(); // auto-traced — no per-client wiring
14
+ * await introspection.conversation(() =>
15
+ * client.messages.create({ ... }),
16
+ * );
17
+ * ```
18
+ *
19
+ * It also exposes the `track` / `feedback` / `identify` analytics surface and a
20
+ * `conversation()` scope, proxied to a global {@link IntrospectionLogs}.
21
+ */
22
+ import { type TracerProvider } from "@opentelemetry/api";
23
+ import type { SpanProcessor } from "@opentelemetry/sdk-trace-base";
24
+ import type { AdvancedOptions, FeedbackOptions, UserTraits } from "../types.js";
25
+ import type { InstrumentedClaudeAgentSDK } from "./claude-wrapper.js";
26
+ import { type Integration } from "./integrations/index.js";
27
+ import type { Agent } from "@mariozechner/pi-agent-core";
28
+ import type { AgentMeta } from "./pi.js";
29
+ import { IntrospectionLogs } from "./logs.js";
30
+ import { type ConflictBehavior } from "./setup.js";
31
+ /** Options for {@link init}. */
32
+ export interface InitOptions {
33
+ /** Auth token. Falls back to `INTROSPECTION_TOKEN`. */
34
+ token?: string;
35
+ /** Service name for spans. Falls back to `INTROSPECTION_SERVICE_NAME`. */
36
+ serviceName?: string;
37
+ /** OTLP base URL. Falls back to `INTROSPECTION_BASE_OTEL_URL`. */
38
+ baseUrl?: string;
39
+ /**
40
+ * Use this provider instead of creating one. The caller owns its span
41
+ * processors (attach an {@link IntrospectionSpanProcessor} yourself).
42
+ */
43
+ tracerProvider?: TracerProvider;
44
+ /**
45
+ * Extra span processors composed onto the provider `init()` creates — the
46
+ * one-call dual-export path. Each runs alongside the Introspection processor,
47
+ * e.g. `init({ spanProcessors: [new BatchSpanProcessor(langfuseExporter)] })`.
48
+ * Ignored when `tracerProvider` is supplied.
49
+ */
50
+ spanProcessors?: SpanProcessor[];
51
+ /** Extra integrations to install beyond auto-discovery. */
52
+ integrations?: Integration[];
53
+ /** Install every importable built-in integration (default `true`). */
54
+ autoDiscover?: boolean;
55
+ /** Behaviour when an OTel context manager / propagator is already registered. */
56
+ onConflict?: ConflictBehavior;
57
+ /** Advanced configuration (custom exporter, headers, …). */
58
+ advanced?: AdvancedOptions;
59
+ }
60
+ /** Generate a fresh conversation id (matches the Python SDK's format). */
61
+ export declare function newConversationId(): string;
62
+ /**
63
+ * Detect installed LLM frameworks and wire them into one shared provider.
64
+ *
65
+ * Idempotent: repeated calls return the already-configured provider without
66
+ * re-installing integrations.
67
+ */
68
+ export declare function init(options?: InitOptions): Promise<TracerProvider>;
69
+ /** Return the global logs client. Throws if {@link init} has not been called. */
70
+ export declare function getClient(): IntrospectionLogs;
71
+ /** Return the shared provider. Throws if {@link init} has not been called. */
72
+ export declare function getTracerProvider(): TracerProvider;
73
+ /** Track an analytics event. Requires {@link init} first. */
74
+ export declare function track(eventName: string, properties?: Record<string, unknown>, options?: {
75
+ eventId?: string;
76
+ }): void;
77
+ /** Record feedback on an AI response. Requires {@link init} first. */
78
+ export declare function feedback(name: string, options?: FeedbackOptions): void;
79
+ /** Associate the current context with a user. Requires {@link init} first. */
80
+ export declare function identify(userId: string, traits?: UserTraits, anonymousId?: string, eventId?: string): void;
81
+ /**
82
+ * Run `callback` inside a conversation scope: every span/event produced within
83
+ * is stamped with `gen_ai.conversation.id`. Generates an id when none is given.
84
+ *
85
+ * ```ts
86
+ * await introspection.conversation((id) => client.messages.create({ ... }));
87
+ * await introspection.conversation("conv_123", (id) => run());
88
+ * ```
89
+ */
90
+ export declare function conversation<T>(callback: (conversationId: string) => T | Promise<T>): Promise<T>;
91
+ export declare function conversation<T>(conversationId: string, callback: (conversationId: string) => T | Promise<T>): Promise<T>;
92
+ /**
93
+ * Run `callback` with `gen_ai.agent.name` (+ optional `gen_ai.agent.id`) on the
94
+ * baggage, so spans/events produced within are attributed to that agent.
95
+ * Requires {@link init} first. Mirrors `IntrospectionLogs.withAgent`.
96
+ */
97
+ export declare function withAgent<T>(agentName: string, agentId: string | undefined, callback: () => T | Promise<T>): Promise<T>;
98
+ /**
99
+ * Run `callback` inside a conversation scope, optionally chaining a previous
100
+ * response id. Unlike {@link conversation}, the id is required (no auto-gen).
101
+ * Requires {@link init} first.
102
+ */
103
+ export declare function withConversation<T>(conversationId: string | undefined, previousResponseId: string | undefined, callback: () => T | Promise<T>): Promise<T>;
104
+ /** Run `callback` with `identity.user_id` on the baggage. Requires {@link init} first. */
105
+ export declare function withUserId<T>(userId: string, callback: () => T | Promise<T>): Promise<T>;
106
+ /** Run `callback` with `identity.anonymous_id` on the baggage. Requires {@link init} first. */
107
+ export declare function withAnonymousId<T>(anonymousId: string, callback: () => T | Promise<T>): Promise<T>;
108
+ /**
109
+ * The LangChain handler bound by `init()`. Attach it per-invoke:
110
+ * `chain.invoke(input, { callbacks: [introspection.getLangchainHandler()] })`.
111
+ */
112
+ export declare function getLangchainHandler(): import("./langchain-handler.js").IntrospectionCallbackHandler;
113
+ /** The Mastra exporter bound by `init()`. Put it in `observability.configs`. */
114
+ export declare function getMastraExporter(): any;
115
+ /** Instrument a Pi `Agent` against the shared provider. Requires {@link init}. */
116
+ export declare function instrumentPi(agent: Agent, meta: AgentMeta): void;
117
+ /**
118
+ * Wrap the Claude Agent SDK module so its `query()` calls are traced.
119
+ * Equivalent to `withIntrospection(sdk)` but pre-bound to the `init()` config.
120
+ */
121
+ export declare function instrumentClaudeAgent(sdk: any): InstrumentedClaudeAgentSDK;
122
+ /** Flush and shut down the logs client and (if owned) the provider. */
123
+ export declare function shutdown(): Promise<void>;
124
+ /** Reset module state. Test-only utility. */
125
+ export declare function _resetForTests(): void;
126
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/otel/init.ts"],"names":[],"mappings":"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"}