bc1ece3dad
- 新增 ToolRegistry 工具注册表,支持核心工具和延迟加载工具分离 - 新增 tool_search 元工具,支持关键词搜索发现可用工具 - 新增基于关键词的搜索算法,按相关度评分排序 - 为所有工具添加 metadata(分类、关键词、延迟加载标识) - 修改 Agent 支持动态工具注入,tool_search 结果自动添加到可用工具 - 核心工具(tool_search, bash)始终加载,其他工具按需发现
121 lines
2.6 KiB
TypeScript
121 lines
2.6 KiB
TypeScript
import type { Tool } from '../types/index.js';
|
|
import type { ToolMetadata, ToolWithMetadata, ToolSearchResult } from './types.js';
|
|
import { searchTools } from './search.js';
|
|
|
|
/**
|
|
* 工具注册中心
|
|
* 管理所有工具的注册、查询和搜索
|
|
*/
|
|
class ToolRegistry {
|
|
private tools: Map<string, ToolWithMetadata> = new Map();
|
|
|
|
/**
|
|
* 注册单个工具
|
|
*/
|
|
register(tool: ToolWithMetadata): void {
|
|
this.tools.set(tool.name, tool);
|
|
}
|
|
|
|
/**
|
|
* 批量注册工具
|
|
*/
|
|
registerAll(tools: ToolWithMetadata[]): void {
|
|
for (const tool of tools) {
|
|
this.register(tool);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取核心工具 (deferLoading: false)
|
|
* 这些工具在会话开始时就可用
|
|
*/
|
|
getCoreTools(): Tool[] {
|
|
const coreTools: Tool[] = [];
|
|
for (const tool of this.tools.values()) {
|
|
if (!tool.metadata.deferLoading) {
|
|
coreTools.push(this.toBasicTool(tool));
|
|
}
|
|
}
|
|
return coreTools;
|
|
}
|
|
|
|
/**
|
|
* 获取指定工具
|
|
*/
|
|
getTool(name: string): Tool | undefined {
|
|
const tool = this.tools.get(name);
|
|
return tool ? this.toBasicTool(tool) : undefined;
|
|
}
|
|
|
|
/**
|
|
* 获取多个工具
|
|
*/
|
|
getTools(names: string[]): Tool[] {
|
|
const result: Tool[] = [];
|
|
for (const name of names) {
|
|
const tool = this.getTool(name);
|
|
if (tool) {
|
|
result.push(tool);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* 搜索工具
|
|
* @param query 搜索查询
|
|
* @param limit 返回结果数量限制
|
|
* @returns 匹配的工具元数据列表
|
|
*/
|
|
search(query: string, limit: number = 5): ToolSearchResult[] {
|
|
const allMetadata = this.getAllMetadata();
|
|
return searchTools(query, allMetadata, limit);
|
|
}
|
|
|
|
/**
|
|
* 获取所有工具的元数据
|
|
*/
|
|
getAllMetadata(): ToolMetadata[] {
|
|
return [...this.tools.values()].map((tool) => tool.metadata);
|
|
}
|
|
|
|
/**
|
|
* 获取所有工具 (用于兼容旧代码)
|
|
*/
|
|
getAllTools(): Tool[] {
|
|
return [...this.tools.values()].map((tool) => this.toBasicTool(tool));
|
|
}
|
|
|
|
/**
|
|
* 检查工具是否存在
|
|
*/
|
|
has(name: string): boolean {
|
|
return this.tools.has(name);
|
|
}
|
|
|
|
/**
|
|
* 获取工具数量
|
|
*/
|
|
get size(): number {
|
|
return this.tools.size;
|
|
}
|
|
|
|
/**
|
|
* 将 ToolWithMetadata 转换为基础 Tool 类型
|
|
*/
|
|
private toBasicTool(tool: ToolWithMetadata): Tool {
|
|
return {
|
|
name: tool.name,
|
|
description: tool.description,
|
|
parameters: tool.parameters,
|
|
execute: tool.execute,
|
|
};
|
|
}
|
|
}
|
|
|
|
// 导出单例
|
|
export const toolRegistry = new ToolRegistry();
|
|
|
|
// 也导出类,方便测试
|
|
export { ToolRegistry };
|