@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.
109 lines (90 loc) • 2.9 kB
text/typescript
import { TRPCError } from '@trpc/server';
import { z } from 'zod';
import { DEFAULT_LANG } from '@/const/locale';
import { publicProcedure, router } from '@/libs/trpc/edge';
import { Locales } from '@/locales/resources';
import { AssistantStore } from '@/server/modules/AssistantStore';
import { PluginStore } from '@/server/modules/PluginStore';
import { AgentStoreIndex } from '@/types/discover';
export const marketRouter = router({
getAgent: publicProcedure
.input(
z.object({
id: z.string(),
locale: z.string().optional(),
}),
)
.query(async ({ input }) => {
const { id, locale } = input;
const market = new AssistantStore();
// 获取助手 URL
const url = market.getAgentUrl(id, locale as Locales);
// 获取助手数据
let res = await fetch(url);
// 如果找不到对应语言的助手,尝试获取默认语言的助手
if (res.status === 404) {
res = await fetch(market.getAgentUrl(id, DEFAULT_LANG));
}
if (!res.ok) {
throw new Error(`Failed to fetch agent with id ${id}`);
}
return res.json();
}),
getAgentIndex: publicProcedure
.input(
z
.object({
locale: z.string().optional(),
})
.optional(),
)
.query(async ({ input }): Promise<AgentStoreIndex> => {
const locale = input?.locale;
const market = new AssistantStore();
try {
return await market.getAgentIndex(locale as Locales);
} catch (e) {
// it means failed to fetch
if ((e as Error).message.includes('fetch failed')) {
return { agents: [], schemaVersion: 1 };
}
throw new TRPCError({
code: 'INTERNAL_SERVER_ERROR',
message: 'failed to fetch agent market index',
});
}
}),
getPluginIndex: publicProcedure
.input(
z
.object({
locale: z.string().optional(),
})
.optional(),
)
.query(async ({ input }) => {
const locale = input?.locale;
const pluginStore = new PluginStore();
try {
// 获取插件索引URL
let res = await fetch(pluginStore.getPluginIndexUrl(locale as Locales));
// 如果找不到对应语言的插件索引,尝试获取默认语言的插件索引
if (res.status === 404) {
res = await fetch(pluginStore.getPluginIndexUrl(DEFAULT_LANG));
}
if (res.ok) {
return res.json();
}
throw new Error('Failed to fetch plugin index');
} catch (e) {
// it means failed to fetch
if ((e as Error).message.includes('fetch failed')) {
return [];
}
throw new TRPCError({
code: 'INTERNAL_SERVER_ERROR',
message: 'failed to fetch plugin market index',
});
}
}),
});