@assistant-ui/react-data-stream 0.12.0 → 0.12.2
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/converters/toLanguageModelMessages.d.ts +4 -3
- package/dist/converters/toLanguageModelMessages.d.ts.map +1 -1
- package/dist/converters/toLanguageModelMessages.js +87 -158
- package/dist/converters/toLanguageModelMessages.js.map +1 -1
- package/dist/useDataStreamRuntime.d.ts.map +1 -1
- package/dist/useDataStreamRuntime.js +2 -17
- package/dist/useDataStreamRuntime.js.map +1 -1
- package/package.json +8 -8
- package/src/converters/toLanguageModelMessages.ts +107 -180
- package/src/useDataStreamRuntime.ts +3 -27
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { LanguageModelV2Message } from "@ai-sdk/provider";
|
|
2
|
-
import { ThreadMessage } from "@assistant-ui/react";
|
|
2
|
+
import type { ThreadMessage } from "@assistant-ui/react";
|
|
3
3
|
/**
|
|
4
|
-
* @deprecated
|
|
4
|
+
* @deprecated Use `toGenericMessages` from `assistant-stream` for framework-agnostic conversion.
|
|
5
|
+
* This function is kept for AI SDK compatibility.
|
|
5
6
|
*/
|
|
6
|
-
export declare function toLanguageModelMessages(
|
|
7
|
+
export declare function toLanguageModelMessages(messages: readonly ThreadMessage[], options?: {
|
|
7
8
|
unstable_includeId?: boolean | undefined;
|
|
8
9
|
}): LanguageModelV2Message[];
|
|
9
10
|
//# sourceMappingURL=toLanguageModelMessages.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toLanguageModelMessages.d.ts","sourceRoot":"","sources":["../../src/converters/toLanguageModelMessages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,sBAAsB,EAIvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"toLanguageModelMessages.d.ts","sourceRoot":"","sources":["../../src/converters/toLanguageModelMessages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,sBAAsB,EAIvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAiFzD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,SAAS,aAAa,EAAE,EAClC,OAAO,GAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAO,GACzD,sBAAsB,EAAE,CAoC1B"}
|
|
@@ -1,166 +1,95 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
});
|
|
64
|
-
},
|
|
65
|
-
getMessages: () => {
|
|
66
|
-
if (toolMessage.content.length > 0) {
|
|
67
|
-
return [...stash, assistantMessage, toolMessage];
|
|
68
|
-
}
|
|
69
|
-
return [...stash, assistantMessage];
|
|
70
|
-
},
|
|
71
|
-
};
|
|
72
|
-
};
|
|
1
|
+
import { toGenericMessages, } from "assistant-stream";
|
|
2
|
+
function toUrl(value) {
|
|
3
|
+
if (value instanceof URL)
|
|
4
|
+
return value;
|
|
5
|
+
try {
|
|
6
|
+
return new URL(value);
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
// For relative URLs, create URL with a dummy base
|
|
10
|
+
return new URL(value, "file://");
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function convertUserContent(content) {
|
|
14
|
+
return content.content.map((part) => {
|
|
15
|
+
if (part.type === "text") {
|
|
16
|
+
return part;
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
type: "file",
|
|
20
|
+
data: toUrl(part.data),
|
|
21
|
+
mediaType: part.mediaType,
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function convertAssistantContent(content) {
|
|
26
|
+
return content.map((part) => {
|
|
27
|
+
if (part.type === "text") {
|
|
28
|
+
return part;
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
type: "tool-call",
|
|
32
|
+
toolCallId: part.toolCallId,
|
|
33
|
+
toolName: part.toolName,
|
|
34
|
+
input: part.args,
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function convertToolContent(content) {
|
|
39
|
+
return content.map((part) => ({
|
|
40
|
+
type: "tool-result",
|
|
41
|
+
toolCallId: part.toolCallId,
|
|
42
|
+
toolName: part.toolName,
|
|
43
|
+
output: part.isError
|
|
44
|
+
? { type: "error-json", value: part.result }
|
|
45
|
+
: { type: "json", value: part.result },
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
function convertGenericToLanguageModel(generic) {
|
|
49
|
+
switch (generic.role) {
|
|
50
|
+
case "system":
|
|
51
|
+
return { role: "system", content: generic.content };
|
|
52
|
+
case "user":
|
|
53
|
+
return { role: "user", content: convertUserContent(generic) };
|
|
54
|
+
case "assistant":
|
|
55
|
+
return {
|
|
56
|
+
role: "assistant",
|
|
57
|
+
content: convertAssistantContent(generic.content),
|
|
58
|
+
};
|
|
59
|
+
case "tool":
|
|
60
|
+
return { role: "tool", content: convertToolContent(generic.content) };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
73
63
|
/**
|
|
74
|
-
* @deprecated
|
|
64
|
+
* @deprecated Use `toGenericMessages` from `assistant-stream` for framework-agnostic conversion.
|
|
65
|
+
* This function is kept for AI SDK compatibility.
|
|
75
66
|
*/
|
|
76
|
-
export function toLanguageModelMessages(
|
|
67
|
+
export function toLanguageModelMessages(messages, options = {}) {
|
|
77
68
|
const includeId = options.unstable_includeId ?? false;
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
69
|
+
const genericMessages = toGenericMessages(messages);
|
|
70
|
+
if (!includeId) {
|
|
71
|
+
return genericMessages.map(convertGenericToLanguageModel);
|
|
72
|
+
}
|
|
73
|
+
// When includeId is true, we need to map back to original message IDs
|
|
74
|
+
const result = [];
|
|
75
|
+
let messageIndex = 0;
|
|
76
|
+
for (const generic of genericMessages) {
|
|
77
|
+
const converted = convertGenericToLanguageModel(generic);
|
|
78
|
+
// Tool messages are synthesized from assistant message tool calls,
|
|
79
|
+
// they don't have a corresponding original message
|
|
80
|
+
if (generic.role !== "tool") {
|
|
81
|
+
// Find the corresponding original message for ID
|
|
82
|
+
while (messageIndex < messages.length &&
|
|
83
|
+
messages[messageIndex].role !== generic.role) {
|
|
84
|
+
messageIndex++;
|
|
91
85
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
...message.content,
|
|
96
|
-
...attachments.map((a) => a.content).flat(),
|
|
97
|
-
];
|
|
98
|
-
const msg = {
|
|
99
|
-
...(includeId ? { unstable_id: message.id } : {}),
|
|
100
|
-
role: "user",
|
|
101
|
-
content: content.map((part) => {
|
|
102
|
-
const type = part.type;
|
|
103
|
-
switch (type) {
|
|
104
|
-
case "text": {
|
|
105
|
-
return part;
|
|
106
|
-
}
|
|
107
|
-
case "image": {
|
|
108
|
-
// ImageMessagePart doesn't include media type info, so we infer from URL
|
|
109
|
-
return {
|
|
110
|
-
type: "file",
|
|
111
|
-
data: new URL(part.image),
|
|
112
|
-
mediaType: inferImageMediaType(part.image),
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
case "file": {
|
|
116
|
-
return {
|
|
117
|
-
type: "file",
|
|
118
|
-
data: new URL(part.data),
|
|
119
|
-
mediaType: part.mimeType,
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
default: {
|
|
123
|
-
const unhandledType = type;
|
|
124
|
-
throw new Error(`Unsupported message part type: ${unhandledType}`);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}),
|
|
128
|
-
};
|
|
129
|
-
return [msg];
|
|
130
|
-
}
|
|
131
|
-
case "assistant": {
|
|
132
|
-
const splitter = assistantMessageSplitter();
|
|
133
|
-
for (const part of message.content) {
|
|
134
|
-
const type = part.type;
|
|
135
|
-
switch (type) {
|
|
136
|
-
case "reasoning":
|
|
137
|
-
case "source":
|
|
138
|
-
case "file":
|
|
139
|
-
case "data":
|
|
140
|
-
case "image": {
|
|
141
|
-
break; // reasoning, source, file, and image parts are omitted
|
|
142
|
-
}
|
|
143
|
-
case "text": {
|
|
144
|
-
splitter.addTextMessagePart(part);
|
|
145
|
-
break;
|
|
146
|
-
}
|
|
147
|
-
case "tool-call": {
|
|
148
|
-
splitter.addToolCallPart(part);
|
|
149
|
-
break;
|
|
150
|
-
}
|
|
151
|
-
default: {
|
|
152
|
-
const unhandledType = type;
|
|
153
|
-
throw new Error(`Unhandled message part type: ${unhandledType}`);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
return splitter.getMessages();
|
|
158
|
-
}
|
|
159
|
-
default: {
|
|
160
|
-
const unhandledRole = role;
|
|
161
|
-
throw new Error(`Unknown message role: ${unhandledRole}`);
|
|
86
|
+
if (messageIndex < messages.length) {
|
|
87
|
+
converted.unstable_id = messages[messageIndex].id;
|
|
88
|
+
messageIndex++;
|
|
162
89
|
}
|
|
163
90
|
}
|
|
164
|
-
|
|
91
|
+
result.push(converted);
|
|
92
|
+
}
|
|
93
|
+
return result;
|
|
165
94
|
}
|
|
166
95
|
//# sourceMappingURL=toLanguageModelMessages.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toLanguageModelMessages.js","sourceRoot":"","sources":["../../src/converters/toLanguageModelMessages.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"toLanguageModelMessages.js","sourceRoot":"","sources":["../../src/converters/toLanguageModelMessages.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDataStreamRuntime.d.ts","sourceRoot":"","sources":["../src/useDataStreamRuntime.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,gBAAgB,EAIrB,KAAK,mBAAmB,EACxB,KAAK,aAAa,
|
|
1
|
+
{"version":3,"file":"useDataStreamRuntime.d.ts","sourceRoot":"","sources":["../src/useDataStreamRuntime.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,gBAAgB,EAIrB,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAEnB,MAAM,qBAAqB,CAAC;AAY7B,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;AAErD,MAAM,MAAM,kBAAkB,GAAG,mBAAmB,GAAG,aAAa,CAAC;AAErE,MAAM,MAAM,2BAA2B,GAAG;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,0DAA0D;IAC1D,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,OAAO,CAAC;QACd,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,KAAK,IAAI,CAAC;IACX,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IAC5C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,OAAO,CAAC,EAAE,YAAY,GAAG,CAAC,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IACpD,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,GAAG,mBAAmB,CAAC;AAqHxB,eAAO,MAAM,oBAAoB,GAC/B,SAAS,2BAA2B,KACnC,gBAQF,CAAC"}
|
|
@@ -1,24 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { toLanguageModelMessages } from "./converters/index.js";
|
|
3
3
|
import { INTERNAL, useLocalRuntime, } from "@assistant-ui/react";
|
|
4
|
-
import {
|
|
5
|
-
import { AssistantMessageAccumulator, DataStreamDecoder, UIMessageStreamDecoder, unstable_toolResultStream, } from "assistant-stream";
|
|
4
|
+
import { AssistantMessageAccumulator, DataStreamDecoder, toToolsJSONSchema, UIMessageStreamDecoder, unstable_toolResultStream, } from "assistant-stream";
|
|
6
5
|
import { asAsyncIterableStream } from "assistant-stream/utils";
|
|
7
6
|
const { splitLocalRuntimeOptions } = INTERNAL;
|
|
8
|
-
const toAISDKTools = (tools) => {
|
|
9
|
-
return Object.fromEntries(Object.entries(tools).map(([name, tool]) => [
|
|
10
|
-
name,
|
|
11
|
-
{
|
|
12
|
-
...(tool.description ? { description: tool.description } : undefined),
|
|
13
|
-
parameters: (tool.parameters instanceof z.ZodType
|
|
14
|
-
? z.toJSONSchema(tool.parameters)
|
|
15
|
-
: tool.parameters),
|
|
16
|
-
},
|
|
17
|
-
]));
|
|
18
|
-
};
|
|
19
|
-
const getEnabledTools = (tools) => {
|
|
20
|
-
return Object.fromEntries(Object.entries(tools).filter(([, tool]) => !tool.disabled && tool.type !== "backend"));
|
|
21
|
-
};
|
|
22
7
|
class DataStreamRuntimeAdapter {
|
|
23
8
|
options;
|
|
24
9
|
constructor(options) {
|
|
@@ -46,7 +31,7 @@ class DataStreamRuntimeAdapter {
|
|
|
46
31
|
messages: toLanguageModelMessages(messages, {
|
|
47
32
|
unstable_includeId: this.options.sendExtraMessageFields,
|
|
48
33
|
}),
|
|
49
|
-
tools:
|
|
34
|
+
tools: toToolsJSONSchema(context.tools ?? {}),
|
|
50
35
|
...(unstable_assistantMessageId ? { unstable_assistantMessageId } : {}),
|
|
51
36
|
...(unstable_threadId ? { threadId: unstable_threadId } : {}),
|
|
52
37
|
...(unstable_parentId !== undefined
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDataStreamRuntime.js","sourceRoot":"","sources":["../src/useDataStreamRuntime.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,uBAAuB,EAAE,8BAAqB;AACvD,OAAO,EAIL,QAAQ,
|
|
1
|
+
{"version":3,"file":"useDataStreamRuntime.js","sourceRoot":"","sources":["../src/useDataStreamRuntime.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assistant-ui/react-data-stream",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.2",
|
|
4
4
|
"description": "Data stream adapter for assistant-ui",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"data-stream",
|
|
@@ -29,12 +29,12 @@
|
|
|
29
29
|
],
|
|
30
30
|
"sideEffects": false,
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@ai-sdk/provider": "^3.0.
|
|
33
|
-
"assistant-stream": "^0.
|
|
34
|
-
"zod": "^4.3.
|
|
32
|
+
"@ai-sdk/provider": "^3.0.5",
|
|
33
|
+
"assistant-stream": "^0.3.0",
|
|
34
|
+
"zod": "^4.3.6"
|
|
35
35
|
},
|
|
36
36
|
"peerDependencies": {
|
|
37
|
-
"@assistant-ui/react": "^0.
|
|
37
|
+
"@assistant-ui/react": "^0.12.3",
|
|
38
38
|
"@types/react": "*",
|
|
39
39
|
"react": "^18 || ^19"
|
|
40
40
|
},
|
|
@@ -46,9 +46,9 @@
|
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@types/json-schema": "^7.0.15",
|
|
48
48
|
"@types/react": "^19.2.9",
|
|
49
|
-
"react": "^19.2.
|
|
50
|
-
"@assistant-ui/
|
|
51
|
-
"@assistant-ui/
|
|
49
|
+
"react": "^19.2.4",
|
|
50
|
+
"@assistant-ui/react": "0.12.3",
|
|
51
|
+
"@assistant-ui/x-buildutils": "0.0.1"
|
|
52
52
|
},
|
|
53
53
|
"publishConfig": {
|
|
54
54
|
"access": "public",
|
|
@@ -6,201 +6,128 @@ import type {
|
|
|
6
6
|
LanguageModelV2ToolCallPart,
|
|
7
7
|
LanguageModelV2ToolResultPart,
|
|
8
8
|
} from "@ai-sdk/provider";
|
|
9
|
+
import type { ThreadMessage } from "@assistant-ui/react";
|
|
9
10
|
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
tif: "image/tiff",
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
const inferImageMediaType = (url: string): string => {
|
|
30
|
-
const ext = url.split(".").pop()?.toLowerCase().split("?")[0] ?? "";
|
|
31
|
-
return IMAGE_MEDIA_TYPES[ext] ?? "image/png";
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
const assistantMessageSplitter = () => {
|
|
35
|
-
const stash: LanguageModelV2Message[] = [];
|
|
36
|
-
let assistantMessage = {
|
|
37
|
-
role: "assistant" as const,
|
|
38
|
-
content: [] as (LanguageModelV2TextPart | LanguageModelV2ToolCallPart)[],
|
|
39
|
-
};
|
|
40
|
-
let toolMessage = {
|
|
41
|
-
role: "tool" as const,
|
|
42
|
-
content: [] as LanguageModelV2ToolResultPart[],
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
return {
|
|
46
|
-
addTextMessagePart: (part: TextMessagePart) => {
|
|
47
|
-
if (toolMessage.content.length > 0) {
|
|
48
|
-
stash.push(assistantMessage);
|
|
49
|
-
stash.push(toolMessage);
|
|
50
|
-
|
|
51
|
-
assistantMessage = {
|
|
52
|
-
role: "assistant" as const,
|
|
53
|
-
content: [] as (
|
|
54
|
-
| LanguageModelV2TextPart
|
|
55
|
-
| LanguageModelV2ToolCallPart
|
|
56
|
-
)[],
|
|
57
|
-
};
|
|
11
|
+
toGenericMessages,
|
|
12
|
+
type GenericMessage,
|
|
13
|
+
type GenericTextPart,
|
|
14
|
+
type GenericToolCallPart,
|
|
15
|
+
type GenericToolResultPart,
|
|
16
|
+
} from "assistant-stream";
|
|
17
|
+
|
|
18
|
+
function toUrl(value: string | URL): URL {
|
|
19
|
+
if (value instanceof URL) return value;
|
|
20
|
+
try {
|
|
21
|
+
return new URL(value);
|
|
22
|
+
} catch {
|
|
23
|
+
// For relative URLs, create URL with a dummy base
|
|
24
|
+
return new URL(value, "file://");
|
|
25
|
+
}
|
|
26
|
+
}
|
|
58
27
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
28
|
+
function convertUserContent(
|
|
29
|
+
content: GenericMessage & { role: "user" },
|
|
30
|
+
): (LanguageModelV2TextPart | LanguageModelV2FilePart)[] {
|
|
31
|
+
return content.content.map((part) => {
|
|
32
|
+
if (part.type === "text") {
|
|
33
|
+
return part;
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
type: "file",
|
|
37
|
+
data: toUrl(part.data),
|
|
38
|
+
mediaType: part.mediaType,
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
}
|
|
64
42
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
43
|
+
function convertAssistantContent(
|
|
44
|
+
content: (GenericTextPart | GenericToolCallPart)[],
|
|
45
|
+
): (LanguageModelV2TextPart | LanguageModelV2ToolCallPart)[] {
|
|
46
|
+
return content.map((part) => {
|
|
47
|
+
if (part.type === "text") {
|
|
48
|
+
return part;
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
type: "tool-call",
|
|
52
|
+
toolCallId: part.toolCallId,
|
|
53
|
+
toolName: part.toolName,
|
|
54
|
+
input: part.args,
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
}
|
|
74
58
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
: { type: "json", value: part.result as JSONValue },
|
|
88
|
-
});
|
|
89
|
-
},
|
|
90
|
-
getMessages: () => {
|
|
91
|
-
if (toolMessage.content.length > 0) {
|
|
92
|
-
return [...stash, assistantMessage, toolMessage];
|
|
93
|
-
}
|
|
59
|
+
function convertToolContent(
|
|
60
|
+
content: GenericToolResultPart[],
|
|
61
|
+
): LanguageModelV2ToolResultPart[] {
|
|
62
|
+
return content.map((part) => ({
|
|
63
|
+
type: "tool-result",
|
|
64
|
+
toolCallId: part.toolCallId,
|
|
65
|
+
toolName: part.toolName,
|
|
66
|
+
output: part.isError
|
|
67
|
+
? { type: "error-json", value: part.result as JSONValue }
|
|
68
|
+
: { type: "json", value: part.result as JSONValue },
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
94
71
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
72
|
+
function convertGenericToLanguageModel(
|
|
73
|
+
generic: GenericMessage,
|
|
74
|
+
): LanguageModelV2Message {
|
|
75
|
+
switch (generic.role) {
|
|
76
|
+
case "system":
|
|
77
|
+
return { role: "system", content: generic.content };
|
|
78
|
+
case "user":
|
|
79
|
+
return { role: "user", content: convertUserContent(generic) };
|
|
80
|
+
case "assistant":
|
|
81
|
+
return {
|
|
82
|
+
role: "assistant",
|
|
83
|
+
content: convertAssistantContent(generic.content),
|
|
84
|
+
};
|
|
85
|
+
case "tool":
|
|
86
|
+
return { role: "tool", content: convertToolContent(generic.content) };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
99
89
|
|
|
100
90
|
/**
|
|
101
|
-
* @deprecated
|
|
91
|
+
* @deprecated Use `toGenericMessages` from `assistant-stream` for framework-agnostic conversion.
|
|
92
|
+
* This function is kept for AI SDK compatibility.
|
|
102
93
|
*/
|
|
103
94
|
export function toLanguageModelMessages(
|
|
104
|
-
|
|
95
|
+
messages: readonly ThreadMessage[],
|
|
105
96
|
options: { unstable_includeId?: boolean | undefined } = {},
|
|
106
97
|
): LanguageModelV2Message[] {
|
|
107
98
|
const includeId = options.unstable_includeId ?? false;
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
99
|
+
const genericMessages = toGenericMessages(messages as any);
|
|
100
|
+
|
|
101
|
+
if (!includeId) {
|
|
102
|
+
return genericMessages.map(convertGenericToLanguageModel);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// When includeId is true, we need to map back to original message IDs
|
|
106
|
+
const result: LanguageModelV2Message[] = [];
|
|
107
|
+
let messageIndex = 0;
|
|
108
|
+
|
|
109
|
+
for (const generic of genericMessages) {
|
|
110
|
+
const converted = convertGenericToLanguageModel(generic);
|
|
111
|
+
|
|
112
|
+
// Tool messages are synthesized from assistant message tool calls,
|
|
113
|
+
// they don't have a corresponding original message
|
|
114
|
+
if (generic.role !== "tool") {
|
|
115
|
+
// Find the corresponding original message for ID
|
|
116
|
+
while (
|
|
117
|
+
messageIndex < messages.length &&
|
|
118
|
+
messages[messageIndex]!.role !== generic.role
|
|
119
|
+
) {
|
|
120
|
+
messageIndex++;
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
...message.content,
|
|
127
|
-
...attachments.map((a) => a.content).flat(),
|
|
128
|
-
];
|
|
129
|
-
const msg: LanguageModelV2Message = {
|
|
130
|
-
...(includeId ? { unstable_id: (message as ThreadMessage).id } : {}),
|
|
131
|
-
role: "user",
|
|
132
|
-
content: content.map(
|
|
133
|
-
(part): LanguageModelV2TextPart | LanguageModelV2FilePart => {
|
|
134
|
-
const type = part.type;
|
|
135
|
-
switch (type) {
|
|
136
|
-
case "text": {
|
|
137
|
-
return part;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
case "image": {
|
|
141
|
-
// ImageMessagePart doesn't include media type info, so we infer from URL
|
|
142
|
-
return {
|
|
143
|
-
type: "file",
|
|
144
|
-
data: new URL(part.image),
|
|
145
|
-
mediaType: inferImageMediaType(part.image),
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
case "file": {
|
|
150
|
-
return {
|
|
151
|
-
type: "file",
|
|
152
|
-
data: new URL(part.data),
|
|
153
|
-
mediaType: part.mimeType,
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
default: {
|
|
158
|
-
const unhandledType: "audio" = type;
|
|
159
|
-
throw new Error(
|
|
160
|
-
`Unsupported message part type: ${unhandledType}`,
|
|
161
|
-
);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
},
|
|
165
|
-
),
|
|
166
|
-
};
|
|
167
|
-
return [msg];
|
|
123
|
+
if (messageIndex < messages.length) {
|
|
124
|
+
(converted as any).unstable_id = messages[messageIndex]!.id;
|
|
125
|
+
messageIndex++;
|
|
168
126
|
}
|
|
127
|
+
}
|
|
169
128
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
for (const part of message.content) {
|
|
173
|
-
const type = part.type;
|
|
174
|
-
switch (type) {
|
|
175
|
-
case "reasoning":
|
|
176
|
-
case "source":
|
|
177
|
-
case "file":
|
|
178
|
-
case "data":
|
|
179
|
-
case "image": {
|
|
180
|
-
break; // reasoning, source, file, and image parts are omitted
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
case "text": {
|
|
184
|
-
splitter.addTextMessagePart(part);
|
|
185
|
-
break;
|
|
186
|
-
}
|
|
187
|
-
case "tool-call": {
|
|
188
|
-
splitter.addToolCallPart(part);
|
|
189
|
-
break;
|
|
190
|
-
}
|
|
191
|
-
default: {
|
|
192
|
-
const unhandledType: never = type;
|
|
193
|
-
throw new Error(`Unhandled message part type: ${unhandledType}`);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
return splitter.getMessages();
|
|
198
|
-
}
|
|
129
|
+
result.push(converted);
|
|
130
|
+
}
|
|
199
131
|
|
|
200
|
-
|
|
201
|
-
const unhandledRole: never = role;
|
|
202
|
-
throw new Error(`Unknown message role: ${unhandledRole}`);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
});
|
|
132
|
+
return result;
|
|
206
133
|
}
|
|
@@ -8,14 +8,12 @@ import {
|
|
|
8
8
|
INTERNAL,
|
|
9
9
|
type LocalRuntimeOptions,
|
|
10
10
|
type ThreadMessage,
|
|
11
|
-
type Tool,
|
|
12
11
|
useLocalRuntime,
|
|
13
12
|
} from "@assistant-ui/react";
|
|
14
|
-
import { z } from "zod";
|
|
15
|
-
import type { JSONSchema7 } from "json-schema";
|
|
16
13
|
import {
|
|
17
14
|
AssistantMessageAccumulator,
|
|
18
15
|
DataStreamDecoder,
|
|
16
|
+
toToolsJSONSchema,
|
|
19
17
|
UIMessageStreamDecoder,
|
|
20
18
|
unstable_toolResultStream,
|
|
21
19
|
} from "assistant-stream";
|
|
@@ -59,28 +57,6 @@ type DataStreamRuntimeRequestOptions = {
|
|
|
59
57
|
state?: any;
|
|
60
58
|
};
|
|
61
59
|
|
|
62
|
-
const toAISDKTools = (tools: Record<string, Tool>) => {
|
|
63
|
-
return Object.fromEntries(
|
|
64
|
-
Object.entries(tools).map(([name, tool]) => [
|
|
65
|
-
name,
|
|
66
|
-
{
|
|
67
|
-
...(tool.description ? { description: tool.description } : undefined),
|
|
68
|
-
parameters: (tool.parameters instanceof z.ZodType
|
|
69
|
-
? z.toJSONSchema(tool.parameters)
|
|
70
|
-
: tool.parameters) as JSONSchema7,
|
|
71
|
-
},
|
|
72
|
-
]),
|
|
73
|
-
);
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
const getEnabledTools = (tools: Record<string, Tool>) => {
|
|
77
|
-
return Object.fromEntries(
|
|
78
|
-
Object.entries(tools).filter(
|
|
79
|
-
([, tool]) => !tool.disabled && tool.type !== "backend",
|
|
80
|
-
),
|
|
81
|
-
);
|
|
82
|
-
};
|
|
83
|
-
|
|
84
60
|
class DataStreamRuntimeAdapter implements ChatModelAdapter {
|
|
85
61
|
constructor(
|
|
86
62
|
private options: Omit<
|
|
@@ -129,8 +105,8 @@ class DataStreamRuntimeAdapter implements ChatModelAdapter {
|
|
|
129
105
|
messages: toLanguageModelMessages(messages, {
|
|
130
106
|
unstable_includeId: this.options.sendExtraMessageFields,
|
|
131
107
|
}) as DataStreamRuntimeRequestOptions["messages"],
|
|
132
|
-
tools:
|
|
133
|
-
|
|
108
|
+
tools: toToolsJSONSchema(
|
|
109
|
+
context.tools ?? {},
|
|
134
110
|
) as unknown as DataStreamRuntimeRequestOptions["tools"],
|
|
135
111
|
...(unstable_assistantMessageId ? { unstable_assistantMessageId } : {}),
|
|
136
112
|
...(unstable_threadId ? { threadId: unstable_threadId } : {}),
|