@mastra/server 1.33.0-alpha.6 → 1.33.0-alpha.7
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 +152 -0
- package/dist/{api-schema-manifest-IWGQ5O45.js → api-schema-manifest-JLJ555JD.js} +3 -3
- package/dist/{api-schema-manifest-IWGQ5O45.js.map → api-schema-manifest-JLJ555JD.js.map} +1 -1
- package/dist/{api-schema-manifest-KDXQELMU.cjs → api-schema-manifest-QMJFKSSQ.cjs} +4 -4
- package/dist/{api-schema-manifest-KDXQELMU.cjs.map → api-schema-manifest-QMJFKSSQ.cjs.map} +1 -1
- package/dist/{chunk-IDLB647Y.js → chunk-2S4WCY5N.js} +3 -3
- package/dist/{chunk-IDLB647Y.js.map → chunk-2S4WCY5N.js.map} +1 -1
- package/dist/{chunk-EFW6MWXU.cjs → chunk-5XW4MKE6.cjs} +22 -2
- package/dist/chunk-5XW4MKE6.cjs.map +1 -0
- package/dist/{chunk-N6HISTTP.cjs → chunk-6ICH4PZY.cjs} +8 -8
- package/dist/{chunk-N6HISTTP.cjs.map → chunk-6ICH4PZY.cjs.map} +1 -1
- package/dist/{chunk-TE2PWB67.js → chunk-6IR53OXN.js} +3 -3
- package/dist/{chunk-TE2PWB67.js.map → chunk-6IR53OXN.js.map} +1 -1
- package/dist/{chunk-LXNZK6NM.cjs → chunk-6PJXFSA6.cjs} +51 -51
- package/dist/{chunk-LXNZK6NM.cjs.map → chunk-6PJXFSA6.cjs.map} +1 -1
- package/dist/{chunk-64YJOWH2.cjs → chunk-72W42JL4.cjs} +5 -5
- package/dist/{chunk-64YJOWH2.cjs.map → chunk-72W42JL4.cjs.map} +1 -1
- package/dist/{chunk-UOBKNRHM.cjs → chunk-7MXANTMR.cjs} +7 -7
- package/dist/{chunk-UOBKNRHM.cjs.map → chunk-7MXANTMR.cjs.map} +1 -1
- package/dist/{chunk-RQNN75EV.js → chunk-7QLLMDX3.js} +4 -4
- package/dist/{chunk-RQNN75EV.js.map → chunk-7QLLMDX3.js.map} +1 -1
- package/dist/{chunk-2KDOM6QE.js → chunk-7UMTLDZF.js} +106 -4
- package/dist/chunk-7UMTLDZF.js.map +1 -0
- package/dist/{chunk-WEDFF5FH.js → chunk-7UYUFWJS.js} +42 -42
- package/dist/chunk-7UYUFWJS.js.map +1 -0
- package/dist/{chunk-VZNSMKB7.cjs → chunk-7Y6MST2S.cjs} +135 -133
- package/dist/chunk-7Y6MST2S.cjs.map +1 -0
- package/dist/{chunk-CSG535HL.cjs → chunk-AHKXIRNB.cjs} +67 -41
- package/dist/chunk-AHKXIRNB.cjs.map +1 -0
- package/dist/chunk-B3CHYE7C.js +549 -0
- package/dist/chunk-B3CHYE7C.js.map +1 -0
- package/dist/{chunk-XPF4VEXO.js → chunk-C45QKFMT.js} +18 -16
- package/dist/chunk-C45QKFMT.js.map +1 -0
- package/dist/{chunk-OJLXPTSL.cjs → chunk-CXWOBZOJ.cjs} +13 -13
- package/dist/{chunk-OJLXPTSL.cjs.map → chunk-CXWOBZOJ.cjs.map} +1 -1
- package/dist/{chunk-5HQXXBTM.js → chunk-DXZFPYNO.js} +3 -3
- package/dist/{chunk-5HQXXBTM.js.map → chunk-DXZFPYNO.js.map} +1 -1
- package/dist/{chunk-TWT64BVR.js → chunk-E55OUW7R.js} +44 -69
- package/dist/chunk-E55OUW7R.js.map +1 -0
- package/dist/{chunk-LOZT5NDU.cjs → chunk-E74QCKFN.cjs} +3 -3
- package/dist/{chunk-LOZT5NDU.cjs.map → chunk-E74QCKFN.cjs.map} +1 -1
- package/dist/{chunk-IT26WLSZ.js → chunk-EWN5J4RH.js} +6 -6
- package/dist/{chunk-IT26WLSZ.js.map → chunk-EWN5J4RH.js.map} +1 -1
- package/dist/chunk-F3HP5HM6.cjs +998 -0
- package/dist/chunk-F3HP5HM6.cjs.map +1 -0
- package/dist/{chunk-47U5QTGT.cjs → chunk-FST7LM2Z.cjs} +76 -29
- package/dist/chunk-FST7LM2Z.cjs.map +1 -0
- package/dist/{chunk-MTKGUIFX.js → chunk-GCR6GN77.js} +4 -4
- package/dist/{chunk-MTKGUIFX.js.map → chunk-GCR6GN77.js.map} +1 -1
- package/dist/{chunk-ANXKF4TA.cjs → chunk-HN23LS75.cjs} +108 -108
- package/dist/chunk-HN23LS75.cjs.map +1 -0
- package/dist/{chunk-EQ27BVOT.js → chunk-IJFWBMHN.js} +3 -3
- package/dist/{chunk-EQ27BVOT.js.map → chunk-IJFWBMHN.js.map} +1 -1
- package/dist/{chunk-UOC4K3RU.js → chunk-JOUPK2UV.js} +3 -3
- package/dist/{chunk-UOC4K3RU.js.map → chunk-JOUPK2UV.js.map} +1 -1
- package/dist/{chunk-IYEGDP3G.js → chunk-M7DF3D2M.js} +3 -3
- package/dist/{chunk-IYEGDP3G.js.map → chunk-M7DF3D2M.js.map} +1 -1
- package/dist/{chunk-KSQVYDDO.cjs → chunk-OAWMKZCM.cjs} +4 -4
- package/dist/{chunk-KSQVYDDO.cjs.map → chunk-OAWMKZCM.cjs.map} +1 -1
- package/dist/{chunk-CYLX5SJ4.js → chunk-PX7NE2KG.js} +4 -4
- package/dist/{chunk-CYLX5SJ4.js.map → chunk-PX7NE2KG.js.map} +1 -1
- package/dist/{chunk-2HM5SQM5.js → chunk-Q3JFNANT.js} +3 -3
- package/dist/{chunk-2HM5SQM5.js.map → chunk-Q3JFNANT.js.map} +1 -1
- package/dist/{chunk-EKS524LA.js → chunk-QJD675UA.js} +76 -29
- package/dist/chunk-QJD675UA.js.map +1 -0
- package/dist/{chunk-WMS63TTU.cjs → chunk-T3X7ZXVR.cjs} +140 -36
- package/dist/chunk-T3X7ZXVR.cjs.map +1 -0
- package/dist/{chunk-4KNRG3KO.cjs → chunk-TFJZGWXX.cjs} +7 -7
- package/dist/{chunk-4KNRG3KO.cjs.map → chunk-TFJZGWXX.cjs.map} +1 -1
- package/dist/chunk-TLLV2JP5.js +983 -0
- package/dist/chunk-TLLV2JP5.js.map +1 -0
- package/dist/chunk-TTJ3DYZH.cjs +557 -0
- package/dist/chunk-TTJ3DYZH.cjs.map +1 -0
- package/dist/{chunk-R7EB3VDI.cjs → chunk-VZV7DUW7.cjs} +4 -4
- package/dist/{chunk-R7EB3VDI.cjs.map → chunk-VZV7DUW7.cjs.map} +1 -1
- package/dist/{chunk-GAS277DM.cjs → chunk-WLDDOYXP.cjs} +7 -7
- package/dist/{chunk-GAS277DM.cjs.map → chunk-WLDDOYXP.cjs.map} +1 -1
- package/dist/{chunk-Y3OQTZDN.js → chunk-WN62DURP.js} +37 -11
- package/dist/chunk-WN62DURP.js.map +1 -0
- package/dist/{chunk-QEM5P746.cjs → chunk-XUFBFMUU.cjs} +67 -92
- package/dist/chunk-XUFBFMUU.cjs.map +1 -0
- package/dist/{chunk-BK2PRWVJ.cjs → chunk-Y5LNMKEY.cjs} +5 -5
- package/dist/{chunk-BK2PRWVJ.cjs.map → chunk-Y5LNMKEY.cjs.map} +1 -1
- package/dist/{chunk-OJRAH5VV.js → chunk-YARY4I5U.js} +18 -3
- package/dist/chunk-YARY4I5U.js.map +1 -0
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/{observational-memory-HAJ3K5JJ-RB4HNAIV.cjs → observational-memory-IP2RVQQG-5IHDRYAB.cjs} +26 -26
- package/dist/{observational-memory-HAJ3K5JJ-RB4HNAIV.cjs.map → observational-memory-IP2RVQQG-5IHDRYAB.cjs.map} +1 -1
- package/dist/{observational-memory-HAJ3K5JJ-J2PZI56J.js → observational-memory-IP2RVQQG-DIZILT73.js} +3 -3
- package/dist/{observational-memory-HAJ3K5JJ-J2PZI56J.js.map → observational-memory-IP2RVQQG-DIZILT73.js.map} +1 -1
- package/dist/server/auth/index.cjs +15 -15
- package/dist/server/auth/index.js +1 -1
- package/dist/server/constants.d.ts +5 -0
- package/dist/server/constants.d.ts.map +1 -1
- package/dist/server/handlers/a2a.cjs +14 -14
- package/dist/server/handlers/a2a.js +1 -1
- package/dist/server/handlers/agent-builder.cjs +16 -16
- package/dist/server/handlers/agent-builder.js +1 -1
- package/dist/server/handlers/agents.cjs +39 -39
- package/dist/server/handlers/agents.d.ts.map +1 -1
- package/dist/server/handlers/agents.js +1 -1
- package/dist/server/handlers/auth.cjs +11 -11
- package/dist/server/handlers/auth.js +1 -1
- package/dist/server/handlers/conversations.cjs +5 -5
- package/dist/server/handlers/conversations.js +1 -1
- package/dist/server/handlers/logs.cjs +4 -4
- package/dist/server/handlers/logs.js +1 -1
- package/dist/server/handlers/memory.cjs +27 -27
- package/dist/server/handlers/memory.js +1 -1
- package/dist/server/handlers/responses.adapter.cjs +18 -14
- package/dist/server/handlers/responses.adapter.d.ts +96 -2
- package/dist/server/handlers/responses.adapter.d.ts.map +1 -1
- package/dist/server/handlers/responses.adapter.js +1 -1
- package/dist/server/handlers/responses.cjs +4 -4
- package/dist/server/handlers/responses.d.ts.map +1 -1
- package/dist/server/handlers/responses.js +1 -1
- package/dist/server/handlers/responses.storage.cjs +8 -8
- package/dist/server/handlers/responses.storage.d.ts +4 -2
- package/dist/server/handlers/responses.storage.d.ts.map +1 -1
- package/dist/server/handlers/responses.storage.js +1 -1
- package/dist/server/handlers/scores.cjs +7 -7
- package/dist/server/handlers/scores.js +1 -1
- package/dist/server/handlers/system.cjs +3 -3
- package/dist/server/handlers/system.js +1 -1
- package/dist/server/handlers/tools.cjs +6 -6
- package/dist/server/handlers/tools.js +1 -1
- package/dist/server/handlers/utils.cjs +10 -10
- package/dist/server/handlers/utils.js +1 -1
- package/dist/server/handlers/voice.cjs +8 -8
- package/dist/server/handlers/voice.js +1 -1
- package/dist/server/handlers/workflows.cjs +32 -24
- package/dist/server/handlers/workflows.d.ts +83 -0
- package/dist/server/handlers/workflows.d.ts.map +1 -1
- package/dist/server/handlers/workflows.js +1 -1
- package/dist/server/handlers.cjs +22 -22
- package/dist/server/handlers.js +11 -11
- package/dist/server/server-adapter/index.cjs +43 -16
- package/dist/server/server-adapter/index.cjs.map +1 -1
- package/dist/server/server-adapter/index.d.ts +5 -1
- package/dist/server/server-adapter/index.d.ts.map +1 -1
- package/dist/server/server-adapter/index.js +15 -7
- package/dist/server/server-adapter/index.js.map +1 -1
- package/dist/server/server-adapter/routes/workflows.d.ts +66 -1
- package/dist/server/server-adapter/routes/workflows.d.ts.map +1 -1
- package/package.json +7 -7
- package/dist/chunk-2KDOM6QE.js.map +0 -1
- package/dist/chunk-47U5QTGT.cjs.map +0 -1
- package/dist/chunk-AJYJ4H7P.js +0 -438
- package/dist/chunk-AJYJ4H7P.js.map +0 -1
- package/dist/chunk-ANXKF4TA.cjs.map +0 -1
- package/dist/chunk-CSG535HL.cjs.map +0 -1
- package/dist/chunk-DFSUBEGE.js +0 -226
- package/dist/chunk-DFSUBEGE.js.map +0 -1
- package/dist/chunk-EFW6MWXU.cjs.map +0 -1
- package/dist/chunk-EKS524LA.js.map +0 -1
- package/dist/chunk-OJ72T77G.cjs +0 -452
- package/dist/chunk-OJ72T77G.cjs.map +0 -1
- package/dist/chunk-OJRAH5VV.js.map +0 -1
- package/dist/chunk-PJYQMPXT.cjs +0 -234
- package/dist/chunk-PJYQMPXT.cjs.map +0 -1
- package/dist/chunk-QEM5P746.cjs.map +0 -1
- package/dist/chunk-TWT64BVR.js.map +0 -1
- package/dist/chunk-VZNSMKB7.cjs.map +0 -1
- package/dist/chunk-WEDFF5FH.js.map +0 -1
- package/dist/chunk-WMS63TTU.cjs.map +0 -1
- package/dist/chunk-XPF4VEXO.js.map +0 -1
- package/dist/chunk-Y3OQTZDN.js.map +0 -1
|
@@ -0,0 +1,983 @@
|
|
|
1
|
+
import { randomUUID } from 'crypto';
|
|
2
|
+
import { isProviderDefinedTool } from '@mastra/core/tools';
|
|
3
|
+
import { zodToJsonSchema } from '@mastra/core/utils/zod-to-json';
|
|
4
|
+
|
|
5
|
+
// src/server/handlers/responses.adapter.ts
|
|
6
|
+
function normalizeMessageContent(content) {
|
|
7
|
+
if (typeof content === "string") {
|
|
8
|
+
return content;
|
|
9
|
+
}
|
|
10
|
+
return content.map((part) => part.text).join("");
|
|
11
|
+
}
|
|
12
|
+
function getMessageText(message) {
|
|
13
|
+
const parts = Array.isArray(message.content?.parts) ? message.content.parts : [];
|
|
14
|
+
return parts.flatMap((part) => part.type === "text" ? [part.text] : []).filter((text) => typeof text === "string").join("");
|
|
15
|
+
}
|
|
16
|
+
function isRecord(value) {
|
|
17
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
18
|
+
}
|
|
19
|
+
function getMessageRole(message) {
|
|
20
|
+
return message.role ?? "";
|
|
21
|
+
}
|
|
22
|
+
function getToolKey(toolCallId, messageId, partIndex) {
|
|
23
|
+
return `${messageId}:${partIndex}`;
|
|
24
|
+
}
|
|
25
|
+
function getFunctionCallOutputItemId(toolCallId) {
|
|
26
|
+
return `${toolCallId}:output`;
|
|
27
|
+
}
|
|
28
|
+
function normalizeToolParameters(schema) {
|
|
29
|
+
if (!isRecord(schema)) {
|
|
30
|
+
return schema;
|
|
31
|
+
}
|
|
32
|
+
if (isRecord(schema.json) && Object.keys(schema).length === 1) {
|
|
33
|
+
return schema.json;
|
|
34
|
+
}
|
|
35
|
+
return schema;
|
|
36
|
+
}
|
|
37
|
+
function mapMastraToolsToResponseTools(tools) {
|
|
38
|
+
if (!tools) {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
return Object.values(tools).flatMap((tool) => {
|
|
42
|
+
if (!isRecord(tool)) {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
const name = typeof tool.id === "string" ? tool.id : typeof tool.name === "string" ? tool.name : null;
|
|
46
|
+
if (!name) {
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
const description = typeof tool.description === "string" ? tool.description : void 0;
|
|
50
|
+
let parameters;
|
|
51
|
+
if (isProviderDefinedTool(tool)) {
|
|
52
|
+
const resolvedSchema = typeof tool.inputSchema === "function" ? tool.inputSchema() : tool.inputSchema;
|
|
53
|
+
parameters = isRecord(resolvedSchema) && "jsonSchema" in resolvedSchema ? normalizeToolParameters(resolvedSchema.jsonSchema) : void 0;
|
|
54
|
+
} else if ("inputSchema" in tool && tool.inputSchema) {
|
|
55
|
+
parameters = normalizeToolParameters(zodToJsonSchema(tool.inputSchema));
|
|
56
|
+
}
|
|
57
|
+
return [
|
|
58
|
+
{
|
|
59
|
+
type: "function",
|
|
60
|
+
name,
|
|
61
|
+
...description ? { description } : {},
|
|
62
|
+
...parameters !== void 0 ? { parameters: JSON.parse(JSON.stringify(parameters)) } : {}
|
|
63
|
+
}
|
|
64
|
+
];
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
function stringifyToolPayload(value) {
|
|
68
|
+
if (typeof value === "string") {
|
|
69
|
+
return value;
|
|
70
|
+
}
|
|
71
|
+
return JSON.stringify(value === void 0 ? {} : value);
|
|
72
|
+
}
|
|
73
|
+
function stringifyToolArguments(value) {
|
|
74
|
+
if (isRecord(value) && typeof value.__raw === "string") {
|
|
75
|
+
return value.__raw;
|
|
76
|
+
}
|
|
77
|
+
return stringifyToolPayload(value === null ? void 0 : value);
|
|
78
|
+
}
|
|
79
|
+
function createOutputMessage({
|
|
80
|
+
messageId,
|
|
81
|
+
status,
|
|
82
|
+
text
|
|
83
|
+
}) {
|
|
84
|
+
const responseStatus = status === "completed" ? "completed" : "incomplete";
|
|
85
|
+
return {
|
|
86
|
+
id: messageId,
|
|
87
|
+
type: "message",
|
|
88
|
+
role: "assistant",
|
|
89
|
+
status: responseStatus,
|
|
90
|
+
content: [createOutputTextPart(text)]
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function createConversationMessage({
|
|
94
|
+
messageId,
|
|
95
|
+
role,
|
|
96
|
+
text
|
|
97
|
+
}) {
|
|
98
|
+
return {
|
|
99
|
+
id: messageId,
|
|
100
|
+
type: "message",
|
|
101
|
+
role,
|
|
102
|
+
status: "completed",
|
|
103
|
+
content: [
|
|
104
|
+
role === "assistant" ? createOutputTextPart(text) : {
|
|
105
|
+
type: "input_text",
|
|
106
|
+
text
|
|
107
|
+
}
|
|
108
|
+
]
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function createFunctionCallItem({
|
|
112
|
+
itemId,
|
|
113
|
+
callId,
|
|
114
|
+
name,
|
|
115
|
+
args
|
|
116
|
+
}) {
|
|
117
|
+
return {
|
|
118
|
+
id: itemId,
|
|
119
|
+
type: "function_call",
|
|
120
|
+
call_id: callId,
|
|
121
|
+
name,
|
|
122
|
+
arguments: stringifyToolArguments(args),
|
|
123
|
+
status: "completed"
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function createFunctionCallOutputItem({ itemId, callId, output }) {
|
|
127
|
+
return {
|
|
128
|
+
id: itemId,
|
|
129
|
+
type: "function_call_output",
|
|
130
|
+
call_id: callId,
|
|
131
|
+
output: stringifyToolPayload(output)
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function collectToolResultCallIds(messages) {
|
|
135
|
+
const toolResultCallIds = /* @__PURE__ */ new Set();
|
|
136
|
+
for (const message of messages) {
|
|
137
|
+
const parts = Array.isArray(message.content?.parts) ? message.content.parts : [];
|
|
138
|
+
for (const [partIndex, part] of parts.entries()) {
|
|
139
|
+
if (!isRecord(part) || part.type !== "tool-invocation" || !isRecord(part.toolInvocation)) {
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const toolInvocation = part.toolInvocation;
|
|
143
|
+
const toolCallId = typeof toolInvocation.toolCallId === "string" ? toolInvocation.toolCallId : getToolKey(null, message.id, partIndex);
|
|
144
|
+
if (getMessageRole(message) === "tool" && toolInvocation.result !== void 0) {
|
|
145
|
+
toolResultCallIds.add(toolCallId);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return toolResultCallIds;
|
|
150
|
+
}
|
|
151
|
+
function mapMastraMessageToResponseToolItems({
|
|
152
|
+
message,
|
|
153
|
+
toolResultCallIds,
|
|
154
|
+
emittedCallIds,
|
|
155
|
+
emittedResultCallIds
|
|
156
|
+
}) {
|
|
157
|
+
const items = [];
|
|
158
|
+
const parts = Array.isArray(message.content?.parts) ? message.content.parts : [];
|
|
159
|
+
for (const [partIndex, part] of parts.entries()) {
|
|
160
|
+
if (!isRecord(part) || part.type !== "tool-invocation" || !isRecord(part.toolInvocation)) {
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
const toolInvocation = part.toolInvocation;
|
|
164
|
+
const toolName = typeof toolInvocation.toolName === "string" ? toolInvocation.toolName : null;
|
|
165
|
+
const toolCallId = typeof toolInvocation.toolCallId === "string" ? toolInvocation.toolCallId : getToolKey(null, message.id, partIndex);
|
|
166
|
+
if (getMessageRole(message) === "assistant" && toolName && !emittedCallIds.has(toolCallId)) {
|
|
167
|
+
items.push(
|
|
168
|
+
createFunctionCallItem({
|
|
169
|
+
itemId: toolCallId,
|
|
170
|
+
callId: toolCallId,
|
|
171
|
+
name: toolName,
|
|
172
|
+
args: toolInvocation.args
|
|
173
|
+
})
|
|
174
|
+
);
|
|
175
|
+
emittedCallIds.add(toolCallId);
|
|
176
|
+
}
|
|
177
|
+
if (toolInvocation.result !== void 0 && !emittedResultCallIds.has(toolCallId) && (getMessageRole(message) === "tool" || !toolResultCallIds.has(toolCallId))) {
|
|
178
|
+
items.push(
|
|
179
|
+
createFunctionCallOutputItem({
|
|
180
|
+
itemId: getFunctionCallOutputItemId(toolCallId),
|
|
181
|
+
callId: toolCallId,
|
|
182
|
+
output: toolInvocation.result
|
|
183
|
+
})
|
|
184
|
+
);
|
|
185
|
+
emittedResultCallIds.add(toolCallId);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return items;
|
|
189
|
+
}
|
|
190
|
+
function mapMastraMessagesToConversationItems(messages) {
|
|
191
|
+
if (!messages.length) {
|
|
192
|
+
return [];
|
|
193
|
+
}
|
|
194
|
+
const items = [];
|
|
195
|
+
const toolResultCallIds = collectToolResultCallIds(messages);
|
|
196
|
+
const emittedCallIds = /* @__PURE__ */ new Set();
|
|
197
|
+
const emittedResultCallIds = /* @__PURE__ */ new Set();
|
|
198
|
+
for (const message of messages) {
|
|
199
|
+
items.push(
|
|
200
|
+
...mapMastraMessageToResponseToolItems({
|
|
201
|
+
message,
|
|
202
|
+
toolResultCallIds,
|
|
203
|
+
emittedCallIds,
|
|
204
|
+
emittedResultCallIds
|
|
205
|
+
})
|
|
206
|
+
);
|
|
207
|
+
const role = getMessageRole(message);
|
|
208
|
+
const text = getMessageText(message);
|
|
209
|
+
if ((role === "user" || role === "system" || role === "assistant") && text) {
|
|
210
|
+
items.push(
|
|
211
|
+
createConversationMessage({
|
|
212
|
+
messageId: message.id,
|
|
213
|
+
role,
|
|
214
|
+
text
|
|
215
|
+
})
|
|
216
|
+
);
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
if (role === "assistant" && !text) {
|
|
220
|
+
const parts = Array.isArray(message.content?.parts) ? message.content.parts : [];
|
|
221
|
+
const hasOnlyToolInvocations = parts.every(
|
|
222
|
+
(part) => isRecord(part) && part.type === "tool-invocation" && isRecord(part.toolInvocation)
|
|
223
|
+
);
|
|
224
|
+
if (hasOnlyToolInvocations) {
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (role === "tool") {
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return items;
|
|
233
|
+
}
|
|
234
|
+
function mergeFallbackOutputItems({
|
|
235
|
+
output,
|
|
236
|
+
fallbackOutputItems
|
|
237
|
+
}) {
|
|
238
|
+
if (!fallbackOutputItems.length) {
|
|
239
|
+
return output;
|
|
240
|
+
}
|
|
241
|
+
const outputById = new Map(output.map((item) => [item.id, item]));
|
|
242
|
+
const fallbackIds = new Set(fallbackOutputItems.map((item) => item.id));
|
|
243
|
+
return [
|
|
244
|
+
...fallbackOutputItems.map((item) => outputById.get(item.id) ?? item),
|
|
245
|
+
...output.filter((item) => !fallbackIds.has(item.id))
|
|
246
|
+
];
|
|
247
|
+
}
|
|
248
|
+
function getOutputMessageText(item) {
|
|
249
|
+
return item.content.map((part) => part.text).join("");
|
|
250
|
+
}
|
|
251
|
+
function mapMastraMessagesToResponseOutputItems({
|
|
252
|
+
messages,
|
|
253
|
+
outputMessageId,
|
|
254
|
+
status,
|
|
255
|
+
fallbackText,
|
|
256
|
+
fallbackOutputItems = []
|
|
257
|
+
}) {
|
|
258
|
+
if (!messages?.length) {
|
|
259
|
+
if (fallbackOutputItems.length) {
|
|
260
|
+
return fallbackOutputItems;
|
|
261
|
+
}
|
|
262
|
+
return [createOutputMessage({ messageId: outputMessageId, status, text: fallbackText })];
|
|
263
|
+
}
|
|
264
|
+
const output = [];
|
|
265
|
+
const lastAssistantIndex = [...messages].map((message) => message.role).lastIndexOf("assistant");
|
|
266
|
+
const outputMessageIndex = [...messages].map((message, index) => ({ index, message })).reverse().find(({ message }) => getMessageRole(message) === "assistant" && getMessageText(message))?.index ?? lastAssistantIndex;
|
|
267
|
+
const toolResultCallIds = collectToolResultCallIds(messages);
|
|
268
|
+
const emittedCallIds = /* @__PURE__ */ new Set();
|
|
269
|
+
const emittedResultCallIds = /* @__PURE__ */ new Set();
|
|
270
|
+
const fallbackMessageItems = fallbackOutputItems.filter(
|
|
271
|
+
(item) => item.type === "message"
|
|
272
|
+
);
|
|
273
|
+
const emittedFallbackMessageIds = /* @__PURE__ */ new Set();
|
|
274
|
+
const getOutputMessageId = ({
|
|
275
|
+
message,
|
|
276
|
+
text,
|
|
277
|
+
useOutputMessageId
|
|
278
|
+
}) => {
|
|
279
|
+
const directFallbackItem = fallbackMessageItems.find((item) => item.id === message.id);
|
|
280
|
+
if (directFallbackItem) {
|
|
281
|
+
emittedFallbackMessageIds.add(directFallbackItem.id);
|
|
282
|
+
return directFallbackItem.id;
|
|
283
|
+
}
|
|
284
|
+
if (useOutputMessageId) {
|
|
285
|
+
const matchingFallbackItem = fallbackMessageItems.find(
|
|
286
|
+
(item) => item.id !== outputMessageId && !emittedFallbackMessageIds.has(item.id) && getOutputMessageText(item) === text
|
|
287
|
+
);
|
|
288
|
+
if (matchingFallbackItem) {
|
|
289
|
+
emittedFallbackMessageIds.add(matchingFallbackItem.id);
|
|
290
|
+
return matchingFallbackItem.id;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return useOutputMessageId ? outputMessageId : message.id;
|
|
294
|
+
};
|
|
295
|
+
for (const [messageIndex, message] of messages.entries()) {
|
|
296
|
+
output.push(
|
|
297
|
+
...mapMastraMessageToResponseToolItems({
|
|
298
|
+
message,
|
|
299
|
+
toolResultCallIds,
|
|
300
|
+
emittedCallIds,
|
|
301
|
+
emittedResultCallIds
|
|
302
|
+
})
|
|
303
|
+
);
|
|
304
|
+
const text = getMessageText(message);
|
|
305
|
+
if (getMessageRole(message) === "assistant" && text) {
|
|
306
|
+
const useOutputMessageId = messageIndex === outputMessageIndex;
|
|
307
|
+
output.push(
|
|
308
|
+
createOutputMessage({
|
|
309
|
+
messageId: getOutputMessageId({ message, text, useOutputMessageId }),
|
|
310
|
+
status,
|
|
311
|
+
text
|
|
312
|
+
})
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
if (!output.some((item) => item.type === "message") && fallbackText) {
|
|
317
|
+
output.push(createOutputMessage({ messageId: outputMessageId, status, text: fallbackText }));
|
|
318
|
+
}
|
|
319
|
+
return mergeFallbackOutputItems({ output, fallbackOutputItems });
|
|
320
|
+
}
|
|
321
|
+
function createMessageId() {
|
|
322
|
+
return `msg_${randomUUID()}`;
|
|
323
|
+
}
|
|
324
|
+
function mapResponseInputToExecutionMessages(input) {
|
|
325
|
+
if (typeof input === "string") {
|
|
326
|
+
return [{ role: "user", content: input }];
|
|
327
|
+
}
|
|
328
|
+
return input.map((message) => ({
|
|
329
|
+
role: message.role === "developer" ? "system" : message.role,
|
|
330
|
+
content: normalizeMessageContent(message.content)
|
|
331
|
+
}));
|
|
332
|
+
}
|
|
333
|
+
function toResponseUsage(usage) {
|
|
334
|
+
if (!usage) {
|
|
335
|
+
return null;
|
|
336
|
+
}
|
|
337
|
+
const inputTokens = usage.inputTokens ?? usage.promptTokens ?? 0;
|
|
338
|
+
const outputTokens = usage.outputTokens ?? usage.completionTokens ?? 0;
|
|
339
|
+
const totalTokens = usage.totalTokens ?? inputTokens + outputTokens;
|
|
340
|
+
return {
|
|
341
|
+
input_tokens: inputTokens,
|
|
342
|
+
output_tokens: outputTokens,
|
|
343
|
+
total_tokens: totalTokens,
|
|
344
|
+
input_tokens_details: {
|
|
345
|
+
cached_tokens: 0
|
|
346
|
+
},
|
|
347
|
+
output_tokens_details: {
|
|
348
|
+
reasoning_tokens: 0
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
function toResponseStatus(finishReason) {
|
|
353
|
+
if (finishReason === "suspended" || finishReason === "error") {
|
|
354
|
+
return "incomplete";
|
|
355
|
+
}
|
|
356
|
+
return "completed";
|
|
357
|
+
}
|
|
358
|
+
function createOutputTextPart(text) {
|
|
359
|
+
return {
|
|
360
|
+
type: "output_text",
|
|
361
|
+
text,
|
|
362
|
+
annotations: [],
|
|
363
|
+
logprobs: []
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
function buildCompletedResponse({
|
|
367
|
+
responseId,
|
|
368
|
+
outputMessageId,
|
|
369
|
+
model,
|
|
370
|
+
createdAt,
|
|
371
|
+
completedAt,
|
|
372
|
+
status,
|
|
373
|
+
text,
|
|
374
|
+
usage,
|
|
375
|
+
instructions,
|
|
376
|
+
textConfig,
|
|
377
|
+
previousResponseId,
|
|
378
|
+
conversationId,
|
|
379
|
+
providerOptions,
|
|
380
|
+
tools,
|
|
381
|
+
store,
|
|
382
|
+
messages,
|
|
383
|
+
fallbackOutputItems
|
|
384
|
+
}) {
|
|
385
|
+
return {
|
|
386
|
+
id: responseId,
|
|
387
|
+
object: "response",
|
|
388
|
+
created_at: createdAt,
|
|
389
|
+
completed_at: completedAt,
|
|
390
|
+
model,
|
|
391
|
+
status,
|
|
392
|
+
output: mapMastraMessagesToResponseOutputItems({
|
|
393
|
+
messages,
|
|
394
|
+
outputMessageId,
|
|
395
|
+
status,
|
|
396
|
+
fallbackText: text,
|
|
397
|
+
fallbackOutputItems
|
|
398
|
+
}),
|
|
399
|
+
usage: toResponseUsage(usage),
|
|
400
|
+
error: null,
|
|
401
|
+
incomplete_details: null,
|
|
402
|
+
instructions: instructions ?? null,
|
|
403
|
+
text: textConfig ?? null,
|
|
404
|
+
previous_response_id: previousResponseId ?? null,
|
|
405
|
+
conversation_id: conversationId ?? null,
|
|
406
|
+
providerOptions,
|
|
407
|
+
tools,
|
|
408
|
+
store
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
function buildInProgressResponse({
|
|
412
|
+
responseId,
|
|
413
|
+
model,
|
|
414
|
+
createdAt,
|
|
415
|
+
instructions,
|
|
416
|
+
textConfig,
|
|
417
|
+
previousResponseId,
|
|
418
|
+
conversationId,
|
|
419
|
+
tools,
|
|
420
|
+
store
|
|
421
|
+
}) {
|
|
422
|
+
return {
|
|
423
|
+
id: responseId,
|
|
424
|
+
object: "response",
|
|
425
|
+
created_at: createdAt,
|
|
426
|
+
completed_at: null,
|
|
427
|
+
model,
|
|
428
|
+
status: "in_progress",
|
|
429
|
+
output: [],
|
|
430
|
+
usage: null,
|
|
431
|
+
error: null,
|
|
432
|
+
incomplete_details: null,
|
|
433
|
+
instructions: instructions ?? null,
|
|
434
|
+
text: textConfig ?? null,
|
|
435
|
+
previous_response_id: previousResponseId ?? null,
|
|
436
|
+
conversation_id: conversationId ?? null,
|
|
437
|
+
tools: tools ?? [],
|
|
438
|
+
store
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
function mapResponseTurnRecordToResponse(match) {
|
|
442
|
+
return {
|
|
443
|
+
id: match.message.id,
|
|
444
|
+
object: "response",
|
|
445
|
+
created_at: match.metadata.createdAt,
|
|
446
|
+
completed_at: match.metadata.completedAt,
|
|
447
|
+
model: match.metadata.model,
|
|
448
|
+
status: match.metadata.status,
|
|
449
|
+
output: mapMastraMessagesToResponseOutputItems({
|
|
450
|
+
messages: match.messages,
|
|
451
|
+
outputMessageId: match.message.id,
|
|
452
|
+
status: match.metadata.status,
|
|
453
|
+
fallbackText: getMessageText(match.message),
|
|
454
|
+
fallbackOutputItems: match.metadata.outputItems
|
|
455
|
+
}),
|
|
456
|
+
usage: match.metadata.usage,
|
|
457
|
+
error: null,
|
|
458
|
+
incomplete_details: null,
|
|
459
|
+
instructions: match.metadata.instructions ?? null,
|
|
460
|
+
text: match.metadata.text ?? null,
|
|
461
|
+
previous_response_id: match.metadata.previousResponseId ?? null,
|
|
462
|
+
conversation_id: match.thread.id,
|
|
463
|
+
providerOptions: match.metadata.providerOptions,
|
|
464
|
+
tools: match.metadata.tools,
|
|
465
|
+
store: match.metadata.store
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
function formatSseEvent(event, data) {
|
|
469
|
+
return new TextEncoder().encode(`event: ${event}
|
|
470
|
+
data: ${JSON.stringify(data)}
|
|
471
|
+
|
|
472
|
+
`);
|
|
473
|
+
}
|
|
474
|
+
function extractTextDelta(value) {
|
|
475
|
+
if (typeof value !== "object" || value === null || !("type" in value)) {
|
|
476
|
+
return null;
|
|
477
|
+
}
|
|
478
|
+
const chunk = value;
|
|
479
|
+
switch (chunk.type) {
|
|
480
|
+
case "text-delta":
|
|
481
|
+
if (typeof chunk.payload?.text === "string") {
|
|
482
|
+
return chunk.payload.text;
|
|
483
|
+
}
|
|
484
|
+
if (typeof chunk.textDelta === "string") {
|
|
485
|
+
return chunk.textDelta;
|
|
486
|
+
}
|
|
487
|
+
if (typeof chunk.text === "string") {
|
|
488
|
+
return chunk.text;
|
|
489
|
+
}
|
|
490
|
+
return null;
|
|
491
|
+
default:
|
|
492
|
+
return null;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
function createResponseSseEvent(payload) {
|
|
496
|
+
return { event: payload.type, payload };
|
|
497
|
+
}
|
|
498
|
+
function getChunkPayload(value) {
|
|
499
|
+
if (!isRecord(value)) {
|
|
500
|
+
return null;
|
|
501
|
+
}
|
|
502
|
+
return isRecord(value.payload) ? value.payload : value;
|
|
503
|
+
}
|
|
504
|
+
function stringifyResponsePayload(value) {
|
|
505
|
+
if (typeof value === "string") {
|
|
506
|
+
return value;
|
|
507
|
+
}
|
|
508
|
+
return JSON.stringify(value === void 0 ? {} : value);
|
|
509
|
+
}
|
|
510
|
+
function stringifyFunctionCallArguments(value, fallback = "") {
|
|
511
|
+
const serialized = value === void 0 || value === null ? fallback : stringifyResponsePayload(value);
|
|
512
|
+
return serialized || fallback || "{}";
|
|
513
|
+
}
|
|
514
|
+
function removeWhitespaceOutsideJsonStrings(value) {
|
|
515
|
+
let inString = false;
|
|
516
|
+
let escaped = false;
|
|
517
|
+
let result = "";
|
|
518
|
+
for (const char of value) {
|
|
519
|
+
if (escaped) {
|
|
520
|
+
escaped = false;
|
|
521
|
+
result += char;
|
|
522
|
+
continue;
|
|
523
|
+
}
|
|
524
|
+
if (char === "\\" && inString) {
|
|
525
|
+
escaped = true;
|
|
526
|
+
result += char;
|
|
527
|
+
continue;
|
|
528
|
+
}
|
|
529
|
+
if (char === '"') {
|
|
530
|
+
inString = !inString;
|
|
531
|
+
result += char;
|
|
532
|
+
continue;
|
|
533
|
+
}
|
|
534
|
+
if (!inString && /\s/.test(char)) {
|
|
535
|
+
continue;
|
|
536
|
+
}
|
|
537
|
+
result += char;
|
|
538
|
+
}
|
|
539
|
+
return result;
|
|
540
|
+
}
|
|
541
|
+
function getRemainingArgumentsDelta(current, canonical) {
|
|
542
|
+
if (!current) {
|
|
543
|
+
return canonical;
|
|
544
|
+
}
|
|
545
|
+
if (canonical.startsWith(current)) {
|
|
546
|
+
return canonical.slice(current.length);
|
|
547
|
+
}
|
|
548
|
+
const compactCurrent = removeWhitespaceOutsideJsonStrings(current);
|
|
549
|
+
const compactCanonical = removeWhitespaceOutsideJsonStrings(canonical);
|
|
550
|
+
if (compactCurrent && compactCanonical.startsWith(compactCurrent)) {
|
|
551
|
+
return compactCanonical.slice(compactCurrent.length);
|
|
552
|
+
}
|
|
553
|
+
return null;
|
|
554
|
+
}
|
|
555
|
+
function isCompleteJsonString(value) {
|
|
556
|
+
if (!value) {
|
|
557
|
+
return true;
|
|
558
|
+
}
|
|
559
|
+
try {
|
|
560
|
+
JSON.parse(value);
|
|
561
|
+
return true;
|
|
562
|
+
} catch {
|
|
563
|
+
return false;
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
function serializeToolError(error) {
|
|
567
|
+
if (error instanceof Error) {
|
|
568
|
+
return { error: error.message };
|
|
569
|
+
}
|
|
570
|
+
return { error };
|
|
571
|
+
}
|
|
572
|
+
function getToolCallStart(value) {
|
|
573
|
+
if (!isRecord(value) || value.type !== "tool-call-input-streaming-start") {
|
|
574
|
+
return null;
|
|
575
|
+
}
|
|
576
|
+
const payload = getChunkPayload(value);
|
|
577
|
+
const toolCallId = payload?.toolCallId;
|
|
578
|
+
const toolName = payload?.toolName;
|
|
579
|
+
if (typeof toolCallId !== "string" || typeof toolName !== "string") {
|
|
580
|
+
return null;
|
|
581
|
+
}
|
|
582
|
+
return { toolCallId, toolName };
|
|
583
|
+
}
|
|
584
|
+
function getToolCallDelta(value) {
|
|
585
|
+
if (!isRecord(value) || value.type !== "tool-call-delta") {
|
|
586
|
+
return null;
|
|
587
|
+
}
|
|
588
|
+
const payload = getChunkPayload(value);
|
|
589
|
+
const toolCallId = payload?.toolCallId;
|
|
590
|
+
const delta = payload?.argsTextDelta ?? payload?.inputTextDelta ?? payload?.argsDelta ?? payload?.delta;
|
|
591
|
+
if (!payload || typeof toolCallId !== "string" || typeof delta !== "string") {
|
|
592
|
+
return null;
|
|
593
|
+
}
|
|
594
|
+
return {
|
|
595
|
+
toolCallId,
|
|
596
|
+
toolName: typeof payload.toolName === "string" ? payload.toolName : void 0,
|
|
597
|
+
delta
|
|
598
|
+
};
|
|
599
|
+
}
|
|
600
|
+
function getToolCall(value) {
|
|
601
|
+
if (!isRecord(value) || value.type !== "tool-call") {
|
|
602
|
+
return null;
|
|
603
|
+
}
|
|
604
|
+
const payload = getChunkPayload(value);
|
|
605
|
+
const toolCallId = payload?.toolCallId;
|
|
606
|
+
const toolName = payload?.toolName;
|
|
607
|
+
const args = payload?.args ?? payload?.input;
|
|
608
|
+
if (typeof toolCallId !== "string" || typeof toolName !== "string") {
|
|
609
|
+
return null;
|
|
610
|
+
}
|
|
611
|
+
return { toolCallId, toolName, args };
|
|
612
|
+
}
|
|
613
|
+
function getToolCallEnd(value) {
|
|
614
|
+
if (!isRecord(value) || value.type !== "tool-call-input-streaming-end") {
|
|
615
|
+
return null;
|
|
616
|
+
}
|
|
617
|
+
const payload = getChunkPayload(value);
|
|
618
|
+
const toolCallId = payload?.toolCallId;
|
|
619
|
+
if (typeof toolCallId !== "string") {
|
|
620
|
+
return null;
|
|
621
|
+
}
|
|
622
|
+
return { toolCallId };
|
|
623
|
+
}
|
|
624
|
+
function getToolResult(value) {
|
|
625
|
+
if (!isRecord(value) || value.type !== "tool-result" && value.type !== "tool-error") {
|
|
626
|
+
return null;
|
|
627
|
+
}
|
|
628
|
+
const payload = getChunkPayload(value);
|
|
629
|
+
const toolCallId = payload?.toolCallId;
|
|
630
|
+
if (!payload || typeof toolCallId !== "string") {
|
|
631
|
+
return null;
|
|
632
|
+
}
|
|
633
|
+
const toolName = typeof payload.toolName === "string" ? payload.toolName : void 0;
|
|
634
|
+
const args = payload.args ?? payload.input;
|
|
635
|
+
if (value.type === "tool-error") {
|
|
636
|
+
return { toolCallId, toolName, args, result: serializeToolError(payload.error) };
|
|
637
|
+
}
|
|
638
|
+
const outputValue = payload.result !== void 0 ? payload.result : payload.output;
|
|
639
|
+
const result = payload.isError ? serializeToolError(outputValue) : outputValue;
|
|
640
|
+
return { toolCallId, toolName, args, result };
|
|
641
|
+
}
|
|
642
|
+
function createResponseStreamEventTranslator(responseId) {
|
|
643
|
+
let text = "";
|
|
644
|
+
let nextOutputIndex = 0;
|
|
645
|
+
let textOutputIndex = null;
|
|
646
|
+
const completedToolResultCallIds = /* @__PURE__ */ new Set();
|
|
647
|
+
const pendingToolResults = /* @__PURE__ */ new Map();
|
|
648
|
+
const toolCalls = /* @__PURE__ */ new Map();
|
|
649
|
+
const outputItems = /* @__PURE__ */ new Map();
|
|
650
|
+
const ensureTextOutputItem = () => {
|
|
651
|
+
if (textOutputIndex !== null) {
|
|
652
|
+
return { events: [], outputIndex: textOutputIndex };
|
|
653
|
+
}
|
|
654
|
+
textOutputIndex = nextOutputIndex++;
|
|
655
|
+
return {
|
|
656
|
+
outputIndex: textOutputIndex,
|
|
657
|
+
events: [
|
|
658
|
+
createResponseSseEvent({
|
|
659
|
+
type: "response.output_item.added",
|
|
660
|
+
output_index: textOutputIndex,
|
|
661
|
+
item: {
|
|
662
|
+
id: responseId,
|
|
663
|
+
type: "message",
|
|
664
|
+
role: "assistant",
|
|
665
|
+
status: "in_progress",
|
|
666
|
+
content: []
|
|
667
|
+
}
|
|
668
|
+
}),
|
|
669
|
+
createResponseSseEvent({
|
|
670
|
+
type: "response.content_part.added",
|
|
671
|
+
output_index: textOutputIndex,
|
|
672
|
+
content_index: 0,
|
|
673
|
+
item_id: responseId,
|
|
674
|
+
part: createOutputTextPart("")
|
|
675
|
+
})
|
|
676
|
+
]
|
|
677
|
+
};
|
|
678
|
+
};
|
|
679
|
+
const ensureToolCallItem = ({
|
|
680
|
+
toolCallId,
|
|
681
|
+
toolName
|
|
682
|
+
}) => {
|
|
683
|
+
const existing = toolCalls.get(toolCallId);
|
|
684
|
+
if (existing) {
|
|
685
|
+
if (!existing.completed && toolName && existing.name !== toolName) {
|
|
686
|
+
existing.name = toolName;
|
|
687
|
+
}
|
|
688
|
+
return { events: [], state: existing };
|
|
689
|
+
}
|
|
690
|
+
const state = {
|
|
691
|
+
argumentsText: "",
|
|
692
|
+
completed: false,
|
|
693
|
+
itemId: toolCallId,
|
|
694
|
+
name: toolName,
|
|
695
|
+
outputIndex: nextOutputIndex++,
|
|
696
|
+
zeroArgumentInputEnded: false
|
|
697
|
+
};
|
|
698
|
+
toolCalls.set(toolCallId, state);
|
|
699
|
+
return {
|
|
700
|
+
state,
|
|
701
|
+
events: [
|
|
702
|
+
createResponseSseEvent({
|
|
703
|
+
type: "response.output_item.added",
|
|
704
|
+
output_index: state.outputIndex,
|
|
705
|
+
item: {
|
|
706
|
+
id: state.itemId,
|
|
707
|
+
type: "function_call",
|
|
708
|
+
call_id: toolCallId,
|
|
709
|
+
name: toolName,
|
|
710
|
+
arguments: "",
|
|
711
|
+
status: "in_progress"
|
|
712
|
+
}
|
|
713
|
+
})
|
|
714
|
+
]
|
|
715
|
+
};
|
|
716
|
+
};
|
|
717
|
+
const completeToolCallItem = ({
|
|
718
|
+
events,
|
|
719
|
+
state,
|
|
720
|
+
toolCallId,
|
|
721
|
+
toolName,
|
|
722
|
+
args
|
|
723
|
+
}) => {
|
|
724
|
+
if (state.completed) {
|
|
725
|
+
return events;
|
|
726
|
+
}
|
|
727
|
+
const item = {
|
|
728
|
+
id: state.itemId,
|
|
729
|
+
type: "function_call",
|
|
730
|
+
call_id: toolCallId,
|
|
731
|
+
name: toolName,
|
|
732
|
+
arguments: args,
|
|
733
|
+
status: "completed"
|
|
734
|
+
};
|
|
735
|
+
state.argumentsText = args;
|
|
736
|
+
state.completed = true;
|
|
737
|
+
outputItems.set(state.outputIndex, item);
|
|
738
|
+
return [
|
|
739
|
+
...events,
|
|
740
|
+
createResponseSseEvent({
|
|
741
|
+
type: "response.function_call_arguments.done",
|
|
742
|
+
item_id: state.itemId,
|
|
743
|
+
output_index: state.outputIndex,
|
|
744
|
+
name: toolName,
|
|
745
|
+
arguments: args
|
|
746
|
+
}),
|
|
747
|
+
createResponseSseEvent({
|
|
748
|
+
type: "response.output_item.done",
|
|
749
|
+
output_index: state.outputIndex,
|
|
750
|
+
item
|
|
751
|
+
})
|
|
752
|
+
];
|
|
753
|
+
};
|
|
754
|
+
const completeToolResultItem = ({
|
|
755
|
+
events,
|
|
756
|
+
toolResult
|
|
757
|
+
}) => {
|
|
758
|
+
if (completedToolResultCallIds.has(toolResult.toolCallId)) {
|
|
759
|
+
return events;
|
|
760
|
+
}
|
|
761
|
+
completedToolResultCallIds.add(toolResult.toolCallId);
|
|
762
|
+
pendingToolResults.delete(toolResult.toolCallId);
|
|
763
|
+
const outputIndex = nextOutputIndex++;
|
|
764
|
+
const item = {
|
|
765
|
+
id: getFunctionCallOutputItemId(toolResult.toolCallId),
|
|
766
|
+
type: "function_call_output",
|
|
767
|
+
call_id: toolResult.toolCallId,
|
|
768
|
+
output: stringifyResponsePayload(toolResult.result)
|
|
769
|
+
};
|
|
770
|
+
outputItems.set(outputIndex, item);
|
|
771
|
+
return [
|
|
772
|
+
...events,
|
|
773
|
+
createResponseSseEvent({
|
|
774
|
+
type: "response.output_item.added",
|
|
775
|
+
output_index: outputIndex,
|
|
776
|
+
item
|
|
777
|
+
}),
|
|
778
|
+
createResponseSseEvent({
|
|
779
|
+
type: "response.output_item.done",
|
|
780
|
+
output_index: outputIndex,
|
|
781
|
+
item
|
|
782
|
+
})
|
|
783
|
+
];
|
|
784
|
+
};
|
|
785
|
+
return {
|
|
786
|
+
get text() {
|
|
787
|
+
return text;
|
|
788
|
+
},
|
|
789
|
+
getOutputItems({ text: text2, status }) {
|
|
790
|
+
const items = new Map(outputItems);
|
|
791
|
+
if (text2) {
|
|
792
|
+
const messageOutputIndex = textOutputIndex ?? nextOutputIndex;
|
|
793
|
+
items.set(messageOutputIndex, createOutputMessage({ messageId: responseId, status, text: text2 }));
|
|
794
|
+
}
|
|
795
|
+
return [...items.entries()].sort(([left], [right]) => left - right).map(([, item]) => item);
|
|
796
|
+
},
|
|
797
|
+
consume(value) {
|
|
798
|
+
const textDelta = extractTextDelta(value);
|
|
799
|
+
if (textDelta) {
|
|
800
|
+
const { events, outputIndex } = ensureTextOutputItem();
|
|
801
|
+
text += textDelta;
|
|
802
|
+
return [
|
|
803
|
+
...events,
|
|
804
|
+
createResponseSseEvent({
|
|
805
|
+
type: "response.output_text.delta",
|
|
806
|
+
output_index: outputIndex,
|
|
807
|
+
content_index: 0,
|
|
808
|
+
item_id: responseId,
|
|
809
|
+
delta: textDelta
|
|
810
|
+
})
|
|
811
|
+
];
|
|
812
|
+
}
|
|
813
|
+
const toolCallStart = getToolCallStart(value);
|
|
814
|
+
if (toolCallStart) {
|
|
815
|
+
return ensureToolCallItem(toolCallStart).events;
|
|
816
|
+
}
|
|
817
|
+
const toolCallDelta = getToolCallDelta(value);
|
|
818
|
+
if (toolCallDelta) {
|
|
819
|
+
const existing = toolCalls.get(toolCallDelta.toolCallId);
|
|
820
|
+
if (!existing && !toolCallDelta.toolName) {
|
|
821
|
+
return [];
|
|
822
|
+
}
|
|
823
|
+
if (existing?.completed) {
|
|
824
|
+
return [];
|
|
825
|
+
}
|
|
826
|
+
const ensured = ensureToolCallItem({
|
|
827
|
+
toolCallId: toolCallDelta.toolCallId,
|
|
828
|
+
toolName: toolCallDelta.toolName ?? existing.name
|
|
829
|
+
});
|
|
830
|
+
ensured.state.argumentsText += toolCallDelta.delta;
|
|
831
|
+
ensured.state.zeroArgumentInputEnded = false;
|
|
832
|
+
return [
|
|
833
|
+
...ensured.events,
|
|
834
|
+
createResponseSseEvent({
|
|
835
|
+
type: "response.function_call_arguments.delta",
|
|
836
|
+
item_id: ensured.state.itemId,
|
|
837
|
+
output_index: ensured.state.outputIndex,
|
|
838
|
+
delta: toolCallDelta.delta
|
|
839
|
+
})
|
|
840
|
+
];
|
|
841
|
+
}
|
|
842
|
+
const toolCallEnd = getToolCallEnd(value);
|
|
843
|
+
if (toolCallEnd) {
|
|
844
|
+
const state = toolCalls.get(toolCallEnd.toolCallId);
|
|
845
|
+
if (!state || state.completed) {
|
|
846
|
+
return [];
|
|
847
|
+
}
|
|
848
|
+
state.zeroArgumentInputEnded = !state.argumentsText;
|
|
849
|
+
return [];
|
|
850
|
+
}
|
|
851
|
+
const toolCall = getToolCall(value);
|
|
852
|
+
if (toolCall) {
|
|
853
|
+
const { events, state } = ensureToolCallItem(toolCall);
|
|
854
|
+
const canonicalArgs = stringifyFunctionCallArguments(toolCall.args, state.argumentsText);
|
|
855
|
+
if (state.completed) {
|
|
856
|
+
const nextEvents2 = completeToolCallItem({
|
|
857
|
+
events,
|
|
858
|
+
state,
|
|
859
|
+
toolCallId: toolCall.toolCallId,
|
|
860
|
+
toolName: toolCall.toolName,
|
|
861
|
+
args: canonicalArgs
|
|
862
|
+
});
|
|
863
|
+
const pendingToolResult2 = pendingToolResults.get(toolCall.toolCallId);
|
|
864
|
+
return pendingToolResult2 ? completeToolResultItem({ events: nextEvents2, toolResult: pendingToolResult2 }) : nextEvents2;
|
|
865
|
+
}
|
|
866
|
+
const remainingArgsDelta = getRemainingArgumentsDelta(state.argumentsText, canonicalArgs);
|
|
867
|
+
const args = remainingArgsDelta === null ? (
|
|
868
|
+
// If both strings are valid but disagree, keep the bytes already emitted
|
|
869
|
+
// as deltas so arguments.done and response.output stay consistent.
|
|
870
|
+
isCompleteJsonString(state.argumentsText) ? state.argumentsText : canonicalArgs
|
|
871
|
+
) : state.argumentsText + remainingArgsDelta;
|
|
872
|
+
const nextEvents = remainingArgsDelta ? [
|
|
873
|
+
...events,
|
|
874
|
+
createResponseSseEvent({
|
|
875
|
+
type: "response.function_call_arguments.delta",
|
|
876
|
+
item_id: state.itemId,
|
|
877
|
+
output_index: state.outputIndex,
|
|
878
|
+
delta: remainingArgsDelta
|
|
879
|
+
})
|
|
880
|
+
] : events;
|
|
881
|
+
const completedEvents = completeToolCallItem({
|
|
882
|
+
events: nextEvents,
|
|
883
|
+
state,
|
|
884
|
+
toolCallId: toolCall.toolCallId,
|
|
885
|
+
toolName: toolCall.toolName,
|
|
886
|
+
args
|
|
887
|
+
});
|
|
888
|
+
const pendingToolResult = pendingToolResults.get(toolCall.toolCallId);
|
|
889
|
+
return pendingToolResult ? completeToolResultItem({ events: completedEvents, toolResult: pendingToolResult }) : completedEvents;
|
|
890
|
+
}
|
|
891
|
+
const toolResult = getToolResult(value);
|
|
892
|
+
if (toolResult) {
|
|
893
|
+
const existingToolCallState = toolCalls.get(toolResult.toolCallId);
|
|
894
|
+
if (!existingToolCallState && !toolResult.toolName) {
|
|
895
|
+
return [];
|
|
896
|
+
}
|
|
897
|
+
const { events: toolCallEvents, state: toolCallState } = ensureToolCallItem({
|
|
898
|
+
toolCallId: toolResult.toolCallId,
|
|
899
|
+
toolName: toolResult.toolName ?? existingToolCallState.name
|
|
900
|
+
});
|
|
901
|
+
if (completedToolResultCallIds.has(toolResult.toolCallId)) {
|
|
902
|
+
return [];
|
|
903
|
+
}
|
|
904
|
+
const events = [...toolCallEvents];
|
|
905
|
+
if (!toolCallState.completed) {
|
|
906
|
+
const args = stringifyFunctionCallArguments(toolResult.args, toolCallState.argumentsText || "{}");
|
|
907
|
+
const hasZeroArgumentHint = toolCallState.zeroArgumentInputEnded && !toolCallState.argumentsText;
|
|
908
|
+
if (toolResult.args === void 0 && !hasZeroArgumentHint && (!toolCallState.argumentsText || !isCompleteJsonString(toolCallState.argumentsText))) {
|
|
909
|
+
pendingToolResults.set(toolResult.toolCallId, toolResult);
|
|
910
|
+
return events;
|
|
911
|
+
}
|
|
912
|
+
events.push(
|
|
913
|
+
...completeToolCallItem({
|
|
914
|
+
events: [],
|
|
915
|
+
state: toolCallState,
|
|
916
|
+
toolCallId: toolResult.toolCallId,
|
|
917
|
+
toolName: toolResult.toolName ?? toolCallState.name,
|
|
918
|
+
args
|
|
919
|
+
})
|
|
920
|
+
);
|
|
921
|
+
}
|
|
922
|
+
return completeToolResultItem({ events, toolResult });
|
|
923
|
+
}
|
|
924
|
+
return [];
|
|
925
|
+
},
|
|
926
|
+
flushPendingToolResults() {
|
|
927
|
+
const events = [];
|
|
928
|
+
for (const toolResult of pendingToolResults.values()) {
|
|
929
|
+
const toolCallState = toolCalls.get(toolResult.toolCallId);
|
|
930
|
+
if (!toolCallState) {
|
|
931
|
+
continue;
|
|
932
|
+
}
|
|
933
|
+
if (!toolCallState.completed) {
|
|
934
|
+
const safeFallbackArgs = isCompleteJsonString(toolCallState.argumentsText) ? toolCallState.argumentsText : "{}";
|
|
935
|
+
events.push(
|
|
936
|
+
...completeToolCallItem({
|
|
937
|
+
events: [],
|
|
938
|
+
state: toolCallState,
|
|
939
|
+
toolCallId: toolResult.toolCallId,
|
|
940
|
+
toolName: toolResult.toolName ?? toolCallState.name,
|
|
941
|
+
args: stringifyFunctionCallArguments(toolResult.args, safeFallbackArgs)
|
|
942
|
+
})
|
|
943
|
+
);
|
|
944
|
+
}
|
|
945
|
+
events.push(...completeToolResultItem({ events: [], toolResult }));
|
|
946
|
+
}
|
|
947
|
+
return events;
|
|
948
|
+
},
|
|
949
|
+
completeText(text2, completedItem) {
|
|
950
|
+
const { events, outputIndex } = ensureTextOutputItem();
|
|
951
|
+
const completedTextItem = {
|
|
952
|
+
...completedItem,
|
|
953
|
+
content: [createOutputTextPart(text2)]
|
|
954
|
+
};
|
|
955
|
+
return [
|
|
956
|
+
...events,
|
|
957
|
+
createResponseSseEvent({
|
|
958
|
+
type: "response.output_text.done",
|
|
959
|
+
output_index: outputIndex,
|
|
960
|
+
content_index: 0,
|
|
961
|
+
item_id: responseId,
|
|
962
|
+
text: text2
|
|
963
|
+
}),
|
|
964
|
+
createResponseSseEvent({
|
|
965
|
+
type: "response.content_part.done",
|
|
966
|
+
output_index: outputIndex,
|
|
967
|
+
content_index: 0,
|
|
968
|
+
item_id: responseId,
|
|
969
|
+
part: createOutputTextPart(text2)
|
|
970
|
+
}),
|
|
971
|
+
createResponseSseEvent({
|
|
972
|
+
type: "response.output_item.done",
|
|
973
|
+
output_index: outputIndex,
|
|
974
|
+
item: completedTextItem
|
|
975
|
+
})
|
|
976
|
+
];
|
|
977
|
+
}
|
|
978
|
+
};
|
|
979
|
+
}
|
|
980
|
+
|
|
981
|
+
export { buildCompletedResponse, buildInProgressResponse, createMessageId, createOutputTextPart, createResponseStreamEventTranslator, extractTextDelta, formatSseEvent, mapMastraMessagesToConversationItems, mapMastraMessagesToResponseOutputItems, mapMastraToolsToResponseTools, mapResponseInputToExecutionMessages, mapResponseTurnRecordToResponse, toResponseStatus, toResponseUsage };
|
|
982
|
+
//# sourceMappingURL=chunk-TLLV2JP5.js.map
|
|
983
|
+
//# sourceMappingURL=chunk-TLLV2JP5.js.map
|