1
4
5import { z } from "zod";
6
7export const chatRoleSchema = z.enum(["system", "user", "assistant", "tool"]);
8export type ChatRole = z.infer<typeof chatRoleSchema>;
9
10
11export const chatToolCallSchema = z
12 .object({
13 id: z.string().min(1),
14 name: z.string().min(1),
15 arguments: z.record(z.unknown()),
16 })
17 .strict();
18export type ChatToolCall = z.infer<typeof chatToolCallSchema>;
19
20export const chatMessageSchema = z
21 .object({
22 role: chatRoleSchema,
23 content: z.string(),
24 toolCalls: z.array(chatToolCallSchema).optional(),
25
26 toolResults: z
27 .array(
28 z
29 .object({
30 toolCallId: z.string().min(1),
31 content: z.string(),
32 })
33 .strict(),
34 )
35 .optional(),
36 })
37 .strict();
38export type ChatMessage = z.infer<typeof chatMessageSchema>;
39
40export const chatContextSchema = z
41 .object({
42
43 pageIds: z.array(z.string().min(1)).max(10).optional(),
44 databaseIds: z.array(z.string().min(1)).max(10).optional(),
45
46 chunks: z
47 .array(
48 z
49 .object({
50 id: z.string().min(1),
51 title: z.string().max(200).default(""),
52 text: z.string().min(1),
53 })
54 .strict(),
55 )
56 .max(25)
57 .optional(),
58 })
59 .strict();
60export type ChatContext = z.infer<typeof chatContextSchema>;
61
62export const chatRequestSchema = z
63 .object({
64 messages: z.array(chatMessageSchema).min(1, "At least one message is required").max(200),
65 context: chatContextSchema.optional(),
66
67 model: z.string().min(1).max(128).optional(),
68 temperature: z.number().min(0).max(2).optional(),
69 maxTokens: z.number().int().min(1).max(32_000).optional(),
70 stream: z.boolean().default(false),
71 })
72 .strict();
73export type ChatRequest = z.infer<typeof chatRequestSchema>;
74