ai 4.0.17 → 4.0.19
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/CHANGELOG.md +13 -0
- package/dist/index.d.mts +44 -15
- package/dist/index.d.ts +44 -15
- package/dist/index.js +369 -203
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +363 -197
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/rsc/dist/rsc-server.mjs.map +1 -1
package/dist/index.js
CHANGED
@@ -900,13 +900,39 @@ var DefaultGenerateImageResult = class {
|
|
900
900
|
// core/generate-object/generate-object.ts
|
901
901
|
var import_provider_utils6 = require("@ai-sdk/provider-utils");
|
902
902
|
|
903
|
-
//
|
903
|
+
// errors/no-object-generated-error.ts
|
904
904
|
var import_provider4 = require("@ai-sdk/provider");
|
905
|
-
var name3 = "
|
905
|
+
var name3 = "AI_NoObjectGeneratedError";
|
906
906
|
var marker3 = `vercel.ai.error.${name3}`;
|
907
907
|
var symbol3 = Symbol.for(marker3);
|
908
908
|
var _a3;
|
909
|
-
var
|
909
|
+
var NoObjectGeneratedError = class extends import_provider4.AISDKError {
|
910
|
+
constructor({
|
911
|
+
message = "No object generated.",
|
912
|
+
cause,
|
913
|
+
text: text2,
|
914
|
+
response,
|
915
|
+
usage
|
916
|
+
}) {
|
917
|
+
super({ name: name3, message, cause });
|
918
|
+
this[_a3] = true;
|
919
|
+
this.text = text2;
|
920
|
+
this.response = response;
|
921
|
+
this.usage = usage;
|
922
|
+
}
|
923
|
+
static isInstance(error) {
|
924
|
+
return import_provider4.AISDKError.hasMarker(error, marker3);
|
925
|
+
}
|
926
|
+
};
|
927
|
+
_a3 = symbol3;
|
928
|
+
|
929
|
+
// util/download-error.ts
|
930
|
+
var import_provider5 = require("@ai-sdk/provider");
|
931
|
+
var name4 = "AI_DownloadError";
|
932
|
+
var marker4 = `vercel.ai.error.${name4}`;
|
933
|
+
var symbol4 = Symbol.for(marker4);
|
934
|
+
var _a4;
|
935
|
+
var DownloadError = class extends import_provider5.AISDKError {
|
910
936
|
constructor({
|
911
937
|
url,
|
912
938
|
statusCode,
|
@@ -914,17 +940,17 @@ var DownloadError = class extends import_provider4.AISDKError {
|
|
914
940
|
cause,
|
915
941
|
message = cause == null ? `Failed to download ${url}: ${statusCode} ${statusText}` : `Failed to download ${url}: ${cause}`
|
916
942
|
}) {
|
917
|
-
super({ name:
|
918
|
-
this[
|
943
|
+
super({ name: name4, message, cause });
|
944
|
+
this[_a4] = true;
|
919
945
|
this.url = url;
|
920
946
|
this.statusCode = statusCode;
|
921
947
|
this.statusText = statusText;
|
922
948
|
}
|
923
949
|
static isInstance(error) {
|
924
|
-
return
|
950
|
+
return import_provider5.AISDKError.hasMarker(error, marker4);
|
925
951
|
}
|
926
952
|
};
|
927
|
-
|
953
|
+
_a4 = symbol4;
|
928
954
|
|
929
955
|
// util/download.ts
|
930
956
|
async function download({
|
@@ -974,26 +1000,26 @@ function detectImageMimeType(image) {
|
|
974
1000
|
var import_provider_utils3 = require("@ai-sdk/provider-utils");
|
975
1001
|
|
976
1002
|
// core/prompt/invalid-data-content-error.ts
|
977
|
-
var
|
978
|
-
var
|
979
|
-
var
|
980
|
-
var
|
981
|
-
var
|
982
|
-
var InvalidDataContentError = class extends
|
1003
|
+
var import_provider6 = require("@ai-sdk/provider");
|
1004
|
+
var name5 = "AI_InvalidDataContentError";
|
1005
|
+
var marker5 = `vercel.ai.error.${name5}`;
|
1006
|
+
var symbol5 = Symbol.for(marker5);
|
1007
|
+
var _a5;
|
1008
|
+
var InvalidDataContentError = class extends import_provider6.AISDKError {
|
983
1009
|
constructor({
|
984
1010
|
content,
|
985
1011
|
cause,
|
986
1012
|
message = `Invalid data content. Expected a base64 string, Uint8Array, ArrayBuffer, or Buffer, but got ${typeof content}.`
|
987
1013
|
}) {
|
988
|
-
super({ name:
|
989
|
-
this[
|
1014
|
+
super({ name: name5, message, cause });
|
1015
|
+
this[_a5] = true;
|
990
1016
|
this.content = content;
|
991
1017
|
}
|
992
1018
|
static isInstance(error) {
|
993
|
-
return
|
1019
|
+
return import_provider6.AISDKError.hasMarker(error, marker5);
|
994
1020
|
}
|
995
1021
|
};
|
996
|
-
|
1022
|
+
_a5 = symbol5;
|
997
1023
|
|
998
1024
|
// core/prompt/data-content.ts
|
999
1025
|
var import_zod = require("zod");
|
@@ -1048,25 +1074,25 @@ function convertUint8ArrayToText(uint8Array) {
|
|
1048
1074
|
}
|
1049
1075
|
|
1050
1076
|
// core/prompt/invalid-message-role-error.ts
|
1051
|
-
var
|
1052
|
-
var
|
1053
|
-
var
|
1054
|
-
var
|
1055
|
-
var
|
1056
|
-
var InvalidMessageRoleError = class extends
|
1077
|
+
var import_provider7 = require("@ai-sdk/provider");
|
1078
|
+
var name6 = "AI_InvalidMessageRoleError";
|
1079
|
+
var marker6 = `vercel.ai.error.${name6}`;
|
1080
|
+
var symbol6 = Symbol.for(marker6);
|
1081
|
+
var _a6;
|
1082
|
+
var InvalidMessageRoleError = class extends import_provider7.AISDKError {
|
1057
1083
|
constructor({
|
1058
1084
|
role,
|
1059
1085
|
message = `Invalid message role: '${role}'. Must be one of: "system", "user", "assistant", "tool".`
|
1060
1086
|
}) {
|
1061
|
-
super({ name:
|
1062
|
-
this[
|
1087
|
+
super({ name: name6, message });
|
1088
|
+
this[_a6] = true;
|
1063
1089
|
this.role = role;
|
1064
1090
|
}
|
1065
1091
|
static isInstance(error) {
|
1066
|
-
return
|
1092
|
+
return import_provider7.AISDKError.hasMarker(error, marker6);
|
1067
1093
|
}
|
1068
1094
|
};
|
1069
|
-
|
1095
|
+
_a6 = symbol6;
|
1070
1096
|
|
1071
1097
|
// core/prompt/split-data-url.ts
|
1072
1098
|
function splitDataUrl(dataUrl) {
|
@@ -1363,7 +1389,7 @@ function prepareCallSettings({
|
|
1363
1389
|
}
|
1364
1390
|
|
1365
1391
|
// core/prompt/standardize-prompt.ts
|
1366
|
-
var
|
1392
|
+
var import_provider9 = require("@ai-sdk/provider");
|
1367
1393
|
var import_provider_utils4 = require("@ai-sdk/provider-utils");
|
1368
1394
|
var import_zod7 = require("zod");
|
1369
1395
|
|
@@ -1589,25 +1615,25 @@ function attachmentsToParts(attachments) {
|
|
1589
1615
|
}
|
1590
1616
|
|
1591
1617
|
// core/prompt/message-conversion-error.ts
|
1592
|
-
var
|
1593
|
-
var
|
1594
|
-
var
|
1595
|
-
var
|
1596
|
-
var
|
1597
|
-
var MessageConversionError = class extends
|
1618
|
+
var import_provider8 = require("@ai-sdk/provider");
|
1619
|
+
var name7 = "AI_MessageConversionError";
|
1620
|
+
var marker7 = `vercel.ai.error.${name7}`;
|
1621
|
+
var symbol7 = Symbol.for(marker7);
|
1622
|
+
var _a7;
|
1623
|
+
var MessageConversionError = class extends import_provider8.AISDKError {
|
1598
1624
|
constructor({
|
1599
1625
|
originalMessage,
|
1600
1626
|
message
|
1601
1627
|
}) {
|
1602
|
-
super({ name:
|
1603
|
-
this[
|
1628
|
+
super({ name: name7, message });
|
1629
|
+
this[_a7] = true;
|
1604
1630
|
this.originalMessage = originalMessage;
|
1605
1631
|
}
|
1606
1632
|
static isInstance(error) {
|
1607
|
-
return
|
1633
|
+
return import_provider8.AISDKError.hasMarker(error, marker7);
|
1608
1634
|
}
|
1609
1635
|
};
|
1610
|
-
|
1636
|
+
_a7 = symbol7;
|
1611
1637
|
|
1612
1638
|
// core/prompt/convert-to-core-messages.ts
|
1613
1639
|
function convertToCoreMessages(messages, options) {
|
@@ -1701,26 +1727,26 @@ function standardizePrompt({
|
|
1701
1727
|
tools
|
1702
1728
|
}) {
|
1703
1729
|
if (prompt.prompt == null && prompt.messages == null) {
|
1704
|
-
throw new
|
1730
|
+
throw new import_provider9.InvalidPromptError({
|
1705
1731
|
prompt,
|
1706
1732
|
message: "prompt or messages must be defined"
|
1707
1733
|
});
|
1708
1734
|
}
|
1709
1735
|
if (prompt.prompt != null && prompt.messages != null) {
|
1710
|
-
throw new
|
1736
|
+
throw new import_provider9.InvalidPromptError({
|
1711
1737
|
prompt,
|
1712
1738
|
message: "prompt and messages cannot be defined at the same time"
|
1713
1739
|
});
|
1714
1740
|
}
|
1715
1741
|
if (prompt.system != null && typeof prompt.system !== "string") {
|
1716
|
-
throw new
|
1742
|
+
throw new import_provider9.InvalidPromptError({
|
1717
1743
|
prompt,
|
1718
1744
|
message: "system must be a string"
|
1719
1745
|
});
|
1720
1746
|
}
|
1721
1747
|
if (prompt.prompt != null) {
|
1722
1748
|
if (typeof prompt.prompt !== "string") {
|
1723
|
-
throw new
|
1749
|
+
throw new import_provider9.InvalidPromptError({
|
1724
1750
|
prompt,
|
1725
1751
|
message: "prompt must be a string"
|
1726
1752
|
});
|
@@ -1739,7 +1765,7 @@ function standardizePrompt({
|
|
1739
1765
|
if (prompt.messages != null) {
|
1740
1766
|
const promptType = detectPromptType(prompt.messages);
|
1741
1767
|
if (promptType === "other") {
|
1742
|
-
throw new
|
1768
|
+
throw new import_provider9.InvalidPromptError({
|
1743
1769
|
prompt,
|
1744
1770
|
message: "messages must be an array of CoreMessage or UIMessage"
|
1745
1771
|
});
|
@@ -1752,7 +1778,7 @@ function standardizePrompt({
|
|
1752
1778
|
schema: import_zod7.z.array(coreMessageSchema)
|
1753
1779
|
});
|
1754
1780
|
if (!validationResult.success) {
|
1755
|
-
throw new
|
1781
|
+
throw new import_provider9.InvalidPromptError({
|
1756
1782
|
prompt,
|
1757
1783
|
message: "messages must be an array of CoreMessage or UIMessage",
|
1758
1784
|
cause: validationResult.error
|
@@ -1778,6 +1804,13 @@ function calculateLanguageModelUsage({
|
|
1778
1804
|
totalTokens: promptTokens + completionTokens
|
1779
1805
|
};
|
1780
1806
|
}
|
1807
|
+
function addLanguageModelUsage(usage1, usage2) {
|
1808
|
+
return {
|
1809
|
+
promptTokens: usage1.promptTokens + usage2.promptTokens,
|
1810
|
+
completionTokens: usage1.completionTokens + usage2.completionTokens,
|
1811
|
+
totalTokens: usage1.totalTokens + usage2.totalTokens
|
1812
|
+
};
|
1813
|
+
}
|
1781
1814
|
|
1782
1815
|
// core/generate-object/inject-json-instruction.ts
|
1783
1816
|
var DEFAULT_SCHEMA_PREFIX = "JSON schema:";
|
@@ -1799,24 +1832,6 @@ function injectJsonInstruction({
|
|
1799
1832
|
].filter((line) => line != null).join("\n");
|
1800
1833
|
}
|
1801
1834
|
|
1802
|
-
// core/generate-object/no-object-generated-error.ts
|
1803
|
-
var import_provider9 = require("@ai-sdk/provider");
|
1804
|
-
var name7 = "AI_NoObjectGeneratedError";
|
1805
|
-
var marker7 = `vercel.ai.error.${name7}`;
|
1806
|
-
var symbol7 = Symbol.for(marker7);
|
1807
|
-
var _a7;
|
1808
|
-
var NoObjectGeneratedError = class extends import_provider9.AISDKError {
|
1809
|
-
// used in isInstance
|
1810
|
-
constructor({ message = "No object generated." } = {}) {
|
1811
|
-
super({ name: name7, message });
|
1812
|
-
this[_a7] = true;
|
1813
|
-
}
|
1814
|
-
static isInstance(error) {
|
1815
|
-
return import_provider9.AISDKError.hasMarker(error, marker7);
|
1816
|
-
}
|
1817
|
-
};
|
1818
|
-
_a7 = symbol7;
|
1819
|
-
|
1820
1835
|
// core/generate-object/output-strategy.ts
|
1821
1836
|
var import_provider10 = require("@ai-sdk/provider");
|
1822
1837
|
var import_provider_utils5 = require("@ai-sdk/provider-utils");
|
@@ -1846,8 +1861,16 @@ var noSchemaOutputStrategy = {
|
|
1846
1861
|
validatePartialResult({ value, textDelta }) {
|
1847
1862
|
return { success: true, value: { partial: value, textDelta } };
|
1848
1863
|
},
|
1849
|
-
validateFinalResult(value) {
|
1850
|
-
return value === void 0 ? {
|
1864
|
+
validateFinalResult(value, context) {
|
1865
|
+
return value === void 0 ? {
|
1866
|
+
success: false,
|
1867
|
+
error: new NoObjectGeneratedError({
|
1868
|
+
message: "No object generated: response did not match schema.",
|
1869
|
+
text: context.text,
|
1870
|
+
response: context.response,
|
1871
|
+
usage: context.usage
|
1872
|
+
})
|
1873
|
+
} : { success: true, value };
|
1851
1874
|
},
|
1852
1875
|
createElementStream() {
|
1853
1876
|
throw new import_provider10.UnsupportedFunctionalityError({
|
@@ -2326,14 +2349,18 @@ async function generateObject({
|
|
2326
2349
|
abortSignal,
|
2327
2350
|
headers
|
2328
2351
|
});
|
2329
|
-
if (result2.text === void 0) {
|
2330
|
-
throw new NoObjectGeneratedError();
|
2331
|
-
}
|
2332
2352
|
const responseData = {
|
2333
2353
|
id: (_b2 = (_a14 = result2.response) == null ? void 0 : _a14.id) != null ? _b2 : generateId3(),
|
2334
2354
|
timestamp: (_d = (_c = result2.response) == null ? void 0 : _c.timestamp) != null ? _d : currentDate(),
|
2335
2355
|
modelId: (_f = (_e = result2.response) == null ? void 0 : _e.modelId) != null ? _f : model.modelId
|
2336
2356
|
};
|
2357
|
+
if (result2.text === void 0) {
|
2358
|
+
throw new NoObjectGeneratedError({
|
2359
|
+
message: "No object generated: the model did not return a response.",
|
2360
|
+
response: responseData,
|
2361
|
+
usage: calculateLanguageModelUsage(result2.usage)
|
2362
|
+
});
|
2363
|
+
}
|
2337
2364
|
span2.setAttributes(
|
2338
2365
|
selectTelemetryAttributes({
|
2339
2366
|
telemetry,
|
@@ -2430,14 +2457,18 @@ async function generateObject({
|
|
2430
2457
|
headers
|
2431
2458
|
});
|
2432
2459
|
const objectText = (_b2 = (_a14 = result2.toolCalls) == null ? void 0 : _a14[0]) == null ? void 0 : _b2.args;
|
2433
|
-
if (objectText === void 0) {
|
2434
|
-
throw new NoObjectGeneratedError();
|
2435
|
-
}
|
2436
2460
|
const responseData = {
|
2437
2461
|
id: (_d = (_c = result2.response) == null ? void 0 : _c.id) != null ? _d : generateId3(),
|
2438
2462
|
timestamp: (_f = (_e = result2.response) == null ? void 0 : _e.timestamp) != null ? _f : currentDate(),
|
2439
2463
|
modelId: (_h = (_g = result2.response) == null ? void 0 : _g.modelId) != null ? _h : model.modelId
|
2440
2464
|
};
|
2465
|
+
if (objectText === void 0) {
|
2466
|
+
throw new NoObjectGeneratedError({
|
2467
|
+
message: "No object generated: the tool was not called.",
|
2468
|
+
response: responseData,
|
2469
|
+
usage: calculateLanguageModelUsage(result2.usage)
|
2470
|
+
});
|
2471
|
+
}
|
2441
2472
|
span2.setAttributes(
|
2442
2473
|
selectTelemetryAttributes({
|
2443
2474
|
telemetry,
|
@@ -2485,13 +2516,30 @@ async function generateObject({
|
|
2485
2516
|
}
|
2486
2517
|
const parseResult = (0, import_provider_utils6.safeParseJSON)({ text: result });
|
2487
2518
|
if (!parseResult.success) {
|
2488
|
-
throw
|
2519
|
+
throw new NoObjectGeneratedError({
|
2520
|
+
message: "No object generated: could not parse the response.",
|
2521
|
+
cause: parseResult.error,
|
2522
|
+
text: result,
|
2523
|
+
response,
|
2524
|
+
usage: calculateLanguageModelUsage(usage)
|
2525
|
+
});
|
2489
2526
|
}
|
2490
2527
|
const validationResult = outputStrategy.validateFinalResult(
|
2491
|
-
parseResult.value
|
2528
|
+
parseResult.value,
|
2529
|
+
{
|
2530
|
+
text: result,
|
2531
|
+
response,
|
2532
|
+
usage: calculateLanguageModelUsage(usage)
|
2533
|
+
}
|
2492
2534
|
);
|
2493
2535
|
if (!validationResult.success) {
|
2494
|
-
throw
|
2536
|
+
throw new NoObjectGeneratedError({
|
2537
|
+
message: "No object generated: response did not match schema.",
|
2538
|
+
cause: validationResult.error,
|
2539
|
+
text: result,
|
2540
|
+
response,
|
2541
|
+
usage: calculateLanguageModelUsage(usage)
|
2542
|
+
});
|
2495
2543
|
}
|
2496
2544
|
span.setAttributes(
|
2497
2545
|
selectTelemetryAttributes({
|
@@ -3026,12 +3074,25 @@ var DefaultStreamObjectResult = class {
|
|
3026
3074
|
...response,
|
3027
3075
|
headers: rawResponse == null ? void 0 : rawResponse.headers
|
3028
3076
|
});
|
3029
|
-
const validationResult = outputStrategy.validateFinalResult(
|
3077
|
+
const validationResult = outputStrategy.validateFinalResult(
|
3078
|
+
latestObjectJson,
|
3079
|
+
{
|
3080
|
+
text: accumulatedText,
|
3081
|
+
response,
|
3082
|
+
usage
|
3083
|
+
}
|
3084
|
+
);
|
3030
3085
|
if (validationResult.success) {
|
3031
3086
|
object2 = validationResult.value;
|
3032
3087
|
self.objectPromise.resolve(object2);
|
3033
3088
|
} else {
|
3034
|
-
error =
|
3089
|
+
error = new NoObjectGeneratedError({
|
3090
|
+
message: "No object generated: response did not match schema.",
|
3091
|
+
cause: validationResult.error,
|
3092
|
+
text: accumulatedText,
|
3093
|
+
response,
|
3094
|
+
usage
|
3095
|
+
});
|
3035
3096
|
self.objectPromise.reject(error);
|
3036
3097
|
}
|
3037
3098
|
break;
|
@@ -3568,7 +3629,7 @@ async function generateText({
|
|
3568
3629
|
const responseMessages = [];
|
3569
3630
|
let text2 = "";
|
3570
3631
|
const steps = [];
|
3571
|
-
|
3632
|
+
let usage = {
|
3572
3633
|
completionTokens: 0,
|
3573
3634
|
promptTokens: 0,
|
3574
3635
|
totalTokens: 0
|
@@ -3695,9 +3756,7 @@ async function generateText({
|
|
3695
3756
|
const currentUsage = calculateLanguageModelUsage(
|
3696
3757
|
currentModelResponse.usage
|
3697
3758
|
);
|
3698
|
-
usage
|
3699
|
-
usage.promptTokens += currentUsage.promptTokens;
|
3700
|
-
usage.totalTokens += currentUsage.totalTokens;
|
3759
|
+
usage = addLanguageModelUsage(usage, currentUsage);
|
3701
3760
|
let nextStepType = "done";
|
3702
3761
|
if (++stepCount < maxSteps) {
|
3703
3762
|
if (continueSteps && currentModelResponse.finishReason === "length" && // only use continue when there are no tool calls:
|
@@ -3777,7 +3836,13 @@ async function generateText({
|
|
3777
3836
|
);
|
3778
3837
|
return new DefaultGenerateTextResult({
|
3779
3838
|
text: text2,
|
3780
|
-
output: output == null ? void 0 : output.parseOutput(
|
3839
|
+
output: output == null ? void 0 : output.parseOutput(
|
3840
|
+
{ text: text2 },
|
3841
|
+
{
|
3842
|
+
response: currentModelResponse.response,
|
3843
|
+
usage
|
3844
|
+
}
|
3845
|
+
),
|
3781
3846
|
toolCalls: currentToolCalls,
|
3782
3847
|
toolResults: currentToolResults,
|
3783
3848
|
finishReason: currentModelResponse.finishReason,
|
@@ -3920,8 +3985,31 @@ var object = ({
|
|
3920
3985
|
schema: schema.jsonSchema
|
3921
3986
|
});
|
3922
3987
|
},
|
3923
|
-
parseOutput({ text: text2 }) {
|
3924
|
-
|
3988
|
+
parseOutput({ text: text2 }, context) {
|
3989
|
+
const parseResult = (0, import_provider_utils10.safeParseJSON)({ text: text2 });
|
3990
|
+
if (!parseResult.success) {
|
3991
|
+
throw new NoObjectGeneratedError({
|
3992
|
+
message: "No object generated: could not parse the response.",
|
3993
|
+
cause: parseResult.error,
|
3994
|
+
text: text2,
|
3995
|
+
response: context.response,
|
3996
|
+
usage: context.usage
|
3997
|
+
});
|
3998
|
+
}
|
3999
|
+
const validationResult = (0, import_provider_utils10.safeValidateTypes)({
|
4000
|
+
value: parseResult.value,
|
4001
|
+
schema
|
4002
|
+
});
|
4003
|
+
if (!validationResult.success) {
|
4004
|
+
throw new NoObjectGeneratedError({
|
4005
|
+
message: "No object generated: response did not match schema.",
|
4006
|
+
cause: validationResult.error,
|
4007
|
+
text: text2,
|
4008
|
+
response: context.response,
|
4009
|
+
usage: context.usage
|
4010
|
+
});
|
4011
|
+
}
|
4012
|
+
return validationResult.value;
|
3925
4013
|
}
|
3926
4014
|
};
|
3927
4015
|
};
|
@@ -4326,10 +4414,168 @@ var DefaultStreamTextResult = class {
|
|
4326
4414
|
message: "maxSteps must be at least 1"
|
4327
4415
|
});
|
4328
4416
|
}
|
4417
|
+
let recordedStepText = "";
|
4418
|
+
let recordedContinuationText = "";
|
4419
|
+
let recordedFullText = "";
|
4420
|
+
let recordedRequest = void 0;
|
4421
|
+
const recordedResponse = {
|
4422
|
+
id: generateId3(),
|
4423
|
+
timestamp: currentDate(),
|
4424
|
+
modelId: model.modelId,
|
4425
|
+
messages: []
|
4426
|
+
};
|
4427
|
+
let recordedToolCalls = [];
|
4428
|
+
let recordedToolResults = [];
|
4429
|
+
let recordedFinishReason = void 0;
|
4430
|
+
let recordedUsage = void 0;
|
4431
|
+
let recordedProviderMetadata = void 0;
|
4432
|
+
let stepType = "initial";
|
4433
|
+
const recordedSteps = [];
|
4434
|
+
let rootSpan;
|
4435
|
+
const eventProcessor = new TransformStream({
|
4436
|
+
async transform(chunk, controller) {
|
4437
|
+
controller.enqueue(chunk);
|
4438
|
+
if (chunk.type === "text-delta" || chunk.type === "tool-call" || chunk.type === "tool-result" || chunk.type === "tool-call-streaming-start" || chunk.type === "tool-call-delta") {
|
4439
|
+
await (onChunk == null ? void 0 : onChunk({ chunk }));
|
4440
|
+
}
|
4441
|
+
if (chunk.type === "text-delta") {
|
4442
|
+
recordedStepText += chunk.textDelta;
|
4443
|
+
recordedContinuationText += chunk.textDelta;
|
4444
|
+
recordedFullText += chunk.textDelta;
|
4445
|
+
}
|
4446
|
+
if (chunk.type === "tool-call") {
|
4447
|
+
recordedToolCalls.push(chunk);
|
4448
|
+
}
|
4449
|
+
if (chunk.type === "tool-result") {
|
4450
|
+
recordedToolResults.push(chunk);
|
4451
|
+
}
|
4452
|
+
if (chunk.type === "step-finish") {
|
4453
|
+
const stepMessages = toResponseMessages({
|
4454
|
+
text: recordedContinuationText,
|
4455
|
+
tools: tools != null ? tools : {},
|
4456
|
+
toolCalls: recordedToolCalls,
|
4457
|
+
toolResults: recordedToolResults
|
4458
|
+
});
|
4459
|
+
const currentStep = recordedSteps.length;
|
4460
|
+
let nextStepType = "done";
|
4461
|
+
if (currentStep + 1 < maxSteps) {
|
4462
|
+
if (continueSteps && chunk.finishReason === "length" && // only use continue when there are no tool calls:
|
4463
|
+
recordedToolCalls.length === 0) {
|
4464
|
+
nextStepType = "continue";
|
4465
|
+
} else if (
|
4466
|
+
// there are tool calls:
|
4467
|
+
recordedToolCalls.length > 0 && // all current tool calls have results:
|
4468
|
+
recordedToolResults.length === recordedToolCalls.length
|
4469
|
+
) {
|
4470
|
+
nextStepType = "tool-result";
|
4471
|
+
}
|
4472
|
+
}
|
4473
|
+
const currentStepResult = {
|
4474
|
+
stepType,
|
4475
|
+
text: recordedStepText,
|
4476
|
+
toolCalls: recordedToolCalls,
|
4477
|
+
toolResults: recordedToolResults,
|
4478
|
+
finishReason: chunk.finishReason,
|
4479
|
+
usage: chunk.usage,
|
4480
|
+
warnings: chunk.warnings,
|
4481
|
+
logprobs: chunk.logprobs,
|
4482
|
+
request: chunk.request,
|
4483
|
+
response: {
|
4484
|
+
...chunk.response,
|
4485
|
+
messages: [...recordedResponse.messages, ...stepMessages]
|
4486
|
+
},
|
4487
|
+
experimental_providerMetadata: chunk.experimental_providerMetadata,
|
4488
|
+
isContinued: chunk.isContinued
|
4489
|
+
};
|
4490
|
+
await (onStepFinish == null ? void 0 : onStepFinish(currentStepResult));
|
4491
|
+
recordedSteps.push(currentStepResult);
|
4492
|
+
recordedToolCalls = [];
|
4493
|
+
recordedToolResults = [];
|
4494
|
+
recordedStepText = "";
|
4495
|
+
recordedRequest = chunk.request;
|
4496
|
+
if (nextStepType !== "done") {
|
4497
|
+
stepType = nextStepType;
|
4498
|
+
}
|
4499
|
+
if (nextStepType !== "continue") {
|
4500
|
+
recordedResponse.messages.push(...stepMessages);
|
4501
|
+
recordedContinuationText = "";
|
4502
|
+
}
|
4503
|
+
}
|
4504
|
+
if (chunk.type === "finish") {
|
4505
|
+
recordedResponse.id = chunk.response.id;
|
4506
|
+
recordedResponse.timestamp = chunk.response.timestamp;
|
4507
|
+
recordedResponse.modelId = chunk.response.modelId;
|
4508
|
+
recordedResponse.headers = chunk.response.headers;
|
4509
|
+
recordedUsage = chunk.usage;
|
4510
|
+
recordedFinishReason = chunk.finishReason;
|
4511
|
+
recordedProviderMetadata = chunk.experimental_providerMetadata;
|
4512
|
+
}
|
4513
|
+
},
|
4514
|
+
async flush(controller) {
|
4515
|
+
var _a13;
|
4516
|
+
try {
|
4517
|
+
const lastStep = recordedSteps[recordedSteps.length - 1];
|
4518
|
+
if (lastStep) {
|
4519
|
+
self.warningsPromise.resolve(lastStep.warnings);
|
4520
|
+
self.requestPromise.resolve(lastStep.request);
|
4521
|
+
self.responsePromise.resolve(lastStep.response);
|
4522
|
+
self.toolCallsPromise.resolve(lastStep.toolCalls);
|
4523
|
+
self.toolResultsPromise.resolve(lastStep.toolResults);
|
4524
|
+
self.providerMetadataPromise.resolve(
|
4525
|
+
lastStep.experimental_providerMetadata
|
4526
|
+
);
|
4527
|
+
}
|
4528
|
+
const finishReason = recordedFinishReason != null ? recordedFinishReason : "unknown";
|
4529
|
+
const usage = recordedUsage != null ? recordedUsage : {
|
4530
|
+
completionTokens: NaN,
|
4531
|
+
promptTokens: NaN,
|
4532
|
+
totalTokens: NaN
|
4533
|
+
};
|
4534
|
+
self.finishReasonPromise.resolve(finishReason);
|
4535
|
+
self.usagePromise.resolve(usage);
|
4536
|
+
self.textPromise.resolve(recordedFullText);
|
4537
|
+
self.stepsPromise.resolve(recordedSteps);
|
4538
|
+
await (onFinish == null ? void 0 : onFinish({
|
4539
|
+
finishReason,
|
4540
|
+
logprobs: void 0,
|
4541
|
+
usage,
|
4542
|
+
text: recordedFullText,
|
4543
|
+
toolCalls: lastStep.toolCalls,
|
4544
|
+
toolResults: lastStep.toolResults,
|
4545
|
+
request: (_a13 = lastStep.request) != null ? _a13 : {},
|
4546
|
+
response: lastStep.response,
|
4547
|
+
warnings: lastStep.warnings,
|
4548
|
+
experimental_providerMetadata: lastStep.experimental_providerMetadata,
|
4549
|
+
steps: recordedSteps
|
4550
|
+
}));
|
4551
|
+
rootSpan.setAttributes(
|
4552
|
+
selectTelemetryAttributes({
|
4553
|
+
telemetry,
|
4554
|
+
attributes: {
|
4555
|
+
"ai.response.finishReason": finishReason,
|
4556
|
+
"ai.response.text": { output: () => recordedFullText },
|
4557
|
+
"ai.response.toolCalls": {
|
4558
|
+
output: () => {
|
4559
|
+
var _a14;
|
4560
|
+
return ((_a14 = lastStep.toolCalls) == null ? void 0 : _a14.length) ? JSON.stringify(lastStep.toolCalls) : void 0;
|
4561
|
+
}
|
4562
|
+
},
|
4563
|
+
"ai.usage.promptTokens": usage.promptTokens,
|
4564
|
+
"ai.usage.completionTokens": usage.completionTokens
|
4565
|
+
}
|
4566
|
+
})
|
4567
|
+
);
|
4568
|
+
} catch (error) {
|
4569
|
+
controller.error(error);
|
4570
|
+
} finally {
|
4571
|
+
rootSpan.end();
|
4572
|
+
}
|
4573
|
+
}
|
4574
|
+
});
|
4329
4575
|
const stitchableStream = createStitchableStream();
|
4330
4576
|
this.addStream = stitchableStream.addStream;
|
4331
4577
|
this.closeStream = stitchableStream.close;
|
4332
|
-
this.baseStream = transform ? stitchableStream.stream.pipeThrough(transform) : stitchableStream.stream;
|
4578
|
+
this.baseStream = (transform ? stitchableStream.stream.pipeThrough(transform) : stitchableStream.stream).pipeThrough(eventProcessor);
|
4333
4579
|
const { maxRetries, retry } = prepareRetries({
|
4334
4580
|
maxRetries: maxRetriesArg
|
4335
4581
|
});
|
@@ -4361,13 +4607,13 @@ var DefaultStreamTextResult = class {
|
|
4361
4607
|
}),
|
4362
4608
|
tracer,
|
4363
4609
|
endWhenDone: false,
|
4364
|
-
fn: async (
|
4365
|
-
|
4610
|
+
fn: async (rootSpanArg) => {
|
4611
|
+
rootSpan = rootSpanArg;
|
4366
4612
|
async function streamStep({
|
4367
4613
|
currentStep,
|
4368
4614
|
responseMessages,
|
4369
4615
|
usage,
|
4370
|
-
stepType,
|
4616
|
+
stepType: stepType2,
|
4371
4617
|
previousStepText,
|
4372
4618
|
hasLeadingWhitespace
|
4373
4619
|
}) {
|
@@ -4473,7 +4719,7 @@ var DefaultStreamTextResult = class {
|
|
4473
4719
|
let stepProviderMetadata;
|
4474
4720
|
let stepFirstChunk = true;
|
4475
4721
|
let stepText = "";
|
4476
|
-
let fullStepText =
|
4722
|
+
let fullStepText = stepType2 === "continue" ? previousStepText : "";
|
4477
4723
|
let stepLogProbs;
|
4478
4724
|
let stepResponse = {
|
4479
4725
|
id: generateId3(),
|
@@ -4493,7 +4739,6 @@ var DefaultStreamTextResult = class {
|
|
4493
4739
|
fullStepText += chunk.textDelta;
|
4494
4740
|
chunkTextPublished = true;
|
4495
4741
|
hasWhitespaceSuffix = chunk.textDelta.trimEnd() !== chunk.textDelta;
|
4496
|
-
await (onChunk == null ? void 0 : onChunk({ chunk }));
|
4497
4742
|
}
|
4498
4743
|
self.addStream(
|
4499
4744
|
transformedStream.pipeThrough(
|
@@ -4542,13 +4787,11 @@ var DefaultStreamTextResult = class {
|
|
4542
4787
|
case "tool-call": {
|
4543
4788
|
controller.enqueue(chunk);
|
4544
4789
|
stepToolCalls.push(chunk);
|
4545
|
-
await (onChunk == null ? void 0 : onChunk({ chunk }));
|
4546
4790
|
break;
|
4547
4791
|
}
|
4548
4792
|
case "tool-result": {
|
4549
4793
|
controller.enqueue(chunk);
|
4550
4794
|
stepToolResults.push(chunk);
|
4551
|
-
await (onChunk == null ? void 0 : onChunk({ chunk }));
|
4552
4795
|
break;
|
4553
4796
|
}
|
4554
4797
|
case "response-metadata": {
|
@@ -4575,7 +4818,6 @@ var DefaultStreamTextResult = class {
|
|
4575
4818
|
case "tool-call-streaming-start":
|
4576
4819
|
case "tool-call-delta": {
|
4577
4820
|
controller.enqueue(chunk);
|
4578
|
-
await (onChunk == null ? void 0 : onChunk({ chunk }));
|
4579
4821
|
break;
|
4580
4822
|
}
|
4581
4823
|
case "error": {
|
@@ -4606,7 +4848,7 @@ var DefaultStreamTextResult = class {
|
|
4606
4848
|
}
|
4607
4849
|
}
|
4608
4850
|
if (continueSteps && chunkBuffer.length > 0 && (nextStepType !== "continue" || // when the next step is a regular step, publish the buffer
|
4609
|
-
|
4851
|
+
stepType2 === "continue" && !chunkTextPublished)) {
|
4610
4852
|
await publishTextChunk({
|
4611
4853
|
controller,
|
4612
4854
|
chunk: {
|
@@ -4650,69 +4892,16 @@ var DefaultStreamTextResult = class {
|
|
4650
4892
|
usage: stepUsage,
|
4651
4893
|
experimental_providerMetadata: stepProviderMetadata,
|
4652
4894
|
logprobs: stepLogProbs,
|
4653
|
-
response: {
|
4654
|
-
...stepResponse
|
4655
|
-
},
|
4656
|
-
isContinued: nextStepType === "continue"
|
4657
|
-
});
|
4658
|
-
if (stepType === "continue") {
|
4659
|
-
const lastMessage = responseMessages[responseMessages.length - 1];
|
4660
|
-
if (typeof lastMessage.content === "string") {
|
4661
|
-
lastMessage.content += stepText;
|
4662
|
-
} else {
|
4663
|
-
lastMessage.content.push({
|
4664
|
-
text: stepText,
|
4665
|
-
type: "text"
|
4666
|
-
});
|
4667
|
-
}
|
4668
|
-
} else {
|
4669
|
-
responseMessages.push(
|
4670
|
-
...toResponseMessages({
|
4671
|
-
text: stepText,
|
4672
|
-
tools: tools != null ? tools : {},
|
4673
|
-
toolCalls: stepToolCalls,
|
4674
|
-
toolResults: stepToolResults
|
4675
|
-
})
|
4676
|
-
);
|
4677
|
-
}
|
4678
|
-
const currentStepResult = {
|
4679
|
-
stepType,
|
4680
|
-
text: stepText,
|
4681
|
-
toolCalls: stepToolCalls,
|
4682
|
-
toolResults: stepToolResults,
|
4683
|
-
finishReason: stepFinishReason,
|
4684
|
-
usage: stepUsage,
|
4685
|
-
warnings,
|
4686
|
-
logprobs: stepLogProbs,
|
4687
4895
|
request: stepRequest,
|
4688
4896
|
response: {
|
4689
4897
|
...stepResponse,
|
4690
|
-
headers: rawResponse == null ? void 0 : rawResponse.headers
|
4691
|
-
// deep clone msgs to avoid mutating past messages in multi-step:
|
4692
|
-
messages: JSON.parse(JSON.stringify(responseMessages))
|
4898
|
+
headers: rawResponse == null ? void 0 : rawResponse.headers
|
4693
4899
|
},
|
4694
|
-
|
4900
|
+
warnings,
|
4695
4901
|
isContinued: nextStepType === "continue"
|
4696
|
-
};
|
4697
|
-
|
4698
|
-
|
4699
|
-
const combinedUsage = {
|
4700
|
-
promptTokens: usage.promptTokens + stepUsage.promptTokens,
|
4701
|
-
completionTokens: usage.completionTokens + stepUsage.completionTokens,
|
4702
|
-
totalTokens: usage.totalTokens + stepUsage.totalTokens
|
4703
|
-
};
|
4704
|
-
if (nextStepType !== "done") {
|
4705
|
-
await streamStep({
|
4706
|
-
currentStep: currentStep + 1,
|
4707
|
-
responseMessages,
|
4708
|
-
usage: combinedUsage,
|
4709
|
-
stepType: nextStepType,
|
4710
|
-
previousStepText: fullStepText,
|
4711
|
-
hasLeadingWhitespace: hasWhitespaceSuffix
|
4712
|
-
});
|
4713
|
-
return;
|
4714
|
-
}
|
4715
|
-
try {
|
4902
|
+
});
|
4903
|
+
const combinedUsage = addLanguageModelUsage(usage, stepUsage);
|
4904
|
+
if (nextStepType === "done") {
|
4716
4905
|
controller.enqueue({
|
4717
4906
|
type: "finish",
|
4718
4907
|
finishReason: stepFinishReason,
|
@@ -4720,63 +4909,40 @@ var DefaultStreamTextResult = class {
|
|
4720
4909
|
experimental_providerMetadata: stepProviderMetadata,
|
4721
4910
|
logprobs: stepLogProbs,
|
4722
4911
|
response: {
|
4723
|
-
...stepResponse
|
4912
|
+
...stepResponse,
|
4913
|
+
headers: rawResponse == null ? void 0 : rawResponse.headers
|
4724
4914
|
}
|
4725
4915
|
});
|
4726
4916
|
self.closeStream();
|
4727
|
-
|
4728
|
-
|
4729
|
-
|
4730
|
-
|
4731
|
-
|
4732
|
-
|
4733
|
-
|
4734
|
-
|
4735
|
-
|
4736
|
-
|
4737
|
-
|
4738
|
-
|
4739
|
-
|
4740
|
-
|
4741
|
-
|
4742
|
-
|
4743
|
-
|
4744
|
-
|
4745
|
-
|
4746
|
-
|
4747
|
-
|
4748
|
-
|
4749
|
-
|
4750
|
-
|
4751
|
-
messages: responseMessages
|
4752
|
-
});
|
4753
|
-
self.stepsPromise.resolve(stepResults);
|
4754
|
-
self.warningsPromise.resolve(warnings != null ? warnings : []);
|
4755
|
-
await (onFinish == null ? void 0 : onFinish({
|
4756
|
-
finishReason: stepFinishReason,
|
4757
|
-
logprobs: stepLogProbs,
|
4917
|
+
} else {
|
4918
|
+
if (stepType2 === "continue") {
|
4919
|
+
const lastMessage = responseMessages[responseMessages.length - 1];
|
4920
|
+
if (typeof lastMessage.content === "string") {
|
4921
|
+
lastMessage.content += stepText;
|
4922
|
+
} else {
|
4923
|
+
lastMessage.content.push({
|
4924
|
+
text: stepText,
|
4925
|
+
type: "text"
|
4926
|
+
});
|
4927
|
+
}
|
4928
|
+
} else {
|
4929
|
+
responseMessages.push(
|
4930
|
+
...toResponseMessages({
|
4931
|
+
text: stepText,
|
4932
|
+
tools: tools != null ? tools : {},
|
4933
|
+
toolCalls: stepToolCalls,
|
4934
|
+
toolResults: stepToolResults
|
4935
|
+
})
|
4936
|
+
);
|
4937
|
+
}
|
4938
|
+
await streamStep({
|
4939
|
+
currentStep: currentStep + 1,
|
4940
|
+
responseMessages,
|
4758
4941
|
usage: combinedUsage,
|
4759
|
-
|
4760
|
-
|
4761
|
-
|
4762
|
-
|
4763
|
-
// optional as well. Therefore we need to cast the toolResults to any.
|
4764
|
-
// The type exposed to the users will be correctly inferred.
|
4765
|
-
toolResults: stepToolResults,
|
4766
|
-
request: stepRequest,
|
4767
|
-
response: {
|
4768
|
-
...stepResponse,
|
4769
|
-
headers: rawResponse == null ? void 0 : rawResponse.headers,
|
4770
|
-
messages: responseMessages
|
4771
|
-
},
|
4772
|
-
warnings,
|
4773
|
-
experimental_providerMetadata: stepProviderMetadata,
|
4774
|
-
steps: stepResults
|
4775
|
-
}));
|
4776
|
-
} catch (error) {
|
4777
|
-
controller.error(error);
|
4778
|
-
} finally {
|
4779
|
-
rootSpan.end();
|
4942
|
+
stepType: nextStepType,
|
4943
|
+
previousStepText: fullStepText,
|
4944
|
+
hasLeadingWhitespace: hasWhitespaceSuffix
|
4945
|
+
});
|
4780
4946
|
}
|
4781
4947
|
}
|
4782
4948
|
})
|