@assistant-ui/react 0.3.4 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
package/README.md CHANGED
@@ -2,15 +2,17 @@
2
2
  <img src="https://raw.githubusercontent.com/Yonom/assistant-ui/main/.github/assets/header.svg" alt="assistant-ui Header" width="100%" />
3
3
  </a>
4
4
 
5
- assistant-ui is a set of React components for AI chat.
5
+ <p align="center">
6
+ <a href="https://assistant-ui.com">Product</a> ·
7
+ <a href="https://assistant-ui.com/docs">Documentation</a> ·
8
+ <a href="https://assistant-ui.com/examples">Examples</a> ·
9
+ <a href="https://discord.gg/S9dwgCNEFs">Discord Community</a> ·
10
+ <a href="https://cal.com/simon-farshid/assistant-ui">Enterprise inquiry</a>
11
+ </p>
6
12
 
7
- - [Discord](https://discord.gg/S9dwgCNEFs)
8
- - [Website](https://assistant-ui.com/)
9
- - [Demo](https://assistant-ui-rsc-example.vercel.app/)
13
+ **assistant-ui** is a set of React components for AI chat, with integrations Langchain, Vercel AI SDK, TailwindCSS, shadcn-ui, react-markdown, react-syntax-highlighter, React Hook Form and more!
10
14
 
11
- ## Documentation
12
-
13
- - [Documentation](https://www.assistant-ui.com/docs/getting-started)
15
+ Wide model provider support (OpenAI, Anthropic, Mistral, Perplexity, AWS Bedrock, Azure, Google Gemini, Hugging Face, Fireworks, Cohere, Replicate, Ollama) out of the box and the ability to integrate custom APIs.
14
16
 
15
17
  ## Quick Start
16
18
 
@@ -23,7 +25,7 @@ npx assistant-ui@latest create my-app
23
25
  cd my-app
24
26
  ```
25
27
 
26
- Step 2: Update the `.env` file with your OpenAI API key.
28
+ Step 2: Update the `.env` file with your OpenAI API key.
27
29
 
28
30
  Step 3: Run the app:
29
31
 
@@ -0,0 +1,9 @@
1
+ import { LanguageModelV1 } from '@ai-sdk/provider';
2
+
3
+ declare const createEdgeRuntimeAPI: ({ model }: {
4
+ model: LanguageModelV1;
5
+ }) => {
6
+ POST: (request: Request) => Promise<Response>;
7
+ };
8
+
9
+ export { createEdgeRuntimeAPI };
package/dist/edge.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import { LanguageModelV1 } from '@ai-sdk/provider';
2
+
3
+ declare const createEdgeRuntimeAPI: ({ model }: {
4
+ model: LanguageModelV1;
5
+ }) => {
6
+ POST: (request: Request) => Promise<Response>;
7
+ };
8
+
9
+ export { createEdgeRuntimeAPI };
package/dist/edge.js ADDED
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/edge.ts
21
+ var edge_exports = {};
22
+ __export(edge_exports, {
23
+ createEdgeRuntimeAPI: () => createEdgeRuntimeAPI
24
+ });
25
+ module.exports = __toCommonJS(edge_exports);
26
+
27
+ // src/runtimes/edge/streams/assistantEncoderStream.ts
28
+ function assistantEncoderStream() {
29
+ const toolCalls = /* @__PURE__ */ new Set();
30
+ return new TransformStream({
31
+ transform(chunk, controller) {
32
+ const chunkType = chunk.type;
33
+ switch (chunkType) {
34
+ case "text-delta": {
35
+ controller.enqueue(
36
+ formatStreamPart(
37
+ "0" /* TextDelta */,
38
+ chunk.textDelta
39
+ )
40
+ );
41
+ break;
42
+ }
43
+ case "tool-call-delta": {
44
+ if (!toolCalls.has(chunk.toolCallId)) {
45
+ toolCalls.add(chunk.toolCallId);
46
+ controller.enqueue(
47
+ formatStreamPart("1" /* ToolCallBegin */, {
48
+ id: chunk.toolCallId,
49
+ name: chunk.toolName
50
+ })
51
+ );
52
+ }
53
+ controller.enqueue(
54
+ formatStreamPart(
55
+ "2" /* ToolCallArgsTextDelta */,
56
+ chunk.argsTextDelta
57
+ )
58
+ );
59
+ break;
60
+ }
61
+ case "tool-call":
62
+ break;
63
+ case "finish": {
64
+ const { type, ...rest } = chunk;
65
+ controller.enqueue(
66
+ formatStreamPart(
67
+ "F" /* Finish */,
68
+ JSON.stringify(rest)
69
+ )
70
+ );
71
+ break;
72
+ }
73
+ case "error": {
74
+ controller.enqueue(
75
+ formatStreamPart(
76
+ "E" /* Error */,
77
+ JSON.stringify(chunk.error)
78
+ )
79
+ );
80
+ break;
81
+ }
82
+ default: {
83
+ const unhandledType = chunkType;
84
+ throw new Error(`Unhandled chunk type: ${unhandledType}`);
85
+ }
86
+ }
87
+ }
88
+ });
89
+ }
90
+ function formatStreamPart(code, value) {
91
+ return `${code}:${JSON.stringify(value)}
92
+ `;
93
+ }
94
+
95
+ // src/runtimes/edge/createEdgeRuntimeAPI.ts
96
+ var createEdgeRuntimeAPI = ({ model }) => {
97
+ const POST = async (request) => {
98
+ const { system, messages, tools } = await request.json();
99
+ const { stream } = await streamMessage({
100
+ model,
101
+ abortSignal: request.signal,
102
+ ...system ? { system } : void 0,
103
+ messages,
104
+ tools
105
+ });
106
+ return new Response(stream, {
107
+ headers: {
108
+ contentType: "text/plain; charset=utf-8"
109
+ }
110
+ });
111
+ };
112
+ return { POST };
113
+ };
114
+ async function streamMessage({
115
+ model,
116
+ system,
117
+ messages,
118
+ tools,
119
+ toolChoice,
120
+ ...options
121
+ }) {
122
+ const { stream, warnings, rawResponse } = await model.doStream({
123
+ inputFormat: "messages",
124
+ mode: {
125
+ type: "regular",
126
+ ...tools ? { tools } : void 0,
127
+ ...toolChoice ? { toolChoice } : void 0
128
+ },
129
+ prompt: convertToLanguageModelPrompt(system, messages),
130
+ ...options
131
+ });
132
+ return {
133
+ stream: stream.pipeThrough(assistantEncoderStream()).pipeThrough(new TextEncoderStream()),
134
+ warnings,
135
+ rawResponse
136
+ };
137
+ }
138
+ function convertToLanguageModelPrompt(system, messages) {
139
+ const languageModelMessages = [];
140
+ if (system != null) {
141
+ languageModelMessages.push({ role: "system", content: system });
142
+ }
143
+ languageModelMessages.push(
144
+ ...messages.flatMap(convertToLanguageModelMessage)
145
+ );
146
+ return languageModelMessages;
147
+ }
148
+ var assistantMessageSplitter = () => {
149
+ const stash = [];
150
+ let assistantMessage = {
151
+ role: "assistant",
152
+ content: []
153
+ };
154
+ let toolMessage = {
155
+ role: "tool",
156
+ content: []
157
+ };
158
+ return {
159
+ addTextContentPart: (part) => {
160
+ if (toolMessage.content.length > 0) {
161
+ stash.push(assistantMessage);
162
+ stash.push(toolMessage);
163
+ assistantMessage = {
164
+ role: "assistant",
165
+ content: []
166
+ };
167
+ toolMessage = {
168
+ role: "tool",
169
+ content: []
170
+ };
171
+ }
172
+ assistantMessage.content.push(part);
173
+ },
174
+ addToolCallPart: (part) => {
175
+ assistantMessage.content.push({
176
+ type: "tool-call",
177
+ toolCallId: part.toolCallId,
178
+ toolName: part.toolName,
179
+ args: part.args
180
+ });
181
+ if (part.result) {
182
+ toolMessage.content.push({
183
+ type: "tool-result",
184
+ toolCallId: part.toolCallId,
185
+ toolName: part.toolName,
186
+ result: part.result
187
+ // isError
188
+ });
189
+ }
190
+ },
191
+ getMessages: () => {
192
+ if (toolMessage.content.length > 0) {
193
+ return [...stash, assistantMessage, toolMessage];
194
+ }
195
+ return [...stash, assistantMessage];
196
+ }
197
+ };
198
+ };
199
+ function convertToLanguageModelMessage(message) {
200
+ const role = message.role;
201
+ switch (role) {
202
+ case "system": {
203
+ return [{ role: "system", content: message.content[0].text }];
204
+ }
205
+ case "user": {
206
+ const msg = {
207
+ role: "user",
208
+ content: message.content.map(
209
+ (part) => {
210
+ const type = part.type;
211
+ switch (type) {
212
+ case "text": {
213
+ return part;
214
+ }
215
+ case "image": {
216
+ return {
217
+ type: "image",
218
+ image: new URL(part.image)
219
+ };
220
+ }
221
+ default: {
222
+ const unhandledType = type;
223
+ throw new Error(
224
+ `Unspported content part type: ${unhandledType}`
225
+ );
226
+ }
227
+ }
228
+ }
229
+ )
230
+ };
231
+ return [msg];
232
+ }
233
+ case "assistant": {
234
+ const splitter = assistantMessageSplitter();
235
+ for (const part of message.content) {
236
+ const type = part.type;
237
+ switch (type) {
238
+ case "text": {
239
+ splitter.addTextContentPart(part);
240
+ break;
241
+ }
242
+ case "tool-call": {
243
+ splitter.addToolCallPart(part);
244
+ break;
245
+ }
246
+ default: {
247
+ const _exhaustiveCheck = type;
248
+ throw new Error(`Unhandled content part type: ${_exhaustiveCheck}`);
249
+ }
250
+ }
251
+ }
252
+ return splitter.getMessages();
253
+ }
254
+ default: {
255
+ const unhandledRole = role;
256
+ throw new Error(`Unknown message role: ${unhandledRole}`);
257
+ }
258
+ }
259
+ }
260
+ // Annotate the CommonJS export names for ESM import in node:
261
+ 0 && (module.exports = {
262
+ createEdgeRuntimeAPI
263
+ });
264
+ //# sourceMappingURL=edge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/edge.ts","../src/runtimes/edge/streams/assistantEncoderStream.ts","../src/runtimes/edge/createEdgeRuntimeAPI.ts"],"sourcesContent":["export { createEdgeRuntimeAPI } from \"./runtimes/edge/createEdgeRuntimeAPI\";\n","import { AssistantStreamChunkType } from \"./AssistantStreamChunkType\";\nimport { LanguageModelV1StreamPart } from \"@ai-sdk/provider\";\n\nexport function assistantEncoderStream() {\n const toolCalls = new Set<string>();\n return new TransformStream<LanguageModelV1StreamPart, string>({\n transform(chunk, controller) {\n const chunkType = chunk.type;\n switch (chunkType) {\n case \"text-delta\": {\n controller.enqueue(\n formatStreamPart(\n AssistantStreamChunkType.TextDelta,\n chunk.textDelta,\n ),\n );\n break;\n }\n case \"tool-call-delta\": {\n if (!toolCalls.has(chunk.toolCallId)) {\n toolCalls.add(chunk.toolCallId);\n controller.enqueue(\n formatStreamPart(AssistantStreamChunkType.ToolCallBegin, {\n id: chunk.toolCallId,\n name: chunk.toolName,\n }),\n );\n }\n\n controller.enqueue(\n formatStreamPart(\n AssistantStreamChunkType.ToolCallArgsTextDelta,\n chunk.argsTextDelta,\n ),\n );\n break;\n }\n\n // ignore\n case \"tool-call\":\n break;\n\n case \"finish\": {\n const { type, ...rest } = chunk;\n controller.enqueue(\n formatStreamPart(\n AssistantStreamChunkType.Finish,\n JSON.stringify(rest),\n ),\n );\n break;\n }\n\n case \"error\": {\n controller.enqueue(\n formatStreamPart(\n AssistantStreamChunkType.Error,\n JSON.stringify(chunk.error),\n ),\n );\n break;\n }\n default: {\n const unhandledType: never = chunkType;\n throw new Error(`Unhandled chunk type: ${unhandledType}`);\n }\n }\n },\n });\n}\n\nexport function formatStreamPart(\n code: AssistantStreamChunkType,\n value: any,\n): string {\n return `${code}:${JSON.stringify(value)}\\n`;\n}\n","import {\n LanguageModelV1,\n LanguageModelV1ToolChoice,\n LanguageModelV1FunctionTool,\n LanguageModelV1Message,\n LanguageModelV1Prompt,\n LanguageModelV1CallOptions,\n LanguageModelV1TextPart,\n LanguageModelV1CallWarning,\n LanguageModelV1ToolCallPart,\n LanguageModelV1ToolResultPart,\n LanguageModelV1ImagePart,\n} from \"@ai-sdk/provider\";\nimport {\n CoreThreadMessage,\n TextContentPart,\n ToolCallContentPart,\n} from \"../../types/AssistantTypes\";\nimport { assistantEncoderStream } from \"./streams/assistantEncoderStream\";\nimport { EdgeRuntimeRequestOptions } from \"./EdgeRuntimeRequestOptions\";\n\nexport const createEdgeRuntimeAPI = ({ model }: { model: LanguageModelV1 }) => {\n const POST = async (request: Request) => {\n const { system, messages, tools } =\n (await request.json()) as EdgeRuntimeRequestOptions;\n\n const { stream } = await streamMessage({\n model,\n abortSignal: request.signal,\n\n ...(system ? { system } : undefined),\n messages,\n tools,\n });\n\n return new Response(stream, {\n headers: {\n contentType: \"text/plain; charset=utf-8\",\n },\n });\n };\n return { POST };\n};\n\ntype StreamMessageResult = {\n stream: ReadableStream<Uint8Array>;\n warnings: LanguageModelV1CallWarning[] | undefined;\n rawResponse: unknown;\n};\n\nasync function streamMessage({\n model,\n system,\n messages,\n tools,\n toolChoice,\n ...options\n}: Omit<LanguageModelV1CallOptions, \"inputFormat\" | \"mode\" | \"prompt\"> & {\n model: LanguageModelV1;\n system?: string;\n messages: CoreThreadMessage[];\n tools?: LanguageModelV1FunctionTool[];\n toolChoice?: LanguageModelV1ToolChoice;\n}): Promise<StreamMessageResult> {\n const { stream, warnings, rawResponse } = await model.doStream({\n inputFormat: \"messages\",\n mode: {\n type: \"regular\",\n ...(tools ? { tools } : undefined),\n ...(toolChoice ? { toolChoice } : undefined),\n },\n prompt: convertToLanguageModelPrompt(system, messages),\n ...options,\n });\n\n return {\n stream: stream\n .pipeThrough(assistantEncoderStream())\n .pipeThrough(new TextEncoderStream()),\n warnings,\n rawResponse,\n };\n}\n\nexport function convertToLanguageModelPrompt(\n system: string | undefined,\n messages: CoreThreadMessage[],\n): LanguageModelV1Prompt {\n const languageModelMessages: LanguageModelV1Prompt = [];\n\n if (system != null) {\n languageModelMessages.push({ role: \"system\", content: system });\n }\n languageModelMessages.push(\n ...messages.flatMap(convertToLanguageModelMessage),\n );\n\n return languageModelMessages;\n}\n\nconst assistantMessageSplitter = () => {\n const stash: LanguageModelV1Message[] = [];\n let assistantMessage = {\n role: \"assistant\" as const,\n content: [] as (LanguageModelV1TextPart | LanguageModelV1ToolCallPart)[],\n };\n let toolMessage = {\n role: \"tool\" as const,\n content: [] as LanguageModelV1ToolResultPart[],\n };\n\n return {\n addTextContentPart: (part: TextContentPart) => {\n if (toolMessage.content.length > 0) {\n stash.push(assistantMessage);\n stash.push(toolMessage);\n\n assistantMessage = {\n role: \"assistant\" as const,\n content: [] as (\n | LanguageModelV1TextPart\n | LanguageModelV1ToolCallPart\n )[],\n };\n\n toolMessage = {\n role: \"tool\" as const,\n content: [] as LanguageModelV1ToolResultPart[],\n };\n }\n\n assistantMessage.content.push(part);\n },\n addToolCallPart: (part: ToolCallContentPart) => {\n assistantMessage.content.push({\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n args: part.args,\n });\n if (part.result) {\n toolMessage.content.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n result: part.result,\n // isError\n });\n }\n },\n getMessages: () => {\n if (toolMessage.content.length > 0) {\n return [...stash, assistantMessage, toolMessage];\n }\n\n return [...stash, assistantMessage];\n },\n };\n};\n\nexport function convertToLanguageModelMessage(\n message: CoreThreadMessage,\n): LanguageModelV1Message[] {\n const role = message.role;\n switch (role) {\n case \"system\": {\n return [{ role: \"system\", content: message.content[0].text }];\n }\n\n case \"user\": {\n const msg: LanguageModelV1Message = {\n role: \"user\",\n content: message.content.map(\n (part): LanguageModelV1TextPart | LanguageModelV1ImagePart => {\n const type = part.type;\n switch (type) {\n case \"text\": {\n return part;\n }\n\n case \"image\": {\n return {\n type: \"image\",\n image: new URL(part.image),\n };\n }\n\n default: {\n const unhandledType: never = type;\n throw new Error(\n `Unspported content part type: ${unhandledType}`,\n );\n }\n }\n },\n ),\n };\n return [msg];\n }\n\n case \"assistant\": {\n const splitter = assistantMessageSplitter();\n for (const part of message.content) {\n const type = part.type;\n switch (type) {\n case \"text\": {\n splitter.addTextContentPart(part);\n break;\n }\n case \"tool-call\": {\n splitter.addToolCallPart(part);\n break;\n }\n default: {\n const _exhaustiveCheck: never = type;\n throw new Error(`Unhandled content part type: ${_exhaustiveCheck}`);\n }\n }\n }\n return splitter.getMessages();\n }\n\n default: {\n const unhandledRole: never = role;\n throw new Error(`Unknown message role: ${unhandledRole}`);\n }\n }\n}\n"],"mappings":"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","names":[]}
package/dist/edge.mjs ADDED
@@ -0,0 +1,237 @@
1
+ // src/runtimes/edge/streams/assistantEncoderStream.ts
2
+ function assistantEncoderStream() {
3
+ const toolCalls = /* @__PURE__ */ new Set();
4
+ return new TransformStream({
5
+ transform(chunk, controller) {
6
+ const chunkType = chunk.type;
7
+ switch (chunkType) {
8
+ case "text-delta": {
9
+ controller.enqueue(
10
+ formatStreamPart(
11
+ "0" /* TextDelta */,
12
+ chunk.textDelta
13
+ )
14
+ );
15
+ break;
16
+ }
17
+ case "tool-call-delta": {
18
+ if (!toolCalls.has(chunk.toolCallId)) {
19
+ toolCalls.add(chunk.toolCallId);
20
+ controller.enqueue(
21
+ formatStreamPart("1" /* ToolCallBegin */, {
22
+ id: chunk.toolCallId,
23
+ name: chunk.toolName
24
+ })
25
+ );
26
+ }
27
+ controller.enqueue(
28
+ formatStreamPart(
29
+ "2" /* ToolCallArgsTextDelta */,
30
+ chunk.argsTextDelta
31
+ )
32
+ );
33
+ break;
34
+ }
35
+ case "tool-call":
36
+ break;
37
+ case "finish": {
38
+ const { type, ...rest } = chunk;
39
+ controller.enqueue(
40
+ formatStreamPart(
41
+ "F" /* Finish */,
42
+ JSON.stringify(rest)
43
+ )
44
+ );
45
+ break;
46
+ }
47
+ case "error": {
48
+ controller.enqueue(
49
+ formatStreamPart(
50
+ "E" /* Error */,
51
+ JSON.stringify(chunk.error)
52
+ )
53
+ );
54
+ break;
55
+ }
56
+ default: {
57
+ const unhandledType = chunkType;
58
+ throw new Error(`Unhandled chunk type: ${unhandledType}`);
59
+ }
60
+ }
61
+ }
62
+ });
63
+ }
64
+ function formatStreamPart(code, value) {
65
+ return `${code}:${JSON.stringify(value)}
66
+ `;
67
+ }
68
+
69
+ // src/runtimes/edge/createEdgeRuntimeAPI.ts
70
+ var createEdgeRuntimeAPI = ({ model }) => {
71
+ const POST = async (request) => {
72
+ const { system, messages, tools } = await request.json();
73
+ const { stream } = await streamMessage({
74
+ model,
75
+ abortSignal: request.signal,
76
+ ...system ? { system } : void 0,
77
+ messages,
78
+ tools
79
+ });
80
+ return new Response(stream, {
81
+ headers: {
82
+ contentType: "text/plain; charset=utf-8"
83
+ }
84
+ });
85
+ };
86
+ return { POST };
87
+ };
88
+ async function streamMessage({
89
+ model,
90
+ system,
91
+ messages,
92
+ tools,
93
+ toolChoice,
94
+ ...options
95
+ }) {
96
+ const { stream, warnings, rawResponse } = await model.doStream({
97
+ inputFormat: "messages",
98
+ mode: {
99
+ type: "regular",
100
+ ...tools ? { tools } : void 0,
101
+ ...toolChoice ? { toolChoice } : void 0
102
+ },
103
+ prompt: convertToLanguageModelPrompt(system, messages),
104
+ ...options
105
+ });
106
+ return {
107
+ stream: stream.pipeThrough(assistantEncoderStream()).pipeThrough(new TextEncoderStream()),
108
+ warnings,
109
+ rawResponse
110
+ };
111
+ }
112
+ function convertToLanguageModelPrompt(system, messages) {
113
+ const languageModelMessages = [];
114
+ if (system != null) {
115
+ languageModelMessages.push({ role: "system", content: system });
116
+ }
117
+ languageModelMessages.push(
118
+ ...messages.flatMap(convertToLanguageModelMessage)
119
+ );
120
+ return languageModelMessages;
121
+ }
122
+ var assistantMessageSplitter = () => {
123
+ const stash = [];
124
+ let assistantMessage = {
125
+ role: "assistant",
126
+ content: []
127
+ };
128
+ let toolMessage = {
129
+ role: "tool",
130
+ content: []
131
+ };
132
+ return {
133
+ addTextContentPart: (part) => {
134
+ if (toolMessage.content.length > 0) {
135
+ stash.push(assistantMessage);
136
+ stash.push(toolMessage);
137
+ assistantMessage = {
138
+ role: "assistant",
139
+ content: []
140
+ };
141
+ toolMessage = {
142
+ role: "tool",
143
+ content: []
144
+ };
145
+ }
146
+ assistantMessage.content.push(part);
147
+ },
148
+ addToolCallPart: (part) => {
149
+ assistantMessage.content.push({
150
+ type: "tool-call",
151
+ toolCallId: part.toolCallId,
152
+ toolName: part.toolName,
153
+ args: part.args
154
+ });
155
+ if (part.result) {
156
+ toolMessage.content.push({
157
+ type: "tool-result",
158
+ toolCallId: part.toolCallId,
159
+ toolName: part.toolName,
160
+ result: part.result
161
+ // isError
162
+ });
163
+ }
164
+ },
165
+ getMessages: () => {
166
+ if (toolMessage.content.length > 0) {
167
+ return [...stash, assistantMessage, toolMessage];
168
+ }
169
+ return [...stash, assistantMessage];
170
+ }
171
+ };
172
+ };
173
+ function convertToLanguageModelMessage(message) {
174
+ const role = message.role;
175
+ switch (role) {
176
+ case "system": {
177
+ return [{ role: "system", content: message.content[0].text }];
178
+ }
179
+ case "user": {
180
+ const msg = {
181
+ role: "user",
182
+ content: message.content.map(
183
+ (part) => {
184
+ const type = part.type;
185
+ switch (type) {
186
+ case "text": {
187
+ return part;
188
+ }
189
+ case "image": {
190
+ return {
191
+ type: "image",
192
+ image: new URL(part.image)
193
+ };
194
+ }
195
+ default: {
196
+ const unhandledType = type;
197
+ throw new Error(
198
+ `Unspported content part type: ${unhandledType}`
199
+ );
200
+ }
201
+ }
202
+ }
203
+ )
204
+ };
205
+ return [msg];
206
+ }
207
+ case "assistant": {
208
+ const splitter = assistantMessageSplitter();
209
+ for (const part of message.content) {
210
+ const type = part.type;
211
+ switch (type) {
212
+ case "text": {
213
+ splitter.addTextContentPart(part);
214
+ break;
215
+ }
216
+ case "tool-call": {
217
+ splitter.addToolCallPart(part);
218
+ break;
219
+ }
220
+ default: {
221
+ const _exhaustiveCheck = type;
222
+ throw new Error(`Unhandled content part type: ${_exhaustiveCheck}`);
223
+ }
224
+ }
225
+ }
226
+ return splitter.getMessages();
227
+ }
228
+ default: {
229
+ const unhandledRole = role;
230
+ throw new Error(`Unknown message role: ${unhandledRole}`);
231
+ }
232
+ }
233
+ }
234
+ export {
235
+ createEdgeRuntimeAPI
236
+ };
237
+ //# sourceMappingURL=edge.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtimes/edge/streams/assistantEncoderStream.ts","../src/runtimes/edge/createEdgeRuntimeAPI.ts"],"sourcesContent":["import { AssistantStreamChunkType } from \"./AssistantStreamChunkType\";\nimport { LanguageModelV1StreamPart } from \"@ai-sdk/provider\";\n\nexport function assistantEncoderStream() {\n const toolCalls = new Set<string>();\n return new TransformStream<LanguageModelV1StreamPart, string>({\n transform(chunk, controller) {\n const chunkType = chunk.type;\n switch (chunkType) {\n case \"text-delta\": {\n controller.enqueue(\n formatStreamPart(\n AssistantStreamChunkType.TextDelta,\n chunk.textDelta,\n ),\n );\n break;\n }\n case \"tool-call-delta\": {\n if (!toolCalls.has(chunk.toolCallId)) {\n toolCalls.add(chunk.toolCallId);\n controller.enqueue(\n formatStreamPart(AssistantStreamChunkType.ToolCallBegin, {\n id: chunk.toolCallId,\n name: chunk.toolName,\n }),\n );\n }\n\n controller.enqueue(\n formatStreamPart(\n AssistantStreamChunkType.ToolCallArgsTextDelta,\n chunk.argsTextDelta,\n ),\n );\n break;\n }\n\n // ignore\n case \"tool-call\":\n break;\n\n case \"finish\": {\n const { type, ...rest } = chunk;\n controller.enqueue(\n formatStreamPart(\n AssistantStreamChunkType.Finish,\n JSON.stringify(rest),\n ),\n );\n break;\n }\n\n case \"error\": {\n controller.enqueue(\n formatStreamPart(\n AssistantStreamChunkType.Error,\n JSON.stringify(chunk.error),\n ),\n );\n break;\n }\n default: {\n const unhandledType: never = chunkType;\n throw new Error(`Unhandled chunk type: ${unhandledType}`);\n }\n }\n },\n });\n}\n\nexport function formatStreamPart(\n code: AssistantStreamChunkType,\n value: any,\n): string {\n return `${code}:${JSON.stringify(value)}\\n`;\n}\n","import {\n LanguageModelV1,\n LanguageModelV1ToolChoice,\n LanguageModelV1FunctionTool,\n LanguageModelV1Message,\n LanguageModelV1Prompt,\n LanguageModelV1CallOptions,\n LanguageModelV1TextPart,\n LanguageModelV1CallWarning,\n LanguageModelV1ToolCallPart,\n LanguageModelV1ToolResultPart,\n LanguageModelV1ImagePart,\n} from \"@ai-sdk/provider\";\nimport {\n CoreThreadMessage,\n TextContentPart,\n ToolCallContentPart,\n} from \"../../types/AssistantTypes\";\nimport { assistantEncoderStream } from \"./streams/assistantEncoderStream\";\nimport { EdgeRuntimeRequestOptions } from \"./EdgeRuntimeRequestOptions\";\n\nexport const createEdgeRuntimeAPI = ({ model }: { model: LanguageModelV1 }) => {\n const POST = async (request: Request) => {\n const { system, messages, tools } =\n (await request.json()) as EdgeRuntimeRequestOptions;\n\n const { stream } = await streamMessage({\n model,\n abortSignal: request.signal,\n\n ...(system ? { system } : undefined),\n messages,\n tools,\n });\n\n return new Response(stream, {\n headers: {\n contentType: \"text/plain; charset=utf-8\",\n },\n });\n };\n return { POST };\n};\n\ntype StreamMessageResult = {\n stream: ReadableStream<Uint8Array>;\n warnings: LanguageModelV1CallWarning[] | undefined;\n rawResponse: unknown;\n};\n\nasync function streamMessage({\n model,\n system,\n messages,\n tools,\n toolChoice,\n ...options\n}: Omit<LanguageModelV1CallOptions, \"inputFormat\" | \"mode\" | \"prompt\"> & {\n model: LanguageModelV1;\n system?: string;\n messages: CoreThreadMessage[];\n tools?: LanguageModelV1FunctionTool[];\n toolChoice?: LanguageModelV1ToolChoice;\n}): Promise<StreamMessageResult> {\n const { stream, warnings, rawResponse } = await model.doStream({\n inputFormat: \"messages\",\n mode: {\n type: \"regular\",\n ...(tools ? { tools } : undefined),\n ...(toolChoice ? { toolChoice } : undefined),\n },\n prompt: convertToLanguageModelPrompt(system, messages),\n ...options,\n });\n\n return {\n stream: stream\n .pipeThrough(assistantEncoderStream())\n .pipeThrough(new TextEncoderStream()),\n warnings,\n rawResponse,\n };\n}\n\nexport function convertToLanguageModelPrompt(\n system: string | undefined,\n messages: CoreThreadMessage[],\n): LanguageModelV1Prompt {\n const languageModelMessages: LanguageModelV1Prompt = [];\n\n if (system != null) {\n languageModelMessages.push({ role: \"system\", content: system });\n }\n languageModelMessages.push(\n ...messages.flatMap(convertToLanguageModelMessage),\n );\n\n return languageModelMessages;\n}\n\nconst assistantMessageSplitter = () => {\n const stash: LanguageModelV1Message[] = [];\n let assistantMessage = {\n role: \"assistant\" as const,\n content: [] as (LanguageModelV1TextPart | LanguageModelV1ToolCallPart)[],\n };\n let toolMessage = {\n role: \"tool\" as const,\n content: [] as LanguageModelV1ToolResultPart[],\n };\n\n return {\n addTextContentPart: (part: TextContentPart) => {\n if (toolMessage.content.length > 0) {\n stash.push(assistantMessage);\n stash.push(toolMessage);\n\n assistantMessage = {\n role: \"assistant\" as const,\n content: [] as (\n | LanguageModelV1TextPart\n | LanguageModelV1ToolCallPart\n )[],\n };\n\n toolMessage = {\n role: \"tool\" as const,\n content: [] as LanguageModelV1ToolResultPart[],\n };\n }\n\n assistantMessage.content.push(part);\n },\n addToolCallPart: (part: ToolCallContentPart) => {\n assistantMessage.content.push({\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n args: part.args,\n });\n if (part.result) {\n toolMessage.content.push({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n result: part.result,\n // isError\n });\n }\n },\n getMessages: () => {\n if (toolMessage.content.length > 0) {\n return [...stash, assistantMessage, toolMessage];\n }\n\n return [...stash, assistantMessage];\n },\n };\n};\n\nexport function convertToLanguageModelMessage(\n message: CoreThreadMessage,\n): LanguageModelV1Message[] {\n const role = message.role;\n switch (role) {\n case \"system\": {\n return [{ role: \"system\", content: message.content[0].text }];\n }\n\n case \"user\": {\n const msg: LanguageModelV1Message = {\n role: \"user\",\n content: message.content.map(\n (part): LanguageModelV1TextPart | LanguageModelV1ImagePart => {\n const type = part.type;\n switch (type) {\n case \"text\": {\n return part;\n }\n\n case \"image\": {\n return {\n type: \"image\",\n image: new URL(part.image),\n };\n }\n\n default: {\n const unhandledType: never = type;\n throw new Error(\n `Unspported content part type: ${unhandledType}`,\n );\n }\n }\n },\n ),\n };\n return [msg];\n }\n\n case \"assistant\": {\n const splitter = assistantMessageSplitter();\n for (const part of message.content) {\n const type = part.type;\n switch (type) {\n case \"text\": {\n splitter.addTextContentPart(part);\n break;\n }\n case \"tool-call\": {\n splitter.addToolCallPart(part);\n break;\n }\n default: {\n const _exhaustiveCheck: never = type;\n throw new Error(`Unhandled content part type: ${_exhaustiveCheck}`);\n }\n }\n }\n return splitter.getMessages();\n }\n\n default: {\n const unhandledRole: never = role;\n throw new Error(`Unknown message role: ${unhandledRole}`);\n }\n }\n}\n"],"mappings":"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","names":[]}