| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- """工具链管理器 - HelloAgents工具链式调用支持"""
- from typing import List, Dict, Any, Optional
- from .registry import ToolRegistry
- class ToolChain:
- """工具链 - 支持多个工具的顺序执行"""
- def __init__(self, name: str, description: str):
- self.name = name
- self.description = description
- self.steps: List[Dict[str, Any]] = []
- def add_step(self, tool_name: str, input_template: str, output_key: str = None):
- """
- 添加工具执行步骤
-
- Args:
- tool_name: 工具名称
- input_template: 输入模板,支持变量替换,如 "{input}" 或 "{search_result}"
- output_key: 输出结果的键名,用于后续步骤引用
- """
- step = {
- "tool_name": tool_name,
- "input_template": input_template,
- "output_key": output_key or f"step_{len(self.steps)}_result"
- }
- self.steps.append(step)
- print(f"✅ 工具链 '{self.name}' 添加步骤: {tool_name}")
- def execute(self, registry: ToolRegistry, input_data: str, context: Dict[str, Any] = None) -> str:
- """
- 执行工具链
-
- Args:
- registry: 工具注册表
- input_data: 初始输入数据
- context: 执行上下文,用于变量替换
-
- Returns:
- 最终执行结果
- """
- if not self.steps:
- return "❌ 工具链为空,无法执行"
- print(f"🚀 开始执行工具链: {self.name}")
-
- # 初始化上下文
- if context is None:
- context = {}
- context["input"] = input_data
-
- final_result = input_data
-
- for i, step in enumerate(self.steps):
- tool_name = step["tool_name"]
- input_template = step["input_template"]
- output_key = step["output_key"]
-
- print(f"📝 执行步骤 {i+1}/{len(self.steps)}: {tool_name}")
-
- # 替换模板中的变量
- try:
- actual_input = input_template.format(**context)
- except KeyError as e:
- return f"❌ 模板变量替换失败: {e}"
-
- # 执行工具
- try:
- result = registry.execute_tool(tool_name, actual_input)
- context[output_key] = result
- final_result = result
- print(f"✅ 步骤 {i+1} 完成")
- except Exception as e:
- return f"❌ 工具 '{tool_name}' 执行失败: {e}"
-
- print(f"🎉 工具链 '{self.name}' 执行完成")
- return final_result
- class ToolChainManager:
- """工具链管理器"""
- def __init__(self, registry: ToolRegistry):
- self.registry = registry
- self.chains: Dict[str, ToolChain] = {}
- def register_chain(self, chain: ToolChain):
- """注册工具链"""
- self.chains[chain.name] = chain
- print(f"✅ 工具链 '{chain.name}' 已注册")
- def execute_chain(self, chain_name: str, input_data: str, context: Dict[str, Any] = None) -> str:
- """执行指定的工具链"""
- if chain_name not in self.chains:
- return f"❌ 工具链 '{chain_name}' 不存在"
- chain = self.chains[chain_name]
- return chain.execute(self.registry, input_data, context)
- def list_chains(self) -> List[str]:
- """列出所有已注册的工具链"""
- return list(self.chains.keys())
- def get_chain_info(self, chain_name: str) -> Optional[Dict[str, Any]]:
- """获取工具链信息"""
- if chain_name not in self.chains:
- return None
-
- chain = self.chains[chain_name]
- return {
- "name": chain.name,
- "description": chain.description,
- "steps": len(chain.steps),
- "step_details": [
- {
- "tool_name": step["tool_name"],
- "input_template": step["input_template"],
- "output_key": step["output_key"]
- }
- for step in chain.steps
- ]
- }
- # 便捷函数
- def create_research_chain() -> ToolChain:
- """创建一个研究工具链:搜索 -> 计算 -> 总结"""
- chain = ToolChain(
- name="research_and_calculate",
- description="搜索信息并进行相关计算"
- )
- # 步骤1:搜索信息
- chain.add_step(
- tool_name="search",
- input_template="{input}",
- output_key="search_result"
- )
- # 步骤2:基于搜索结果进行计算
- chain.add_step(
- tool_name="my_calculator",
- input_template="2 + 2", # 简单的计算示例
- output_key="calc_result"
- )
- return chain
- def create_simple_chain() -> ToolChain:
- """创建一个简单的工具链示例"""
- chain = ToolChain(
- name="simple_demo",
- description="简单的工具链演示"
- )
- # 只包含一个计算步骤
- chain.add_step(
- tool_name="my_calculator",
- input_template="{input}",
- output_key="result"
- )
- return chain
|