






















@@ -22,6 +22,10 @@ import { buildGatewayConnectionDetailsWithResolvers } from "../gateway/connectio
2222import { isLoopbackHost } from "../gateway/net.js";
2323import { GATEWAY_CLIENT_MODES, GATEWAY_CLIENT_NAMES } from "../gateway/protocol/client-info.js";
2424import { generateImage, listRuntimeImageGenerationProviders } from "../image-generation/runtime.js";
25+import type {
26+ImageGenerationOpenAIBackground,
27+ImageGenerationOutputFormat,
28+} from "../image-generation/types.js";
2529import { buildMediaUnderstandingRegistry } from "../media-understanding/provider-registry.js";
2630import {
2731describeImageFile,
@@ -78,6 +82,8 @@ import { removeCommandByName } from "./program/command-tree.js";
7882import { collectOption } from "./program/helpers.js";
79838084type CapabilityTransport = "local" | "gateway";
85+const IMAGE_OUTPUT_FORMATS = ["png", "jpeg", "webp"] as const;
86+const OPENAI_IMAGE_BACKGROUNDS = ["transparent", "opaque", "auto"] as const;
81878288type CapabilityMetadata = {
8389id: string;
@@ -702,6 +708,8 @@ async function runImageGenerate(params: {
702708size?: string;
703709aspectRatio?: string;
704710resolution?: "1K" | "2K" | "4K";
711+outputFormat?: ImageGenerationOutputFormat;
712+openaiBackground?: ImageGenerationOpenAIBackground;
705713file?: string[];
706714output?: string;
707715timeoutMs?: number;
@@ -728,6 +736,10 @@ async function runImageGenerate(params: {
728736size: params.size,
729737aspectRatio: params.aspectRatio,
730738resolution: params.resolution,
739+outputFormat: params.outputFormat,
740+providerOptions: params.openaiBackground
741+ ? { openai: { background: params.openaiBackground } }
742+ : undefined,
731743timeoutMs: params.timeoutMs,
732744 inputImages,
733745});
@@ -851,6 +863,32 @@ function parseOptionalFiniteNumber(
851863return value;
852864}
853865866+function normalizeImageOutputFormat(
867+raw: string | undefined,
868+): ImageGenerationOutputFormat | undefined {
869+const normalized = normalizeLowercaseStringOrEmpty(raw);
870+if (!normalized) {
871+return undefined;
872+}
873+if ((IMAGE_OUTPUT_FORMATS as readonly string[]).includes(normalized)) {
874+return normalized as ImageGenerationOutputFormat;
875+}
876+throw new Error("--output-format must be one of png, jpeg, or webp");
877+}
878+879+function normalizeOpenAIImageBackground(
880+raw: string | undefined,
881+): ImageGenerationOpenAIBackground | undefined {
882+const normalized = normalizeLowercaseStringOrEmpty(raw);
883+if (!normalized) {
884+return undefined;
885+}
886+if ((OPENAI_IMAGE_BACKGROUNDS as readonly string[]).includes(normalized)) {
887+return normalized as ImageGenerationOpenAIBackground;
888+}
889+throw new Error("--openai-background must be one of transparent, opaque, or auto");
890+}
891+854892function normalizeVideoResolution(raw: string | undefined): VideoGenerationResolution | undefined {
855893const normalized = raw?.trim().toUpperCase();
856894if (!normalized) {
@@ -1438,6 +1476,8 @@ export function registerCapabilityCli(program: Command) {
14381476.option("--size <size>", "Size hint like 1024x1024")
14391477.option("--aspect-ratio <ratio>", "Aspect ratio hint like 16:9")
14401478.option("--resolution <value>", "Resolution hint: 1K, 2K, or 4K")
1479+.option("--output-format <format>", "Output format hint: png, jpeg, or webp")
1480+.option("--openai-background <value>", "OpenAI background hint: transparent, opaque, or auto")
14411481.option("--timeout-ms <ms>", "Provider request timeout in milliseconds")
14421482.option("--output <path>", "Output path")
14431483.option("--json", "Output JSON", false)
@@ -1451,6 +1491,10 @@ export function registerCapabilityCli(program: Command) {
14511491size: opts.size as string | undefined,
14521492aspectRatio: opts.aspectRatio as string | undefined,
14531493resolution: opts.resolution as "1K" | "2K" | "4K" | undefined,
1494+outputFormat: normalizeImageOutputFormat(opts.outputFormat as string | undefined),
1495+openaiBackground: normalizeOpenAIImageBackground(
1496+opts.openaiBackground as string | undefined,
1497+),
14541498timeoutMs: parseOptionalFiniteNumber(opts.timeoutMs, "--timeout-ms"),
14551499output: opts.output as string | undefined,
14561500});
@@ -1464,6 +1508,8 @@ export function registerCapabilityCli(program: Command) {
14641508.requiredOption("--file <path>", "Input file", collectOption, [])
14651509.requiredOption("--prompt <text>", "Prompt text")
14661510.option("--model <provider/model>", "Model override")
1511+.option("--output-format <format>", "Output format hint: png, jpeg, or webp")
1512+.option("--openai-background <value>", "OpenAI background hint: transparent, opaque, or auto")
14671513.option("--timeout-ms <ms>", "Provider request timeout in milliseconds")
14681514.option("--output <path>", "Output path")
14691515.option("--json", "Output JSON", false)
@@ -1475,6 +1521,10 @@ export function registerCapabilityCli(program: Command) {
14751521prompt: String(opts.prompt),
14761522model: opts.model as string | undefined,
14771523file: files,
1524+outputFormat: normalizeImageOutputFormat(opts.outputFormat as string | undefined),
1525+openaiBackground: normalizeOpenAIImageBackground(
1526+opts.openaiBackground as string | undefined,
1527+),
14781528timeoutMs: parseOptionalFiniteNumber(opts.timeoutMs, "--timeout-ms"),
14791529output: opts.output as string | undefined,
14801530});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。