





















@@ -10,6 +10,7 @@ import {
1010resolveCapabilityModelCandidates,
1111throwCapabilityGenerationFailure,
1212} from "../media-generation/runtime-shared.js";
13+import { getProviderEnvVars } from "../secrets/provider-env-vars.js";
1314import { parseImageGenerationModelRef } from "./model-ref.js";
1415import { resolveImageGenerationOverrides } from "./normalization.js";
1516import { getImageGenerationProvider, listImageGenerationProviders } from "./provider-registry.js";
@@ -18,23 +19,42 @@ import type { ImageGenerationResult } from "./types.js";
18191920const log = createSubsystemLogger("image-generation");
202122+export type ImageGenerationRuntimeDeps = {
23+getProvider?: typeof getImageGenerationProvider;
24+listProviders?: typeof listImageGenerationProviders;
25+getProviderEnvVars?: typeof getProviderEnvVars;
26+log?: Pick<typeof log, "warn">;
27+};
28+2129export type { GenerateImageParams, GenerateImageRuntimeResult } from "./runtime-types.js";
223023-function buildNoImageGenerationModelConfiguredMessage(cfg: OpenClawConfig): string {
31+function buildNoImageGenerationModelConfiguredMessage(
32+cfg: OpenClawConfig,
33+deps: ImageGenerationRuntimeDeps,
34+): string {
35+const listProviders = deps.listProviders ?? listImageGenerationProviders;
2436return buildNoCapabilityModelConfiguredMessage({
2537capabilityLabel: "image-generation",
2638modelConfigKey: "imageGenerationModel",
27-providers: listImageGenerationProviders(cfg),
39+providers: listProviders(cfg),
40+getProviderEnvVars: deps.getProviderEnvVars,
2841});
2942}
304331-export function listRuntimeImageGenerationProviders(params?: { config?: OpenClawConfig }) {
32-return listImageGenerationProviders(params?.config);
44+export function listRuntimeImageGenerationProviders(
45+params?: { config?: OpenClawConfig },
46+deps: ImageGenerationRuntimeDeps = {},
47+) {
48+return (deps.listProviders ?? listImageGenerationProviders)(params?.config);
3349}
34503551export async function generateImage(
3652params: GenerateImageParams,
53+deps: ImageGenerationRuntimeDeps = {},
3754): Promise<GenerateImageRuntimeResult> {
55+const getProvider = deps.getProvider ?? getImageGenerationProvider;
56+const listProviders = deps.listProviders ?? listImageGenerationProviders;
57+const logger = deps.log ?? log;
3858const timeoutMs =
3959params.timeoutMs ??
4060resolveAgentModelTimeoutMsValue(params.cfg.agents?.defaults?.imageGenerationModel);
@@ -44,17 +64,17 @@ export async function generateImage(
4464modelOverride: params.modelOverride,
4565parseModelRef: parseImageGenerationModelRef,
4666agentDir: params.agentDir,
47-listProviders: listImageGenerationProviders,
67+ listProviders,
4868});
4969if (candidates.length === 0) {
50-throw new Error(buildNoImageGenerationModelConfiguredMessage(params.cfg));
70+throw new Error(buildNoImageGenerationModelConfiguredMessage(params.cfg, deps));
5171}
52725373const attempts: FallbackAttempt[] = [];
5474let lastError: unknown;
55755676for (const candidate of candidates) {
57-const provider = getImageGenerationProvider(candidate.provider, params.cfg);
77+const provider = getProvider(candidate.provider, params.cfg);
5878if (!provider) {
5979const error = `No image-generation provider registered for ${candidate.provider}`;
6080attempts.push({
@@ -63,7 +83,7 @@ export async function generateImage(
6383 error,
6484});
6585lastError = new Error(error);
66-log.warn(
86+logger.warn(
6787`image-generation candidate failed: ${candidate.provider}/${candidate.model}: ${error}`,
6888);
6989continue;
@@ -127,7 +147,7 @@ export async function generateImage(
127147status: described?.status,
128148code: described?.code,
129149});
130-log.warn(
150+logger.warn(
131151`image-generation candidate failed: ${candidate.provider}/${candidate.model}: ${
132152 described?.message ?? formatErrorMessage(err)
133153 }`,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。