feat: 实现 Tool Search Tool 动态工具发现机制

- 新增 ToolRegistry 工具注册表,支持核心工具和延迟加载工具分离
- 新增 tool_search 元工具,支持关键词搜索发现可用工具
- 新增基于关键词的搜索算法,按相关度评分排序
- 为所有工具添加 metadata(分类、关键词、延迟加载标识)
- 修改 Agent 支持动态工具注入,tool_search 结果自动添加到可用工具
- 核心工具(tool_search, bash)始终加载,其他工具按需发现
This commit is contained in:
2025-12-10 19:51:25 +08:00
parent e435b2f8f8
commit bc1ece3dad
19 changed files with 569 additions and 66 deletions
+120
View File
@@ -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 };