























@@ -6,7 +6,6 @@ import type {
66} from "../config/types.provider-request.js";
77import { assertSecretInputResolved } from "../config/types.secrets.js";
88import type { PinnedDispatcherPolicy } from "../infra/net/ssrf.js";
9-import { isLoopbackIpAddress } from "../shared/net/ip.js";
109import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js";
1110import type {
1211ProviderRequestCapabilities,
@@ -139,6 +138,7 @@ type ProviderRequestHeaderPrecedence = "caller-wins" | "defaults-win";
139138140139type ResolvedProviderRequestPolicyConfig = ResolvedProviderRequestConfig & {
141140allowPrivateNetwork: boolean;
141+privateNetworkExplicitlyDenied: boolean;
142142capabilities: ProviderRequestCapabilities;
143143};
144144@@ -167,28 +167,23 @@ type ResolveProviderRequestPolicyConfigParams = {
167167request?: ModelProviderRequestTransportOverrides;
168168};
169169170-function isLoopbackProviderBaseUrl(baseUrl: string | undefined): boolean {
171-if (!baseUrl) {
172-return false;
173-}
174-try {
175-const host = new URL(baseUrl).hostname.trim().toLowerCase().replace(/\.+$/, "");
176-return host === "localhost" || host.endsWith(".localhost") || isLoopbackIpAddress(host);
177-} catch {
178-return false;
170+function resolvePrivateNetworkAccess(params: ResolveProviderRequestPolicyConfigParams): {
171+allowPrivateNetwork: boolean;
172+explicitlyDenied: boolean;
173+} {
174+// Preserve existing precedence: runtime/caller policy overrides model config.
175+const configuredAllowPrivateNetwork =
176+params.allowPrivateNetwork ?? params.request?.allowPrivateNetwork;
177+if (configuredAllowPrivateNetwork !== undefined) {
178+return {
179+allowPrivateNetwork: configuredAllowPrivateNetwork,
180+explicitlyDenied: !configuredAllowPrivateNetwork,
181+};
179182}
180-}
181-182-function shouldAutoAllowLoopbackModelRequest(
183-params: ResolveProviderRequestPolicyConfigParams,
184-): boolean {
185-return (
186-params.capability === "llm" &&
187-params.transport === "stream" &&
188-params.allowPrivateNetwork === undefined &&
189-params.request?.allowPrivateNetwork === undefined &&
190-isLoopbackProviderBaseUrl(params.baseUrl)
191-);
183+return {
184+allowPrivateNetwork: false,
185+explicitlyDenied: false,
186+};
192187}
193188194189function sanitizeConfiguredRequestString(value: unknown, path: string): string | undefined {
@@ -670,6 +665,7 @@ export function resolveProviderRequestPolicyConfig(
670665params.precedence === "caller-wins"
671666 ? mergeProviderRequestHeaders(mergedDefaults, unprotectedCallerHeaders)
672667 : mergeProviderRequestHeaders(unprotectedCallerHeaders, mergedDefaults);
668+const privateNetworkAccess = resolvePrivateNetworkAccess(params);
673669674670return {
675671api: params.api,
@@ -684,10 +680,8 @@ export function resolveProviderRequestPolicyConfig(
684680tls: resolveTlsOverride(params.request?.tls),
685681 policy,
686682 capabilities,
687-allowPrivateNetwork:
688-params.allowPrivateNetwork ??
689-params.request?.allowPrivateNetwork ??
690-shouldAutoAllowLoopbackModelRequest(params),
683+allowPrivateNetwork: privateNetworkAccess.allowPrivateNetwork,
684+privateNetworkExplicitlyDenied: privateNetworkAccess.explicitlyDenied,
691685};
692686}
693687此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。