1
import { z } from 'zod';
3
import { SessionModel } from '@/database/server/models/session';
4
import { SessionGroupModel } from '@/database/server/models/sessionGroup';
5
import { insertAgentSchema, insertSessionSchema } from '@/database/server/schemas/lobechat';
6
import { authedProcedure, publicProcedure, router } from '@/libs/trpc';
7
import { AgentChatConfigSchema } from '@/types/agent';
8
import { LobeMetaDataSchema } from '@/types/meta';
9
import { BatchTaskResult } from '@/types/service';
10
import { ChatSessionList } from '@/types/session';
11
import { merge } from '@/utils/merge';
13
const sessionProcedure = authedProcedure.use(async (opts) => {
18
sessionGroupModel: new SessionGroupModel(ctx.userId),
19
sessionModel: new SessionModel(ctx.userId),
24
export const sessionRouter = router({
25
batchCreateSessions: sessionProcedure
30
config: z.object({}).passthrough(),
31
group: z.string().optional(),
33
meta: LobeMetaDataSchema,
34
pinned: z.boolean().optional(),
40
.mutation(async ({ input, ctx }): Promise<BatchTaskResult> => {
41
const data = await ctx.sessionModel.batchCreate(
42
input.map((item) => ({
48
return { added: data.rowCount as number, ids: [], skips: [], success: true };
51
cloneSession: sessionProcedure
52
.input(z.object({ id: z.string(), newTitle: z.string() }))
53
.mutation(async ({ input, ctx }) => {
54
const data = await ctx.sessionModel.duplicate(input.id, input.newTitle);
59
countSessions: sessionProcedure.query(async ({ ctx }) => {
60
return ctx.sessionModel.count();
63
createSession: sessionProcedure
66
config: insertAgentSchema
67
.omit({ chatConfig: true, plugins: true, tags: true, tts: true })
70
session: insertSessionSchema.omit({ createdAt: true, updatedAt: true }).partial(),
71
type: z.enum(['agent', 'group']),
74
.mutation(async ({ input, ctx }) => {
75
const data = await ctx.sessionModel.create(input);
80
getGroupedSessions: publicProcedure.query(async ({ ctx }): Promise<ChatSessionList> => {
87
const sessionModel = new SessionModel(ctx.userId);
89
return sessionModel.queryWithGroups();
92
getSessions: sessionProcedure
95
current: z.number().optional(),
96
pageSize: z.number().optional(),
99
.query(async ({ input, ctx }) => {
100
const { current, pageSize } = input;
102
return ctx.sessionModel.query({ current, pageSize });
105
removeAllSessions: sessionProcedure.mutation(async ({ ctx }) => {
106
return ctx.sessionModel.deleteAll();
109
removeSession: sessionProcedure
110
.input(z.object({ id: z.string() }))
111
.mutation(async ({ input, ctx }) => {
112
return ctx.sessionModel.delete(input.id);
115
searchSessions: sessionProcedure
116
.input(z.object({ keywords: z.string() }))
117
.query(async ({ input, ctx }) => {
118
return ctx.sessionModel.queryByKeyword(input.keywords);
121
updateSession: sessionProcedure
125
value: insertSessionSchema.partial(),
128
.mutation(async ({ input, ctx }) => {
129
return ctx.sessionModel.update(input.id, input.value);
131
updateSessionChatConfig: sessionProcedure
135
value: AgentChatConfigSchema.partial(),
138
.mutation(async ({ input, ctx }) => {
139
const session = await ctx.sessionModel.findByIdOrSlug(input.id);
141
if (!session) return;
143
return ctx.sessionModel.updateConfig(session.agent.id, {
144
chatConfig: merge(session.agent.chatConfig, input.value),
147
updateSessionConfig: sessionProcedure
151
value: z.object({}).passthrough().partial(),
154
.mutation(async ({ input, ctx }) => {
155
const session = await ctx.sessionModel.findByIdOrSlug(input.id);
157
if (!session || !input.value) return;
159
if (!session.agent) {
161
'this session is not assign with agent, please contact with admin to fix this issue.',
165
return ctx.sessionModel.updateConfig(session.agent.id, input.value);
169
export type SessionRouter = typeof sessionRouter;