fix(image): respect configured provider for bare image overrides

This commit is contained in:
zhulijin1991
2026-04-12 08:16:45 +08:00
committed by Peter Steinberger
parent 15258921ee
commit 92e864a521
2 changed files with 48 additions and 1 deletions

View File

@@ -0,0 +1,28 @@
import { describe, expect, it, vi } from "vitest";
import { runWithImageModelFallback } from "./model-fallback.js";
import { makeModelFallbackCfg } from "./test-helpers/model-fallback-config-fixture.js";
describe("runWithImageModelFallback provider resolution", () => {
it("inherits the configured image-model provider for bare override ids", async () => {
const cfg = makeModelFallbackCfg({
agents: {
defaults: {
imageModel: {
primary: "openai-codex/gpt-5.4",
fallbacks: ["openai-codex/gpt-5.4-mini"],
},
},
},
});
const run = vi.fn().mockResolvedValueOnce("ok");
const result = await runWithImageModelFallback({
cfg,
modelOverride: "gpt-5.4-mini",
run,
});
expect(result.result).toBe("ok");
expect(run.mock.calls).toEqual([["openai-codex", "gpt-5.4-mini"]]);
});
});

View File

@@ -375,6 +375,25 @@ function resolveImageFallbackCandidates(params: {
return candidates;
}
function resolveImageFallbackDefaultProvider(cfg: OpenClawConfig | undefined): string {
const configuredPrimary = resolveAgentModelPrimaryValue(cfg?.agents?.defaults?.imageModel);
if (configuredPrimary?.trim()) {
const aliasIndex = buildModelAliasIndex({
cfg: cfg ?? {},
defaultProvider: DEFAULT_PROVIDER,
});
const resolved = resolveModelRefFromString({
raw: configuredPrimary,
defaultProvider: DEFAULT_PROVIDER,
aliasIndex,
});
if (resolved?.ref.provider) {
return resolved.ref.provider;
}
}
return DEFAULT_PROVIDER;
}
function resolveFallbackCandidates(params: {
cfg: OpenClawConfig | undefined;
provider: string;
@@ -922,7 +941,7 @@ export async function runWithImageModelFallback<T>(params: {
}): Promise<ModelFallbackRunResult<T>> {
const candidates = resolveImageFallbackCandidates({
cfg: params.cfg,
defaultProvider: DEFAULT_PROVIDER,
defaultProvider: resolveImageFallbackDefaultProvider(params.cfg),
modelOverride: params.modelOverride,
});
if (candidates.length === 0) {