feat: 实现 Tool Search Tool 动态工具发现机制
- 新增 ToolRegistry 工具注册表,支持核心工具和延迟加载工具分离 - 新增 tool_search 元工具,支持关键词搜索发现可用工具 - 新增基于关键词的搜索算法,按相关度评分排序 - 为所有工具添加 metadata(分类、关键词、延迟加载标识) - 修改 Agent 支持动态工具注入,tool_search 结果自动添加到可用工具 - 核心工具(tool_search, bash)始终加载,其他工具按需发现
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
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 };
|
||||
Reference in New Issue
Block a user