1
import { z } from 'zod';
3
import { INBOX_SESSION_ID } from '@/const/session';
4
import { DEFAULT_AGENT_CONFIG } from '@/const/settings';
5
import { AgentModel } from '@/database/server/models/agent';
6
import { FileModel } from '@/database/server/models/file';
7
import { KnowledgeBaseModel } from '@/database/server/models/knowledgeBase';
8
import { SessionModel } from '@/database/server/models/session';
9
import { UserModel } from '@/database/server/models/user';
10
import { pino } from '@/libs/logger';
11
import { authedProcedure, router } from '@/libs/trpc';
12
import { KnowledgeItem, KnowledgeType } from '@/types/knowledgeBase';
14
const agentProcedure = authedProcedure.use(async (opts) => {
19
agentModel: new AgentModel(ctx.userId),
20
fileModel: new FileModel(ctx.userId),
21
knowledgeBaseModel: new KnowledgeBaseModel(ctx.userId),
22
sessionModel: new SessionModel(ctx.userId),
27
export const agentRouter = router({
28
createAgentFiles: agentProcedure
32
enabled: z.boolean().optional(),
33
fileIds: z.array(z.string()),
36
.mutation(async ({ input, ctx }) => {
37
return ctx.agentModel.createAgentFiles(input.agentId, input.fileIds, input.enabled);
40
createAgentKnowledgeBase: agentProcedure
44
enabled: z.boolean().optional(),
45
knowledgeBaseId: z.string(),
48
.mutation(async ({ input, ctx }) => {
49
return ctx.agentModel.createAgentKnowledgeBase(
51
input.knowledgeBaseId,
56
deleteAgentFile: agentProcedure
63
.mutation(async ({ input, ctx }) => {
64
return ctx.agentModel.deleteAgentFile(input.agentId, input.fileId);
67
deleteAgentKnowledgeBase: agentProcedure
71
knowledgeBaseId: z.string(),
74
.mutation(async ({ input, ctx }) => {
75
return ctx.agentModel.deleteAgentKnowledgeBase(input.agentId, input.knowledgeBaseId);
78
getAgentConfig: agentProcedure
81
sessionId: z.string(),
84
.query(async ({ input, ctx }) => {
85
if (input.sessionId === INBOX_SESSION_ID) {
86
const item = await ctx.sessionModel.findByIdOrSlug(INBOX_SESSION_ID);
90
const user = await UserModel.findById(ctx.userId);
91
if (!user) return DEFAULT_AGENT_CONFIG;
93
const res = await ctx.sessionModel.createInbox();
94
pino.info('create inbox session', res);
98
const session = await ctx.sessionModel.findByIdOrSlug(input.sessionId);
100
if (!session) throw new Error('Session not found');
101
const sessionId = session.id;
103
return await ctx.agentModel.findBySessionId(sessionId);
106
getKnowledgeBasesAndFiles: agentProcedure
112
.query(async ({ ctx, input }): Promise<KnowledgeItem[]> => {
113
const knowledgeBases = await ctx.knowledgeBaseModel.query();
115
const files = await ctx.fileModel.query({
116
showFilesInKnowledgeBase: false,
119
const knowledge = await ctx.agentModel.getAgentAssignedKnowledge(input.agentId);
122
...files.map((file) => ({
123
enabled: knowledge.files.some((item) => item.id === file.id),
124
fileType: file.fileType,
127
type: KnowledgeType.File,
129
...knowledgeBases.map((knowledgeBase) => ({
130
avatar: knowledgeBase.avatar,
131
description: knowledgeBase.description,
132
enabled: knowledge.knowledgeBases.some((item) => item.id === knowledgeBase.id),
133
id: knowledgeBase.id,
134
name: knowledgeBase.name,
135
type: KnowledgeType.KnowledgeBase,
140
toggleFile: agentProcedure
144
enabled: z.boolean().optional(),
148
.mutation(async ({ input, ctx }) => {
149
return ctx.agentModel.toggleFile(input.agentId, input.fileId, input.enabled);
152
toggleKnowledgeBase: agentProcedure
156
enabled: z.boolean().optional(),
157
knowledgeBaseId: z.string(),
160
.mutation(async ({ input, ctx }) => {
161
return ctx.agentModel.toggleKnowledgeBase(
163
input.knowledgeBaseId,