import { z } from "zod"; const textPartSchema = z.object({ type: z.enum(["text"]), text: z.string().min(1).max(2000), }); const filePartSchema = z.object({ type: z.enum(["file"]), mediaType: z.enum(["image/jpeg", "image/png", "image/webp", "image/gif", "image/jpg", "image/bmp", "image/svg+xml"]), name: z.string().min(1).max(100), url: z.string().url(), }); const partSchema = z.union([textPartSchema, filePartSchema]); // 视频参数 schema const videoParamsSchema = z.object({ mode: z.enum(["text-to-video", "first-frame", "first-last-frame", "reference-images"]), resolution: z.enum(["480p", "720p", "1080p"]).optional(), ratio: z.string().optional(), duration: z.number().optional(), watermark: z.boolean().optional(), cameraFixed: z.boolean().optional(), cameraMove: z.string().optional(), fps: z.number().optional(), seed: z.number().optional(), returnLastFrame: z.boolean().optional(), }).optional(); // 🆕 图片生成参数 schema const imageParamsSchema = z.object({ aspectRatio: z.string().optional(), imageSize: z.string().optional(), imageCount: z.number().min(1).max(10).optional(), // 阿里生图专用参数 size: z.string().optional(), // 自定义分辨率,如 "1024*1024" negativePrompt: z.string().optional(), // 反向提示词 promptExtend: z.boolean().optional(), // 提示词智能优化 watermark: z.boolean().optional(), // 水印 seed: z.number().optional(), // 随机种子 n: z.number().min(1).max(10).optional(), // 兼容 n 参数 }).optional(); export const postRequestBodySchema = z.object({ id: z.string().uuid(), message: z.object({ id: z.string().uuid(), role: z.enum(["user"]), parts: z.array(partSchema), }), hiddenPrompt: z.string().max(4000).optional(), // 支持预定义模型名称或数据库中的模型 UUID selectedChatModel: z.string().min(1).max(128), selectedVisibilityType: z.enum(["public", "private"]), videoParams: videoParamsSchema, // 视频参数 imageParams: imageParamsSchema, // 🆕 图片生成参数 }); export type PostRequestBody = z.infer;