返回 AiToEarn
draft-generation.vo.ts
根目录 / project / aitoearn-backend / libs / aitoearn-ai-shared / src / vos / draft-generation.vo.ts
1 import { createPaginationVo, createZodDto, FileUtil, zodI18nString } from '@yikart/common'
2 import { z } from 'zod'
3 import { AiLogStatus } from '../enums'
4
5 export const CreateDraftGenerationVoSchema = z.object({
6 taskIds: z.array(z.string()).describe('生成任务 ID 列表(AiLog ID,可用于查询进度)'),
7 })
8
9 export class CreateDraftGenerationVo extends createZodDto(CreateDraftGenerationVoSchema, 'CreateDraftGenerationVo') {}
10
11 export const CreateDraftFromVideoUrlVoSchema = z.object({
12 materialId: z.string().describe('生成后的草稿素材 ID'),
13 })
14
15 export type CreateDraftFromVideoUrlVoInput = z.input<typeof CreateDraftFromVideoUrlVoSchema>
16
17 export class CreateDraftFromVideoUrlVo extends createZodDto(CreateDraftFromVideoUrlVoSchema, 'CreateDraftFromVideoUrlVo') {}
18
19 export const DraftGenerationTaskQueueVoSchema = z.object({
20 position: z.number().nullable().describe('当前队列中的排队位置,1 表示下一个待执行任务;执行中或无法定位时为 null'),
21 waitingCount: z.number().describe('当前队列待执行任务总数'),
22 })
23
24 const fileUrlSchema = () => FileUtil.zodBuildUrl().optional()
25 const fileUrlListSchema = () => z.array(FileUtil.zodBuildUrl().nonoptional()).optional()
26
27 const DraftGenerationTaskPayloadVoSchema = z.object({
28 imageUrl: fileUrlSchema().describe('图片 URL'),
29 imageUrls: fileUrlListSchema().describe('图片 URL 列表'),
30 videoUrl: fileUrlSchema().describe('视频 URL'),
31 videoUrls: fileUrlListSchema().describe('视频 URL 列表'),
32 audioUrl: fileUrlSchema().describe('音频 URL'),
33 audioUrls: fileUrlListSchema().describe('音频 URL 列表'),
34 coverUrl: fileUrlSchema().describe('封面 URL'),
35 url: fileUrlSchema().describe('媒体 URL'),
36 thumbUrl: fileUrlSchema().describe('缩略图 URL'),
37 }).loose()
38
39 export const DraftGenerationTaskVoSchema = z.object({
40 id: z.string().describe('任务 ID'),
41 status: z.enum(AiLogStatus).describe('任务状态'),
42 errorMessage: z.string().optional().describe('错误信息'),
43 request: DraftGenerationTaskPayloadVoSchema.optional().describe('生成输入参数'),
44 response: z.union([DraftGenerationTaskPayloadVoSchema, z.string()]).optional().describe('生成结果'),
45 queue: DraftGenerationTaskQueueVoSchema.optional().describe('任务队列展示信息'),
46 createdAt: z.coerce.date().describe('创建时间'),
47 updatedAt: z.coerce.date().describe('更新时间'),
48 })
49
50 export class DraftGenerationTaskVo extends createZodDto(DraftGenerationTaskVoSchema, 'DraftGenerationTaskVo') {}
51
52 export class DraftGenerationTaskListVo extends createPaginationVo(DraftGenerationTaskVoSchema, 'DraftGenerationTaskListVo') {}
53
54 export const DraftGenerationStatsVoSchema = z.object({
55 generatingCount: z.number().describe('生成中任务数量'),
56 })
57
58 export class DraftGenerationStatsVo extends createZodDto(DraftGenerationStatsVoSchema, 'DraftGenerationStatsVo') {}
59
60 export const ImageModelPricingVoSchema = z.object({
61 resolution: z.string().describe('分辨率'),
62 })
63
64 export const ImageModelVoSchema = z.object({
65 model: z.string().describe('模型名称'),
66 displayName: z.string().describe('展示名称'),
67 tags: z.array(zodI18nString()).default([]),
68 supportedAspectRatios: z.array(z.string()).describe('支持的图片宽高比列表'),
69 maxInputImages: z.number().describe('最多可输入的参考图片数量'),
70 pricing: z.array(ImageModelPricingVoSchema).describe('分辨率价格表'),
71 })
72
73 const VideoModelInputConstraintVoSchema = z.object({
74 maxCount: z.number().optional().describe('最大输入数量'),
75 formats: z.array(z.string()).optional().describe('支持的文件格式'),
76 minDuration: z.number().optional().describe('最小时长(秒)'),
77 maxDuration: z.number().optional().describe('单个文件最大时长(秒)'),
78 maxTotalDuration: z.number().optional().describe('总最大时长(秒)'),
79 maxSizeMb: z.number().optional().describe('单个文件最大大小(MB)'),
80 minAspectRatio: z.number().optional().describe('最小宽高比'),
81 maxAspectRatio: z.number().optional().describe('最大宽高比'),
82 minWidth: z.number().optional().describe('最小宽度'),
83 maxWidth: z.number().optional().describe('最大宽度'),
84 minPixels: z.number().optional().describe('最小像素数'),
85 maxPixels: z.number().optional().describe('最大像素数'),
86 minFps: z.number().optional().describe('最小帧率'),
87 maxFps: z.number().optional().describe('最大帧率'),
88 })
89
90 const VideoModelInputConstraintsVoSchema = z.object({
91 images: VideoModelInputConstraintVoSchema.optional().describe('图片输入约束'),
92 videos: VideoModelInputConstraintVoSchema.optional().describe('视频输入约束'),
93 audios: VideoModelInputConstraintVoSchema.optional().describe('音频输入约束'),
94 }).optional().describe('多模态输入约束')
95
96 export const VideoModelVoSchema = z.object({
97 name: z.string().describe('模型名称'),
98 description: z.string().describe('模型描述'),
99 channel: z.string().describe('渠道'),
100 modes: z.array(z.string()).describe('支持的模式'),
101 resolutions: z.array(z.string()).describe('支持的尺寸'),
102 durations: z.array(z.number()).describe('支持的时长'),
103 maxInputImages: z.number().describe('最大输入图片数'),
104 inputConstraints: VideoModelInputConstraintsVoSchema,
105 aspectRatios: z.array(z.string()).describe('支持的宽高比列表'),
106 tags: z.array(zodI18nString()).default([]).describe('标签'),
107 defaults: z.object({
108 resolution: z.string().optional().describe('默认分辨率'),
109 aspectRatio: z.string().optional().describe('默认宽高比'),
110 duration: z.number().optional().describe('默认时长'),
111 }).describe('默认值'),
112 })
113
114 export const DraftGenerationPricingVoSchema = z.object({
115 imageModels: z.array(ImageModelVoSchema).describe('图片生成模型价格列表'),
116 videoModels: z.array(VideoModelVoSchema).describe('视频生成模型价格列表'),
117 })
118
119 export type DraftGenerationPricingVoInput = z.input<typeof DraftGenerationPricingVoSchema>
120
121 export class DraftGenerationPricingVo extends createZodDto(DraftGenerationPricingVoSchema, 'DraftGenerationPricingVo') {}
122
122 lines TYPESCRIPT