返回 AiToEarn
chat.dto.ts
根目录 / project / aitoearn-backend / apps / aitoearn-ai / src / core / ai / chat / chat.dto.ts
1 import { createZodDto, UserType } from '@yikart/common'
2 import { z } from 'zod'
3
4 export {
5 ChatCompletionDto,
6 chatCompletionDtoSchema,
7 ChatMessageDto,
8 chatMessageSchema,
9 ChatModelsQueryDto,
10 messageContentComplexSchema,
11 messageContentImageUrlSchema,
12 messageContentTextSchema,
13 UserChatCompletionDto,
14 } from '@yikart/aitoearn-ai-shared'
15
16 // Claude 透传 DTO - 仅校验必要字段,其余透传
17 export const claudeChatProxyDtoSchema = z.looseObject({
18 messages: z.array(z.looseObject({
19 role: z.enum(['user', 'assistant']),
20 content: z.any(),
21 })).min(1),
22 model: z.string(),
23 max_tokens: z.number().int().min(1).default(32000),
24 })
25
26 export class ClaudeChatProxyDto extends createZodDto(claudeChatProxyDtoSchema, 'ClaudeChatProxyDto') {}
27
28 const userClaudeChatProxyDtoSchema = z.object({
29 userId: z.string(),
30 userType: z.enum(UserType),
31 }).extend(claudeChatProxyDtoSchema.shape)
32
33 export class UserClaudeChatProxyDto extends createZodDto(userClaudeChatProxyDtoSchema, 'UserClaudeChatProxyDto') {}
34
35 export const chatStreamProxyDtoSchema = z.looseObject({
36 messages: z.array(z.looseObject({
37 role: z.string(),
38 content: z.any(),
39 })).min(1),
40 model: z.string(),
41 })
42
43 export class ChatStreamProxyDto extends createZodDto(chatStreamProxyDtoSchema, 'ChatStreamProxyDto') {}
44
45 // Gemini generateContent DTO
46 export const geminiContentPartSchema = z.union([
47 z.object({ text: z.string() }),
48 z.object({
49 inlineData: z.object({
50 mimeType: z.string(),
51 data: z.string(),
52 }),
53 }),
54 z.object({
55 fileData: z.object({
56 mimeType: z.string().optional(),
57 fileUri: z.string(),
58 }),
59 }),
60 ])
61
62 export const geminiContentSchema = z.object({
63 role: z.enum(['user', 'model']).optional(),
64 parts: z.array(geminiContentPartSchema),
65 })
66
67 export const geminiGenerateContentDtoSchema = z.object({
68 model: z.string().describe('Gemini 模型名称'),
69 contents: z.array(geminiContentSchema).describe('内容列表'),
70 config: z.looseObject({
71 temperature: z.number().optional(),
72 topP: z.number().optional(),
73 topK: z.number().optional(),
74 candidateCount: z.number().optional(),
75 maxOutputTokens: z.number().optional(),
76 responseLogprobs: z.boolean().optional(),
77 logprobs: z.number().optional(),
78 presencePenalty: z.number().optional(),
79 frequencyPenalty: z.number().optional(),
80 seed: z.number().optional(),
81 responseMimeType: z.string().optional(),
82 responseJsonSchema: z.any().optional(),
83 }).optional().describe('生成配置'),
84 })
85
86 export class GeminiGenerateContentDto extends createZodDto(geminiGenerateContentDtoSchema) {}
87
88 const userGeminiGenerateContentDtoSchema = z.object({
89 userId: z.string(),
90 userType: z.enum(UserType),
91 }).extend(geminiGenerateContentDtoSchema.shape)
92
93 export class UserGeminiGenerateContentDto extends createZodDto(userGeminiGenerateContentDtoSchema) {}
94
94 lines TYPESCRIPT