refactor(image-generation): move provider builders into plugins

This commit is contained in:
Vincent Koc
2026-03-22 17:55:48 -07:00
parent 3fe96c7b9e
commit 0f54ca20aa
13 changed files with 47 additions and 21 deletions

View File

@@ -1,6 +1,8 @@
import { resolveApiKeyForProvider } from "../../agents/model-auth.js";
import type { ImageGenerationProviderPlugin } from "../../plugins/types.js";
import type { GeneratedImageAsset } from "../types.js";
import type {
GeneratedImageAsset,
ImageGenerationProviderPlugin,
} from "openclaw/plugin-sdk/image-generation-core";
import { resolveApiKeyForProvider } from "openclaw/plugin-sdk/image-generation-core";
const DEFAULT_FAL_BASE_URL = "https://fal.run";
const DEFAULT_FAL_IMAGE_MODEL = "fal-ai/flux/dev";

View File

@@ -1,6 +1,6 @@
import { buildFalImageGenerationProvider } from "openclaw/plugin-sdk/image-generation";
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth";
import { buildFalImageGenerationProvider } from "./image-generation-provider.js";
import { applyFalConfig, FAL_DEFAULT_IMAGE_MODEL_REF } from "./onboard.js";
const PROVIDER_ID = "fal";

View File

@@ -1,12 +1,14 @@
import { resolveApiKeyForProvider } from "../../agents/model-auth.js";
import { normalizeGoogleModelId } from "../../agents/model-id-normalization.js";
import { parseGeminiAuth } from "../../infra/gemini-auth.js";
import type { ImageGenerationProviderPlugin } from "openclaw/plugin-sdk/image-generation-core";
import {
normalizeGoogleModelId,
parseGeminiAuth,
resolveApiKeyForProvider,
} from "openclaw/plugin-sdk/image-generation-core";
import {
assertOkOrThrowHttpError,
normalizeBaseUrl,
postJsonRequest,
} from "../../media-understanding/providers/shared.js";
import type { ImageGenerationProviderPlugin } from "../../plugins/types.js";
} from "openclaw/plugin-sdk/media-understanding";
const DEFAULT_GOOGLE_IMAGE_BASE_URL = "https://generativelanguage.googleapis.com/v1beta";
const DEFAULT_GOOGLE_IMAGE_MODEL = "gemini-3.1-flash-image-preview";

View File

@@ -1,4 +1,3 @@
import { buildGoogleImageGenerationProvider } from "openclaw/plugin-sdk/image-generation";
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
import { createProviderApiKeyAuthMethod } from "openclaw/plugin-sdk/provider-auth";
import {
@@ -7,6 +6,7 @@ import {
} from "openclaw/plugin-sdk/provider-models";
import { createGoogleThinkingPayloadWrapper } from "openclaw/plugin-sdk/provider-stream";
import { registerGoogleGeminiCliProvider } from "./gemini-cli-provider.js";
import { buildGoogleImageGenerationProvider } from "./image-generation-provider.js";
import { googleMediaUnderstandingProvider } from "./media-understanding-provider.js";
import { isModernGoogleModel, resolveGoogle31ForwardCompatModel } from "./provider-models.js";
import { createGeminiWebSearchProvider } from "./src/gemini-web-search-provider.js";

View File

@@ -1,12 +1,13 @@
import { resolveApiKeyForProvider } from "../../agents/model-auth.js";
import type { ImageGenerationProviderPlugin } from "../../plugins/types.js";
import { OPENAI_DEFAULT_IMAGE_MODEL as DEFAULT_OPENAI_IMAGE_MODEL } from "../../providers/openai-defaults.js";
import type { ImageGenerationProviderPlugin } from "openclaw/plugin-sdk/image-generation-core";
import {
OPENAI_DEFAULT_IMAGE_MODEL as DEFAULT_OPENAI_IMAGE_MODEL,
resolveApiKeyForProvider,
} from "openclaw/plugin-sdk/image-generation-core";
const DEFAULT_OPENAI_IMAGE_BASE_URL = "https://api.openai.com/v1";
const DEFAULT_OUTPUT_MIME = "image/png";
const DEFAULT_SIZE = "1024x1024";
const OPENAI_SUPPORTED_SIZES = ["1024x1024", "1024x1536", "1536x1024"] as const;
// Only advertise ratios we can satisfy exactly with OpenAI's supported size presets.
const OPENAI_SUPPORTED_ASPECT_RATIOS = ["1:1", "2:3", "3:2"] as const;
type OpenAIImageApiResponse = {

View File

@@ -1,6 +1,6 @@
import { buildOpenAIImageGenerationProvider } from "openclaw/plugin-sdk/image-generation";
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
import { openaiMediaUnderstandingProvider } from "./media-understanding-provider.js";
import { buildOpenAIImageGenerationProvider } from "./image-generation-provider.js";
import { buildOpenAICodexProviderPlugin } from "./openai-codex-provider.js";
import { buildOpenAIProvider } from "./openai-provider.js";
import { buildOpenAISpeechProvider } from "./speech-provider.js";

View File

@@ -329,6 +329,10 @@
"types": "./dist/plugin-sdk/image-generation.d.ts",
"default": "./dist/plugin-sdk/image-generation.js"
},
"./plugin-sdk/image-generation-core": {
"types": "./dist/plugin-sdk/image-generation-core.d.ts",
"default": "./dist/plugin-sdk/image-generation-core.js"
},
"./plugin-sdk/imessage": {
"types": "./dist/plugin-sdk/imessage.d.ts",
"default": "./dist/plugin-sdk/imessage.js"

View File

@@ -72,6 +72,7 @@
"directory-runtime",
"googlechat",
"image-generation",
"image-generation-core",
"imessage",
"imessage-core",
"irc",

View File

@@ -1,6 +1,6 @@
import { afterEach, describe, expect, it, vi } from "vitest";
import * as modelAuth from "../../agents/model-auth.js";
import { buildFalImageGenerationProvider } from "./fal.js";
import { buildFalImageGenerationProvider } from "../../../extensions/fal/image-generation-provider.js";
function expectFalJsonPost(
fetchMock: ReturnType<typeof vi.fn>,

View File

@@ -1,6 +1,6 @@
import { afterEach, describe, expect, it, vi } from "vitest";
import * as modelAuth from "../../agents/model-auth.js";
import { buildGoogleImageGenerationProvider } from "./google.js";
import { buildGoogleImageGenerationProvider } from "../../../extensions/google/image-generation-provider.js";
describe("Google image-generation provider", () => {
afterEach(() => {

View File

@@ -1,6 +1,6 @@
import { afterEach, describe, expect, it, vi } from "vitest";
import * as modelAuth from "../../agents/model-auth.js";
import { buildOpenAIImageGenerationProvider } from "./openai.js";
import { buildOpenAIImageGenerationProvider } from "../../../extensions/openai/image-generation-provider.js";
describe("OpenAI image-generation provider", () => {
afterEach(() => {

View File

@@ -0,0 +1,16 @@
// Shared image-generation implementation helpers for bundled and third-party plugins.
export type { ImageGenerationProviderPlugin } from "../plugins/types.js";
export type {
GeneratedImageAsset,
ImageGenerationProvider,
ImageGenerationResolution,
ImageGenerationRequest,
ImageGenerationResult,
ImageGenerationSourceImage,
} from "../image-generation/types.js";
export { resolveApiKeyForProvider } from "../agents/model-auth.js";
export { normalizeGoogleModelId } from "../agents/model-id-normalization.js";
export { parseGeminiAuth } from "../infra/gemini-auth.js";
export { OPENAI_DEFAULT_IMAGE_MODEL } from "../providers/openai-defaults.js";

View File

@@ -9,6 +9,6 @@ export type {
ImageGenerationSourceImage,
} from "../image-generation/types.js";
export { buildFalImageGenerationProvider } from "../image-generation/providers/fal.js";
export { buildGoogleImageGenerationProvider } from "../image-generation/providers/google.js";
export { buildOpenAIImageGenerationProvider } from "../image-generation/providers/openai.js";
export { buildFalImageGenerationProvider } from "../../extensions/fal/image-generation-provider.js";
export { buildGoogleImageGenerationProvider } from "../../extensions/google/image-generation-provider.js";
export { buildOpenAIImageGenerationProvider } from "../../extensions/openai/image-generation-provider.js";