From 8c60e4e9f944b4448e86352deb18ebd6727e8e86 Mon Sep 17 00:00:00 2001 From: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> Date: Fri, 27 Mar 2026 22:08:37 -0500 Subject: [PATCH] fix(regression): normalize image tool provider config aliases --- src/agents/tools/image-tool.helpers.ts | 8 ++++--- src/agents/tools/image-tool.test.ts | 33 ++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/agents/tools/image-tool.helpers.ts b/src/agents/tools/image-tool.helpers.ts index 2fbd5edd611..e72f0edcd1b 100644 --- a/src/agents/tools/image-tool.helpers.ts +++ b/src/agents/tools/image-tool.helpers.ts @@ -1,5 +1,6 @@ import type { AssistantMessage } from "@mariozechner/pi-ai"; import type { OpenClawConfig } from "../../config/config.js"; +import { findNormalizedProviderValue } from "../model-selection.js"; import { extractAssistantText } from "../pi-embedded-utils.js"; import { coerceToolModelConfig, type ToolModelConfig } from "./model-config.helpers.js"; @@ -59,9 +60,10 @@ export function resolveProviderVisionModelFromConfig(params: { cfg?: OpenClawConfig; provider: string; }): string | null { - const providerCfg = params.cfg?.models?.providers?.[params.provider] as unknown as - | { models?: Array<{ id?: string; input?: string[] }> } - | undefined; + const providerCfg = findNormalizedProviderValue( + params.cfg?.models?.providers, + params.provider, + ) as unknown as { models?: Array<{ id?: string; input?: string[] }> } | undefined; const models = providerCfg?.models ?? []; const picked = models.find((m) => Boolean((m?.id ?? "").trim()) && m.input?.includes("image")); const id = (picked?.id ?? "").trim(); diff --git a/src/agents/tools/image-tool.test.ts b/src/agents/tools/image-tool.test.ts index 47791dc9626..702f258ca01 100644 --- a/src/agents/tools/image-tool.test.ts +++ b/src/agents/tools/image-tool.test.ts @@ -591,6 +591,39 @@ describe("image tool implicit imageModel config", () => { }); }); + it("pairs a provider when config uses an alias key", async () => { + await withTempAgentDir(async (agentDir) => { + await writeAuthProfiles(agentDir, { + version: 1, + profiles: { + "amazon-bedrock:default": { + type: "api_key", + provider: "amazon-bedrock", + key: "sk-test", + }, + }, + }); + const cfg: OpenClawConfig = { + agents: { defaults: { model: { primary: "aws-bedrock/text-1" } } }, + models: { + providers: { + "amazon-bedrock": { + baseUrl: "https://example.com", + models: [ + makeModelDefinition("text-1", ["text"]), + makeModelDefinition("vision-1", ["text", "image"]), + ], + }, + }, + }, + }; + expect(resolveImageModelConfigForTool({ cfg, agentDir })).toEqual({ + primary: "amazon-bedrock/vision-1", + }); + expect(createImageTool({ config: cfg, agentDir })).not.toBeNull(); + }); + }); + it("prefers explicit agents.defaults.imageModel", async () => { await withTempAgentDir(async (agentDir) => { const cfg: OpenClawConfig = {