feat: Agent 模式切换时应用工具过滤
- 在 getAvailableTools() 中根据 AgentToolConfig 过滤工具 - 支持 enabled 白名单、disabled 黑名单、noTask 配置 - 切换回 default 时恢复原始 systemPrompt - /agent 命令显示当前可用工具数量
This commit is contained in:
+52
-4
@@ -57,8 +57,12 @@ export class Agent {
|
||||
// 当前 Agent 模式(null 表示默认模式)
|
||||
private currentAgentMode: AgentInfo | null = null;
|
||||
|
||||
// 原始 system prompt(用于切换回 default 时恢复)
|
||||
private originalSystemPrompt: string;
|
||||
|
||||
constructor(config: AgentConfig, compressionConfig?: Partial<CompressionConfig>) {
|
||||
this.config = config;
|
||||
this.originalSystemPrompt = config.systemPrompt;
|
||||
|
||||
const providerFactory = providers[config.provider];
|
||||
if (!providerFactory) {
|
||||
@@ -119,17 +123,56 @@ export class Agent {
|
||||
* 获取当前可用的工具
|
||||
* - 如果使用 registry 模式:返回核心工具 + 已发现的工具
|
||||
* - 如果使用旧模式:返回所有注册的工具
|
||||
* - 如果当前有 Agent 模式,应用工具过滤
|
||||
*/
|
||||
private getAvailableTools(): Tool[] {
|
||||
let tools: Tool[];
|
||||
|
||||
if (this.registry) {
|
||||
// 新模式:核心工具 + 已发现的工具
|
||||
const coreTools = this.registry.getCoreTools();
|
||||
const discoveredTools = this.registry.getTools([...this.discoveredTools]);
|
||||
return [...coreTools, ...discoveredTools];
|
||||
tools = [...coreTools, ...discoveredTools];
|
||||
} 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 {
|
||||
this.currentAgentMode = agent;
|
||||
|
||||
// 如果切换了 Agent,更新 system prompt
|
||||
if (agent?.prompt) {
|
||||
// 追加 Agent 的 prompt 到系统 prompt
|
||||
// 切换到指定 Agent,使用其 prompt
|
||||
this.config = {
|
||||
...this.config,
|
||||
systemPrompt: agent.prompt,
|
||||
};
|
||||
} else {
|
||||
// 切换回 default,恢复原始 prompt
|
||||
this.config = {
|
||||
...this.config,
|
||||
systemPrompt: this.originalSystemPrompt,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+6
-2
@@ -86,7 +86,9 @@ export class TerminalUI {
|
||||
// 切换到默认模式
|
||||
if (agentName === 'default') {
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -107,8 +109,10 @@ export class TerminalUI {
|
||||
}
|
||||
|
||||
this.agent.setAgentMode(agent);
|
||||
const toolCount = this.agent.getToolCount();
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user