返回 AiToEarn
aideo.dto.ts
根目录 / project / aitoearn-backend / apps / aitoearn-ai / src / core / ai / aideo / aideo.dto.ts
1 import { createZodDto, PaginationDtoSchema, UserType } from '@yikart/common'
2 import { z } from 'zod'
3 import { SkillType } from '../libs/volcengine'
4
5 // 视频输入项(URL 或 Stream)
6 const videoInputSchema = z.union([
7 z.string().describe('视频 URL'),
8 z.object({
9 type: z.literal('url'),
10 url: z.string(),
11 fileName: z.string().optional(),
12 fileExtension: z.string().optional(),
13 }),
14 z.object({
15 type: z.literal('stream'),
16 stream: z.custom<Buffer | NodeJS.ReadableStream>(),
17 fileSize: z.number(),
18 fileName: z.string().optional(),
19 fileExtension: z.string().optional(),
20 }),
21 ])
22
23 // 提交 Aideo 任务请求(Prompt 方式)
24 const submitAideoTaskPromptSchema = z.object({
25 prompt: z.string().min(1).describe('自然语言提示词'),
26 multiInputs: z.array(videoInputSchema).min(1).describe('输入文件列表'),
27 spaceName: z.string().optional().describe('点播空间名'),
28 })
29
30 // 提交 Aideo 任务请求(SkillType 方式)
31 const submitAideoTaskSkillSchema = z.object({
32 skillType: z.enum(SkillType).describe('AI 技能类型'),
33 skillParams: z.record(z.string(), z.unknown()).optional().describe('技能参数(JSON 对象)'),
34 multiInputs: z.array(videoInputSchema).min(1).describe('输入文件列表'),
35 spaceName: z.string().optional().describe('点播空间名'),
36 })
37
38 // 提交 Aideo 任务请求(Union 类型)
39 export const submitAideoTaskRequestSchema = z.union([
40 submitAideoTaskPromptSchema,
41 submitAideoTaskSkillSchema,
42 ])
43
44 // 导出类型
45 export type SubmitAideoTaskRequest = z.infer<typeof submitAideoTaskRequestSchema>
46
47 // 用户提交 Aideo 任务请求基础 Schema
48 const userSubmitAideoTaskBaseSchema = z.object({
49 userId: z.string(),
50 userType: z.enum(UserType),
51 multiInputs: z.array(videoInputSchema).min(1).describe('输入文件列表'),
52 spaceName: z.string().optional().describe('点播空间名'),
53 })
54
55 // 用户提交 Aideo 任务请求(Prompt 方式)
56 const userSubmitAideoTaskPromptSchema = userSubmitAideoTaskBaseSchema.extend({
57 prompt: z.string().min(1).describe('自然语言提示词'),
58 })
59
60 // 用户提交 Aideo 任务请求(SkillType 方式)
61 const userSubmitAideoTaskSkillSchema = userSubmitAideoTaskBaseSchema.extend({
62 skillType: z.enum(SkillType).describe('AI 技能类型'),
63 skillParams: z.record(z.string(), z.unknown()).optional().describe('技能参数(JSON 对象)'),
64 })
65
66 export const userSubmitAideoTaskRequestSchema = z.union([
67 userSubmitAideoTaskPromptSchema,
68 userSubmitAideoTaskSkillSchema,
69 ])
70
71 // 导出类型
72 export type UserSubmitAideoTaskRequest = z.infer<typeof userSubmitAideoTaskRequestSchema>
73
74 // 查询 Aideo 任务状态请求
75 const getAideoTaskQuerySchema = z.object({
76 taskId: z.string().min(1).describe('任务ID'),
77 })
78
79 export class GetAideoTaskQueryDto extends createZodDto(
80 getAideoTaskQuerySchema,
81 'GetAideoTaskQueryDto',
82 ) {}
83
84 // 用户查询 Aideo 任务状态请求
85 const userGetAideoTaskQuerySchema = z.object({
86 userId: z.string(),
87 userType: z.enum(UserType),
88 ...getAideoTaskQuerySchema.shape,
89 })
90
91 export class UserGetAideoTaskQueryDto extends createZodDto(
92 userGetAideoTaskQuerySchema,
93 'UserGetAideoTaskQueryDto',
94 ) {}
95
96 // 列表查询 Aideo 任务请求
97 const listAideoTasksQuerySchema = z.object({
98 ...PaginationDtoSchema.shape,
99 })
100
101 export class ListAideoTasksQueryDto extends createZodDto(
102 listAideoTasksQuerySchema,
103 'ListAideoTasksQueryDto',
104 ) {}
105
106 // 用户列表查询 Aideo 任务请求
107 const userListAideoTasksQuerySchema = z.object({
108 userId: z.string(),
109 userType: z.enum(UserType),
110 ...listAideoTasksQuerySchema.shape,
111 })
112
113 export class UserListAideoTasksQueryDto extends createZodDto(
114 userListAideoTasksQuerySchema,
115 'UserListAideoTasksQueryDto',
116 ) {}
117
118 // 视频风格转换相关 DTO
119 export interface UserSubmitVideoStyleTransferRequest {
120 userId: string
121 userType: UserType[keyof UserType]
122 /** 输入视频 URL 或 VID */
123 videoInput: string
124 /** 转绘风格,例如:"漫画风"、"3D卡通风格"、"日漫风格" */
125 style?: string
126 /** 输出视频分辨率 */
127 resolution: '480p' | '720p' | '1080p'
128 }
129
130 export interface UserGetVideoStyleTransferTaskRequest {
131 userId: string
132 userType: UserType[keyof UserType]
133 taskId: string
134 }
135
136 // 短剧解说相关 DTO
137 export interface UserSubmitDramaRecapTaskRequest {
138 userId: string
139 userType: UserType[keyof UserType]
140 /** 视频 VID 列表 */
141 vids: string[]
142 /** 剧本还原任务 ID(可选) */
143 dramaScriptTaskId?: string
144 /** 自定义解说词(可选) */
145 recapText?: string
146 /** 说话人配置 */
147 speakerConfig?: {
148 appId: string
149 cluster: string
150 voiceType: string
151 }
152 /** 是否擦除字幕 */
153 isEraseSubtitle?: boolean
154 /** 字体配置 */
155 fontConfig?: {
156 color?: string
157 size?: number
158 name?: string
159 }
160 /** AI 生成解说词的风格指令 */
161 recapStyle?: string
162 /** 期望的解说词语速 */
163 recapTextSpeed?: number
164 /** 期望 AI 生成的解说词长度 */
165 recapTextLength?: number
166 /** AI 配音时句间停顿的时长 */
167 pauseTime?: number
168 /** 是否允许解说词匹配重复的视频画面 */
169 allowRepeatMatch?: boolean
170 }
171
172 export interface UserGetDramaRecapTaskRequest {
173 userId: string
174 userType: UserType[keyof UserType]
175 taskId: string
176 }
177
177 lines TYPESCRIPT