@mastra/ai-sdk 1.2.1 → 1.3.0-alpha.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/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # @mastra/ai-sdk
2
2
 
3
+ ## 1.3.0-alpha.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Added `onError` callback to `handleChatStream()` options. This lets you intercept and sanitize stream errors before they reach the client — useful for preventing internal infrastructure details from leaking to end users. ([#14681](https://github.com/mastra-ai/mastra/pull/14681))
8
+
9
+ ```ts
10
+ const stream = await handleChatStream({
11
+ mastra,
12
+ agentId: 'myAgent',
13
+ params,
14
+ onError: error => 'An unexpected error occurred. Please try again.',
15
+ });
16
+ ```
17
+
18
+ ### Patch Changes
19
+
20
+ - Fixed toAISdkStream() crashing when resumed supervisor and subagent streams continue with nested tool results after a suspended tool call. ([#14675](https://github.com/mastra-ai/mastra/pull/14675))
21
+
22
+ - Updated dependencies [[`f16d92c`](https://github.com/mastra-ai/mastra/commit/f16d92c677a119a135cebcf7e2b9f51ada7a9df4)]:
23
+ - @mastra/core@1.18.0-alpha.2
24
+
3
25
  ## 1.2.1
4
26
 
5
27
  ### Patch Changes
@@ -20,6 +20,7 @@ export type ChatStreamHandlerOptions<UI_MESSAGE extends SupportedUIMessage = Sup
20
20
  sendFinish?: boolean;
21
21
  sendReasoning?: boolean;
22
22
  sendSources?: boolean;
23
+ onError?: (error: unknown) => string;
23
24
  messageMetadata?: UI_MESSAGE extends V6UIMessage ? UIMessageStreamOptionsV6<UI_MESSAGE>['messageMetadata'] : UI_MESSAGE extends V5UIMessage ? UIMessageStreamOptionsV5<UI_MESSAGE>['messageMetadata'] : never;
24
25
  };
25
26
  type ChatStreamHandlerOptionsV5<UI_MESSAGE extends V5UIMessage = V5UIMessage, OUTPUT = undefined> = Omit<ChatStreamHandlerOptions<UI_MESSAGE, OUTPUT>, 'version' | 'messageMetadata'> & {
@@ -1 +1 @@
1
- {"version":3,"file":"chat-route.d.ts","sourceRoot":"","sources":["../src/chat-route.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-route.d.ts","sourceRoot":"","sources":["../src/chat-route.ts"],"names":[],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -12378,6 +12378,34 @@ function AgentStreamToAISDKV6Transformer({
12378
12378
  onError
12379
12379
  });
12380
12380
  }
12381
+ function ensureAgentRunState(bufferedSteps, runId) {
12382
+ if (!bufferedSteps.has(runId)) {
12383
+ bufferedSteps.set(runId, {
12384
+ id: "",
12385
+ object: null,
12386
+ finishReason: null,
12387
+ usage: null,
12388
+ warnings: [],
12389
+ text: "",
12390
+ reasoning: [],
12391
+ sources: [],
12392
+ files: [],
12393
+ toolCalls: [],
12394
+ toolResults: [],
12395
+ request: {},
12396
+ response: {
12397
+ id: "",
12398
+ timestamp: /* @__PURE__ */ new Date(),
12399
+ modelId: "",
12400
+ messages: []
12401
+ },
12402
+ providerMetadata: void 0,
12403
+ steps: [],
12404
+ status: "running"
12405
+ });
12406
+ }
12407
+ return bufferedSteps.get(runId);
12408
+ }
12381
12409
  function transformAgent(payload, bufferedSteps) {
12382
12410
  let hasChanged = false;
12383
12411
  switch (payload.type) {
@@ -12418,7 +12446,7 @@ function transformAgent(payload, bufferedSteps) {
12418
12446
  });
12419
12447
  hasChanged = true;
12420
12448
  break;
12421
- case "text-delta":
12449
+ case "text-delta": {
12422
12450
  const prevData = bufferedSteps.get(payload.runId);
12423
12451
  bufferedSteps.set(payload.runId, {
12424
12452
  ...prevData,
@@ -12426,6 +12454,7 @@ function transformAgent(payload, bufferedSteps) {
12426
12454
  });
12427
12455
  hasChanged = true;
12428
12456
  break;
12457
+ }
12429
12458
  case "reasoning-delta":
12430
12459
  bufferedSteps.set(payload.runId, {
12431
12460
  ...bufferedSteps.get(payload.runId),
@@ -12454,13 +12483,15 @@ function transformAgent(payload, bufferedSteps) {
12454
12483
  });
12455
12484
  hasChanged = true;
12456
12485
  break;
12457
- case "tool-result":
12486
+ case "tool-result": {
12487
+ const toolResultRun = ensureAgentRunState(bufferedSteps, payload.runId);
12458
12488
  bufferedSteps.set(payload.runId, {
12459
- ...bufferedSteps.get(payload.runId),
12460
- toolResults: [...bufferedSteps.get(payload.runId).toolResults, payload.payload]
12489
+ ...toolResultRun,
12490
+ toolResults: [...toolResultRun.toolResults, payload.payload]
12461
12491
  });
12462
12492
  hasChanged = true;
12463
12493
  break;
12494
+ }
12464
12495
  case "object-result":
12465
12496
  bufferedSteps.set(payload.runId, {
12466
12497
  ...bufferedSteps.get(payload.runId),
@@ -12475,35 +12506,44 @@ function transformAgent(payload, bufferedSteps) {
12475
12506
  });
12476
12507
  hasChanged = true;
12477
12508
  break;
12478
- case "step-finish":
12479
- const currentRun = bufferedSteps.get(payload.runId);
12509
+ case "step-finish": {
12510
+ const stepRun = ensureAgentRunState(bufferedSteps, payload.runId);
12480
12511
  const stepResult = {
12481
- ...bufferedSteps.get(payload.runId),
12482
- stepType: currentRun.steps.length === 0 ? "initial" : "tool-result",
12483
- reasoningText: bufferedSteps.get(payload.runId).reasoning.join(""),
12484
- staticToolCalls: bufferedSteps.get(payload.runId).toolCalls.filter((part) => part.type === "tool-call" && part.payload?.dynamic === false),
12485
- dynamicToolCalls: bufferedSteps.get(payload.runId).toolCalls.filter((part) => part.type === "tool-call" && part.payload?.dynamic === true),
12486
- staticToolResults: bufferedSteps.get(payload.runId).toolResults.filter((part) => part.type === "tool-result" && part.payload?.dynamic === false),
12487
- dynamicToolResults: bufferedSteps.get(payload.runId).toolResults.filter((part) => part.type === "tool-result" && part.payload?.dynamic === true),
12512
+ ...stepRun,
12513
+ stepType: stepRun.steps.length === 0 ? "initial" : "tool-result",
12514
+ reasoningText: stepRun.reasoning.join(""),
12515
+ staticToolCalls: stepRun.toolCalls.filter(
12516
+ (part) => part.type === "tool-call" && part.payload?.dynamic === false
12517
+ ),
12518
+ dynamicToolCalls: stepRun.toolCalls.filter(
12519
+ (part) => part.type === "tool-call" && part.payload?.dynamic === true
12520
+ ),
12521
+ staticToolResults: stepRun.toolResults.filter(
12522
+ (part) => part.type === "tool-result" && part.payload?.dynamic === false
12523
+ ),
12524
+ dynamicToolResults: stepRun.toolResults.filter(
12525
+ (part) => part.type === "tool-result" && part.payload?.dynamic === true
12526
+ ),
12488
12527
  finishReason: payload.payload.stepResult.reason,
12489
12528
  usage: payload.payload.output.usage,
12490
12529
  warnings: payload.payload.stepResult.warnings || [],
12491
12530
  response: {
12531
+ ...stepRun.response,
12492
12532
  id: payload.payload.id || "",
12493
12533
  timestamp: payload.payload.metadata?.timestamp || /* @__PURE__ */ new Date(),
12494
12534
  modelId: payload.payload.metadata?.modelId || payload.payload.metadata?.model || "",
12495
- ...bufferedSteps.get(payload.runId).response,
12496
- messages: bufferedSteps.get(payload.runId).response.messages || []
12535
+ messages: stepRun.response.messages || []
12497
12536
  }
12498
12537
  };
12499
12538
  bufferedSteps.set(payload.runId, {
12500
- ...bufferedSteps.get(payload.runId),
12539
+ ...stepRun,
12501
12540
  usage: payload.payload.output.usage,
12502
12541
  warnings: payload.payload.stepResult.warnings || [],
12503
- steps: [...bufferedSteps.get(payload.runId).steps, stepResult]
12542
+ steps: [...stepRun.steps, stepResult]
12504
12543
  });
12505
12544
  hasChanged = true;
12506
12545
  break;
12546
+ }
12507
12547
  }
12508
12548
  if (hasChanged) {
12509
12549
  return {
@@ -13118,6 +13158,7 @@ async function handleChatStream({
13118
13158
  sendFinish = true,
13119
13159
  sendReasoning = false,
13120
13160
  sendSources = false,
13161
+ onError,
13121
13162
  messageMetadata
13122
13163
  }) {
13123
13164
  const { messages, resumeData, runId, requestContext, trigger, ...rest } = params;
@@ -13169,6 +13210,7 @@ async function handleChatStream({
13169
13210
  sendFinish,
13170
13211
  sendReasoning,
13171
13212
  sendSources,
13213
+ onError,
13172
13214
  messageMetadata
13173
13215
  })) {
13174
13216
  writer.write(part);
@@ -13186,6 +13228,7 @@ async function handleChatStream({
13186
13228
  sendFinish,
13187
13229
  sendReasoning,
13188
13230
  sendSources,
13231
+ onError,
13189
13232
  messageMetadata
13190
13233
  })) {
13191
13234
  writer.write(part);