feat: Agent 模式切换时应用工具过滤

- 在 getAvailableTools() 中根据 AgentToolConfig 过滤工具
- 支持 enabled 白名单、disabled 黑名单、noTask 配置
- 切换回 default 时恢复原始 systemPrompt
- /agent 命令显示当前可用工具数量
This commit is contained in:
2025-12-11 13:23:45 +08:00
parent bfe3bc63b3
commit f4df6483a6
2 changed files with 58 additions and 6 deletions
+52 -4
View File
@@ -57,8 +57,12 @@ export class Agent {
// 当前 Agent 模式(null 表示默认模式) // 当前 Agent 模式(null 表示默认模式)
private currentAgentMode: AgentInfo | null = null; private currentAgentMode: AgentInfo | null = null;
// 原始 system prompt(用于切换回 default 时恢复)
private originalSystemPrompt: string;
constructor(config: AgentConfig, compressionConfig?: Partial<CompressionConfig>) { constructor(config: AgentConfig, compressionConfig?: Partial<CompressionConfig>) {
this.config = config; this.config = config;
this.originalSystemPrompt = config.systemPrompt;
const providerFactory = providers[config.provider]; const providerFactory = providers[config.provider];
if (!providerFactory) { if (!providerFactory) {
@@ -119,17 +123,56 @@ export class Agent {
* 获取当前可用的工具 * 获取当前可用的工具
* - 如果使用 registry 模式:返回核心工具 + 已发现的工具 * - 如果使用 registry 模式:返回核心工具 + 已发现的工具
* - 如果使用旧模式:返回所有注册的工具 * - 如果使用旧模式:返回所有注册的工具
* - 如果当前有 Agent 模式,应用工具过滤
*/ */
private getAvailableTools(): Tool[] { private getAvailableTools(): Tool[] {
let tools: Tool[];
if (this.registry) { if (this.registry) {
// 新模式:核心工具 + 已发现的工具 // 新模式:核心工具 + 已发现的工具
const coreTools = this.registry.getCoreTools(); const coreTools = this.registry.getCoreTools();
const discoveredTools = this.registry.getTools([...this.discoveredTools]); const discoveredTools = this.registry.getTools([...this.discoveredTools]);
return [...coreTools, ...discoveredTools]; tools = [...coreTools, ...discoveredTools];
} else { } else {
// 旧模式:返回所有注册的工具 // 旧模式:返回所有注册的工具
return [...this.legacyTools.values()]; tools = [...this.legacyTools.values()];
} }
// 应用 Agent 模式的工具过滤
if (this.currentAgentMode?.tools) {
tools = this.filterToolsByAgentConfig(tools);
}
return tools;
}
/**
* 根据 Agent 配置过滤工具
*/
private filterToolsByAgentConfig(tools: Tool[]): Tool[] {
const toolConfig = this.currentAgentMode?.tools;
if (!toolConfig) return tools;
let filteredTools = tools;
// 如果设置了 enabled 列表,只保留这些工具
if (toolConfig.enabled && toolConfig.enabled.length > 0) {
const enabledSet = new Set(toolConfig.enabled);
filteredTools = filteredTools.filter((t) => enabledSet.has(t.name));
}
// 如果设置了 disabled 列表,排除这些工具
if (toolConfig.disabled && toolConfig.disabled.length > 0) {
const disabledSet = new Set(toolConfig.disabled);
filteredTools = filteredTools.filter((t) => !disabledSet.has(t.name));
}
// 如果禁止嵌套 Task,移除 task 工具
if (toolConfig.noTask) {
filteredTools = filteredTools.filter((t) => t.name !== 'task');
}
return filteredTools;
} }
/** /**
@@ -365,13 +408,18 @@ export class Agent {
setAgentMode(agent: AgentInfo | null): void { setAgentMode(agent: AgentInfo | null): void {
this.currentAgentMode = agent; this.currentAgentMode = agent;
// 如果切换了 Agent,更新 system prompt
if (agent?.prompt) { if (agent?.prompt) {
// 追加 Agent 的 prompt 到系统 prompt // 切换到指定 Agent,使用其 prompt
this.config = { this.config = {
...this.config, ...this.config,
systemPrompt: agent.prompt, systemPrompt: agent.prompt,
}; };
} else {
// 切换回 default,恢复原始 prompt
this.config = {
...this.config,
systemPrompt: this.originalSystemPrompt,
};
} }
} }
+6 -2
View File
@@ -86,7 +86,9 @@ export class TerminalUI {
// 切换到默认模式 // 切换到默认模式
if (agentName === 'default') { if (agentName === 'default') {
this.agent.setAgentMode(null); this.agent.setAgentMode(null);
console.log(chalk.green('\n✓ 已切换到 default (通用助手) 模式\n')); const toolCount = this.agent.getToolCount();
console.log(chalk.green('\n✓ 已切换到 default (通用助手) 模式'));
console.log(chalk.gray(` 可用工具: ${toolCount.total}\n`));
return true; return true;
} }
@@ -107,8 +109,10 @@ export class TerminalUI {
} }
this.agent.setAgentMode(agent); this.agent.setAgentMode(agent);
const toolCount = this.agent.getToolCount();
console.log(chalk.green(`\n✓ 已切换到 ${agent.name} 模式`)); console.log(chalk.green(`\n✓ 已切换到 ${agent.name} 模式`));
console.log(chalk.gray(` ${agent.description}\n`)); console.log(chalk.gray(` ${agent.description}`));
console.log(chalk.gray(` 可用工具: ${toolCount.total}\n`));
return true; return true;
} }