@ai-sdk/provider-utils 4.0.49 → 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 +6 -0
- package/dist/index.js +100 -17
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +100 -17
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/handle-fetch-error.ts +44 -12
- package/src/response-handler.ts +78 -2
package/dist/index.mjs
CHANGED
|
@@ -693,24 +693,31 @@ function isAbortError(error) {
|
|
|
693
693
|
|
|
694
694
|
// src/handle-fetch-error.ts
|
|
695
695
|
var FETCH_FAILED_ERROR_MESSAGES = ["fetch failed", "failed to fetch"];
|
|
696
|
-
var
|
|
696
|
+
var RETRYABLE_NETWORK_ERROR_CODES = /* @__PURE__ */ new Set([
|
|
697
697
|
"ConnectionRefused",
|
|
698
698
|
"ConnectionClosed",
|
|
699
699
|
"FailedToOpenSocket",
|
|
700
700
|
"ECONNRESET",
|
|
701
701
|
"ECONNREFUSED",
|
|
702
702
|
"ETIMEDOUT",
|
|
703
|
-
"EPIPE"
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
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;
|
|
714
721
|
}
|
|
715
722
|
function handleFetchError({
|
|
716
723
|
error,
|
|
@@ -733,9 +740,23 @@ function handleFetchError({
|
|
|
733
740
|
});
|
|
734
741
|
}
|
|
735
742
|
}
|
|
736
|
-
|
|
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
|
+
}
|
|
737
758
|
return new APICallError({
|
|
738
|
-
message: `Cannot connect to API: ${error.message}`,
|
|
759
|
+
message: `Cannot connect to API: ${error instanceof Error ? error.message : networkError.message}`,
|
|
739
760
|
cause: error,
|
|
740
761
|
url,
|
|
741
762
|
requestBodyValues,
|
|
@@ -798,7 +819,7 @@ function withUserAgentSuffix(headers, ...userAgentSuffixParts) {
|
|
|
798
819
|
}
|
|
799
820
|
|
|
800
821
|
// src/version.ts
|
|
801
|
-
var VERSION = true ? "4.0.
|
|
822
|
+
var VERSION = true ? "4.0.50" : "0.0.0-test";
|
|
802
823
|
|
|
803
824
|
// src/get-from-api.ts
|
|
804
825
|
var getOriginalFetch = () => globalThis.fetch;
|
|
@@ -2842,6 +2863,62 @@ async function retryWithExponentialBackoffInternal(f, {
|
|
|
2842
2863
|
// src/response-handler.ts
|
|
2843
2864
|
import { APICallError as APICallError4, EmptyResponseBodyError } from "@ai-sdk/provider";
|
|
2844
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
|
+
}
|
|
2845
2922
|
async function readResponseBodyAsText({
|
|
2846
2923
|
response,
|
|
2847
2924
|
url
|
|
@@ -2907,7 +2984,7 @@ var createJsonErrorResponseHandler = ({
|
|
|
2907
2984
|
};
|
|
2908
2985
|
}
|
|
2909
2986
|
};
|
|
2910
|
-
var createEventSourceResponseHandler = (chunkSchema) => async ({ response }) => {
|
|
2987
|
+
var createEventSourceResponseHandler = (chunkSchema) => async ({ response, url, requestBodyValues }) => {
|
|
2911
2988
|
const responseHeaders = extractResponseHeaders(response);
|
|
2912
2989
|
if (response.body == null) {
|
|
2913
2990
|
throw new EmptyResponseBodyError({});
|
|
@@ -2915,7 +2992,13 @@ var createEventSourceResponseHandler = (chunkSchema) => async ({ response }) =>
|
|
|
2915
2992
|
return {
|
|
2916
2993
|
responseHeaders,
|
|
2917
2994
|
value: parseJsonEventStream({
|
|
2918
|
-
stream:
|
|
2995
|
+
stream: wrapResponseBodyStream({
|
|
2996
|
+
stream: response.body,
|
|
2997
|
+
url,
|
|
2998
|
+
requestBodyValues,
|
|
2999
|
+
statusCode: response.status,
|
|
3000
|
+
responseHeaders
|
|
3001
|
+
}),
|
|
2919
3002
|
schema: chunkSchema
|
|
2920
3003
|
})
|
|
2921
3004
|
};
|