@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,555 @@
1
+ /**
2
+ * LangChain/LangGraph Callback Handler for Introspection.
3
+ *
4
+ * Hooks into LangChain's native callback system to capture LLM, tool, and
5
+ * chain interactions as gen_ai.* OTel spans for the Introspection backend.
6
+ *
7
+ * Similar to IntrospectionTracingProcessor for OpenAI Agents SDK and
8
+ * IntrospectionClaudeHooks for Claude Agent SDK.
9
+ *
10
+ * **Important:** This module requires `@langchain/core` at runtime.
11
+ * Import via the subpath: `@introspection-sdk/introspection-node/langchain`
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * import { IntrospectionCallbackHandler } from "@introspection-sdk/introspection-node/langchain";
16
+ * import { ChatOpenAI } from "@langchain/openai";
17
+ *
18
+ * const handler = new IntrospectionCallbackHandler({
19
+ * serviceName: "my-langchain-app",
20
+ * });
21
+ *
22
+ * const model = new ChatOpenAI({ modelName: "gpt-4o" });
23
+ * const response = await model.invoke("Hello!", { callbacks: [handler] });
24
+ *
25
+ * await handler.shutdown();
26
+ * ```
27
+ */
28
+ import { BaseCallbackHandler } from "@langchain/core/callbacks/base";
29
+ import { context as otelContext, propagation, ROOT_CONTEXT, SpanStatusCode, trace as otelTrace, } from "@opentelemetry/api";
30
+ import { BasicTracerProvider, BatchSpanProcessor, SimpleSpanProcessor, } from "@opentelemetry/sdk-trace-base";
31
+ import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto";
32
+ import { resourceFromAttributes } from "@opentelemetry/resources";
33
+ import { ATTR_SERVICE_NAME } from "@opentelemetry/semantic-conventions";
34
+ import { randomUUID } from "crypto";
35
+ import { logger, withOtlpHttpsProxy } from "../utils.js";
36
+ import { VERSION } from "../version.js";
37
+ // ---------------------------------------------------------------------------
38
+ // Handler
39
+ // ---------------------------------------------------------------------------
40
+ /**
41
+ * LangChain callback handler that captures LLM, tool, and chain events
42
+ * as gen_ai.* OTel spans and exports them to the Introspection backend.
43
+ *
44
+ * Pass as a callback to any LangChain invoke call, or set globally via
45
+ * `setGlobalHandler()`.
46
+ */
47
+ export class IntrospectionCallbackHandler extends BaseCallbackHandler {
48
+ name = "IntrospectionCallbackHandler";
49
+ _tracerProvider;
50
+ _tracer;
51
+ _spans = new Map();
52
+ _conversationId;
53
+ // Track span names and parents so children can resolve gen_ai.agent.name
54
+ _spanNames = new Map();
55
+ _spanParents = new Map();
56
+ _runRoots = new Map();
57
+ // LangChain wrapper names to skip when resolving agent names
58
+ static _wrapperNames = new Set([
59
+ "RunnableSequence",
60
+ "RunnableParallel",
61
+ "RunnableMap",
62
+ "RunnableLambda",
63
+ "RunnableRetry",
64
+ "_ConfigurableModel",
65
+ "ChatOpenAI",
66
+ "ChatAnthropic",
67
+ "ChatGoogleGenerativeAI",
68
+ "ChatGroq",
69
+ ]);
70
+ // Store LLM input messages per runId for use in handleLLMEnd
71
+ _llmInputs = new Map();
72
+ constructor(options = {}) {
73
+ super();
74
+ const advanced = options.advanced;
75
+ const serviceName = options.serviceName || process.env.INTROSPECTION_SERVICE_NAME;
76
+ const resource = serviceName
77
+ ? resourceFromAttributes({ [ATTR_SERVICE_NAME]: serviceName })
78
+ : undefined;
79
+ if (!advanced?.spanExporter) {
80
+ const token = options.token || process.env.INTROSPECTION_TOKEN;
81
+ if (!token) {
82
+ throw new Error("INTROSPECTION_TOKEN is required");
83
+ }
84
+ const baseUrl = options.baseUrl ||
85
+ process.env.INTROSPECTION_BASE_OTEL_URL ||
86
+ "https://otel.introspection.dev";
87
+ const endpoint = baseUrl.endsWith("/v1/traces")
88
+ ? baseUrl
89
+ : `${baseUrl.replace(/\/$/, "")}/v1/traces`;
90
+ const headers = {
91
+ "User-Agent": `introspection-sdk/${VERSION}`,
92
+ Authorization: `Bearer ${token}`,
93
+ ...options.additionalHeaders,
94
+ };
95
+ logger.info(`IntrospectionCallbackHandler initialized: endpoint=${endpoint}`);
96
+ const spanExporter = new OTLPTraceExporter(withOtlpHttpsProxy({ url: endpoint, headers }));
97
+ const effectiveBatchSize = token.startsWith("intro_dev") || token.startsWith("intro_staging")
98
+ ? 1
99
+ : undefined;
100
+ const useSimple = advanced?.useSimpleSpanProcessor || effectiveBatchSize === 1;
101
+ const spanProcessor = useSimple
102
+ ? new SimpleSpanProcessor(spanExporter)
103
+ : new BatchSpanProcessor(spanExporter, {
104
+ scheduledDelayMillis: 1000,
105
+ ...(effectiveBatchSize
106
+ ? { maxExportBatchSize: effectiveBatchSize }
107
+ : {}),
108
+ });
109
+ this._tracerProvider = new BasicTracerProvider({
110
+ resource,
111
+ idGenerator: advanced?.idGenerator,
112
+ spanProcessors: [spanProcessor],
113
+ });
114
+ }
115
+ else {
116
+ logger.info("IntrospectionCallbackHandler initialized in test mode with custom exporter");
117
+ const spanProcessor = advanced.useSimpleSpanProcessor
118
+ ? new SimpleSpanProcessor(advanced.spanExporter)
119
+ : new BatchSpanProcessor(advanced.spanExporter, {
120
+ scheduledDelayMillis: 100,
121
+ });
122
+ this._tracerProvider = new BasicTracerProvider({
123
+ resource,
124
+ idGenerator: advanced.idGenerator,
125
+ spanProcessors: [spanProcessor],
126
+ });
127
+ }
128
+ this._tracer = this._tracerProvider.getTracer("langchain", VERSION);
129
+ this._conversationId = `intro_conv_${randomUUID().replace(/-/g, "")}`;
130
+ }
131
+ _rootRunId(runId, parentRunId) {
132
+ if (!parentRunId)
133
+ return runId;
134
+ return this._runRoots.get(parentRunId) || parentRunId;
135
+ }
136
+ /** Keep the top-level run span aligned with child conversation IDs. */
137
+ _setRootConversationId(conversationId, runId, parentRunId) {
138
+ const root = this._spans.get(this._rootRunId(runId, parentRunId));
139
+ root?.setAttribute("gen_ai.conversation.id", conversationId);
140
+ }
141
+ _endRootIfComplete(runId) {
142
+ this._runRoots.delete(runId);
143
+ this._spanNames.delete(runId);
144
+ this._spanParents.delete(runId);
145
+ }
146
+ /** Create a span under a LangChain parent when one exists.
147
+ * Sets gen_ai.agent.name to the parent span's name for hierarchy. */
148
+ _createChildSpan(name, runId, parentRunId) {
149
+ const parent = parentRunId ? this._spans.get(parentRunId) : undefined;
150
+ this._runRoots.set(runId, this._rootRunId(runId, parentRunId));
151
+ const ctx = parent
152
+ ? otelTrace.setSpan(otelContext.active(), parent)
153
+ : ROOT_CONTEXT;
154
+ const span = this._tracer.startSpan(name, {}, ctx);
155
+ this._spanNames.set(runId, name);
156
+ if (parentRunId) {
157
+ this._spanParents.set(runId, parentRunId);
158
+ }
159
+ // Baggage wins so per-call agent identity (e.g. via withAgent())
160
+ // overrides the parent-span-name walk used as a default.
161
+ const baggageAgentName = this._readBaggage("gen_ai.agent.name");
162
+ const agentName = baggageAgentName || this._findAgentName(parentRunId);
163
+ if (agentName) {
164
+ span.setAttribute("gen_ai.agent.name", agentName);
165
+ }
166
+ const baggageAgentId = this._readBaggage("gen_ai.agent.id");
167
+ if (baggageAgentId) {
168
+ span.setAttribute("gen_ai.agent.id", baggageAgentId);
169
+ }
170
+ return span;
171
+ }
172
+ // -------------------------------------------------------------------------
173
+ // Chat model callbacks (preferred over LLM callbacks for chat models)
174
+ // -------------------------------------------------------------------------
175
+ handleChatModelStart(llm, messages, runId, parentRunId, extraParams, _tags, metadata, runName) {
176
+ const modelName = this._extractModelName(llm, extraParams);
177
+ const spanName = modelName ? `chat ${modelName}` : runName || "chat";
178
+ const otelSpan = this._createChildSpan(spanName, runId, parentRunId);
179
+ this._spans.set(runId, otelSpan);
180
+ const conversationId = this._getConversationId(metadata);
181
+ this._setRootConversationId(conversationId, runId, parentRunId);
182
+ otelSpan.setAttribute("gen_ai.operation.name", "chat");
183
+ otelSpan.setAttribute("gen_ai.conversation.id", conversationId);
184
+ otelSpan.setAttribute("openinference.span.kind", "LLM");
185
+ if (modelName) {
186
+ otelSpan.setAttribute("gen_ai.request.model", modelName);
187
+ }
188
+ const flatMessages = messages[0] || [];
189
+ const { inputMessages, systemInstructions } = this._convertMessages(flatMessages);
190
+ if (inputMessages.length > 0) {
191
+ otelSpan.setAttribute("gen_ai.input.messages", JSON.stringify(inputMessages));
192
+ this._llmInputs.set(runId, inputMessages);
193
+ }
194
+ if (systemInstructions.length > 0) {
195
+ otelSpan.setAttribute("gen_ai.system_instructions", JSON.stringify(systemInstructions.map((s) => ({ type: "text", content: s }))));
196
+ }
197
+ const provider = this._extractProvider(llm);
198
+ if (provider) {
199
+ otelSpan.setAttribute("gen_ai.system", provider);
200
+ }
201
+ const invocationParams = extraParams?.["invocation_params"];
202
+ const tools = invocationParams?.["tools"];
203
+ if (tools && tools.length > 0) {
204
+ otelSpan.setAttribute("gen_ai.tool.definitions", JSON.stringify(tools.map((t) => {
205
+ const fn = (t.function || t);
206
+ return {
207
+ type: t.type || "function",
208
+ name: (fn.name || ""),
209
+ description: (fn.description || ""),
210
+ parameters: fn.parameters,
211
+ };
212
+ })));
213
+ }
214
+ if (invocationParams?.["temperature"] != null) {
215
+ otelSpan.setAttribute("gen_ai.request.temperature", invocationParams["temperature"]);
216
+ }
217
+ }
218
+ handleLLMStart(llm, prompts, runId, parentRunId, extraParams, _tags, metadata, runName) {
219
+ const modelName = this._extractModelName(llm, extraParams);
220
+ const spanName = modelName ? `chat ${modelName}` : runName || "llm";
221
+ const otelSpan = this._createChildSpan(spanName, runId, parentRunId);
222
+ this._spans.set(runId, otelSpan);
223
+ const conversationId = this._getConversationId(metadata);
224
+ this._setRootConversationId(conversationId, runId, parentRunId);
225
+ otelSpan.setAttribute("gen_ai.operation.name", "chat");
226
+ otelSpan.setAttribute("gen_ai.conversation.id", conversationId);
227
+ otelSpan.setAttribute("openinference.span.kind", "LLM");
228
+ if (modelName) {
229
+ otelSpan.setAttribute("gen_ai.request.model", modelName);
230
+ }
231
+ if (prompts.length > 0) {
232
+ const inputMessages = prompts.map((p) => ({
233
+ role: "user",
234
+ parts: [{ type: "text", content: p }],
235
+ }));
236
+ otelSpan.setAttribute("gen_ai.input.messages", JSON.stringify(inputMessages));
237
+ this._llmInputs.set(runId, inputMessages);
238
+ }
239
+ }
240
+ handleLLMEnd(output, runId) {
241
+ const otelSpan = this._spans.get(runId);
242
+ if (!otelSpan)
243
+ return;
244
+ this._spans.delete(runId);
245
+ this._spanNames.delete(runId);
246
+ this._llmInputs.delete(runId);
247
+ this._endRootIfComplete(runId);
248
+ const generations = output.generations?.[0];
249
+ if (generations && generations.length > 0) {
250
+ const parts = [];
251
+ for (const gen of generations) {
252
+ if (gen.text) {
253
+ parts.push({ type: "text", content: gen.text });
254
+ }
255
+ const msg = gen.message;
256
+ const kwargs = (msg?.["kwargs"] || msg);
257
+ const additionalKwargs = kwargs?.["additional_kwargs"];
258
+ const toolCalls = (additionalKwargs?.["tool_calls"] ||
259
+ kwargs?.["tool_calls"]);
260
+ if (toolCalls) {
261
+ for (const tc of toolCalls) {
262
+ const fn = (tc.function || tc);
263
+ parts.push({
264
+ type: "tool_call",
265
+ name: (fn.name || tc.name || ""),
266
+ id: (tc.id || ""),
267
+ arguments: (fn.arguments || tc.args || ""),
268
+ });
269
+ }
270
+ }
271
+ }
272
+ if (parts.length > 0) {
273
+ const outputMessages = [{ role: "assistant", parts }];
274
+ otelSpan.setAttribute("gen_ai.output.messages", JSON.stringify(outputMessages));
275
+ }
276
+ }
277
+ const usage = output.llmOutput;
278
+ const tokenUsage = (usage?.["tokenUsage"] ||
279
+ usage?.["token_usage"] ||
280
+ usage?.["usage"]);
281
+ if (tokenUsage) {
282
+ const inputTokens = tokenUsage["promptTokens"] ||
283
+ tokenUsage["prompt_tokens"] ||
284
+ tokenUsage["input_tokens"];
285
+ const outputTokens = tokenUsage["completionTokens"] ||
286
+ tokenUsage["completion_tokens"] ||
287
+ tokenUsage["output_tokens"];
288
+ if (typeof inputTokens === "number") {
289
+ otelSpan.setAttribute("gen_ai.usage.input_tokens", inputTokens);
290
+ }
291
+ if (typeof outputTokens === "number") {
292
+ otelSpan.setAttribute("gen_ai.usage.output_tokens", outputTokens);
293
+ }
294
+ // Flat field (legacy format) or nested cache_creation object (Claude 4+).
295
+ const cacheCreationObj = tokenUsage["cache_creation"];
296
+ const cacheWriteTokens = tokenUsage["cache_creation_input_tokens"] ||
297
+ tokenUsage["cacheCreationInputTokens"] ||
298
+ (cacheCreationObj?.["ephemeral_5m_input_tokens"] || 0) +
299
+ (cacheCreationObj?.["ephemeral_1h_input_tokens"] || 0) ||
300
+ undefined;
301
+ if (typeof cacheWriteTokens === "number") {
302
+ otelSpan.setAttribute("gen_ai.usage.cache_creation.input_tokens", cacheWriteTokens);
303
+ }
304
+ const cacheReadTokens = tokenUsage["cache_read_input_tokens"] ||
305
+ tokenUsage["cacheReadInputTokens"];
306
+ if (typeof cacheReadTokens === "number") {
307
+ otelSpan.setAttribute("gen_ai.usage.cache_read.input_tokens", cacheReadTokens);
308
+ }
309
+ }
310
+ const model = usage?.["model"] || usage?.["model_name"];
311
+ if (typeof model === "string") {
312
+ otelSpan.setAttribute("gen_ai.response.model", model);
313
+ }
314
+ // gen_ai.response.id — required by the server for conversation tracking.
315
+ const responseId = usage?.["id"] || usage?.["system_fingerprint"];
316
+ otelSpan.setAttribute("gen_ai.response.id", typeof responseId === "string" ? responseId : `langchain-${runId}`);
317
+ otelSpan.end();
318
+ }
319
+ handleLLMError(err, runId) {
320
+ const otelSpan = this._spans.get(runId);
321
+ if (!otelSpan)
322
+ return;
323
+ this._spans.delete(runId);
324
+ this._spanNames.delete(runId);
325
+ this._llmInputs.delete(runId);
326
+ this._endRootIfComplete(runId);
327
+ otelSpan.recordException(err);
328
+ otelSpan.setStatus({ code: SpanStatusCode.ERROR, message: err.message });
329
+ otelSpan.setAttribute("exception.message", err.message);
330
+ otelSpan.end();
331
+ }
332
+ // -------------------------------------------------------------------------
333
+ // Chain callbacks
334
+ // -------------------------------------------------------------------------
335
+ handleChainStart(chain, _inputs, runId, _runType, _tags, metadata, runName, parentRunId) {
336
+ const name = runName || chain?.name || chain?.id?.[chain.id.length - 1] || "chain";
337
+ const otelSpan = this._createChildSpan(name, runId, parentRunId);
338
+ this._spans.set(runId, otelSpan);
339
+ const conversationId = this._getConversationId(metadata);
340
+ this._setRootConversationId(conversationId, runId, parentRunId);
341
+ otelSpan.setAttribute("gen_ai.conversation.id", conversationId);
342
+ }
343
+ handleChainEnd(_outputs, runId) {
344
+ const otelSpan = this._spans.get(runId);
345
+ if (!otelSpan)
346
+ return;
347
+ this._spans.delete(runId);
348
+ this._endRootIfComplete(runId);
349
+ otelSpan.end();
350
+ }
351
+ handleChainError(err, runId) {
352
+ const otelSpan = this._spans.get(runId);
353
+ if (!otelSpan)
354
+ return;
355
+ this._spans.delete(runId);
356
+ this._endRootIfComplete(runId);
357
+ otelSpan.recordException(err);
358
+ otelSpan.setStatus({ code: SpanStatusCode.ERROR, message: err.message });
359
+ otelSpan.setAttribute("exception.message", err.message);
360
+ otelSpan.end();
361
+ }
362
+ // -------------------------------------------------------------------------
363
+ // Tool callbacks
364
+ // -------------------------------------------------------------------------
365
+ handleToolStart(tool, input, runId, parentRunId, _tags, metadata, runName) {
366
+ const toolName = runName || tool?.name || tool?.id?.[tool.id.length - 1] || "tool";
367
+ const otelSpan = this._createChildSpan(toolName, runId, parentRunId);
368
+ this._spans.set(runId, otelSpan);
369
+ const conversationId = this._getConversationId(metadata);
370
+ this._setRootConversationId(conversationId, runId, parentRunId);
371
+ otelSpan.setAttribute("gen_ai.tool.name", toolName);
372
+ otelSpan.setAttribute("openinference.span.kind", "TOOL");
373
+ otelSpan.setAttribute("gen_ai.tool.input", input);
374
+ otelSpan.setAttribute("gen_ai.conversation.id", conversationId);
375
+ }
376
+ handleToolEnd(output, runId) {
377
+ const otelSpan = this._spans.get(runId);
378
+ if (!otelSpan)
379
+ return;
380
+ this._spans.delete(runId);
381
+ this._endRootIfComplete(runId);
382
+ if (output != null) {
383
+ otelSpan.setAttribute("gen_ai.tool.output", typeof output === "string" ? output : JSON.stringify(output));
384
+ }
385
+ otelSpan.end();
386
+ }
387
+ handleToolError(err, runId) {
388
+ const otelSpan = this._spans.get(runId);
389
+ if (!otelSpan)
390
+ return;
391
+ this._spans.delete(runId);
392
+ this._endRootIfComplete(runId);
393
+ otelSpan.recordException(err);
394
+ otelSpan.setStatus({ code: SpanStatusCode.ERROR, message: err.message });
395
+ otelSpan.setAttribute("exception.message", err.message);
396
+ otelSpan.end();
397
+ }
398
+ // -------------------------------------------------------------------------
399
+ // Lifecycle
400
+ // -------------------------------------------------------------------------
401
+ async shutdown() {
402
+ for (const span of this._spans.values())
403
+ span.end();
404
+ this._spans.clear();
405
+ this._spanNames.clear();
406
+ this._spanParents.clear();
407
+ this._runRoots.clear();
408
+ await this._tracerProvider.shutdown();
409
+ }
410
+ async forceFlush() {
411
+ await this._tracerProvider.forceFlush();
412
+ }
413
+ // -------------------------------------------------------------------------
414
+ // Helpers
415
+ // -------------------------------------------------------------------------
416
+ _extractModelName(llm, extraParams) {
417
+ const invocationParams = extraParams?.["invocation_params"];
418
+ if (invocationParams) {
419
+ const model = invocationParams["model"] ||
420
+ invocationParams["model_name"] ||
421
+ invocationParams["modelName"];
422
+ if (typeof model === "string")
423
+ return model;
424
+ }
425
+ const kwargs = llm?.kwargs;
426
+ if (kwargs) {
427
+ const model = kwargs["model"] || kwargs["model_name"] || kwargs["modelName"];
428
+ if (typeof model === "string")
429
+ return model;
430
+ }
431
+ return undefined;
432
+ }
433
+ _extractProvider(llm) {
434
+ const id = llm?.id;
435
+ if (Array.isArray(id) && id.length > 0) {
436
+ return id[id.length - 1];
437
+ }
438
+ return undefined;
439
+ }
440
+ /** Walk up the span tree to find the first non-wrapper span name. */
441
+ _findAgentName(runId) {
442
+ let current = runId;
443
+ for (let i = 0; i < 20 && current; i++) {
444
+ const name = this._spanNames.get(current);
445
+ if (name && !IntrospectionCallbackHandler._wrapperNames.has(name)) {
446
+ return name;
447
+ }
448
+ current = this._spanParents.get(current);
449
+ }
450
+ return undefined;
451
+ }
452
+ _getConversationId(metadata) {
453
+ const metaConvId = metadata?.["gen_ai.conversation.id"];
454
+ if (metaConvId !== undefined && metaConvId !== null) {
455
+ return String(metaConvId);
456
+ }
457
+ const threadId = metadata?.["thread_id"];
458
+ if (threadId !== undefined && threadId !== null) {
459
+ return String(threadId);
460
+ }
461
+ const baggageConvId = this._readBaggage("gen_ai.conversation.id");
462
+ if (baggageConvId)
463
+ return baggageConvId;
464
+ return this._conversationId;
465
+ }
466
+ /**
467
+ * Read a single value from the active OTel baggage. Returns undefined when
468
+ * no propagator is installed or the key is absent.
469
+ *
470
+ * Used so callers can scope LangChain calls with
471
+ * `IntrospectionClient.withAgent()` / `.withConversation()` /
472
+ * `.withGenAi()` without threading metadata through every invoke().
473
+ */
474
+ _readBaggage(key) {
475
+ const baggage = propagation.getBaggage(otelContext.active());
476
+ return baggage?.getEntry(key)?.value;
477
+ }
478
+ _convertMessages(messages) {
479
+ const inputMessages = [];
480
+ const systemInstructions = [];
481
+ for (const msg of messages) {
482
+ const msgType = msg._getType?.() ||
483
+ msg.type ||
484
+ "unknown";
485
+ const role = this._mapRole(msgType);
486
+ const content = this._extractContent(msg.content);
487
+ if (role === "system") {
488
+ systemInstructions.push(typeof msg.content === "string"
489
+ ? msg.content
490
+ : JSON.stringify(msg.content));
491
+ continue;
492
+ }
493
+ const parts = [];
494
+ if (role === "tool") {
495
+ const toolCallId = msg
496
+ .tool_call_id || "";
497
+ parts.push({
498
+ type: "tool_call_response",
499
+ id: toolCallId,
500
+ response: content,
501
+ });
502
+ }
503
+ else if (content) {
504
+ parts.push({ type: "text", content });
505
+ }
506
+ const toolCalls = msg
507
+ .tool_calls;
508
+ if (toolCalls) {
509
+ for (const tc of toolCalls) {
510
+ parts.push({
511
+ type: "tool_call",
512
+ name: (tc.name || ""),
513
+ id: (tc.id || ""),
514
+ arguments: typeof tc.args === "string" ? tc.args : JSON.stringify(tc.args),
515
+ });
516
+ }
517
+ }
518
+ if (parts.length > 0) {
519
+ inputMessages.push({ role, parts });
520
+ }
521
+ }
522
+ return { inputMessages, systemInstructions };
523
+ }
524
+ _mapRole(msgType) {
525
+ switch (msgType) {
526
+ case "human":
527
+ return "user";
528
+ case "ai":
529
+ return "assistant";
530
+ case "system":
531
+ return "system";
532
+ case "tool":
533
+ return "tool";
534
+ default:
535
+ return "user";
536
+ }
537
+ }
538
+ _extractContent(content) {
539
+ if (typeof content === "string")
540
+ return content;
541
+ if (Array.isArray(content)) {
542
+ return content
543
+ .map((part) => {
544
+ const p = part;
545
+ if (p.type === "text")
546
+ return (p.text || "");
547
+ return "";
548
+ })
549
+ .filter(Boolean)
550
+ .join("");
551
+ }
552
+ return String(content || "");
553
+ }
554
+ }
555
+ //# sourceMappingURL=langchain-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langchain-handler.js","sourceRoot":"","sources":["../../src/otel/langchain-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * IntrospectionLogs — OTel logs exporter for Introspection.
3
+ *
4
+ * Owns its own `LoggerProvider` and OTLP log exporter. Provides `track`,
5
+ * `feedback`, `identify`, and async-context helpers (`withBaggage`,
6
+ * `withAgent`, `withConversation`, etc.) that propagate identity and
7
+ * gen_ai context through OpenTelemetry baggage.
8
+ *
9
+ * Fully independent of {@link IntrospectionClient}. Construct it directly
10
+ * with the OTel peer dependencies installed.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * import { IntrospectionLogs } from "@introspection-sdk/introspection-node/otel";
15
+ *
16
+ * const logs = new IntrospectionLogs({
17
+ * token: process.env.INTROSPECTION_TOKEN,
18
+ * serviceName: "my-service",
19
+ * });
20
+ *
21
+ * await logs.withAgent("support-bot", "agent_1", () =>
22
+ * logs.withConversation("conv_123", undefined, () => {
23
+ * logs.feedback("thumbs_up", { comments: "Great answer" });
24
+ * }),
25
+ * );
26
+ *
27
+ * await logs.shutdown();
28
+ * ```
29
+ */
30
+ import { type FeedbackOptions, type UserTraits } from "../types.js";
31
+ /**
32
+ * Configuration for {@link IntrospectionLogs}.
33
+ */
34
+ export interface IntrospectionLogsOptions {
35
+ /** Authentication token (env: INTROSPECTION_TOKEN). */
36
+ token?: string;
37
+ /** Service name for telemetry (env: INTROSPECTION_SERVICE_NAME, default: "introspection-client"). */
38
+ serviceName?: string;
39
+ /**
40
+ * Base URL for the OTLP collector (env: INTROSPECTION_BASE_OTEL_URL,
41
+ * default: "https://otel.introspection.dev").
42
+ */
43
+ baseOtelUrl?: string;
44
+ /** Additional HTTP headers to include in exporter requests. */
45
+ additionalHeaders?: Record<string, string>;
46
+ /** Flush interval in milliseconds (default: 5000). */
47
+ flushInterval?: number;
48
+ /** Maximum queue size before auto-flush (default: 100). */
49
+ maxBatchSize?: number;
50
+ }
51
+ export declare class IntrospectionLogs {
52
+ private loggerProvider;
53
+ private otelLogger;
54
+ private userId;
55
+ private anonymousId;
56
+ private traits;
57
+ constructor(options?: IntrospectionLogsOptions);
58
+ /** Get gen_ai context from baggage */
59
+ private getGenAiFromContext;
60
+ /** Get identity from baggage or instance state */
61
+ private getIdentityFromContext;
62
+ private getTimestamp;
63
+ private buildAttributes;
64
+ track(eventName: string, properties?: Record<string, unknown>, options?: {
65
+ eventId?: string;
66
+ }): void;
67
+ feedback(name: string, options?: FeedbackOptions): void;
68
+ identify(userId: string, traits?: UserTraits, anonymousId?: string, eventId?: string): void;
69
+ createBaggageContext(values: Record<string, string>): import("@opentelemetry/api").Context;
70
+ withBaggage<T>(values: Record<string, string>, callback: () => T | Promise<T>): Promise<T>;
71
+ withAgent<T>(agentName: string, agentId: string | undefined, callback: () => T | Promise<T>): Promise<T>;
72
+ withConversation<T>(conversationId: string | undefined, previousResponseId: string | undefined, callback: () => T | Promise<T>): Promise<T>;
73
+ setUserId(userId: string): void;
74
+ setAnonymousId(anonymousId: string): void;
75
+ withUserId<T>(userId: string, callback: () => T | Promise<T>): Promise<T>;
76
+ withAnonymousId<T>(anonymousId: string, callback: () => T | Promise<T>): Promise<T>;
77
+ getAnonymousId(): string | undefined;
78
+ reset(): void;
79
+ flush(): Promise<void>;
80
+ shutdown(): Promise<void>;
81
+ }
82
+ //# sourceMappingURL=logs.d.ts.map