@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.
- package/.turbo/turbo-build.log +1 -1
- package/dist/client.d.ts +42 -132
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +67 -366
- package/dist/client.js.map +1 -0
- package/dist/converters/claude.d.ts +4 -0
- package/dist/converters/claude.d.ts.map +1 -1
- package/dist/converters/claude.js +7 -0
- package/dist/converters/claude.js.map +1 -0
- package/dist/converters/gemini.d.ts +90 -0
- package/dist/converters/gemini.d.ts.map +1 -0
- package/dist/converters/gemini.js +171 -0
- package/dist/converters/gemini.js.map +1 -0
- package/dist/converters/index.d.ts +1 -1
- package/dist/converters/index.d.ts.map +1 -1
- package/dist/converters/index.js +2 -1
- package/dist/converters/index.js.map +1 -0
- package/dist/converters/openai.js +1 -0
- package/dist/converters/openai.js.map +1 -0
- package/dist/converters/openinference.js +1 -0
- package/dist/converters/openinference.js.map +1 -0
- package/dist/converters/vercel.d.ts.map +1 -1
- package/dist/converters/vercel.js +31 -3
- package/dist/converters/vercel.js.map +1 -0
- package/dist/http.d.ts +36 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +145 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +24 -27
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -32
- package/dist/index.js.map +1 -0
- package/dist/{anthropic.d.ts → otel/anthropic.d.ts} +23 -13
- package/dist/otel/anthropic.d.ts.map +1 -0
- package/dist/{anthropic.js → otel/anthropic.js} +132 -40
- package/dist/otel/anthropic.js.map +1 -0
- package/dist/{claude-hooks.d.ts → otel/claude-hooks.d.ts} +19 -1
- package/dist/otel/claude-hooks.d.ts.map +1 -0
- package/dist/{claude-hooks.js → otel/claude-hooks.js} +94 -20
- package/dist/otel/claude-hooks.js.map +1 -0
- package/dist/otel/claude-wrapper.d.ts.map +1 -0
- package/dist/{claude-wrapper.js → otel/claude-wrapper.js} +2 -1
- package/dist/otel/claude-wrapper.js.map +1 -0
- package/dist/otel/gemini.d.ts +56 -0
- package/dist/otel/gemini.d.ts.map +1 -0
- package/dist/otel/gemini.js +348 -0
- package/dist/otel/gemini.js.map +1 -0
- package/dist/otel/index.d.ts +32 -0
- package/dist/otel/index.d.ts.map +1 -0
- package/dist/otel/index.js +41 -0
- package/dist/otel/index.js.map +1 -0
- package/dist/otel/init.d.ts +126 -0
- package/dist/otel/init.d.ts.map +1 -0
- package/dist/otel/init.js +259 -0
- package/dist/otel/init.js.map +1 -0
- package/dist/otel/integrations/anthropic.d.ts +10 -0
- package/dist/otel/integrations/anthropic.d.ts.map +1 -0
- package/dist/otel/integrations/anthropic.js +22 -0
- package/dist/otel/integrations/anthropic.js.map +1 -0
- package/dist/otel/integrations/base.d.ts +83 -0
- package/dist/otel/integrations/base.d.ts.map +1 -0
- package/dist/otel/integrations/base.js +23 -0
- package/dist/otel/integrations/base.js.map +1 -0
- package/dist/otel/integrations/claude-agent.d.ts +13 -0
- package/dist/otel/integrations/claude-agent.d.ts.map +1 -0
- package/dist/otel/integrations/claude-agent.js +27 -0
- package/dist/otel/integrations/claude-agent.js.map +1 -0
- package/dist/otel/integrations/gemini.d.ts +11 -0
- package/dist/otel/integrations/gemini.d.ts.map +1 -0
- package/dist/otel/integrations/gemini.js +21 -0
- package/dist/otel/integrations/gemini.js.map +1 -0
- package/dist/otel/integrations/index.d.ts +39 -0
- package/dist/otel/integrations/index.d.ts.map +1 -0
- package/dist/otel/integrations/index.js +131 -0
- package/dist/otel/integrations/index.js.map +1 -0
- package/dist/otel/integrations/langchain.d.ts +16 -0
- package/dist/otel/integrations/langchain.d.ts.map +1 -0
- package/dist/otel/integrations/langchain.js +41 -0
- package/dist/otel/integrations/langchain.js.map +1 -0
- package/dist/otel/integrations/mastra.d.ts +14 -0
- package/dist/otel/integrations/mastra.d.ts.map +1 -0
- package/dist/otel/integrations/mastra.js +27 -0
- package/dist/otel/integrations/mastra.js.map +1 -0
- package/dist/otel/integrations/openai-agents.d.ts +11 -0
- package/dist/otel/integrations/openai-agents.d.ts.map +1 -0
- package/dist/otel/integrations/openai-agents.js +25 -0
- package/dist/otel/integrations/openai-agents.js.map +1 -0
- package/dist/otel/integrations/pi.d.ts +12 -0
- package/dist/otel/integrations/pi.d.ts.map +1 -0
- package/dist/otel/integrations/pi.js +20 -0
- package/dist/otel/integrations/pi.js.map +1 -0
- package/dist/otel/integrations/vercel.d.ts +15 -0
- package/dist/otel/integrations/vercel.d.ts.map +1 -0
- package/dist/otel/integrations/vercel.js +20 -0
- package/dist/otel/integrations/vercel.js.map +1 -0
- package/dist/{langchain-handler.d.ts → otel/langchain-handler.d.ts} +10 -1
- package/dist/otel/langchain-handler.d.ts.map +1 -0
- package/dist/{langchain-handler.js → otel/langchain-handler.js} +43 -6
- package/dist/otel/langchain-handler.js.map +1 -0
- package/dist/otel/logs.d.ts +82 -0
- package/dist/otel/logs.d.ts.map +1 -0
- package/dist/otel/logs.js +271 -0
- package/dist/otel/logs.js.map +1 -0
- package/dist/{mastra-exporter.d.ts → otel/mastra-exporter.d.ts} +3 -1
- package/dist/otel/mastra-exporter.d.ts.map +1 -0
- package/dist/{mastra-exporter.js → otel/mastra-exporter.js} +71 -17
- package/dist/otel/mastra-exporter.js.map +1 -0
- package/dist/otel/pi.d.ts +59 -0
- package/dist/otel/pi.d.ts.map +1 -0
- package/dist/otel/pi.js +67 -0
- package/dist/otel/pi.js.map +1 -0
- package/dist/otel/register.d.ts +8 -0
- package/dist/otel/register.d.ts.map +1 -0
- package/dist/otel/register.js +48 -0
- package/dist/otel/register.js.map +1 -0
- package/dist/otel/setup.d.ts +52 -0
- package/dist/otel/setup.d.ts.map +1 -0
- package/dist/otel/setup.js +146 -0
- package/dist/otel/setup.js.map +1 -0
- package/dist/{span-processor.d.ts → otel/span-processor.d.ts} +1 -1
- package/dist/otel/span-processor.d.ts.map +1 -0
- package/dist/{span-processor.js → otel/span-processor.js} +11 -5
- package/dist/otel/span-processor.js.map +1 -0
- package/dist/{tracing-processor.d.ts → otel/tracing-processor.d.ts} +4 -1
- package/dist/otel/tracing-processor.d.ts.map +1 -0
- package/dist/{tracing-processor.js → otel/tracing-processor.js} +64 -14
- package/dist/otel/tracing-processor.js.map +1 -0
- package/dist/resources/experiments.d.ts +31 -0
- package/dist/resources/experiments.d.ts.map +1 -0
- package/dist/resources/experiments.js +133 -0
- package/dist/resources/experiments.js.map +1 -0
- package/dist/resources/recipes.d.ts +22 -0
- package/dist/resources/recipes.d.ts.map +1 -0
- package/dist/resources/recipes.js +61 -0
- package/dist/resources/recipes.js.map +1 -0
- package/dist/resources/runtimes.d.ts +76 -0
- package/dist/resources/runtimes.d.ts.map +1 -0
- package/dist/resources/runtimes.js +179 -0
- package/dist/resources/runtimes.js.map +1 -0
- package/dist/runner-resources/files.d.ts +35 -0
- package/dist/runner-resources/files.d.ts.map +1 -0
- package/dist/runner-resources/files.js +131 -0
- package/dist/runner-resources/files.js.map +1 -0
- package/dist/runner-resources/tasks.d.ts +39 -0
- package/dist/runner-resources/tasks.d.ts.map +1 -0
- package/dist/runner-resources/tasks.js +129 -0
- package/dist/runner-resources/tasks.js.map +1 -0
- package/dist/runner.d.ts +80 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +159 -0
- package/dist/runner.js.map +1 -0
- package/dist/streaming.d.ts +8 -0
- package/dist/streaming.d.ts.map +1 -0
- package/dist/streaming.js +67 -0
- package/dist/streaming.js.map +1 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +10 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +13 -4
- package/dist/utils.js.map +1 -0
- package/dist/version.js +1 -0
- package/dist/version.js.map +1 -0
- package/package.json +91 -22
- package/src/client.ts +76 -473
- package/src/converters/claude.ts +10 -0
- package/src/converters/gemini.ts +243 -0
- package/src/converters/index.ts +13 -7
- package/src/converters/vercel.ts +41 -3
- package/src/http.ts +163 -0
- package/src/index.ts +110 -75
- package/src/{anthropic.ts → otel/anthropic.ts} +206 -54
- package/src/{claude-hooks.ts → otel/claude-hooks.ts} +119 -20
- package/src/{claude-wrapper.ts → otel/claude-wrapper.ts} +1 -1
- package/src/otel/gemini.ts +491 -0
- package/src/otel/index.ts +121 -0
- package/src/otel/init.ts +411 -0
- package/src/otel/integrations/anthropic.ts +26 -0
- package/src/otel/integrations/base.ts +95 -0
- package/src/otel/integrations/claude-agent.ts +32 -0
- package/src/otel/integrations/gemini.ts +25 -0
- package/src/otel/integrations/index.ts +151 -0
- package/src/otel/integrations/langchain.ts +45 -0
- package/src/otel/integrations/mastra.ts +30 -0
- package/src/otel/integrations/openai-agents.ts +31 -0
- package/src/otel/integrations/pi.ts +24 -0
- package/src/otel/integrations/vercel.ts +24 -0
- package/src/{langchain-handler.ts → otel/langchain-handler.ts} +53 -6
- package/src/otel/logs.ts +394 -0
- package/src/{mastra-exporter.ts → otel/mastra-exporter.ts} +83 -22
- package/src/otel/pi.ts +88 -0
- package/src/otel/register.ts +50 -0
- package/src/otel/setup.ts +215 -0
- package/src/{span-processor.ts → otel/span-processor.ts} +11 -6
- package/src/{tracing-processor.ts → otel/tracing-processor.ts} +94 -19
- package/src/resources/experiments.ts +170 -0
- package/src/resources/recipes.ts +73 -0
- package/src/resources/runtimes.ts +231 -0
- package/src/runner-resources/files.ts +163 -0
- package/src/runner-resources/tasks.ts +156 -0
- package/src/runner.ts +194 -0
- package/src/streaming.ts +57 -0
- package/src/utils.ts +12 -5
- package/dist/ai-sdk-integration.d.ts +0 -123
- package/dist/ai-sdk-integration.d.ts.map +0 -1
- package/dist/ai-sdk-integration.js +0 -475
- package/dist/anthropic.d.ts.map +0 -1
- package/dist/claude-hooks.d.ts.map +0 -1
- package/dist/claude-wrapper.d.ts.map +0 -1
- package/dist/converters/ai-sdk.d.ts +0 -65
- package/dist/converters/ai-sdk.d.ts.map +0 -1
- package/dist/converters/ai-sdk.js +0 -261
- package/dist/langchain-handler.d.ts.map +0 -1
- package/dist/mastra-exporter.d.ts.map +0 -1
- package/dist/span-processor.d.ts.map +0 -1
- package/dist/tracing-processor.d.ts.map +0 -1
- package/src/ai-sdk-integration.ts +0 -691
- package/src/converters/ai-sdk.ts +0 -323
- /package/dist/{claude-wrapper.d.ts → otel/claude-wrapper.d.ts} +0 -0
|
@@ -9,10 +9,12 @@
|
|
|
9
9
|
|
|
10
10
|
import {
|
|
11
11
|
context as otelContext,
|
|
12
|
+
propagation,
|
|
12
13
|
trace as otelTrace,
|
|
13
14
|
Span as OtelSpan,
|
|
14
15
|
SpanKind,
|
|
15
16
|
SpanStatusCode,
|
|
17
|
+
type Attributes,
|
|
16
18
|
} from "@opentelemetry/api";
|
|
17
19
|
import {
|
|
18
20
|
BasicTracerProvider,
|
|
@@ -28,12 +30,12 @@ import {
|
|
|
28
30
|
} from "@opentelemetry/resources";
|
|
29
31
|
import { ATTR_SERVICE_NAME } from "@opentelemetry/semantic-conventions";
|
|
30
32
|
|
|
31
|
-
import { logger, withOtlpHttpsProxy } from "
|
|
32
|
-
import { VERSION } from "
|
|
33
|
+
import { logger, withOtlpHttpsProxy } from "../utils.js";
|
|
34
|
+
import { VERSION } from "../version.js";
|
|
33
35
|
import {
|
|
34
36
|
convertClaudeSessionToOtelAttributes,
|
|
35
37
|
type ClaudeContentBlock,
|
|
36
|
-
} from "
|
|
38
|
+
} from "../converters/claude.js";
|
|
37
39
|
|
|
38
40
|
// ---------------------------------------------------------------------------
|
|
39
41
|
// Claude Agent SDK Hook types
|
|
@@ -241,6 +243,8 @@ export interface ClaudeAssistantMessage {
|
|
|
241
243
|
usage?: {
|
|
242
244
|
input_tokens?: number;
|
|
243
245
|
output_tokens?: number;
|
|
246
|
+
cache_read_input_tokens?: number;
|
|
247
|
+
cache_creation_input_tokens?: number;
|
|
244
248
|
};
|
|
245
249
|
content?: Array<{ type: string; text?: string }>;
|
|
246
250
|
};
|
|
@@ -271,12 +275,16 @@ export interface ClaudeHooksAdvancedOptions {
|
|
|
271
275
|
export interface IntrospectionClaudeHooksOptions {
|
|
272
276
|
/** Authentication token (env: INTROSPECTION_TOKEN) */
|
|
273
277
|
token?: string;
|
|
274
|
-
/** Base URL for the API (env:
|
|
278
|
+
/** Base URL for the API (env: INTROSPECTION_BASE_OTEL_URL) */
|
|
275
279
|
baseUrl?: string;
|
|
276
280
|
/** Service name for the OTel resource (defaults to "claude-agent") */
|
|
277
281
|
serviceName?: string;
|
|
278
282
|
/** Agent name set on session spans as gen_ai.agent.name (defaults to serviceName) */
|
|
279
283
|
agentName?: string;
|
|
284
|
+
/** Agent ID set on session spans as gen_ai.agent.id */
|
|
285
|
+
agentId?: string;
|
|
286
|
+
/** Conversation ID set on session spans as gen_ai.conversation.id */
|
|
287
|
+
conversationId?: string;
|
|
280
288
|
/** Additional headers to include in requests */
|
|
281
289
|
additionalHeaders?: Record<string, string>;
|
|
282
290
|
/** Advanced options for testing and customization */
|
|
@@ -319,6 +327,8 @@ export class IntrospectionClaudeHooks {
|
|
|
319
327
|
private _tracerProvider: BasicTracerProvider;
|
|
320
328
|
private _tracer: ReturnType<BasicTracerProvider["getTracer"]>;
|
|
321
329
|
private _agentName: string;
|
|
330
|
+
private _agentId?: string;
|
|
331
|
+
private _conversationId?: string;
|
|
322
332
|
private _sessionSpans: Map<string, OtelSpan> = new Map();
|
|
323
333
|
private _toolSpans: Map<string, OtelSpan> = new Map();
|
|
324
334
|
private _subagentSpans: Map<string, OtelSpan> = new Map();
|
|
@@ -327,6 +337,8 @@ export class IntrospectionClaudeHooks {
|
|
|
327
337
|
{
|
|
328
338
|
input: number;
|
|
329
339
|
output: number;
|
|
340
|
+
cacheRead: number;
|
|
341
|
+
cacheCreation: number;
|
|
330
342
|
cost?: number;
|
|
331
343
|
model?: string;
|
|
332
344
|
inputPrompt?: string;
|
|
@@ -343,6 +355,8 @@ export class IntrospectionClaudeHooks {
|
|
|
343
355
|
const advanced = options.advanced;
|
|
344
356
|
const serviceName = options.serviceName || "claude-agent";
|
|
345
357
|
this._agentName = options.agentName || serviceName;
|
|
358
|
+
this._agentId = options.agentId;
|
|
359
|
+
this._conversationId = options.conversationId;
|
|
346
360
|
const resource = defaultResource().merge(
|
|
347
361
|
resourceFromAttributes({ [ATTR_SERVICE_NAME]: serviceName }),
|
|
348
362
|
);
|
|
@@ -355,7 +369,7 @@ export class IntrospectionClaudeHooks {
|
|
|
355
369
|
|
|
356
370
|
const baseUrl =
|
|
357
371
|
options.baseUrl ||
|
|
358
|
-
process.env.
|
|
372
|
+
process.env.INTROSPECTION_BASE_OTEL_URL ||
|
|
359
373
|
"https://otel.introspection.dev";
|
|
360
374
|
|
|
361
375
|
const headers: Record<string, string> = {
|
|
@@ -455,6 +469,32 @@ export class IntrospectionClaudeHooks {
|
|
|
455
469
|
};
|
|
456
470
|
}
|
|
457
471
|
|
|
472
|
+
/**
|
|
473
|
+
* Resolve effective agent / conversation identity for a session, in order
|
|
474
|
+
* of precedence: OTel baggage on the active context > constructor option >
|
|
475
|
+
* the Claude session ID. Lets callers override identity per-invocation via
|
|
476
|
+
* `IntrospectionClient.withAgent()` / `.withConversation()` without
|
|
477
|
+
* having to construct a new hooks instance per call.
|
|
478
|
+
*
|
|
479
|
+
* Requires an active context manager — see {@link setupTracing}.
|
|
480
|
+
*/
|
|
481
|
+
private _resolveIdentity(sessionId: string): {
|
|
482
|
+
agentName: string;
|
|
483
|
+
agentId?: string;
|
|
484
|
+
conversationId: string;
|
|
485
|
+
} {
|
|
486
|
+
const baggage = propagation.getBaggage(otelContext.active());
|
|
487
|
+
const baggageAgentName = baggage?.getEntry("gen_ai.agent.name")?.value;
|
|
488
|
+
const baggageAgentId = baggage?.getEntry("gen_ai.agent.id")?.value;
|
|
489
|
+
const baggageConvId = baggage?.getEntry("gen_ai.conversation.id")?.value;
|
|
490
|
+
|
|
491
|
+
return {
|
|
492
|
+
agentName: baggageAgentName || this._agentName,
|
|
493
|
+
agentId: baggageAgentId || this._agentId,
|
|
494
|
+
conversationId: baggageConvId || this._conversationId || sessionId,
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
|
|
458
498
|
/**
|
|
459
499
|
* Set the input prompt for a session so it appears as
|
|
460
500
|
* `gen_ai.input.messages` on the session span.
|
|
@@ -470,6 +510,8 @@ export class IntrospectionClaudeHooks {
|
|
|
470
510
|
const existing = this._sessionUsage.get(sessionId) || {
|
|
471
511
|
input: 0,
|
|
472
512
|
output: 0,
|
|
513
|
+
cacheRead: 0,
|
|
514
|
+
cacheCreation: 0,
|
|
473
515
|
};
|
|
474
516
|
existing.inputPrompt = prompt;
|
|
475
517
|
this._sessionUsage.set(sessionId, existing);
|
|
@@ -496,12 +538,17 @@ export class IntrospectionClaudeHooks {
|
|
|
496
538
|
const existing = this._sessionUsage.get(sessionId) || {
|
|
497
539
|
input: 0,
|
|
498
540
|
output: 0,
|
|
541
|
+
cacheRead: 0,
|
|
542
|
+
cacheCreation: 0,
|
|
499
543
|
};
|
|
500
544
|
existing.systemInstructions = instructions;
|
|
501
545
|
this._sessionUsage.set(sessionId, existing);
|
|
502
546
|
} else {
|
|
503
547
|
this._pendingSystemInstructions = instructions;
|
|
504
548
|
}
|
|
549
|
+
logger.info(
|
|
550
|
+
`System instructions set (${instructions.length} chars)${sessionId ? ` for session ${sessionId}` : " (pending)"}`,
|
|
551
|
+
);
|
|
505
552
|
}
|
|
506
553
|
|
|
507
554
|
private _pendingSystemInstructions?: string;
|
|
@@ -530,6 +577,8 @@ export class IntrospectionClaudeHooks {
|
|
|
530
577
|
const existing = this._sessionUsage.get(sessionId) || {
|
|
531
578
|
input: 0,
|
|
532
579
|
output: 0,
|
|
580
|
+
cacheRead: 0,
|
|
581
|
+
cacheCreation: 0,
|
|
533
582
|
};
|
|
534
583
|
|
|
535
584
|
// Track usage
|
|
@@ -537,6 +586,8 @@ export class IntrospectionClaudeHooks {
|
|
|
537
586
|
if (usage) {
|
|
538
587
|
existing.input += usage.input_tokens || 0;
|
|
539
588
|
existing.output += usage.output_tokens || 0;
|
|
589
|
+
existing.cacheRead += usage.cache_read_input_tokens || 0;
|
|
590
|
+
existing.cacheCreation += usage.cache_creation_input_tokens || 0;
|
|
540
591
|
if (assistantMsg.message?.model) {
|
|
541
592
|
existing.model = assistantMsg.message.model;
|
|
542
593
|
}
|
|
@@ -575,12 +626,31 @@ export class IntrospectionClaudeHooks {
|
|
|
575
626
|
const existing = this._sessionUsage.get(sessionId) || {
|
|
576
627
|
input: 0,
|
|
577
628
|
output: 0,
|
|
629
|
+
cacheRead: 0,
|
|
630
|
+
cacheCreation: 0,
|
|
578
631
|
};
|
|
579
632
|
|
|
580
633
|
if (resultMsg.usage) {
|
|
581
634
|
// Result message has final totals
|
|
582
635
|
existing.input = resultMsg.usage.input_tokens || existing.input;
|
|
583
636
|
existing.output = resultMsg.usage.output_tokens || existing.output;
|
|
637
|
+
if (resultMsg.usage.cache_read_input_tokens != null) {
|
|
638
|
+
existing.cacheRead = resultMsg.usage.cache_read_input_tokens;
|
|
639
|
+
}
|
|
640
|
+
if (resultMsg.usage.cache_creation_input_tokens != null) {
|
|
641
|
+
existing.cacheCreation = resultMsg.usage.cache_creation_input_tokens;
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
// Fallback: aggregate cache tokens from per-model breakdown when top-level usage omits them
|
|
645
|
+
if (
|
|
646
|
+
resultMsg.modelUsage &&
|
|
647
|
+
existing.cacheRead === 0 &&
|
|
648
|
+
existing.cacheCreation === 0
|
|
649
|
+
) {
|
|
650
|
+
for (const modelData of Object.values(resultMsg.modelUsage)) {
|
|
651
|
+
existing.cacheRead += modelData.cacheReadInputTokens || 0;
|
|
652
|
+
existing.cacheCreation += modelData.cacheCreationInputTokens || 0;
|
|
653
|
+
}
|
|
584
654
|
}
|
|
585
655
|
if (resultMsg.total_cost_usd !== undefined) {
|
|
586
656
|
existing.cost = resultMsg.total_cost_usd;
|
|
@@ -617,16 +687,23 @@ export class IntrospectionClaudeHooks {
|
|
|
617
687
|
}
|
|
618
688
|
|
|
619
689
|
logger.debug(`Starting session span from init message: ${sessionId}`);
|
|
690
|
+
const ids = this._resolveIdentity(sessionId);
|
|
691
|
+
const attrs: Attributes = {
|
|
692
|
+
"gen_ai.system": "anthropic",
|
|
693
|
+
"gen_ai.operation.name": "chat",
|
|
694
|
+
"gen_ai.agent.name": ids.agentName,
|
|
695
|
+
"gen_ai.conversation.id": ids.conversationId,
|
|
696
|
+
"claude.session_id": sessionId,
|
|
697
|
+
"claude.source": "message",
|
|
698
|
+
};
|
|
699
|
+
|
|
700
|
+
if (ids.agentId) {
|
|
701
|
+
attrs["gen_ai.agent.id"] = ids.agentId;
|
|
702
|
+
}
|
|
620
703
|
|
|
621
704
|
const span = this._tracer.startSpan("claude.session", {
|
|
622
705
|
kind: SpanKind.CLIENT,
|
|
623
|
-
attributes:
|
|
624
|
-
"gen_ai.system": "anthropic",
|
|
625
|
-
"gen_ai.operation.name": "chat",
|
|
626
|
-
"gen_ai.agent.name": this._agentName,
|
|
627
|
-
"claude.session_id": sessionId,
|
|
628
|
-
"claude.source": "message",
|
|
629
|
-
},
|
|
706
|
+
attributes: attrs,
|
|
630
707
|
});
|
|
631
708
|
|
|
632
709
|
// Add model if present in init message
|
|
@@ -651,12 +728,14 @@ export class IntrospectionClaudeHooks {
|
|
|
651
728
|
const sessionData: {
|
|
652
729
|
input: number;
|
|
653
730
|
output: number;
|
|
731
|
+
cacheRead: number;
|
|
732
|
+
cacheCreation: number;
|
|
654
733
|
model?: string;
|
|
655
734
|
inputPrompt?: string;
|
|
656
735
|
responseContent?: string;
|
|
657
736
|
toolNames?: string[];
|
|
658
737
|
systemInstructions?: string;
|
|
659
|
-
} = { input: 0, output: 0, model };
|
|
738
|
+
} = { input: 0, output: 0, cacheRead: 0, cacheCreation: 0, model };
|
|
660
739
|
|
|
661
740
|
if (tools && tools.length > 0) {
|
|
662
741
|
sessionData.toolNames = tools;
|
|
@@ -701,6 +780,8 @@ export class IntrospectionClaudeHooks {
|
|
|
701
780
|
model: usage?.model,
|
|
702
781
|
inputTokens: usage?.input,
|
|
703
782
|
outputTokens: usage?.output,
|
|
783
|
+
cacheReadInputTokens: usage?.cacheRead || undefined,
|
|
784
|
+
cacheCreationInputTokens: usage?.cacheCreation || undefined,
|
|
704
785
|
costUsd: usage?.cost,
|
|
705
786
|
stopReason: usage?.stopReason,
|
|
706
787
|
responseId: usage?.responseId,
|
|
@@ -747,15 +828,27 @@ export class IntrospectionClaudeHooks {
|
|
|
747
828
|
const sessionInput = input as SessionStartHookInput;
|
|
748
829
|
logger.debug(`SessionStart hook: ${sessionInput.session_id}`);
|
|
749
830
|
|
|
831
|
+
// Resolve identity via _resolveIdentity so baggage on the active context
|
|
832
|
+
// takes precedence over constructor defaults, matching the message-init
|
|
833
|
+
// path in _startSessionFromMessage. Without this, the SessionStart hook
|
|
834
|
+
// would always stamp the constructor-time agentName / sessionId even
|
|
835
|
+
// when the caller wrapped the query in withAgent() / withConversation().
|
|
836
|
+
const ids = this._resolveIdentity(sessionInput.session_id);
|
|
837
|
+
const attrs: Attributes = {
|
|
838
|
+
"gen_ai.system": "anthropic",
|
|
839
|
+
"gen_ai.operation.name": "chat",
|
|
840
|
+
"gen_ai.agent.name": ids.agentName,
|
|
841
|
+
"gen_ai.conversation.id": ids.conversationId,
|
|
842
|
+
"claude.session_id": sessionInput.session_id,
|
|
843
|
+
"claude.source": sessionInput.source,
|
|
844
|
+
};
|
|
845
|
+
if (ids.agentId) {
|
|
846
|
+
attrs["gen_ai.agent.id"] = ids.agentId;
|
|
847
|
+
}
|
|
848
|
+
|
|
750
849
|
const span = this._tracer.startSpan("claude.session", {
|
|
751
850
|
kind: SpanKind.CLIENT,
|
|
752
|
-
attributes:
|
|
753
|
-
"gen_ai.system": "anthropic",
|
|
754
|
-
"gen_ai.operation.name": "chat",
|
|
755
|
-
"gen_ai.agent.name": this._agentName,
|
|
756
|
-
"claude.session_id": sessionInput.session_id,
|
|
757
|
-
"claude.source": sessionInput.source,
|
|
758
|
-
},
|
|
851
|
+
attributes: attrs,
|
|
759
852
|
});
|
|
760
853
|
|
|
761
854
|
if (sessionInput.model) {
|
|
@@ -771,11 +864,15 @@ export class IntrospectionClaudeHooks {
|
|
|
771
864
|
const sessionUsage: {
|
|
772
865
|
input: number;
|
|
773
866
|
output: number;
|
|
867
|
+
cacheRead: number;
|
|
868
|
+
cacheCreation: number;
|
|
774
869
|
inputPrompt?: string;
|
|
775
870
|
systemInstructions?: string;
|
|
776
871
|
} = {
|
|
777
872
|
input: 0,
|
|
778
873
|
output: 0,
|
|
874
|
+
cacheRead: 0,
|
|
875
|
+
cacheCreation: 0,
|
|
779
876
|
};
|
|
780
877
|
if (this._pendingInputPrompt) {
|
|
781
878
|
sessionUsage.inputPrompt = this._pendingInputPrompt;
|
|
@@ -813,6 +910,8 @@ export class IntrospectionClaudeHooks {
|
|
|
813
910
|
model: usage.model,
|
|
814
911
|
inputTokens: usage.input,
|
|
815
912
|
outputTokens: usage.output,
|
|
913
|
+
cacheReadInputTokens: usage.cacheRead || undefined,
|
|
914
|
+
cacheCreationInputTokens: usage.cacheCreation || undefined,
|
|
816
915
|
costUsd: usage.cost,
|
|
817
916
|
stopReason: usage.stopReason,
|
|
818
917
|
responseId: usage.responseId,
|