ai 3.2.0 → 3.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -528,6 +528,16 @@ function injectJsonSchemaIntoSystem({
528
528
  ].filter((line) => line != null).join("\n");
529
529
  }
530
530
 
531
+ // core/util/prepare-response-headers.ts
532
+ function prepareResponseHeaders(init, { contentType }) {
533
+ var _a;
534
+ const headers = new Headers((_a = init == null ? void 0 : init.headers) != null ? _a : {});
535
+ if (!headers.has("Content-Type")) {
536
+ headers.set("Content-Type", contentType);
537
+ }
538
+ return headers;
539
+ }
540
+
531
541
  // core/generate-object/generate-object.ts
532
542
  async function generateObject({
533
543
  model,
@@ -670,9 +680,29 @@ var GenerateObjectResult = class {
670
680
  this.rawResponse = options.rawResponse;
671
681
  this.logprobs = options.logprobs;
672
682
  }
683
+ /**
684
+ Converts the object to a JSON response.
685
+ The response will have a status code of 200 and a content type of `application/json; charset=utf-8`.
686
+ */
687
+ toJsonResponse(init) {
688
+ var _a;
689
+ return new Response(JSON.stringify(this.object), {
690
+ status: (_a = init == null ? void 0 : init.status) != null ? _a : 200,
691
+ headers: prepareResponseHeaders(init, {
692
+ contentType: "application/json; charset=utf-8"
693
+ })
694
+ });
695
+ }
673
696
  };
674
697
  var experimental_generateObject = generateObject;
675
698
 
699
+ // core/generate-object/stream-object.ts
700
+ import { safeValidateTypes } from "@ai-sdk/provider-utils";
701
+ import {
702
+ isDeepEqualData,
703
+ parsePartialJson
704
+ } from "@ai-sdk/ui-utils";
705
+
676
706
  // core/util/async-iterable-stream.ts
677
707
  function createAsyncIterableStream(source, transformer) {
678
708
  const transformedStream = source.pipeThrough(
@@ -690,381 +720,7 @@ function createAsyncIterableStream(source, transformer) {
690
720
  return transformedStream;
691
721
  }
692
722
 
693
- // core/util/is-deep-equal-data.ts
694
- function isDeepEqualData(obj1, obj2) {
695
- if (obj1 === obj2)
696
- return true;
697
- if (obj1 == null || obj2 == null)
698
- return false;
699
- if (typeof obj1 !== "object" && typeof obj2 !== "object")
700
- return obj1 === obj2;
701
- if (obj1.constructor !== obj2.constructor)
702
- return false;
703
- if (obj1 instanceof Date && obj2 instanceof Date) {
704
- return obj1.getTime() === obj2.getTime();
705
- }
706
- if (Array.isArray(obj1)) {
707
- if (obj1.length !== obj2.length)
708
- return false;
709
- for (let i = 0; i < obj1.length; i++) {
710
- if (!isDeepEqualData(obj1[i], obj2[i]))
711
- return false;
712
- }
713
- return true;
714
- }
715
- const keys1 = Object.keys(obj1);
716
- const keys2 = Object.keys(obj2);
717
- if (keys1.length !== keys2.length)
718
- return false;
719
- for (const key of keys1) {
720
- if (!keys2.includes(key))
721
- return false;
722
- if (!isDeepEqualData(obj1[key], obj2[key]))
723
- return false;
724
- }
725
- return true;
726
- }
727
-
728
- // core/util/parse-partial-json.ts
729
- import SecureJSON from "secure-json-parse";
730
-
731
- // core/util/fix-json.ts
732
- function fixJson(input) {
733
- const stack = ["ROOT"];
734
- let lastValidIndex = -1;
735
- let literalStart = null;
736
- function processValueStart(char, i, swapState) {
737
- {
738
- switch (char) {
739
- case '"': {
740
- lastValidIndex = i;
741
- stack.pop();
742
- stack.push(swapState);
743
- stack.push("INSIDE_STRING");
744
- break;
745
- }
746
- case "f":
747
- case "t":
748
- case "n": {
749
- lastValidIndex = i;
750
- literalStart = i;
751
- stack.pop();
752
- stack.push(swapState);
753
- stack.push("INSIDE_LITERAL");
754
- break;
755
- }
756
- case "-": {
757
- stack.pop();
758
- stack.push(swapState);
759
- stack.push("INSIDE_NUMBER");
760
- break;
761
- }
762
- case "0":
763
- case "1":
764
- case "2":
765
- case "3":
766
- case "4":
767
- case "5":
768
- case "6":
769
- case "7":
770
- case "8":
771
- case "9": {
772
- lastValidIndex = i;
773
- stack.pop();
774
- stack.push(swapState);
775
- stack.push("INSIDE_NUMBER");
776
- break;
777
- }
778
- case "{": {
779
- lastValidIndex = i;
780
- stack.pop();
781
- stack.push(swapState);
782
- stack.push("INSIDE_OBJECT_START");
783
- break;
784
- }
785
- case "[": {
786
- lastValidIndex = i;
787
- stack.pop();
788
- stack.push(swapState);
789
- stack.push("INSIDE_ARRAY_START");
790
- break;
791
- }
792
- }
793
- }
794
- }
795
- function processAfterObjectValue(char, i) {
796
- switch (char) {
797
- case ",": {
798
- stack.pop();
799
- stack.push("INSIDE_OBJECT_AFTER_COMMA");
800
- break;
801
- }
802
- case "}": {
803
- lastValidIndex = i;
804
- stack.pop();
805
- break;
806
- }
807
- }
808
- }
809
- function processAfterArrayValue(char, i) {
810
- switch (char) {
811
- case ",": {
812
- stack.pop();
813
- stack.push("INSIDE_ARRAY_AFTER_COMMA");
814
- break;
815
- }
816
- case "]": {
817
- lastValidIndex = i;
818
- stack.pop();
819
- break;
820
- }
821
- }
822
- }
823
- for (let i = 0; i < input.length; i++) {
824
- const char = input[i];
825
- const currentState = stack[stack.length - 1];
826
- switch (currentState) {
827
- case "ROOT":
828
- processValueStart(char, i, "FINISH");
829
- break;
830
- case "INSIDE_OBJECT_START": {
831
- switch (char) {
832
- case '"': {
833
- stack.pop();
834
- stack.push("INSIDE_OBJECT_KEY");
835
- break;
836
- }
837
- case "}": {
838
- lastValidIndex = i;
839
- stack.pop();
840
- break;
841
- }
842
- }
843
- break;
844
- }
845
- case "INSIDE_OBJECT_AFTER_COMMA": {
846
- switch (char) {
847
- case '"': {
848
- stack.pop();
849
- stack.push("INSIDE_OBJECT_KEY");
850
- break;
851
- }
852
- }
853
- break;
854
- }
855
- case "INSIDE_OBJECT_KEY": {
856
- switch (char) {
857
- case '"': {
858
- stack.pop();
859
- stack.push("INSIDE_OBJECT_AFTER_KEY");
860
- break;
861
- }
862
- }
863
- break;
864
- }
865
- case "INSIDE_OBJECT_AFTER_KEY": {
866
- switch (char) {
867
- case ":": {
868
- stack.pop();
869
- stack.push("INSIDE_OBJECT_BEFORE_VALUE");
870
- break;
871
- }
872
- }
873
- break;
874
- }
875
- case "INSIDE_OBJECT_BEFORE_VALUE": {
876
- processValueStart(char, i, "INSIDE_OBJECT_AFTER_VALUE");
877
- break;
878
- }
879
- case "INSIDE_OBJECT_AFTER_VALUE": {
880
- processAfterObjectValue(char, i);
881
- break;
882
- }
883
- case "INSIDE_STRING": {
884
- switch (char) {
885
- case '"': {
886
- stack.pop();
887
- lastValidIndex = i;
888
- break;
889
- }
890
- case "\\": {
891
- stack.push("INSIDE_STRING_ESCAPE");
892
- break;
893
- }
894
- default: {
895
- lastValidIndex = i;
896
- }
897
- }
898
- break;
899
- }
900
- case "INSIDE_ARRAY_START": {
901
- switch (char) {
902
- case "]": {
903
- lastValidIndex = i;
904
- stack.pop();
905
- break;
906
- }
907
- default: {
908
- lastValidIndex = i;
909
- processValueStart(char, i, "INSIDE_ARRAY_AFTER_VALUE");
910
- break;
911
- }
912
- }
913
- break;
914
- }
915
- case "INSIDE_ARRAY_AFTER_VALUE": {
916
- switch (char) {
917
- case ",": {
918
- stack.pop();
919
- stack.push("INSIDE_ARRAY_AFTER_COMMA");
920
- break;
921
- }
922
- case "]": {
923
- lastValidIndex = i;
924
- stack.pop();
925
- break;
926
- }
927
- default: {
928
- lastValidIndex = i;
929
- break;
930
- }
931
- }
932
- break;
933
- }
934
- case "INSIDE_ARRAY_AFTER_COMMA": {
935
- processValueStart(char, i, "INSIDE_ARRAY_AFTER_VALUE");
936
- break;
937
- }
938
- case "INSIDE_STRING_ESCAPE": {
939
- stack.pop();
940
- lastValidIndex = i;
941
- break;
942
- }
943
- case "INSIDE_NUMBER": {
944
- switch (char) {
945
- case "0":
946
- case "1":
947
- case "2":
948
- case "3":
949
- case "4":
950
- case "5":
951
- case "6":
952
- case "7":
953
- case "8":
954
- case "9": {
955
- lastValidIndex = i;
956
- break;
957
- }
958
- case "e":
959
- case "E":
960
- case "-":
961
- case ".": {
962
- break;
963
- }
964
- case ",": {
965
- stack.pop();
966
- if (stack[stack.length - 1] === "INSIDE_ARRAY_AFTER_VALUE") {
967
- processAfterArrayValue(char, i);
968
- }
969
- if (stack[stack.length - 1] === "INSIDE_OBJECT_AFTER_VALUE") {
970
- processAfterObjectValue(char, i);
971
- }
972
- break;
973
- }
974
- case "}": {
975
- stack.pop();
976
- if (stack[stack.length - 1] === "INSIDE_OBJECT_AFTER_VALUE") {
977
- processAfterObjectValue(char, i);
978
- }
979
- break;
980
- }
981
- case "]": {
982
- stack.pop();
983
- if (stack[stack.length - 1] === "INSIDE_ARRAY_AFTER_VALUE") {
984
- processAfterArrayValue(char, i);
985
- }
986
- break;
987
- }
988
- default: {
989
- stack.pop();
990
- break;
991
- }
992
- }
993
- break;
994
- }
995
- case "INSIDE_LITERAL": {
996
- const partialLiteral = input.substring(literalStart, i + 1);
997
- if (!"false".startsWith(partialLiteral) && !"true".startsWith(partialLiteral) && !"null".startsWith(partialLiteral)) {
998
- stack.pop();
999
- if (stack[stack.length - 1] === "INSIDE_OBJECT_AFTER_VALUE") {
1000
- processAfterObjectValue(char, i);
1001
- } else if (stack[stack.length - 1] === "INSIDE_ARRAY_AFTER_VALUE") {
1002
- processAfterArrayValue(char, i);
1003
- }
1004
- } else {
1005
- lastValidIndex = i;
1006
- }
1007
- break;
1008
- }
1009
- }
1010
- }
1011
- let result = input.slice(0, lastValidIndex + 1);
1012
- for (let i = stack.length - 1; i >= 0; i--) {
1013
- const state = stack[i];
1014
- switch (state) {
1015
- case "INSIDE_STRING": {
1016
- result += '"';
1017
- break;
1018
- }
1019
- case "INSIDE_OBJECT_KEY":
1020
- case "INSIDE_OBJECT_AFTER_KEY":
1021
- case "INSIDE_OBJECT_AFTER_COMMA":
1022
- case "INSIDE_OBJECT_START":
1023
- case "INSIDE_OBJECT_BEFORE_VALUE":
1024
- case "INSIDE_OBJECT_AFTER_VALUE": {
1025
- result += "}";
1026
- break;
1027
- }
1028
- case "INSIDE_ARRAY_START":
1029
- case "INSIDE_ARRAY_AFTER_COMMA":
1030
- case "INSIDE_ARRAY_AFTER_VALUE": {
1031
- result += "]";
1032
- break;
1033
- }
1034
- case "INSIDE_LITERAL": {
1035
- const partialLiteral = input.substring(literalStart, input.length);
1036
- if ("true".startsWith(partialLiteral)) {
1037
- result += "true".slice(partialLiteral.length);
1038
- } else if ("false".startsWith(partialLiteral)) {
1039
- result += "false".slice(partialLiteral.length);
1040
- } else if ("null".startsWith(partialLiteral)) {
1041
- result += "null".slice(partialLiteral.length);
1042
- }
1043
- }
1044
- }
1045
- }
1046
- return result;
1047
- }
1048
-
1049
- // core/util/parse-partial-json.ts
1050
- function parsePartialJson(jsonText) {
1051
- if (jsonText == null) {
1052
- return void 0;
1053
- }
1054
- try {
1055
- return SecureJSON.parse(jsonText);
1056
- } catch (ignored) {
1057
- try {
1058
- const fixedJsonText = fixJson(jsonText);
1059
- return SecureJSON.parse(fixedJsonText);
1060
- } catch (ignored2) {
1061
- }
1062
- }
1063
- return void 0;
1064
- }
1065
-
1066
723
  // core/generate-object/stream-object.ts
1067
- import { safeValidateTypes } from "@ai-sdk/provider-utils";
1068
724
  async function streamObject({
1069
725
  model,
1070
726
  schema,
@@ -1218,23 +874,39 @@ var StreamObjectResult = class {
1218
874
  let object;
1219
875
  let error;
1220
876
  let accumulatedText = "";
877
+ let delta = "";
1221
878
  let latestObject = void 0;
1222
879
  this.originalStream = stream.pipeThrough(
1223
880
  new TransformStream({
1224
881
  async transform(chunk, controller) {
1225
882
  if (typeof chunk === "string") {
1226
883
  accumulatedText += chunk;
884
+ delta += chunk;
1227
885
  const currentObject = parsePartialJson(
1228
886
  accumulatedText
1229
887
  );
1230
888
  if (!isDeepEqualData(latestObject, currentObject)) {
1231
889
  latestObject = currentObject;
1232
- controller.enqueue({ type: "object", object: currentObject });
890
+ controller.enqueue({
891
+ type: "object",
892
+ object: currentObject
893
+ });
894
+ controller.enqueue({
895
+ type: "text-delta",
896
+ textDelta: delta
897
+ });
898
+ delta = "";
1233
899
  }
1234
900
  return;
1235
901
  }
1236
902
  switch (chunk.type) {
1237
903
  case "finish": {
904
+ if (delta !== "") {
905
+ controller.enqueue({
906
+ type: "text-delta",
907
+ textDelta: delta
908
+ });
909
+ }
1238
910
  usage = calculateTokenUsage(chunk.usage);
1239
911
  controller.enqueue({ ...chunk, usage });
1240
912
  resolveUsage(usage);
@@ -1278,6 +950,12 @@ var StreamObjectResult = class {
1278
950
  })
1279
951
  );
1280
952
  }
953
+ /**
954
+ Stream of partial objects. It gets more complete as the stream progresses.
955
+
956
+ Note that the partial object is not validated.
957
+ If you want to be certain that the actual content matches your schema, you need to implement your own validation for partial results.
958
+ */
1281
959
  get partialObjectStream() {
1282
960
  return createAsyncIterableStream(this.originalStream, {
1283
961
  transform(chunk, controller) {
@@ -1285,6 +963,32 @@ var StreamObjectResult = class {
1285
963
  case "object":
1286
964
  controller.enqueue(chunk.object);
1287
965
  break;
966
+ case "text-delta":
967
+ case "finish":
968
+ break;
969
+ case "error":
970
+ controller.error(chunk.error);
971
+ break;
972
+ default: {
973
+ const _exhaustiveCheck = chunk;
974
+ throw new Error(`Unsupported chunk type: ${_exhaustiveCheck}`);
975
+ }
976
+ }
977
+ }
978
+ });
979
+ }
980
+ /**
981
+ Text stream of the JSON representation of the generated object. It contains text chunks.
982
+ When the stream is finished, the object is valid JSON that can be parsed.
983
+ */
984
+ get textStream() {
985
+ return createAsyncIterableStream(this.originalStream, {
986
+ transform(chunk, controller) {
987
+ switch (chunk.type) {
988
+ case "text-delta":
989
+ controller.enqueue(chunk.textDelta);
990
+ break;
991
+ case "object":
1288
992
  case "finish":
1289
993
  break;
1290
994
  case "error":
@@ -1298,6 +1002,9 @@ var StreamObjectResult = class {
1298
1002
  }
1299
1003
  });
1300
1004
  }
1005
+ /**
1006
+ Stream of different types of events, including partial objects, errors, and finish events.
1007
+ */
1301
1008
  get fullStream() {
1302
1009
  return createAsyncIterableStream(this.originalStream, {
1303
1010
  transform(chunk, controller) {
@@ -1305,6 +1012,54 @@ var StreamObjectResult = class {
1305
1012
  }
1306
1013
  });
1307
1014
  }
1015
+ /**
1016
+ Writes text delta output to a Node.js response-like object.
1017
+ It sets a `Content-Type` header to `text/plain; charset=utf-8` and
1018
+ writes each text delta as a separate chunk.
1019
+
1020
+ @param response A Node.js response-like object (ServerResponse).
1021
+ @param init Optional headers and status code.
1022
+ */
1023
+ pipeTextStreamToResponse(response, init) {
1024
+ var _a;
1025
+ response.writeHead((_a = init == null ? void 0 : init.status) != null ? _a : 200, {
1026
+ "Content-Type": "text/plain; charset=utf-8",
1027
+ ...init == null ? void 0 : init.headers
1028
+ });
1029
+ const reader = this.textStream.pipeThrough(new TextEncoderStream()).getReader();
1030
+ const read = async () => {
1031
+ try {
1032
+ while (true) {
1033
+ const { done, value } = await reader.read();
1034
+ if (done)
1035
+ break;
1036
+ response.write(value);
1037
+ }
1038
+ } catch (error) {
1039
+ throw error;
1040
+ } finally {
1041
+ response.end();
1042
+ }
1043
+ };
1044
+ read();
1045
+ }
1046
+ /**
1047
+ Creates a simple text stream response.
1048
+ The response has a `Content-Type` header set to `text/plain; charset=utf-8`.
1049
+ Each text delta is encoded as UTF-8 and sent as a separate chunk.
1050
+ Non-text-delta events are ignored.
1051
+
1052
+ @param init Optional headers and status code.
1053
+ */
1054
+ toTextStreamResponse(init) {
1055
+ var _a;
1056
+ return new Response(this.textStream.pipeThrough(new TextEncoderStream()), {
1057
+ status: (_a = init == null ? void 0 : init.status) != null ? _a : 200,
1058
+ headers: prepareResponseHeaders(init, {
1059
+ contentType: "text/plain; charset=utf-8"
1060
+ })
1061
+ });
1062
+ }
1308
1063
  };
1309
1064
  var experimental_streamObject = streamObject;
1310
1065
 
@@ -1509,16 +1264,6 @@ function toResponseMessages({
1509
1264
  }
1510
1265
  var experimental_generateText = generateText;
1511
1266
 
1512
- // core/util/prepare-response-headers.ts
1513
- function prepareResponseHeaders(init, { contentType }) {
1514
- var _a;
1515
- const headers = new Headers((_a = init == null ? void 0 : init.headers) != null ? _a : {});
1516
- if (!headers.has("Content-Type")) {
1517
- headers.set("Content-Type", contentType);
1518
- }
1519
- return headers;
1520
- }
1521
-
1522
1267
  // core/generate-text/run-tools-transformation.ts
1523
1268
  import { NoSuchToolError as NoSuchToolError2 } from "@ai-sdk/provider";
1524
1269
  import { generateId } from "@ai-sdk/ui-utils";