ai 2.2.22 → 2.2.23

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 CHANGED
@@ -64,6 +64,7 @@ type ChatRequest = {
64
64
  options?: RequestOptions;
65
65
  functions?: Array<Function>;
66
66
  function_call?: FunctionCall;
67
+ data?: Record<string, string>;
67
68
  };
68
69
  type FunctionCallHandler = (chatMessages: Message[], functionCall: FunctionCall) => Promise<ChatRequest | void>;
69
70
  type RequestOptions = {
@@ -74,6 +75,7 @@ type ChatRequestOptions = {
74
75
  options?: RequestOptions;
75
76
  functions?: Array<Function>;
76
77
  function_call?: FunctionCall;
78
+ data?: Record<string, string>;
77
79
  };
78
80
  type UseChatOptions = {
79
81
  /**
@@ -623,7 +625,7 @@ declare const getStreamString: (type: keyof typeof StreamStringPrefixes, value:
623
625
  type StreamString = `${(typeof StreamStringPrefixes)[keyof typeof StreamStringPrefixes]}:${string}\n`;
624
626
  declare const getStreamStringTypeAndValue: (line: string) => {
625
627
  type: keyof typeof StreamStringPrefixes;
626
- value: string;
628
+ value: JSONValue;
627
629
  };
628
630
  /**
629
631
  * 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)
@@ -639,6 +641,7 @@ declare const COMPLEX_HEADER = "X-Experimental-Stream-Data";
639
641
  * It is naive as unlike the StreamingTextResponse, it does not send the diff
640
642
  * between the rows, but flushing the full payload on each row.
641
643
  */
644
+
642
645
  type UINode = string | JSX.Element | JSX.Element[] | null | undefined;
643
646
  type Payload = {
644
647
  ui: UINode | Promise<UINode>;
@@ -654,7 +657,9 @@ declare class experimental_StreamingReactResponse {
654
657
  constructor(res: ReadableStream, options?: {
655
658
  ui?: (message: {
656
659
  content: string;
660
+ data?: JSONValue[] | undefined;
657
661
  }) => UINode | Promise<UINode>;
662
+ data?: experimental_StreamData;
658
663
  });
659
664
  }
660
665
 
package/dist/index.js CHANGED
@@ -193,6 +193,9 @@ var getStreamString = (type, value) => `${StreamStringPrefixes[type]}:${JSON.str
193
193
  `;
194
194
  var getStreamStringTypeAndValue = (line) => {
195
195
  const firstSeperatorIndex = line.indexOf(":");
196
+ if (firstSeperatorIndex === -1) {
197
+ throw new Error("Failed to parse stream string");
198
+ }
196
199
  const prefix = line.slice(0, firstSeperatorIndex);
197
200
  const type = Object.keys(StreamStringPrefixes).find(
198
201
  (key) => StreamStringPrefixes[key] === Number(prefix)
@@ -712,6 +715,104 @@ async function ReplicateStream(res, cb, options) {
712
715
  );
713
716
  }
714
717
 
718
+ // react/parse-complex-response.ts
719
+ async function parseComplexResponse({
720
+ reader,
721
+ abortControllerRef,
722
+ update,
723
+ onFinish
724
+ }) {
725
+ const decode = createChunkDecoder(true);
726
+ const createdAt = /* @__PURE__ */ new Date();
727
+ const prefixMap = {};
728
+ const NEWLINE = "\n".charCodeAt(0);
729
+ let chunks = [];
730
+ let totalLength = 0;
731
+ while (true) {
732
+ const { value } = await reader.read();
733
+ if (value) {
734
+ chunks.push(value);
735
+ totalLength += value.length;
736
+ if (value[value.length - 1] !== NEWLINE) {
737
+ continue;
738
+ }
739
+ }
740
+ if (chunks.length === 0) {
741
+ break;
742
+ }
743
+ let concatenatedChunks = new Uint8Array(totalLength);
744
+ let offset = 0;
745
+ for (const chunk of chunks) {
746
+ concatenatedChunks.set(chunk, offset);
747
+ offset += chunk.length;
748
+ }
749
+ chunks.length = 0;
750
+ totalLength = 0;
751
+ const lines = decode(concatenatedChunks);
752
+ if (typeof lines === "string") {
753
+ throw new Error(
754
+ "Invalid response format. Complex mode was set but the response is a string. This should never happen."
755
+ );
756
+ }
757
+ for (const { type, value: value2 } of lines) {
758
+ if (type === "text") {
759
+ if (prefixMap["text"]) {
760
+ prefixMap["text"] = {
761
+ ...prefixMap["text"],
762
+ content: (prefixMap["text"].content || "") + value2
763
+ };
764
+ } else {
765
+ prefixMap["text"] = {
766
+ id: nanoid(),
767
+ role: "assistant",
768
+ content: value2,
769
+ createdAt
770
+ };
771
+ }
772
+ }
773
+ let functionCallMessage = null;
774
+ if (type === "function_call") {
775
+ prefixMap["function_call"] = value2;
776
+ let functionCall = prefixMap["function_call"];
777
+ if (functionCall && typeof functionCall === "string") {
778
+ const parsedFunctionCall = JSON.parse(
779
+ functionCall
780
+ ).function_call;
781
+ functionCallMessage = {
782
+ id: nanoid(),
783
+ role: "assistant",
784
+ content: "",
785
+ function_call: parsedFunctionCall,
786
+ name: parsedFunctionCall.name,
787
+ createdAt
788
+ };
789
+ prefixMap["function_call"] = functionCallMessage;
790
+ }
791
+ }
792
+ if (type === "data") {
793
+ const parsedValue = JSON.parse(value2);
794
+ if (prefixMap["data"]) {
795
+ prefixMap["data"] = [...prefixMap["data"], ...parsedValue];
796
+ } else {
797
+ prefixMap["data"] = parsedValue;
798
+ }
799
+ }
800
+ const data = prefixMap["data"];
801
+ const responseMessage = prefixMap["text"];
802
+ const merged = [functionCallMessage, responseMessage].filter(
803
+ Boolean
804
+ );
805
+ update(merged, data);
806
+ if ((abortControllerRef == null ? void 0 : abortControllerRef.current) === null) {
807
+ reader.cancel();
808
+ break;
809
+ }
810
+ }
811
+ }
812
+ onFinish == null ? void 0 : onFinish(prefixMap);
813
+ return prefixMap;
814
+ }
815
+
715
816
  // streams/streaming-react-response.ts
716
817
  var experimental_StreamingReactResponse = class {
717
818
  constructor(res, options) {
@@ -720,6 +821,39 @@ var experimental_StreamingReactResponse = class {
720
821
  let next = new Promise((resolve) => {
721
822
  resolveFunc = resolve;
722
823
  });
824
+ if (options == null ? void 0 : options.data) {
825
+ const processedStream = res.pipeThrough(
826
+ options.data.stream
827
+ );
828
+ let lastPayload = void 0;
829
+ parseComplexResponse({
830
+ reader: processedStream.getReader(),
831
+ update: (merged, data) => {
832
+ var _a, _b, _c;
833
+ const content2 = (_b = (_a = merged[0]) == null ? void 0 : _a.content) != null ? _b : "";
834
+ const ui = ((_c = options == null ? void 0 : options.ui) == null ? void 0 : _c.call(options, { content: content2, data })) || content2;
835
+ const payload = { ui, content: content2 };
836
+ const resolvePrevious = resolveFunc;
837
+ const nextRow = new Promise((resolve) => {
838
+ resolveFunc = resolve;
839
+ });
840
+ resolvePrevious({
841
+ next: nextRow,
842
+ ...payload
843
+ });
844
+ lastPayload = payload;
845
+ },
846
+ onFinish: () => {
847
+ if (lastPayload !== void 0) {
848
+ resolveFunc({
849
+ next: null,
850
+ ...lastPayload
851
+ });
852
+ }
853
+ }
854
+ });
855
+ return next;
856
+ }
723
857
  let content = "";
724
858
  const decode = createChunkDecoder();
725
859
  const reader = res.getReader();
package/dist/index.mjs CHANGED
@@ -147,6 +147,9 @@ var getStreamString = (type, value) => `${StreamStringPrefixes[type]}:${JSON.str
147
147
  `;
148
148
  var getStreamStringTypeAndValue = (line) => {
149
149
  const firstSeperatorIndex = line.indexOf(":");
150
+ if (firstSeperatorIndex === -1) {
151
+ throw new Error("Failed to parse stream string");
152
+ }
150
153
  const prefix = line.slice(0, firstSeperatorIndex);
151
154
  const type = Object.keys(StreamStringPrefixes).find(
152
155
  (key) => StreamStringPrefixes[key] === Number(prefix)
@@ -666,6 +669,104 @@ async function ReplicateStream(res, cb, options) {
666
669
  );
667
670
  }
668
671
 
672
+ // react/parse-complex-response.ts
673
+ async function parseComplexResponse({
674
+ reader,
675
+ abortControllerRef,
676
+ update,
677
+ onFinish
678
+ }) {
679
+ const decode = createChunkDecoder(true);
680
+ const createdAt = /* @__PURE__ */ new Date();
681
+ const prefixMap = {};
682
+ const NEWLINE = "\n".charCodeAt(0);
683
+ let chunks = [];
684
+ let totalLength = 0;
685
+ while (true) {
686
+ const { value } = await reader.read();
687
+ if (value) {
688
+ chunks.push(value);
689
+ totalLength += value.length;
690
+ if (value[value.length - 1] !== NEWLINE) {
691
+ continue;
692
+ }
693
+ }
694
+ if (chunks.length === 0) {
695
+ break;
696
+ }
697
+ let concatenatedChunks = new Uint8Array(totalLength);
698
+ let offset = 0;
699
+ for (const chunk of chunks) {
700
+ concatenatedChunks.set(chunk, offset);
701
+ offset += chunk.length;
702
+ }
703
+ chunks.length = 0;
704
+ totalLength = 0;
705
+ const lines = decode(concatenatedChunks);
706
+ if (typeof lines === "string") {
707
+ throw new Error(
708
+ "Invalid response format. Complex mode was set but the response is a string. This should never happen."
709
+ );
710
+ }
711
+ for (const { type, value: value2 } of lines) {
712
+ if (type === "text") {
713
+ if (prefixMap["text"]) {
714
+ prefixMap["text"] = {
715
+ ...prefixMap["text"],
716
+ content: (prefixMap["text"].content || "") + value2
717
+ };
718
+ } else {
719
+ prefixMap["text"] = {
720
+ id: nanoid(),
721
+ role: "assistant",
722
+ content: value2,
723
+ createdAt
724
+ };
725
+ }
726
+ }
727
+ let functionCallMessage = null;
728
+ if (type === "function_call") {
729
+ prefixMap["function_call"] = value2;
730
+ let functionCall = prefixMap["function_call"];
731
+ if (functionCall && typeof functionCall === "string") {
732
+ const parsedFunctionCall = JSON.parse(
733
+ functionCall
734
+ ).function_call;
735
+ functionCallMessage = {
736
+ id: nanoid(),
737
+ role: "assistant",
738
+ content: "",
739
+ function_call: parsedFunctionCall,
740
+ name: parsedFunctionCall.name,
741
+ createdAt
742
+ };
743
+ prefixMap["function_call"] = functionCallMessage;
744
+ }
745
+ }
746
+ if (type === "data") {
747
+ const parsedValue = JSON.parse(value2);
748
+ if (prefixMap["data"]) {
749
+ prefixMap["data"] = [...prefixMap["data"], ...parsedValue];
750
+ } else {
751
+ prefixMap["data"] = parsedValue;
752
+ }
753
+ }
754
+ const data = prefixMap["data"];
755
+ const responseMessage = prefixMap["text"];
756
+ const merged = [functionCallMessage, responseMessage].filter(
757
+ Boolean
758
+ );
759
+ update(merged, data);
760
+ if ((abortControllerRef == null ? void 0 : abortControllerRef.current) === null) {
761
+ reader.cancel();
762
+ break;
763
+ }
764
+ }
765
+ }
766
+ onFinish == null ? void 0 : onFinish(prefixMap);
767
+ return prefixMap;
768
+ }
769
+
669
770
  // streams/streaming-react-response.ts
670
771
  var experimental_StreamingReactResponse = class {
671
772
  constructor(res, options) {
@@ -674,6 +775,39 @@ var experimental_StreamingReactResponse = class {
674
775
  let next = new Promise((resolve) => {
675
776
  resolveFunc = resolve;
676
777
  });
778
+ if (options == null ? void 0 : options.data) {
779
+ const processedStream = res.pipeThrough(
780
+ options.data.stream
781
+ );
782
+ let lastPayload = void 0;
783
+ parseComplexResponse({
784
+ reader: processedStream.getReader(),
785
+ update: (merged, data) => {
786
+ var _a, _b, _c;
787
+ const content2 = (_b = (_a = merged[0]) == null ? void 0 : _a.content) != null ? _b : "";
788
+ const ui = ((_c = options == null ? void 0 : options.ui) == null ? void 0 : _c.call(options, { content: content2, data })) || content2;
789
+ const payload = { ui, content: content2 };
790
+ const resolvePrevious = resolveFunc;
791
+ const nextRow = new Promise((resolve) => {
792
+ resolveFunc = resolve;
793
+ });
794
+ resolvePrevious({
795
+ next: nextRow,
796
+ ...payload
797
+ });
798
+ lastPayload = payload;
799
+ },
800
+ onFinish: () => {
801
+ if (lastPayload !== void 0) {
802
+ resolveFunc({
803
+ next: null,
804
+ ...lastPayload
805
+ });
806
+ }
807
+ }
808
+ });
809
+ return next;
810
+ }
677
811
  let content = "";
678
812
  const decode = createChunkDecoder();
679
813
  const reader = res.getReader();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai",
3
- "version": "2.2.22",
3
+ "version": "2.2.23",
4
4
  "license": "Apache-2.0",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.js",
@@ -54,10 +54,6 @@
54
54
  "require": "./solid/dist/index.js"
55
55
  }
56
56
  },
57
- "jest": {
58
- "preset": "ts-jest",
59
- "testEnvironment": "node"
60
- },
61
57
  "dependencies": {
62
58
  "eventsource-parser": "1.0.0",
63
59
  "nanoid": "3.3.6",
@@ -70,12 +66,17 @@
70
66
  "devDependencies": {
71
67
  "@edge-runtime/jest-environment": "1.1.0-beta.31",
72
68
  "@huggingface/inference": "2.6.4",
69
+ "@testing-library/jest-dom": "^6.1.4",
70
+ "@testing-library/react": "^14.0.0",
71
+ "@testing-library/user-event": "^14.5.1",
73
72
  "@types/jest": "29.2.0",
74
73
  "@types/node": "^17.0.12",
75
74
  "@types/react": "^18.2.8",
76
75
  "@types/react-dom": "^18.2.0",
77
76
  "eslint": "^7.32.0",
78
77
  "jest": "29.2.1",
78
+ "jest-environment-jsdom": "^29.7.0",
79
+ "jsdom": "^22.1.0",
79
80
  "langchain": "0.0.172",
80
81
  "openai": "4.16.1",
81
82
  "ts-jest": "29.0.3",
@@ -132,6 +133,9 @@
132
133
  "lint": "eslint \"./**/*.ts*\"",
133
134
  "type-check": "tsc --noEmit",
134
135
  "prettier-check": "prettier --check \"./**/*.ts*\"",
135
- "test": "jest --forceExit --env @edge-runtime/jest-environment .test.ts && jest --forceExit --env node .test.ts"
136
+ "test": "pnpm test:node && pnpm test:edge && pnpm test:ui",
137
+ "test:edge": "jest --forceExit --config jest.node.config.js --env @edge-runtime/jest-environment .test.ts ",
138
+ "test:node": "jest --forceExit --config jest.node.config.js --env node .test.ts",
139
+ "test:ui": "jest --forceExit --config jest.ui.config.js .ui.test.ts"
136
140
  }
137
141
  }
@@ -62,6 +62,7 @@ type ChatRequest = {
62
62
  options?: RequestOptions;
63
63
  functions?: Array<Function>;
64
64
  function_call?: FunctionCall;
65
+ data?: Record<string, string>;
65
66
  };
66
67
  type FunctionCallHandler = (chatMessages: Message[], functionCall: FunctionCall) => Promise<ChatRequest | void>;
67
68
  type RequestOptions = {
@@ -72,6 +73,7 @@ type ChatRequestOptions = {
72
73
  options?: RequestOptions;
73
74
  functions?: Array<Function>;
74
75
  function_call?: FunctionCall;
76
+ data?: Record<string, string>;
75
77
  };
76
78
  type UseChatOptions = {
77
79
  /**
@@ -197,6 +199,25 @@ type UseCompletionOptions = {
197
199
  */
198
200
  body?: object;
199
201
  };
202
+ type JSONValue = null | string | number | boolean | {
203
+ [x: string]: JSONValue;
204
+ } | Array<JSONValue>;
205
+
206
+ /**
207
+ * A stream wrapper to send custom JSON-encoded data back to the client.
208
+ */
209
+ declare class experimental_StreamData {
210
+ private encoder;
211
+ private controller;
212
+ stream: TransformStream<Uint8Array, Uint8Array>;
213
+ private isClosedPromise;
214
+ private isClosedPromiseResolver;
215
+ private isClosed;
216
+ private data;
217
+ constructor();
218
+ close(): Promise<void>;
219
+ append(value: JSONValue): void;
220
+ }
200
221
 
201
222
  /**
202
223
  * This is a naive implementation of the streaming React response API.
@@ -207,6 +228,7 @@ type UseCompletionOptions = {
207
228
  * It is naive as unlike the StreamingTextResponse, it does not send the diff
208
229
  * between the rows, but flushing the full payload on each row.
209
230
  */
231
+
210
232
  type UINode = string | JSX.Element | JSX.Element[] | null | undefined;
211
233
  /**
212
234
  * A utility class for streaming React responses.
@@ -215,7 +237,9 @@ declare class experimental_StreamingReactResponse {
215
237
  constructor(res: ReadableStream, options?: {
216
238
  ui?: (message: {
217
239
  content: string;
240
+ data?: JSONValue[] | undefined;
218
241
  }) => UINode | Promise<UINode>;
242
+ data?: experimental_StreamData;
219
243
  });
220
244
  }
221
245
 
@@ -263,6 +287,7 @@ type UseChatHelpers = {
263
287
  };
264
288
  type StreamingReactResponseAction = (payload: {
265
289
  messages: Message[];
290
+ data?: Record<string, string>;
266
291
  }) => Promise<experimental_StreamingReactResponse>;
267
292
  declare function useChat({ api, id, initialMessages, initialInput, sendExtraMessageFields, experimental_onFunctionCall, onResponse, onFinish, onError, credentials, headers, body, }?: Omit<UseChatOptions, 'api'> & {
268
293
  api?: string | StreamingReactResponseAction;
@@ -68,6 +68,9 @@ var StreamStringPrefixes = {
68
68
  };
69
69
  var getStreamStringTypeAndValue = (line) => {
70
70
  const firstSeperatorIndex = line.indexOf(":");
71
+ if (firstSeperatorIndex === -1) {
72
+ throw new Error("Failed to parse stream string");
73
+ }
71
74
  const prefix = line.slice(0, firstSeperatorIndex);
72
75
  const type = Object.keys(StreamStringPrefixes).find(
73
76
  (key) => StreamStringPrefixes[key] === Number(prefix)
@@ -90,7 +93,8 @@ var COMPLEX_HEADER = "X-Experimental-Stream-Data";
90
93
  async function parseComplexResponse({
91
94
  reader,
92
95
  abortControllerRef,
93
- update
96
+ update,
97
+ onFinish
94
98
  }) {
95
99
  const decode = createChunkDecoder(true);
96
100
  const createdAt = /* @__PURE__ */ new Date();
@@ -173,12 +177,13 @@ async function parseComplexResponse({
173
177
  Boolean
174
178
  );
175
179
  update(merged, data);
176
- if (abortControllerRef.current === null) {
180
+ if ((abortControllerRef == null ? void 0 : abortControllerRef.current) === null) {
177
181
  reader.cancel();
178
182
  break;
179
183
  }
180
184
  }
181
185
  }
186
+ onFinish == null ? void 0 : onFinish(prefixMap);
182
187
  return prefixMap;
183
188
  }
184
189
 
@@ -215,7 +220,8 @@ var getStreamedResponse = async (api, chatRequest, mutate, mutateStreamData, exi
215
220
  }
216
221
  try {
217
222
  const promise = api({
218
- messages: constructedMessagesPayload
223
+ messages: constructedMessagesPayload,
224
+ data: chatRequest.data
219
225
  });
220
226
  await readRow(promise);
221
227
  } catch (e) {
@@ -231,6 +237,7 @@ var getStreamedResponse = async (api, chatRequest, mutate, mutateStreamData, exi
231
237
  method: "POST",
232
238
  body: JSON.stringify({
233
239
  messages: constructedMessagesPayload,
240
+ data: chatRequest.data,
234
241
  ...extraMetadataRef.current.body,
235
242
  ...(_a = chatRequest.options) == null ? void 0 : _a.body,
236
243
  ...chatRequest.functions !== void 0 && {
@@ -468,13 +475,14 @@ function useChat({
468
475
  ]
469
476
  );
470
477
  const append = (0, import_react.useCallback)(
471
- async (message, { options, functions, function_call } = {}) => {
478
+ async (message, { options, functions, function_call, data } = {}) => {
472
479
  if (!message.id) {
473
480
  message.id = nanoid();
474
481
  }
475
482
  const chatRequest = {
476
483
  messages: messagesRef.current.concat(message),
477
484
  options,
485
+ data,
478
486
  ...functions !== void 0 && { functions },
479
487
  ...function_call !== void 0 && { function_call }
480
488
  };
@@ -521,7 +529,7 @@ function useChat({
521
529
  );
522
530
  const [input, setInput] = (0, import_react.useState)(initialInput);
523
531
  const handleSubmit = (0, import_react.useCallback)(
524
- (e, { options, functions, function_call } = {}, metadata) => {
532
+ (e, options = {}, metadata) => {
525
533
  if (metadata) {
526
534
  extraMetadataRef.current = {
527
535
  ...extraMetadataRef.current,
@@ -537,7 +545,7 @@ function useChat({
537
545
  role: "user",
538
546
  createdAt: /* @__PURE__ */ new Date()
539
547
  },
540
- { options, functions, function_call }
548
+ options
541
549
  );
542
550
  setInput("");
543
551
  },
@@ -32,6 +32,9 @@ var StreamStringPrefixes = {
32
32
  };
33
33
  var getStreamStringTypeAndValue = (line) => {
34
34
  const firstSeperatorIndex = line.indexOf(":");
35
+ if (firstSeperatorIndex === -1) {
36
+ throw new Error("Failed to parse stream string");
37
+ }
35
38
  const prefix = line.slice(0, firstSeperatorIndex);
36
39
  const type = Object.keys(StreamStringPrefixes).find(
37
40
  (key) => StreamStringPrefixes[key] === Number(prefix)
@@ -54,7 +57,8 @@ var COMPLEX_HEADER = "X-Experimental-Stream-Data";
54
57
  async function parseComplexResponse({
55
58
  reader,
56
59
  abortControllerRef,
57
- update
60
+ update,
61
+ onFinish
58
62
  }) {
59
63
  const decode = createChunkDecoder(true);
60
64
  const createdAt = /* @__PURE__ */ new Date();
@@ -137,12 +141,13 @@ async function parseComplexResponse({
137
141
  Boolean
138
142
  );
139
143
  update(merged, data);
140
- if (abortControllerRef.current === null) {
144
+ if ((abortControllerRef == null ? void 0 : abortControllerRef.current) === null) {
141
145
  reader.cancel();
142
146
  break;
143
147
  }
144
148
  }
145
149
  }
150
+ onFinish == null ? void 0 : onFinish(prefixMap);
146
151
  return prefixMap;
147
152
  }
148
153
 
@@ -179,7 +184,8 @@ var getStreamedResponse = async (api, chatRequest, mutate, mutateStreamData, exi
179
184
  }
180
185
  try {
181
186
  const promise = api({
182
- messages: constructedMessagesPayload
187
+ messages: constructedMessagesPayload,
188
+ data: chatRequest.data
183
189
  });
184
190
  await readRow(promise);
185
191
  } catch (e) {
@@ -195,6 +201,7 @@ var getStreamedResponse = async (api, chatRequest, mutate, mutateStreamData, exi
195
201
  method: "POST",
196
202
  body: JSON.stringify({
197
203
  messages: constructedMessagesPayload,
204
+ data: chatRequest.data,
198
205
  ...extraMetadataRef.current.body,
199
206
  ...(_a = chatRequest.options) == null ? void 0 : _a.body,
200
207
  ...chatRequest.functions !== void 0 && {
@@ -432,13 +439,14 @@ function useChat({
432
439
  ]
433
440
  );
434
441
  const append = useCallback(
435
- async (message, { options, functions, function_call } = {}) => {
442
+ async (message, { options, functions, function_call, data } = {}) => {
436
443
  if (!message.id) {
437
444
  message.id = nanoid();
438
445
  }
439
446
  const chatRequest = {
440
447
  messages: messagesRef.current.concat(message),
441
448
  options,
449
+ data,
442
450
  ...functions !== void 0 && { functions },
443
451
  ...function_call !== void 0 && { function_call }
444
452
  };
@@ -485,7 +493,7 @@ function useChat({
485
493
  );
486
494
  const [input, setInput] = useState(initialInput);
487
495
  const handleSubmit = useCallback(
488
- (e, { options, functions, function_call } = {}, metadata) => {
496
+ (e, options = {}, metadata) => {
489
497
  if (metadata) {
490
498
  extraMetadataRef.current = {
491
499
  ...extraMetadataRef.current,
@@ -501,7 +509,7 @@ function useChat({
501
509
  role: "user",
502
510
  createdAt: /* @__PURE__ */ new Date()
503
511
  },
504
- { options, functions, function_call }
512
+ options
505
513
  );
506
514
  setInput("");
507
515
  },
@@ -64,6 +64,7 @@ type ChatRequest = {
64
64
  options?: RequestOptions;
65
65
  functions?: Array<Function>;
66
66
  function_call?: FunctionCall;
67
+ data?: Record<string, string>;
67
68
  };
68
69
  type FunctionCallHandler = (chatMessages: Message[], functionCall: FunctionCall) => Promise<ChatRequest | void>;
69
70
  type RequestOptions = {
@@ -58,6 +58,9 @@ var StreamStringPrefixes = {
58
58
  };
59
59
  var getStreamStringTypeAndValue = (line) => {
60
60
  const firstSeperatorIndex = line.indexOf(":");
61
+ if (firstSeperatorIndex === -1) {
62
+ throw new Error("Failed to parse stream string");
63
+ }
61
64
  const prefix = line.slice(0, firstSeperatorIndex);
62
65
  const type = Object.keys(StreamStringPrefixes).find(
63
66
  (key) => StreamStringPrefixes[key] === Number(prefix)
@@ -31,6 +31,9 @@ var StreamStringPrefixes = {
31
31
  };
32
32
  var getStreamStringTypeAndValue = (line) => {
33
33
  const firstSeperatorIndex = line.indexOf(":");
34
+ if (firstSeperatorIndex === -1) {
35
+ throw new Error("Failed to parse stream string");
36
+ }
34
37
  const prefix = line.slice(0, firstSeperatorIndex);
35
38
  const type = Object.keys(StreamStringPrefixes).find(
36
39
  (key) => StreamStringPrefixes[key] === Number(prefix)
@@ -64,6 +64,7 @@ type ChatRequest = {
64
64
  options?: RequestOptions;
65
65
  functions?: Array<Function>;
66
66
  function_call?: FunctionCall;
67
+ data?: Record<string, string>;
67
68
  };
68
69
  type FunctionCallHandler = (chatMessages: Message[], functionCall: FunctionCall) => Promise<ChatRequest | void>;
69
70
  type RequestOptions = {
@@ -74,6 +75,7 @@ type ChatRequestOptions = {
74
75
  options?: RequestOptions;
75
76
  functions?: Array<Function>;
76
77
  function_call?: FunctionCall;
78
+ data?: Record<string, string>;
77
79
  };
78
80
  type UseChatOptions = {
79
81
  /**
@@ -553,6 +553,9 @@ var StreamStringPrefixes = {
553
553
  };
554
554
  var getStreamStringTypeAndValue = (line) => {
555
555
  const firstSeperatorIndex = line.indexOf(":");
556
+ if (firstSeperatorIndex === -1) {
557
+ throw new Error("Failed to parse stream string");
558
+ }
556
559
  const prefix = line.slice(0, firstSeperatorIndex);
557
560
  const type = Object.keys(StreamStringPrefixes).find(
558
561
  (key) => StreamStringPrefixes[key] === Number(prefix)
@@ -526,6 +526,9 @@ var StreamStringPrefixes = {
526
526
  };
527
527
  var getStreamStringTypeAndValue = (line) => {
528
528
  const firstSeperatorIndex = line.indexOf(":");
529
+ if (firstSeperatorIndex === -1) {
530
+ throw new Error("Failed to parse stream string");
531
+ }
529
532
  const prefix = line.slice(0, firstSeperatorIndex);
530
533
  const type = Object.keys(StreamStringPrefixes).find(
531
534
  (key) => StreamStringPrefixes[key] === Number(prefix)
@@ -64,6 +64,7 @@ type ChatRequest = {
64
64
  options?: RequestOptions;
65
65
  functions?: Array<Function>;
66
66
  function_call?: FunctionCall;
67
+ data?: Record<string, string>;
67
68
  };
68
69
  type FunctionCallHandler = (chatMessages: Message[], functionCall: FunctionCall) => Promise<ChatRequest | void>;
69
70
  type RequestOptions = {
package/vue/dist/index.js CHANGED
@@ -67,6 +67,9 @@ var StreamStringPrefixes = {
67
67
  };
68
68
  var getStreamStringTypeAndValue = (line) => {
69
69
  const firstSeperatorIndex = line.indexOf(":");
70
+ if (firstSeperatorIndex === -1) {
71
+ throw new Error("Failed to parse stream string");
72
+ }
70
73
  const prefix = line.slice(0, firstSeperatorIndex);
71
74
  const type = Object.keys(StreamStringPrefixes).find(
72
75
  (key) => StreamStringPrefixes[key] === Number(prefix)
@@ -30,6 +30,9 @@ var StreamStringPrefixes = {
30
30
  };
31
31
  var getStreamStringTypeAndValue = (line) => {
32
32
  const firstSeperatorIndex = line.indexOf(":");
33
+ if (firstSeperatorIndex === -1) {
34
+ throw new Error("Failed to parse stream string");
35
+ }
33
36
  const prefix = line.slice(0, firstSeperatorIndex);
34
37
  const type = Object.keys(StreamStringPrefixes).find(
35
38
  (key) => StreamStringPrefixes[key] === Number(prefix)