@ai-sdk/provider-utils 4.0.48 → 4.0.50
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 +12 -0
- package/dist/index.d.mts +9 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +107 -17
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +106 -17
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/embedding-model-capabilities.ts +9 -0
- package/src/handle-fetch-error.ts +44 -12
- package/src/index.ts +1 -0
- package/src/response-handler.ts +78 -2
package/dist/index.mjs
CHANGED
|
@@ -631,6 +631,11 @@ async function downloadBlob(url, options) {
|
|
|
631
631
|
}
|
|
632
632
|
}
|
|
633
633
|
|
|
634
|
+
// src/embedding-model-capabilities.ts
|
|
635
|
+
var EMBEDDING_MODEL_MAX_INPUT_BYTES_PER_CALL = /* @__PURE__ */ Symbol.for(
|
|
636
|
+
"vercel.ai.embeddingModel.maxInputBytesPerCall"
|
|
637
|
+
);
|
|
638
|
+
|
|
634
639
|
// src/generate-id.ts
|
|
635
640
|
import { InvalidArgumentError } from "@ai-sdk/provider";
|
|
636
641
|
var createIdGenerator = ({
|
|
@@ -688,24 +693,31 @@ function isAbortError(error) {
|
|
|
688
693
|
|
|
689
694
|
// src/handle-fetch-error.ts
|
|
690
695
|
var FETCH_FAILED_ERROR_MESSAGES = ["fetch failed", "failed to fetch"];
|
|
691
|
-
var
|
|
696
|
+
var RETRYABLE_NETWORK_ERROR_CODES = /* @__PURE__ */ new Set([
|
|
692
697
|
"ConnectionRefused",
|
|
693
698
|
"ConnectionClosed",
|
|
694
699
|
"FailedToOpenSocket",
|
|
695
700
|
"ECONNRESET",
|
|
696
701
|
"ECONNREFUSED",
|
|
697
702
|
"ETIMEDOUT",
|
|
698
|
-
"EPIPE"
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
703
|
+
"EPIPE",
|
|
704
|
+
"UND_ERR_SOCKET",
|
|
705
|
+
"UND_ERR_HEADERS_TIMEOUT",
|
|
706
|
+
"UND_ERR_BODY_TIMEOUT",
|
|
707
|
+
"UND_ERR_CONNECT_TIMEOUT"
|
|
708
|
+
]);
|
|
709
|
+
function findNetworkError(error) {
|
|
710
|
+
const visited = /* @__PURE__ */ new Set();
|
|
711
|
+
let current = error;
|
|
712
|
+
while (current instanceof Error && !visited.has(current)) {
|
|
713
|
+
visited.add(current);
|
|
714
|
+
const errorWithCode = current;
|
|
715
|
+
if (typeof errorWithCode.code === "string" && RETRYABLE_NETWORK_ERROR_CODES.has(errorWithCode.code)) {
|
|
716
|
+
return errorWithCode;
|
|
717
|
+
}
|
|
718
|
+
current = current.cause;
|
|
719
|
+
}
|
|
720
|
+
return void 0;
|
|
709
721
|
}
|
|
710
722
|
function handleFetchError({
|
|
711
723
|
error,
|
|
@@ -728,9 +740,23 @@ function handleFetchError({
|
|
|
728
740
|
});
|
|
729
741
|
}
|
|
730
742
|
}
|
|
731
|
-
|
|
743
|
+
const networkError = findNetworkError(error);
|
|
744
|
+
if (networkError != null) {
|
|
745
|
+
if (APICallError.isInstance(error)) {
|
|
746
|
+
return new APICallError({
|
|
747
|
+
message: error.message,
|
|
748
|
+
cause: error.cause,
|
|
749
|
+
url: error.url,
|
|
750
|
+
requestBodyValues: error.requestBodyValues,
|
|
751
|
+
statusCode: error.statusCode,
|
|
752
|
+
responseHeaders: error.responseHeaders,
|
|
753
|
+
responseBody: error.responseBody,
|
|
754
|
+
data: error.data,
|
|
755
|
+
isRetryable: true
|
|
756
|
+
});
|
|
757
|
+
}
|
|
732
758
|
return new APICallError({
|
|
733
|
-
message: `Cannot connect to API: ${error.message}`,
|
|
759
|
+
message: `Cannot connect to API: ${error instanceof Error ? error.message : networkError.message}`,
|
|
734
760
|
cause: error,
|
|
735
761
|
url,
|
|
736
762
|
requestBodyValues,
|
|
@@ -793,7 +819,7 @@ function withUserAgentSuffix(headers, ...userAgentSuffixParts) {
|
|
|
793
819
|
}
|
|
794
820
|
|
|
795
821
|
// src/version.ts
|
|
796
|
-
var VERSION = true ? "4.0.
|
|
822
|
+
var VERSION = true ? "4.0.50" : "0.0.0-test";
|
|
797
823
|
|
|
798
824
|
// src/get-from-api.ts
|
|
799
825
|
var getOriginalFetch = () => globalThis.fetch;
|
|
@@ -2837,6 +2863,62 @@ async function retryWithExponentialBackoffInternal(f, {
|
|
|
2837
2863
|
// src/response-handler.ts
|
|
2838
2864
|
import { APICallError as APICallError4, EmptyResponseBodyError } from "@ai-sdk/provider";
|
|
2839
2865
|
var textDecoder = new TextDecoder();
|
|
2866
|
+
function wrapResponseBodyStream({
|
|
2867
|
+
stream,
|
|
2868
|
+
url,
|
|
2869
|
+
requestBodyValues,
|
|
2870
|
+
statusCode,
|
|
2871
|
+
responseHeaders
|
|
2872
|
+
}) {
|
|
2873
|
+
const reader = stream.getReader();
|
|
2874
|
+
let readerReleased = false;
|
|
2875
|
+
const releaseReader = () => {
|
|
2876
|
+
if (!readerReleased) {
|
|
2877
|
+
reader.releaseLock();
|
|
2878
|
+
readerReleased = true;
|
|
2879
|
+
}
|
|
2880
|
+
};
|
|
2881
|
+
return new ReadableStream({
|
|
2882
|
+
async pull(controller) {
|
|
2883
|
+
try {
|
|
2884
|
+
const { done, value } = await reader.read();
|
|
2885
|
+
if (done) {
|
|
2886
|
+
releaseReader();
|
|
2887
|
+
controller.close();
|
|
2888
|
+
} else {
|
|
2889
|
+
controller.enqueue(value);
|
|
2890
|
+
}
|
|
2891
|
+
} catch (error) {
|
|
2892
|
+
releaseReader();
|
|
2893
|
+
if (isAbortError(error)) {
|
|
2894
|
+
controller.error(error);
|
|
2895
|
+
return;
|
|
2896
|
+
}
|
|
2897
|
+
controller.error(
|
|
2898
|
+
handleFetchError({
|
|
2899
|
+
error: new APICallError4({
|
|
2900
|
+
message: "Failed to process successful response",
|
|
2901
|
+
cause: error,
|
|
2902
|
+
statusCode,
|
|
2903
|
+
url,
|
|
2904
|
+
responseHeaders,
|
|
2905
|
+
requestBodyValues
|
|
2906
|
+
}),
|
|
2907
|
+
url,
|
|
2908
|
+
requestBodyValues
|
|
2909
|
+
})
|
|
2910
|
+
);
|
|
2911
|
+
}
|
|
2912
|
+
},
|
|
2913
|
+
async cancel(reason) {
|
|
2914
|
+
try {
|
|
2915
|
+
await reader.cancel(reason);
|
|
2916
|
+
} finally {
|
|
2917
|
+
releaseReader();
|
|
2918
|
+
}
|
|
2919
|
+
}
|
|
2920
|
+
});
|
|
2921
|
+
}
|
|
2840
2922
|
async function readResponseBodyAsText({
|
|
2841
2923
|
response,
|
|
2842
2924
|
url
|
|
@@ -2902,7 +2984,7 @@ var createJsonErrorResponseHandler = ({
|
|
|
2902
2984
|
};
|
|
2903
2985
|
}
|
|
2904
2986
|
};
|
|
2905
|
-
var createEventSourceResponseHandler = (chunkSchema) => async ({ response }) => {
|
|
2987
|
+
var createEventSourceResponseHandler = (chunkSchema) => async ({ response, url, requestBodyValues }) => {
|
|
2906
2988
|
const responseHeaders = extractResponseHeaders(response);
|
|
2907
2989
|
if (response.body == null) {
|
|
2908
2990
|
throw new EmptyResponseBodyError({});
|
|
@@ -2910,7 +2992,13 @@ var createEventSourceResponseHandler = (chunkSchema) => async ({ response }) =>
|
|
|
2910
2992
|
return {
|
|
2911
2993
|
responseHeaders,
|
|
2912
2994
|
value: parseJsonEventStream({
|
|
2913
|
-
stream:
|
|
2995
|
+
stream: wrapResponseBodyStream({
|
|
2996
|
+
stream: response.body,
|
|
2997
|
+
url,
|
|
2998
|
+
requestBodyValues,
|
|
2999
|
+
statusCode: response.status,
|
|
3000
|
+
responseHeaders
|
|
3001
|
+
}),
|
|
2914
3002
|
schema: chunkSchema
|
|
2915
3003
|
})
|
|
2916
3004
|
};
|
|
@@ -3028,6 +3116,7 @@ export {
|
|
|
3028
3116
|
DEFAULT_MAX_DOWNLOAD_SIZE,
|
|
3029
3117
|
DelayedPromise,
|
|
3030
3118
|
DownloadError,
|
|
3119
|
+
EMBEDDING_MODEL_MAX_INPUT_BYTES_PER_CALL as EXPERIMENTAL_EMBEDDING_MODEL_MAX_INPUT_BYTES_PER_CALL,
|
|
3031
3120
|
EventSourceParserStream2 as EventSourceParserStream,
|
|
3032
3121
|
VERSION,
|
|
3033
3122
|
asSchema,
|