ai 2.2.26 → 2.2.28
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/index.d.ts +15 -6
- package/dist/index.js +106 -71
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +106 -71
- package/dist/index.mjs.map +1 -0
- package/package.json +22 -12
- package/prompts/dist/index.d.ts +5 -1
- package/prompts/dist/index.js +1 -0
- package/prompts/dist/index.js.map +1 -0
- package/prompts/dist/index.mjs +1 -0
- package/prompts/dist/index.mjs.map +1 -0
- package/react/dist/index.d.ts +12 -4
- package/react/dist/index.js +273 -196
- package/react/dist/index.js.map +1 -0
- package/react/dist/index.mjs +273 -196
- package/react/dist/index.mjs.map +1 -0
- package/react/dist/index.server.js +1 -0
- package/react/dist/index.server.js.map +1 -0
- package/react/dist/index.server.mjs +1 -0
- package/react/dist/index.server.mjs.map +1 -0
- package/solid/dist/index.d.ts +4 -1
- package/solid/dist/index.js +248 -152
- package/solid/dist/index.js.map +1 -0
- package/solid/dist/index.mjs +248 -152
- package/solid/dist/index.mjs.map +1 -0
- package/svelte/dist/index.d.ts +4 -1
- package/svelte/dist/index.js +244 -151
- package/svelte/dist/index.js.map +1 -0
- package/svelte/dist/index.mjs +244 -151
- package/svelte/dist/index.mjs.map +1 -0
- package/vue/dist/index.d.ts +4 -1
- package/vue/dist/index.js +246 -147
- package/vue/dist/index.js.map +1 -0
- package/vue/dist/index.mjs +246 -147
- package/vue/dist/index.mjs.map +1 -0
package/solid/dist/index.js
CHANGED
@@ -30,9 +30,6 @@ var import_solid_js = require("solid-js");
|
|
30
30
|
var import_solid_swr_store = require("solid-swr-store");
|
31
31
|
var import_swr_store = require("swr-store");
|
32
32
|
|
33
|
-
// shared/utils.ts
|
34
|
-
var import_non_secure = require("nanoid/non-secure");
|
35
|
-
|
36
33
|
// shared/stream-parts.ts
|
37
34
|
var textStreamPart = {
|
38
35
|
code: "0",
|
@@ -79,7 +76,7 @@ var errorStreamPart = {
|
|
79
76
|
return { type: "error", value };
|
80
77
|
}
|
81
78
|
};
|
82
|
-
var
|
79
|
+
var assistantMessageStreamPart = {
|
83
80
|
code: "4",
|
84
81
|
name: "assistant_message",
|
85
82
|
parse: (value) => {
|
@@ -96,7 +93,7 @@ var assistantMessage = {
|
|
96
93
|
};
|
97
94
|
}
|
98
95
|
};
|
99
|
-
var
|
96
|
+
var assistantControlDataStreamPart = {
|
100
97
|
code: "5",
|
101
98
|
name: "assistant_control_data",
|
102
99
|
parse: (value) => {
|
@@ -114,29 +111,47 @@ var assistantControlData = {
|
|
114
111
|
};
|
115
112
|
}
|
116
113
|
};
|
114
|
+
var dataMessageStreamPart = {
|
115
|
+
code: "6",
|
116
|
+
name: "data_message",
|
117
|
+
parse: (value) => {
|
118
|
+
if (value == null || typeof value !== "object" || !("role" in value) || !("data" in value) || typeof value.role !== "string" || value.role !== "data") {
|
119
|
+
throw new Error(
|
120
|
+
'"data_message" parts expect an object with a "role" and "data" property.'
|
121
|
+
);
|
122
|
+
}
|
123
|
+
return {
|
124
|
+
type: "data_message",
|
125
|
+
value
|
126
|
+
};
|
127
|
+
}
|
128
|
+
};
|
117
129
|
var streamParts = [
|
118
130
|
textStreamPart,
|
119
131
|
functionCallStreamPart,
|
120
132
|
dataStreamPart,
|
121
133
|
errorStreamPart,
|
122
|
-
|
123
|
-
|
134
|
+
assistantMessageStreamPart,
|
135
|
+
assistantControlDataStreamPart,
|
136
|
+
dataMessageStreamPart
|
124
137
|
];
|
125
138
|
var streamPartsByCode = {
|
126
139
|
[textStreamPart.code]: textStreamPart,
|
127
140
|
[functionCallStreamPart.code]: functionCallStreamPart,
|
128
141
|
[dataStreamPart.code]: dataStreamPart,
|
129
142
|
[errorStreamPart.code]: errorStreamPart,
|
130
|
-
[
|
131
|
-
[
|
143
|
+
[assistantMessageStreamPart.code]: assistantMessageStreamPart,
|
144
|
+
[assistantControlDataStreamPart.code]: assistantControlDataStreamPart,
|
145
|
+
[dataMessageStreamPart.code]: dataMessageStreamPart
|
132
146
|
};
|
133
147
|
var StreamStringPrefixes = {
|
134
148
|
[textStreamPart.name]: textStreamPart.code,
|
135
149
|
[functionCallStreamPart.name]: functionCallStreamPart.code,
|
136
150
|
[dataStreamPart.name]: dataStreamPart.code,
|
137
151
|
[errorStreamPart.name]: errorStreamPart.code,
|
138
|
-
[
|
139
|
-
[
|
152
|
+
[assistantMessageStreamPart.name]: assistantMessageStreamPart.code,
|
153
|
+
[assistantControlDataStreamPart.name]: assistantControlDataStreamPart.code,
|
154
|
+
[dataMessageStreamPart.name]: dataMessageStreamPart.code
|
140
155
|
};
|
141
156
|
var validCodes = streamParts.map((part) => part.code);
|
142
157
|
var parseStreamPart = (line) => {
|
@@ -154,7 +169,51 @@ var parseStreamPart = (line) => {
|
|
154
169
|
return streamPartsByCode[code].parse(jsonValue);
|
155
170
|
};
|
156
171
|
|
172
|
+
// shared/read-data-stream.ts
|
173
|
+
var NEWLINE = "\n".charCodeAt(0);
|
174
|
+
function concatChunks(chunks, totalLength) {
|
175
|
+
const concatenatedChunks = new Uint8Array(totalLength);
|
176
|
+
let offset = 0;
|
177
|
+
for (const chunk of chunks) {
|
178
|
+
concatenatedChunks.set(chunk, offset);
|
179
|
+
offset += chunk.length;
|
180
|
+
}
|
181
|
+
chunks.length = 0;
|
182
|
+
return concatenatedChunks;
|
183
|
+
}
|
184
|
+
async function* readDataStream(reader, {
|
185
|
+
isAborted
|
186
|
+
} = {}) {
|
187
|
+
const decoder = new TextDecoder();
|
188
|
+
const chunks = [];
|
189
|
+
let totalLength = 0;
|
190
|
+
while (true) {
|
191
|
+
const { value } = await reader.read();
|
192
|
+
if (value) {
|
193
|
+
chunks.push(value);
|
194
|
+
totalLength += value.length;
|
195
|
+
if (value[value.length - 1] !== NEWLINE) {
|
196
|
+
continue;
|
197
|
+
}
|
198
|
+
}
|
199
|
+
if (chunks.length === 0) {
|
200
|
+
break;
|
201
|
+
}
|
202
|
+
const concatenatedChunks = concatChunks(chunks, totalLength);
|
203
|
+
totalLength = 0;
|
204
|
+
const streamParts2 = decoder.decode(concatenatedChunks, { stream: true }).split("\n").filter((line) => line !== "").map(parseStreamPart);
|
205
|
+
for (const streamPart of streamParts2) {
|
206
|
+
yield streamPart;
|
207
|
+
}
|
208
|
+
if (isAborted == null ? void 0 : isAborted()) {
|
209
|
+
reader.cancel();
|
210
|
+
break;
|
211
|
+
}
|
212
|
+
}
|
213
|
+
}
|
214
|
+
|
157
215
|
// shared/utils.ts
|
216
|
+
var import_non_secure = require("nanoid/non-secure");
|
158
217
|
var nanoid = (0, import_non_secure.customAlphabet)(
|
159
218
|
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
|
160
219
|
7
|
@@ -185,80 +244,47 @@ async function parseComplexResponse({
|
|
185
244
|
getCurrentDate = () => /* @__PURE__ */ new Date()
|
186
245
|
}) {
|
187
246
|
const createdAt = getCurrentDate();
|
188
|
-
const decode = createChunkDecoder(true);
|
189
247
|
const prefixMap = {
|
190
248
|
data: []
|
191
249
|
};
|
192
|
-
const
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
}
|
204
|
-
if (chunks.length === 0) {
|
205
|
-
break;
|
206
|
-
}
|
207
|
-
let concatenatedChunks = new Uint8Array(totalLength);
|
208
|
-
let offset = 0;
|
209
|
-
for (const chunk of chunks) {
|
210
|
-
concatenatedChunks.set(chunk, offset);
|
211
|
-
offset += chunk.length;
|
212
|
-
}
|
213
|
-
chunks.length = 0;
|
214
|
-
totalLength = 0;
|
215
|
-
const lines = decode(concatenatedChunks);
|
216
|
-
if (typeof lines === "string") {
|
217
|
-
throw new Error(
|
218
|
-
"Invalid response format. Complex mode was set but the response is a string. This should never happen."
|
219
|
-
);
|
220
|
-
}
|
221
|
-
for (const { type, value: value2 } of lines) {
|
222
|
-
if (type === "text") {
|
223
|
-
if (prefixMap["text"]) {
|
224
|
-
prefixMap["text"] = {
|
225
|
-
...prefixMap["text"],
|
226
|
-
content: (prefixMap["text"].content || "") + value2
|
227
|
-
};
|
228
|
-
} else {
|
229
|
-
prefixMap["text"] = {
|
230
|
-
id: generateId(),
|
231
|
-
role: "assistant",
|
232
|
-
content: value2,
|
233
|
-
createdAt
|
234
|
-
};
|
235
|
-
}
|
236
|
-
}
|
237
|
-
let functionCallMessage = null;
|
238
|
-
if (type === "function_call") {
|
239
|
-
prefixMap["function_call"] = {
|
250
|
+
for await (const { type, value } of readDataStream(reader, {
|
251
|
+
isAborted: () => (abortControllerRef == null ? void 0 : abortControllerRef.current) === null
|
252
|
+
})) {
|
253
|
+
if (type === "text") {
|
254
|
+
if (prefixMap["text"]) {
|
255
|
+
prefixMap["text"] = {
|
256
|
+
...prefixMap["text"],
|
257
|
+
content: (prefixMap["text"].content || "") + value
|
258
|
+
};
|
259
|
+
} else {
|
260
|
+
prefixMap["text"] = {
|
240
261
|
id: generateId(),
|
241
262
|
role: "assistant",
|
242
|
-
content:
|
243
|
-
function_call: value2.function_call,
|
244
|
-
name: value2.function_call.name,
|
263
|
+
content: value,
|
245
264
|
createdAt
|
246
265
|
};
|
247
|
-
functionCallMessage = prefixMap["function_call"];
|
248
|
-
}
|
249
|
-
if (type === "data") {
|
250
|
-
prefixMap["data"].push(...value2);
|
251
|
-
}
|
252
|
-
const responseMessage = prefixMap["text"];
|
253
|
-
const merged = [functionCallMessage, responseMessage].filter(
|
254
|
-
Boolean
|
255
|
-
);
|
256
|
-
update(merged, [...prefixMap["data"]]);
|
257
|
-
if ((abortControllerRef == null ? void 0 : abortControllerRef.current) === null) {
|
258
|
-
reader.cancel();
|
259
|
-
break;
|
260
266
|
}
|
261
267
|
}
|
268
|
+
let functionCallMessage = null;
|
269
|
+
if (type === "function_call") {
|
270
|
+
prefixMap["function_call"] = {
|
271
|
+
id: generateId(),
|
272
|
+
role: "assistant",
|
273
|
+
content: "",
|
274
|
+
function_call: value.function_call,
|
275
|
+
name: value.function_call.name,
|
276
|
+
createdAt
|
277
|
+
};
|
278
|
+
functionCallMessage = prefixMap["function_call"];
|
279
|
+
}
|
280
|
+
if (type === "data") {
|
281
|
+
prefixMap["data"].push(...value);
|
282
|
+
}
|
283
|
+
const responseMessage = prefixMap["text"];
|
284
|
+
const merged = [functionCallMessage, responseMessage].filter(
|
285
|
+
Boolean
|
286
|
+
);
|
287
|
+
update(merged, [...prefixMap["data"]]);
|
262
288
|
}
|
263
289
|
onFinish == null ? void 0 : onFinish(prefixMap);
|
264
290
|
return {
|
@@ -269,8 +295,8 @@ async function parseComplexResponse({
|
|
269
295
|
};
|
270
296
|
}
|
271
297
|
|
272
|
-
// shared/call-api.ts
|
273
|
-
async function
|
298
|
+
// shared/call-chat-api.ts
|
299
|
+
async function callChatApi({
|
274
300
|
api,
|
275
301
|
messages,
|
276
302
|
body,
|
@@ -479,7 +505,7 @@ function useChat({
|
|
479
505
|
getStreamedResponse: async () => {
|
480
506
|
var _a;
|
481
507
|
const existingData = (_a = streamData()) != null ? _a : [];
|
482
|
-
return await
|
508
|
+
return await callChatApi({
|
483
509
|
api,
|
484
510
|
messages: sendExtraMessageFields ? chatRequest.messages : chatRequest.messages.map(
|
485
511
|
({ role, content, name, function_call }) => ({
|
@@ -597,8 +623,117 @@ function useChat({
|
|
597
623
|
|
598
624
|
// solid/use-completion.ts
|
599
625
|
var import_solid_js2 = require("solid-js");
|
600
|
-
var import_swr_store2 = require("swr-store");
|
601
626
|
var import_solid_swr_store2 = require("solid-swr-store");
|
627
|
+
var import_swr_store2 = require("swr-store");
|
628
|
+
|
629
|
+
// shared/call-completion-api.ts
|
630
|
+
async function callCompletionApi({
|
631
|
+
api,
|
632
|
+
prompt,
|
633
|
+
credentials,
|
634
|
+
headers,
|
635
|
+
body,
|
636
|
+
setCompletion,
|
637
|
+
setLoading,
|
638
|
+
setError,
|
639
|
+
setAbortController,
|
640
|
+
onResponse,
|
641
|
+
onFinish,
|
642
|
+
onError,
|
643
|
+
onData
|
644
|
+
}) {
|
645
|
+
try {
|
646
|
+
setLoading(true);
|
647
|
+
setError(void 0);
|
648
|
+
const abortController = new AbortController();
|
649
|
+
setAbortController(abortController);
|
650
|
+
setCompletion("");
|
651
|
+
const res = await fetch(api, {
|
652
|
+
method: "POST",
|
653
|
+
body: JSON.stringify({
|
654
|
+
prompt,
|
655
|
+
...body
|
656
|
+
}),
|
657
|
+
credentials,
|
658
|
+
headers: {
|
659
|
+
"Content-Type": "application/json",
|
660
|
+
...headers
|
661
|
+
},
|
662
|
+
signal: abortController.signal
|
663
|
+
}).catch((err) => {
|
664
|
+
throw err;
|
665
|
+
});
|
666
|
+
if (onResponse) {
|
667
|
+
try {
|
668
|
+
await onResponse(res);
|
669
|
+
} catch (err) {
|
670
|
+
throw err;
|
671
|
+
}
|
672
|
+
}
|
673
|
+
if (!res.ok) {
|
674
|
+
throw new Error(
|
675
|
+
await res.text() || "Failed to fetch the chat response."
|
676
|
+
);
|
677
|
+
}
|
678
|
+
if (!res.body) {
|
679
|
+
throw new Error("The response body is empty.");
|
680
|
+
}
|
681
|
+
let result = "";
|
682
|
+
const reader = res.body.getReader();
|
683
|
+
const isComplexMode = res.headers.get(COMPLEX_HEADER) === "true";
|
684
|
+
if (isComplexMode) {
|
685
|
+
for await (const { type, value } of readDataStream(reader, {
|
686
|
+
isAborted: () => abortController === null
|
687
|
+
})) {
|
688
|
+
switch (type) {
|
689
|
+
case "text": {
|
690
|
+
result += value;
|
691
|
+
setCompletion(result);
|
692
|
+
break;
|
693
|
+
}
|
694
|
+
case "data": {
|
695
|
+
onData == null ? void 0 : onData(value);
|
696
|
+
break;
|
697
|
+
}
|
698
|
+
}
|
699
|
+
}
|
700
|
+
} else {
|
701
|
+
const decoder = createChunkDecoder();
|
702
|
+
while (true) {
|
703
|
+
const { done, value } = await reader.read();
|
704
|
+
if (done) {
|
705
|
+
break;
|
706
|
+
}
|
707
|
+
result += decoder(value);
|
708
|
+
setCompletion(result);
|
709
|
+
if (abortController === null) {
|
710
|
+
reader.cancel();
|
711
|
+
break;
|
712
|
+
}
|
713
|
+
}
|
714
|
+
}
|
715
|
+
if (onFinish) {
|
716
|
+
onFinish(prompt, result);
|
717
|
+
}
|
718
|
+
setAbortController(null);
|
719
|
+
return result;
|
720
|
+
} catch (err) {
|
721
|
+
if (err.name === "AbortError") {
|
722
|
+
setAbortController(null);
|
723
|
+
return null;
|
724
|
+
}
|
725
|
+
if (err instanceof Error) {
|
726
|
+
if (onError) {
|
727
|
+
onError(err);
|
728
|
+
}
|
729
|
+
}
|
730
|
+
setError(err);
|
731
|
+
} finally {
|
732
|
+
setLoading(false);
|
733
|
+
}
|
734
|
+
}
|
735
|
+
|
736
|
+
// solid/use-completion.ts
|
602
737
|
var uniqueId2 = 0;
|
603
738
|
var store2 = {};
|
604
739
|
var completionApiStore = (0, import_swr_store2.createSWRStore)({
|
@@ -633,80 +768,39 @@ function useCompletion({
|
|
633
768
|
};
|
634
769
|
const completion = data;
|
635
770
|
const [error, setError] = (0, import_solid_js2.createSignal)(void 0);
|
771
|
+
const [streamData, setStreamData] = (0, import_solid_js2.createSignal)(
|
772
|
+
void 0
|
773
|
+
);
|
636
774
|
const [isLoading, setIsLoading] = (0, import_solid_js2.createSignal)(false);
|
637
775
|
let abortController = null;
|
638
|
-
async function triggerRequest(prompt, options) {
|
639
|
-
try {
|
640
|
-
setError(void 0);
|
641
|
-
setIsLoading(true);
|
642
|
-
abortController = new AbortController();
|
643
|
-
mutate("");
|
644
|
-
const res = await fetch(api, {
|
645
|
-
method: "POST",
|
646
|
-
body: JSON.stringify({
|
647
|
-
prompt,
|
648
|
-
...body,
|
649
|
-
...options == null ? void 0 : options.body
|
650
|
-
}),
|
651
|
-
headers: {
|
652
|
-
...headers,
|
653
|
-
...options == null ? void 0 : options.headers
|
654
|
-
},
|
655
|
-
signal: abortController.signal,
|
656
|
-
credentials
|
657
|
-
}).catch((err) => {
|
658
|
-
throw err;
|
659
|
-
});
|
660
|
-
if (onResponse) {
|
661
|
-
try {
|
662
|
-
await onResponse(res);
|
663
|
-
} catch (err) {
|
664
|
-
throw err;
|
665
|
-
}
|
666
|
-
}
|
667
|
-
if (!res.ok) {
|
668
|
-
throw new Error(
|
669
|
-
await res.text() || "Failed to fetch the chat response."
|
670
|
-
);
|
671
|
-
}
|
672
|
-
if (!res.body) {
|
673
|
-
throw new Error("The response body is empty.");
|
674
|
-
}
|
675
|
-
let result = "";
|
676
|
-
const reader = res.body.getReader();
|
677
|
-
const decoder = createChunkDecoder();
|
678
|
-
while (true) {
|
679
|
-
const { done, value } = await reader.read();
|
680
|
-
if (done) {
|
681
|
-
break;
|
682
|
-
}
|
683
|
-
result += decoder(value);
|
684
|
-
mutate(result);
|
685
|
-
if (abortController === null) {
|
686
|
-
reader.cancel();
|
687
|
-
break;
|
688
|
-
}
|
689
|
-
}
|
690
|
-
if (onFinish) {
|
691
|
-
onFinish(prompt, result);
|
692
|
-
}
|
693
|
-
abortController = null;
|
694
|
-
return result;
|
695
|
-
} catch (err) {
|
696
|
-
if (err.name === "AbortError") {
|
697
|
-
abortController = null;
|
698
|
-
return null;
|
699
|
-
}
|
700
|
-
if (onError && error instanceof Error) {
|
701
|
-
onError(error);
|
702
|
-
}
|
703
|
-
setError(err);
|
704
|
-
} finally {
|
705
|
-
setIsLoading(false);
|
706
|
-
}
|
707
|
-
}
|
708
776
|
const complete = async (prompt, options) => {
|
709
|
-
|
777
|
+
var _a;
|
778
|
+
const existingData = (_a = streamData()) != null ? _a : [];
|
779
|
+
return callCompletionApi({
|
780
|
+
api,
|
781
|
+
prompt,
|
782
|
+
credentials,
|
783
|
+
headers: {
|
784
|
+
...headers,
|
785
|
+
...options == null ? void 0 : options.headers
|
786
|
+
},
|
787
|
+
body: {
|
788
|
+
...body,
|
789
|
+
...options == null ? void 0 : options.body
|
790
|
+
},
|
791
|
+
setCompletion: mutate,
|
792
|
+
setLoading: setIsLoading,
|
793
|
+
setError,
|
794
|
+
setAbortController: (controller) => {
|
795
|
+
abortController = controller;
|
796
|
+
},
|
797
|
+
onResponse,
|
798
|
+
onFinish,
|
799
|
+
onError,
|
800
|
+
onData: (data2) => {
|
801
|
+
setStreamData([...existingData, ...data2 != null ? data2 : []]);
|
802
|
+
}
|
803
|
+
});
|
710
804
|
};
|
711
805
|
const stop = () => {
|
712
806
|
if (abortController) {
|
@@ -734,7 +828,8 @@ function useCompletion({
|
|
734
828
|
input,
|
735
829
|
setInput,
|
736
830
|
handleSubmit,
|
737
|
-
isLoading
|
831
|
+
isLoading,
|
832
|
+
data: streamData
|
738
833
|
};
|
739
834
|
}
|
740
835
|
// Annotate the CommonJS export names for ESM import in node:
|
@@ -742,3 +837,4 @@ function useCompletion({
|
|
742
837
|
useChat,
|
743
838
|
useCompletion
|
744
839
|
});
|
840
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../index.ts","../use-chat.ts","../../shared/stream-parts.ts","../../shared/read-data-stream.ts","../../shared/utils.ts","../../shared/parse-complex-response.ts","../../shared/call-chat-api.ts","../../shared/process-chat-stream.ts","../use-completion.ts","../../shared/call-completion-api.ts"],"sourcesContent":["export * from './use-chat';\nexport * from './use-completion';\n","import { Accessor, Resource, Setter, createSignal } from 'solid-js';\nimport { useSWRStore } from 'solid-swr-store';\nimport { createSWRStore } from 'swr-store';\nimport { callChatApi } from '../shared/call-chat-api';\nimport { processChatStream } from '../shared/process-chat-stream';\nimport type {\n ChatRequest,\n CreateMessage,\n JSONValue,\n Message,\n RequestOptions,\n UseChatOptions,\n} from '../shared/types';\nimport { nanoid } from '../shared/utils';\n\nexport type { CreateMessage, Message, UseChatOptions };\n\nexport type UseChatHelpers = {\n /** Current messages in the chat */\n messages: Resource<Message[]>;\n /** The error object of the API request */\n error: Accessor<undefined | Error>;\n /**\n * Append a user message to the chat list. This triggers the API call to fetch\n * the assistant's response.\n * @param message The message to append\n * @param options Additional options to pass to the API call\n */\n append: (\n message: Message | CreateMessage,\n options?: RequestOptions,\n ) => Promise<string | null | undefined>;\n /**\n * Reload the last AI chat response for the given chat history. If the last\n * message isn't from the assistant, it will request the API to generate a\n * new response.\n */\n reload: (options?: RequestOptions) => Promise<string | null | undefined>;\n /**\n * Abort the current request immediately, keep the generated tokens if any.\n */\n stop: () => void;\n /**\n * Update the `messages` state locally. This is useful when you want to\n * edit the messages on the client, and then trigger the `reload` method\n * manually to regenerate the AI response.\n */\n setMessages: (messages: Message[]) => void;\n /** The current value of the input */\n input: Accessor<string>;\n /** Signal setter to update the input value */\n setInput: Setter<string>;\n /** Form submission handler to automatically reset input and append a user message */\n handleSubmit: (e: any) => void;\n /** Whether the API request is in progress */\n isLoading: Accessor<boolean>;\n /** Additional data added on the server via StreamData */\n data: Accessor<JSONValue[] | undefined>;\n};\n\nlet uniqueId = 0;\n\nconst store: Record<string, Message[] | undefined> = {};\nconst chatApiStore = createSWRStore<Message[], string[]>({\n get: async (key: string) => {\n return store[key] ?? [];\n },\n});\n\nexport function useChat({\n api = '/api/chat',\n id,\n initialMessages = [],\n initialInput = '',\n sendExtraMessageFields,\n experimental_onFunctionCall,\n onResponse,\n onFinish,\n onError,\n credentials,\n headers,\n body,\n generateId = nanoid,\n}: UseChatOptions = {}): UseChatHelpers {\n // Generate a unique ID for the chat if not provided.\n const chatId = id || `chat-${uniqueId++}`;\n\n const key = `${api}|${chatId}`;\n\n // Because of the `initialData` option, the `data` will never be `undefined`:\n const messages = useSWRStore(chatApiStore, () => [key], {\n initialData: initialMessages,\n }) as Resource<Message[]>;\n\n const mutate = (data: Message[]) => {\n store[key] = data;\n return chatApiStore.mutate([key], {\n status: 'success',\n data,\n });\n };\n\n const [error, setError] = createSignal<undefined | Error>(undefined);\n const [streamData, setStreamData] = createSignal<JSONValue[] | undefined>(\n undefined,\n );\n const [isLoading, setIsLoading] = createSignal(false);\n\n let abortController: AbortController | null = null;\n async function triggerRequest(\n messagesSnapshot: Message[],\n options?: RequestOptions,\n ) {\n try {\n setError(undefined);\n setIsLoading(true);\n\n abortController = new AbortController();\n\n const getCurrentMessages = () =>\n chatApiStore.get([key], {\n shouldRevalidate: false,\n });\n\n // Do an optimistic update to the chat state to show the updated messages\n // immediately.\n const previousMessages = getCurrentMessages();\n mutate(messagesSnapshot);\n\n let chatRequest: ChatRequest = {\n messages: messagesSnapshot,\n options,\n };\n\n await processChatStream({\n getStreamedResponse: async () => {\n const existingData = streamData() ?? [];\n\n return await callChatApi({\n api,\n messages: sendExtraMessageFields\n ? chatRequest.messages\n : chatRequest.messages.map(\n ({ role, content, name, function_call }) => ({\n role,\n content,\n ...(name !== undefined && { name }),\n ...(function_call !== undefined && {\n function_call,\n }),\n }),\n ),\n body: {\n ...body,\n ...options?.body,\n },\n headers: {\n ...headers,\n ...options?.headers,\n },\n abortController: () => abortController,\n credentials,\n onResponse,\n onUpdate(merged, data) {\n mutate([...chatRequest.messages, ...merged]);\n setStreamData([...existingData, ...(data ?? [])]);\n },\n onFinish,\n appendMessage(message) {\n mutate([...chatRequest.messages, message]);\n },\n restoreMessagesOnFailure() {\n // Restore the previous messages if the request fails.\n if (previousMessages.status === 'success') {\n mutate(previousMessages.data);\n }\n },\n generateId,\n });\n },\n experimental_onFunctionCall,\n updateChatRequest(newChatRequest) {\n chatRequest = newChatRequest;\n },\n getCurrentMessages: () => getCurrentMessages().data,\n });\n\n abortController = null;\n } catch (err) {\n // Ignore abort errors as they are expected.\n if ((err as any).name === 'AbortError') {\n abortController = null;\n return null;\n }\n\n if (onError && err instanceof Error) {\n onError(err);\n }\n\n setError(err as Error);\n } finally {\n setIsLoading(false);\n }\n }\n\n const append: UseChatHelpers['append'] = async (message, options) => {\n if (!message.id) {\n message.id = generateId();\n }\n return triggerRequest(\n (messages() ?? []).concat(message as Message),\n options,\n );\n };\n\n const reload: UseChatHelpers['reload'] = async options => {\n const messagesSnapshot = messages();\n if (!messagesSnapshot || messagesSnapshot.length === 0) return null;\n\n const lastMessage = messagesSnapshot[messagesSnapshot.length - 1];\n if (lastMessage.role === 'assistant') {\n return triggerRequest(messagesSnapshot.slice(0, -1), options);\n }\n return triggerRequest(messagesSnapshot, options);\n };\n\n const stop = () => {\n if (abortController) {\n abortController.abort();\n abortController = null;\n }\n };\n\n const setMessages = (messages: Message[]) => {\n mutate(messages);\n };\n\n const [input, setInput] = createSignal(initialInput);\n\n const handleSubmit = (e: any) => {\n e.preventDefault();\n const inputValue = input();\n if (!inputValue) return;\n append({\n content: inputValue,\n role: 'user',\n createdAt: new Date(),\n });\n setInput('');\n };\n\n return {\n messages,\n append,\n error,\n reload,\n stop,\n setMessages,\n input,\n setInput,\n handleSubmit,\n isLoading,\n data: streamData,\n };\n}\n","import {\n AssistantMessage,\n DataMessage,\n FunctionCall,\n JSONValue,\n} from './types';\nimport { StreamString } from './utils';\n\nexport interface StreamPart<CODE extends string, NAME extends string, TYPE> {\n code: CODE;\n name: NAME;\n parse: (value: JSONValue) => { type: NAME; value: TYPE };\n}\n\nconst textStreamPart: StreamPart<'0', 'text', string> = {\n code: '0',\n name: 'text',\n parse: (value: JSONValue) => {\n if (typeof value !== 'string') {\n throw new Error('\"text\" parts expect a string value.');\n }\n return { type: 'text', value };\n },\n};\n\nconst functionCallStreamPart: StreamPart<\n '1',\n 'function_call',\n { function_call: FunctionCall }\n> = {\n code: '1',\n name: 'function_call',\n parse: (value: JSONValue) => {\n if (\n value == null ||\n typeof value !== 'object' ||\n !('function_call' in value) ||\n typeof value.function_call !== 'object' ||\n value.function_call == null ||\n !('name' in value.function_call) ||\n !('arguments' in value.function_call) ||\n typeof value.function_call.name !== 'string' ||\n typeof value.function_call.arguments !== 'string'\n ) {\n throw new Error(\n '\"function_call\" parts expect an object with a \"function_call\" property.',\n );\n }\n\n return {\n type: 'function_call',\n value: value as unknown as { function_call: FunctionCall },\n };\n },\n};\n\nconst dataStreamPart: StreamPart<'2', 'data', Array<JSONValue>> = {\n code: '2',\n name: 'data',\n parse: (value: JSONValue) => {\n if (!Array.isArray(value)) {\n throw new Error('\"data\" parts expect an array value.');\n }\n\n return { type: 'data', value };\n },\n};\n\nconst errorStreamPart: StreamPart<'3', 'error', string> = {\n code: '3',\n name: 'error',\n parse: (value: JSONValue) => {\n if (typeof value !== 'string') {\n throw new Error('\"error\" parts expect a string value.');\n }\n return { type: 'error', value };\n },\n};\n\nconst assistantMessageStreamPart: StreamPart<\n '4',\n 'assistant_message',\n AssistantMessage\n> = {\n code: '4',\n name: 'assistant_message',\n parse: (value: JSONValue) => {\n if (\n value == null ||\n typeof value !== 'object' ||\n !('id' in value) ||\n !('role' in value) ||\n !('content' in value) ||\n typeof value.id !== 'string' ||\n typeof value.role !== 'string' ||\n value.role !== 'assistant' ||\n !Array.isArray(value.content) ||\n !value.content.every(\n item =>\n item != null &&\n typeof item === 'object' &&\n 'type' in item &&\n item.type === 'text' &&\n 'text' in item &&\n item.text != null &&\n typeof item.text === 'object' &&\n 'value' in item.text &&\n typeof item.text.value === 'string',\n )\n ) {\n throw new Error(\n '\"assistant_message\" parts expect an object with an \"id\", \"role\", and \"content\" property.',\n );\n }\n\n return {\n type: 'assistant_message',\n value: value as AssistantMessage,\n };\n },\n};\n\nconst assistantControlDataStreamPart: StreamPart<\n '5',\n 'assistant_control_data',\n {\n threadId: string;\n messageId: string;\n }\n> = {\n code: '5',\n name: 'assistant_control_data',\n parse: (value: JSONValue) => {\n if (\n value == null ||\n typeof value !== 'object' ||\n !('threadId' in value) ||\n !('messageId' in value) ||\n typeof value.threadId !== 'string' ||\n typeof value.messageId !== 'string'\n ) {\n throw new Error(\n '\"assistant_control_data\" parts expect an object with a \"threadId\" and \"messageId\" property.',\n );\n }\n\n return {\n type: 'assistant_control_data',\n value: {\n threadId: value.threadId,\n messageId: value.messageId,\n },\n };\n },\n};\n\nconst dataMessageStreamPart: StreamPart<'6', 'data_message', DataMessage> = {\n code: '6',\n name: 'data_message',\n parse: (value: JSONValue) => {\n if (\n value == null ||\n typeof value !== 'object' ||\n !('role' in value) ||\n !('data' in value) ||\n typeof value.role !== 'string' ||\n value.role !== 'data'\n ) {\n throw new Error(\n '\"data_message\" parts expect an object with a \"role\" and \"data\" property.',\n );\n }\n\n return {\n type: 'data_message',\n value: value as DataMessage,\n };\n },\n};\n\nconst streamParts = [\n textStreamPart,\n functionCallStreamPart,\n dataStreamPart,\n errorStreamPart,\n assistantMessageStreamPart,\n assistantControlDataStreamPart,\n dataMessageStreamPart,\n] as const;\n\n// union type of all stream parts\ntype StreamParts =\n | typeof textStreamPart\n | typeof functionCallStreamPart\n | typeof dataStreamPart\n | typeof errorStreamPart\n | typeof assistantMessageStreamPart\n | typeof assistantControlDataStreamPart\n | typeof dataMessageStreamPart;\n\n/**\n * Maps the type of a stream part to its value type.\n */\ntype StreamPartValueType = {\n [P in StreamParts as P['name']]: ReturnType<P['parse']>['value'];\n};\n\nexport type StreamPartType =\n | ReturnType<typeof textStreamPart.parse>\n | ReturnType<typeof functionCallStreamPart.parse>\n | ReturnType<typeof dataStreamPart.parse>\n | ReturnType<typeof errorStreamPart.parse>\n | ReturnType<typeof assistantMessageStreamPart.parse>\n | ReturnType<typeof assistantControlDataStreamPart.parse>\n | ReturnType<typeof dataMessageStreamPart.parse>;\n\nexport const streamPartsByCode = {\n [textStreamPart.code]: textStreamPart,\n [functionCallStreamPart.code]: functionCallStreamPart,\n [dataStreamPart.code]: dataStreamPart,\n [errorStreamPart.code]: errorStreamPart,\n [assistantMessageStreamPart.code]: assistantMessageStreamPart,\n [assistantControlDataStreamPart.code]: assistantControlDataStreamPart,\n [dataMessageStreamPart.code]: dataMessageStreamPart,\n} as const;\n\n/**\n * The map of prefixes for data in the stream\n *\n * - 0: Text from the LLM response\n * - 1: (OpenAI) function_call responses\n * - 2: custom JSON added by the user using `Data`\n *\n * Example:\n * ```\n * 0:Vercel\n * 0:'s\n * 0: AI\n * 0: AI\n * 0: SDK\n * 0: is great\n * 0:!\n * 2: { \"someJson\": \"value\" }\n * 1: {\"function_call\": {\"name\": \"get_current_weather\", \"arguments\": \"{\\\\n\\\\\"location\\\\\": \\\\\"Charlottesville, Virginia\\\\\",\\\\n\\\\\"format\\\\\": \\\\\"celsius\\\\\"\\\\n}\"}}\n *```\n */\nexport const StreamStringPrefixes = {\n [textStreamPart.name]: textStreamPart.code,\n [functionCallStreamPart.name]: functionCallStreamPart.code,\n [dataStreamPart.name]: dataStreamPart.code,\n [errorStreamPart.name]: errorStreamPart.code,\n [assistantMessageStreamPart.name]: assistantMessageStreamPart.code,\n [assistantControlDataStreamPart.name]: assistantControlDataStreamPart.code,\n [dataMessageStreamPart.name]: dataMessageStreamPart.code,\n} as const;\n\nexport const validCodes = streamParts.map(part => part.code);\n\n/**\n * Parses a stream part from a string.\n *\n * @param line The string to parse.\n * @returns The parsed stream part.\n * @throws An error if the string cannot be parsed.\n */\nexport const parseStreamPart = (line: string): StreamPartType => {\n const firstSeparatorIndex = line.indexOf(':');\n\n if (firstSeparatorIndex === -1) {\n throw new Error('Failed to parse stream string. No separator found.');\n }\n\n const prefix = line.slice(0, firstSeparatorIndex);\n\n if (!validCodes.includes(prefix as keyof typeof streamPartsByCode)) {\n throw new Error(`Failed to parse stream string. Invalid code ${prefix}.`);\n }\n\n const code = prefix as keyof typeof streamPartsByCode;\n\n const textValue = line.slice(firstSeparatorIndex + 1);\n const jsonValue: JSONValue = JSON.parse(textValue);\n\n return streamPartsByCode[code].parse(jsonValue);\n};\n\n/**\n * Prepends a string with a prefix from the `StreamChunkPrefixes`, JSON-ifies it,\n * and appends a new line.\n *\n * It ensures type-safety for the part type and value.\n */\nexport function formatStreamPart<T extends keyof StreamPartValueType>(\n type: T,\n value: StreamPartValueType[T],\n): StreamString {\n const streamPart = streamParts.find(part => part.name === type);\n\n if (!streamPart) {\n throw new Error(`Invalid stream part type: ${type}`);\n }\n\n return `${streamPart.code}:${JSON.stringify(value)}\\n`;\n}\n","import { StreamPartType, parseStreamPart } from './stream-parts';\n\nconst NEWLINE = '\\n'.charCodeAt(0);\n\n// concatenates all the chunks into a single Uint8Array\nfunction concatChunks(chunks: Uint8Array[], totalLength: number) {\n const concatenatedChunks = new Uint8Array(totalLength);\n\n let offset = 0;\n for (const chunk of chunks) {\n concatenatedChunks.set(chunk, offset);\n offset += chunk.length;\n }\n chunks.length = 0;\n\n return concatenatedChunks;\n}\n\nexport async function* readDataStream(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n {\n isAborted,\n }: {\n isAborted?: () => boolean;\n } = {},\n): AsyncGenerator<StreamPartType> {\n // implementation note: this slightly more complex algorithm is required\n // to pass the tests in the edge environment.\n\n const decoder = new TextDecoder();\n const chunks: Uint8Array[] = [];\n let totalLength = 0;\n\n while (true) {\n const { value } = await reader.read();\n\n if (value) {\n chunks.push(value);\n totalLength += value.length;\n if (value[value.length - 1] !== NEWLINE) {\n // if the last character is not a newline, we have not read the whole JSON value\n continue;\n }\n }\n\n if (chunks.length === 0) {\n break; // we have reached the end of the stream\n }\n\n const concatenatedChunks = concatChunks(chunks, totalLength);\n totalLength = 0;\n\n const streamParts = decoder\n .decode(concatenatedChunks, { stream: true })\n .split('\\n')\n .filter(line => line !== '') // splitting leaves an empty string at the end\n .map(parseStreamPart);\n\n for (const streamPart of streamParts) {\n yield streamPart;\n }\n\n // The request has been aborted, stop reading the stream.\n if (isAborted?.()) {\n reader.cancel();\n break;\n }\n }\n}\n","import { customAlphabet } from 'nanoid/non-secure';\nimport {\n StreamPartType,\n StreamStringPrefixes,\n parseStreamPart,\n} from './stream-parts';\n\n// 7-character random string\nexport const nanoid = customAlphabet(\n '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n 7,\n);\n\n// simple decoder signatures:\nfunction createChunkDecoder(): (chunk: Uint8Array | undefined) => string;\nfunction createChunkDecoder(\n complex: false,\n): (chunk: Uint8Array | undefined) => string;\n// complex decoder signature:\nfunction createChunkDecoder(\n complex: true,\n): (chunk: Uint8Array | undefined) => StreamPartType[];\n// combined signature for when the client calls this function with a boolean:\nfunction createChunkDecoder(\n complex?: boolean,\n): (chunk: Uint8Array | undefined) => StreamPartType[] | string;\nfunction createChunkDecoder(complex?: boolean) {\n const decoder = new TextDecoder();\n\n if (!complex) {\n return function (chunk: Uint8Array | undefined): string {\n if (!chunk) return '';\n return decoder.decode(chunk, { stream: true });\n };\n }\n\n return function (chunk: Uint8Array | undefined) {\n const decoded = decoder\n .decode(chunk, { stream: true })\n .split('\\n')\n .filter(line => line !== ''); // splitting leaves an empty string at the end\n\n return decoded.map(parseStreamPart).filter(Boolean);\n };\n}\n\nexport { createChunkDecoder };\n\nexport const isStreamStringEqualToType = (\n type: keyof typeof StreamStringPrefixes,\n value: string,\n): value is StreamString =>\n value.startsWith(`${StreamStringPrefixes[type]}:`) && value.endsWith('\\n');\n\nexport type StreamString =\n `${(typeof StreamStringPrefixes)[keyof typeof StreamStringPrefixes]}:${string}\\n`;\n\n/**\n * A header sent to the client so it knows how to handle parsing the stream (as a deprecated text response or using the new prefixed protocol)\n */\nexport const COMPLEX_HEADER = 'X-Experimental-Stream-Data';\n","import { readDataStream } from './read-data-stream';\nimport type { FunctionCall, JSONValue, Message } from './types';\nimport { nanoid } from './utils';\n\ntype PrefixMap = {\n text?: Message;\n function_call?: Message & {\n role: 'assistant';\n function_call: FunctionCall;\n };\n data: JSONValue[];\n};\n\nexport async function parseComplexResponse({\n reader,\n abortControllerRef,\n update,\n onFinish,\n generateId = nanoid,\n getCurrentDate = () => new Date(),\n}: {\n reader: ReadableStreamDefaultReader<Uint8Array>;\n abortControllerRef?: {\n current: AbortController | null;\n };\n update: (merged: Message[], data: JSONValue[] | undefined) => void;\n onFinish?: (prefixMap: PrefixMap) => void;\n generateId?: () => string;\n getCurrentDate?: () => Date;\n}) {\n const createdAt = getCurrentDate();\n const prefixMap: PrefixMap = {\n data: [],\n };\n\n // we create a map of each prefix, and for each prefixed message we push to the map\n for await (const { type, value } of readDataStream(reader, {\n isAborted: () => abortControllerRef?.current === null,\n })) {\n if (type === 'text') {\n if (prefixMap['text']) {\n prefixMap['text'] = {\n ...prefixMap['text'],\n content: (prefixMap['text'].content || '') + value,\n };\n } else {\n prefixMap['text'] = {\n id: generateId(),\n role: 'assistant',\n content: value,\n createdAt,\n };\n }\n }\n\n let functionCallMessage: Message | null = null;\n\n if (type === 'function_call') {\n prefixMap['function_call'] = {\n id: generateId(),\n role: 'assistant',\n content: '',\n function_call: value.function_call,\n name: value.function_call.name,\n createdAt,\n };\n\n functionCallMessage = prefixMap['function_call'];\n }\n\n if (type === 'data') {\n prefixMap['data'].push(...value);\n }\n\n const responseMessage = prefixMap['text'];\n\n // We add function calls and response messages to the messages[], but data is its own thing\n const merged = [functionCallMessage, responseMessage].filter(\n Boolean,\n ) as Message[];\n\n update(merged, [...prefixMap['data']]); // make a copy of the data array\n }\n\n onFinish?.(prefixMap);\n\n return {\n messages: [prefixMap.text, prefixMap.function_call].filter(\n Boolean,\n ) as Message[],\n data: prefixMap.data,\n };\n}\n","import { parseComplexResponse } from './parse-complex-response';\nimport { FunctionCall, IdGenerator, JSONValue, Message } from './types';\nimport { COMPLEX_HEADER, createChunkDecoder } from './utils';\n\nexport async function callChatApi({\n api,\n messages,\n body,\n credentials,\n headers,\n abortController,\n appendMessage,\n restoreMessagesOnFailure,\n onResponse,\n onUpdate,\n onFinish,\n generateId,\n}: {\n api: string;\n messages: Omit<Message, 'id'>[];\n body: Record<string, any>;\n credentials?: RequestCredentials;\n headers?: HeadersInit;\n abortController?: () => AbortController | null;\n restoreMessagesOnFailure: () => void;\n appendMessage: (message: Message) => void;\n onResponse?: (response: Response) => void | Promise<void>;\n onUpdate: (merged: Message[], data: JSONValue[] | undefined) => void;\n onFinish?: (message: Message) => void;\n generateId: IdGenerator;\n}) {\n const response = await fetch(api, {\n method: 'POST',\n body: JSON.stringify({\n messages,\n ...body,\n }),\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n signal: abortController?.()?.signal,\n credentials,\n }).catch(err => {\n restoreMessagesOnFailure();\n throw err;\n });\n\n if (onResponse) {\n try {\n await onResponse(response);\n } catch (err) {\n throw err;\n }\n }\n\n if (!response.ok) {\n restoreMessagesOnFailure();\n throw new Error(\n (await response.text()) || 'Failed to fetch the chat response.',\n );\n }\n\n if (!response.body) {\n throw new Error('The response body is empty.');\n }\n\n const reader = response.body.getReader();\n const isComplexMode = response.headers.get(COMPLEX_HEADER) === 'true';\n\n if (isComplexMode) {\n return await parseComplexResponse({\n reader,\n abortControllerRef:\n abortController != null ? { current: abortController() } : undefined,\n update: onUpdate,\n onFinish(prefixMap) {\n if (onFinish && prefixMap.text != null) {\n onFinish(prefixMap.text);\n }\n },\n generateId,\n });\n } else {\n const createdAt = new Date();\n const decode = createChunkDecoder(false);\n\n // TODO-STREAMDATA: Remove this once Stream Data is not experimental\n let streamedResponse = '';\n const replyId = generateId();\n let responseMessage: Message = {\n id: replyId,\n createdAt,\n content: '',\n role: 'assistant',\n };\n\n // TODO-STREAMDATA: Remove this once Stream Data is not experimental\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n // Update the chat state with the new message tokens.\n streamedResponse += decode(value);\n\n if (streamedResponse.startsWith('{\"function_call\":')) {\n // While the function call is streaming, it will be a string.\n responseMessage['function_call'] = streamedResponse;\n } else {\n responseMessage['content'] = streamedResponse;\n }\n\n appendMessage({ ...responseMessage });\n\n // The request has been aborted, stop reading the stream.\n if (abortController?.() === null) {\n reader.cancel();\n break;\n }\n }\n\n if (streamedResponse.startsWith('{\"function_call\":')) {\n // Once the stream is complete, the function call is parsed into an object.\n const parsedFunctionCall: FunctionCall =\n JSON.parse(streamedResponse).function_call;\n\n responseMessage['function_call'] = parsedFunctionCall;\n\n appendMessage({ ...responseMessage });\n }\n\n if (onFinish) {\n onFinish(responseMessage);\n }\n\n return responseMessage;\n }\n}\n","import { ChatRequest, FunctionCall, JSONValue, Message } from './types';\n\nexport async function processChatStream({\n getStreamedResponse,\n experimental_onFunctionCall,\n updateChatRequest,\n getCurrentMessages,\n}: {\n getStreamedResponse: () => Promise<\n Message | { messages: Message[]; data: JSONValue[] }\n >;\n experimental_onFunctionCall?: (\n chatMessages: Message[],\n functionCall: FunctionCall,\n ) => Promise<void | ChatRequest>;\n updateChatRequest: (chatRequest: ChatRequest) => void;\n getCurrentMessages: () => Message[];\n}) {\n while (true) {\n // TODO-STREAMDATA: This should be { const { messages: streamedResponseMessages, data } =\n // await getStreamedResponse(} once Stream Data is not experimental\n const messagesAndDataOrJustMessage = await getStreamedResponse();\n\n // Using experimental stream data\n if ('messages' in messagesAndDataOrJustMessage) {\n let hasFollowingResponse = false;\n for (const message of messagesAndDataOrJustMessage.messages) {\n if (\n message.function_call === undefined ||\n typeof message.function_call === 'string'\n ) {\n continue;\n }\n hasFollowingResponse = true;\n // Streamed response is a function call, invoke the function call handler if it exists.\n if (experimental_onFunctionCall) {\n const functionCall = message.function_call;\n\n // User handles the function call in their own functionCallHandler.\n // The \"arguments\" key of the function call object will still be a string which will have to be parsed in the function handler.\n // If the \"arguments\" JSON is malformed due to model error the user will have to handle that themselves.\n\n const functionCallResponse: ChatRequest | void =\n await experimental_onFunctionCall(\n getCurrentMessages(),\n functionCall,\n );\n\n // If the user does not return anything as a result of the function call, the loop will break.\n if (functionCallResponse === undefined) {\n hasFollowingResponse = false;\n break;\n }\n\n // A function call response was returned.\n // The updated chat with function call response will be sent to the API in the next iteration of the loop.\n updateChatRequest(functionCallResponse);\n }\n }\n if (!hasFollowingResponse) {\n break;\n }\n } else {\n const streamedResponseMessage = messagesAndDataOrJustMessage;\n // TODO-STREAMDATA: Remove this once Stream Data is not experimental\n if (\n streamedResponseMessage.function_call === undefined ||\n typeof streamedResponseMessage.function_call === 'string'\n ) {\n break;\n }\n\n // Streamed response is a function call, invoke the function call handler if it exists.\n if (experimental_onFunctionCall) {\n const functionCall = streamedResponseMessage.function_call;\n const functionCallResponse: ChatRequest | void =\n await experimental_onFunctionCall(getCurrentMessages(), functionCall);\n\n // If the user does not return anything as a result of the function call, the loop will break.\n if (functionCallResponse === undefined) break;\n // A function call response was returned.\n // The updated chat with function call response will be sent to the API in the next iteration of the loop.\n updateChatRequest(functionCallResponse);\n }\n }\n }\n}\n","import { Accessor, Resource, Setter, createSignal } from 'solid-js';\nimport { useSWRStore } from 'solid-swr-store';\nimport { createSWRStore } from 'swr-store';\nimport { callCompletionApi } from '../shared/call-completion-api';\nimport type {\n JSONValue,\n RequestOptions,\n UseCompletionOptions,\n} from '../shared/types';\n\nexport type UseCompletionHelpers = {\n /** The current completion result */\n completion: Resource<string>;\n /** The error object of the API request */\n error: Accessor<undefined | Error>;\n /**\n * Send a new prompt to the API endpoint and update the completion state.\n */\n complete: (\n prompt: string,\n options?: RequestOptions,\n ) => Promise<string | null | undefined>;\n /**\n * Abort the current API request but keep the generated tokens.\n */\n stop: () => void;\n /**\n * Update the `completion` state locally.\n */\n setCompletion: (completion: string) => void;\n /** The current value of the input */\n input: Accessor<string>;\n /** Signal Setter to update the input value */\n setInput: Setter<string>;\n /**\n * Form submission handler to automatically reset input and append a user message\n * @example\n * ```jsx\n * <form onSubmit={handleSubmit}>\n * <input value={input()} />\n * </form>\n * ```\n */\n handleSubmit: (e: any) => void;\n /** Whether the API request is in progress */\n isLoading: Accessor<boolean>;\n /** Additional data added on the server via StreamData */\n data: Accessor<JSONValue[] | undefined>;\n};\n\nlet uniqueId = 0;\n\nconst store: Record<string, any> = {};\nconst completionApiStore = createSWRStore<any, string[]>({\n get: async (key: string) => {\n return store[key] ?? [];\n },\n});\n\nexport function useCompletion({\n api = '/api/completion',\n id,\n initialCompletion = '',\n initialInput = '',\n credentials,\n headers,\n body,\n onResponse,\n onFinish,\n onError,\n}: UseCompletionOptions = {}): UseCompletionHelpers {\n // Generate an unique id for the completion if not provided.\n const completionId = id || `completion-${uniqueId++}`;\n\n const key = `${api}|${completionId}`;\n const data = useSWRStore(completionApiStore, () => [key], {\n initialData: initialCompletion,\n });\n\n const mutate = (data: string) => {\n store[key] = data;\n return completionApiStore.mutate([key], {\n data,\n status: 'success',\n });\n };\n\n // Because of the `initialData` option, the `data` will never be `undefined`.\n const completion = data as Resource<string>;\n\n const [error, setError] = createSignal<undefined | Error>(undefined);\n const [streamData, setStreamData] = createSignal<JSONValue[] | undefined>(\n undefined,\n );\n const [isLoading, setIsLoading] = createSignal(false);\n\n let abortController: AbortController | null = null;\n\n const complete: UseCompletionHelpers['complete'] = async (\n prompt: string,\n options?: RequestOptions,\n ) => {\n const existingData = streamData() ?? [];\n return callCompletionApi({\n api,\n prompt,\n credentials,\n headers: {\n ...headers,\n ...options?.headers,\n },\n body: {\n ...body,\n ...options?.body,\n },\n setCompletion: mutate,\n setLoading: setIsLoading,\n setError,\n setAbortController: controller => {\n abortController = controller;\n },\n onResponse,\n onFinish,\n onError,\n onData: data => {\n setStreamData([...existingData, ...(data ?? [])]);\n },\n });\n };\n\n const stop = () => {\n if (abortController) {\n abortController.abort();\n abortController = null;\n }\n };\n\n const setCompletion = (completion: string) => {\n mutate(completion);\n };\n\n const [input, setInput] = createSignal(initialInput);\n\n const handleSubmit = (e: any) => {\n e.preventDefault();\n const inputValue = input();\n if (!inputValue) return;\n return complete(inputValue);\n };\n\n return {\n completion,\n complete,\n error,\n stop,\n setCompletion,\n input,\n setInput,\n handleSubmit,\n isLoading,\n data: streamData,\n };\n}\n","import { readDataStream } from './read-data-stream';\nimport { JSONValue } from './types';\nimport { COMPLEX_HEADER, createChunkDecoder } from './utils';\n\nexport async function callCompletionApi({\n api,\n prompt,\n credentials,\n headers,\n body,\n setCompletion,\n setLoading,\n setError,\n setAbortController,\n onResponse,\n onFinish,\n onError,\n onData,\n}: {\n api: string;\n prompt: string;\n credentials?: RequestCredentials;\n headers?: HeadersInit;\n body: Record<string, any>;\n setCompletion: (completion: string) => void;\n setLoading: (loading: boolean) => void;\n setError: (error: Error | undefined) => void;\n setAbortController: (abortController: AbortController | null) => void;\n onResponse?: (response: Response) => void | Promise<void>;\n onFinish?: (prompt: string, completion: string) => void;\n onError?: (error: Error) => void;\n onData?: (data: JSONValue[]) => void;\n}) {\n try {\n setLoading(true);\n setError(undefined);\n\n const abortController = new AbortController();\n setAbortController(abortController);\n\n // Empty the completion immediately.\n setCompletion('');\n\n const res = await fetch(api, {\n method: 'POST',\n body: JSON.stringify({\n prompt,\n ...body,\n }),\n credentials,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n signal: abortController.signal,\n }).catch(err => {\n throw err;\n });\n\n if (onResponse) {\n try {\n await onResponse(res);\n } catch (err) {\n throw err;\n }\n }\n\n if (!res.ok) {\n throw new Error(\n (await res.text()) || 'Failed to fetch the chat response.',\n );\n }\n\n if (!res.body) {\n throw new Error('The response body is empty.');\n }\n\n let result = '';\n const reader = res.body.getReader();\n\n const isComplexMode = res.headers.get(COMPLEX_HEADER) === 'true';\n\n if (isComplexMode) {\n for await (const { type, value } of readDataStream(reader, {\n isAborted: () => abortController === null,\n })) {\n switch (type) {\n case 'text': {\n result += value;\n setCompletion(result);\n break;\n }\n case 'data': {\n onData?.(value);\n break;\n }\n }\n }\n } else {\n const decoder = createChunkDecoder();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n // Update the completion state with the new message tokens.\n result += decoder(value);\n setCompletion(result);\n\n // The request has been aborted, stop reading the stream.\n if (abortController === null) {\n reader.cancel();\n break;\n }\n }\n }\n\n if (onFinish) {\n onFinish(prompt, result);\n }\n\n setAbortController(null);\n return result;\n } catch (err) {\n // Ignore abort errors as they are expected.\n if ((err as any).name === 'AbortError') {\n setAbortController(null);\n return null;\n }\n\n if (err instanceof Error) {\n if (onError) {\n onError(err);\n }\n }\n\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n}\n"],"mappings":"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","names":["streamParts","messages","import_solid_js","import_solid_swr_store","import_swr_store","uniqueId","store","data","completion"]}
|