























@@ -88,6 +88,17 @@ function parseProviderModelKey(key: string): { provider: string; modelId: string
8888return provider && modelId ? { provider, modelId } : undefined;
8989}
909091+function resolveEffectiveProvider(
92+provider: string | undefined,
93+modelId: string | undefined,
94+): string | undefined {
95+const normalizedProvider = normalizeProviderId(provider ?? "");
96+if (normalizedProvider) {
97+return normalizedProvider;
98+}
99+return parseProviderModelKey(modelId?.trim() ?? "")?.provider;
100+}
101+91102function providerMatchesCaller(provider: string, callerProvider: string): boolean {
92103return !callerProvider || provider === callerProvider;
93104}
@@ -96,11 +107,15 @@ function resolvePolicyMatch(
96107matches: AgentModelRuntimePolicyMatch[],
97108callerProvider: string,
98109): AgentModelRuntimePolicyResolution {
99-const [first] = matches;
110+const providerMatches = callerProvider
111+ ? matches.filter((match) => match.provider === callerProvider)
112+ : [];
113+const candidates = providerMatches.length > 0 ? providerMatches : matches;
114+const [first] = candidates;
100115if (!first) {
101116return {};
102117}
103-if (!callerProvider && matches.some((match) => match.provider !== first.provider)) {
118+if (!callerProvider && candidates.some((match) => match.provider !== first.provider)) {
104119return { ambiguous: true };
105120}
106121return {
@@ -237,38 +252,54 @@ export function resolveModelRuntimePolicy(params: {
237252agentId?: string;
238253sessionKey?: string;
239254}): ResolvedModelRuntimePolicy {
255+const callerProvider = normalizeProviderId(params.provider ?? "");
256+const effectiveProvider = resolveEffectiveProvider(params.provider, params.modelId);
257+const inferredMatchedProvider = callerProvider ? undefined : effectiveProvider;
240258if (process.env.OPENCLAW_BUILD_PRIVATE_QA === "1") {
241259const forcedRuntime = process.env.OPENCLAW_QA_FORCE_RUNTIME?.trim().toLowerCase();
242260if (forcedRuntime === "openclaw" || forcedRuntime === "codex") {
243261return { policy: { id: forcedRuntime }, source: "model" };
244262}
245263}
246264247-const agentModelPolicy = resolveAgentModelEntryRuntimePolicy({ ...params, matchKind: "exact" });
265+const agentModelPolicy = resolveAgentModelEntryRuntimePolicy({
266+ ...params,
267+provider: effectiveProvider,
268+matchKind: "exact",
269+});
248270if (agentModelPolicy.ambiguous) {
249271return {};
250272}
251273if (agentModelPolicy.policy) {
252274return agentModelPolicy;
253275}
254-const providerConfig = resolveProviderConfig(params.config, params.provider);
276+const providerConfig = resolveProviderConfig(params.config, effectiveProvider);
255277const modelConfig = resolveModelConfig({
256278 providerConfig,
257-provider: params.provider,
279+provider: effectiveProvider,
258280modelId: params.modelId,
259281});
260282if (hasRuntimePolicy(modelConfig?.agentRuntime)) {
261-return { policy: modelConfig?.agentRuntime, source: "model" };
283+return {
284+policy: modelConfig?.agentRuntime,
285+source: "model",
286+ ...(inferredMatchedProvider ? { matchedProvider: inferredMatchedProvider } : {}),
287+};
262288}
263289const agentWildcardModelPolicy = resolveAgentModelEntryRuntimePolicy({
264290 ...params,
291+provider: effectiveProvider,
265292matchKind: "provider-wildcard",
266293});
267294if (agentWildcardModelPolicy.policy) {
268295return agentWildcardModelPolicy;
269296}
270297if (hasRuntimePolicy(providerConfig?.agentRuntime)) {
271-return { policy: providerConfig?.agentRuntime, source: "provider" };
298+return {
299+policy: providerConfig?.agentRuntime,
300+source: "provider",
301+ ...(inferredMatchedProvider ? { matchedProvider: inferredMatchedProvider } : {}),
302+};
272303}
273304return {};
274305}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。