export interface RuxaImageModelPreset { modelId: string; displayName: string; description: string; supportsVision: boolean; supportsImageGen: boolean; capabilities?: Record; defaultParams?: Record; imageGenConfig?: Record; sortOrder: number; } export const RUXA_NANO_BANANA_2_MODEL_ID = "google/nano-banana-2"; export const RUXA_NANO_BANANA_PRO_MODEL_ID = "google/nano-banana-pro"; export const RUXA_NANO_BANANA_2_RUNTIME_MODEL_ID = "gemini-3.1-flash-image-preview"; const RUXA_IMAGE_CONFIG = { maxImages: 1, supportsSize: true, supports1K: true, supports2K: true, supports4K: true, supportsPromptExtend: false, supportsNegativePrompt: false, supportsWatermark: false, supportsSeed: false, creditCostPerImage: 0, enableLoadingPlaceholder: true, loadingColor: "blue", }; export const RUXA_IMAGE_MODEL_PRESETS: RuxaImageModelPreset[] = [ { modelId: RUXA_NANO_BANANA_2_MODEL_ID, displayName: "Nano Banana 2「专线」", description: "RUXA 专线 Nano Banana 2。支持文生图和图像编辑输入。", supportsVision: true, supportsImageGen: true, defaultParams: { provider: "ruxa", endpoint: RUXA_NANO_BANANA_2_RUNTIME_MODEL_ID, imageSize: "2K", aspectRatio: "1:1", }, imageGenConfig: { ...RUXA_IMAGE_CONFIG, ruxaTaskInputMode: "resolution-based", }, sortOrder: 10, }, { modelId: RUXA_NANO_BANANA_PRO_MODEL_ID, displayName: "Nano Banana Pro「专线」", description: "RUXA 专线 Nano Banana Pro。支持文生图和图像编辑输入。", supportsVision: true, supportsImageGen: true, defaultParams: { provider: "ruxa", endpoint: "nano-banana-pro", imageSize: "2K", aspectRatio: "1:1", }, imageGenConfig: { ...RUXA_IMAGE_CONFIG, ruxaTaskInputMode: "resolution-based", }, sortOrder: 20, }, ]; export function getRuxaImageModelPresetById(modelId: string) { return RUXA_IMAGE_MODEL_PRESETS.find( (preset) => preset.modelId === String(modelId || "").trim() ); } export function resolveRuxaImageRuntimeModelId(modelId: string) { const preset = getRuxaImageModelPresetById(modelId); const endpoint = preset?.defaultParams?.endpoint; if (typeof endpoint === "string" && endpoint.trim()) { return endpoint.trim(); } return modelId; }