@introspection-sdk/introspection-node 0.4.1 → 0.4.3

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 (166) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-check-types.log +4 -0
  3. package/.turbo/turbo-lint.log +5 -0
  4. package/dist/ai-sdk-integration.d.ts.map +1 -1
  5. package/dist/ai-sdk-integration.js +2 -2
  6. package/dist/claude-hooks.d.ts.map +1 -1
  7. package/dist/claude-hooks.js +3 -3
  8. package/dist/client.d.ts +42 -132
  9. package/dist/client.d.ts.map +1 -1
  10. package/dist/client.js +66 -365
  11. package/dist/client.js.map +1 -0
  12. package/dist/converters/claude.d.ts +5 -1
  13. package/dist/converters/claude.d.ts.map +1 -1
  14. package/dist/converters/claude.js +7 -0
  15. package/dist/converters/claude.js.map +1 -0
  16. package/dist/converters/gemini.d.ts +90 -0
  17. package/dist/converters/gemini.d.ts.map +1 -0
  18. package/dist/converters/gemini.js +171 -0
  19. package/dist/converters/gemini.js.map +1 -0
  20. package/dist/converters/index.d.ts +1 -1
  21. package/dist/converters/index.d.ts.map +1 -1
  22. package/dist/converters/index.js +2 -1
  23. package/dist/converters/index.js.map +1 -0
  24. package/dist/converters/openai.js +1 -0
  25. package/dist/converters/openai.js.map +1 -0
  26. package/dist/converters/openclaw.d.ts +16 -0
  27. package/dist/converters/openclaw.d.ts.map +1 -0
  28. package/dist/converters/openclaw.js +49 -0
  29. package/dist/converters/openinference.js +1 -0
  30. package/dist/converters/openinference.js.map +1 -0
  31. package/dist/converters/vercel.d.ts.map +1 -1
  32. package/dist/converters/vercel.js +31 -3
  33. package/dist/converters/vercel.js.map +1 -0
  34. package/dist/http.d.ts +36 -0
  35. package/dist/http.d.ts.map +1 -0
  36. package/dist/http.js +145 -0
  37. package/dist/http.js.map +1 -0
  38. package/dist/index.d.ts +24 -27
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +22 -32
  41. package/dist/index.js.map +1 -0
  42. package/dist/langchain-handler.d.ts.map +1 -1
  43. package/dist/langchain-handler.js +2 -2
  44. package/dist/mastra-exporter.d.ts.map +1 -1
  45. package/dist/mastra-exporter.js +2 -2
  46. package/dist/otel/anthropic.d.ts +62 -0
  47. package/dist/otel/anthropic.d.ts.map +1 -0
  48. package/dist/otel/anthropic.js +425 -0
  49. package/dist/otel/anthropic.js.map +1 -0
  50. package/dist/otel/claude-hooks.d.ts +346 -0
  51. package/dist/otel/claude-hooks.d.ts.map +1 -0
  52. package/dist/otel/claude-hooks.js +645 -0
  53. package/dist/otel/claude-hooks.js.map +1 -0
  54. package/dist/otel/claude-wrapper.d.ts +93 -0
  55. package/dist/otel/claude-wrapper.d.ts.map +1 -0
  56. package/dist/otel/claude-wrapper.js +155 -0
  57. package/dist/otel/claude-wrapper.js.map +1 -0
  58. package/dist/otel/gemini.d.ts +48 -0
  59. package/dist/otel/gemini.d.ts.map +1 -0
  60. package/dist/otel/gemini.js +297 -0
  61. package/dist/otel/gemini.js.map +1 -0
  62. package/dist/otel/index.d.ts +27 -0
  63. package/dist/otel/index.d.ts.map +1 -0
  64. package/dist/otel/index.js +33 -0
  65. package/dist/otel/index.js.map +1 -0
  66. package/dist/otel/langchain-handler.d.ts +112 -0
  67. package/dist/otel/langchain-handler.d.ts.map +1 -0
  68. package/dist/otel/langchain-handler.js +555 -0
  69. package/dist/otel/langchain-handler.js.map +1 -0
  70. package/dist/otel/logs.d.ts +82 -0
  71. package/dist/otel/logs.d.ts.map +1 -0
  72. package/dist/otel/logs.js +271 -0
  73. package/dist/otel/logs.js.map +1 -0
  74. package/dist/otel/mastra-exporter.d.ts +87 -0
  75. package/dist/otel/mastra-exporter.d.ts.map +1 -0
  76. package/dist/otel/mastra-exporter.js +525 -0
  77. package/dist/otel/mastra-exporter.js.map +1 -0
  78. package/dist/otel/pi.d.ts +59 -0
  79. package/dist/otel/pi.d.ts.map +1 -0
  80. package/dist/otel/pi.js +67 -0
  81. package/dist/otel/pi.js.map +1 -0
  82. package/dist/otel/setup.d.ts +23 -0
  83. package/dist/otel/setup.d.ts.map +1 -0
  84. package/dist/otel/setup.js +127 -0
  85. package/dist/otel/setup.js.map +1 -0
  86. package/dist/otel/span-processor.d.ts +62 -0
  87. package/dist/otel/span-processor.d.ts.map +1 -0
  88. package/dist/otel/span-processor.js +319 -0
  89. package/dist/otel/span-processor.js.map +1 -0
  90. package/dist/otel/tracing-processor.d.ts +139 -0
  91. package/dist/otel/tracing-processor.d.ts.map +1 -0
  92. package/dist/otel/tracing-processor.js +418 -0
  93. package/dist/otel/tracing-processor.js.map +1 -0
  94. package/dist/resources/experiments.d.ts +31 -0
  95. package/dist/resources/experiments.d.ts.map +1 -0
  96. package/dist/resources/experiments.js +133 -0
  97. package/dist/resources/experiments.js.map +1 -0
  98. package/dist/resources/recipes.d.ts +22 -0
  99. package/dist/resources/recipes.d.ts.map +1 -0
  100. package/dist/resources/recipes.js +61 -0
  101. package/dist/resources/recipes.js.map +1 -0
  102. package/dist/resources/runtimes.d.ts +76 -0
  103. package/dist/resources/runtimes.d.ts.map +1 -0
  104. package/dist/resources/runtimes.js +179 -0
  105. package/dist/resources/runtimes.js.map +1 -0
  106. package/dist/runner-resources/files.d.ts +35 -0
  107. package/dist/runner-resources/files.d.ts.map +1 -0
  108. package/dist/runner-resources/files.js +131 -0
  109. package/dist/runner-resources/files.js.map +1 -0
  110. package/dist/runner-resources/tasks.d.ts +39 -0
  111. package/dist/runner-resources/tasks.d.ts.map +1 -0
  112. package/dist/runner-resources/tasks.js +129 -0
  113. package/dist/runner-resources/tasks.js.map +1 -0
  114. package/dist/runner.d.ts +80 -0
  115. package/dist/runner.d.ts.map +1 -0
  116. package/dist/runner.js +159 -0
  117. package/dist/runner.js.map +1 -0
  118. package/dist/span-processor.d.ts.map +1 -1
  119. package/dist/span-processor.js +3 -3
  120. package/dist/streaming.d.ts +8 -0
  121. package/dist/streaming.d.ts.map +1 -0
  122. package/dist/streaming.js +67 -0
  123. package/dist/streaming.js.map +1 -0
  124. package/dist/tracing-processor.d.ts.map +1 -1
  125. package/dist/tracing-processor.js +3 -3
  126. package/dist/types/genai.d.ts +165 -0
  127. package/dist/types/genai.d.ts.map +1 -0
  128. package/dist/types/genai.js +82 -0
  129. package/dist/types.js +1 -0
  130. package/dist/types.js.map +1 -0
  131. package/dist/utils.d.ts +1 -0
  132. package/dist/utils.d.ts.map +1 -1
  133. package/dist/utils.js +14 -0
  134. package/dist/utils.js.map +1 -0
  135. package/dist/version.js +1 -0
  136. package/dist/version.js.map +1 -0
  137. package/package.json +83 -25
  138. package/src/client.ts +76 -471
  139. package/src/converters/claude.ts +11 -1
  140. package/src/converters/gemini.ts +243 -0
  141. package/src/converters/index.ts +13 -7
  142. package/src/converters/vercel.ts +41 -3
  143. package/src/http.ts +163 -0
  144. package/src/index.ts +110 -75
  145. package/src/{anthropic.ts → otel/anthropic.ts} +95 -8
  146. package/src/{claude-hooks.ts → otel/claude-hooks.ts} +125 -24
  147. package/src/{claude-wrapper.ts → otel/claude-wrapper.ts} +1 -1
  148. package/src/otel/gemini.ts +397 -0
  149. package/src/otel/index.ts +80 -0
  150. package/src/{langchain-handler.ts → otel/langchain-handler.ts} +56 -7
  151. package/src/otel/logs.ts +394 -0
  152. package/src/{mastra-exporter.ts → otel/mastra-exporter.ts} +86 -23
  153. package/src/otel/pi.ts +88 -0
  154. package/src/otel/setup.ts +174 -0
  155. package/src/{span-processor.ts → otel/span-processor.ts} +17 -10
  156. package/src/{tracing-processor.ts → otel/tracing-processor.ts} +100 -23
  157. package/src/resources/experiments.ts +170 -0
  158. package/src/resources/recipes.ts +73 -0
  159. package/src/resources/runtimes.ts +231 -0
  160. package/src/runner-resources/files.ts +163 -0
  161. package/src/runner-resources/tasks.ts +156 -0
  162. package/src/runner.ts +194 -0
  163. package/src/streaming.ts +57 -0
  164. package/src/utils.ts +15 -0
  165. package/src/ai-sdk-integration.ts +0 -689
  166. package/src/converters/ai-sdk.ts +0 -323
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Claude Agent SDK Wrapper
3
+ *
4
+ * Provides a zero-friction `withIntrospection()` wrapper for the Claude Agent SDK.
5
+ * Automatically instruments all query() calls with OpenTelemetry tracing via
6
+ * IntrospectionClaudeHooks — no manual hook wiring or recordUsage() calls needed.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import * as sdk from "@anthropic-ai/claude-agent-sdk";
11
+ * import { withIntrospection } from "@introspection-sdk/introspection-node";
12
+ *
13
+ * const tracedSdk = withIntrospection(sdk, { serviceName: "my-agent" });
14
+ *
15
+ * for await (const message of tracedSdk.query({ prompt: "Hello" })) {
16
+ * // messages yielded normally — tracing happens automatically
17
+ * }
18
+ *
19
+ * await tracedSdk.shutdown();
20
+ * ```
21
+ */
22
+ import { IntrospectionClaudeHooks, type IntrospectionClaudeHooksOptions } from "./claude-hooks.js";
23
+ /**
24
+ * Configuration for {@link withIntrospection}.
25
+ *
26
+ * Alias of {@link IntrospectionClaudeHooksOptions}.
27
+ */
28
+ export type WithIntrospectionOptions = IntrospectionClaudeHooksOptions;
29
+ /**
30
+ * Minimal interface for the Claude Agent SDK module.
31
+ * Accepts `import * as sdk from "@anthropic-ai/claude-agent-sdk"`.
32
+ *
33
+ * Uses `any` for the query signature to accept any SDK version's types
34
+ * without requiring the SDK as a compile-time dependency.
35
+ */
36
+ export interface ClaudeAgentSDKModule {
37
+ query: (...args: any[]) => any;
38
+ [key: string]: unknown;
39
+ }
40
+ /**
41
+ * The instrumented SDK returned by {@link withIntrospection}.
42
+ *
43
+ * Exposes the same surface as the original SDK module plus tracing helpers.
44
+ */
45
+ export interface InstrumentedClaudeAgentSDK {
46
+ /** Instrumented `query()` — auto-captures prompt, hooks, and usage. */
47
+ query: (...args: any[]) => any;
48
+ /**
49
+ * Flush pending spans without shutting down.
50
+ *
51
+ * @returns A promise that resolves once the flush completes.
52
+ */
53
+ forceFlush(): Promise<void>;
54
+ /**
55
+ * Shut down tracing and flush all pending spans.
56
+ *
57
+ * @returns A promise that resolves once shutdown is complete.
58
+ */
59
+ shutdown(): Promise<void>;
60
+ /** The underlying {@link IntrospectionClaudeHooks} instance for advanced usage. */
61
+ readonly hooks: IntrospectionClaudeHooks;
62
+ /** All other SDK exports pass through unchanged. */
63
+ [key: string]: unknown;
64
+ }
65
+ /**
66
+ * Wrap the Claude Agent SDK module to automatically instrument every
67
+ * `query()` call with OpenTelemetry tracing.
68
+ *
69
+ * The returned SDK:
70
+ * - Auto-captures `prompt` and `systemPrompt` from query params
71
+ * - Injects instrumentation hooks (merged with any user-provided hooks)
72
+ * - Calls {@link IntrospectionClaudeHooks.recordUsage | recordUsage()} on
73
+ * every streamed message automatically
74
+ * - Flushes spans when each query stream completes
75
+ *
76
+ * @param sdk - The Claude Agent SDK module
77
+ * (`import * as sdk from "@anthropic-ai/claude-agent-sdk"`).
78
+ * @param options - Introspection configuration (token, serviceName, baseUrl, etc.).
79
+ * @returns An {@link InstrumentedClaudeAgentSDK} with the same API plus
80
+ * `forceFlush()`, `shutdown()`, and `hooks`.
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * import * as sdk from "@anthropic-ai/claude-agent-sdk";
85
+ * import { withIntrospection } from "@introspection-sdk/introspection-node";
86
+ *
87
+ * const traced = withIntrospection(sdk, { serviceName: "my-agent" });
88
+ * for await (const msg of traced.query({ prompt: "Hello" })) { /* … *\/ }
89
+ * await traced.shutdown();
90
+ * ```
91
+ */
92
+ export declare function withIntrospection(sdk: ClaudeAgentSDKModule, options?: WithIntrospectionOptions): InstrumentedClaudeAgentSDK;
93
+ //# sourceMappingURL=claude-wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-wrapper.d.ts","sourceRoot":"","sources":["../../src/otel/claude-wrapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EACL,wBAAwB,EACxB,KAAK,+BAA+B,EAGrC,MAAM,mBAAmB,CAAC;AAK3B;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAAG,+BAA+B,CAAC;AAEvE;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IAEnC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,0BAA0B;IACzC,uEAAuE;IAEvE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IAC/B;;;;OAIG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,mFAAmF;IACnF,QAAQ,CAAC,KAAK,EAAE,wBAAwB,CAAC;IACzC,oDAAoD;IACpD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,oBAAoB,EACzB,OAAO,CAAC,EAAE,wBAAwB,GACjC,0BAA0B,CAyC5B"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Claude Agent SDK Wrapper
3
+ *
4
+ * Provides a zero-friction `withIntrospection()` wrapper for the Claude Agent SDK.
5
+ * Automatically instruments all query() calls with OpenTelemetry tracing via
6
+ * IntrospectionClaudeHooks — no manual hook wiring or recordUsage() calls needed.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import * as sdk from "@anthropic-ai/claude-agent-sdk";
11
+ * import { withIntrospection } from "@introspection-sdk/introspection-node";
12
+ *
13
+ * const tracedSdk = withIntrospection(sdk, { serviceName: "my-agent" });
14
+ *
15
+ * for await (const message of tracedSdk.query({ prompt: "Hello" })) {
16
+ * // messages yielded normally — tracing happens automatically
17
+ * }
18
+ *
19
+ * await tracedSdk.shutdown();
20
+ * ```
21
+ */
22
+ import { IntrospectionClaudeHooks, } from "./claude-hooks.js";
23
+ import { logger } from "../utils.js";
24
+ // --- Implementation ---
25
+ /**
26
+ * Wrap the Claude Agent SDK module to automatically instrument every
27
+ * `query()` call with OpenTelemetry tracing.
28
+ *
29
+ * The returned SDK:
30
+ * - Auto-captures `prompt` and `systemPrompt` from query params
31
+ * - Injects instrumentation hooks (merged with any user-provided hooks)
32
+ * - Calls {@link IntrospectionClaudeHooks.recordUsage | recordUsage()} on
33
+ * every streamed message automatically
34
+ * - Flushes spans when each query stream completes
35
+ *
36
+ * @param sdk - The Claude Agent SDK module
37
+ * (`import * as sdk from "@anthropic-ai/claude-agent-sdk"`).
38
+ * @param options - Introspection configuration (token, serviceName, baseUrl, etc.).
39
+ * @returns An {@link InstrumentedClaudeAgentSDK} with the same API plus
40
+ * `forceFlush()`, `shutdown()`, and `hooks`.
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * import * as sdk from "@anthropic-ai/claude-agent-sdk";
45
+ * import { withIntrospection } from "@introspection-sdk/introspection-node";
46
+ *
47
+ * const traced = withIntrospection(sdk, { serviceName: "my-agent" });
48
+ * for await (const msg of traced.query({ prompt: "Hello" })) { /* … *\/ }
49
+ * await traced.shutdown();
50
+ * ```
51
+ */
52
+ export function withIntrospection(sdk, options) {
53
+ const hooks = new IntrospectionClaudeHooks(options);
54
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
55
+ function wrappedQuery(params) {
56
+ // Auto-capture prompt
57
+ if (typeof params?.prompt === "string") {
58
+ hooks.setInputPrompt(params.prompt);
59
+ }
60
+ // Auto-capture systemPrompt from options
61
+ const opts = (params?.options || {});
62
+ if (typeof opts.systemPrompt === "string") {
63
+ hooks.setSystemInstructions(opts.systemPrompt);
64
+ }
65
+ // Merge instrumentation hooks with any user-provided hooks
66
+ const introspectionHooks = hooks.getHooks();
67
+ const userHooks = opts.hooks;
68
+ const mergedHooks = mergeHooks(introspectionHooks, userHooks);
69
+ // Call original query with merged hooks
70
+ const modifiedOptions = { ...opts, hooks: mergedHooks };
71
+ const originalQuery = sdk.query({
72
+ ...params,
73
+ options: modifiedOptions,
74
+ });
75
+ // Wrap the async generator to intercept messages
76
+ return wrapQueryResult(originalQuery, hooks);
77
+ }
78
+ return {
79
+ ...sdk,
80
+ query: wrappedQuery,
81
+ hooks,
82
+ forceFlush: () => hooks.forceFlush(),
83
+ shutdown: () => hooks.shutdown(),
84
+ };
85
+ }
86
+ /**
87
+ * Merges introspection hooks with user-provided hooks.
88
+ * Introspection hooks fire first, then user hooks.
89
+ * User hooks on events we don't handle pass through untouched.
90
+ */
91
+ function mergeHooks(introspectionHooks, userHooks) {
92
+ if (!userHooks) {
93
+ return introspectionHooks;
94
+ }
95
+ const merged = {};
96
+ const allEvents = new Set([
97
+ ...Object.keys(introspectionHooks),
98
+ ...Object.keys(userHooks),
99
+ ]);
100
+ for (const event of allEvents) {
101
+ const ours = introspectionHooks[event] || [];
102
+ const theirs = userHooks[event] || [];
103
+ merged[event] = [...ours, ...theirs];
104
+ }
105
+ return merged;
106
+ }
107
+ /**
108
+ * Wraps a Query async generator to intercept messages for usage recording.
109
+ * Uses a Proxy to transparently forward all non-iterator properties
110
+ * (interrupt, close, setModel, etc.) to the original Query object.
111
+ */
112
+ function wrapQueryResult(originalQuery, hooks) {
113
+ const query = originalQuery;
114
+ async function* instrumentedIterator() {
115
+ try {
116
+ for await (const message of query) {
117
+ hooks.recordUsage(message);
118
+ yield message;
119
+ }
120
+ }
121
+ finally {
122
+ try {
123
+ await hooks.forceFlush();
124
+ }
125
+ catch (flushError) {
126
+ logger.warn("Failed to flush spans after query completed", flushError);
127
+ }
128
+ }
129
+ }
130
+ const wrapped = instrumentedIterator();
131
+ // Use Proxy to transparently delegate non-iterator properties to original query.
132
+ // Iterator protocol methods come from our wrapper (bound to the actual generator
133
+ // to avoid "incompatible receiver" errors); everything else (interrupt, close,
134
+ // setModel, setPermissionMode, etc.) delegates to the original Query.
135
+ return new Proxy(wrapped, {
136
+ get(target, prop) {
137
+ if (prop === Symbol.asyncIterator ||
138
+ prop === "next" ||
139
+ prop === "return" ||
140
+ prop === "throw") {
141
+ const value = Reflect.get(target, prop);
142
+ if (typeof value === "function") {
143
+ return value.bind(target);
144
+ }
145
+ return value;
146
+ }
147
+ const original = query[prop];
148
+ if (typeof original === "function") {
149
+ return original.bind(query);
150
+ }
151
+ return original;
152
+ },
153
+ });
154
+ }
155
+ //# sourceMappingURL=claude-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-wrapper.js","sourceRoot":"","sources":["../../src/otel/claude-wrapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
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 type { BasicTracerProvider } from "@opentelemetry/sdk-trace-base";
25
+ /**
26
+ * Auto-instrumentor that wraps a `@google/genai` client instance to add
27
+ * Introspection tracing with full thought-signature capture.
28
+ *
29
+ * Captures all content parts including thought summaries and signed
30
+ * `thoughtSignature` payloads required for multi-turn replay.
31
+ */
32
+ export declare class GeminiInstrumentor {
33
+ private tracer;
34
+ private restores;
35
+ private conversationId;
36
+ instrument(opts: {
37
+ tracerProvider?: BasicTracerProvider;
38
+ /** A `@google/genai` `GoogleGenAI` client instance. */
39
+ client: any;
40
+ /**
41
+ * Conversation ID shared across all spans produced by this instrumentor.
42
+ * Defaults to a random UUID generated at `instrument()` time.
43
+ */
44
+ conversationId?: string;
45
+ }): void;
46
+ uninstrument(): void;
47
+ }
48
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/otel/gemini.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AA0QzE;;;;;;GAMG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,cAAc,CAAqB;IAE3C,UAAU,CAAC,IAAI,EAAE;QACf,cAAc,CAAC,EAAE,mBAAmB,CAAC;QACrC,uDAAuD;QAEvD,MAAM,EAAE,GAAG,CAAC;QACZ;;;WAGG;QACH,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,GAAG,IAAI;IA6ER,YAAY,IAAI,IAAI;CAKrB"}
@@ -0,0 +1,297 @@
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
+ export class GeminiInstrumentor {
229
+ tracer = null;
230
+ restores = [];
231
+ conversationId;
232
+ instrument(opts) {
233
+ const { client } = opts;
234
+ if (!client?.models?.generateContent) {
235
+ throw new Error("Invalid client — pass a GoogleGenAI client instance (new GoogleGenAI({...}))");
236
+ }
237
+ this.conversationId = opts.conversationId ?? crypto.randomUUID();
238
+ const provider = opts.tracerProvider ?? trace.getTracerProvider();
239
+ this.tracer = provider.getTracer("introspection-gemini");
240
+ const tracer = this.tracer;
241
+ const conversationId = this.conversationId;
242
+ const api = client.models;
243
+ const origGenerate = api.generateContent.bind(api);
244
+ const origGenerateStream = api.generateContentStream?.bind(api);
245
+ this.restores.push(() => {
246
+ api.generateContent = origGenerate;
247
+ if (origGenerateStream)
248
+ api.generateContentStream = origGenerateStream;
249
+ });
250
+ api.generateContent = async (...args) => {
251
+ const kwargs = args[0] || {};
252
+ const span = startSpan(tracer, kwargs.model || "unknown", conversationId);
253
+ setRequestAttrs(span, kwargs);
254
+ try {
255
+ const response = (await origGenerate(...args));
256
+ setResponseAttrs(span, response);
257
+ return response;
258
+ }
259
+ catch (err) {
260
+ span.setStatus({
261
+ code: SpanStatusCode.ERROR,
262
+ message: String(err),
263
+ });
264
+ throw err;
265
+ }
266
+ finally {
267
+ span.end();
268
+ }
269
+ };
270
+ if (origGenerateStream) {
271
+ api.generateContentStream = async (...args) => {
272
+ const kwargs = args[0] || {};
273
+ const span = startSpan(tracer, kwargs.model || "unknown", conversationId);
274
+ setRequestAttrs(span, kwargs);
275
+ try {
276
+ const stream = (await origGenerateStream(...args));
277
+ return new TracedStream(stream, span);
278
+ }
279
+ catch (err) {
280
+ span.setStatus({
281
+ code: SpanStatusCode.ERROR,
282
+ message: String(err),
283
+ });
284
+ span.end();
285
+ throw err;
286
+ }
287
+ };
288
+ }
289
+ }
290
+ uninstrument() {
291
+ for (const restore of this.restores)
292
+ restore();
293
+ this.restores = [];
294
+ this.tracer = null;
295
+ }
296
+ }
297
+ //# 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,27 @@
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
+ //# 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"}