import type { EnabledImageCapability, ImageCapability } from "@/lib/types"; export type JimengCapabilityConfig = { id: ImageCapability; label: string; reqKey: string; enabled: boolean; route: "generate"; description: string; docsUrl: string; }; export function getJimengCapabilities(): Record { return { "image.generate": { id: "image.generate", label: "图片生成 4.6", reqKey: process.env.JIMENG_IMAGE_GENERATE_46_REQ_KEY || "jimeng_seedream46_cvtob", enabled: true, route: "generate", description: "面向营销主图、人像写真、平面设计和风格化素材的通用生成能力。", docsUrl: "https://www.volcengine.com/docs/85621/2275082" } }; } export function getEnabledImageCapability(id: string): JimengCapabilityConfig { const capabilities = getJimengCapabilities(); const capability = capabilities[id as ImageCapability]; if (!capability || !capability.enabled) { throw new Error(`Unsupported or disabled image capability: ${id}`); } return capability; } export function getVisibleImageCapabilities(): JimengCapabilityConfig[] { return Object.values(getJimengCapabilities()).filter( (capability): capability is JimengCapabilityConfig & { id: EnabledImageCapability } => capability.enabled ); } export function isRetryableVisualCode(code?: number | string): boolean { return code === 50429 || code === 50430 || code === "50429" || code === "50430"; } export function buildJimengPayload( capability: EnabledImageCapability, reqKey: string, input: Record ): Record { const payload: Record = { req_key: reqKey, prompt: String(input.prompt || "").trim() }; if (!payload.prompt) throw new Error("Prompt is required for image generation."); const imageUrls = asStringArray(input.imageUrls); if (imageUrls.length) payload.image_urls = imageUrls; assignOptional(payload, input, ["scale", "width", "height", "min_ratio", "max_ratio", "force_single"]); return payload; } export function buildJimengQueryPayload(reqKey: string, taskId: string): Record { return { req_key: reqKey, task_id: taskId, req_json: JSON.stringify({ return_url: true, logo_info: { add_logo: false, position: 0, language: 0, opacity: 1 } }) }; } function asStringArray(value: unknown): string[] { if (!Array.isArray(value)) return []; return value.map(String).map((item) => item.trim()).filter(Boolean); } function assignOptional(target: Record, input: Record, keys: string[]) { for (const key of keys) { if (input[key] !== undefined && input[key] !== null && input[key] !== "") { target[key] = input[key]; } } }