@respan/exporter-anthropic-agents 1.0.0
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/README.md +24 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/respan-anthropic-agents-exporter.d.ts +57 -0
- package/dist/respan-anthropic-agents-exporter.js +539 -0
- package/dist/respan-anthropic-agents-exporter.js.map +1 -0
- package/dist/utils.d.ts +15 -0
- package/dist/utils.js +73 -0
- package/dist/utils.js.map +1 -0
- package/package.json +35 -0
package/README.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Respan Exporter for Anthropic Agent SDK
|
|
2
|
+
|
|
3
|
+
**[respan.ai](https://respan.ai)** | **[Documentation](https://docs.respan.ai)**
|
|
4
|
+
|
|
5
|
+
Exporter for Anthropic Agent SDK telemetry to Respan.
|
|
6
|
+
|
|
7
|
+
## Quickstart
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
import { RespanAnthropicAgentsExporter } from "@respan/exporter-anthropic-agents";
|
|
11
|
+
|
|
12
|
+
const exporter = new RespanAnthropicAgentsExporter();
|
|
13
|
+
|
|
14
|
+
for await (const message of exporter.query({
|
|
15
|
+
prompt: "Review this repository and summarize architecture.",
|
|
16
|
+
options: {
|
|
17
|
+
allowedTools: ["Read", "Glob", "Grep"],
|
|
18
|
+
permissionMode: "acceptEdits",
|
|
19
|
+
},
|
|
20
|
+
})) {
|
|
21
|
+
console.log(message);
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { RespanAnthropicAgentsExporter, RespanSpanExporter, instrumentOptions, } from "./respan-anthropic-agents-exporter.js";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,uCAAuC,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export declare class RespanAnthropicAgentsExporter {
|
|
2
|
+
private apiKey;
|
|
3
|
+
private endpoint;
|
|
4
|
+
private maxRetries;
|
|
5
|
+
private baseDelaySeconds;
|
|
6
|
+
private maxDelaySeconds;
|
|
7
|
+
private timeoutMs;
|
|
8
|
+
private sessions;
|
|
9
|
+
private lastSessionId;
|
|
10
|
+
constructor({ apiKey, endpoint, maxRetries, baseDelaySeconds, maxDelaySeconds, timeoutMs, }?: {
|
|
11
|
+
apiKey?: string | null;
|
|
12
|
+
endpoint?: string;
|
|
13
|
+
maxRetries?: number;
|
|
14
|
+
baseDelaySeconds?: number;
|
|
15
|
+
maxDelaySeconds?: number;
|
|
16
|
+
timeoutMs?: number;
|
|
17
|
+
});
|
|
18
|
+
setEndpoint(endpoint: string): void;
|
|
19
|
+
createHooks(existingHooks?: Record<string, unknown[]>): Record<string, unknown[]>;
|
|
20
|
+
withOptions(options?: Record<string, unknown>): Record<string, unknown>;
|
|
21
|
+
query({ prompt, options, }: {
|
|
22
|
+
prompt: string | AsyncIterable<any>;
|
|
23
|
+
options?: Record<string, unknown>;
|
|
24
|
+
}): AsyncGenerator<unknown, void, unknown>;
|
|
25
|
+
trackMessage({ message, sessionId, }: {
|
|
26
|
+
message: any;
|
|
27
|
+
sessionId?: string;
|
|
28
|
+
}): Promise<void>;
|
|
29
|
+
private appendHook;
|
|
30
|
+
private onUserPromptSubmit;
|
|
31
|
+
private onPreToolUse;
|
|
32
|
+
private onPostToolUse;
|
|
33
|
+
private onSubagentStop;
|
|
34
|
+
private onStop;
|
|
35
|
+
private handleSystemMessage;
|
|
36
|
+
private handleUserMessage;
|
|
37
|
+
private handleAssistantMessage;
|
|
38
|
+
private handleResultMessage;
|
|
39
|
+
private resolveMessageSessionId;
|
|
40
|
+
private extractSessionIdFromSystemMessage;
|
|
41
|
+
private extractSessionIdFromHookInput;
|
|
42
|
+
private buildTraceNameFromPrompt;
|
|
43
|
+
private ensureSessionState;
|
|
44
|
+
private emitRootSpan;
|
|
45
|
+
private createPayload;
|
|
46
|
+
private toSerializableMetadata;
|
|
47
|
+
private toSerializableToolCalls;
|
|
48
|
+
private toSerializableValue;
|
|
49
|
+
private sendPayloads;
|
|
50
|
+
private coerceInteger;
|
|
51
|
+
}
|
|
52
|
+
export declare class RespanSpanExporter extends RespanAnthropicAgentsExporter {
|
|
53
|
+
}
|
|
54
|
+
export declare function instrumentOptions({ exporter, options, }: {
|
|
55
|
+
exporter: RespanAnthropicAgentsExporter;
|
|
56
|
+
options?: Record<string, unknown>;
|
|
57
|
+
}): Record<string, unknown>;
|
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
import { query } from "@anthropic-ai/claude-agent-sdk";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { RespanLogType, RESPAN_TRACING_INGEST_ENDPOINT, fetchWithRetry, } from "@respan/respan-sdk";
|
|
4
|
+
import { buildTraceNameFromPrompt, coerceInteger, toSerializableMetadata, toSerializableToolCalls, toSerializableValue, } from "./utils.js";
|
|
5
|
+
export class RespanAnthropicAgentsExporter {
|
|
6
|
+
apiKey;
|
|
7
|
+
endpoint;
|
|
8
|
+
maxRetries;
|
|
9
|
+
baseDelaySeconds;
|
|
10
|
+
maxDelaySeconds;
|
|
11
|
+
timeoutMs;
|
|
12
|
+
sessions;
|
|
13
|
+
lastSessionId;
|
|
14
|
+
constructor({ apiKey = process.env.RESPAN_API_KEY || process.env.KEYWORDSAI_API_KEY || null, endpoint, maxRetries = 3, baseDelaySeconds = 1, maxDelaySeconds = 30, timeoutMs = 15000, } = {}) {
|
|
15
|
+
this.apiKey = apiKey;
|
|
16
|
+
this.endpoint = endpoint || RESPAN_TRACING_INGEST_ENDPOINT;
|
|
17
|
+
this.maxRetries = maxRetries;
|
|
18
|
+
this.baseDelaySeconds = baseDelaySeconds;
|
|
19
|
+
this.maxDelaySeconds = maxDelaySeconds;
|
|
20
|
+
this.timeoutMs = timeoutMs;
|
|
21
|
+
this.sessions = new Map();
|
|
22
|
+
this.lastSessionId = null;
|
|
23
|
+
}
|
|
24
|
+
setEndpoint(endpoint) {
|
|
25
|
+
this.endpoint = endpoint;
|
|
26
|
+
}
|
|
27
|
+
createHooks(existingHooks = {}) {
|
|
28
|
+
const mergedHooks = { ...existingHooks };
|
|
29
|
+
this.appendHook({
|
|
30
|
+
hooks: mergedHooks,
|
|
31
|
+
eventName: "UserPromptSubmit",
|
|
32
|
+
matcher: undefined,
|
|
33
|
+
callback: this.onUserPromptSubmit.bind(this),
|
|
34
|
+
});
|
|
35
|
+
this.appendHook({
|
|
36
|
+
hooks: mergedHooks,
|
|
37
|
+
eventName: "PreToolUse",
|
|
38
|
+
matcher: undefined,
|
|
39
|
+
callback: this.onPreToolUse.bind(this),
|
|
40
|
+
});
|
|
41
|
+
this.appendHook({
|
|
42
|
+
hooks: mergedHooks,
|
|
43
|
+
eventName: "PostToolUse",
|
|
44
|
+
matcher: undefined,
|
|
45
|
+
callback: this.onPostToolUse.bind(this),
|
|
46
|
+
});
|
|
47
|
+
this.appendHook({
|
|
48
|
+
hooks: mergedHooks,
|
|
49
|
+
eventName: "SubagentStop",
|
|
50
|
+
matcher: undefined,
|
|
51
|
+
callback: this.onSubagentStop.bind(this),
|
|
52
|
+
});
|
|
53
|
+
this.appendHook({
|
|
54
|
+
hooks: mergedHooks,
|
|
55
|
+
eventName: "Stop",
|
|
56
|
+
matcher: undefined,
|
|
57
|
+
callback: this.onStop.bind(this),
|
|
58
|
+
});
|
|
59
|
+
return mergedHooks;
|
|
60
|
+
}
|
|
61
|
+
withOptions(options = {}) {
|
|
62
|
+
const instrumentedOptions = { ...options };
|
|
63
|
+
const optionHooks = options.hooks && typeof options.hooks === "object"
|
|
64
|
+
? options.hooks
|
|
65
|
+
: {};
|
|
66
|
+
instrumentedOptions.hooks = this.createHooks(optionHooks);
|
|
67
|
+
return instrumentedOptions;
|
|
68
|
+
}
|
|
69
|
+
async *query({ prompt, options = {}, }) {
|
|
70
|
+
const instrumentedOptions = this.withOptions(options);
|
|
71
|
+
for await (const message of query({
|
|
72
|
+
prompt,
|
|
73
|
+
options: instrumentedOptions,
|
|
74
|
+
})) {
|
|
75
|
+
const resolvedSessionId = this.resolveMessageSessionId({
|
|
76
|
+
message,
|
|
77
|
+
fallbackSessionId: this.lastSessionId,
|
|
78
|
+
});
|
|
79
|
+
await this.trackMessage({
|
|
80
|
+
message,
|
|
81
|
+
sessionId: resolvedSessionId || undefined,
|
|
82
|
+
});
|
|
83
|
+
yield message;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async trackMessage({ message, sessionId, }) {
|
|
87
|
+
if (!message || typeof message !== "object") {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (message.type === "system") {
|
|
91
|
+
this.handleSystemMessage({ message, sessionId });
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (message.type === "assistant") {
|
|
95
|
+
await this.handleAssistantMessage({ message, sessionId });
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (message.type === "result") {
|
|
99
|
+
await this.handleResultMessage({ message });
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (message.type === "user") {
|
|
103
|
+
await this.handleUserMessage({ message, sessionId });
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (message.type === "stream_event") {
|
|
107
|
+
const streamSessionId = message.session_id || message.sessionId || sessionId || null;
|
|
108
|
+
if (streamSessionId) {
|
|
109
|
+
this.lastSessionId = String(streamSessionId);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
appendHook({ hooks, eventName, matcher, callback, }) {
|
|
114
|
+
const eventHooks = hooks[eventName] ? [...hooks[eventName]] : [];
|
|
115
|
+
const callbackName = callback.name;
|
|
116
|
+
const hasExistingCallback = eventHooks.some((eventHook) => {
|
|
117
|
+
if (!eventHook || typeof eventHook !== "object") {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
const normalizedHook = eventHook;
|
|
121
|
+
if (normalizedHook.matcher !== matcher) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
if (!Array.isArray(normalizedHook.hooks)) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
return normalizedHook.hooks.some((existingCallback) => {
|
|
128
|
+
return existingCallback.name === callbackName;
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
if (hasExistingCallback) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (matcher) {
|
|
135
|
+
eventHooks.push({ matcher, hooks: [callback] });
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
eventHooks.push({ hooks: [callback] });
|
|
139
|
+
}
|
|
140
|
+
hooks[eventName] = eventHooks;
|
|
141
|
+
}
|
|
142
|
+
async onUserPromptSubmit(input, toolUseId) {
|
|
143
|
+
const sessionId = this.extractSessionIdFromHookInput({ input });
|
|
144
|
+
const prompt = input.prompt;
|
|
145
|
+
const traceName = this.buildTraceNameFromPrompt({ prompt });
|
|
146
|
+
const sessionState = this.ensureSessionState({ sessionId, traceName });
|
|
147
|
+
const now = new Date();
|
|
148
|
+
const payload = this.createPayload({
|
|
149
|
+
sessionState,
|
|
150
|
+
spanUniqueId: randomUUID(),
|
|
151
|
+
spanParentId: sessionState.traceId,
|
|
152
|
+
spanName: "user_prompt",
|
|
153
|
+
logType: RespanLogType.TASK,
|
|
154
|
+
startTime: now,
|
|
155
|
+
timestamp: now,
|
|
156
|
+
inputValue: prompt,
|
|
157
|
+
metadata: { hook_event_name: "UserPromptSubmit" },
|
|
158
|
+
});
|
|
159
|
+
await this.sendPayloads({ payloads: [payload] });
|
|
160
|
+
return {};
|
|
161
|
+
}
|
|
162
|
+
async onPreToolUse(input, toolUseId) {
|
|
163
|
+
const sessionId = this.extractSessionIdFromHookInput({ input });
|
|
164
|
+
const sessionState = this.ensureSessionState({ sessionId });
|
|
165
|
+
const resolvedToolUseId = String(input.tool_use_id || toolUseId || randomUUID());
|
|
166
|
+
sessionState.pendingTools.set(resolvedToolUseId, {
|
|
167
|
+
spanUniqueId: randomUUID(),
|
|
168
|
+
startedAt: new Date(),
|
|
169
|
+
toolName: String(input.tool_name || RespanLogType.TOOL),
|
|
170
|
+
toolInput: input.tool_input,
|
|
171
|
+
});
|
|
172
|
+
return {};
|
|
173
|
+
}
|
|
174
|
+
async onPostToolUse(input, toolUseId) {
|
|
175
|
+
const sessionId = this.extractSessionIdFromHookInput({ input });
|
|
176
|
+
const sessionState = this.ensureSessionState({ sessionId });
|
|
177
|
+
const resolvedToolUseId = String(input.tool_use_id || toolUseId || randomUUID());
|
|
178
|
+
const pendingToolState = sessionState.pendingTools.get(resolvedToolUseId) || {
|
|
179
|
+
spanUniqueId: randomUUID(),
|
|
180
|
+
startedAt: new Date(),
|
|
181
|
+
toolName: String(input.tool_name || RespanLogType.TOOL),
|
|
182
|
+
toolInput: input.tool_input,
|
|
183
|
+
};
|
|
184
|
+
sessionState.pendingTools.delete(resolvedToolUseId);
|
|
185
|
+
const toolName = String(input.tool_name || pendingToolState.toolName || RespanLogType.TOOL);
|
|
186
|
+
const payload = this.createPayload({
|
|
187
|
+
sessionState,
|
|
188
|
+
spanUniqueId: pendingToolState.spanUniqueId,
|
|
189
|
+
spanParentId: sessionState.traceId,
|
|
190
|
+
spanName: toolName,
|
|
191
|
+
logType: RespanLogType.TOOL,
|
|
192
|
+
startTime: pendingToolState.startedAt,
|
|
193
|
+
timestamp: new Date(),
|
|
194
|
+
inputValue: pendingToolState.toolInput,
|
|
195
|
+
outputValue: input.tool_response,
|
|
196
|
+
metadata: {
|
|
197
|
+
hook_event_name: "PostToolUse",
|
|
198
|
+
tool_use_id: resolvedToolUseId,
|
|
199
|
+
},
|
|
200
|
+
spanTools: [toolName],
|
|
201
|
+
});
|
|
202
|
+
await this.sendPayloads({ payloads: [payload] });
|
|
203
|
+
return {};
|
|
204
|
+
}
|
|
205
|
+
async onSubagentStop(input, toolUseId) {
|
|
206
|
+
const sessionId = this.extractSessionIdFromHookInput({ input });
|
|
207
|
+
const sessionState = this.ensureSessionState({ sessionId });
|
|
208
|
+
const now = new Date();
|
|
209
|
+
const payload = this.createPayload({
|
|
210
|
+
sessionState,
|
|
211
|
+
spanUniqueId: randomUUID(),
|
|
212
|
+
spanParentId: sessionState.traceId,
|
|
213
|
+
spanName: "subagent_stop",
|
|
214
|
+
logType: RespanLogType.TASK,
|
|
215
|
+
startTime: now,
|
|
216
|
+
timestamp: now,
|
|
217
|
+
metadata: {
|
|
218
|
+
hook_event_name: "SubagentStop",
|
|
219
|
+
agent_id: input.agent_id,
|
|
220
|
+
agent_type: input.agent_type,
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
await this.sendPayloads({ payloads: [payload] });
|
|
224
|
+
return {};
|
|
225
|
+
}
|
|
226
|
+
async onStop(input, toolUseId) {
|
|
227
|
+
return {};
|
|
228
|
+
}
|
|
229
|
+
handleSystemMessage({ message, sessionId, }) {
|
|
230
|
+
const resolvedSessionId = sessionId ||
|
|
231
|
+
this.extractSessionIdFromSystemMessage({ message }) ||
|
|
232
|
+
this.lastSessionId;
|
|
233
|
+
if (!resolvedSessionId) {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
this.lastSessionId = resolvedSessionId;
|
|
237
|
+
this.ensureSessionState({ sessionId: resolvedSessionId });
|
|
238
|
+
}
|
|
239
|
+
async handleUserMessage({ message, sessionId, }) {
|
|
240
|
+
const resolvedSessionId = sessionId || this.lastSessionId;
|
|
241
|
+
if (!resolvedSessionId) {
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
const sessionState = this.ensureSessionState({ sessionId: resolvedSessionId });
|
|
245
|
+
const now = new Date();
|
|
246
|
+
const payload = this.createPayload({
|
|
247
|
+
sessionState,
|
|
248
|
+
spanUniqueId: randomUUID(),
|
|
249
|
+
spanParentId: sessionState.traceId,
|
|
250
|
+
spanName: "user_message",
|
|
251
|
+
logType: RespanLogType.TASK,
|
|
252
|
+
startTime: now,
|
|
253
|
+
timestamp: now,
|
|
254
|
+
inputValue: message,
|
|
255
|
+
metadata: { source: "stream_user_message" },
|
|
256
|
+
});
|
|
257
|
+
await this.sendPayloads({ payloads: [payload] });
|
|
258
|
+
}
|
|
259
|
+
async handleAssistantMessage({ message, sessionId, }) {
|
|
260
|
+
const resolvedSessionId = sessionId || this.lastSessionId;
|
|
261
|
+
if (!resolvedSessionId) {
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
const sessionState = this.ensureSessionState({ sessionId: resolvedSessionId });
|
|
265
|
+
const inner = message?.message && typeof message.message === "object" ? message.message : message;
|
|
266
|
+
const content = inner?.content;
|
|
267
|
+
const usage = (message?.usage && typeof message.usage === "object"
|
|
268
|
+
? message.usage
|
|
269
|
+
: inner?.usage && typeof inner.usage === "object"
|
|
270
|
+
? inner.usage
|
|
271
|
+
: {});
|
|
272
|
+
const promptTokens = this.coerceInteger({
|
|
273
|
+
value: usage.input_tokens ?? usage.prompt_tokens,
|
|
274
|
+
});
|
|
275
|
+
const completionTokens = this.coerceInteger({
|
|
276
|
+
value: usage.output_tokens ?? usage.completion_tokens,
|
|
277
|
+
});
|
|
278
|
+
let totalRequestTokens = this.coerceInteger({ value: usage.total_tokens });
|
|
279
|
+
if (totalRequestTokens === null && (promptTokens !== null || completionTokens !== null)) {
|
|
280
|
+
totalRequestTokens = (promptTokens ?? 0) + (completionTokens ?? 0);
|
|
281
|
+
}
|
|
282
|
+
const promptCacheHitTokens = this.coerceInteger({
|
|
283
|
+
value: usage.cache_read_input_tokens,
|
|
284
|
+
});
|
|
285
|
+
const promptCacheCreationTokens = this.coerceInteger({
|
|
286
|
+
value: usage.cache_creation_input_tokens,
|
|
287
|
+
});
|
|
288
|
+
const now = new Date();
|
|
289
|
+
const payload = this.createPayload({
|
|
290
|
+
sessionState,
|
|
291
|
+
spanUniqueId: (message?.id && String(message.id)) || randomUUID(),
|
|
292
|
+
spanParentId: sessionState.traceId,
|
|
293
|
+
spanName: "assistant_message",
|
|
294
|
+
logType: RespanLogType.GENERATION,
|
|
295
|
+
startTime: now,
|
|
296
|
+
timestamp: now,
|
|
297
|
+
inputValue: message,
|
|
298
|
+
outputValue: content !== undefined ? content : message,
|
|
299
|
+
model: (inner?.model && String(inner.model)) || (message?.model && String(message.model)) || null,
|
|
300
|
+
metadata: { source: "stream_assistant_message" },
|
|
301
|
+
promptTokens,
|
|
302
|
+
completionTokens,
|
|
303
|
+
totalRequestTokens,
|
|
304
|
+
promptCacheHitTokens,
|
|
305
|
+
promptCacheCreationTokens,
|
|
306
|
+
});
|
|
307
|
+
await this.sendPayloads({ payloads: [payload] });
|
|
308
|
+
}
|
|
309
|
+
async handleResultMessage({ message }) {
|
|
310
|
+
const sessionId = String(message.session_id || message.sessionId || this.lastSessionId || randomUUID());
|
|
311
|
+
const sessionState = this.ensureSessionState({ sessionId });
|
|
312
|
+
const usage = (message.usage && typeof message.usage === "object"
|
|
313
|
+
? message.usage
|
|
314
|
+
: {});
|
|
315
|
+
const promptTokens = this.coerceInteger({
|
|
316
|
+
value: usage.input_tokens ?? usage.prompt_tokens,
|
|
317
|
+
});
|
|
318
|
+
const completionTokens = this.coerceInteger({
|
|
319
|
+
value: usage.output_tokens ?? usage.completion_tokens,
|
|
320
|
+
});
|
|
321
|
+
let totalRequestTokens = this.coerceInteger({
|
|
322
|
+
value: usage.total_tokens,
|
|
323
|
+
});
|
|
324
|
+
if (totalRequestTokens === null && (promptTokens !== null || completionTokens !== null)) {
|
|
325
|
+
totalRequestTokens = (promptTokens ?? 0) + (completionTokens ?? 0);
|
|
326
|
+
}
|
|
327
|
+
const promptCacheHitTokens = this.coerceInteger({
|
|
328
|
+
value: usage.cache_read_input_tokens,
|
|
329
|
+
});
|
|
330
|
+
const promptCacheCreationTokens = this.coerceInteger({
|
|
331
|
+
value: usage.cache_creation_input_tokens,
|
|
332
|
+
});
|
|
333
|
+
const statusCode = message.is_error ? 500 : 200;
|
|
334
|
+
const errorMessage = message.is_error
|
|
335
|
+
? `agent_result_error:${String(message.subtype || "error")}`
|
|
336
|
+
: undefined;
|
|
337
|
+
const now = new Date();
|
|
338
|
+
const payload = this.createPayload({
|
|
339
|
+
sessionState,
|
|
340
|
+
spanUniqueId: randomUUID(),
|
|
341
|
+
spanParentId: sessionState.traceId,
|
|
342
|
+
spanName: `result:${String(message.subtype || "unknown")}`,
|
|
343
|
+
logType: RespanLogType.AGENT,
|
|
344
|
+
startTime: now,
|
|
345
|
+
timestamp: now,
|
|
346
|
+
outputValue: message.result || message.subtype,
|
|
347
|
+
metadata: {
|
|
348
|
+
duration_ms: message.duration_ms,
|
|
349
|
+
duration_api_ms: message.duration_api_ms,
|
|
350
|
+
num_turns: message.num_turns,
|
|
351
|
+
total_cost_usd: message.total_cost_usd,
|
|
352
|
+
structured_output: message.structured_output,
|
|
353
|
+
},
|
|
354
|
+
promptTokens,
|
|
355
|
+
completionTokens,
|
|
356
|
+
totalRequestTokens,
|
|
357
|
+
promptCacheHitTokens,
|
|
358
|
+
promptCacheCreationTokens,
|
|
359
|
+
statusCode,
|
|
360
|
+
errorMessage,
|
|
361
|
+
});
|
|
362
|
+
await this.sendPayloads({ payloads: [payload] });
|
|
363
|
+
sessionState.pendingTools.clear();
|
|
364
|
+
}
|
|
365
|
+
resolveMessageSessionId({ message, fallbackSessionId, }) {
|
|
366
|
+
if (!message || typeof message !== "object") {
|
|
367
|
+
return fallbackSessionId || null;
|
|
368
|
+
}
|
|
369
|
+
const directSessionId = message.session_id || message.sessionId;
|
|
370
|
+
if (directSessionId) {
|
|
371
|
+
this.lastSessionId = String(directSessionId);
|
|
372
|
+
return String(directSessionId);
|
|
373
|
+
}
|
|
374
|
+
if (message.type === "system") {
|
|
375
|
+
const systemSessionId = this.extractSessionIdFromSystemMessage({ message });
|
|
376
|
+
if (systemSessionId) {
|
|
377
|
+
this.lastSessionId = systemSessionId;
|
|
378
|
+
return systemSessionId;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
if (fallbackSessionId) {
|
|
382
|
+
return fallbackSessionId;
|
|
383
|
+
}
|
|
384
|
+
return null;
|
|
385
|
+
}
|
|
386
|
+
extractSessionIdFromSystemMessage({ message }) {
|
|
387
|
+
if (!message || typeof message !== "object") {
|
|
388
|
+
return null;
|
|
389
|
+
}
|
|
390
|
+
const data = message.data && typeof message.data === "object" ? message.data : {};
|
|
391
|
+
const rawSessionId = data.session_id || data.sessionId || data.id || null;
|
|
392
|
+
if (!rawSessionId) {
|
|
393
|
+
return null;
|
|
394
|
+
}
|
|
395
|
+
return String(rawSessionId);
|
|
396
|
+
}
|
|
397
|
+
extractSessionIdFromHookInput({ input, }) {
|
|
398
|
+
const hookSessionId = input.session_id || input.sessionId;
|
|
399
|
+
if (hookSessionId) {
|
|
400
|
+
const normalizedSessionId = String(hookSessionId);
|
|
401
|
+
this.lastSessionId = normalizedSessionId;
|
|
402
|
+
return normalizedSessionId;
|
|
403
|
+
}
|
|
404
|
+
if (this.lastSessionId) {
|
|
405
|
+
return this.lastSessionId;
|
|
406
|
+
}
|
|
407
|
+
const generatedSessionId = randomUUID();
|
|
408
|
+
this.lastSessionId = generatedSessionId;
|
|
409
|
+
return generatedSessionId;
|
|
410
|
+
}
|
|
411
|
+
buildTraceNameFromPrompt({ prompt }) {
|
|
412
|
+
return buildTraceNameFromPrompt({ prompt });
|
|
413
|
+
}
|
|
414
|
+
ensureSessionState({ sessionId, traceName, }) {
|
|
415
|
+
const existingSessionState = this.sessions.get(sessionId);
|
|
416
|
+
if (existingSessionState) {
|
|
417
|
+
if (traceName &&
|
|
418
|
+
existingSessionState.traceName.startsWith("anthropic-session-")) {
|
|
419
|
+
existingSessionState.traceName = traceName;
|
|
420
|
+
}
|
|
421
|
+
this.lastSessionId = sessionId;
|
|
422
|
+
return existingSessionState;
|
|
423
|
+
}
|
|
424
|
+
const resolvedTraceName = traceName && traceName.trim().length > 0
|
|
425
|
+
? traceName.trim()
|
|
426
|
+
: `anthropic-session-${sessionId.slice(0, 12)}`;
|
|
427
|
+
const newSessionState = {
|
|
428
|
+
sessionId,
|
|
429
|
+
traceId: sessionId,
|
|
430
|
+
traceName: resolvedTraceName,
|
|
431
|
+
startedAt: new Date(),
|
|
432
|
+
pendingTools: new Map(),
|
|
433
|
+
isRootEmitted: false,
|
|
434
|
+
};
|
|
435
|
+
this.sessions.set(sessionId, newSessionState);
|
|
436
|
+
this.lastSessionId = sessionId;
|
|
437
|
+
void this.emitRootSpan({ sessionState: newSessionState });
|
|
438
|
+
return newSessionState;
|
|
439
|
+
}
|
|
440
|
+
async emitRootSpan({ sessionState, }) {
|
|
441
|
+
if (sessionState.isRootEmitted) {
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
const payload = this.createPayload({
|
|
445
|
+
sessionState,
|
|
446
|
+
spanUniqueId: sessionState.traceId,
|
|
447
|
+
spanParentId: undefined,
|
|
448
|
+
spanName: sessionState.traceName,
|
|
449
|
+
logType: RespanLogType.AGENT,
|
|
450
|
+
startTime: sessionState.startedAt,
|
|
451
|
+
timestamp: sessionState.startedAt,
|
|
452
|
+
metadata: { source: "session_root" },
|
|
453
|
+
});
|
|
454
|
+
await this.sendPayloads({ payloads: [payload] });
|
|
455
|
+
sessionState.isRootEmitted = true;
|
|
456
|
+
}
|
|
457
|
+
createPayload({ sessionState, spanUniqueId, spanParentId, spanName, logType, startTime, timestamp, inputValue, outputValue, model, metadata, spanTools, toolCalls, promptTokens, completionTokens, totalRequestTokens, promptCacheHitTokens, promptCacheCreationTokens, statusCode = 200, errorMessage, }) {
|
|
458
|
+
const resolvedStartTime = startTime || new Date();
|
|
459
|
+
const resolvedTimestamp = timestamp || resolvedStartTime;
|
|
460
|
+
const latencySeconds = Math.max((resolvedTimestamp.getTime() - resolvedStartTime.getTime()) / 1000, 0);
|
|
461
|
+
const payload = {
|
|
462
|
+
trace_unique_id: sessionState.traceId,
|
|
463
|
+
span_unique_id: spanUniqueId,
|
|
464
|
+
span_parent_id: spanParentId,
|
|
465
|
+
trace_name: sessionState.traceName,
|
|
466
|
+
session_identifier: sessionState.sessionId,
|
|
467
|
+
span_name: spanName,
|
|
468
|
+
span_workflow_name: sessionState.traceName,
|
|
469
|
+
log_type: logType,
|
|
470
|
+
start_time: resolvedStartTime,
|
|
471
|
+
timestamp: resolvedTimestamp,
|
|
472
|
+
latency: latencySeconds,
|
|
473
|
+
status_code: statusCode,
|
|
474
|
+
error_bit: errorMessage ? 1 : 0,
|
|
475
|
+
error_message: errorMessage,
|
|
476
|
+
input: this.toSerializableValue({ value: inputValue }),
|
|
477
|
+
output: this.toSerializableValue({ value: outputValue }),
|
|
478
|
+
model: model || undefined,
|
|
479
|
+
metadata: this.toSerializableMetadata({ value: metadata }),
|
|
480
|
+
span_tools: spanTools,
|
|
481
|
+
tool_calls: this.toSerializableToolCalls({ value: toolCalls }),
|
|
482
|
+
prompt_tokens: promptTokens ?? undefined,
|
|
483
|
+
completion_tokens: completionTokens ?? undefined,
|
|
484
|
+
total_request_tokens: totalRequestTokens ?? undefined,
|
|
485
|
+
prompt_cache_hit_tokens: promptCacheHitTokens ?? undefined,
|
|
486
|
+
prompt_cache_creation_tokens: promptCacheCreationTokens ?? undefined,
|
|
487
|
+
};
|
|
488
|
+
return payload;
|
|
489
|
+
}
|
|
490
|
+
toSerializableMetadata({ value, }) {
|
|
491
|
+
return toSerializableMetadata({ value });
|
|
492
|
+
}
|
|
493
|
+
toSerializableToolCalls({ value, }) {
|
|
494
|
+
return toSerializableToolCalls({ value });
|
|
495
|
+
}
|
|
496
|
+
toSerializableValue({ value }) {
|
|
497
|
+
return toSerializableValue({ value });
|
|
498
|
+
}
|
|
499
|
+
async sendPayloads({ payloads, }) {
|
|
500
|
+
if (payloads.length === 0) {
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
if (!this.apiKey) {
|
|
504
|
+
console.warn("Respan API key is not set; skipping exporter upload");
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
507
|
+
const body = JSON.stringify({ data: payloads });
|
|
508
|
+
const headers = {
|
|
509
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
510
|
+
"Content-Type": "application/json",
|
|
511
|
+
};
|
|
512
|
+
try {
|
|
513
|
+
await fetchWithRetry({
|
|
514
|
+
url: this.endpoint,
|
|
515
|
+
init: {
|
|
516
|
+
method: "POST",
|
|
517
|
+
headers,
|
|
518
|
+
body,
|
|
519
|
+
},
|
|
520
|
+
maxRetries: this.maxRetries,
|
|
521
|
+
baseDelaySeconds: this.baseDelaySeconds,
|
|
522
|
+
maxDelaySeconds: this.maxDelaySeconds,
|
|
523
|
+
timeoutMs: this.timeoutMs,
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
catch (error) {
|
|
527
|
+
console.error("Respan export failed:", error);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
coerceInteger({ value }) {
|
|
531
|
+
return coerceInteger({ value });
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
export class RespanSpanExporter extends RespanAnthropicAgentsExporter {
|
|
535
|
+
}
|
|
536
|
+
export function instrumentOptions({ exporter, options = {}, }) {
|
|
537
|
+
return exporter.withOptions(options);
|
|
538
|
+
}
|
|
539
|
+
//# sourceMappingURL=respan-anthropic-agents-exporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"respan-anthropic-agents-exporter.js","sourceRoot":"","sources":["../src/respan-anthropic-agents-exporter.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare function buildTraceNameFromPrompt({ prompt, }: {
|
|
2
|
+
prompt: unknown;
|
|
3
|
+
}): string | null;
|
|
4
|
+
export declare function toSerializableValue({ value }: {
|
|
5
|
+
value: unknown;
|
|
6
|
+
}): unknown;
|
|
7
|
+
export declare function toSerializableMetadata({ value, }: {
|
|
8
|
+
value: unknown;
|
|
9
|
+
}): Record<string, unknown> | undefined;
|
|
10
|
+
export declare function toSerializableToolCalls({ value, }: {
|
|
11
|
+
value: unknown;
|
|
12
|
+
}): Record<string, unknown>[] | undefined;
|
|
13
|
+
export declare function coerceInteger({ value }: {
|
|
14
|
+
value: unknown;
|
|
15
|
+
}): number | null;
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export function buildTraceNameFromPrompt({ prompt, }) {
|
|
2
|
+
if (typeof prompt !== "string") {
|
|
3
|
+
return null;
|
|
4
|
+
}
|
|
5
|
+
const normalizedPrompt = prompt.trim();
|
|
6
|
+
if (!normalizedPrompt) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
return normalizedPrompt.slice(0, 120);
|
|
10
|
+
}
|
|
11
|
+
export function toSerializableValue({ value }) {
|
|
12
|
+
if (value === null || value === undefined) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
if (typeof value === "string" ||
|
|
16
|
+
typeof value === "number" ||
|
|
17
|
+
typeof value === "boolean") {
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
if (value instanceof Date) {
|
|
21
|
+
return value.toISOString();
|
|
22
|
+
}
|
|
23
|
+
if (Array.isArray(value)) {
|
|
24
|
+
return value.map((item) => toSerializableValue({ value: item }));
|
|
25
|
+
}
|
|
26
|
+
if (typeof value === "object") {
|
|
27
|
+
const normalizedObject = {};
|
|
28
|
+
Object.entries(value).forEach(([key, itemValue]) => {
|
|
29
|
+
normalizedObject[key] = toSerializableValue({ value: itemValue });
|
|
30
|
+
});
|
|
31
|
+
return normalizedObject;
|
|
32
|
+
}
|
|
33
|
+
return String(value);
|
|
34
|
+
}
|
|
35
|
+
export function toSerializableMetadata({ value, }) {
|
|
36
|
+
const serialized = toSerializableValue({ value });
|
|
37
|
+
if (serialized === undefined) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
if (serialized && typeof serialized === "object" && !Array.isArray(serialized)) {
|
|
41
|
+
return serialized;
|
|
42
|
+
}
|
|
43
|
+
return { value: serialized };
|
|
44
|
+
}
|
|
45
|
+
export function toSerializableToolCalls({ value, }) {
|
|
46
|
+
const serialized = toSerializableValue({ value });
|
|
47
|
+
if (serialized === undefined) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
if (Array.isArray(serialized)) {
|
|
51
|
+
return serialized.map((item) => {
|
|
52
|
+
if (item && typeof item === "object" && !Array.isArray(item)) {
|
|
53
|
+
return item;
|
|
54
|
+
}
|
|
55
|
+
return { value: item };
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
if (serialized && typeof serialized === "object") {
|
|
59
|
+
return [serialized];
|
|
60
|
+
}
|
|
61
|
+
return [{ value: serialized }];
|
|
62
|
+
}
|
|
63
|
+
export function coerceInteger({ value }) {
|
|
64
|
+
if (value === null || value === undefined) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
const convertedValue = Number(value);
|
|
68
|
+
if (!Number.isFinite(convertedValue)) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
return Math.trunc(convertedValue);
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@respan/exporter-anthropic-agents",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Exporter for Anthropic Agent SDK traces to Respan",
|
|
5
|
+
"author": "Respan <team@respan.ai>",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"license": "Apache-2.0",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"access": "public"
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc",
|
|
20
|
+
"clean": "rm -rf dist",
|
|
21
|
+
"test": "tsx --test tests/**/*.test.ts",
|
|
22
|
+
"publish": "yarn npm publish",
|
|
23
|
+
"release": "yarn build && yarn version patch && yarn publish"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@anthropic-ai/claude-agent-sdk": ">=0.2.0",
|
|
27
|
+
"@respan/respan-sdk": "workspace:*"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/node": "^22.15.29",
|
|
31
|
+
"tsx": "^4.20.3",
|
|
32
|
+
"typescript": "^5.0.0"
|
|
33
|
+
},
|
|
34
|
+
"packageManager": "yarn@4.9.2"
|
|
35
|
+
}
|