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.

134 lines (117 loc) 4.02 kB
import { z } from 'zod'; import { AiModelModel } from '@/database/models/aiModel'; 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 { AiProviderModelListItem, CreateAiModelSchema, ToggleAiModelEnableSchema, UpdateAiModelSchema, } from '@/types/aiModel'; import { ProviderConfig } from '@/types/user/settings'; const aiModelProcedure = authedProcedure.use(serverDatabase).use(async (opts) => { const { ctx } = opts; const gateKeeper = await KeyVaultsGateKeeper.initWithEnvKey(); const { aiProvider } = await getServerGlobalConfig(); return opts.next({ ctx: { aiInfraRepos: new AiInfraRepos( ctx.serverDB, ctx.userId, aiProvider as Record<string, ProviderConfig>, ), aiModelModel: new AiModelModel(ctx.serverDB, ctx.userId), gateKeeper, userModel: new UserModel(ctx.serverDB, ctx.userId), }, }); }); export const aiModelRouter = router({ batchToggleAiModels: aiModelProcedure .input( z.object({ enabled: z.boolean(), id: z.string(), models: z.array(z.string()), }), ) .mutation(async ({ input, ctx }) => { return ctx.aiModelModel.batchToggleAiModels(input.id, input.models, input.enabled); }), batchUpdateAiModels: aiModelProcedure .input( z.object({ id: z.string(), // TODO: 补齐校验 Schema models: z.array(z.any()), }), ) .mutation(async ({ input, ctx }) => { return ctx.aiModelModel.batchUpdateAiModels(input.id, input.models); }), clearModelsByProvider: aiModelProcedure .input(z.object({ providerId: z.string() })) .mutation(async ({ input, ctx }) => { return ctx.aiModelModel.clearModelsByProvider(input.providerId); }), clearRemoteModels: aiModelProcedure .input(z.object({ providerId: z.string() })) .mutation(async ({ input, ctx }) => { return ctx.aiModelModel.clearRemoteModels(input.providerId); }), createAiModel: aiModelProcedure.input(CreateAiModelSchema).mutation(async ({ input, ctx }) => { const data = await ctx.aiModelModel.create(input); return data?.id; }), getAiModelById: aiModelProcedure .input(z.object({ id: z.string() })) .query(async ({ input, ctx }) => { return ctx.aiModelModel.findById(input.id); }), getAiProviderModelList: aiModelProcedure .input(z.object({ id: z.string() })) .query(async ({ ctx, input }): Promise<AiProviderModelListItem[]> => { return ctx.aiInfraRepos.getAiProviderModelList(input.id); }), removeAiModel: aiModelProcedure .input(z.object({ id: z.string(), providerId: z.string() })) .mutation(async ({ input, ctx }) => { return ctx.aiModelModel.delete(input.id, input.providerId); }), toggleModelEnabled: aiModelProcedure .input(ToggleAiModelEnableSchema) .mutation(async ({ input, ctx }) => { return ctx.aiModelModel.toggleModelEnabled(input); }), updateAiModel: aiModelProcedure .input( z.object({ id: z.string(), providerId: z.string(), value: UpdateAiModelSchema, }), ) .mutation(async ({ input, ctx }) => { return ctx.aiModelModel.update(input.id, input.providerId, input.value); }), updateAiModelOrder: aiModelProcedure .input( z.object({ providerId: z.string(), sortMap: z.array( z.object({ id: z.string(), sort: z.number(), }), ), }), ) .mutation(async ({ input, ctx }) => { return ctx.aiModelModel.updateModelsOrder(input.providerId, input.sortMap); }), }); export type AiModelRouter = typeof aiModelRouter;