@agent-inspect/ai-sdk 1.7.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/LICENSE +21 -0
- package/dist/index.cjs +384 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +59 -0
- package/dist/index.d.ts +59 -0
- package/dist/index.mjs +382 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +51 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 AgentInspect contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var ai = require('ai');
|
|
4
|
+
var writers = require('agent-inspect/writers');
|
|
5
|
+
|
|
6
|
+
// packages/ai-sdk/src/index.ts
|
|
7
|
+
var AI_SDK_SOURCE = {
|
|
8
|
+
type: "ai-sdk",
|
|
9
|
+
name: "@agent-inspect/ai-sdk",
|
|
10
|
+
version: "experimental"
|
|
11
|
+
};
|
|
12
|
+
function nowIso() {
|
|
13
|
+
return (/* @__PURE__ */ new Date()).toISOString();
|
|
14
|
+
}
|
|
15
|
+
function createId(prefix) {
|
|
16
|
+
if (typeof crypto !== "undefined" && "randomUUID" in crypto) {
|
|
17
|
+
return `${prefix}_${crypto.randomUUID()}`;
|
|
18
|
+
}
|
|
19
|
+
return `${prefix}_${Date.now()}_${Math.random().toString(16).slice(2)}`;
|
|
20
|
+
}
|
|
21
|
+
function normalizeError(error) {
|
|
22
|
+
if (error instanceof Error && error.message.trim() !== "") {
|
|
23
|
+
return error.message;
|
|
24
|
+
}
|
|
25
|
+
if (typeof error === "string" && error.trim() !== "") {
|
|
26
|
+
return error;
|
|
27
|
+
}
|
|
28
|
+
return "Unknown AI SDK integration error";
|
|
29
|
+
}
|
|
30
|
+
function durationMs(startedAt, endedAt) {
|
|
31
|
+
const started = Date.parse(startedAt);
|
|
32
|
+
const ended = Date.parse(endedAt);
|
|
33
|
+
if (!Number.isFinite(started) || !Number.isFinite(ended)) return void 0;
|
|
34
|
+
return Math.max(0, ended - started);
|
|
35
|
+
}
|
|
36
|
+
function countRecordKeys(value) {
|
|
37
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
38
|
+
return void 0;
|
|
39
|
+
}
|
|
40
|
+
return Object.keys(value).length;
|
|
41
|
+
}
|
|
42
|
+
function summarizeUnknown(value) {
|
|
43
|
+
if (value === null) return { type: "null" };
|
|
44
|
+
if (Array.isArray(value)) return { type: "array", itemCount: value.length };
|
|
45
|
+
if (typeof value === "object") {
|
|
46
|
+
return { type: "object", keyCount: countRecordKeys(value) ?? 0 };
|
|
47
|
+
}
|
|
48
|
+
if (typeof value === "string") {
|
|
49
|
+
return { type: "string", length: value.length };
|
|
50
|
+
}
|
|
51
|
+
const valueType = typeof value;
|
|
52
|
+
if (valueType === "number" || valueType === "boolean" || valueType === "bigint") {
|
|
53
|
+
return { type: valueType };
|
|
54
|
+
}
|
|
55
|
+
if (valueType === "undefined") return { type: "undefined" };
|
|
56
|
+
return { type: "unknown" };
|
|
57
|
+
}
|
|
58
|
+
function summarizeError(error) {
|
|
59
|
+
if (error instanceof Error) {
|
|
60
|
+
return {
|
|
61
|
+
name: error.name || "Error",
|
|
62
|
+
message: error.message
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
if (typeof error === "string") {
|
|
66
|
+
return {
|
|
67
|
+
message: error
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
message: "Unknown AI SDK tool error"
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function summarizeModel(model) {
|
|
75
|
+
return {
|
|
76
|
+
provider: model?.provider,
|
|
77
|
+
modelId: model?.modelId
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function summarizeUsage(usage) {
|
|
81
|
+
if (!usage) return void 0;
|
|
82
|
+
const tokenUsage = {};
|
|
83
|
+
if (typeof usage.inputTokens === "number") tokenUsage.input = usage.inputTokens;
|
|
84
|
+
if (typeof usage.outputTokens === "number") tokenUsage.output = usage.outputTokens;
|
|
85
|
+
if (typeof usage.totalTokens === "number") tokenUsage.total = usage.totalTokens;
|
|
86
|
+
if (typeof usage.cachedInputTokens === "number") tokenUsage.cached = usage.cachedInputTokens;
|
|
87
|
+
return Object.keys(tokenUsage).length > 0 ? tokenUsage : void 0;
|
|
88
|
+
}
|
|
89
|
+
function summarizeFinishReason(finishReason) {
|
|
90
|
+
if (typeof finishReason === "string") {
|
|
91
|
+
return { finishReason };
|
|
92
|
+
}
|
|
93
|
+
if (typeof finishReason !== "object" || finishReason === null) {
|
|
94
|
+
return {};
|
|
95
|
+
}
|
|
96
|
+
const value = finishReason;
|
|
97
|
+
return {
|
|
98
|
+
finishReason: typeof value.unified === "string" ? value.unified : void 0,
|
|
99
|
+
rawFinishReason: typeof value.raw === "string" ? value.raw : void 0
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
var AgentInspectAiSdkTelemetryIntegration = class {
|
|
103
|
+
constructor(options) {
|
|
104
|
+
this.options = options;
|
|
105
|
+
this.writer = options.writer ?? (options.traceDir ? writers.fileWriter({ dir: options.traceDir }) : void 0);
|
|
106
|
+
}
|
|
107
|
+
options;
|
|
108
|
+
writer;
|
|
109
|
+
diagnostics = {
|
|
110
|
+
writeFailures: 0
|
|
111
|
+
};
|
|
112
|
+
activeRun;
|
|
113
|
+
getDiagnostics() {
|
|
114
|
+
return { ...this.diagnostics };
|
|
115
|
+
}
|
|
116
|
+
async onStart(event) {
|
|
117
|
+
const startedAt = nowIso();
|
|
118
|
+
const runId = createId("ai_sdk_run");
|
|
119
|
+
const eventId = createId("event");
|
|
120
|
+
const name = this.options.runName ?? event.functionId ?? event.model.modelId ?? "ai-sdk-generation";
|
|
121
|
+
this.activeRun = {
|
|
122
|
+
runId,
|
|
123
|
+
eventId,
|
|
124
|
+
name,
|
|
125
|
+
startedAt,
|
|
126
|
+
model: event.model,
|
|
127
|
+
steps: /* @__PURE__ */ new Map(),
|
|
128
|
+
tools: /* @__PURE__ */ new Map()
|
|
129
|
+
};
|
|
130
|
+
await this.write({
|
|
131
|
+
schemaVersion: "0.2",
|
|
132
|
+
eventId,
|
|
133
|
+
runId,
|
|
134
|
+
kind: "RUN",
|
|
135
|
+
name,
|
|
136
|
+
status: "running",
|
|
137
|
+
timestamp: startedAt,
|
|
138
|
+
startedAt,
|
|
139
|
+
confidence: "explicit",
|
|
140
|
+
source: AI_SDK_SOURCE,
|
|
141
|
+
attributes: {
|
|
142
|
+
...summarizeModel(event.model),
|
|
143
|
+
functionId: event.functionId,
|
|
144
|
+
capture: this.options.capture ?? "metadata-only",
|
|
145
|
+
recordInputsRequired: false,
|
|
146
|
+
recordOutputsRequired: false,
|
|
147
|
+
toolCount: countRecordKeys(event.tools),
|
|
148
|
+
hasPrompt: event.prompt !== void 0,
|
|
149
|
+
hasMessages: event.messages !== void 0,
|
|
150
|
+
metadataKeyCount: countRecordKeys(event.metadata)
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
async onStepStart(event) {
|
|
155
|
+
const run = this.ensureRun(event.model, event.functionId);
|
|
156
|
+
const startedAt = nowIso();
|
|
157
|
+
const stepEventId = createId("event");
|
|
158
|
+
run.steps.set(event.stepNumber, {
|
|
159
|
+
eventId: stepEventId,
|
|
160
|
+
startedAt
|
|
161
|
+
});
|
|
162
|
+
await this.write({
|
|
163
|
+
schemaVersion: "0.2",
|
|
164
|
+
eventId: stepEventId,
|
|
165
|
+
runId: run.runId,
|
|
166
|
+
parentId: run.eventId,
|
|
167
|
+
kind: "LLM",
|
|
168
|
+
name: `ai-sdk-step-${event.stepNumber}`,
|
|
169
|
+
status: "running",
|
|
170
|
+
timestamp: startedAt,
|
|
171
|
+
startedAt,
|
|
172
|
+
confidence: "explicit",
|
|
173
|
+
source: AI_SDK_SOURCE,
|
|
174
|
+
attributes: {
|
|
175
|
+
...summarizeModel(event.model),
|
|
176
|
+
functionId: event.functionId,
|
|
177
|
+
stepNumber: event.stepNumber,
|
|
178
|
+
priorStepCount: event.steps.length,
|
|
179
|
+
activeToolCount: event.activeTools?.length,
|
|
180
|
+
toolCount: countRecordKeys(event.tools),
|
|
181
|
+
messageCount: event.messages.length,
|
|
182
|
+
metadataKeyCount: countRecordKeys(event.metadata)
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
async onStepFinish(event) {
|
|
187
|
+
const run = this.ensureRun(event.model, event.functionId);
|
|
188
|
+
const endedAt = nowIso();
|
|
189
|
+
const activeStep = run.steps.get(event.stepNumber) ?? {
|
|
190
|
+
eventId: createId("event"),
|
|
191
|
+
startedAt: endedAt
|
|
192
|
+
};
|
|
193
|
+
await this.write({
|
|
194
|
+
schemaVersion: "0.2",
|
|
195
|
+
eventId: createId("event"),
|
|
196
|
+
runId: run.runId,
|
|
197
|
+
parentId: activeStep.eventId,
|
|
198
|
+
kind: "LLM",
|
|
199
|
+
name: `ai-sdk-step-${event.stepNumber}`,
|
|
200
|
+
status: "ok",
|
|
201
|
+
timestamp: endedAt,
|
|
202
|
+
startedAt: activeStep.startedAt,
|
|
203
|
+
endedAt,
|
|
204
|
+
durationMs: durationMs(activeStep.startedAt, endedAt),
|
|
205
|
+
confidence: "explicit",
|
|
206
|
+
source: AI_SDK_SOURCE,
|
|
207
|
+
attributes: {
|
|
208
|
+
...summarizeModel(event.model),
|
|
209
|
+
functionId: event.functionId,
|
|
210
|
+
stepNumber: event.stepNumber,
|
|
211
|
+
...summarizeFinishReason(event.finishReason),
|
|
212
|
+
warningCount: event.warnings?.length ?? 0,
|
|
213
|
+
contentPartCount: event.content.length,
|
|
214
|
+
toolCallCount: event.toolCalls.length,
|
|
215
|
+
toolResultCount: event.toolResults.length,
|
|
216
|
+
responseId: event.response.id,
|
|
217
|
+
responseModelId: event.response.modelId,
|
|
218
|
+
responseTimestamp: event.response.timestamp?.toISOString(),
|
|
219
|
+
metadataKeyCount: countRecordKeys(event.metadata)
|
|
220
|
+
},
|
|
221
|
+
tokenUsage: summarizeUsage(event.usage),
|
|
222
|
+
outputSummary: {
|
|
223
|
+
contentPartCount: event.content.length,
|
|
224
|
+
textLength: event.text.length,
|
|
225
|
+
reasoningPartCount: event.reasoning.length,
|
|
226
|
+
fileCount: event.files.length,
|
|
227
|
+
sourceCount: event.sources.length
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
async onToolCallStart(event) {
|
|
232
|
+
const run = this.ensureRun(event.model, event.functionId);
|
|
233
|
+
const startedAt = nowIso();
|
|
234
|
+
const eventId = createId("event");
|
|
235
|
+
const toolCall = event.toolCall;
|
|
236
|
+
run.tools.set(toolCall.toolCallId, {
|
|
237
|
+
eventId,
|
|
238
|
+
startedAt,
|
|
239
|
+
toolName: toolCall.toolName
|
|
240
|
+
});
|
|
241
|
+
const step = event.stepNumber === void 0 ? void 0 : run.steps.get(event.stepNumber);
|
|
242
|
+
await this.write({
|
|
243
|
+
schemaVersion: "0.2",
|
|
244
|
+
eventId,
|
|
245
|
+
runId: run.runId,
|
|
246
|
+
parentId: step?.eventId ?? run.eventId,
|
|
247
|
+
kind: "TOOL",
|
|
248
|
+
name: toolCall.toolName,
|
|
249
|
+
status: "running",
|
|
250
|
+
timestamp: startedAt,
|
|
251
|
+
startedAt,
|
|
252
|
+
confidence: "explicit",
|
|
253
|
+
source: AI_SDK_SOURCE,
|
|
254
|
+
attributes: {
|
|
255
|
+
...summarizeModel(event.model),
|
|
256
|
+
functionId: event.functionId,
|
|
257
|
+
stepNumber: event.stepNumber,
|
|
258
|
+
toolCallId: toolCall.toolCallId,
|
|
259
|
+
toolName: toolCall.toolName,
|
|
260
|
+
dynamic: toolCall.dynamic === true,
|
|
261
|
+
invalid: toolCall.invalid === true,
|
|
262
|
+
providerExecuted: toolCall.providerExecuted === true,
|
|
263
|
+
messageCount: event.messages.length,
|
|
264
|
+
metadataKeyCount: countRecordKeys(event.metadata),
|
|
265
|
+
providerMetadataKeyCount: countRecordKeys(toolCall.providerMetadata),
|
|
266
|
+
toolMetadataKeyCount: countRecordKeys(toolCall.toolMetadata)
|
|
267
|
+
},
|
|
268
|
+
inputSummary: summarizeUnknown(toolCall.input),
|
|
269
|
+
error: toolCall.invalid ? summarizeError(toolCall.error) : void 0
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
async onToolCallFinish(event) {
|
|
273
|
+
const run = this.ensureRun(event.model, event.functionId);
|
|
274
|
+
const endedAt = nowIso();
|
|
275
|
+
const toolCall = event.toolCall;
|
|
276
|
+
const activeTool = run.tools.get(toolCall.toolCallId) ?? {
|
|
277
|
+
eventId: createId("event"),
|
|
278
|
+
startedAt: endedAt,
|
|
279
|
+
toolName: toolCall.toolName
|
|
280
|
+
};
|
|
281
|
+
await this.write({
|
|
282
|
+
schemaVersion: "0.2",
|
|
283
|
+
eventId: createId("event"),
|
|
284
|
+
runId: run.runId,
|
|
285
|
+
parentId: activeTool.eventId,
|
|
286
|
+
kind: "TOOL",
|
|
287
|
+
name: activeTool.toolName,
|
|
288
|
+
status: event.success ? "ok" : "error",
|
|
289
|
+
timestamp: endedAt,
|
|
290
|
+
startedAt: activeTool.startedAt,
|
|
291
|
+
endedAt,
|
|
292
|
+
durationMs: event.durationMs,
|
|
293
|
+
confidence: "explicit",
|
|
294
|
+
source: AI_SDK_SOURCE,
|
|
295
|
+
attributes: {
|
|
296
|
+
...summarizeModel(event.model),
|
|
297
|
+
functionId: event.functionId,
|
|
298
|
+
stepNumber: event.stepNumber,
|
|
299
|
+
toolCallId: toolCall.toolCallId,
|
|
300
|
+
toolName: toolCall.toolName,
|
|
301
|
+
dynamic: toolCall.dynamic === true,
|
|
302
|
+
invalid: toolCall.invalid === true,
|
|
303
|
+
providerExecuted: toolCall.providerExecuted === true,
|
|
304
|
+
messageCount: event.messages.length,
|
|
305
|
+
metadataKeyCount: countRecordKeys(event.metadata),
|
|
306
|
+
providerMetadataKeyCount: countRecordKeys(toolCall.providerMetadata),
|
|
307
|
+
toolMetadataKeyCount: countRecordKeys(toolCall.toolMetadata)
|
|
308
|
+
},
|
|
309
|
+
outputSummary: event.success ? summarizeUnknown(event.output) : void 0,
|
|
310
|
+
error: event.success ? void 0 : summarizeError(event.error)
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
async onFinish(event) {
|
|
314
|
+
const run = this.ensureRun(event.model, event.functionId);
|
|
315
|
+
const endedAt = nowIso();
|
|
316
|
+
await this.write({
|
|
317
|
+
schemaVersion: "0.2",
|
|
318
|
+
eventId: createId("event"),
|
|
319
|
+
runId: run.runId,
|
|
320
|
+
kind: "RUN",
|
|
321
|
+
name: run.name,
|
|
322
|
+
status: "ok",
|
|
323
|
+
timestamp: endedAt,
|
|
324
|
+
startedAt: run.startedAt,
|
|
325
|
+
endedAt,
|
|
326
|
+
durationMs: durationMs(run.startedAt, endedAt),
|
|
327
|
+
confidence: "explicit",
|
|
328
|
+
source: AI_SDK_SOURCE,
|
|
329
|
+
attributes: {
|
|
330
|
+
...summarizeModel(event.model ?? run.model),
|
|
331
|
+
functionId: event.functionId,
|
|
332
|
+
...summarizeFinishReason(event.finishReason),
|
|
333
|
+
stepCount: event.steps.length,
|
|
334
|
+
warningCount: event.warnings?.length ?? 0,
|
|
335
|
+
toolCallCount: event.toolCalls.length,
|
|
336
|
+
toolResultCount: event.toolResults.length,
|
|
337
|
+
metadataKeyCount: countRecordKeys(event.metadata)
|
|
338
|
+
},
|
|
339
|
+
tokenUsage: summarizeUsage(event.totalUsage),
|
|
340
|
+
outputSummary: {
|
|
341
|
+
contentPartCount: event.content.length,
|
|
342
|
+
textLength: event.text.length,
|
|
343
|
+
reasoningPartCount: event.reasoning.length,
|
|
344
|
+
fileCount: event.files.length,
|
|
345
|
+
sourceCount: event.sources.length
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
this.activeRun = void 0;
|
|
349
|
+
}
|
|
350
|
+
ensureRun(model, functionId) {
|
|
351
|
+
if (this.activeRun) return this.activeRun;
|
|
352
|
+
const startedAt = nowIso();
|
|
353
|
+
this.activeRun = {
|
|
354
|
+
runId: createId("ai_sdk_run"),
|
|
355
|
+
eventId: createId("event"),
|
|
356
|
+
name: this.options.runName ?? functionId ?? model?.modelId ?? "ai-sdk-generation",
|
|
357
|
+
startedAt,
|
|
358
|
+
model,
|
|
359
|
+
steps: /* @__PURE__ */ new Map(),
|
|
360
|
+
tools: /* @__PURE__ */ new Map()
|
|
361
|
+
};
|
|
362
|
+
return this.activeRun;
|
|
363
|
+
}
|
|
364
|
+
async write(event) {
|
|
365
|
+
if (!this.writer) return;
|
|
366
|
+
try {
|
|
367
|
+
await this.writer.write(event);
|
|
368
|
+
} catch (error) {
|
|
369
|
+
this.diagnostics.writeFailures += 1;
|
|
370
|
+
this.diagnostics.lastError = normalizeError(error);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
function agentInspect(options = {}) {
|
|
375
|
+
const integration = new AgentInspectAiSdkTelemetryIntegration(options);
|
|
376
|
+
return {
|
|
377
|
+
...ai.bindTelemetryIntegration(integration),
|
|
378
|
+
getDiagnostics: () => integration.getDiagnostics()
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
exports.agentInspect = agentInspect;
|
|
383
|
+
//# sourceMappingURL=index.cjs.map
|
|
384
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["fileWriter","bindTelemetryIntegration"],"mappings":"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","file":"index.cjs","sourcesContent":["import { bindTelemetryIntegration } from \"ai\";\nimport type {\n OnFinishEvent,\n OnStartEvent,\n OnStepFinishEvent,\n OnStepStartEvent,\n OnToolCallFinishEvent,\n OnToolCallStartEvent,\n TelemetryIntegration,\n} from \"ai\";\nimport type {\n PersistedInspectEvent,\n PersistedInspectError,\n PersistedTokenUsage,\n RedactionProfile,\n} from \"agent-inspect\";\nimport { fileWriter } from \"agent-inspect/writers\";\nimport type { TraceWriter } from \"agent-inspect/writers\";\n\n/**\n * Experimental capture mode for the AI SDK adapter.\n *\n * @experimental This package is part of the v1.7 adapter train.\n */\nexport type AgentInspectAiSdkCaptureMode = \"metadata-only\" | \"preview\";\n\n/**\n * Options for the experimental AI SDK telemetry integration.\n *\n * @experimental Callers must keep AI SDK telemetry configured with\n * `recordInputs: false` and `recordOutputs: false`.\n */\nexport interface AgentInspectAiSdkOptions {\n /**\n * Explicit local writer for future runtime integration.\n */\n writer?: TraceWriter;\n\n /**\n * Convenience local trace directory for future writer-owned persistence.\n */\n traceDir?: string;\n\n /**\n * Optional run name used by future lifecycle mapping.\n */\n runName?: string;\n\n /**\n * Capture policy. Defaults to metadata-only when runtime mapping lands.\n */\n capture?: AgentInspectAiSdkCaptureMode;\n\n /**\n * Redaction profile applied before local persistence in future mapping.\n */\n redactionProfile?: RedactionProfile;\n\n /**\n * Bounds any future preview capture.\n */\n maxPreviewChars?: number;\n}\n\nexport interface AgentInspectAiSdkDiagnostics {\n writeFailures: number;\n lastError?: string;\n}\n\nexport interface AgentInspectAiSdkIntegration extends TelemetryIntegration {\n getDiagnostics(): AgentInspectAiSdkDiagnostics;\n}\n\ntype AiSdkModelInfo = {\n provider?: string;\n modelId?: string;\n};\n\ntype AiSdkUsage = {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cachedInputTokens?: number;\n};\n\ninterface ActiveStep {\n eventId: string;\n startedAt: string;\n}\n\ninterface ActiveTool {\n eventId: string;\n startedAt: string;\n toolName: string;\n}\n\ninterface ActiveRun {\n runId: string;\n eventId: string;\n name: string;\n startedAt: string;\n model?: AiSdkModelInfo;\n steps: Map<number, ActiveStep>;\n tools: Map<string, ActiveTool>;\n}\n\nconst AI_SDK_SOURCE = {\n type: \"ai-sdk\",\n name: \"@agent-inspect/ai-sdk\",\n version: \"experimental\",\n} as const;\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction createId(prefix: string): string {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return `${prefix}_${crypto.randomUUID()}`;\n }\n return `${prefix}_${Date.now()}_${Math.random().toString(16).slice(2)}`;\n}\n\nfunction normalizeError(error: unknown): string {\n if (error instanceof Error && error.message.trim() !== \"\") {\n return error.message;\n }\n if (typeof error === \"string\" && error.trim() !== \"\") {\n return error;\n }\n return \"Unknown AI SDK integration error\";\n}\n\nfunction durationMs(startedAt: string, endedAt: string): number | undefined {\n const started = Date.parse(startedAt);\n const ended = Date.parse(endedAt);\n if (!Number.isFinite(started) || !Number.isFinite(ended)) return undefined;\n return Math.max(0, ended - started);\n}\n\nfunction countRecordKeys(value: unknown): number | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return undefined;\n }\n return Object.keys(value).length;\n}\n\nfunction summarizeUnknown(value: unknown): Record<string, unknown> {\n if (value === null) return { type: \"null\" };\n if (Array.isArray(value)) return { type: \"array\", itemCount: value.length };\n\n if (typeof value === \"object\") {\n return { type: \"object\", keyCount: countRecordKeys(value) ?? 0 };\n }\n if (typeof value === \"string\") {\n return { type: \"string\", length: value.length };\n }\n const valueType = typeof value;\n if (valueType === \"number\" || valueType === \"boolean\" || valueType === \"bigint\") {\n return { type: valueType };\n }\n if (valueType === \"undefined\") return { type: \"undefined\" };\n return { type: \"unknown\" };\n}\n\nfunction summarizeError(error: unknown): PersistedInspectError {\n if (error instanceof Error) {\n return {\n name: error.name || \"Error\",\n message: error.message,\n };\n }\n if (typeof error === \"string\") {\n return {\n message: error,\n };\n }\n return {\n message: \"Unknown AI SDK tool error\",\n };\n}\n\nfunction summarizeModel(model: AiSdkModelInfo | undefined): Record<string, unknown> {\n return {\n provider: model?.provider,\n modelId: model?.modelId,\n };\n}\n\nfunction summarizeUsage(usage: AiSdkUsage | undefined): PersistedTokenUsage | undefined {\n if (!usage) return undefined;\n\n const tokenUsage: PersistedTokenUsage = {};\n if (typeof usage.inputTokens === \"number\") tokenUsage.input = usage.inputTokens;\n if (typeof usage.outputTokens === \"number\") tokenUsage.output = usage.outputTokens;\n if (typeof usage.totalTokens === \"number\") tokenUsage.total = usage.totalTokens;\n if (typeof usage.cachedInputTokens === \"number\") tokenUsage.cached = usage.cachedInputTokens;\n\n return Object.keys(tokenUsage).length > 0 ? tokenUsage : undefined;\n}\n\nfunction summarizeFinishReason(\n finishReason: unknown,\n): { finishReason?: string; rawFinishReason?: string } {\n if (typeof finishReason === \"string\") {\n return { finishReason };\n }\n if (typeof finishReason !== \"object\" || finishReason === null) {\n return {};\n }\n\n const value = finishReason as { unified?: unknown; raw?: unknown };\n return {\n finishReason: typeof value.unified === \"string\" ? value.unified : undefined,\n rawFinishReason: typeof value.raw === \"string\" ? value.raw : undefined,\n };\n}\n\nclass AgentInspectAiSdkTelemetryIntegration {\n private readonly writer: TraceWriter | undefined;\n private readonly diagnostics: AgentInspectAiSdkDiagnostics = {\n writeFailures: 0,\n };\n private activeRun: ActiveRun | undefined;\n\n constructor(private readonly options: AgentInspectAiSdkOptions) {\n this.writer = options.writer ?? (options.traceDir ? fileWriter({ dir: options.traceDir }) : undefined);\n }\n\n getDiagnostics(): AgentInspectAiSdkDiagnostics {\n return { ...this.diagnostics };\n }\n\n async onStart(event: OnStartEvent): Promise<void> {\n const startedAt = nowIso();\n const runId = createId(\"ai_sdk_run\");\n const eventId = createId(\"event\");\n const name =\n this.options.runName ??\n event.functionId ??\n event.model.modelId ??\n \"ai-sdk-generation\";\n\n this.activeRun = {\n runId,\n eventId,\n name,\n startedAt,\n model: event.model,\n steps: new Map(),\n tools: new Map(),\n };\n\n await this.write({\n schemaVersion: \"0.2\",\n eventId,\n runId,\n kind: \"RUN\",\n name,\n status: \"running\",\n timestamp: startedAt,\n startedAt,\n confidence: \"explicit\",\n source: AI_SDK_SOURCE,\n attributes: {\n ...summarizeModel(event.model),\n functionId: event.functionId,\n capture: this.options.capture ?? \"metadata-only\",\n recordInputsRequired: false,\n recordOutputsRequired: false,\n toolCount: countRecordKeys(event.tools),\n hasPrompt: event.prompt !== undefined,\n hasMessages: event.messages !== undefined,\n metadataKeyCount: countRecordKeys(event.metadata),\n },\n });\n }\n\n async onStepStart(event: OnStepStartEvent): Promise<void> {\n const run = this.ensureRun(event.model, event.functionId);\n const startedAt = nowIso();\n const stepEventId = createId(\"event\");\n run.steps.set(event.stepNumber, {\n eventId: stepEventId,\n startedAt,\n });\n\n await this.write({\n schemaVersion: \"0.2\",\n eventId: stepEventId,\n runId: run.runId,\n parentId: run.eventId,\n kind: \"LLM\",\n name: `ai-sdk-step-${event.stepNumber}`,\n status: \"running\",\n timestamp: startedAt,\n startedAt,\n confidence: \"explicit\",\n source: AI_SDK_SOURCE,\n attributes: {\n ...summarizeModel(event.model),\n functionId: event.functionId,\n stepNumber: event.stepNumber,\n priorStepCount: event.steps.length,\n activeToolCount: event.activeTools?.length,\n toolCount: countRecordKeys(event.tools),\n messageCount: event.messages.length,\n metadataKeyCount: countRecordKeys(event.metadata),\n },\n });\n }\n\n async onStepFinish(event: OnStepFinishEvent): Promise<void> {\n const run = this.ensureRun(event.model, event.functionId);\n const endedAt = nowIso();\n const activeStep =\n run.steps.get(event.stepNumber) ?? {\n eventId: createId(\"event\"),\n startedAt: endedAt,\n };\n\n await this.write({\n schemaVersion: \"0.2\",\n eventId: createId(\"event\"),\n runId: run.runId,\n parentId: activeStep.eventId,\n kind: \"LLM\",\n name: `ai-sdk-step-${event.stepNumber}`,\n status: \"ok\",\n timestamp: endedAt,\n startedAt: activeStep.startedAt,\n endedAt,\n durationMs: durationMs(activeStep.startedAt, endedAt),\n confidence: \"explicit\",\n source: AI_SDK_SOURCE,\n attributes: {\n ...summarizeModel(event.model),\n functionId: event.functionId,\n stepNumber: event.stepNumber,\n ...summarizeFinishReason(event.finishReason),\n warningCount: event.warnings?.length ?? 0,\n contentPartCount: event.content.length,\n toolCallCount: event.toolCalls.length,\n toolResultCount: event.toolResults.length,\n responseId: event.response.id,\n responseModelId: event.response.modelId,\n responseTimestamp: event.response.timestamp?.toISOString(),\n metadataKeyCount: countRecordKeys(event.metadata),\n },\n tokenUsage: summarizeUsage(event.usage),\n outputSummary: {\n contentPartCount: event.content.length,\n textLength: event.text.length,\n reasoningPartCount: event.reasoning.length,\n fileCount: event.files.length,\n sourceCount: event.sources.length,\n },\n });\n }\n\n async onToolCallStart(event: OnToolCallStartEvent): Promise<void> {\n const run = this.ensureRun(event.model, event.functionId);\n const startedAt = nowIso();\n const eventId = createId(\"event\");\n const toolCall = event.toolCall;\n run.tools.set(toolCall.toolCallId, {\n eventId,\n startedAt,\n toolName: toolCall.toolName,\n });\n\n const step = event.stepNumber === undefined ? undefined : run.steps.get(event.stepNumber);\n\n await this.write({\n schemaVersion: \"0.2\",\n eventId,\n runId: run.runId,\n parentId: step?.eventId ?? run.eventId,\n kind: \"TOOL\",\n name: toolCall.toolName,\n status: \"running\",\n timestamp: startedAt,\n startedAt,\n confidence: \"explicit\",\n source: AI_SDK_SOURCE,\n attributes: {\n ...summarizeModel(event.model),\n functionId: event.functionId,\n stepNumber: event.stepNumber,\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n dynamic: toolCall.dynamic === true,\n invalid: toolCall.invalid === true,\n providerExecuted: toolCall.providerExecuted === true,\n messageCount: event.messages.length,\n metadataKeyCount: countRecordKeys(event.metadata),\n providerMetadataKeyCount: countRecordKeys(toolCall.providerMetadata),\n toolMetadataKeyCount: countRecordKeys(toolCall.toolMetadata),\n },\n inputSummary: summarizeUnknown(toolCall.input),\n error: toolCall.invalid ? summarizeError(toolCall.error) : undefined,\n });\n }\n\n async onToolCallFinish(event: OnToolCallFinishEvent): Promise<void> {\n const run = this.ensureRun(event.model, event.functionId);\n const endedAt = nowIso();\n const toolCall = event.toolCall;\n const activeTool =\n run.tools.get(toolCall.toolCallId) ?? {\n eventId: createId(\"event\"),\n startedAt: endedAt,\n toolName: toolCall.toolName,\n };\n\n await this.write({\n schemaVersion: \"0.2\",\n eventId: createId(\"event\"),\n runId: run.runId,\n parentId: activeTool.eventId,\n kind: \"TOOL\",\n name: activeTool.toolName,\n status: event.success ? \"ok\" : \"error\",\n timestamp: endedAt,\n startedAt: activeTool.startedAt,\n endedAt,\n durationMs: event.durationMs,\n confidence: \"explicit\",\n source: AI_SDK_SOURCE,\n attributes: {\n ...summarizeModel(event.model),\n functionId: event.functionId,\n stepNumber: event.stepNumber,\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n dynamic: toolCall.dynamic === true,\n invalid: toolCall.invalid === true,\n providerExecuted: toolCall.providerExecuted === true,\n messageCount: event.messages.length,\n metadataKeyCount: countRecordKeys(event.metadata),\n providerMetadataKeyCount: countRecordKeys(toolCall.providerMetadata),\n toolMetadataKeyCount: countRecordKeys(toolCall.toolMetadata),\n },\n outputSummary: event.success ? summarizeUnknown(event.output) : undefined,\n error: event.success ? undefined : summarizeError(event.error),\n });\n }\n\n async onFinish(event: OnFinishEvent): Promise<void> {\n const run = this.ensureRun(event.model, event.functionId);\n const endedAt = nowIso();\n\n await this.write({\n schemaVersion: \"0.2\",\n eventId: createId(\"event\"),\n runId: run.runId,\n kind: \"RUN\",\n name: run.name,\n status: \"ok\",\n timestamp: endedAt,\n startedAt: run.startedAt,\n endedAt,\n durationMs: durationMs(run.startedAt, endedAt),\n confidence: \"explicit\",\n source: AI_SDK_SOURCE,\n attributes: {\n ...summarizeModel(event.model ?? run.model),\n functionId: event.functionId,\n ...summarizeFinishReason(event.finishReason),\n stepCount: event.steps.length,\n warningCount: event.warnings?.length ?? 0,\n toolCallCount: event.toolCalls.length,\n toolResultCount: event.toolResults.length,\n metadataKeyCount: countRecordKeys(event.metadata),\n },\n tokenUsage: summarizeUsage(event.totalUsage),\n outputSummary: {\n contentPartCount: event.content.length,\n textLength: event.text.length,\n reasoningPartCount: event.reasoning.length,\n fileCount: event.files.length,\n sourceCount: event.sources.length,\n },\n });\n\n this.activeRun = undefined;\n }\n\n private ensureRun(model: AiSdkModelInfo | undefined, functionId: string | undefined): ActiveRun {\n if (this.activeRun) return this.activeRun;\n\n const startedAt = nowIso();\n this.activeRun = {\n runId: createId(\"ai_sdk_run\"),\n eventId: createId(\"event\"),\n name: this.options.runName ?? functionId ?? model?.modelId ?? \"ai-sdk-generation\",\n startedAt,\n model,\n steps: new Map(),\n tools: new Map(),\n };\n return this.activeRun;\n }\n\n private async write(event: PersistedInspectEvent): Promise<void> {\n if (!this.writer) return;\n\n try {\n await this.writer.write(event);\n } catch (error) {\n this.diagnostics.writeFailures += 1;\n this.diagnostics.lastError = normalizeError(error);\n }\n }\n}\n\n/**\n * Create an AgentInspect telemetry integration for the Vercel AI SDK.\n *\n * @experimental The adapter maps metadata-only generation, LLM step, and tool\n * lifecycle events. Keep AI SDK telemetry configured with\n * `recordInputs: false` and `recordOutputs: false`.\n */\nexport function agentInspect(\n options: AgentInspectAiSdkOptions = {},\n): AgentInspectAiSdkIntegration {\n const integration = new AgentInspectAiSdkTelemetryIntegration(options);\n return {\n ...bindTelemetryIntegration(integration),\n getDiagnostics: () => integration.getDiagnostics(),\n };\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { TelemetryIntegration } from 'ai';
|
|
2
|
+
import { RedactionProfile } from 'agent-inspect';
|
|
3
|
+
import { TraceWriter } from 'agent-inspect/writers';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Experimental capture mode for the AI SDK adapter.
|
|
7
|
+
*
|
|
8
|
+
* @experimental This package is part of the v1.7 adapter train.
|
|
9
|
+
*/
|
|
10
|
+
type AgentInspectAiSdkCaptureMode = "metadata-only" | "preview";
|
|
11
|
+
/**
|
|
12
|
+
* Options for the experimental AI SDK telemetry integration.
|
|
13
|
+
*
|
|
14
|
+
* @experimental Callers must keep AI SDK telemetry configured with
|
|
15
|
+
* `recordInputs: false` and `recordOutputs: false`.
|
|
16
|
+
*/
|
|
17
|
+
interface AgentInspectAiSdkOptions {
|
|
18
|
+
/**
|
|
19
|
+
* Explicit local writer for future runtime integration.
|
|
20
|
+
*/
|
|
21
|
+
writer?: TraceWriter;
|
|
22
|
+
/**
|
|
23
|
+
* Convenience local trace directory for future writer-owned persistence.
|
|
24
|
+
*/
|
|
25
|
+
traceDir?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Optional run name used by future lifecycle mapping.
|
|
28
|
+
*/
|
|
29
|
+
runName?: string;
|
|
30
|
+
/**
|
|
31
|
+
* Capture policy. Defaults to metadata-only when runtime mapping lands.
|
|
32
|
+
*/
|
|
33
|
+
capture?: AgentInspectAiSdkCaptureMode;
|
|
34
|
+
/**
|
|
35
|
+
* Redaction profile applied before local persistence in future mapping.
|
|
36
|
+
*/
|
|
37
|
+
redactionProfile?: RedactionProfile;
|
|
38
|
+
/**
|
|
39
|
+
* Bounds any future preview capture.
|
|
40
|
+
*/
|
|
41
|
+
maxPreviewChars?: number;
|
|
42
|
+
}
|
|
43
|
+
interface AgentInspectAiSdkDiagnostics {
|
|
44
|
+
writeFailures: number;
|
|
45
|
+
lastError?: string;
|
|
46
|
+
}
|
|
47
|
+
interface AgentInspectAiSdkIntegration extends TelemetryIntegration {
|
|
48
|
+
getDiagnostics(): AgentInspectAiSdkDiagnostics;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create an AgentInspect telemetry integration for the Vercel AI SDK.
|
|
52
|
+
*
|
|
53
|
+
* @experimental The adapter maps metadata-only generation, LLM step, and tool
|
|
54
|
+
* lifecycle events. Keep AI SDK telemetry configured with
|
|
55
|
+
* `recordInputs: false` and `recordOutputs: false`.
|
|
56
|
+
*/
|
|
57
|
+
declare function agentInspect(options?: AgentInspectAiSdkOptions): AgentInspectAiSdkIntegration;
|
|
58
|
+
|
|
59
|
+
export { type AgentInspectAiSdkCaptureMode, type AgentInspectAiSdkDiagnostics, type AgentInspectAiSdkIntegration, type AgentInspectAiSdkOptions, agentInspect };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { TelemetryIntegration } from 'ai';
|
|
2
|
+
import { RedactionProfile } from 'agent-inspect';
|
|
3
|
+
import { TraceWriter } from 'agent-inspect/writers';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Experimental capture mode for the AI SDK adapter.
|
|
7
|
+
*
|
|
8
|
+
* @experimental This package is part of the v1.7 adapter train.
|
|
9
|
+
*/
|
|
10
|
+
type AgentInspectAiSdkCaptureMode = "metadata-only" | "preview";
|
|
11
|
+
/**
|
|
12
|
+
* Options for the experimental AI SDK telemetry integration.
|
|
13
|
+
*
|
|
14
|
+
* @experimental Callers must keep AI SDK telemetry configured with
|
|
15
|
+
* `recordInputs: false` and `recordOutputs: false`.
|
|
16
|
+
*/
|
|
17
|
+
interface AgentInspectAiSdkOptions {
|
|
18
|
+
/**
|
|
19
|
+
* Explicit local writer for future runtime integration.
|
|
20
|
+
*/
|
|
21
|
+
writer?: TraceWriter;
|
|
22
|
+
/**
|
|
23
|
+
* Convenience local trace directory for future writer-owned persistence.
|
|
24
|
+
*/
|
|
25
|
+
traceDir?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Optional run name used by future lifecycle mapping.
|
|
28
|
+
*/
|
|
29
|
+
runName?: string;
|
|
30
|
+
/**
|
|
31
|
+
* Capture policy. Defaults to metadata-only when runtime mapping lands.
|
|
32
|
+
*/
|
|
33
|
+
capture?: AgentInspectAiSdkCaptureMode;
|
|
34
|
+
/**
|
|
35
|
+
* Redaction profile applied before local persistence in future mapping.
|
|
36
|
+
*/
|
|
37
|
+
redactionProfile?: RedactionProfile;
|
|
38
|
+
/**
|
|
39
|
+
* Bounds any future preview capture.
|
|
40
|
+
*/
|
|
41
|
+
maxPreviewChars?: number;
|
|
42
|
+
}
|
|
43
|
+
interface AgentInspectAiSdkDiagnostics {
|
|
44
|
+
writeFailures: number;
|
|
45
|
+
lastError?: string;
|
|
46
|
+
}
|
|
47
|
+
interface AgentInspectAiSdkIntegration extends TelemetryIntegration {
|
|
48
|
+
getDiagnostics(): AgentInspectAiSdkDiagnostics;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create an AgentInspect telemetry integration for the Vercel AI SDK.
|
|
52
|
+
*
|
|
53
|
+
* @experimental The adapter maps metadata-only generation, LLM step, and tool
|
|
54
|
+
* lifecycle events. Keep AI SDK telemetry configured with
|
|
55
|
+
* `recordInputs: false` and `recordOutputs: false`.
|
|
56
|
+
*/
|
|
57
|
+
declare function agentInspect(options?: AgentInspectAiSdkOptions): AgentInspectAiSdkIntegration;
|
|
58
|
+
|
|
59
|
+
export { type AgentInspectAiSdkCaptureMode, type AgentInspectAiSdkDiagnostics, type AgentInspectAiSdkIntegration, type AgentInspectAiSdkOptions, agentInspect };
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import { bindTelemetryIntegration } from 'ai';
|
|
2
|
+
import { fileWriter } from 'agent-inspect/writers';
|
|
3
|
+
|
|
4
|
+
// packages/ai-sdk/src/index.ts
|
|
5
|
+
var AI_SDK_SOURCE = {
|
|
6
|
+
type: "ai-sdk",
|
|
7
|
+
name: "@agent-inspect/ai-sdk",
|
|
8
|
+
version: "experimental"
|
|
9
|
+
};
|
|
10
|
+
function nowIso() {
|
|
11
|
+
return (/* @__PURE__ */ new Date()).toISOString();
|
|
12
|
+
}
|
|
13
|
+
function createId(prefix) {
|
|
14
|
+
if (typeof crypto !== "undefined" && "randomUUID" in crypto) {
|
|
15
|
+
return `${prefix}_${crypto.randomUUID()}`;
|
|
16
|
+
}
|
|
17
|
+
return `${prefix}_${Date.now()}_${Math.random().toString(16).slice(2)}`;
|
|
18
|
+
}
|
|
19
|
+
function normalizeError(error) {
|
|
20
|
+
if (error instanceof Error && error.message.trim() !== "") {
|
|
21
|
+
return error.message;
|
|
22
|
+
}
|
|
23
|
+
if (typeof error === "string" && error.trim() !== "") {
|
|
24
|
+
return error;
|
|
25
|
+
}
|
|
26
|
+
return "Unknown AI SDK integration error";
|
|
27
|
+
}
|
|
28
|
+
function durationMs(startedAt, endedAt) {
|
|
29
|
+
const started = Date.parse(startedAt);
|
|
30
|
+
const ended = Date.parse(endedAt);
|
|
31
|
+
if (!Number.isFinite(started) || !Number.isFinite(ended)) return void 0;
|
|
32
|
+
return Math.max(0, ended - started);
|
|
33
|
+
}
|
|
34
|
+
function countRecordKeys(value) {
|
|
35
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
36
|
+
return void 0;
|
|
37
|
+
}
|
|
38
|
+
return Object.keys(value).length;
|
|
39
|
+
}
|
|
40
|
+
function summarizeUnknown(value) {
|
|
41
|
+
if (value === null) return { type: "null" };
|
|
42
|
+
if (Array.isArray(value)) return { type: "array", itemCount: value.length };
|
|
43
|
+
if (typeof value === "object") {
|
|
44
|
+
return { type: "object", keyCount: countRecordKeys(value) ?? 0 };
|
|
45
|
+
}
|
|
46
|
+
if (typeof value === "string") {
|
|
47
|
+
return { type: "string", length: value.length };
|
|
48
|
+
}
|
|
49
|
+
const valueType = typeof value;
|
|
50
|
+
if (valueType === "number" || valueType === "boolean" || valueType === "bigint") {
|
|
51
|
+
return { type: valueType };
|
|
52
|
+
}
|
|
53
|
+
if (valueType === "undefined") return { type: "undefined" };
|
|
54
|
+
return { type: "unknown" };
|
|
55
|
+
}
|
|
56
|
+
function summarizeError(error) {
|
|
57
|
+
if (error instanceof Error) {
|
|
58
|
+
return {
|
|
59
|
+
name: error.name || "Error",
|
|
60
|
+
message: error.message
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (typeof error === "string") {
|
|
64
|
+
return {
|
|
65
|
+
message: error
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
message: "Unknown AI SDK tool error"
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function summarizeModel(model) {
|
|
73
|
+
return {
|
|
74
|
+
provider: model?.provider,
|
|
75
|
+
modelId: model?.modelId
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function summarizeUsage(usage) {
|
|
79
|
+
if (!usage) return void 0;
|
|
80
|
+
const tokenUsage = {};
|
|
81
|
+
if (typeof usage.inputTokens === "number") tokenUsage.input = usage.inputTokens;
|
|
82
|
+
if (typeof usage.outputTokens === "number") tokenUsage.output = usage.outputTokens;
|
|
83
|
+
if (typeof usage.totalTokens === "number") tokenUsage.total = usage.totalTokens;
|
|
84
|
+
if (typeof usage.cachedInputTokens === "number") tokenUsage.cached = usage.cachedInputTokens;
|
|
85
|
+
return Object.keys(tokenUsage).length > 0 ? tokenUsage : void 0;
|
|
86
|
+
}
|
|
87
|
+
function summarizeFinishReason(finishReason) {
|
|
88
|
+
if (typeof finishReason === "string") {
|
|
89
|
+
return { finishReason };
|
|
90
|
+
}
|
|
91
|
+
if (typeof finishReason !== "object" || finishReason === null) {
|
|
92
|
+
return {};
|
|
93
|
+
}
|
|
94
|
+
const value = finishReason;
|
|
95
|
+
return {
|
|
96
|
+
finishReason: typeof value.unified === "string" ? value.unified : void 0,
|
|
97
|
+
rawFinishReason: typeof value.raw === "string" ? value.raw : void 0
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
var AgentInspectAiSdkTelemetryIntegration = class {
|
|
101
|
+
constructor(options) {
|
|
102
|
+
this.options = options;
|
|
103
|
+
this.writer = options.writer ?? (options.traceDir ? fileWriter({ dir: options.traceDir }) : void 0);
|
|
104
|
+
}
|
|
105
|
+
options;
|
|
106
|
+
writer;
|
|
107
|
+
diagnostics = {
|
|
108
|
+
writeFailures: 0
|
|
109
|
+
};
|
|
110
|
+
activeRun;
|
|
111
|
+
getDiagnostics() {
|
|
112
|
+
return { ...this.diagnostics };
|
|
113
|
+
}
|
|
114
|
+
async onStart(event) {
|
|
115
|
+
const startedAt = nowIso();
|
|
116
|
+
const runId = createId("ai_sdk_run");
|
|
117
|
+
const eventId = createId("event");
|
|
118
|
+
const name = this.options.runName ?? event.functionId ?? event.model.modelId ?? "ai-sdk-generation";
|
|
119
|
+
this.activeRun = {
|
|
120
|
+
runId,
|
|
121
|
+
eventId,
|
|
122
|
+
name,
|
|
123
|
+
startedAt,
|
|
124
|
+
model: event.model,
|
|
125
|
+
steps: /* @__PURE__ */ new Map(),
|
|
126
|
+
tools: /* @__PURE__ */ new Map()
|
|
127
|
+
};
|
|
128
|
+
await this.write({
|
|
129
|
+
schemaVersion: "0.2",
|
|
130
|
+
eventId,
|
|
131
|
+
runId,
|
|
132
|
+
kind: "RUN",
|
|
133
|
+
name,
|
|
134
|
+
status: "running",
|
|
135
|
+
timestamp: startedAt,
|
|
136
|
+
startedAt,
|
|
137
|
+
confidence: "explicit",
|
|
138
|
+
source: AI_SDK_SOURCE,
|
|
139
|
+
attributes: {
|
|
140
|
+
...summarizeModel(event.model),
|
|
141
|
+
functionId: event.functionId,
|
|
142
|
+
capture: this.options.capture ?? "metadata-only",
|
|
143
|
+
recordInputsRequired: false,
|
|
144
|
+
recordOutputsRequired: false,
|
|
145
|
+
toolCount: countRecordKeys(event.tools),
|
|
146
|
+
hasPrompt: event.prompt !== void 0,
|
|
147
|
+
hasMessages: event.messages !== void 0,
|
|
148
|
+
metadataKeyCount: countRecordKeys(event.metadata)
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
async onStepStart(event) {
|
|
153
|
+
const run = this.ensureRun(event.model, event.functionId);
|
|
154
|
+
const startedAt = nowIso();
|
|
155
|
+
const stepEventId = createId("event");
|
|
156
|
+
run.steps.set(event.stepNumber, {
|
|
157
|
+
eventId: stepEventId,
|
|
158
|
+
startedAt
|
|
159
|
+
});
|
|
160
|
+
await this.write({
|
|
161
|
+
schemaVersion: "0.2",
|
|
162
|
+
eventId: stepEventId,
|
|
163
|
+
runId: run.runId,
|
|
164
|
+
parentId: run.eventId,
|
|
165
|
+
kind: "LLM",
|
|
166
|
+
name: `ai-sdk-step-${event.stepNumber}`,
|
|
167
|
+
status: "running",
|
|
168
|
+
timestamp: startedAt,
|
|
169
|
+
startedAt,
|
|
170
|
+
confidence: "explicit",
|
|
171
|
+
source: AI_SDK_SOURCE,
|
|
172
|
+
attributes: {
|
|
173
|
+
...summarizeModel(event.model),
|
|
174
|
+
functionId: event.functionId,
|
|
175
|
+
stepNumber: event.stepNumber,
|
|
176
|
+
priorStepCount: event.steps.length,
|
|
177
|
+
activeToolCount: event.activeTools?.length,
|
|
178
|
+
toolCount: countRecordKeys(event.tools),
|
|
179
|
+
messageCount: event.messages.length,
|
|
180
|
+
metadataKeyCount: countRecordKeys(event.metadata)
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
async onStepFinish(event) {
|
|
185
|
+
const run = this.ensureRun(event.model, event.functionId);
|
|
186
|
+
const endedAt = nowIso();
|
|
187
|
+
const activeStep = run.steps.get(event.stepNumber) ?? {
|
|
188
|
+
eventId: createId("event"),
|
|
189
|
+
startedAt: endedAt
|
|
190
|
+
};
|
|
191
|
+
await this.write({
|
|
192
|
+
schemaVersion: "0.2",
|
|
193
|
+
eventId: createId("event"),
|
|
194
|
+
runId: run.runId,
|
|
195
|
+
parentId: activeStep.eventId,
|
|
196
|
+
kind: "LLM",
|
|
197
|
+
name: `ai-sdk-step-${event.stepNumber}`,
|
|
198
|
+
status: "ok",
|
|
199
|
+
timestamp: endedAt,
|
|
200
|
+
startedAt: activeStep.startedAt,
|
|
201
|
+
endedAt,
|
|
202
|
+
durationMs: durationMs(activeStep.startedAt, endedAt),
|
|
203
|
+
confidence: "explicit",
|
|
204
|
+
source: AI_SDK_SOURCE,
|
|
205
|
+
attributes: {
|
|
206
|
+
...summarizeModel(event.model),
|
|
207
|
+
functionId: event.functionId,
|
|
208
|
+
stepNumber: event.stepNumber,
|
|
209
|
+
...summarizeFinishReason(event.finishReason),
|
|
210
|
+
warningCount: event.warnings?.length ?? 0,
|
|
211
|
+
contentPartCount: event.content.length,
|
|
212
|
+
toolCallCount: event.toolCalls.length,
|
|
213
|
+
toolResultCount: event.toolResults.length,
|
|
214
|
+
responseId: event.response.id,
|
|
215
|
+
responseModelId: event.response.modelId,
|
|
216
|
+
responseTimestamp: event.response.timestamp?.toISOString(),
|
|
217
|
+
metadataKeyCount: countRecordKeys(event.metadata)
|
|
218
|
+
},
|
|
219
|
+
tokenUsage: summarizeUsage(event.usage),
|
|
220
|
+
outputSummary: {
|
|
221
|
+
contentPartCount: event.content.length,
|
|
222
|
+
textLength: event.text.length,
|
|
223
|
+
reasoningPartCount: event.reasoning.length,
|
|
224
|
+
fileCount: event.files.length,
|
|
225
|
+
sourceCount: event.sources.length
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
async onToolCallStart(event) {
|
|
230
|
+
const run = this.ensureRun(event.model, event.functionId);
|
|
231
|
+
const startedAt = nowIso();
|
|
232
|
+
const eventId = createId("event");
|
|
233
|
+
const toolCall = event.toolCall;
|
|
234
|
+
run.tools.set(toolCall.toolCallId, {
|
|
235
|
+
eventId,
|
|
236
|
+
startedAt,
|
|
237
|
+
toolName: toolCall.toolName
|
|
238
|
+
});
|
|
239
|
+
const step = event.stepNumber === void 0 ? void 0 : run.steps.get(event.stepNumber);
|
|
240
|
+
await this.write({
|
|
241
|
+
schemaVersion: "0.2",
|
|
242
|
+
eventId,
|
|
243
|
+
runId: run.runId,
|
|
244
|
+
parentId: step?.eventId ?? run.eventId,
|
|
245
|
+
kind: "TOOL",
|
|
246
|
+
name: toolCall.toolName,
|
|
247
|
+
status: "running",
|
|
248
|
+
timestamp: startedAt,
|
|
249
|
+
startedAt,
|
|
250
|
+
confidence: "explicit",
|
|
251
|
+
source: AI_SDK_SOURCE,
|
|
252
|
+
attributes: {
|
|
253
|
+
...summarizeModel(event.model),
|
|
254
|
+
functionId: event.functionId,
|
|
255
|
+
stepNumber: event.stepNumber,
|
|
256
|
+
toolCallId: toolCall.toolCallId,
|
|
257
|
+
toolName: toolCall.toolName,
|
|
258
|
+
dynamic: toolCall.dynamic === true,
|
|
259
|
+
invalid: toolCall.invalid === true,
|
|
260
|
+
providerExecuted: toolCall.providerExecuted === true,
|
|
261
|
+
messageCount: event.messages.length,
|
|
262
|
+
metadataKeyCount: countRecordKeys(event.metadata),
|
|
263
|
+
providerMetadataKeyCount: countRecordKeys(toolCall.providerMetadata),
|
|
264
|
+
toolMetadataKeyCount: countRecordKeys(toolCall.toolMetadata)
|
|
265
|
+
},
|
|
266
|
+
inputSummary: summarizeUnknown(toolCall.input),
|
|
267
|
+
error: toolCall.invalid ? summarizeError(toolCall.error) : void 0
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
async onToolCallFinish(event) {
|
|
271
|
+
const run = this.ensureRun(event.model, event.functionId);
|
|
272
|
+
const endedAt = nowIso();
|
|
273
|
+
const toolCall = event.toolCall;
|
|
274
|
+
const activeTool = run.tools.get(toolCall.toolCallId) ?? {
|
|
275
|
+
eventId: createId("event"),
|
|
276
|
+
startedAt: endedAt,
|
|
277
|
+
toolName: toolCall.toolName
|
|
278
|
+
};
|
|
279
|
+
await this.write({
|
|
280
|
+
schemaVersion: "0.2",
|
|
281
|
+
eventId: createId("event"),
|
|
282
|
+
runId: run.runId,
|
|
283
|
+
parentId: activeTool.eventId,
|
|
284
|
+
kind: "TOOL",
|
|
285
|
+
name: activeTool.toolName,
|
|
286
|
+
status: event.success ? "ok" : "error",
|
|
287
|
+
timestamp: endedAt,
|
|
288
|
+
startedAt: activeTool.startedAt,
|
|
289
|
+
endedAt,
|
|
290
|
+
durationMs: event.durationMs,
|
|
291
|
+
confidence: "explicit",
|
|
292
|
+
source: AI_SDK_SOURCE,
|
|
293
|
+
attributes: {
|
|
294
|
+
...summarizeModel(event.model),
|
|
295
|
+
functionId: event.functionId,
|
|
296
|
+
stepNumber: event.stepNumber,
|
|
297
|
+
toolCallId: toolCall.toolCallId,
|
|
298
|
+
toolName: toolCall.toolName,
|
|
299
|
+
dynamic: toolCall.dynamic === true,
|
|
300
|
+
invalid: toolCall.invalid === true,
|
|
301
|
+
providerExecuted: toolCall.providerExecuted === true,
|
|
302
|
+
messageCount: event.messages.length,
|
|
303
|
+
metadataKeyCount: countRecordKeys(event.metadata),
|
|
304
|
+
providerMetadataKeyCount: countRecordKeys(toolCall.providerMetadata),
|
|
305
|
+
toolMetadataKeyCount: countRecordKeys(toolCall.toolMetadata)
|
|
306
|
+
},
|
|
307
|
+
outputSummary: event.success ? summarizeUnknown(event.output) : void 0,
|
|
308
|
+
error: event.success ? void 0 : summarizeError(event.error)
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
async onFinish(event) {
|
|
312
|
+
const run = this.ensureRun(event.model, event.functionId);
|
|
313
|
+
const endedAt = nowIso();
|
|
314
|
+
await this.write({
|
|
315
|
+
schemaVersion: "0.2",
|
|
316
|
+
eventId: createId("event"),
|
|
317
|
+
runId: run.runId,
|
|
318
|
+
kind: "RUN",
|
|
319
|
+
name: run.name,
|
|
320
|
+
status: "ok",
|
|
321
|
+
timestamp: endedAt,
|
|
322
|
+
startedAt: run.startedAt,
|
|
323
|
+
endedAt,
|
|
324
|
+
durationMs: durationMs(run.startedAt, endedAt),
|
|
325
|
+
confidence: "explicit",
|
|
326
|
+
source: AI_SDK_SOURCE,
|
|
327
|
+
attributes: {
|
|
328
|
+
...summarizeModel(event.model ?? run.model),
|
|
329
|
+
functionId: event.functionId,
|
|
330
|
+
...summarizeFinishReason(event.finishReason),
|
|
331
|
+
stepCount: event.steps.length,
|
|
332
|
+
warningCount: event.warnings?.length ?? 0,
|
|
333
|
+
toolCallCount: event.toolCalls.length,
|
|
334
|
+
toolResultCount: event.toolResults.length,
|
|
335
|
+
metadataKeyCount: countRecordKeys(event.metadata)
|
|
336
|
+
},
|
|
337
|
+
tokenUsage: summarizeUsage(event.totalUsage),
|
|
338
|
+
outputSummary: {
|
|
339
|
+
contentPartCount: event.content.length,
|
|
340
|
+
textLength: event.text.length,
|
|
341
|
+
reasoningPartCount: event.reasoning.length,
|
|
342
|
+
fileCount: event.files.length,
|
|
343
|
+
sourceCount: event.sources.length
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
this.activeRun = void 0;
|
|
347
|
+
}
|
|
348
|
+
ensureRun(model, functionId) {
|
|
349
|
+
if (this.activeRun) return this.activeRun;
|
|
350
|
+
const startedAt = nowIso();
|
|
351
|
+
this.activeRun = {
|
|
352
|
+
runId: createId("ai_sdk_run"),
|
|
353
|
+
eventId: createId("event"),
|
|
354
|
+
name: this.options.runName ?? functionId ?? model?.modelId ?? "ai-sdk-generation",
|
|
355
|
+
startedAt,
|
|
356
|
+
model,
|
|
357
|
+
steps: /* @__PURE__ */ new Map(),
|
|
358
|
+
tools: /* @__PURE__ */ new Map()
|
|
359
|
+
};
|
|
360
|
+
return this.activeRun;
|
|
361
|
+
}
|
|
362
|
+
async write(event) {
|
|
363
|
+
if (!this.writer) return;
|
|
364
|
+
try {
|
|
365
|
+
await this.writer.write(event);
|
|
366
|
+
} catch (error) {
|
|
367
|
+
this.diagnostics.writeFailures += 1;
|
|
368
|
+
this.diagnostics.lastError = normalizeError(error);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
function agentInspect(options = {}) {
|
|
373
|
+
const integration = new AgentInspectAiSdkTelemetryIntegration(options);
|
|
374
|
+
return {
|
|
375
|
+
...bindTelemetryIntegration(integration),
|
|
376
|
+
getDiagnostics: () => integration.getDiagnostics()
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
export { agentInspect };
|
|
381
|
+
//# sourceMappingURL=index.mjs.map
|
|
382
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import { bindTelemetryIntegration } from \"ai\";\nimport type {\n OnFinishEvent,\n OnStartEvent,\n OnStepFinishEvent,\n OnStepStartEvent,\n OnToolCallFinishEvent,\n OnToolCallStartEvent,\n TelemetryIntegration,\n} from \"ai\";\nimport type {\n PersistedInspectEvent,\n PersistedInspectError,\n PersistedTokenUsage,\n RedactionProfile,\n} from \"agent-inspect\";\nimport { fileWriter } from \"agent-inspect/writers\";\nimport type { TraceWriter } from \"agent-inspect/writers\";\n\n/**\n * Experimental capture mode for the AI SDK adapter.\n *\n * @experimental This package is part of the v1.7 adapter train.\n */\nexport type AgentInspectAiSdkCaptureMode = \"metadata-only\" | \"preview\";\n\n/**\n * Options for the experimental AI SDK telemetry integration.\n *\n * @experimental Callers must keep AI SDK telemetry configured with\n * `recordInputs: false` and `recordOutputs: false`.\n */\nexport interface AgentInspectAiSdkOptions {\n /**\n * Explicit local writer for future runtime integration.\n */\n writer?: TraceWriter;\n\n /**\n * Convenience local trace directory for future writer-owned persistence.\n */\n traceDir?: string;\n\n /**\n * Optional run name used by future lifecycle mapping.\n */\n runName?: string;\n\n /**\n * Capture policy. Defaults to metadata-only when runtime mapping lands.\n */\n capture?: AgentInspectAiSdkCaptureMode;\n\n /**\n * Redaction profile applied before local persistence in future mapping.\n */\n redactionProfile?: RedactionProfile;\n\n /**\n * Bounds any future preview capture.\n */\n maxPreviewChars?: number;\n}\n\nexport interface AgentInspectAiSdkDiagnostics {\n writeFailures: number;\n lastError?: string;\n}\n\nexport interface AgentInspectAiSdkIntegration extends TelemetryIntegration {\n getDiagnostics(): AgentInspectAiSdkDiagnostics;\n}\n\ntype AiSdkModelInfo = {\n provider?: string;\n modelId?: string;\n};\n\ntype AiSdkUsage = {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cachedInputTokens?: number;\n};\n\ninterface ActiveStep {\n eventId: string;\n startedAt: string;\n}\n\ninterface ActiveTool {\n eventId: string;\n startedAt: string;\n toolName: string;\n}\n\ninterface ActiveRun {\n runId: string;\n eventId: string;\n name: string;\n startedAt: string;\n model?: AiSdkModelInfo;\n steps: Map<number, ActiveStep>;\n tools: Map<string, ActiveTool>;\n}\n\nconst AI_SDK_SOURCE = {\n type: \"ai-sdk\",\n name: \"@agent-inspect/ai-sdk\",\n version: \"experimental\",\n} as const;\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction createId(prefix: string): string {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return `${prefix}_${crypto.randomUUID()}`;\n }\n return `${prefix}_${Date.now()}_${Math.random().toString(16).slice(2)}`;\n}\n\nfunction normalizeError(error: unknown): string {\n if (error instanceof Error && error.message.trim() !== \"\") {\n return error.message;\n }\n if (typeof error === \"string\" && error.trim() !== \"\") {\n return error;\n }\n return \"Unknown AI SDK integration error\";\n}\n\nfunction durationMs(startedAt: string, endedAt: string): number | undefined {\n const started = Date.parse(startedAt);\n const ended = Date.parse(endedAt);\n if (!Number.isFinite(started) || !Number.isFinite(ended)) return undefined;\n return Math.max(0, ended - started);\n}\n\nfunction countRecordKeys(value: unknown): number | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return undefined;\n }\n return Object.keys(value).length;\n}\n\nfunction summarizeUnknown(value: unknown): Record<string, unknown> {\n if (value === null) return { type: \"null\" };\n if (Array.isArray(value)) return { type: \"array\", itemCount: value.length };\n\n if (typeof value === \"object\") {\n return { type: \"object\", keyCount: countRecordKeys(value) ?? 0 };\n }\n if (typeof value === \"string\") {\n return { type: \"string\", length: value.length };\n }\n const valueType = typeof value;\n if (valueType === \"number\" || valueType === \"boolean\" || valueType === \"bigint\") {\n return { type: valueType };\n }\n if (valueType === \"undefined\") return { type: \"undefined\" };\n return { type: \"unknown\" };\n}\n\nfunction summarizeError(error: unknown): PersistedInspectError {\n if (error instanceof Error) {\n return {\n name: error.name || \"Error\",\n message: error.message,\n };\n }\n if (typeof error === \"string\") {\n return {\n message: error,\n };\n }\n return {\n message: \"Unknown AI SDK tool error\",\n };\n}\n\nfunction summarizeModel(model: AiSdkModelInfo | undefined): Record<string, unknown> {\n return {\n provider: model?.provider,\n modelId: model?.modelId,\n };\n}\n\nfunction summarizeUsage(usage: AiSdkUsage | undefined): PersistedTokenUsage | undefined {\n if (!usage) return undefined;\n\n const tokenUsage: PersistedTokenUsage = {};\n if (typeof usage.inputTokens === \"number\") tokenUsage.input = usage.inputTokens;\n if (typeof usage.outputTokens === \"number\") tokenUsage.output = usage.outputTokens;\n if (typeof usage.totalTokens === \"number\") tokenUsage.total = usage.totalTokens;\n if (typeof usage.cachedInputTokens === \"number\") tokenUsage.cached = usage.cachedInputTokens;\n\n return Object.keys(tokenUsage).length > 0 ? tokenUsage : undefined;\n}\n\nfunction summarizeFinishReason(\n finishReason: unknown,\n): { finishReason?: string; rawFinishReason?: string } {\n if (typeof finishReason === \"string\") {\n return { finishReason };\n }\n if (typeof finishReason !== \"object\" || finishReason === null) {\n return {};\n }\n\n const value = finishReason as { unified?: unknown; raw?: unknown };\n return {\n finishReason: typeof value.unified === \"string\" ? value.unified : undefined,\n rawFinishReason: typeof value.raw === \"string\" ? value.raw : undefined,\n };\n}\n\nclass AgentInspectAiSdkTelemetryIntegration {\n private readonly writer: TraceWriter | undefined;\n private readonly diagnostics: AgentInspectAiSdkDiagnostics = {\n writeFailures: 0,\n };\n private activeRun: ActiveRun | undefined;\n\n constructor(private readonly options: AgentInspectAiSdkOptions) {\n this.writer = options.writer ?? (options.traceDir ? fileWriter({ dir: options.traceDir }) : undefined);\n }\n\n getDiagnostics(): AgentInspectAiSdkDiagnostics {\n return { ...this.diagnostics };\n }\n\n async onStart(event: OnStartEvent): Promise<void> {\n const startedAt = nowIso();\n const runId = createId(\"ai_sdk_run\");\n const eventId = createId(\"event\");\n const name =\n this.options.runName ??\n event.functionId ??\n event.model.modelId ??\n \"ai-sdk-generation\";\n\n this.activeRun = {\n runId,\n eventId,\n name,\n startedAt,\n model: event.model,\n steps: new Map(),\n tools: new Map(),\n };\n\n await this.write({\n schemaVersion: \"0.2\",\n eventId,\n runId,\n kind: \"RUN\",\n name,\n status: \"running\",\n timestamp: startedAt,\n startedAt,\n confidence: \"explicit\",\n source: AI_SDK_SOURCE,\n attributes: {\n ...summarizeModel(event.model),\n functionId: event.functionId,\n capture: this.options.capture ?? \"metadata-only\",\n recordInputsRequired: false,\n recordOutputsRequired: false,\n toolCount: countRecordKeys(event.tools),\n hasPrompt: event.prompt !== undefined,\n hasMessages: event.messages !== undefined,\n metadataKeyCount: countRecordKeys(event.metadata),\n },\n });\n }\n\n async onStepStart(event: OnStepStartEvent): Promise<void> {\n const run = this.ensureRun(event.model, event.functionId);\n const startedAt = nowIso();\n const stepEventId = createId(\"event\");\n run.steps.set(event.stepNumber, {\n eventId: stepEventId,\n startedAt,\n });\n\n await this.write({\n schemaVersion: \"0.2\",\n eventId: stepEventId,\n runId: run.runId,\n parentId: run.eventId,\n kind: \"LLM\",\n name: `ai-sdk-step-${event.stepNumber}`,\n status: \"running\",\n timestamp: startedAt,\n startedAt,\n confidence: \"explicit\",\n source: AI_SDK_SOURCE,\n attributes: {\n ...summarizeModel(event.model),\n functionId: event.functionId,\n stepNumber: event.stepNumber,\n priorStepCount: event.steps.length,\n activeToolCount: event.activeTools?.length,\n toolCount: countRecordKeys(event.tools),\n messageCount: event.messages.length,\n metadataKeyCount: countRecordKeys(event.metadata),\n },\n });\n }\n\n async onStepFinish(event: OnStepFinishEvent): Promise<void> {\n const run = this.ensureRun(event.model, event.functionId);\n const endedAt = nowIso();\n const activeStep =\n run.steps.get(event.stepNumber) ?? {\n eventId: createId(\"event\"),\n startedAt: endedAt,\n };\n\n await this.write({\n schemaVersion: \"0.2\",\n eventId: createId(\"event\"),\n runId: run.runId,\n parentId: activeStep.eventId,\n kind: \"LLM\",\n name: `ai-sdk-step-${event.stepNumber}`,\n status: \"ok\",\n timestamp: endedAt,\n startedAt: activeStep.startedAt,\n endedAt,\n durationMs: durationMs(activeStep.startedAt, endedAt),\n confidence: \"explicit\",\n source: AI_SDK_SOURCE,\n attributes: {\n ...summarizeModel(event.model),\n functionId: event.functionId,\n stepNumber: event.stepNumber,\n ...summarizeFinishReason(event.finishReason),\n warningCount: event.warnings?.length ?? 0,\n contentPartCount: event.content.length,\n toolCallCount: event.toolCalls.length,\n toolResultCount: event.toolResults.length,\n responseId: event.response.id,\n responseModelId: event.response.modelId,\n responseTimestamp: event.response.timestamp?.toISOString(),\n metadataKeyCount: countRecordKeys(event.metadata),\n },\n tokenUsage: summarizeUsage(event.usage),\n outputSummary: {\n contentPartCount: event.content.length,\n textLength: event.text.length,\n reasoningPartCount: event.reasoning.length,\n fileCount: event.files.length,\n sourceCount: event.sources.length,\n },\n });\n }\n\n async onToolCallStart(event: OnToolCallStartEvent): Promise<void> {\n const run = this.ensureRun(event.model, event.functionId);\n const startedAt = nowIso();\n const eventId = createId(\"event\");\n const toolCall = event.toolCall;\n run.tools.set(toolCall.toolCallId, {\n eventId,\n startedAt,\n toolName: toolCall.toolName,\n });\n\n const step = event.stepNumber === undefined ? undefined : run.steps.get(event.stepNumber);\n\n await this.write({\n schemaVersion: \"0.2\",\n eventId,\n runId: run.runId,\n parentId: step?.eventId ?? run.eventId,\n kind: \"TOOL\",\n name: toolCall.toolName,\n status: \"running\",\n timestamp: startedAt,\n startedAt,\n confidence: \"explicit\",\n source: AI_SDK_SOURCE,\n attributes: {\n ...summarizeModel(event.model),\n functionId: event.functionId,\n stepNumber: event.stepNumber,\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n dynamic: toolCall.dynamic === true,\n invalid: toolCall.invalid === true,\n providerExecuted: toolCall.providerExecuted === true,\n messageCount: event.messages.length,\n metadataKeyCount: countRecordKeys(event.metadata),\n providerMetadataKeyCount: countRecordKeys(toolCall.providerMetadata),\n toolMetadataKeyCount: countRecordKeys(toolCall.toolMetadata),\n },\n inputSummary: summarizeUnknown(toolCall.input),\n error: toolCall.invalid ? summarizeError(toolCall.error) : undefined,\n });\n }\n\n async onToolCallFinish(event: OnToolCallFinishEvent): Promise<void> {\n const run = this.ensureRun(event.model, event.functionId);\n const endedAt = nowIso();\n const toolCall = event.toolCall;\n const activeTool =\n run.tools.get(toolCall.toolCallId) ?? {\n eventId: createId(\"event\"),\n startedAt: endedAt,\n toolName: toolCall.toolName,\n };\n\n await this.write({\n schemaVersion: \"0.2\",\n eventId: createId(\"event\"),\n runId: run.runId,\n parentId: activeTool.eventId,\n kind: \"TOOL\",\n name: activeTool.toolName,\n status: event.success ? \"ok\" : \"error\",\n timestamp: endedAt,\n startedAt: activeTool.startedAt,\n endedAt,\n durationMs: event.durationMs,\n confidence: \"explicit\",\n source: AI_SDK_SOURCE,\n attributes: {\n ...summarizeModel(event.model),\n functionId: event.functionId,\n stepNumber: event.stepNumber,\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n dynamic: toolCall.dynamic === true,\n invalid: toolCall.invalid === true,\n providerExecuted: toolCall.providerExecuted === true,\n messageCount: event.messages.length,\n metadataKeyCount: countRecordKeys(event.metadata),\n providerMetadataKeyCount: countRecordKeys(toolCall.providerMetadata),\n toolMetadataKeyCount: countRecordKeys(toolCall.toolMetadata),\n },\n outputSummary: event.success ? summarizeUnknown(event.output) : undefined,\n error: event.success ? undefined : summarizeError(event.error),\n });\n }\n\n async onFinish(event: OnFinishEvent): Promise<void> {\n const run = this.ensureRun(event.model, event.functionId);\n const endedAt = nowIso();\n\n await this.write({\n schemaVersion: \"0.2\",\n eventId: createId(\"event\"),\n runId: run.runId,\n kind: \"RUN\",\n name: run.name,\n status: \"ok\",\n timestamp: endedAt,\n startedAt: run.startedAt,\n endedAt,\n durationMs: durationMs(run.startedAt, endedAt),\n confidence: \"explicit\",\n source: AI_SDK_SOURCE,\n attributes: {\n ...summarizeModel(event.model ?? run.model),\n functionId: event.functionId,\n ...summarizeFinishReason(event.finishReason),\n stepCount: event.steps.length,\n warningCount: event.warnings?.length ?? 0,\n toolCallCount: event.toolCalls.length,\n toolResultCount: event.toolResults.length,\n metadataKeyCount: countRecordKeys(event.metadata),\n },\n tokenUsage: summarizeUsage(event.totalUsage),\n outputSummary: {\n contentPartCount: event.content.length,\n textLength: event.text.length,\n reasoningPartCount: event.reasoning.length,\n fileCount: event.files.length,\n sourceCount: event.sources.length,\n },\n });\n\n this.activeRun = undefined;\n }\n\n private ensureRun(model: AiSdkModelInfo | undefined, functionId: string | undefined): ActiveRun {\n if (this.activeRun) return this.activeRun;\n\n const startedAt = nowIso();\n this.activeRun = {\n runId: createId(\"ai_sdk_run\"),\n eventId: createId(\"event\"),\n name: this.options.runName ?? functionId ?? model?.modelId ?? \"ai-sdk-generation\",\n startedAt,\n model,\n steps: new Map(),\n tools: new Map(),\n };\n return this.activeRun;\n }\n\n private async write(event: PersistedInspectEvent): Promise<void> {\n if (!this.writer) return;\n\n try {\n await this.writer.write(event);\n } catch (error) {\n this.diagnostics.writeFailures += 1;\n this.diagnostics.lastError = normalizeError(error);\n }\n }\n}\n\n/**\n * Create an AgentInspect telemetry integration for the Vercel AI SDK.\n *\n * @experimental The adapter maps metadata-only generation, LLM step, and tool\n * lifecycle events. Keep AI SDK telemetry configured with\n * `recordInputs: false` and `recordOutputs: false`.\n */\nexport function agentInspect(\n options: AgentInspectAiSdkOptions = {},\n): AgentInspectAiSdkIntegration {\n const integration = new AgentInspectAiSdkTelemetryIntegration(options);\n return {\n ...bindTelemetryIntegration(integration),\n getDiagnostics: () => integration.getDiagnostics(),\n };\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@agent-inspect/ai-sdk",
|
|
3
|
+
"version": "1.7.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "Optional Vercel AI SDK telemetry integration for AgentInspect local traces",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/rajudandigam/agent-inspect.git",
|
|
10
|
+
"directory": "packages/ai-sdk"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/rajudandigam/agent-inspect/issues"
|
|
14
|
+
},
|
|
15
|
+
"homepage": "https://github.com/rajudandigam/agent-inspect#readme",
|
|
16
|
+
"sideEffects": false,
|
|
17
|
+
"main": "./dist/index.cjs",
|
|
18
|
+
"module": "./dist/index.mjs",
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"import": {
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"default": "./dist/index.mjs"
|
|
25
|
+
},
|
|
26
|
+
"require": {
|
|
27
|
+
"types": "./dist/index.d.cts",
|
|
28
|
+
"default": "./dist/index.cjs"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist"
|
|
34
|
+
],
|
|
35
|
+
"peerDependencies": {
|
|
36
|
+
"ai": "^6.0.0"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"agent-inspect": "1.7.0"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"ai": "^6.0.210"
|
|
43
|
+
},
|
|
44
|
+
"publishConfig": {
|
|
45
|
+
"access": "public"
|
|
46
|
+
},
|
|
47
|
+
"scripts": {
|
|
48
|
+
"build": "pnpm --workspace-root exec tsup --config tsup.ai-sdk.config.ts",
|
|
49
|
+
"test": "vitest run -c ../../vitest.config.ts"
|
|
50
|
+
}
|
|
51
|
+
}
|