170 lines
7.4 KiB
Python
170 lines
7.4 KiB
Python
"""
|
|
Step 01: 工具系统基础 - 主程序
|
|
|
|
运行方式:
|
|
cd step_01_tools
|
|
python main.py
|
|
"""
|
|
|
|
from concept import (
|
|
ToolRegistry,
|
|
CalculatorTool,
|
|
SearchTool,
|
|
JaspersoftCodeGeneratorTool
|
|
)
|
|
|
|
|
|
def main():
|
|
"""演示工具系统的完整使用流程"""
|
|
|
|
print("=" * 70)
|
|
print(" Step 01: 理解 Tool - 工具系统基础")
|
|
print("=" * 70)
|
|
print()
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════
|
|
# 场景:构建一个 Jaspersoft 报表助手的工具集
|
|
# ═══════════════════════════════════════════════════════════════════════
|
|
|
|
print("📦 场景:构建 Jaspersoft 报表助手")
|
|
print("-" * 70)
|
|
print("""
|
|
假设我们要构建一个 AI 助手,帮助用户:
|
|
1. 根据需求生成 JRXML 代码
|
|
2. 验证生成的代码是否正确
|
|
3. 计算报表的统计数据
|
|
4. 搜索相关的报表模板
|
|
|
|
我们可以设计以下工具:
|
|
- jrxml_generator: 生成 JRXML 代码
|
|
- jrxml_validator: 验证 JRXML 语法
|
|
- calculator: 计算统计数据
|
|
- web_search: 搜索报表模板
|
|
""")
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════
|
|
# 步骤 1:创建工具注册表
|
|
# ═══════════════════════════════════════════════════════════════════════
|
|
|
|
print("\n📋 步骤 1: 创建工具注册表")
|
|
print("-" * 40)
|
|
|
|
registry = ToolRegistry()
|
|
print("✓ 创建了空的工具注册表")
|
|
print(f" 当前注册工具数量: {len(registry.list_tools())}")
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════
|
|
# 步骤 2:注册工具
|
|
# ═══════════════════════════════════════════════════════════════════════
|
|
|
|
print("\n🔧 步骤 2: 注册工具")
|
|
print("-" * 40)
|
|
|
|
# 注册各种工具
|
|
registry.register(CalculatorTool())
|
|
print("✓ 注册计算器工具")
|
|
|
|
registry.register(SearchTool())
|
|
print("✓ 注册搜索工具")
|
|
|
|
registry.register(JaspersoftCodeGeneratorTool())
|
|
print("✓ 注册 JRXML 生成工具")
|
|
|
|
print(f"\n 当前注册工具数量: {len(registry.list_tools())}")
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════
|
|
# 步骤 3:查看可用工具
|
|
# ═══════════════════════════════════════════════════════════════════════
|
|
|
|
print("\n📜 步骤 3: 查看可用工具")
|
|
print("-" * 40)
|
|
|
|
for tool_info in registry.list_tools():
|
|
print(f"\n [{tool_info['name']}]")
|
|
# 截取描述的前100个字符
|
|
desc = tool_info['description'].strip().replace('\n', ' ')[:100]
|
|
print(f" {desc}...")
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════
|
|
# 步骤 4:执行工具
|
|
# ═══════════════════════════════════════════════════════════════════════
|
|
|
|
print("\n\n⚡ 步骤 4: 执行工具")
|
|
print("-" * 40)
|
|
|
|
# 场景:用户想要生成一个销售报表
|
|
user_requirement = "生成一个销售报表,显示月度汇总"
|
|
|
|
print(f"\n 用户需求: {user_requirement}")
|
|
|
|
# 4.1 先搜索相关的模板
|
|
print("\n 4.1 搜索相关模板...")
|
|
search_result = registry.execute("web_search", query="JasperReports 销售报表模板")
|
|
if search_result.success:
|
|
print(f" 找到 {len(search_result.result)} 个相关模板")
|
|
for i, item in enumerate(search_result.result[:2], 1):
|
|
print(f" {i}. {item['title']}")
|
|
|
|
# 4.2 生成 JRXML
|
|
print("\n 4.2 生成 JRXML 代码...")
|
|
generate_result = registry.execute(
|
|
"jrxml_generator",
|
|
requirement=user_requirement,
|
|
context="参考销售报表模板"
|
|
)
|
|
if generate_result.success:
|
|
print(f" ✓ 生成成功!")
|
|
print(f" 代码长度: {len(generate_result.result)} 字符")
|
|
print(f" 代码预览:")
|
|
print(" " + "-" * 30)
|
|
for line in generate_result.result.split('\n')[:5]:
|
|
print(f" {line}")
|
|
print(" ...")
|
|
|
|
# 4.3 计算统计
|
|
print("\n 4.3 计算统计...")
|
|
calc_result = registry.execute("calculator", expression="10 + 20 + 30")
|
|
if calc_result.success:
|
|
print(f" 10 + 20 + 30 = {calc_result.result}")
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════
|
|
# 步骤 5:错误处理
|
|
# ═══════════════════════════════════════════════════════════════════════
|
|
|
|
print("\n\n⚠️ 步骤 5: 错误处理演示")
|
|
print("-" * 40)
|
|
|
|
# 场景:用户尝试除以零
|
|
print("\n 尝试执行: calculator(expression='10 / 0')")
|
|
error_result = registry.execute("calculator", expression="10 / 0")
|
|
if not error_result.success:
|
|
print(f" ✓ 错误被正确捕获: {error_result.error}")
|
|
|
|
# 尝试调用不存在的工具
|
|
print("\n 尝试执行: nonexistent_tool()")
|
|
error_result = registry.execute("nonexistent_tool")
|
|
if not error_result.success:
|
|
print(f" ✓ 错误被正确捕获: {error_result.error}")
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════
|
|
# 总结
|
|
# ═══════════════════════════════════════════════════════════════════════
|
|
|
|
print("\n\n" + "=" * 70)
|
|
print(" ✅ Step 01 完成!")
|
|
print("=" * 70)
|
|
print("""
|
|
学到的关键概念:
|
|
1. Tool = name + description + execute
|
|
2. BaseTool 是所有工具的基类
|
|
3. ToolRegistry 统一管理所有工具
|
|
4. ToolResult 统一返回结果格式
|
|
|
|
下一步:
|
|
继续 Step 02,学习如何管理 Agent 的状态
|
|
""")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|