返回 AiToEarn
draft-generation.dto.ts
根目录 / project / aitoearn-backend / libs / aitoearn-ai-shared / src / dtos / draft-generation.dto.ts
1 import { AccountType, createZodDto, PaginationDtoSchema, UserType } from '@yikart/common'
2 import { z } from 'zod'
3
4 export const IMAGE_TEXT_ASPECT_RATIOS = ['1:1', '2:3', '3:2', '3:4', '4:3', '4:5', '5:4', '9:16', '16:9'] as const
5
6 export const ALL_ASPECT_RATIOS = ['1:1', '16:9', '9:16', '4:3', '3:4', '3:2', '2:3'] as const
7
8 /** 视频草稿生成类型:draft 完整草稿(含标题/描述/话题),video 仅生成视频 */
9 export const DRAFT_TYPES = ['draft', 'video'] as const
10 export type DraftType = (typeof DRAFT_TYPES)[number]
11
12 /** 图文草稿生成类型:draft 完整草稿(含标题/描述/话题),image 仅生成图片 */
13 export const IMAGE_TEXT_DRAFT_TYPES = ['draft', 'image'] as const
14 export type ImageTextDraftType = (typeof IMAGE_TEXT_DRAFT_TYPES)[number]
15
16 export const CreateDraftGenerationV2DtoSchema = z.object({
17 quantity: z.number().int().min(1).max(10).default(1).describe('生成数量'),
18 groupId: z.string().optional().describe('素材组 ID,为空时使用默认草稿箱'),
19 prompt: z.string().max(2000).optional().describe('视频内容提示词;draftType=video 时作为纯视频提示词'),
20 captionPrompt: z.string().max(2000).optional().describe('社交媒体文案提示词,用于标题、描述和话题要求;draftType=video 时忽略'),
21 imageUrls: z.array(z.url()).max(9).optional().describe('用户传入的图片 URL 数组,传入时作为视频首帧图片源'),
22 model: z.string().describe('视频生成模型名称,如 grok-imagine-video'),
23 duration: z.number().int().min(1).max(15).optional().describe('视频时长(秒),1-15'),
24 resolution: z.string().optional().describe('视频分辨率'),
25 aspectRatio: z.enum(ALL_ASPECT_RATIOS).optional().describe('视频比例:1:1/16:9/9:16/4:3/3:4/3:2/2:3'),
26 videoUrls: z.array(z.url()).max(3).optional().describe('运动参考视频 URL 数组,最多3个'),
27 audioUrls: z.array(z.url()).max(3).optional().describe('参考音频 URL 数组,最多3个'),
28 draftType: z.enum(DRAFT_TYPES).default('draft').describe('草稿类型:draft 完整草稿,video 仅生成视频且不生成文案'),
29 platforms: z.array(z.enum(AccountType)).optional().describe('目标平台列表,如 ["tiktok", "youtube"]'),
30 plannerModel: z.string().optional().describe('草稿规划模型名称,仅 draftType=draft 时生效'),
31 disableMemory: z.boolean().optional().default(true).describe('是否禁用用户记忆'),
32 })
33 export class CreateDraftGenerationV2Dto extends createZodDto(CreateDraftGenerationV2DtoSchema, 'CreateDraftGenerationV2Dto') {}
34
35 export const QueryDraftGenerationTasksDtoSchema = z.object({
36 taskIds: z.array(z.string()).min(1).max(10).describe('任务 ID 列表'),
37 })
38
39 export class QueryDraftGenerationTasksDto extends createZodDto(QueryDraftGenerationTasksDtoSchema, 'QueryDraftGenerationTasksDto') {}
40
41 export const ListDraftGenerationTasksDtoSchema = PaginationDtoSchema
42
43 export class ListDraftGenerationTasksDto extends createZodDto(ListDraftGenerationTasksDtoSchema, 'ListDraftGenerationTasksDto') {}
44
45 export const CreateImageTextDraftDtoSchema = z.object({
46 quantity: z.number().int().min(1).max(10).default(1).describe('生成数量'),
47 groupId: z.string().optional().describe('素材组 ID,为空时使用默认草稿箱'),
48 prompt: z.string().max(2000).describe('图片内容提示词;draftType=image 时作为纯图片提示词'),
49 captionPrompt: z.string().max(2000).optional().describe('社交媒体文案提示词,用于标题、描述和话题要求;draftType=image 时忽略'),
50 imageUrls: z.array(z.url()).max(14).optional().describe('参考图片 URL 数组'),
51 imageModel: z.string().describe('图片生成模型名称'),
52 imageCount: z.number().int().min(1).max(9).default(3).describe('生成图片数量'),
53 imageSize: z.string().optional().describe('图片分辨率:1K、2K 或 4K'),
54 aspectRatio: z.enum(IMAGE_TEXT_ASPECT_RATIOS).optional().describe('图片宽高比'),
55 draftType: z.enum(IMAGE_TEXT_DRAFT_TYPES).default('draft').describe('草稿类型:draft 完整草稿,image 仅生成图片且不生成文案'),
56 platforms: z.array(z.enum(AccountType)).optional().describe('目标平台列表,如 ["tiktok", "xhs"]'),
57 plannerModel: z.string().optional().describe('草稿规划模型名称,仅 draftType=draft 时生效'),
58 disableMemory: z.boolean().optional().default(true).describe('是否禁用用户记忆'),
59 })
60
61 export class CreateImageTextDraftDto extends createZodDto(CreateImageTextDraftDtoSchema, 'CreateImageTextDraftDto') {}
62
63 export const CreateDraftFromVideoUrlDtoSchema = z.object({
64 videoUrl: z.url().describe('视频 URL,Gemini 将分析视频内容并生成草稿文案'),
65 groupId: z.string().optional().describe('素材组 ID,为空时使用默认草稿箱'),
66 platforms: z.array(z.enum(AccountType)).optional().describe('目标平台列表,如 ["tiktok", "youtube"]'),
67 })
68
69 export class CreateDraftFromVideoUrlDto extends createZodDto(CreateDraftFromVideoUrlDtoSchema, 'CreateDraftFromVideoUrlDto') {}
70
71 // Internal DTOs (used by ai-client for internal API calls)
72
73 const InternalCreateDraftV2Schema = z.object({
74 userId: z.string().describe('用户 ID'),
75 userType: z.enum(UserType).describe('用户类型'),
76 quantity: z.number().int().min(1).max(10).default(1).describe('生成数量'),
77 groupId: z.string().optional().describe('素材组 ID'),
78 prompt: z.string().max(2000).optional().describe('视频内容提示词;draftType=video 时作为纯视频提示词'),
79 captionPrompt: z.string().max(2000).optional().describe('社交媒体文案提示词,用于标题、描述和话题要求;draftType=video 时忽略'),
80 imageUrls: z.array(z.url()).max(9).optional().describe('图片 URL 数组'),
81 model: z.string().describe('视频生成模型名称'),
82 duration: z.number().int().min(1).max(15).optional().describe('视频时长(秒)'),
83 resolution: z.string().optional().describe('视频分辨率'),
84 aspectRatio: z.enum(ALL_ASPECT_RATIOS).optional().describe('视频比例'),
85 videoUrls: z.array(z.url()).max(3).optional().describe('运动参考视频 URL 数组'),
86 audioUrls: z.array(z.url()).max(3).optional().describe('参考音频 URL 数组'),
87 draftType: z.enum(DRAFT_TYPES).default('draft').describe('草稿类型'),
88 platforms: z.array(z.enum(AccountType)).optional().describe('目标平台列表'),
89 plannerModel: z.string().optional().describe('草稿规划模型名称,仅 draftType=draft 时生效'),
90 disableMemory: z.boolean().optional().default(true).describe('是否禁用用户记忆'),
91 })
92 export class InternalCreateDraftV2Dto extends createZodDto(InternalCreateDraftV2Schema, 'InternalCreateDraftV2Dto') {}
93
94 const InternalCreateImageTextDraftSchema = z.object({
95 userId: z.string().describe('用户 ID'),
96 userType: z.enum(UserType).describe('用户类型'),
97 quantity: z.number().int().min(1).max(10).default(1).describe('生成数量'),
98 groupId: z.string().optional().describe('素材组 ID'),
99 prompt: z.string().max(2000).describe('图片内容提示词;draftType=image 时作为纯图片提示词'),
100 captionPrompt: z.string().max(2000).optional().describe('社交媒体文案提示词,用于标题、描述和话题要求;draftType=image 时忽略'),
101 imageUrls: z.array(z.url()).max(14).optional().describe('参考图片 URL 数组'),
102 imageModel: z.string().describe('图片生成模型名称'),
103 imageCount: z.number().int().min(1).max(9).default(3).describe('生成图片数量'),
104 imageSize: z.string().optional().describe('图片分辨率'),
105 aspectRatio: z.enum(IMAGE_TEXT_ASPECT_RATIOS).optional().describe('图片宽高比'),
106 draftType: z.enum(IMAGE_TEXT_DRAFT_TYPES).default('draft').describe('草稿类型'),
107 platforms: z.array(z.enum(AccountType)).optional().describe('目标平台列表'),
108 plannerModel: z.string().optional().describe('草稿规划模型名称,仅 draftType=draft 时生效'),
109 disableMemory: z.boolean().optional().default(true).describe('是否禁用用户记忆'),
110 })
111 export class InternalCreateImageTextDraftDto extends createZodDto(InternalCreateImageTextDraftSchema, 'InternalCreateImageTextDraftDto') {}
112
113 const InternalGetDraftTaskSchema = z.object({
114 userId: z.string().describe('用户 ID'),
115 userType: z.enum(UserType).describe('用户类型'),
116 taskId: z.string().describe('任务 ID'),
117 })
118 export class InternalGetDraftTaskDto extends createZodDto(InternalGetDraftTaskSchema, 'InternalGetDraftTaskDto') {}
119
120 const InternalListDraftTasksSchema = z.object({
121 userId: z.string().describe('用户 ID'),
122 userType: z.enum(UserType).describe('用户类型'),
123 page: z.coerce.number().default(1).describe('页码'),
124 pageSize: z.coerce.number().default(10).describe('每页数量'),
125 })
126 export class InternalListDraftTasksDto extends createZodDto(InternalListDraftTasksSchema, 'InternalListDraftTasksDto') {}
127
128 const InternalQueryDraftTasksSchema = z.object({
129 userId: z.string().describe('用户 ID'),
130 userType: z.enum(UserType).describe('用户类型'),
131 taskIds: z.array(z.string()).min(1).max(10).describe('任务 ID 列表'),
132 })
133 export class InternalQueryDraftTasksDto extends createZodDto(InternalQueryDraftTasksSchema, 'InternalQueryDraftTasksDto') {}
134
134 lines TYPESCRIPT