


































@@ -23,14 +23,13 @@ import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js";
2323import { normalizeOptionalString } from "../shared/string-coerce.js";
2424import type { ActiveMediaModel } from "./active-model.types.js";
2525import { MediaAttachmentCache, selectAttachments } from "./attachments.js";
26-import { resolveAutoMediaKeyProviders, resolveDefaultMediaModel } from "./defaults.js";
2726import { isMediaUnderstandingSkipError } from "./errors.js";
2827import { fileExists } from "./fs.js";
2928import { extractGeminiResponse } from "./output-extract.js";
29+import { normalizeMediaProviderId } from "./provider-id.js";
3030import {
3131buildMediaUnderstandingRegistry,
3232getMediaUnderstandingProvider,
33-normalizeMediaProviderId,
3433} from "./provider-registry.js";
3534import { providerSupportsCapability } from "./provider-supports.js";
3635import { resolveModelEntries, resolveScopeDecision } from "./resolve.js";
@@ -155,6 +154,46 @@ function resolveCatalogImageModelId(params: {
155154return normalizeOptionalString((autoEntry ?? matches[0])?.id);
156155}
157156157+function resolveDefaultMediaModelFromRegistry(params: {
158+providerId: string;
159+capability: MediaUnderstandingCapability;
160+providerRegistry: ProviderRegistry;
161+}): string | undefined {
162+const provider = params.providerRegistry.get(normalizeMediaProviderId(params.providerId));
163+return normalizeOptionalString(provider?.defaultModels?.[params.capability]);
164+}
165+166+function resolveAutoMediaKeyProvidersFromRegistry(params: {
167+capability: MediaUnderstandingCapability;
168+providerRegistry: ProviderRegistry;
169+}): string[] {
170+type AutoProviderEntry = {
171+provider: MediaUnderstandingProvider;
172+priority: number;
173+};
174+return [...params.providerRegistry.values()]
175+.filter(
176+(provider) =>
177+provider.capabilities?.includes(params.capability) ??
178+providerSupportsCapability(provider, params.capability),
179+)
180+.map((provider): AutoProviderEntry | null => {
181+const priority = provider.autoPriority?.[params.capability];
182+return typeof priority === "number" && Number.isFinite(priority)
183+ ? { provider, priority }
184+ : null;
185+})
186+.filter((entry): entry is AutoProviderEntry => entry !== null)
187+.toSorted((left, right) => {
188+if (left.priority !== right.priority) {
189+return left.priority - right.priority;
190+}
191+return left.provider.id.localeCompare(right.provider.id);
192+})
193+.map((entry) => normalizeMediaProviderId(entry.provider.id))
194+.filter(Boolean);
195+}
196+158197async function explicitImageModelVisionStatus(params: {
159198cfg: OpenClawConfig;
160199providerId: string;
@@ -176,6 +215,7 @@ async function explicitImageModelVisionStatus(params: {
176215async function resolveAutoImageModelId(params: {
177216cfg: OpenClawConfig;
178217providerId: string;
218+providerRegistry: ProviderRegistry;
179219explicitModel?: string;
180220}): Promise<string | undefined> {
181221const explicit = normalizeOptionalString(params.explicitModel);
@@ -193,14 +233,23 @@ async function resolveAutoImageModelId(params: {
193233if (configuredModel) {
194234return configuredModel;
195235}
196-const defaultModel = resolveDefaultMediaModel({
197-cfg: params.cfg,
236+const defaultModel = resolveDefaultMediaModelFromRegistry({
198237providerId: params.providerId,
199238capability: "image",
239+providerRegistry: params.providerRegistry,
200240});
201241if (defaultModel) {
202242return defaultModel;
203243}
244+const { resolveDefaultMediaModel } = await import("./defaults.js");
245+const bundledDefaultModel = resolveDefaultMediaModel({
246+cfg: params.cfg,
247+providerId: params.providerId,
248+capability: "image",
249+});
250+if (bundledDefaultModel) {
251+return bundledDefaultModel;
252+}
204253const { loadModelCatalog, modelSupportsVision } = await loadModelCatalogApi();
205254const catalog = await loadModelCatalog({ config: params.cfg });
206255return resolveCatalogImageModelId({
@@ -499,7 +548,12 @@ async function resolveKeyEntry(params: {
499548}
500549const resolvedModel =
501550capability === "image"
502- ? await resolveAutoImageModelId({ cfg, providerId, explicitModel: model })
551+ ? await resolveAutoImageModelId({
552+ cfg,
553+ providerId,
554+ providerRegistry,
555+explicitModel: model,
556+})
503557 : model;
504558if (capability === "image" && !resolvedModel) {
505559return null;
@@ -518,8 +572,7 @@ async function resolveKeyEntry(params: {
518572 cfg,
519573 providerRegistry,
520574 capability,
521-fallbackProviders: resolveAutoMediaKeyProviders({
522- cfg,
575+fallbackProviders: resolveAutoMediaKeyProvidersFromRegistry({
523576 capability,
524577 providerRegistry,
525578}),
@@ -694,6 +747,7 @@ async function resolveActiveModelEntry(params: {
694747 ? await resolveAutoImageModelId({
695748cfg: params.cfg,
696749 providerId,
750+providerRegistry: params.providerRegistry,
697751explicitModel: params.activeModel?.model,
698752})
699753 : params.activeModel?.model;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。