Files
NianAIGC/lib/jimeng/capabilities.ts

91 lines
2.8 KiB
TypeScript

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<ImageCapability, JimengCapabilityConfig> {
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<string, unknown>
): Record<string, unknown> {
const payload: Record<string, unknown> = {
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<string, unknown> {
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<string, unknown>, input: Record<string, unknown>, keys: string[]) {
for (const key of keys) {
if (input[key] !== undefined && input[key] !== null && input[key] !== "") {
target[key] = input[key];
}
}
}