fix(model): infer provider from allowlist for bare model IDs to prevent prefix drift (#48369)

This commit is contained in:
陈大虾🦞
2026-03-21 19:51:15 +08:00
committed by Peter Steinberger
parent 2906cfd6d7
commit 1ffbe09a6a
2 changed files with 39 additions and 1 deletions

View File

@@ -569,6 +569,34 @@ describe("model-selection", () => {
ref: { provider: "openai", model: "@cf/openai/gpt-oss-20b" },
});
});
it("infers provider from allowlist for bare model ids to prevent prefix drift (#48369)", () => {
const cfg = {
agents: {
defaults: {
models: {
"openai-codex/gpt-5.4": {},
"opencode-go/kimi-k2.5": {},
"opencode-go/glm-5": {},
},
},
},
} as OpenClawConfig;
// When session default is openai-codex, switching to a bare "kimi-k2.5"
// should resolve to opencode-go/kimi-k2.5, not openai-codex/kimi-k2.5
const result = resolveAllowedModelRef({
cfg,
catalog: [],
raw: "kimi-k2.5",
defaultProvider: "openai-codex", // session's current provider
});
expect(result).toEqual({
key: "opencode-go/kimi-k2.5",
ref: { provider: "opencode-go", model: "kimi-k2.5" },
});
});
});
describe("resolveModelRefFromString", () => {

View File

@@ -660,9 +660,19 @@ export function resolveAllowedModelRef(params: {
cfg: params.cfg,
defaultProvider: params.defaultProvider,
});
// When the model string has no provider prefix ("/"), try to infer the
// correct provider from the configured allowlist before falling back to the
// session's current default provider. This prevents provider prefix drift
// when switching models across different providers (see #48369).
const effectiveDefaultProvider = !trimmed.includes("/")
? (inferUniqueProviderFromConfiguredModels({ cfg: params.cfg, model: trimmed }) ??
params.defaultProvider)
: params.defaultProvider;
const resolved = resolveModelRefFromString({
raw: trimmed,
defaultProvider: params.defaultProvider,
defaultProvider: effectiveDefaultProvider,
aliasIndex,
});
if (!resolved) {