@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 (97 loc) • 3.97 kB
text/typescript
import { LobeChatPluginManifest } from '@lobehub/chat-plugin-sdk';
import { pluginPrompts } from '@/prompts/plugin';
import { MetaData } from '@/types/meta';
import { ChatCompletionTool } from '@/types/openai/chat';
import { LobeToolMeta } from '@/types/tool/tool';
import { globalAgentContextManager } from '@/utils/client/GlobalAgentContextManager';
import { hydrationPrompt } from '@/utils/promptTemplate';
import { genToolCallingName } from '@/utils/toolCall';
import { convertPluginManifestToToolsCalling } from '@/utils/toolManifest';
import { pluginHelpers } from '../helpers';
import { ToolStoreState } from '../initialState';
import { builtinToolSelectors } from '../slices/builtin/selectors';
import { pluginSelectors } from '../slices/plugin/selectors';
const enabledSchema =
(tools: string[] = []) =>
(s: ToolStoreState): ChatCompletionTool[] => {
const manifests = pluginSelectors
.installedPluginManifestList(s)
.concat(s.builtinTools.map((b) => b.manifest as LobeChatPluginManifest))
// 如果存在 enabledPlugins,那么只启用 enabledPlugins 中的插件
.filter((m) => tools.includes(m?.identifier));
return convertPluginManifestToToolsCalling(manifests);
};
const enabledSystemRoles =
(tools: string[] = []) =>
(s: ToolStoreState) => {
const toolsSystemRole = pluginSelectors
.installedPluginManifestList(s)
.concat(s.builtinTools.map((b) => b.manifest as LobeChatPluginManifest))
// 如果存在 enabledPlugins,那么只启用 enabledPlugins 中的插件
.filter((m) => m && tools.includes(m.identifier))
.map((manifest) => {
const meta = manifest.meta || {};
const title = pluginHelpers.getPluginTitle(meta) || manifest.identifier;
let systemRole = manifest.systemRole || pluginHelpers.getPluginDesc(meta);
// Use the global context manager to fill the template
if (systemRole) {
const context = globalAgentContextManager.getContext();
systemRole = hydrationPrompt(systemRole, context);
}
return {
apis: manifest.api.map((m) => ({
desc: m.description,
name: genToolCallingName(manifest.identifier, m.name, manifest.type),
})),
identifier: manifest.identifier,
name: title,
systemRole,
};
});
if (toolsSystemRole.length > 0) {
return pluginPrompts({ tools: toolsSystemRole });
}
return '';
};
const metaList =
(showDalle?: boolean) =>
(s: ToolStoreState): LobeToolMeta[] => {
const pluginList = pluginSelectors.installedPluginMetaList(s) as LobeToolMeta[];
return builtinToolSelectors.metaList(showDalle)(s).concat(pluginList);
};
const getMetaById =
(id: string, showDalle: boolean = true) =>
(s: ToolStoreState): MetaData | undefined =>
metaList(showDalle)(s).find((m) => m.identifier === id)?.meta;
const getManifestById =
(id: string) =>
(s: ToolStoreState): LobeChatPluginManifest | undefined =>
pluginSelectors
.installedPluginManifestList(s)
.concat(s.builtinTools.map((b) => b.manifest as LobeChatPluginManifest))
.find((i) => i.identifier === id);
// 获取插件 manifest 加载状态
const getManifestLoadingStatus = (id: string) => (s: ToolStoreState) => {
const manifest = getManifestById(id)(s);
if (s.pluginInstallLoading[id]) return 'loading';
if (!manifest) return 'error';
if (!!manifest) return 'success';
};
const isToolHasUI = (id: string) => (s: ToolStoreState) => {
const manifest = getManifestById(id)(s);
if (!manifest) return false;
const builtinTool = s.builtinTools.find((tool) => tool.identifier === id);
if (builtinTool && builtinTool.type === 'builtin') {
return true;
}
return !!manifest.ui;
};
export const toolSelectors = {
enabledSchema,
enabledSystemRoles,
getManifestById,
getManifestLoadingStatus,
getMetaById,
isToolHasUI,
metaList,
};