@mastra/claude 0.3.0 → 0.3.1-alpha.1

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/dist/index.cjs CHANGED
@@ -1,1161 +1,950 @@
1
- 'use strict';
2
-
3
- var crypto = require('crypto');
4
- var web = require('stream/web');
5
- var claudeAgentSdk = require('@anthropic-ai/claude-agent-sdk');
6
- var agent = require('@mastra/core/agent');
7
- var requestContext = require('@mastra/core/request-context');
8
- var stream = require('@mastra/core/stream');
9
- var messageList = require('@mastra/core/agent/message-list');
10
- var observability = require('@mastra/core/observability');
11
- var schema = require('@mastra/core/schema');
12
-
13
- // src/index.ts
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ let crypto = require("crypto");
3
+ let stream_web = require("stream/web");
4
+ let _anthropic_ai_claude_agent_sdk = require("@anthropic-ai/claude-agent-sdk");
5
+ let _mastra_core_agent = require("@mastra/core/agent");
6
+ let _mastra_core_request_context = require("@mastra/core/request-context");
7
+ let _mastra_core_stream = require("@mastra/core/stream");
8
+ let _mastra_core_agent_message_list = require("@mastra/core/agent/message-list");
9
+ let _mastra_core_observability = require("@mastra/core/observability");
10
+ let _mastra_core_schema = require("@mastra/core/schema");
11
+ //#region src/utils.ts
14
12
  function createNoopModel({ modelId, provider }) {
15
- return {
16
- modelId,
17
- provider,
18
- specificationVersion: "v3",
19
- supportedUrls: {},
20
- doGenerate: async () => createNoopStreamResult(),
21
- doStream: async () => createNoopStreamResult()
22
- };
13
+ return {
14
+ modelId,
15
+ provider,
16
+ specificationVersion: "v3",
17
+ supportedUrls: {},
18
+ doGenerate: async () => createNoopStreamResult(),
19
+ doStream: async () => createNoopStreamResult()
20
+ };
23
21
  }
24
22
  function createNoopStreamResult() {
25
- return {
26
- stream: new web.ReadableStream({
27
- start: (controller) => controller.close()
28
- })
29
- };
30
- }
31
- function createCompletedMastraStream({
32
- runId,
33
- prompt,
34
- text,
35
- responseId,
36
- modelId,
37
- usage,
38
- providerMetadata,
39
- costContext,
40
- object
41
- }) {
42
- return new web.ReadableStream({
43
- start(controller) {
44
- const textId = crypto.randomUUID();
45
- enqueueStartChunks(controller, {
46
- runId,
47
- prompt,
48
- textId,
49
- responseId,
50
- modelId,
51
- providerMetadata
52
- });
53
- if (text) {
54
- enqueueTextDelta(controller, runId, textId, text);
55
- }
56
- enqueueFinishChunks(controller, {
57
- runId,
58
- prompt,
59
- textId,
60
- text,
61
- responseId,
62
- modelId,
63
- usage,
64
- providerMetadata,
65
- costContext,
66
- object
67
- });
68
- controller.close();
69
- }
70
- });
71
- }
72
- function createMastraOutput({
73
- messages,
74
- runId,
75
- modelId,
76
- provider,
77
- stream: stream$1,
78
- responseText = "",
79
- options
80
- }) {
81
- const messageList$1 = new messageList.MessageList();
82
- messageList$1.add(messages, "input");
83
- messageList$1.add([{ role: "assistant", content: responseText }], "response");
84
- return new stream.MastraModelOutput({
85
- model: {
86
- modelId,
87
- provider,
88
- version: "v3"
89
- },
90
- stream: stream$1,
91
- messageList: messageList$1,
92
- messageId: crypto.randomUUID(),
93
- options: {
94
- ...options,
95
- runId
96
- }
97
- });
98
- }
99
- function toFullOutput({
100
- messages,
101
- runId,
102
- provider,
103
- result,
104
- options
105
- }) {
106
- const text = result.content.map((part) => part.text).join("");
107
- const stream = createCompletedMastraStream({
108
- runId,
109
- prompt: promptToText(messages),
110
- text,
111
- responseId: result.response.id,
112
- modelId: result.response.modelId,
113
- usage: toLanguageModelUsage(result.usage),
114
- providerMetadata: result.providerMetadata,
115
- costContext: result.costContext,
116
- object: result.object
117
- });
118
- return createMastraOutput({
119
- messages,
120
- runId,
121
- modelId: result.response.modelId,
122
- provider,
123
- stream,
124
- responseText: text,
125
- options
126
- }).getFullOutput();
127
- }
128
- function createSDKAgentTelemetry({
129
- agentId,
130
- agentName,
131
- provider,
132
- modelId,
133
- messages,
134
- prompt,
135
- runId,
136
- streaming,
137
- method,
138
- requestContext,
139
- instructions,
140
- maxSteps,
141
- tracingOptions,
142
- tracingContext,
143
- onFinish,
144
- onStepFinish,
145
- mastra
146
- }) {
147
- const agentSpan = observability.getOrCreateSpan({
148
- type: observability.SpanType.AGENT_RUN,
149
- name: `agent run: '${agentId}'`,
150
- entityType: observability.EntityType.AGENT,
151
- entityId: agentId,
152
- entityName: agentName,
153
- input: messages,
154
- attributes: {
155
- prompt,
156
- instructions,
157
- maxSteps
158
- },
159
- metadata: {
160
- runId,
161
- sdkAgent: true,
162
- sdkProvider: provider,
163
- sdkMethod: method
164
- },
165
- tracingOptions,
166
- tracingContext,
167
- requestContext,
168
- mastra
169
- });
170
- const modelSpan = agentSpan?.createChildSpan({
171
- type: observability.SpanType.MODEL_GENERATION,
172
- name: `llm: '${modelId}'`,
173
- input: {
174
- messages
175
- },
176
- attributes: {
177
- model: modelId,
178
- provider,
179
- streaming
180
- },
181
- metadata: {
182
- runId,
183
- sdkAgent: true,
184
- sdkProvider: provider,
185
- sdkMethod: method
186
- },
187
- requestContext
188
- });
189
- const modelSpanTracker = getModelSpanTracker(modelSpan);
190
- const toolSpans = /* @__PURE__ */ new Map();
191
- let ended = false;
192
- const startToolCall = ({ toolCallId, toolName, input }) => {
193
- if (toolSpans.has(toolCallId)) {
194
- return;
195
- }
196
- const parentSpan = agentSpan ?? modelSpan;
197
- if (!parentSpan) {
198
- return;
199
- }
200
- const mcp = parseMcpToolName(toolName);
201
- const span = mcp ? parentSpan.createChildSpan({
202
- type: observability.SpanType.MCP_TOOL_CALL,
203
- name: `mcp_tool: '${toolName}' on '${mcp.serverName}'`,
204
- input,
205
- entityType: observability.EntityType.TOOL,
206
- entityId: toolName,
207
- entityName: toolName,
208
- attributes: {
209
- mcpServer: mcp.serverName
210
- },
211
- metadata: {
212
- runId,
213
- sdkAgent: true,
214
- sdkProvider: provider,
215
- sdkMethod: method,
216
- toolCallId
217
- },
218
- requestContext
219
- }) : parentSpan.createChildSpan({
220
- type: observability.SpanType.TOOL_CALL,
221
- name: `tool: '${toolName}'`,
222
- input,
223
- entityType: observability.EntityType.TOOL,
224
- entityId: toolName,
225
- entityName: toolName,
226
- attributes: {
227
- toolType: "tool"
228
- },
229
- metadata: {
230
- runId,
231
- sdkAgent: true,
232
- sdkProvider: provider,
233
- sdkMethod: method,
234
- toolCallId
235
- },
236
- requestContext
237
- });
238
- toolSpans.set(toolCallId, span);
239
- };
240
- const endToolCall = ({ toolCallId, output, isError }) => {
241
- const span = toolSpans.get(toolCallId);
242
- if (!span) {
243
- return;
244
- }
245
- toolSpans.delete(toolCallId);
246
- if (isError) {
247
- span.error({
248
- error: output instanceof Error ? output : new Error(typeof output === "string" ? output : "SDK tool call failed"),
249
- attributes: { success: false }
250
- });
251
- return;
252
- }
253
- span.end({
254
- output,
255
- attributes: { success: true }
256
- });
257
- };
258
- const closeOpenToolSpans = (success, error) => {
259
- for (const [toolCallId, span] of toolSpans) {
260
- toolSpans.delete(toolCallId);
261
- if (success) {
262
- span.end({ attributes: { success: true } });
263
- continue;
264
- }
265
- const normalized = error instanceof Error ? error : new Error(String(error ?? "SDK agent run failed"));
266
- span.error({ error: normalized, attributes: { success: false } });
267
- }
268
- };
269
- const endModel = ({
270
- text,
271
- usage,
272
- providerMetadata,
273
- finishReason = "stop",
274
- responseId,
275
- responseModel,
276
- costContext
277
- }) => {
278
- if (modelSpanTracker) {
279
- modelSpanTracker.endGeneration({
280
- output: {
281
- text
282
- },
283
- attributes: {
284
- finishReason,
285
- responseId,
286
- responseModel,
287
- costContext
288
- },
289
- usage,
290
- providerMetadata
291
- });
292
- return;
293
- }
294
- modelSpan?.end({
295
- output: {
296
- text
297
- },
298
- attributes: {
299
- finishReason,
300
- responseId,
301
- responseModel,
302
- usage: usage ? toUsageStats(usage) : void 0,
303
- costContext
304
- }
305
- });
306
- };
307
- const end = (result) => {
308
- if (ended) {
309
- return;
310
- }
311
- ended = true;
312
- closeOpenToolSpans(true);
313
- endModel(result);
314
- agentSpan?.end({
315
- output: {
316
- text: result.text
317
- }
318
- });
319
- };
320
- const fail = (error) => {
321
- if (ended) {
322
- return;
323
- }
324
- ended = true;
325
- const normalized = error instanceof Error ? error : new Error(String(error));
326
- closeOpenToolSpans(false, normalized);
327
- if (modelSpanTracker) {
328
- modelSpanTracker.reportGenerationError({ error: normalized });
329
- } else {
330
- modelSpan?.error({ error: normalized });
331
- }
332
- agentSpan?.error({ error: normalized });
333
- };
334
- return {
335
- execute: (fn) => observability.executeWithContext({ span: modelSpan ?? agentSpan, fn }),
336
- endGenerate(result) {
337
- end({
338
- text: result.content.map((part) => part.text).join(""),
339
- usage: toLanguageModelUsage(result.usage),
340
- providerMetadata: result.providerMetadata,
341
- finishReason: result.finishReason.unified,
342
- responseId: result.response.id,
343
- responseModel: result.response.modelId,
344
- costContext: result.costContext
345
- });
346
- },
347
- fail,
348
- startToolCall,
349
- endToolCall,
350
- wrapStream(stream) {
351
- const trackedStream = modelSpanTracker?.wrapStream(stream) ?? stream;
352
- return wrapStreamForAgentSpan(trackedStream, {
353
- end,
354
- fail
355
- });
356
- },
357
- outputOptions() {
358
- return {
359
- onFinish,
360
- onStepFinish,
361
- requestContext,
362
- tracingContext: agentSpan ? { currentSpan: agentSpan } : tracingContext
363
- };
364
- }
365
- };
23
+ return { stream: new stream_web.ReadableStream({ start: (controller) => controller.close() }) };
24
+ }
25
+ function createCompletedMastraStream({ runId, prompt, text, responseId, modelId, usage, providerMetadata, costContext, object }) {
26
+ return new stream_web.ReadableStream({ start(controller) {
27
+ const textId = (0, crypto.randomUUID)();
28
+ enqueueStartChunks(controller, {
29
+ runId,
30
+ prompt,
31
+ textId,
32
+ responseId,
33
+ modelId,
34
+ providerMetadata
35
+ });
36
+ if (text) enqueueTextDelta(controller, runId, textId, text);
37
+ enqueueFinishChunks(controller, {
38
+ runId,
39
+ prompt,
40
+ textId,
41
+ text,
42
+ responseId,
43
+ modelId,
44
+ usage,
45
+ providerMetadata,
46
+ costContext,
47
+ object
48
+ });
49
+ controller.close();
50
+ } });
51
+ }
52
+ function createMastraOutput({ messages, runId, modelId, provider, stream, responseText = "", options }) {
53
+ const messageList = new _mastra_core_agent_message_list.MessageList();
54
+ messageList.add(messages, "input");
55
+ messageList.add([{
56
+ role: "assistant",
57
+ content: responseText
58
+ }], "response");
59
+ return new _mastra_core_stream.MastraModelOutput({
60
+ model: {
61
+ modelId,
62
+ provider,
63
+ version: "v3"
64
+ },
65
+ stream,
66
+ messageList,
67
+ messageId: (0, crypto.randomUUID)(),
68
+ options: {
69
+ ...options,
70
+ runId
71
+ }
72
+ });
73
+ }
74
+ function toFullOutput({ messages, runId, provider, result, options }) {
75
+ const text = result.content.map((part) => part.text).join("");
76
+ const stream = createCompletedMastraStream({
77
+ runId,
78
+ prompt: promptToText(messages),
79
+ text,
80
+ responseId: result.response.id,
81
+ modelId: result.response.modelId,
82
+ usage: toLanguageModelUsage(result.usage),
83
+ providerMetadata: result.providerMetadata,
84
+ costContext: result.costContext,
85
+ object: result.object
86
+ });
87
+ return createMastraOutput({
88
+ messages,
89
+ runId,
90
+ modelId: result.response.modelId,
91
+ provider,
92
+ stream,
93
+ responseText: text,
94
+ options
95
+ }).getFullOutput();
96
+ }
97
+ function createSDKAgentTelemetry({ agentId, agentName, provider, modelId, messages, prompt, runId, streaming, method, requestContext, instructions, maxSteps, tracingOptions, tracingContext, onFinish, onStepFinish, mastra }) {
98
+ const agentSpan = (0, _mastra_core_observability.getOrCreateSpan)({
99
+ type: _mastra_core_observability.SpanType.AGENT_RUN,
100
+ name: `agent run: '${agentId}'`,
101
+ entityType: _mastra_core_observability.EntityType.AGENT,
102
+ entityId: agentId,
103
+ entityName: agentName,
104
+ input: messages,
105
+ attributes: {
106
+ prompt,
107
+ instructions,
108
+ maxSteps
109
+ },
110
+ metadata: {
111
+ runId,
112
+ sdkAgent: true,
113
+ sdkProvider: provider,
114
+ sdkMethod: method
115
+ },
116
+ tracingOptions,
117
+ tracingContext,
118
+ requestContext,
119
+ mastra
120
+ });
121
+ const modelSpan = agentSpan?.createChildSpan({
122
+ type: _mastra_core_observability.SpanType.MODEL_GENERATION,
123
+ name: `llm: '${modelId}'`,
124
+ input: { messages },
125
+ attributes: {
126
+ model: modelId,
127
+ provider,
128
+ streaming
129
+ },
130
+ metadata: {
131
+ runId,
132
+ sdkAgent: true,
133
+ sdkProvider: provider,
134
+ sdkMethod: method
135
+ },
136
+ requestContext
137
+ });
138
+ const modelSpanTracker = getModelSpanTracker(modelSpan);
139
+ const toolSpans = /* @__PURE__ */ new Map();
140
+ let ended = false;
141
+ const startToolCall = ({ toolCallId, toolName, input }) => {
142
+ if (toolSpans.has(toolCallId)) return;
143
+ const parentSpan = agentSpan ?? modelSpan;
144
+ if (!parentSpan) return;
145
+ const mcp = parseMcpToolName(toolName);
146
+ const span = mcp ? parentSpan.createChildSpan({
147
+ type: _mastra_core_observability.SpanType.MCP_TOOL_CALL,
148
+ name: `mcp_tool: '${toolName}' on '${mcp.serverName}'`,
149
+ input,
150
+ entityType: _mastra_core_observability.EntityType.TOOL,
151
+ entityId: toolName,
152
+ entityName: toolName,
153
+ attributes: { mcpServer: mcp.serverName },
154
+ metadata: {
155
+ runId,
156
+ sdkAgent: true,
157
+ sdkProvider: provider,
158
+ sdkMethod: method,
159
+ toolCallId
160
+ },
161
+ requestContext
162
+ }) : parentSpan.createChildSpan({
163
+ type: _mastra_core_observability.SpanType.TOOL_CALL,
164
+ name: `tool: '${toolName}'`,
165
+ input,
166
+ entityType: _mastra_core_observability.EntityType.TOOL,
167
+ entityId: toolName,
168
+ entityName: toolName,
169
+ attributes: { toolType: "tool" },
170
+ metadata: {
171
+ runId,
172
+ sdkAgent: true,
173
+ sdkProvider: provider,
174
+ sdkMethod: method,
175
+ toolCallId
176
+ },
177
+ requestContext
178
+ });
179
+ toolSpans.set(toolCallId, span);
180
+ };
181
+ const endToolCall = ({ toolCallId, output, isError }) => {
182
+ const span = toolSpans.get(toolCallId);
183
+ if (!span) return;
184
+ toolSpans.delete(toolCallId);
185
+ if (isError) {
186
+ span.error({
187
+ error: output instanceof Error ? output : new Error(typeof output === "string" ? output : "SDK tool call failed"),
188
+ attributes: { success: false }
189
+ });
190
+ return;
191
+ }
192
+ span.end({
193
+ output,
194
+ attributes: { success: true }
195
+ });
196
+ };
197
+ const closeOpenToolSpans = (success, error) => {
198
+ for (const [toolCallId, span] of toolSpans) {
199
+ toolSpans.delete(toolCallId);
200
+ if (success) {
201
+ span.end({ attributes: { success: true } });
202
+ continue;
203
+ }
204
+ const normalized = error instanceof Error ? error : new Error(String(error ?? "SDK agent run failed"));
205
+ span.error({
206
+ error: normalized,
207
+ attributes: { success: false }
208
+ });
209
+ }
210
+ };
211
+ const endModel = ({ text, usage, providerMetadata, finishReason = "stop", responseId, responseModel, costContext }) => {
212
+ if (modelSpanTracker) {
213
+ modelSpanTracker.endGeneration({
214
+ output: { text },
215
+ attributes: {
216
+ finishReason,
217
+ responseId,
218
+ responseModel,
219
+ costContext
220
+ },
221
+ usage,
222
+ providerMetadata
223
+ });
224
+ return;
225
+ }
226
+ modelSpan?.end({
227
+ output: { text },
228
+ attributes: {
229
+ finishReason,
230
+ responseId,
231
+ responseModel,
232
+ usage: usage ? toUsageStats(usage) : void 0,
233
+ costContext
234
+ }
235
+ });
236
+ };
237
+ const end = (result) => {
238
+ if (ended) return;
239
+ ended = true;
240
+ closeOpenToolSpans(true);
241
+ endModel(result);
242
+ agentSpan?.end({ output: { text: result.text } });
243
+ };
244
+ const fail = (error) => {
245
+ if (ended) return;
246
+ ended = true;
247
+ const normalized = error instanceof Error ? error : new Error(String(error));
248
+ closeOpenToolSpans(false, normalized);
249
+ if (modelSpanTracker) modelSpanTracker.reportGenerationError({ error: normalized });
250
+ else modelSpan?.error({ error: normalized });
251
+ agentSpan?.error({ error: normalized });
252
+ };
253
+ return {
254
+ execute: (fn) => (0, _mastra_core_observability.executeWithContext)({
255
+ span: modelSpan ?? agentSpan,
256
+ fn
257
+ }),
258
+ endGenerate(result) {
259
+ end({
260
+ text: result.content.map((part) => part.text).join(""),
261
+ usage: toLanguageModelUsage(result.usage),
262
+ providerMetadata: result.providerMetadata,
263
+ finishReason: result.finishReason.unified,
264
+ responseId: result.response.id,
265
+ responseModel: result.response.modelId,
266
+ costContext: result.costContext
267
+ });
268
+ },
269
+ fail,
270
+ startToolCall,
271
+ endToolCall,
272
+ wrapStream(stream) {
273
+ return wrapStreamForAgentSpan(modelSpanTracker?.wrapStream(stream) ?? stream, {
274
+ end,
275
+ fail
276
+ });
277
+ },
278
+ outputOptions() {
279
+ return {
280
+ onFinish,
281
+ onStepFinish,
282
+ requestContext,
283
+ tracingContext: agentSpan ? { currentSpan: agentSpan } : tracingContext
284
+ };
285
+ }
286
+ };
366
287
  }
367
288
  function parseMcpToolName(toolName) {
368
- const match = /^mcp__([^_].*?)__(.+)$/.exec(toolName);
369
- if (!match?.[1] || !match[2]) {
370
- return void 0;
371
- }
372
- return {
373
- serverName: match[1],
374
- toolName: match[2]
375
- };
289
+ const match = /^mcp__([^_].*?)__(.+)$/.exec(toolName);
290
+ if (!match?.[1] || !match[2]) return;
291
+ return {
292
+ serverName: match[1],
293
+ toolName: match[2]
294
+ };
376
295
  }
377
296
  function getModelSpanTracker(modelSpan) {
378
- if (!modelSpan || !("createTracker" in modelSpan)) {
379
- return void 0;
380
- }
381
- return modelSpan.createTracker();
297
+ if (!modelSpan || !("createTracker" in modelSpan)) return;
298
+ return modelSpan.createTracker();
382
299
  }
383
300
  function wrapStreamForAgentSpan(stream, telemetry) {
384
- let text = "";
385
- return stream.pipeThrough(
386
- new web.TransformStream({
387
- transform(chunk, controller) {
388
- if (chunk.type === "text-delta") {
389
- text += chunk.payload.text;
390
- }
391
- if (chunk.type === "finish") {
392
- telemetry.end({
393
- text,
394
- usage: chunk.payload.output.usage,
395
- providerMetadata: chunk.payload.providerMetadata,
396
- finishReason: chunk.payload.stepResult.reason,
397
- responseId: chunk.payload.response?.id,
398
- responseModel: chunk.payload.response?.modelId,
399
- costContext: getCostContext(chunk.payload.metadata?.costContext)
400
- });
401
- }
402
- if (chunk.type === "error") {
403
- telemetry.fail(chunk.payload.error);
404
- }
405
- controller.enqueue(chunk);
406
- },
407
- flush() {
408
- telemetry.end({ text });
409
- }
410
- })
411
- );
301
+ let text = "";
302
+ return stream.pipeThrough(new stream_web.TransformStream({
303
+ transform(chunk, controller) {
304
+ if (chunk.type === "text-delta") text += chunk.payload.text;
305
+ if (chunk.type === "finish") telemetry.end({
306
+ text,
307
+ usage: chunk.payload.output.usage,
308
+ providerMetadata: chunk.payload.providerMetadata,
309
+ finishReason: chunk.payload.stepResult.reason,
310
+ responseId: chunk.payload.response?.id,
311
+ responseModel: chunk.payload.response?.modelId,
312
+ costContext: getCostContext(chunk.payload.metadata?.costContext)
313
+ });
314
+ if (chunk.type === "error") telemetry.fail(chunk.payload.error);
315
+ controller.enqueue(chunk);
316
+ },
317
+ flush() {
318
+ telemetry.end({ text });
319
+ }
320
+ }));
412
321
  }
413
322
  function toUsageStats(usage) {
414
- return {
415
- inputTokens: usage.inputTokens,
416
- outputTokens: usage.outputTokens,
417
- inputDetails: {
418
- cacheRead: usage.cachedInputTokens,
419
- cacheWrite: usage.cacheCreationInputTokens
420
- },
421
- outputDetails: {
422
- text: usage.outputTokens,
423
- reasoning: usage.reasoningTokens
424
- }
425
- };
323
+ return {
324
+ inputTokens: usage.inputTokens,
325
+ outputTokens: usage.outputTokens,
326
+ inputDetails: {
327
+ cacheRead: usage.cachedInputTokens,
328
+ cacheWrite: usage.cacheCreationInputTokens
329
+ },
330
+ outputDetails: {
331
+ text: usage.outputTokens,
332
+ reasoning: usage.reasoningTokens
333
+ }
334
+ };
426
335
  }
427
336
  function getCostContext(value) {
428
- if (!value || typeof value !== "object") {
429
- return void 0;
430
- }
431
- return value;
432
- }
433
- function enqueueStartChunks(controller, {
434
- runId,
435
- prompt,
436
- textId,
437
- responseId,
438
- modelId,
439
- providerMetadata
440
- }) {
441
- controller.enqueue({
442
- type: "start",
443
- runId,
444
- from: stream.ChunkFrom.AGENT,
445
- payload: {}
446
- });
447
- controller.enqueue({
448
- type: "step-start",
449
- runId,
450
- from: stream.ChunkFrom.AGENT,
451
- payload: {
452
- request: { body: prompt }
453
- }
454
- });
455
- controller.enqueue({
456
- type: "response-metadata",
457
- runId,
458
- from: stream.ChunkFrom.AGENT,
459
- payload: {
460
- id: responseId,
461
- modelId,
462
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
463
- }
464
- });
465
- controller.enqueue({
466
- type: "text-start",
467
- runId,
468
- from: stream.ChunkFrom.AGENT,
469
- payload: {
470
- id: textId,
471
- providerMetadata
472
- }
473
- });
337
+ if (!value || typeof value !== "object") return;
338
+ return value;
339
+ }
340
+ function enqueueStartChunks(controller, { runId, prompt, textId, responseId, modelId, providerMetadata }) {
341
+ controller.enqueue({
342
+ type: "start",
343
+ runId,
344
+ from: _mastra_core_stream.ChunkFrom.AGENT,
345
+ payload: {}
346
+ });
347
+ controller.enqueue({
348
+ type: "step-start",
349
+ runId,
350
+ from: _mastra_core_stream.ChunkFrom.AGENT,
351
+ payload: { request: { body: prompt } }
352
+ });
353
+ controller.enqueue({
354
+ type: "response-metadata",
355
+ runId,
356
+ from: _mastra_core_stream.ChunkFrom.AGENT,
357
+ payload: {
358
+ id: responseId,
359
+ modelId,
360
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
361
+ }
362
+ });
363
+ controller.enqueue({
364
+ type: "text-start",
365
+ runId,
366
+ from: _mastra_core_stream.ChunkFrom.AGENT,
367
+ payload: {
368
+ id: textId,
369
+ providerMetadata
370
+ }
371
+ });
474
372
  }
475
373
  function enqueueTextDelta(controller, runId, textId, text) {
476
- controller.enqueue({
477
- type: "text-delta",
478
- runId,
479
- from: stream.ChunkFrom.AGENT,
480
- payload: {
481
- id: textId,
482
- text
483
- }
484
- });
485
- }
486
- function enqueueFinishChunks(controller, {
487
- runId,
488
- prompt,
489
- textId,
490
- text,
491
- responseId,
492
- modelId,
493
- usage,
494
- providerMetadata,
495
- costContext,
496
- object
497
- }) {
498
- const timestamp = /* @__PURE__ */ new Date();
499
- const response = {
500
- id: responseId,
501
- modelId,
502
- timestamp
503
- };
504
- const metadata = {
505
- providerMetadata,
506
- costContext,
507
- request: { body: prompt },
508
- modelId,
509
- timestamp
510
- };
511
- controller.enqueue({
512
- type: "text-end",
513
- runId,
514
- from: stream.ChunkFrom.AGENT,
515
- payload: {
516
- id: textId,
517
- providerMetadata
518
- }
519
- });
520
- if (object !== void 0) {
521
- controller.enqueue({
522
- type: "object-result",
523
- runId,
524
- from: stream.ChunkFrom.AGENT,
525
- object
526
- });
527
- }
528
- controller.enqueue({
529
- type: "step-finish",
530
- runId,
531
- from: stream.ChunkFrom.AGENT,
532
- payload: {
533
- id: responseId,
534
- providerMetadata,
535
- totalUsage: usage,
536
- response,
537
- stepResult: {
538
- reason: "stop",
539
- warnings: []
540
- },
541
- output: {
542
- text,
543
- usage,
544
- steps: []
545
- },
546
- metadata
547
- }
548
- });
549
- controller.enqueue({
550
- type: "finish",
551
- runId,
552
- from: stream.ChunkFrom.AGENT,
553
- payload: {
554
- stepResult: {
555
- reason: "stop",
556
- warnings: []
557
- },
558
- output: {
559
- usage,
560
- steps: []
561
- },
562
- metadata,
563
- providerMetadata,
564
- messages: {
565
- all: [],
566
- user: [],
567
- nonUser: []
568
- },
569
- response
570
- }
571
- });
374
+ controller.enqueue({
375
+ type: "text-delta",
376
+ runId,
377
+ from: _mastra_core_stream.ChunkFrom.AGENT,
378
+ payload: {
379
+ id: textId,
380
+ text
381
+ }
382
+ });
383
+ }
384
+ function enqueueFinishChunks(controller, { runId, prompt, textId, text, responseId, modelId, usage, providerMetadata, costContext, object }) {
385
+ const timestamp = /* @__PURE__ */ new Date();
386
+ const response = {
387
+ id: responseId,
388
+ modelId,
389
+ timestamp
390
+ };
391
+ const metadata = {
392
+ providerMetadata,
393
+ costContext,
394
+ request: { body: prompt },
395
+ modelId,
396
+ timestamp
397
+ };
398
+ controller.enqueue({
399
+ type: "text-end",
400
+ runId,
401
+ from: _mastra_core_stream.ChunkFrom.AGENT,
402
+ payload: {
403
+ id: textId,
404
+ providerMetadata
405
+ }
406
+ });
407
+ if (object !== void 0) controller.enqueue({
408
+ type: "object-result",
409
+ runId,
410
+ from: _mastra_core_stream.ChunkFrom.AGENT,
411
+ object
412
+ });
413
+ controller.enqueue({
414
+ type: "step-finish",
415
+ runId,
416
+ from: _mastra_core_stream.ChunkFrom.AGENT,
417
+ payload: {
418
+ id: responseId,
419
+ providerMetadata,
420
+ totalUsage: usage,
421
+ response,
422
+ stepResult: {
423
+ reason: "stop",
424
+ warnings: []
425
+ },
426
+ output: {
427
+ text,
428
+ usage,
429
+ steps: []
430
+ },
431
+ metadata
432
+ }
433
+ });
434
+ controller.enqueue({
435
+ type: "finish",
436
+ runId,
437
+ from: _mastra_core_stream.ChunkFrom.AGENT,
438
+ payload: {
439
+ stepResult: {
440
+ reason: "stop",
441
+ warnings: []
442
+ },
443
+ output: {
444
+ usage,
445
+ steps: []
446
+ },
447
+ metadata,
448
+ providerMetadata,
449
+ messages: {
450
+ all: [],
451
+ user: [],
452
+ nonUser: []
453
+ },
454
+ response
455
+ }
456
+ });
572
457
  }
573
458
  function toLanguageModelUsage(usage) {
574
- const inputTokens = usage.inputTokens.total ?? 0;
575
- const outputTokens = usage.outputTokens.total ?? 0;
576
- return {
577
- inputTokens,
578
- outputTokens,
579
- totalTokens: inputTokens + outputTokens,
580
- cachedInputTokens: usage.inputTokens.cacheRead,
581
- cacheCreationInputTokens: usage.inputTokens.cacheWrite,
582
- raw: usage
583
- };
459
+ const inputTokens = usage.inputTokens.total ?? 0;
460
+ const outputTokens = usage.outputTokens.total ?? 0;
461
+ return {
462
+ inputTokens,
463
+ outputTokens,
464
+ totalTokens: inputTokens + outputTokens,
465
+ cachedInputTokens: usage.inputTokens.cacheRead,
466
+ cacheCreationInputTokens: usage.inputTokens.cacheWrite,
467
+ raw: usage
468
+ };
584
469
  }
585
470
  function createProviderMetadata(provider, metadata) {
586
- return {
587
- [provider]: toJsonRecord(metadata)
588
- };
471
+ return { [provider]: toJsonRecord(metadata) };
589
472
  }
590
473
  function toJsonRecord(record) {
591
- return Object.fromEntries(
592
- Object.entries(record).filter((entry) => entry[1] !== void 0).map(([key, value]) => [key, toJsonValue(value)])
593
- );
474
+ return Object.fromEntries(Object.entries(record).filter((entry) => entry[1] !== void 0).map(([key, value]) => [key, toJsonValue(value)]));
594
475
  }
595
476
  function toJsonValue(value) {
596
- if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
597
- return value;
598
- }
599
- if (Array.isArray(value)) {
600
- return value.filter((item) => item !== void 0).map(toJsonValue);
601
- }
602
- if (value instanceof Date) {
603
- return value.toISOString();
604
- }
605
- if (typeof value === "object") {
606
- return toJsonRecord(value);
607
- }
608
- return String(value);
477
+ if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean") return value;
478
+ if (Array.isArray(value)) return value.filter((item) => item !== void 0).map(toJsonValue);
479
+ if (value instanceof Date) return value.toISOString();
480
+ if (typeof value === "object") return toJsonRecord(value);
481
+ return String(value);
609
482
  }
610
483
  function promptToText(prompt) {
611
- if (typeof prompt === "string") {
612
- return prompt;
613
- }
614
- if (Array.isArray(prompt)) {
615
- return prompt.map(promptToText).filter(Boolean).join("\n");
616
- }
617
- if (!prompt || typeof prompt !== "object") {
618
- return "";
619
- }
620
- const record = prompt;
621
- if (typeof record.text === "string") {
622
- return record.text;
623
- }
624
- if (typeof record.content === "string") {
625
- return record.content;
626
- }
627
- if (record.content) {
628
- return promptToText(record.content);
629
- }
630
- return "";
484
+ if (typeof prompt === "string") return prompt;
485
+ if (Array.isArray(prompt)) return prompt.map(promptToText).filter(Boolean).join("\n");
486
+ if (!prompt || typeof prompt !== "object") return "";
487
+ const record = prompt;
488
+ if (typeof record.text === "string") return record.text;
489
+ if (typeof record.content === "string") return record.content;
490
+ if (record.content) return promptToText(record.content);
491
+ return "";
631
492
  }
632
493
  function getStructuredOutputSchema(structuredOutput) {
633
- if (!structuredOutput?.schema) {
634
- return void 0;
635
- }
636
- return schema.standardSchemaToJSONSchema(schema.toStandardSchema(structuredOutput.schema));
494
+ if (!structuredOutput?.schema) return;
495
+ return (0, _mastra_core_schema.standardSchemaToJSONSchema)((0, _mastra_core_schema.toStandardSchema)(structuredOutput.schema));
637
496
  }
638
497
  async function getStructuredOutputFromValue(value, structuredOutput) {
639
- if (!structuredOutput?.schema) {
640
- return void 0;
641
- }
642
- let parsed;
643
- if (typeof value === "string") {
644
- try {
645
- parsed = JSON.parse(value);
646
- } catch (error) {
647
- return handleStructuredOutputError(
648
- new Error("Structured output must be valid JSON.", { cause: error }),
649
- structuredOutput
650
- );
651
- }
652
- } else {
653
- parsed = value;
654
- }
655
- const schema$1 = schema.toStandardSchema(structuredOutput.schema);
656
- const result = await schema$1["~standard"].validate(parsed);
657
- if (!result.issues) {
658
- return result.value;
659
- }
660
- const message = result.issues.map((issue) => `- ${issue.path?.join(".") || "root"}: ${issue.message}`).join("\n");
661
- return handleStructuredOutputError(new Error(`Structured output validation failed:
662
- ${message}`), structuredOutput);
498
+ if (!structuredOutput?.schema) return;
499
+ let parsed;
500
+ if (typeof value === "string") try {
501
+ parsed = JSON.parse(value);
502
+ } catch (error) {
503
+ return handleStructuredOutputError(new Error("Structured output must be valid JSON.", { cause: error }), structuredOutput);
504
+ }
505
+ else parsed = value;
506
+ const result = await (0, _mastra_core_schema.toStandardSchema)(structuredOutput.schema)["~standard"].validate(parsed);
507
+ if (!result.issues) return result.value;
508
+ const message = result.issues.map((issue) => `- ${issue.path?.join(".") || "root"}: ${issue.message}`).join("\n");
509
+ return handleStructuredOutputError(/* @__PURE__ */ new Error(`Structured output validation failed:\n${message}`), structuredOutput);
663
510
  }
664
511
  function handleStructuredOutputError(error, structuredOutput) {
665
- if (structuredOutput.errorStrategy === "fallback") {
666
- return structuredOutput.fallbackValue;
667
- }
668
- if (structuredOutput.errorStrategy === "warn") {
669
- structuredOutput.logger?.warn(error.message);
670
- return void 0;
671
- }
672
- throw error;
512
+ if (structuredOutput.errorStrategy === "fallback") return structuredOutput.fallbackValue;
513
+ if (structuredOutput.errorStrategy === "warn") {
514
+ structuredOutput.logger?.warn(error.message);
515
+ return;
516
+ }
517
+ throw error;
673
518
  }
674
519
  function sumDefined(...values) {
675
- const defined = values.filter((value) => typeof value === "number");
676
- if (defined.length === 0) {
677
- return void 0;
678
- }
679
- return defined.reduce((sum, value) => sum + value, 0);
680
- }
681
-
682
- // src/index.ts
683
- var PROVIDER = "@anthropic-ai/claude-agent-sdk";
684
- var MODEL_ID = "claude-agent-sdk";
685
- var ClaudeSDKAgent = class extends agent.Agent {
686
- options;
687
- #mastra;
688
- constructor(options) {
689
- super({
690
- id: options.id,
691
- name: options.name ?? options.id,
692
- description: options.description,
693
- instructions: "",
694
- model: createNoopModel({
695
- modelId: getModelId(options),
696
- provider: PROVIDER
697
- })
698
- });
699
- this.options = options;
700
- }
701
- __registerMastra(mastra) {
702
- super.__registerMastra(mastra);
703
- this.#mastra = mastra;
704
- }
705
- supportsMemory() {
706
- return false;
707
- }
708
- async generate(messages, options) {
709
- const prompt = promptToText(messages);
710
- const runId = options?.runId ?? crypto.randomUUID();
711
- const requestContext$1 = options?.requestContext ?? new requestContext.RequestContext();
712
- const instructions = options?.instructions ? promptToText(options.instructions) : void 0;
713
- const telemetry = createSDKAgentTelemetry({
714
- agentId: this.id,
715
- agentName: this.name,
716
- provider: PROVIDER,
717
- modelId: getModelId(this.options),
718
- messages,
719
- prompt,
720
- runId,
721
- streaming: false,
722
- method: "generate",
723
- requestContext: requestContext$1,
724
- instructions,
725
- maxSteps: options?.maxSteps,
726
- tracingOptions: options?.tracingOptions,
727
- tracingContext: options?.tracingContext,
728
- onFinish: options?.onFinish,
729
- onStepFinish: options?.onStepFinish,
730
- mastra: this.#mastra
731
- });
732
- let result;
733
- try {
734
- result = await telemetry.execute(() => runClaudeGenerate(prompt, this.options, telemetry, options));
735
- telemetry.endGenerate(result);
736
- } catch (error) {
737
- telemetry.fail(error);
738
- throw error;
739
- }
740
- return toFullOutput({
741
- messages,
742
- runId,
743
- provider: PROVIDER,
744
- result,
745
- options: { ...telemetry.outputOptions(), structuredOutput: options?.structuredOutput }
746
- });
747
- }
748
- async stream(messages, options) {
749
- const runId = options?.runId ?? crypto.randomUUID();
750
- const prompt = promptToText(messages);
751
- const modelId = getModelId(this.options);
752
- const requestContext$1 = options?.requestContext ?? new requestContext.RequestContext();
753
- const instructions = options?.instructions ? promptToText(options.instructions) : void 0;
754
- const telemetry = createSDKAgentTelemetry({
755
- agentId: this.id,
756
- agentName: this.name,
757
- provider: PROVIDER,
758
- modelId,
759
- messages,
760
- prompt,
761
- runId,
762
- streaming: true,
763
- method: "stream",
764
- requestContext: requestContext$1,
765
- instructions,
766
- maxSteps: options?.maxSteps,
767
- tracingOptions: options?.tracingOptions,
768
- tracingContext: options?.tracingContext,
769
- onFinish: options?.onFinish,
770
- onStepFinish: options?.onStepFinish,
771
- mastra: this.#mastra
772
- });
773
- return createMastraOutput({
774
- messages,
775
- runId,
776
- modelId,
777
- provider: PROVIDER,
778
- stream: telemetry.wrapStream(runClaudeAsMastraStream(prompt, this.options, runId, telemetry, options)),
779
- options: { ...telemetry.outputOptions(), structuredOutput: options?.structuredOutput }
780
- });
781
- }
782
- async resumeGenerate(resumeData, options) {
783
- const data = validateClaudeResumeData(resumeData);
784
- return this.generate(data.message, createClaudeResumeRunOptions(data, options));
785
- }
786
- async resumeStream(resumeData, options) {
787
- const data = validateClaudeResumeData(resumeData);
788
- return this.stream(data.message, createClaudeResumeRunOptions(data, options));
789
- }
520
+ const defined = values.filter((value) => typeof value === "number");
521
+ if (defined.length === 0) return;
522
+ return defined.reduce((sum, value) => sum + value, 0);
523
+ }
524
+ //#endregion
525
+ //#region src/index.ts
526
+ const PROVIDER = "@anthropic-ai/claude-agent-sdk";
527
+ const MODEL_ID = "claude-agent-sdk";
528
+ var ClaudeSDKAgent = class extends _mastra_core_agent.Agent {
529
+ options;
530
+ #mastra;
531
+ constructor(options) {
532
+ super({
533
+ id: options.id,
534
+ name: options.name ?? options.id,
535
+ description: options.description,
536
+ instructions: "",
537
+ model: createNoopModel({
538
+ modelId: getModelId(options),
539
+ provider: PROVIDER
540
+ })
541
+ });
542
+ this.options = options;
543
+ }
544
+ __registerMastra(mastra) {
545
+ super.__registerMastra(mastra);
546
+ this.#mastra = mastra;
547
+ }
548
+ supportsMemory() {
549
+ return false;
550
+ }
551
+ async generate(messages, options) {
552
+ const prompt = promptToText(messages);
553
+ const runId = options?.runId ?? (0, crypto.randomUUID)();
554
+ const requestContext = options?.requestContext ?? new _mastra_core_request_context.RequestContext();
555
+ const instructions = options?.instructions ? promptToText(options.instructions) : void 0;
556
+ const telemetry = createSDKAgentTelemetry({
557
+ agentId: this.id,
558
+ agentName: this.name,
559
+ provider: PROVIDER,
560
+ modelId: getModelId(this.options),
561
+ messages,
562
+ prompt,
563
+ runId,
564
+ streaming: false,
565
+ method: "generate",
566
+ requestContext,
567
+ instructions,
568
+ maxSteps: options?.maxSteps,
569
+ tracingOptions: options?.tracingOptions,
570
+ tracingContext: options?.tracingContext,
571
+ onFinish: options?.onFinish,
572
+ onStepFinish: options?.onStepFinish,
573
+ mastra: this.#mastra
574
+ });
575
+ let result;
576
+ try {
577
+ result = await telemetry.execute(() => runClaudeGenerate(prompt, this.options, telemetry, options));
578
+ telemetry.endGenerate(result);
579
+ } catch (error) {
580
+ telemetry.fail(error);
581
+ throw error;
582
+ }
583
+ return toFullOutput({
584
+ messages,
585
+ runId,
586
+ provider: PROVIDER,
587
+ result,
588
+ options: {
589
+ ...telemetry.outputOptions(),
590
+ structuredOutput: options?.structuredOutput
591
+ }
592
+ });
593
+ }
594
+ async stream(messages, options) {
595
+ const runId = options?.runId ?? (0, crypto.randomUUID)();
596
+ const prompt = promptToText(messages);
597
+ const modelId = getModelId(this.options);
598
+ const requestContext = options?.requestContext ?? new _mastra_core_request_context.RequestContext();
599
+ const instructions = options?.instructions ? promptToText(options.instructions) : void 0;
600
+ const telemetry = createSDKAgentTelemetry({
601
+ agentId: this.id,
602
+ agentName: this.name,
603
+ provider: PROVIDER,
604
+ modelId,
605
+ messages,
606
+ prompt,
607
+ runId,
608
+ streaming: true,
609
+ method: "stream",
610
+ requestContext,
611
+ instructions,
612
+ maxSteps: options?.maxSteps,
613
+ tracingOptions: options?.tracingOptions,
614
+ tracingContext: options?.tracingContext,
615
+ onFinish: options?.onFinish,
616
+ onStepFinish: options?.onStepFinish,
617
+ mastra: this.#mastra
618
+ });
619
+ return createMastraOutput({
620
+ messages,
621
+ runId,
622
+ modelId,
623
+ provider: PROVIDER,
624
+ stream: telemetry.wrapStream(runClaudeAsMastraStream(prompt, this.options, runId, telemetry, options)),
625
+ options: {
626
+ ...telemetry.outputOptions(),
627
+ structuredOutput: options?.structuredOutput
628
+ }
629
+ });
630
+ }
631
+ async resumeGenerate(resumeData, options) {
632
+ const data = validateClaudeResumeData(resumeData);
633
+ return this.generate(data.message, createClaudeResumeRunOptions(data, options));
634
+ }
635
+ async resumeStream(resumeData, options) {
636
+ const data = validateClaudeResumeData(resumeData);
637
+ return this.stream(data.message, createClaudeResumeRunOptions(data, options));
638
+ }
790
639
  };
791
640
  function validateClaudeResumeData(resumeData) {
792
- if (!isRecord(resumeData) || !("message" in resumeData)) {
793
- throw new Error("ClaudeSDKAgent resumeData must include a message.");
794
- }
795
- const hasSessionId = "sessionId" in resumeData;
796
- const hasContinue = "continue" in resumeData;
797
- if (hasSessionId && hasContinue) {
798
- throw new Error("ClaudeSDKAgent resumeData must include either sessionId or continue: true, not both.");
799
- }
800
- if (hasSessionId) {
801
- if (typeof resumeData.sessionId !== "string") {
802
- throw new Error("ClaudeSDKAgent resumeData.sessionId must be a string.");
803
- }
804
- return resumeData;
805
- }
806
- if (hasContinue) {
807
- if (resumeData.continue !== true) {
808
- throw new Error("ClaudeSDKAgent resumeData.continue must be true when provided.");
809
- }
810
- return resumeData;
811
- }
812
- throw new Error("ClaudeSDKAgent resumeData must include sessionId or continue: true.");
641
+ if (!isRecord(resumeData) || !("message" in resumeData)) throw new Error("ClaudeSDKAgent resumeData must include a message.");
642
+ const hasSessionId = "sessionId" in resumeData;
643
+ const hasContinue = "continue" in resumeData;
644
+ if (hasSessionId && hasContinue) throw new Error("ClaudeSDKAgent resumeData must include either sessionId or continue: true, not both.");
645
+ if (hasSessionId) {
646
+ if (typeof resumeData.sessionId !== "string") throw new Error("ClaudeSDKAgent resumeData.sessionId must be a string.");
647
+ return resumeData;
648
+ }
649
+ if (hasContinue) {
650
+ if (resumeData.continue !== true) throw new Error("ClaudeSDKAgent resumeData.continue must be true when provided.");
651
+ return resumeData;
652
+ }
653
+ throw new Error("ClaudeSDKAgent resumeData must include sessionId or continue: true.");
813
654
  }
814
655
  function createClaudeResumeRunOptions(resumeData, options) {
815
- const sdkOptions = { ...options?.sdkOptions };
816
- if ("sessionId" in resumeData && typeof resumeData.sessionId === "string") {
817
- sdkOptions.resume = resumeData.sessionId;
818
- if (resumeData.forkSession !== void 0) {
819
- sdkOptions.forkSession = resumeData.forkSession;
820
- }
821
- if (resumeData.resumeSessionAt !== void 0) {
822
- sdkOptions.resumeSessionAt = resumeData.resumeSessionAt;
823
- }
824
- } else {
825
- sdkOptions.continue = true;
826
- }
827
- return {
828
- ...options,
829
- sdkOptions
830
- };
656
+ const sdkOptions = { ...options?.sdkOptions };
657
+ if ("sessionId" in resumeData && typeof resumeData.sessionId === "string") {
658
+ sdkOptions.resume = resumeData.sessionId;
659
+ if (resumeData.forkSession !== void 0) sdkOptions.forkSession = resumeData.forkSession;
660
+ if (resumeData.resumeSessionAt !== void 0) sdkOptions.resumeSessionAt = resumeData.resumeSessionAt;
661
+ } else sdkOptions.continue = true;
662
+ return {
663
+ ...options,
664
+ sdkOptions
665
+ };
831
666
  }
832
667
  async function runClaudeGenerate(prompt, options, telemetry, runOptions) {
833
- let text = "";
834
- let structuredOutputValue;
835
- const usage = createClaudeUsageCollector();
836
- for await (const message of observeClaudeMessages(
837
- runClaude(prompt, options, runOptions?.abortSignal ?? runOptions?.signal, runOptions),
838
- telemetry
839
- )) {
840
- usage.record(message);
841
- if (message.type === "result") {
842
- if (message.subtype !== "success") {
843
- throw new Error(message.errors.join("\n") || `Claude Agent SDK failed with ${message.subtype}`);
844
- }
845
- text = message.result;
846
- structuredOutputValue = getClaudeStructuredOutput(message);
847
- }
848
- }
849
- const totals = usage.totals();
850
- const object = await getStructuredOutputFromValue(
851
- structuredOutputValue === void 0 ? text : structuredOutputValue,
852
- runOptions?.structuredOutput
853
- );
854
- return {
855
- content: [{ type: "text", text }],
856
- finishReason: { unified: "stop", raw: "stop" },
857
- usage: usage.toV3Usage(),
858
- response: {
859
- id: crypto.randomUUID(),
860
- modelId: getModelId(options),
861
- timestamp: /* @__PURE__ */ new Date()
862
- },
863
- providerMetadata: getClaudeProviderMetadata(options, totals),
864
- costContext: getClaudeCostContext(options, totals),
865
- object
866
- };
668
+ let text = "";
669
+ let structuredOutputValue;
670
+ const usage = createClaudeUsageCollector();
671
+ for await (const message of observeClaudeMessages(runClaude(prompt, options, runOptions?.abortSignal ?? runOptions?.signal, runOptions), telemetry)) {
672
+ usage.record(message);
673
+ if (message.type === "result") {
674
+ if (message.subtype !== "success") throw new Error(message.errors.join("\n") || `Claude Agent SDK failed with ${message.subtype}`);
675
+ text = message.result;
676
+ structuredOutputValue = getClaudeStructuredOutput(message);
677
+ }
678
+ }
679
+ const totals = usage.totals();
680
+ const object = await getStructuredOutputFromValue(structuredOutputValue === void 0 ? text : structuredOutputValue, runOptions?.structuredOutput);
681
+ return {
682
+ content: [{
683
+ type: "text",
684
+ text
685
+ }],
686
+ finishReason: {
687
+ unified: "stop",
688
+ raw: "stop"
689
+ },
690
+ usage: usage.toV3Usage(),
691
+ response: {
692
+ id: (0, crypto.randomUUID)(),
693
+ modelId: getModelId(options),
694
+ timestamp: /* @__PURE__ */ new Date()
695
+ },
696
+ providerMetadata: getClaudeProviderMetadata(options, totals),
697
+ costContext: getClaudeCostContext(options, totals),
698
+ object
699
+ };
867
700
  }
868
701
  function runClaudeAsMastraStream(prompt, options, runId, telemetry, runOptions) {
869
- return new web.ReadableStream({
870
- start: async (controller) => {
871
- const textId = crypto.randomUUID();
872
- const responseId = crypto.randomUUID();
873
- const modelId = getModelId(options);
874
- const usage = createClaudeUsageCollector();
875
- let text = "";
876
- let structuredOutputValue;
877
- let sawDelta = false;
878
- try {
879
- enqueueStartChunks(controller, {
880
- runId,
881
- prompt,
882
- textId,
883
- responseId,
884
- modelId,
885
- providerMetadata: getClaudeProviderMetadata(options, usage.totals())
886
- });
887
- for await (const message of observeClaudeMessages(
888
- runClaude(prompt, options, runOptions?.abortSignal ?? runOptions?.signal, runOptions),
889
- telemetry
890
- )) {
891
- usage.record(message);
892
- const delta = getTextDelta(message);
893
- if (delta) {
894
- sawDelta = true;
895
- text += delta;
896
- enqueueTextDelta(controller, runId, textId, delta);
897
- }
898
- if (message.type === "result") {
899
- if (message.subtype !== "success") {
900
- throw new Error(message.errors.join("\n") || `Claude Agent SDK failed with ${message.subtype}`);
901
- }
902
- if (!sawDelta && message.result) {
903
- text += message.result;
904
- enqueueTextDelta(controller, runId, textId, message.result);
905
- }
906
- structuredOutputValue = getClaudeStructuredOutput(message);
907
- }
908
- }
909
- const totals = usage.totals();
910
- const providerMetadata = getClaudeProviderMetadata(options, totals);
911
- enqueueFinishChunks(controller, {
912
- runId,
913
- prompt,
914
- textId,
915
- text,
916
- responseId,
917
- modelId,
918
- usage: usage.toLanguageModelUsage(),
919
- providerMetadata,
920
- costContext: getClaudeCostContext(options, totals),
921
- object: await getStructuredOutputFromValue(
922
- structuredOutputValue === void 0 ? text : structuredOutputValue,
923
- runOptions?.structuredOutput
924
- )
925
- });
926
- controller.close();
927
- } catch (error) {
928
- controller.enqueue({
929
- type: "error",
930
- runId,
931
- from: stream.ChunkFrom.AGENT,
932
- payload: { error }
933
- });
934
- controller.close();
935
- }
936
- }
937
- });
702
+ return new stream_web.ReadableStream({ start: async (controller) => {
703
+ const textId = (0, crypto.randomUUID)();
704
+ const responseId = (0, crypto.randomUUID)();
705
+ const modelId = getModelId(options);
706
+ const usage = createClaudeUsageCollector();
707
+ let text = "";
708
+ let structuredOutputValue;
709
+ let sawDelta = false;
710
+ try {
711
+ enqueueStartChunks(controller, {
712
+ runId,
713
+ prompt,
714
+ textId,
715
+ responseId,
716
+ modelId,
717
+ providerMetadata: getClaudeProviderMetadata(options, usage.totals())
718
+ });
719
+ for await (const message of observeClaudeMessages(runClaude(prompt, options, runOptions?.abortSignal ?? runOptions?.signal, runOptions), telemetry)) {
720
+ usage.record(message);
721
+ const delta = getTextDelta(message);
722
+ if (delta) {
723
+ sawDelta = true;
724
+ text += delta;
725
+ enqueueTextDelta(controller, runId, textId, delta);
726
+ }
727
+ if (message.type === "result") {
728
+ if (message.subtype !== "success") throw new Error(message.errors.join("\n") || `Claude Agent SDK failed with ${message.subtype}`);
729
+ if (!sawDelta && message.result) {
730
+ text += message.result;
731
+ enqueueTextDelta(controller, runId, textId, message.result);
732
+ }
733
+ structuredOutputValue = getClaudeStructuredOutput(message);
734
+ }
735
+ }
736
+ const totals = usage.totals();
737
+ const providerMetadata = getClaudeProviderMetadata(options, totals);
738
+ enqueueFinishChunks(controller, {
739
+ runId,
740
+ prompt,
741
+ textId,
742
+ text,
743
+ responseId,
744
+ modelId,
745
+ usage: usage.toLanguageModelUsage(),
746
+ providerMetadata,
747
+ costContext: getClaudeCostContext(options, totals),
748
+ object: await getStructuredOutputFromValue(structuredOutputValue === void 0 ? text : structuredOutputValue, runOptions?.structuredOutput)
749
+ });
750
+ controller.close();
751
+ } catch (error) {
752
+ controller.enqueue({
753
+ type: "error",
754
+ runId,
755
+ from: _mastra_core_stream.ChunkFrom.AGENT,
756
+ payload: { error }
757
+ });
758
+ controller.close();
759
+ }
760
+ } });
938
761
  }
939
762
  function runClaude(prompt, options, signal, runOptions) {
940
- const abortController = createAbortController(signal);
941
- const queryOptions = {
942
- ...options.sdkOptions,
943
- ...runOptions?.sdkOptions
944
- };
945
- const outputSchema = getStructuredOutputSchema(runOptions?.structuredOutput);
946
- if (outputSchema) {
947
- queryOptions.outputFormat = {
948
- type: "json_schema",
949
- schema: outputSchema
950
- };
951
- }
952
- if (abortController) {
953
- queryOptions.abortController = abortController;
954
- }
955
- return claudeAgentSdk.query({
956
- prompt,
957
- options: queryOptions
958
- });
763
+ const abortController = createAbortController(signal);
764
+ const queryOptions = {
765
+ ...options.sdkOptions,
766
+ ...runOptions?.sdkOptions
767
+ };
768
+ const outputSchema = getStructuredOutputSchema(runOptions?.structuredOutput);
769
+ if (outputSchema) queryOptions.outputFormat = {
770
+ type: "json_schema",
771
+ schema: outputSchema
772
+ };
773
+ if (abortController) queryOptions.abortController = abortController;
774
+ return (0, _anthropic_ai_claude_agent_sdk.query)({
775
+ prompt,
776
+ options: queryOptions
777
+ });
959
778
  }
960
779
  function getClaudeStructuredOutput(message) {
961
- if (message.type !== "result") {
962
- return void 0;
963
- }
964
- return message.structured_output;
780
+ if (message.type !== "result") return;
781
+ return message.structured_output;
965
782
  }
966
783
  async function* observeClaudeMessages(messages, telemetry) {
967
- for await (const message of messages) {
968
- recordClaudeToolTelemetry(message, telemetry);
969
- yield message;
970
- }
784
+ for await (const message of messages) {
785
+ recordClaudeToolTelemetry(message, telemetry);
786
+ yield message;
787
+ }
971
788
  }
972
789
  function recordClaudeToolTelemetry(message, telemetry) {
973
- for (const toolCall of getClaudeToolCalls(message)) {
974
- telemetry.startToolCall(toolCall);
975
- }
976
- for (const toolResult of getClaudeToolResults(message)) {
977
- telemetry.endToolCall(toolResult);
978
- }
790
+ for (const toolCall of getClaudeToolCalls(message)) telemetry.startToolCall(toolCall);
791
+ for (const toolResult of getClaudeToolResults(message)) telemetry.endToolCall(toolResult);
979
792
  }
980
793
  function getClaudeToolCalls(message) {
981
- if (message.type !== "assistant") {
982
- return [];
983
- }
984
- return getContentBlocks(message.message).filter(isRecord).filter((block) => block.type === "tool_use" && typeof block.id === "string" && typeof block.name === "string").map((block) => ({
985
- toolCallId: block.id,
986
- toolName: block.name,
987
- input: block.input
988
- }));
794
+ if (message.type !== "assistant") return [];
795
+ return getContentBlocks(message.message).filter(isRecord).filter((block) => block.type === "tool_use" && typeof block.id === "string" && typeof block.name === "string").map((block) => ({
796
+ toolCallId: block.id,
797
+ toolName: block.name,
798
+ input: block.input
799
+ }));
989
800
  }
990
801
  function getClaudeToolResults(message) {
991
- if (message.type !== "user") {
992
- return [];
993
- }
994
- return getContentBlocks(message.message).filter(isRecord).filter((block) => block.type === "tool_result" && typeof block.tool_use_id === "string").map((block) => ({
995
- toolCallId: block.tool_use_id,
996
- output: block.content,
997
- isError: block.is_error === true
998
- }));
802
+ if (message.type !== "user") return [];
803
+ return getContentBlocks(message.message).filter(isRecord).filter((block) => block.type === "tool_result" && typeof block.tool_use_id === "string").map((block) => ({
804
+ toolCallId: block.tool_use_id,
805
+ output: block.content,
806
+ isError: block.is_error === true
807
+ }));
999
808
  }
1000
809
  function getContentBlocks(message) {
1001
- if (!isRecord(message)) {
1002
- return [];
1003
- }
1004
- return Array.isArray(message.content) ? message.content : [];
810
+ if (!isRecord(message)) return [];
811
+ return Array.isArray(message.content) ? message.content : [];
1005
812
  }
1006
813
  function isRecord(value) {
1007
- return value !== null && typeof value === "object";
814
+ return value !== null && typeof value === "object";
1008
815
  }
1009
816
  function createAbortController(signal) {
1010
- if (!signal) {
1011
- return void 0;
1012
- }
1013
- const controller = new AbortController();
1014
- if (signal.aborted) {
1015
- controller.abort(signal.reason);
1016
- return controller;
1017
- }
1018
- signal.addEventListener("abort", () => controller.abort(signal.reason), { once: true });
1019
- return controller;
817
+ if (!signal) return;
818
+ const controller = new AbortController();
819
+ if (signal.aborted) {
820
+ controller.abort(signal.reason);
821
+ return controller;
822
+ }
823
+ signal.addEventListener("abort", () => controller.abort(signal.reason), { once: true });
824
+ return controller;
1020
825
  }
1021
826
  function getModelId(options) {
1022
- return options.sdkOptions?.model ?? MODEL_ID;
827
+ return options.sdkOptions?.model ?? MODEL_ID;
1023
828
  }
1024
829
  function createClaudeUsageCollector() {
1025
- const assistantUsageById = /* @__PURE__ */ new Map();
1026
- let resultUsage = {};
1027
- return {
1028
- record(message) {
1029
- if (message.type === "assistant") {
1030
- assistantUsageById.set(message.message.id, usageFromClaudeMessage(message.message.usage));
1031
- return;
1032
- }
1033
- if (message.type === "result") {
1034
- resultUsage = {
1035
- ...usageFromClaudeMessage(message.usage),
1036
- totalCostUsd: message.total_cost_usd,
1037
- modelUsage: message.modelUsage
1038
- };
1039
- }
1040
- },
1041
- totals() {
1042
- const assistantUsage = getAssistantUsageTotals(assistantUsageById);
1043
- if (hasAnyUsage(resultUsage)) {
1044
- return {
1045
- ...resultUsage,
1046
- inputTokens: resultUsage.inputTokens ?? assistantUsage.inputTokens,
1047
- outputTokens: resultUsage.outputTokens ?? assistantUsage.outputTokens,
1048
- cacheReadInputTokens: resultUsage.cacheReadInputTokens ?? assistantUsage.cacheReadInputTokens,
1049
- cacheCreationInputTokens: resultUsage.cacheCreationInputTokens ?? assistantUsage.cacheCreationInputTokens
1050
- };
1051
- }
1052
- return assistantUsage;
1053
- },
1054
- toV3Usage() {
1055
- return toV3Usage(this.totals());
1056
- },
1057
- toLanguageModelUsage() {
1058
- return toLanguageModelUsage(toV3Usage(this.totals()));
1059
- }
1060
- };
830
+ const assistantUsageById = /* @__PURE__ */ new Map();
831
+ let resultUsage = {};
832
+ return {
833
+ record(message) {
834
+ if (message.type === "assistant") {
835
+ assistantUsageById.set(message.message.id, usageFromClaudeMessage(message.message.usage));
836
+ return;
837
+ }
838
+ if (message.type === "result") resultUsage = {
839
+ ...usageFromClaudeMessage(message.usage),
840
+ totalCostUsd: message.total_cost_usd,
841
+ modelUsage: message.modelUsage
842
+ };
843
+ },
844
+ totals() {
845
+ const assistantUsage = getAssistantUsageTotals(assistantUsageById);
846
+ if (hasAnyUsage(resultUsage)) return {
847
+ ...resultUsage,
848
+ inputTokens: resultUsage.inputTokens ?? assistantUsage.inputTokens,
849
+ outputTokens: resultUsage.outputTokens ?? assistantUsage.outputTokens,
850
+ cacheReadInputTokens: resultUsage.cacheReadInputTokens ?? assistantUsage.cacheReadInputTokens,
851
+ cacheCreationInputTokens: resultUsage.cacheCreationInputTokens ?? assistantUsage.cacheCreationInputTokens
852
+ };
853
+ return assistantUsage;
854
+ },
855
+ toV3Usage() {
856
+ return toV3Usage(this.totals());
857
+ },
858
+ toLanguageModelUsage() {
859
+ return toLanguageModelUsage(toV3Usage(this.totals()));
860
+ }
861
+ };
1061
862
  }
1062
863
  function getAssistantUsageTotals(assistantUsageById) {
1063
- return [...assistantUsageById.values()].reduce((totals, item) => {
1064
- totals.inputTokens = addOptional(totals.inputTokens, item.inputTokens);
1065
- totals.outputTokens = addOptional(totals.outputTokens, item.outputTokens);
1066
- totals.cacheReadInputTokens = addOptional(totals.cacheReadInputTokens, item.cacheReadInputTokens);
1067
- totals.cacheCreationInputTokens = addOptional(totals.cacheCreationInputTokens, item.cacheCreationInputTokens);
1068
- return totals;
1069
- }, {});
864
+ return [...assistantUsageById.values()].reduce((totals, item) => {
865
+ totals.inputTokens = addOptional(totals.inputTokens, item.inputTokens);
866
+ totals.outputTokens = addOptional(totals.outputTokens, item.outputTokens);
867
+ totals.cacheReadInputTokens = addOptional(totals.cacheReadInputTokens, item.cacheReadInputTokens);
868
+ totals.cacheCreationInputTokens = addOptional(totals.cacheCreationInputTokens, item.cacheCreationInputTokens);
869
+ return totals;
870
+ }, {});
1070
871
  }
1071
872
  function usageFromClaudeMessage(usage) {
1072
- if (!usage || typeof usage !== "object") {
1073
- return {};
1074
- }
1075
- const record = usage;
1076
- return {
1077
- inputTokens: getTokenTotal(record.input_tokens),
1078
- outputTokens: getTokenTotal(record.output_tokens),
1079
- cacheReadInputTokens: getTokenTotal(record.cache_read_input_tokens),
1080
- cacheCreationInputTokens: getTokenTotal(record.cache_creation_input_tokens)
1081
- };
873
+ if (!usage || typeof usage !== "object") return {};
874
+ const record = usage;
875
+ return {
876
+ inputTokens: getTokenTotal(record.input_tokens),
877
+ outputTokens: getTokenTotal(record.output_tokens),
878
+ cacheReadInputTokens: getTokenTotal(record.cache_read_input_tokens),
879
+ cacheCreationInputTokens: getTokenTotal(record.cache_creation_input_tokens)
880
+ };
1082
881
  }
1083
882
  function hasAnyUsage(usage) {
1084
- return usage.inputTokens !== void 0 || usage.outputTokens !== void 0 || usage.cacheReadInputTokens !== void 0 || usage.cacheCreationInputTokens !== void 0 || usage.totalCostUsd !== void 0;
883
+ return usage.inputTokens !== void 0 || usage.outputTokens !== void 0 || usage.cacheReadInputTokens !== void 0 || usage.cacheCreationInputTokens !== void 0 || usage.totalCostUsd !== void 0;
1085
884
  }
1086
885
  function addOptional(left, right) {
1087
- if (left === void 0) {
1088
- return right;
1089
- }
1090
- if (right === void 0) {
1091
- return left;
1092
- }
1093
- return left + right;
886
+ if (left === void 0) return right;
887
+ if (right === void 0) return left;
888
+ return left + right;
1094
889
  }
1095
890
  function toV3Usage(usage) {
1096
- const noCache = usage.inputTokens;
1097
- const cacheRead = usage.cacheReadInputTokens;
1098
- const cacheWrite = usage.cacheCreationInputTokens;
1099
- const totalInputTokens = sumDefined(noCache, cacheRead, cacheWrite);
1100
- const outputTokens = usage.outputTokens;
1101
- return {
1102
- inputTokens: {
1103
- total: totalInputTokens,
1104
- noCache,
1105
- cacheRead,
1106
- cacheWrite
1107
- },
1108
- outputTokens: {
1109
- total: outputTokens,
1110
- text: outputTokens
1111
- }
1112
- };
891
+ const noCache = usage.inputTokens;
892
+ const cacheRead = usage.cacheReadInputTokens;
893
+ const cacheWrite = usage.cacheCreationInputTokens;
894
+ const totalInputTokens = sumDefined(noCache, cacheRead, cacheWrite);
895
+ const outputTokens = usage.outputTokens;
896
+ return {
897
+ inputTokens: {
898
+ total: totalInputTokens,
899
+ noCache,
900
+ cacheRead,
901
+ cacheWrite
902
+ },
903
+ outputTokens: {
904
+ total: outputTokens,
905
+ text: outputTokens
906
+ }
907
+ };
1113
908
  }
1114
909
  function getClaudeProviderMetadata(options, usage) {
1115
- const queryOptions = options.sdkOptions;
1116
- return createProviderMetadata("claude", {
1117
- totalCostUsd: usage?.totalCostUsd,
1118
- model: getModelId(options),
1119
- cwd: queryOptions?.cwd,
1120
- permissionMode: queryOptions?.permissionMode,
1121
- maxTurns: queryOptions?.maxTurns,
1122
- allowedTools: queryOptions?.allowedTools,
1123
- disallowedTools: queryOptions?.disallowedTools,
1124
- usage
1125
- });
910
+ const queryOptions = options.sdkOptions;
911
+ return createProviderMetadata("claude", {
912
+ totalCostUsd: usage?.totalCostUsd,
913
+ model: getModelId(options),
914
+ cwd: queryOptions?.cwd,
915
+ permissionMode: queryOptions?.permissionMode,
916
+ maxTurns: queryOptions?.maxTurns,
917
+ allowedTools: queryOptions?.allowedTools,
918
+ disallowedTools: queryOptions?.disallowedTools,
919
+ usage
920
+ });
1126
921
  }
1127
922
  function getClaudeCostContext(options, usage) {
1128
- if (typeof usage?.totalCostUsd !== "number") {
1129
- return void 0;
1130
- }
1131
- return {
1132
- provider: "anthropic",
1133
- model: getModelId(options),
1134
- estimatedCost: usage.totalCostUsd,
1135
- costUnit: "USD",
1136
- costMetadata: {
1137
- source: "sdk_estimate",
1138
- sdkProvider: PROVIDER,
1139
- sdkCostField: "total_cost_usd",
1140
- scope: "query_total",
1141
- modelUsage: usage.modelUsage
1142
- }
1143
- };
923
+ if (typeof usage?.totalCostUsd !== "number") return;
924
+ return {
925
+ provider: "anthropic",
926
+ model: getModelId(options),
927
+ estimatedCost: usage.totalCostUsd,
928
+ costUnit: "USD",
929
+ costMetadata: {
930
+ source: "sdk_estimate",
931
+ sdkProvider: PROVIDER,
932
+ sdkCostField: "total_cost_usd",
933
+ scope: "query_total",
934
+ modelUsage: usage.modelUsage
935
+ }
936
+ };
1144
937
  }
1145
938
  function getTextDelta(message) {
1146
- if (message.type !== "stream_event") {
1147
- return "";
1148
- }
1149
- const event = message.event;
1150
- if (event.type === "content_block_delta" && event.delta?.type === "text_delta") {
1151
- return event.delta.text ?? "";
1152
- }
1153
- return "";
939
+ if (message.type !== "stream_event") return "";
940
+ const event = message.event;
941
+ if (event.type === "content_block_delta" && event.delta?.type === "text_delta") return event.delta.text ?? "";
942
+ return "";
1154
943
  }
1155
944
  function getTokenTotal(value) {
1156
- return typeof value === "number" ? value : void 0;
945
+ return typeof value === "number" ? value : void 0;
1157
946
  }
1158
-
947
+ //#endregion
1159
948
  exports.ClaudeSDKAgent = ClaudeSDKAgent;
1160
- //# sourceMappingURL=index.cjs.map
949
+
1161
950
  //# sourceMappingURL=index.cjs.map