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.

87 lines (67 loc) 2.64 kB
import urlJoin from 'url-join'; import { DEFAULT_LANG, isLocaleNotSupport } from '@/const/locale'; import { appEnv } from '@/envs/app'; import { Locales, normalizeLocale } from '@/locales/resources'; import { EdgeConfig } from '@/server/modules/EdgeConfig'; import { AgentStoreIndex } from '@/types/discover'; import { RevalidateTag } from '@/types/requestCache'; export class AssistantStore { private readonly baseUrl: string; constructor(baseUrl?: string) { this.baseUrl = baseUrl || appEnv.AGENTS_INDEX_URL; } private getAgentIndexUrl = (lang: Locales = DEFAULT_LANG) => { if (isLocaleNotSupport(lang)) return this.baseUrl; return urlJoin(this.baseUrl, `index.${normalizeLocale(lang)}.json`); }; getAgentUrl = (identifier: string, lang: Locales = DEFAULT_LANG) => { if (isLocaleNotSupport(lang)) return urlJoin(this.baseUrl, `${identifier}.json`); return urlJoin(this.baseUrl, `${identifier}.${normalizeLocale(lang)}.json`); }; getAgentIndex = async ( locale: Locales = DEFAULT_LANG, revalidate?: number, ): Promise<AgentStoreIndex> => { try { let res: Response; res = await fetch(this.getAgentIndexUrl(locale as any), { next: { revalidate, tags: [RevalidateTag.AgentIndex] }, }); if (res.status === 404) { res = await fetch(this.getAgentIndexUrl(DEFAULT_LANG), { next: { revalidate, tags: [RevalidateTag.AgentIndex] }, }); } if (!res.ok) { console.warn('fetch agent index error:', await res.text()); return { agents: [], schemaVersion: 1 }; } const data: AgentStoreIndex = await res.json(); if (EdgeConfig.isEnabled()) { // Get the assistant whitelist from Edge Config const edgeConfig = new EdgeConfig(); const { whitelist, blacklist } = await edgeConfig.getAgentRestrictions(); // use whitelist mode first if (whitelist && whitelist?.length > 0) { data.agents = data.agents.filter((item) => whitelist.includes(item.identifier)); } // if no whitelist, use blacklist mode else if (blacklist && blacklist?.length > 0) { data.agents = data.agents.filter((item) => !blacklist.includes(item.identifier)); } } return data; } catch (e) { // it means failed to fetch if ((e as Error).message.includes('fetch failed')) { return { agents: [], schemaVersion: 1, }; } console.error('[AgentIndexFetchError] failed to fetch agent index, error detail:'); console.error(e); throw e; } }; }