UNPKG

@lobehub/chat

Version:

Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.

121 lines (104 loc) 3.64 kB
import { z } from 'zod'; import { AiProviderModel } from '@/database/models/aiProvider'; import { UserModel } from '@/database/models/user'; import { AiInfraRepos } from '@/database/repositories/aiInfra'; import { authedProcedure, router } from '@/libs/trpc/lambda'; import { serverDatabase } from '@/libs/trpc/lambda/middleware'; import { getServerGlobalConfig } from '@/server/globalConfig'; import { KeyVaultsGateKeeper } from '@/server/modules/KeyVaultsEncrypt'; import { AiProviderDetailItem, AiProviderRuntimeState, CreateAiProviderSchema, UpdateAiProviderConfigSchema, UpdateAiProviderSchema, } from '@/types/aiProvider'; import { ProviderConfig } from '@/types/user/settings'; const aiProviderProcedure = authedProcedure.use(serverDatabase).use(async (opts) => { const { ctx } = opts; const { aiProvider } = await getServerGlobalConfig(); const gateKeeper = await KeyVaultsGateKeeper.initWithEnvKey(); return opts.next({ ctx: { aiInfraRepos: new AiInfraRepos( ctx.serverDB, ctx.userId, aiProvider as Record<string, ProviderConfig>, ), aiProviderModel: new AiProviderModel(ctx.serverDB, ctx.userId), gateKeeper, userModel: new UserModel(ctx.serverDB, ctx.userId), }, }); }); export const aiProviderRouter = router({ createAiProvider: aiProviderProcedure .input(CreateAiProviderSchema) .mutation(async ({ input, ctx }) => { const data = await ctx.aiProviderModel.create(input, ctx.gateKeeper.encrypt); return data?.id; }), getAiProviderById: aiProviderProcedure .input(z.object({ id: z.string() })) .query(async ({ input, ctx }): Promise<AiProviderDetailItem | undefined> => { return ctx.aiInfraRepos.getAiProviderDetail(input.id, KeyVaultsGateKeeper.getUserKeyVaults); }), getAiProviderList: aiProviderProcedure.query(async ({ ctx }) => { return await ctx.aiInfraRepos.getAiProviderList(); }), getAiProviderRuntimeState: aiProviderProcedure .input(z.object({ isLogin: z.boolean().optional() })) .query(async ({ ctx }): Promise<AiProviderRuntimeState> => { return ctx.aiInfraRepos.getAiProviderRuntimeState(KeyVaultsGateKeeper.getUserKeyVaults); }), removeAiProvider: aiProviderProcedure .input(z.object({ id: z.string() })) .mutation(async ({ input, ctx }) => { return ctx.aiProviderModel.delete(input.id); }), toggleProviderEnabled: aiProviderProcedure .input( z.object({ enabled: z.boolean(), id: z.string(), }), ) .mutation(async ({ input, ctx }) => { return ctx.aiProviderModel.toggleProviderEnabled(input.id, input.enabled); }), updateAiProvider: aiProviderProcedure .input( z.object({ id: z.string(), value: UpdateAiProviderSchema, }), ) .mutation(async ({ input, ctx }) => { return ctx.aiProviderModel.update(input.id, input.value); }), updateAiProviderConfig: aiProviderProcedure .input( z.object({ id: z.string(), value: UpdateAiProviderConfigSchema, }), ) .mutation(async ({ input, ctx }) => { return ctx.aiProviderModel.updateConfig(input.id, input.value, ctx.gateKeeper.encrypt); }), updateAiProviderOrder: aiProviderProcedure .input( z.object({ sortMap: z.array( z.object({ id: z.string(), sort: z.number(), }), ), }), ) .mutation(async ({ input, ctx }) => { return ctx.aiProviderModel.updateOrder(input.sortMap); }), }); export type AiProviderRouter = typeof aiProviderRouter;