@mastra/react 0.0.0-dynamic-model-router-20251010193247 → 0.0.0-error-handler-fix-20251020202607
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 +76 -2
- package/dist/index.cjs +88 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +88 -22
- package/dist/index.js.map +1 -1
- package/dist/react.css +1 -1
- package/dist/src/agent/hooks.d.ts +14 -4
- package/dist/src/lib/ai-sdk/transformers/AISdkNetworkTransformer.d.ts +1 -0
- package/package.json +13 -9
package/dist/index.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { createContext, useContext, useState, Fragment, useLayoutEffect, useRef, useEffect } from 'react';
|
|
3
3
|
import { MastraClient } from '@mastra/client-js';
|
|
4
|
-
import { flushSync } from 'react-dom';
|
|
5
4
|
import { ChevronDownIcon, CheckIcon, CopyIcon } from 'lucide-react';
|
|
6
5
|
import { twMerge } from 'tailwind-merge';
|
|
7
6
|
import { toJsxRuntime } from 'hast-util-to-jsx-runtime';
|
|
@@ -550,6 +549,9 @@ const toAssistantUIMessage = (message) => {
|
|
|
550
549
|
class AISdkNetworkTransformer {
|
|
551
550
|
transform({ chunk, conversation, metadata }) {
|
|
552
551
|
const newConversation = [...conversation];
|
|
552
|
+
if (chunk.type === "routing-agent-text-delta") {
|
|
553
|
+
return this.handleRoutingAgentConversation(chunk, newConversation);
|
|
554
|
+
}
|
|
553
555
|
if (chunk.type.startsWith("agent-execution-")) {
|
|
554
556
|
return this.handleAgentConversation(chunk, newConversation, metadata);
|
|
555
557
|
}
|
|
@@ -560,22 +562,80 @@ class AISdkNetworkTransformer {
|
|
|
560
562
|
return this.handleToolConversation(chunk, newConversation, metadata);
|
|
561
563
|
}
|
|
562
564
|
if (chunk.type === "network-execution-event-step-finish") {
|
|
563
|
-
const
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
565
|
+
const lastMessage = newConversation[newConversation.length - 1];
|
|
566
|
+
if (!lastMessage || lastMessage.role !== "assistant") return newConversation;
|
|
567
|
+
const agentChunk = chunk.payload;
|
|
568
|
+
const parts = [...lastMessage.parts];
|
|
569
|
+
const textPartIndex = parts.findIndex((part) => part.type === "text");
|
|
570
|
+
if (textPartIndex === -1) {
|
|
571
|
+
parts.push({
|
|
572
|
+
type: "text",
|
|
573
|
+
text: agentChunk.result,
|
|
574
|
+
state: "done"
|
|
575
|
+
});
|
|
576
|
+
return [
|
|
577
|
+
...newConversation.slice(0, -1),
|
|
567
578
|
{
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
state: "done"
|
|
579
|
+
...lastMessage,
|
|
580
|
+
parts
|
|
571
581
|
}
|
|
572
|
-
]
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
582
|
+
];
|
|
583
|
+
}
|
|
584
|
+
const textPart = parts[textPartIndex];
|
|
585
|
+
if (textPart.type === "text") {
|
|
586
|
+
parts[textPartIndex] = {
|
|
587
|
+
...textPart,
|
|
588
|
+
state: "done"
|
|
589
|
+
};
|
|
590
|
+
return [
|
|
591
|
+
...newConversation.slice(0, -1),
|
|
592
|
+
{
|
|
593
|
+
...lastMessage,
|
|
594
|
+
parts
|
|
595
|
+
}
|
|
596
|
+
];
|
|
597
|
+
}
|
|
598
|
+
return newConversation;
|
|
576
599
|
}
|
|
577
600
|
return newConversation;
|
|
578
601
|
}
|
|
602
|
+
handleRoutingAgentConversation = (chunk, newConversation) => {
|
|
603
|
+
const lastMessage = newConversation[newConversation.length - 1];
|
|
604
|
+
if (!lastMessage || lastMessage.role !== "assistant") return newConversation;
|
|
605
|
+
const agentChunk = chunk.payload;
|
|
606
|
+
const parts = [...lastMessage.parts];
|
|
607
|
+
const textPartIndex = parts.findIndex((part) => part.type === "text");
|
|
608
|
+
if (textPartIndex === -1) {
|
|
609
|
+
parts.push({
|
|
610
|
+
type: "text",
|
|
611
|
+
text: agentChunk.text,
|
|
612
|
+
state: "streaming"
|
|
613
|
+
});
|
|
614
|
+
return [
|
|
615
|
+
...newConversation.slice(0, -1),
|
|
616
|
+
{
|
|
617
|
+
...lastMessage,
|
|
618
|
+
parts
|
|
619
|
+
}
|
|
620
|
+
];
|
|
621
|
+
}
|
|
622
|
+
const textPart = parts[textPartIndex];
|
|
623
|
+
if (textPart.type === "text") {
|
|
624
|
+
parts[textPartIndex] = {
|
|
625
|
+
...textPart,
|
|
626
|
+
text: textPart.text + agentChunk.text,
|
|
627
|
+
state: "streaming"
|
|
628
|
+
};
|
|
629
|
+
return [
|
|
630
|
+
...newConversation.slice(0, -1),
|
|
631
|
+
{
|
|
632
|
+
...lastMessage,
|
|
633
|
+
parts
|
|
634
|
+
}
|
|
635
|
+
];
|
|
636
|
+
}
|
|
637
|
+
return newConversation;
|
|
638
|
+
};
|
|
579
639
|
handleAgentConversation = (chunk, newConversation, metadata) => {
|
|
580
640
|
if (chunk.type === "agent-execution-start") {
|
|
581
641
|
const primitiveId = chunk.payload?.args?.primitiveId;
|
|
@@ -1040,9 +1100,7 @@ const useChat = ({ agentId, initializeMessages }) => {
|
|
|
1040
1100
|
}
|
|
1041
1101
|
await response.processDataStream({
|
|
1042
1102
|
onChunk: async (chunk) => {
|
|
1043
|
-
|
|
1044
|
-
setMessages((prev) => toUIMessage({ chunk, conversation: prev, metadata: { mode: "stream" } }));
|
|
1045
|
-
});
|
|
1103
|
+
setMessages((prev) => toUIMessage({ chunk, conversation: prev, metadata: { mode: "stream" } }));
|
|
1046
1104
|
onChunk?.(chunk);
|
|
1047
1105
|
}
|
|
1048
1106
|
});
|
|
@@ -1082,21 +1140,29 @@ const useChat = ({ agentId, initializeMessages }) => {
|
|
|
1082
1140
|
const transformer = new AISdkNetworkTransformer();
|
|
1083
1141
|
await response.processDataStream({
|
|
1084
1142
|
onChunk: async (chunk) => {
|
|
1085
|
-
|
|
1086
|
-
setMessages((prev) => transformer.transform({ chunk, conversation: prev, metadata: { mode: "network" } }));
|
|
1087
|
-
});
|
|
1143
|
+
setMessages((prev) => transformer.transform({ chunk, conversation: prev, metadata: { mode: "network" } }));
|
|
1088
1144
|
onNetworkChunk?.(chunk);
|
|
1089
1145
|
}
|
|
1090
1146
|
});
|
|
1091
1147
|
setIsRunning(false);
|
|
1092
1148
|
};
|
|
1149
|
+
const sendMessage = async ({ mode = "stream", ...args }) => {
|
|
1150
|
+
const nextMessage = { role: "user", content: [{ type: "text", text: args.message }] };
|
|
1151
|
+
const messages2 = args.coreUserMessages ? [nextMessage, ...args.coreUserMessages] : [nextMessage];
|
|
1152
|
+
setMessages((s) => [...s, { role: "user", parts: [{ type: "text", text: args.message }] }]);
|
|
1153
|
+
if (mode === "generate") {
|
|
1154
|
+
await generate({ ...args, coreUserMessages: messages2 });
|
|
1155
|
+
} else if (mode === "stream") {
|
|
1156
|
+
await stream({ ...args, coreUserMessages: messages2 });
|
|
1157
|
+
} else if (mode === "network") {
|
|
1158
|
+
await network({ ...args, coreUserMessages: messages2 });
|
|
1159
|
+
}
|
|
1160
|
+
};
|
|
1093
1161
|
return {
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
generate,
|
|
1162
|
+
setMessages,
|
|
1163
|
+
sendMessage,
|
|
1097
1164
|
isRunning,
|
|
1098
1165
|
messages,
|
|
1099
|
-
setMessages,
|
|
1100
1166
|
cancelRun: () => setIsRunning(false)
|
|
1101
1167
|
};
|
|
1102
1168
|
};
|