import type { Api, Model } from "@mariozechner/pi-ai"; import { fetchWithSsrFGuard } from "../infra/net/fetch-guard.js"; import { resolveDebugProxySettings } from "../proxy-capture/env.js"; import {
buildProviderRequestDispatcherPolicy,
getModelProviderRequestTransport,
mergeModelProviderRequestOverrides,
resolveProviderRequestPolicyConfig,
} from "./provider-request-config.js";
const DEFAULT_MAX_SDK_RETRY_WAIT_SECONDS = 60;
function parseRetryAfterSeconds(headers: Headers): number | undefined { const retryAfterMs = headers.get("retry-after-ms"); if (retryAfterMs) { const milliseconds = Number.parseFloat(retryAfterMs); if (Number.isFinite(milliseconds) && milliseconds >= 0) { return milliseconds / 1000;
}
}
const retryAfter = headers.get("retry-after"); if (!retryAfter) { return undefined;
}
function resolveMaxSdkRetryWaitSeconds(): number | undefined { const raw = process.env.OPENCLAW_SDK_RETRY_MAX_WAIT_SECONDS?.trim(); if (!raw) { return DEFAULT_MAX_SDK_RETRY_WAIT_SECONDS;
}
if (/^(?:0|false|off|none|disabled)$/i.test(raw)) { return undefined;
}
function shouldBypassLongSdkRetry(response: Response): boolean { const maxWaitSeconds = resolveMaxSdkRetryWaitSeconds(); if (maxWaitSeconds === undefined) { returnfalse;
}
const status = response.status; const stainlessRetryable = status === 408 || status === 409 || status === 429 || status >= 500; if (!stainlessRetryable) { returnfalse;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.