@purpleschool/gptbot-tools 0.0.77 → 0.0.78-ai-proxy

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/ai-proxy/index.ts +1 -0
  2. package/ai-proxy/routes/ai-proxy.routes.ts +7 -0
  3. package/ai-proxy/routes/index.ts +1 -0
  4. package/ai-vendor/index.ts +1 -0
  5. package/ai-vendor/models/ai-vendor.schema.ts +13 -0
  6. package/ai-vendor/models/index.ts +1 -0
  7. package/build/ai-proxy/index.js +17 -0
  8. package/build/ai-proxy/routes/ai-proxy.routes.js +9 -0
  9. package/build/ai-proxy/routes/index.js +17 -0
  10. package/build/ai-vendor/index.js +17 -0
  11. package/build/ai-vendor/models/ai-vendor.schema.js +13 -0
  12. package/build/ai-vendor/models/index.js +17 -0
  13. package/build/common/errors/errors.js +158 -0
  14. package/build/common/models/attached-file.schema.js +13 -0
  15. package/build/common/models/index.js +1 -0
  16. package/build/image-editor/commands/image-editor-model/get-image-editor-model-by-uuid.command.js +13 -0
  17. package/build/image-editor/commands/image-editor-model/index.js +17 -0
  18. package/build/image-editor/commands/image-editor.command.js +3 -1
  19. package/build/image-editor/commands/index.js +1 -0
  20. package/build/image-editor/commands/retry-image-editor-job.command.js +4 -0
  21. package/build/image-editor/commands/set-reaction-to-image-editor-job.command.js +12 -2
  22. package/build/image-editor/enums/image-editor-model-type.enum.js +2 -0
  23. package/build/image-editor/enums/image-editor-strategy.enum.js +4 -0
  24. package/build/image-editor/models/image-editor-config.schema.js +1 -0
  25. package/build/image-editor/models/image-editor-job.schema.js +2 -0
  26. package/build/image-editor/models/image-editor-model.schema.js +9 -1
  27. package/build/image-editor/routes/image-editor-model.amqp.routes.js +6 -0
  28. package/build/image-editor/routes/image-editor.http.routes.js +1 -0
  29. package/build/image-editor/routes/index.js +1 -0
  30. package/build/image-generation/commands/execute-image-generation.command.js +20 -0
  31. package/build/image-generation/commands/forward-image-generation-job.command.js +32 -0
  32. package/build/image-generation/commands/index.js +23 -0
  33. package/build/image-generation/commands/save-image-generation-job.command.js +17 -0
  34. package/build/image-generation/commands/set-reaction-to-image-generation-job.command.js +27 -0
  35. package/build/image-generation/commands/soft-delete-image-generation-job-by-uuid.command.js +14 -0
  36. package/build/image-generation/commands/soft-delete-image-generation-jobs-by-criteria.command.js +13 -0
  37. package/build/image-generation/commands/update-image-generation-job-title.command.js +16 -0
  38. package/build/image-generation/enums/image-generation-model-strategy.enum.js +23 -0
  39. package/build/image-generation/enums/image-generation-models.enum.js +8 -0
  40. package/build/image-generation/enums/image-generation-resolution.enum.js +9 -0
  41. package/build/image-generation/enums/index.js +19 -0
  42. package/build/image-generation/index.js +21 -0
  43. package/build/image-generation/models/image-generation-config.schema.js +12 -0
  44. package/build/image-generation/models/image-generation-job.schema.js +35 -0
  45. package/build/image-generation/models/image-generation-model.schema.js +51 -0
  46. package/build/image-generation/models/image-generation-preset.schema.js +13 -0
  47. package/build/image-generation/models/index.js +20 -0
  48. package/build/image-generation/queries/find-image-generation-job-by-id.query.js +19 -0
  49. package/build/image-generation/queries/find-image-generation-jobs.query.js +28 -0
  50. package/build/image-generation/queries/get-image-generation-config.query.js +11 -0
  51. package/build/image-generation/queries/index.js +19 -0
  52. package/build/image-generation/routes/image-generation.amqp.routes.js +14 -0
  53. package/build/image-generation/routes/image-generation.http.routes.js +9 -0
  54. package/build/image-generation/routes/index.js +18 -0
  55. package/build/index.js +7 -0
  56. package/build/music/commands/index.js +1 -0
  57. package/build/music/commands/music-model/get-music-model-by-uuid.command.js +13 -0
  58. package/build/music/commands/music-model/index.js +17 -0
  59. package/build/music/commands/retry-music-job.command.js +2 -0
  60. package/build/music/commands/set-reaction-to-music-job.command.js +12 -2
  61. package/build/music/models/music-job.schema.js +1 -0
  62. package/build/music/models/music-track.schema.js +1 -0
  63. package/build/music/routes/index.js +1 -0
  64. package/build/music/routes/music-model.amqp.routes.js +6 -0
  65. package/build/music/routes/music.http.routes.js +1 -4
  66. package/build/paraphrase/commands/delete-all-paraphrase-jobs.command.js +13 -0
  67. package/build/paraphrase/commands/delete-paraphrase-job-by-uuid.command.js +14 -0
  68. package/build/paraphrase/commands/index.js +5 -0
  69. package/build/paraphrase/commands/retry-paraphrase-job.command.js +16 -0
  70. package/build/paraphrase/commands/set-reaction-to-paraphrase-job.command.js +27 -0
  71. package/build/paraphrase/commands/update-paraphrase-job-title.command.js +16 -0
  72. package/build/paraphrase/models/paraphrase-job.schema.js +7 -0
  73. package/build/paraphrase/queries/find-paraphrase-jobs.query.js +28 -0
  74. package/build/paraphrase/queries/index.js +1 -0
  75. package/build/paraphrase/routes/paraphrase.amqp.routes.js +6 -0
  76. package/build/presentation/commands/index.js +1 -0
  77. package/build/presentation/commands/set-reaction-to-presentation.command.js +26 -0
  78. package/build/presentation/models/pptx-export-payload.js +19 -1
  79. package/build/presentation/models/presentation.schema.js +3 -0
  80. package/build/presentation/models/slide-content.schema.js +7 -3
  81. package/build/presentation/routes/presentation.routes.js +1 -0
  82. package/build/stt/commands/set-reaction-to-stt-job.command.js +12 -2
  83. package/build/stt/models/stt-job.schema.js +2 -0
  84. package/build/tools/enums/tool-content-type.enum.js +1 -0
  85. package/build/tools/enums/tool-type.enum.js +1 -0
  86. package/build/tools/models/global-tools-config.schema.js +2 -0
  87. package/build/tools/models/tools-with-configs.schema.js +5 -0
  88. package/build/tts/commands/set-reaction-to-tts-job.command.js +12 -2
  89. package/build/tts/models/tts-job.schema.js +2 -0
  90. package/build/video/commands/index.js +1 -0
  91. package/build/video/commands/retry-video-job.command.js +4 -0
  92. package/build/video/commands/set-reaction-to-video-job.command.js +12 -2
  93. package/build/video/commands/video-model/get-video-model-by-uuid.command.js +13 -0
  94. package/build/video/commands/video-model/index.js +17 -0
  95. package/build/video/models/video-job.schema.js +3 -0
  96. package/build/video/models/video-model.schema.js +1 -0
  97. package/build/video/routes/index.js +1 -0
  98. package/build/video/routes/video-model.amqp.routes.js +6 -0
  99. package/build/video-editor/commands/edit-video.command.js +2 -1
  100. package/build/video-editor/commands/index.js +1 -0
  101. package/build/video-editor/commands/retry-video-editor-job.command.js +5 -0
  102. package/build/video-editor/commands/set-reaction-to-video-editor-job.command.js +12 -2
  103. package/build/video-editor/commands/video-editor-model/get-video-editor-model.command.js +13 -0
  104. package/build/video-editor/commands/video-editor-model/index.js +17 -0
  105. package/build/video-editor/models/video-editor-job.schema.js +3 -0
  106. package/build/video-editor/routes/index.js +1 -0
  107. package/build/video-editor/routes/video-editor-model.amqp.routes.js +6 -0
  108. package/build/writer/commands/set-reaction-writer-document.command.js +11 -1
  109. package/build/writer/models/writer-document.schema.js +1 -0
  110. package/common/errors/errors.ts +158 -0
  111. package/common/models/attached-file.schema.ts +11 -0
  112. package/common/models/index.ts +1 -0
  113. package/image-editor/commands/image-editor-model/get-image-editor-model-by-uuid.command.ts +13 -0
  114. package/image-editor/commands/image-editor-model/index.ts +1 -0
  115. package/image-editor/commands/image-editor.command.ts +3 -1
  116. package/image-editor/commands/index.ts +1 -0
  117. package/image-editor/commands/retry-image-editor-job.command.ts +5 -1
  118. package/image-editor/commands/set-reaction-to-image-editor-job.command.ts +19 -6
  119. package/image-editor/enums/image-editor-model-type.enum.ts +2 -0
  120. package/image-editor/enums/image-editor-strategy.enum.ts +4 -0
  121. package/image-editor/models/image-editor-config.schema.ts +1 -0
  122. package/image-editor/models/image-editor-job.schema.ts +3 -1
  123. package/image-editor/models/image-editor-model.schema.ts +16 -0
  124. package/image-editor/routes/image-editor-model.amqp.routes.ts +3 -0
  125. package/image-editor/routes/image-editor.http.routes.ts +1 -0
  126. package/image-editor/routes/index.ts +1 -0
  127. package/image-generation/commands/execute-image-generation.command.ts +20 -0
  128. package/image-generation/commands/forward-image-generation-job.command.ts +32 -0
  129. package/image-generation/commands/index.ts +7 -0
  130. package/image-generation/commands/save-image-generation-job.command.ts +17 -0
  131. package/image-generation/commands/set-reaction-to-image-generation-job.command.ts +30 -0
  132. package/image-generation/commands/soft-delete-image-generation-job-by-uuid.command.ts +14 -0
  133. package/image-generation/commands/soft-delete-image-generation-jobs-by-criteria.command.ts +13 -0
  134. package/image-generation/commands/update-image-generation-job-title.command.ts +16 -0
  135. package/image-generation/enums/image-generation-model-strategy.enum.ts +24 -0
  136. package/image-generation/enums/image-generation-models.enum.ts +4 -0
  137. package/image-generation/enums/image-generation-resolution.enum.ts +5 -0
  138. package/image-generation/enums/index.ts +3 -0
  139. package/image-generation/index.ts +5 -0
  140. package/image-generation/models/image-generation-config.schema.ts +11 -0
  141. package/image-generation/models/image-generation-job.schema.ts +37 -0
  142. package/image-generation/models/image-generation-model.schema.ts +64 -0
  143. package/image-generation/models/image-generation-preset.schema.ts +13 -0
  144. package/image-generation/models/index.ts +4 -0
  145. package/image-generation/queries/find-image-generation-job-by-id.query.ts +19 -0
  146. package/image-generation/queries/find-image-generation-jobs.query.ts +33 -0
  147. package/image-generation/queries/get-image-generation-config.query.ts +11 -0
  148. package/image-generation/queries/index.ts +3 -0
  149. package/image-generation/routes/image-generation.amqp.routes.ts +11 -0
  150. package/image-generation/routes/image-generation.http.routes.ts +7 -0
  151. package/image-generation/routes/index.ts +2 -0
  152. package/index.ts +7 -0
  153. package/music/commands/index.ts +1 -0
  154. package/music/commands/music-model/get-music-model-by-uuid.command.ts +13 -0
  155. package/music/commands/music-model/index.ts +1 -0
  156. package/music/commands/retry-music-job.command.ts +3 -1
  157. package/music/commands/set-reaction-to-music-job.command.ts +19 -6
  158. package/music/models/music-job.schema.ts +1 -0
  159. package/music/models/music-track.schema.ts +1 -0
  160. package/music/routes/index.ts +1 -0
  161. package/music/routes/music-model.amqp.routes.ts +3 -0
  162. package/music/routes/music.http.routes.ts +0 -4
  163. package/package.json +1 -1
  164. package/paraphrase/commands/delete-all-paraphrase-jobs.command.ts +13 -0
  165. package/paraphrase/commands/delete-paraphrase-job-by-uuid.command.ts +14 -0
  166. package/paraphrase/commands/index.ts +5 -0
  167. package/paraphrase/commands/retry-paraphrase-job.command.ts +16 -0
  168. package/paraphrase/commands/set-reaction-to-paraphrase-job.command.ts +30 -0
  169. package/paraphrase/commands/update-paraphrase-job-title.command.ts +16 -0
  170. package/paraphrase/models/paraphrase-job.schema.ts +7 -0
  171. package/paraphrase/queries/find-paraphrase-jobs.query.ts +33 -0
  172. package/paraphrase/queries/index.ts +1 -0
  173. package/paraphrase/routes/paraphrase.amqp.routes.ts +6 -0
  174. package/presentation/commands/index.ts +1 -0
  175. package/presentation/commands/set-reaction-to-presentation.command.ts +29 -0
  176. package/presentation/models/pptx-export-payload.ts +20 -0
  177. package/presentation/models/presentation.schema.ts +3 -0
  178. package/presentation/models/slide-content.schema.ts +9 -3
  179. package/presentation/routes/presentation.routes.ts +1 -0
  180. package/stt/commands/set-reaction-to-stt-job.command.ts +19 -6
  181. package/stt/models/stt-job.schema.ts +2 -0
  182. package/tools/enums/tool-content-type.enum.ts +1 -0
  183. package/tools/enums/tool-type.enum.ts +1 -0
  184. package/tools/models/global-tools-config.schema.ts +2 -0
  185. package/tools/models/tools-with-configs.schema.ts +7 -0
  186. package/tts/commands/set-reaction-to-tts-job.command.ts +19 -6
  187. package/tts/models/tts-job.schema.ts +2 -0
  188. package/video/commands/index.ts +1 -0
  189. package/video/commands/retry-video-job.command.ts +4 -0
  190. package/video/commands/set-reaction-to-video-job.command.ts +19 -6
  191. package/video/commands/video-model/get-video-model-by-uuid.command.ts +13 -0
  192. package/video/commands/video-model/index.ts +1 -0
  193. package/video/models/video-job.schema.ts +3 -0
  194. package/video/models/video-model.schema.ts +1 -0
  195. package/video/routes/index.ts +1 -0
  196. package/video/routes/video-model.amqp.routes.ts +3 -0
  197. package/video-editor/commands/edit-video.command.ts +2 -1
  198. package/video-editor/commands/index.ts +1 -0
  199. package/video-editor/commands/retry-video-editor-job.command.ts +5 -0
  200. package/video-editor/commands/set-reaction-to-video-editor-job.command.ts +19 -6
  201. package/video-editor/commands/video-editor-model/get-video-editor-model.command.ts +13 -0
  202. package/video-editor/commands/video-editor-model/index.ts +1 -0
  203. package/video-editor/models/video-editor-job.schema.ts +3 -0
  204. package/video-editor/routes/index.ts +1 -0
  205. package/video-editor/routes/video-editor-model.amqp.routes.ts +3 -0
  206. package/writer/commands/set-reaction-writer-document.command.ts +19 -6
  207. package/writer/models/writer-document.schema.ts +1 -0
@@ -5,6 +5,7 @@ export enum PPTX_SHAPE_TYPE {
5
5
  PICTURE_BOX = 'picture_box',
6
6
  CUSTOM_SHAPE = 'custom_shape',
7
7
  TABLE = 'table',
8
+ CHEVRON = 'chevron',
8
9
  }
9
10
 
10
11
  export enum PPTX_H_ALIGN {
@@ -47,6 +48,13 @@ export enum PPTX_CUSTOM_SHAPE_TYPE {
47
48
  ROUND_RECT = 'roundRect',
48
49
  }
49
50
 
51
+ export enum PPTX_CHEVRON_DIRECTION {
52
+ RIGHT = 'right',
53
+ LEFT = 'left',
54
+ UP = 'up',
55
+ DOWN = 'down',
56
+ }
57
+
50
58
  export const PPTXShadowSchema = z.object({
51
59
  type: z.nativeEnum(PPTX_SHADOW_TYPE),
52
60
  opacity: z.number().min(0).max(100).optional().describe('percents, range 0-100'),
@@ -182,6 +190,17 @@ export const PPTXTableShapeSchema = z.object({
182
190
  });
183
191
  export type PPTXTableShape = z.infer<typeof PPTXTableShapeSchema>;
184
192
 
193
+ // Chevron
194
+ export const PPTXChevronShapeSchema = z.object({
195
+ type: z.literal(PPTX_SHAPE_TYPE.CHEVRON),
196
+ direction: z.nativeEnum(PPTX_CHEVRON_DIRECTION).default(PPTX_CHEVRON_DIRECTION.RIGHT),
197
+ position: PPTXPositionSchema,
198
+ fill: PPTXFillSchema.optional(),
199
+ align: z.nativeEnum(PPTX_H_ALIGN).optional().default(PPTX_H_ALIGN.CENTER),
200
+ valign: z.nativeEnum(PPTX_V_ALIGN).optional().default(PPTX_V_ALIGN.MIDDLE),
201
+ });
202
+ export type PPTXChevronShape = z.infer<typeof PPTXChevronShapeSchema>;
203
+
185
204
  // Overview
186
205
 
187
206
  export const PPTXShapeSchema = z.discriminatedUnion('type', [
@@ -189,6 +208,7 @@ export const PPTXShapeSchema = z.discriminatedUnion('type', [
189
208
  PPTXPictureBoxSchema,
190
209
  PPTXCustomShapeSchema,
191
210
  PPTXTableShapeSchema,
211
+ PPTXChevronShapeSchema,
192
212
  ]);
193
213
  export type PPTXShape = z.infer<typeof PPTXShapeSchema>;
194
214
 
@@ -2,6 +2,7 @@ import { z } from 'zod';
2
2
  import { PRESENTATION_STAGE } from '../enums';
3
3
  import { SlideOutlineSchema } from './slide-outline.schema';
4
4
  import { SlideSchema } from './slide.schema';
5
+ import { USER_REACTION } from '../../common';
5
6
 
6
7
  export const PresentationSchema = z.object({
7
8
  uuid: z.string().uuid(),
@@ -12,6 +13,8 @@ export const PresentationSchema = z.object({
12
13
  languageId: z.string(),
13
14
  templateId: z.string(),
14
15
  downloadUrl: z.string().nullable(),
16
+ reaction: z.nativeEnum(USER_REACTION).nullable(),
17
+ dislikeReason: z.string().nullable(),
15
18
  userId: z.string().uuid().nullable().optional(),
16
19
  unregisteredUserId: z.string().uuid().nullable().optional(),
17
20
  slideCount: z.number(),
@@ -342,7 +342,13 @@ export const TimelineSlideDataSchema = z.object({
342
342
  )
343
343
  .min(2)
344
344
  .max(50),
345
- title: z.string().describe('Event title in 2-4 words').min(5).max(80),
345
+ title: z
346
+ .string()
347
+ .describe(
348
+ 'Event title. Prefer 2 words, max 3 words. Keep it short and punchy.',
349
+ )
350
+ .min(5)
351
+ .max(60),
346
352
  description: z
347
353
  .string()
348
354
  .describe('Brief description of the event or milestone')
@@ -350,8 +356,8 @@ export const TimelineSlideDataSchema = z.object({
350
356
  .max(150),
351
357
  }),
352
358
  )
353
- .length(5)
354
- .describe('Timeline must contain exactly 5 chronological events'),
359
+ .length(4)
360
+ .describe('Timeline must contain exactly 4 chronological events'),
355
361
  }),
356
362
  version: z.literal(1),
357
363
  }) satisfies z.ZodType<ITimelineSlideDataStructure>;
@@ -18,6 +18,7 @@ export const PRESENTATION_AMQP_ROUTES = {
18
18
  UPDATE_SLIDE: 'tools.presentation.update-slide.rpc',
19
19
  PARAPHRASE: 'tools.presentation.actions.paraphrase.rpc',
20
20
  GENERATE_REPORT: 'tools.presentation.actions.generate-report.rpc',
21
+ SET_REACTION: 'tools.presentation.set-reaction.rpc',
21
22
  } as const;
22
23
 
23
24
  export const PRESENTATION_SLIDE_OUTLINE_AMQP_ROUTES = {
@@ -4,12 +4,25 @@ import { USER_REACTION } from '../../common';
4
4
  import { STTJobSchema } from '../models';
5
5
 
6
6
  export namespace SetReactionToSTTJobCommand {
7
- export const RequestSchema = z.object({
8
- userId: z.string().uuid().nullable().optional(),
9
- unregisteredUserId: z.string().uuid().nullable().optional(),
10
- uuid: z.string(),
11
- reaction: z.nativeEnum(USER_REACTION).nullable(),
12
- });
7
+ export const RequestSchema = z
8
+ .object({
9
+ userId: z.string().uuid().nullable().optional(),
10
+ unregisteredUserId: z.string().uuid().nullable().optional(),
11
+ uuid: z.string().uuid(),
12
+ reaction: z.nativeEnum(USER_REACTION).nullable(),
13
+ dislikeReason: z.string().nullable().default(null),
14
+ })
15
+ .refine(
16
+ (data) => {
17
+ if (data.reaction !== USER_REACTION.DISLIKED && data.dislikeReason) {
18
+ return false;
19
+ }
20
+ return true;
21
+ },
22
+ {
23
+ message: 'Dislike reason is not allowed when reaction is not disliked',
24
+ },
25
+ );
13
26
  export type Request = z.infer<typeof RequestSchema>;
14
27
 
15
28
  export const ResponseSchema = ICommandResponseSchema(STTJobSchema);
@@ -12,7 +12,9 @@ export const STTJobSchema = z.object({
12
12
  fileUrl: z.string(),
13
13
  aiResponse: STTResponseSchema.nullable(),
14
14
  reaction: z.nativeEnum(USER_REACTION).nullable(),
15
+ dislikeReason: z.string().nullable(),
15
16
  status: z.nativeEnum(JOB_STATUS),
17
+ duration: z.number(),
16
18
  error: z.string().nullable(),
17
19
  userId: z.string().nullable(),
18
20
  unregisteredUserId: z.string().nullable(),
@@ -1,5 +1,6 @@
1
1
  export enum TOOL_CONTENT_TYPE {
2
2
  IMAGE_EDITOR = 'IMAGE_EDITOR',
3
+ IMAGE_GENERATION = 'IMAGE_GENERATION',
3
4
  TEXT_TO_SPEECH = 'TEXT_TO_SPEECH',
4
5
  SPEECH_TO_TEXT = 'SPEECH_TO_TEXT',
5
6
  REPHRASE = 'REPHRASE',
@@ -11,4 +11,5 @@ export enum TOOL_TYPE {
11
11
  VIDEO_EDITOR = 'VIDEO_EDITOR',
12
12
  MUSIC = 'MUSIC',
13
13
  MUSIC_ACTION = 'MUSIC_ACTION',
14
+ IMAGE_GENERATION = 'IMAGE_GENERATION',
14
15
  }
@@ -4,6 +4,7 @@ import { VideoConfigSchema } from '../../video';
4
4
  import { MusicConfigSchema } from '../../music';
5
5
  import { WriterConfigSchema } from '../../writer';
6
6
  import { ImageEditorConfigSchema } from '../../image-editor';
7
+ import { ImageGenerationConfigSchema } from '../../image-generation';
7
8
  import { ParaphraseToolConfigSchema } from '../../paraphrase';
8
9
  import { PresentationConfigSchema } from '../../presentation';
9
10
  import { VideoEditorConfigSchema } from '../../video-editor';
@@ -15,6 +16,7 @@ export const GlobalToolsConfigSchema = z.object({
15
16
  [TOOL_CONTENT_TYPE.MUSIC]: MusicConfigSchema,
16
17
  [TOOL_CONTENT_TYPE.WRITER]: WriterConfigSchema,
17
18
  [TOOL_CONTENT_TYPE.IMAGE_EDITOR]: ImageEditorConfigSchema,
19
+ [TOOL_CONTENT_TYPE.IMAGE_GENERATION]: ImageGenerationConfigSchema,
18
20
  [TOOL_CONTENT_TYPE.REPHRASE]: ParaphraseToolConfigSchema,
19
21
  [TOOL_CONTENT_TYPE.PRESENTATION]: PresentationConfigSchema,
20
22
  [TOOL_CONTENT_TYPE.VIDEO_EDITOR]: VideoEditorConfigSchema,
@@ -4,6 +4,7 @@ import { VideoConfigSchema } from '../../video';
4
4
  import { MusicConfigSchema } from '../../music';
5
5
  import { WriterConfigSchema } from '../../writer';
6
6
  import { ImageEditorConfigSchema } from '../../image-editor';
7
+ import { ImageGenerationConfigSchema } from '../../image-generation';
7
8
  import { ParaphraseToolConfigSchema } from '../../paraphrase';
8
9
  import { PresentationConfigSchema } from '../../presentation';
9
10
  import { VideoEditorConfigSchema } from '../../video-editor';
@@ -37,6 +38,12 @@ export const ToolWithConfigSchema = z.discriminatedUnion('contentType', [
37
38
  config: ImageEditorConfigSchema,
38
39
  }),
39
40
  ),
41
+ ToolSchema.merge(
42
+ z.object({
43
+ contentType: z.literal(TOOL_CONTENT_TYPE.IMAGE_GENERATION),
44
+ config: ImageGenerationConfigSchema,
45
+ }),
46
+ ),
40
47
  ToolSchema.merge(
41
48
  z.object({
42
49
  contentType: z.literal(TOOL_CONTENT_TYPE.REPHRASE),
@@ -4,12 +4,25 @@ import { TTSJobSchema } from '../models/tts-job.schema';
4
4
  import { USER_REACTION } from '../../common';
5
5
 
6
6
  export namespace SetReactionToTTSJobCommand {
7
- export const RequestSchema = z.object({
8
- userId: z.string().uuid().nullable().optional(),
9
- unregisteredUserId: z.string().uuid().nullable().optional(),
10
- uuid: z.string(),
11
- reaction: z.nativeEnum(USER_REACTION).nullable(),
12
- });
7
+ export const RequestSchema = z
8
+ .object({
9
+ userId: z.string().uuid().nullable().optional(),
10
+ unregisteredUserId: z.string().uuid().nullable().optional(),
11
+ uuid: z.string().uuid(),
12
+ reaction: z.nativeEnum(USER_REACTION).nullable(),
13
+ dislikeReason: z.string().nullable().default(null),
14
+ })
15
+ .refine(
16
+ (data) => {
17
+ if (data.reaction !== USER_REACTION.DISLIKED && data.dislikeReason) {
18
+ return false;
19
+ }
20
+ return true;
21
+ },
22
+ {
23
+ message: 'Dislike reason is not allowed when reaction is not disliked',
24
+ },
25
+ );
13
26
  export type Request = z.infer<typeof RequestSchema>;
14
27
 
15
28
  export const ResponseSchema = ICommandResponseSchema(TTSJobSchema);
@@ -15,12 +15,14 @@ export const TTSJobSchema = z.object({
15
15
  userInput: z.string(),
16
16
  aiResponse: z.string().nullable(),
17
17
  reaction: z.nativeEnum(USER_REACTION).nullable(),
18
+ dislikeReason: z.string().nullable(),
18
19
  title: z.string(),
19
20
  status: z.nativeEnum(JOB_STATUS),
20
21
  error: z.string().nullable(),
21
22
  modelId: z.string(),
22
23
  voiceId: z.string(),
23
24
  price: z.number(),
25
+ duration: z.number(),
24
26
  userId: z.string().nullable(),
25
27
  unregisteredUserId: z.string().nullable(),
26
28
  isDeleted: z.boolean(),
@@ -4,3 +4,4 @@ export * from './retry-video-job.command';
4
4
  export * from './set-reaction-to-video-job.command';
5
5
  export * from './video.command';
6
6
  export * from './update-video-job-title.command';
7
+ export * from './video-model';
@@ -1,6 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import { ICommandResponseSchema } from '../../common/models/command-response.schema';
3
3
  import { VideoJobSchema } from '../models/video-job.schema';
4
+ import { VideoGenerationRequestParamsSchema } from '../models';
4
5
 
5
6
  export namespace RetryVideoJobCommand {
6
7
  export const RequestSchema = z.object({
@@ -8,6 +9,9 @@ export namespace RetryVideoJobCommand {
8
9
  userBalance: z.number(),
9
10
  userId: z.string().uuid().nullable().optional(),
10
11
  unregisteredUserId: z.string().uuid().nullable().optional(),
12
+ prompt: z.string().optional(),
13
+ modelId: z.string().uuid().optional(),
14
+ params: VideoGenerationRequestParamsSchema.optional(),
11
15
  });
12
16
  export type Request = z.infer<typeof RequestSchema>;
13
17
 
@@ -4,12 +4,25 @@ import { VideoJobSchema } from '../models/video-job.schema';
4
4
  import { USER_REACTION } from '../../common';
5
5
 
6
6
  export namespace SetReactionToVideoJobCommand {
7
- export const RequestSchema = z.object({
8
- userId: z.string().uuid().nullable().optional(),
9
- unregisteredUserId: z.string().uuid().nullable().optional(),
10
- uuid: z.string(),
11
- reaction: z.nativeEnum(USER_REACTION).nullable(),
12
- });
7
+ export const RequestSchema = z
8
+ .object({
9
+ userId: z.string().uuid().nullable().optional(),
10
+ unregisteredUserId: z.string().uuid().nullable().optional(),
11
+ uuid: z.string().uuid(),
12
+ reaction: z.nativeEnum(USER_REACTION).nullable(),
13
+ dislikeReason: z.string().nullable().default(null),
14
+ })
15
+ .refine(
16
+ (data) => {
17
+ if (data.reaction !== USER_REACTION.DISLIKED && data.dislikeReason) {
18
+ return false;
19
+ }
20
+ return true;
21
+ },
22
+ {
23
+ message: 'Dislike reason is not allowed when reaction is not disliked',
24
+ },
25
+ );
13
26
  export type Request = z.infer<typeof RequestSchema>;
14
27
 
15
28
  export const ResponseSchema = ICommandResponseSchema(VideoJobSchema);
@@ -0,0 +1,13 @@
1
+ import { z } from 'zod';
2
+ import { VideoModelSchema } from '../../models';
3
+ import { ICommandResponseSchema } from '../../../common';
4
+
5
+ export namespace GetVideoModelByUuidCommand {
6
+ export const RequestSchema = z.object({
7
+ uuid: z.string().uuid(),
8
+ });
9
+ export type Request = z.infer<typeof RequestSchema>;
10
+
11
+ export const ResponseSchema = ICommandResponseSchema(VideoModelSchema);
12
+ export type Response = z.infer<typeof ResponseSchema>;
13
+ }
@@ -0,0 +1 @@
1
+ export * from './get-video-model-by-uuid.command';
@@ -4,8 +4,10 @@ import { USER_REACTION } from '../../common';
4
4
 
5
5
  export const VideoJobParamsSchema = z.object({
6
6
  imageUrls: z.string().array().optional(),
7
+ imageIds: z.array(z.string()).optional(),
7
8
  duration: z.number().optional(),
8
9
  aspectRatio: z.string().optional(),
10
+ resolution: z.string().optional(),
9
11
  });
10
12
 
11
13
  export type VideoJobParams = z.infer<typeof VideoJobParamsSchema>;
@@ -14,6 +16,7 @@ export const VideoJobSchema = z.object({
14
16
  uuid: z.string(),
15
17
  prompt: z.string(),
16
18
  reaction: z.nativeEnum(USER_REACTION).nullable(),
19
+ dislikeReason: z.string().nullable(),
17
20
  externalId: z.string().nullable(),
18
21
  title: z.string(),
19
22
  status: z.nativeEnum(JOB_STATUS),
@@ -31,6 +31,7 @@ export type VideoModelParams = z.infer<typeof VideoModelParamsSchema>;
31
31
 
32
32
  export const VideoGenerationRequestParamsSchema = z.object({
33
33
  imageUrls: z.string().array().optional(),
34
+ imageIds: z.array(z.string()).optional(),
34
35
  duration: z.number(),
35
36
  aspectRatio: z.string().optional(),
36
37
  quality: z.string().optional(),
@@ -1,2 +1,3 @@
1
1
  export * from './video.amqp.routes';
2
2
  export * from './video.http.routes';
3
+ export * from './video-model.amqp.routes';
@@ -0,0 +1,3 @@
1
+ export const VIDEO_MODEL_AMQP_ROUTES = {
2
+ GET_MODEL_BY_UUID: 'tools.video.model.get-by-uuid.rpc',
3
+ } as const;
@@ -7,10 +7,11 @@ export namespace EditVideoCommand {
7
7
  userId: z.string().uuid().nullable().optional(),
8
8
  unregisteredUserId: z.string().uuid().nullable().optional(),
9
9
  prompt: z.string(),
10
+ inputVideoId: z.string().uuid(),
10
11
  inputVideoUrl: z.string(),
11
12
  duration: z.number(),
12
13
  userBalance: z.number(),
13
- modelId: z.string(),
14
+ modelId: z.string().uuid(),
14
15
  });
15
16
  export type Request = z.infer<typeof RequestSchema>;
16
17
 
@@ -4,3 +4,4 @@ export * from './retry-video-editor-job.command';
4
4
  export * from './set-reaction-to-video-editor-job.command';
5
5
  export * from './update-video-editor-job-title.command';
6
6
  export * from './edit-video.command';
7
+ export * from './video-editor-model';
@@ -8,6 +8,11 @@ export namespace RetryVideoEditorJobCommand {
8
8
  userBalance: z.number(),
9
9
  userId: z.string().uuid().nullable().optional(),
10
10
  unregisteredUserId: z.string().uuid().nullable().optional(),
11
+ prompt: z.string().optional(),
12
+ inputVideoId: z.string().uuid().optional(),
13
+ inputVideoUrl: z.string().optional(),
14
+ duration: z.number().optional(),
15
+ modelId: z.string().uuid().optional(),
11
16
  });
12
17
  export type Request = z.infer<typeof RequestSchema>;
13
18
 
@@ -4,12 +4,25 @@ import { VideoEditorJobSchema } from '../models/video-editor-job.schema';
4
4
  import { USER_REACTION } from '../../common';
5
5
 
6
6
  export namespace SetReactionToVideoEditorJobCommand {
7
- export const RequestSchema = z.object({
8
- userId: z.string().uuid().nullable().optional(),
9
- unregisteredUserId: z.string().uuid().nullable().optional(),
10
- uuid: z.string(),
11
- reaction: z.nativeEnum(USER_REACTION).nullable(),
12
- });
7
+ export const RequestSchema = z
8
+ .object({
9
+ userId: z.string().uuid().nullable().optional(),
10
+ unregisteredUserId: z.string().uuid().nullable().optional(),
11
+ uuid: z.string().uuid(),
12
+ reaction: z.nativeEnum(USER_REACTION).nullable(),
13
+ dislikeReason: z.string().nullable().default(null),
14
+ })
15
+ .refine(
16
+ (data) => {
17
+ if (data.reaction !== USER_REACTION.DISLIKED && data.dislikeReason) {
18
+ return false;
19
+ }
20
+ return true;
21
+ },
22
+ {
23
+ message: 'Dislike reason is not allowed when reaction is not disliked',
24
+ },
25
+ );
13
26
  export type Request = z.infer<typeof RequestSchema>;
14
27
 
15
28
  export const ResponseSchema = ICommandResponseSchema(VideoEditorJobSchema);
@@ -0,0 +1,13 @@
1
+ import { z } from 'zod';
2
+ import { ICommandResponseSchema } from '../../../common';
3
+ import { VideoEditorModelSchema } from '../../models';
4
+
5
+ export namespace GetVideoEditorModelByUuidCommand {
6
+ export const RequestSchema = z.object({
7
+ uuid: z.string().uuid(),
8
+ });
9
+ export type Request = z.infer<typeof RequestSchema>;
10
+
11
+ export const ResponseSchema = ICommandResponseSchema(VideoEditorModelSchema);
12
+ export type Response = z.infer<typeof ResponseSchema>;
13
+ }
@@ -0,0 +1 @@
1
+ export * from './get-video-editor-model.command';
@@ -10,10 +10,13 @@ export const VideoEditorJobSchema = z.object({
10
10
  error: z.string().nullable(),
11
11
  price: z.number(),
12
12
  reaction: z.nativeEnum(USER_REACTION).nullable(),
13
+ dislikeReason: z.string().nullable(),
13
14
  externalId: z.string().nullable(),
14
15
  modelId: z.string(),
15
16
  inputVideoUrl: z.string(),
17
+ inputVideoId: z.string().nullable(),
16
18
  outputVideoUrl: z.string().nullable(),
19
+ outputVideoId: z.string().nullable(),
17
20
  duration: z.number(),
18
21
  attempts: z.array(z.any()),
19
22
  userId: z.string().nullable().optional(),
@@ -1,2 +1,3 @@
1
1
  export * from './video-editor.amqp.routes';
2
2
  export * from './video-editor.http.routes';
3
+ export * from './video-editor-model.amqp.routes';
@@ -0,0 +1,3 @@
1
+ export const VIDEO_EDITOR_MODEL_AMQP_ROUTES = {
2
+ GET_MODEL_BY_UUID: 'tools.video-editor.model.get-by-uuid.rpc',
3
+ } as const;
@@ -3,12 +3,25 @@ import { ICommandResponseSchema, USER_REACTION } from '../../common';
3
3
  import { WriterDocumentSchema } from '../models';
4
4
 
5
5
  export namespace SetReactionToWriterDocumentCommand {
6
- export const RequestSchema = z.object({
7
- userId: z.string().uuid().nullable().optional(),
8
- unregisteredUserId: z.string().uuid().nullable().optional(),
9
- documentId: z.string().uuid(),
10
- reaction: z.nativeEnum(USER_REACTION),
11
- });
6
+ export const RequestSchema = z
7
+ .object({
8
+ userId: z.string().uuid().nullable().optional(),
9
+ unregisteredUserId: z.string().uuid().nullable().optional(),
10
+ documentId: z.string().uuid(),
11
+ reaction: z.nativeEnum(USER_REACTION),
12
+ dislikeReason: z.string().nullable().default(null),
13
+ })
14
+ .refine(
15
+ (data) => {
16
+ if (data.reaction !== USER_REACTION.DISLIKED && data.dislikeReason) {
17
+ return false;
18
+ }
19
+ return true;
20
+ },
21
+ {
22
+ message: 'Dislike reason is not allowed when reaction is not disliked',
23
+ },
24
+ );
12
25
  export type Request = z.infer<typeof RequestSchema>;
13
26
 
14
27
  export const ResponseSchema = ICommandResponseSchema(WriterDocumentSchema);
@@ -16,6 +16,7 @@ export const WriterDocumentSchema = z.object({
16
16
  unregisteredUserId: z.string().nullable(),
17
17
  modelId: z.string().nullable(),
18
18
  reaction: z.nativeEnum(USER_REACTION).nullable(),
19
+ dislikeReason: z.string().nullable(),
19
20
  pages: z.number(),
20
21
  isDeleted: z.boolean(),
21
22
  createdAt: z.date(),