Skip to content

Commit c6c650c

Browse files
committed
feat: add support for built-in AI prefix continuation
- Introduced a new patched dependency for @built-in-ai/core@2.0.1 in both bun.lock and package.json. - Enhanced message processing in sendMessage function to conditionally prefix assistant messages based on provider type.
1 parent 42de3b0 commit c6c650c

4 files changed

Lines changed: 95 additions & 5 deletions

File tree

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
diff --git a/node_modules/@built-in-ai/core/.bun-tag-d546d55538164722 b/.bun-tag-d546d55538164722
2+
new file mode 100644
3+
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
4+
diff --git a/dist/index.js b/dist/index.js
5+
index 9398fde99b09707f7d62dfdbce5062784c665c3d..62146453379a454a8c78f87cbd6342b9dc772cc4 100644
6+
--- a/dist/index.js
7+
+++ b/dist/index.js
8+
@@ -62,7 +62,13 @@ function convertFileData(data, mediaType) {
9+
function convertToBuiltInAIMessages(prompt) {
10+
let systemMessage;
11+
const messages = [];
12+
- for (const message of prompt) {
13+
+ for (const [index, message] of prompt.entries()) {
14+
+ const prefix = !!message.providerOptions?.["browser-ai"]?.prefix;
15+
+ if (prefix && (message.role !== "assistant" || index !== prompt.length - 1)) {
16+
+ throw new import_provider.UnsupportedFunctionalityError({
17+
+ functionality: "prefix on non-final assistant message"
18+
+ });
19+
+ }
20+
switch (message.role) {
21+
case "system": {
22+
systemMessage = message.content;
23+
@@ -124,10 +130,14 @@ function convertToBuiltInAIMessages(prompt) {
24+
}
25+
}
26+
}
27+
- messages.push({
28+
+ const assistantMessage = {
29+
role: "assistant",
30+
content: text
31+
- });
32+
+ };
33+
+ if (prefix) {
34+
+ assistantMessage.prefix = true;
35+
+ }
36+
+ messages.push(assistantMessage);
37+
break;
38+
}
39+
case "tool": {
40+
diff --git a/dist/index.mjs b/dist/index.mjs
41+
index 4c346c33f370c5682b911734cda1402f40603afb..42fa23c6b9be6415b73b9d097627a8d1a3d91e54 100644
42+
--- a/dist/index.mjs
43+
+++ b/dist/index.mjs
44+
@@ -35,7 +35,13 @@ function convertFileData(data, mediaType) {
45+
function convertToBuiltInAIMessages(prompt) {
46+
let systemMessage;
47+
const messages = [];
48+
- for (const message of prompt) {
49+
+ for (const [index, message] of prompt.entries()) {
50+
+ const prefix = !!message.providerOptions?.["browser-ai"]?.prefix;
51+
+ if (prefix && (message.role !== "assistant" || index !== prompt.length - 1)) {
52+
+ throw new UnsupportedFunctionalityError({
53+
+ functionality: "prefix on non-final assistant message"
54+
+ });
55+
+ }
56+
switch (message.role) {
57+
case "system": {
58+
systemMessage = message.content;
59+
@@ -97,10 +103,14 @@ function convertToBuiltInAIMessages(prompt) {
60+
}
61+
}
62+
}
63+
- messages.push({
64+
+ const assistantMessage = {
65+
role: "assistant",
66+
content: text
67+
- });
68+
+ };
69+
+ if (prefix) {
70+
+ assistantMessage.prefix = true;
71+
+ }
72+
+ messages.push(assistantMessage);
73+
break;
74+
}
75+
case "tool": {

bun.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
"typescript": "^5.6.3"
5252
},
5353
"patchedDependencies": {
54-
"@ai-sdk/openai-compatible@1.0.27": ".bun-patches/@ai-sdk%2Fopenai-compatible@1.0.27.patch"
54+
"@ai-sdk/openai-compatible@1.0.27": ".bun-patches/@ai-sdk%2Fopenai-compatible@1.0.27.patch",
55+
"@built-in-ai/core@2.0.1": ".bun-patches/@built-in-ai%2Fcore@2.0.1.patch"
5556
}
5657
}

src/ai/sendMessage.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,16 +70,29 @@ export const sendMessage = async (
7070
const assistantId = shouldAppendToAssistant
7171
? lastMessage._metadata.uuid
7272
: createAssistantAfter(resolvedParentId);
73+
const shouldPrefixAssistant =
74+
provider.kind === "built-in" && shouldAppendToAssistant;
7375
setNodeStatus(assistantId, "streaming");
7476
setActiveTarget(assistantId);
7577
const abortController = new AbortController();
7678
streamManager.register(assistantId, abortController);
7779
const modelMessages = contextMessages
7880
.filter((message) => message.role !== "tool")
79-
.map((message) => ({
80-
role: message.role as "system" | "user" | "assistant",
81-
content: message.content,
82-
})) as ModelMessage[];
81+
.map((message) => {
82+
const base = {
83+
role: message.role as "system" | "user" | "assistant",
84+
content: message.content,
85+
};
86+
if (shouldPrefixAssistant && message._metadata.uuid === assistantId) {
87+
return {
88+
...base,
89+
providerOptions: {
90+
"browser-ai": { prefix: true },
91+
},
92+
};
93+
}
94+
return base;
95+
}) as ModelMessage[];
8396
try {
8497
const stream = streamText({
8598
model,

0 commit comments

Comments
 (0)