2026-02-28 08:21:35 +00:00
|
|
|
|
"""程序入口"""
|
|
|
|
|
|
"""
|
|
|
|
|
|
main.py
|
|
|
|
|
|
智能体 Demo 程序入口
|
|
|
|
|
|
组装所有模块,启动交互式对话循环
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
import sys
|
2026-02-28 14:59:41 +00:00
|
|
|
|
import argparse
|
2026-02-28 08:21:35 +00:00
|
|
|
|
# ── 导入各模块 ─────────────────────────────────────────────────
|
|
|
|
|
|
from client.agent_client import AgentClient
|
|
|
|
|
|
from llm.llm_engine import LLMEngine
|
|
|
|
|
|
from mcp.mcp_server import MCPServer
|
|
|
|
|
|
from memory.memory_store import MemoryStore
|
|
|
|
|
|
from tools.calculator import CalculatorTool
|
|
|
|
|
|
from tools.code_executor import CodeExecutorTool
|
|
|
|
|
|
from tools.file_reader import FileReaderTool
|
|
|
|
|
|
from tools.web_search import WebSearchTool
|
2026-03-03 00:47:44 +00:00
|
|
|
|
from tools.tool_generator import ToolGeneratorTool
|
2026-02-28 08:21:35 +00:00
|
|
|
|
from utils.logger import get_logger
|
|
|
|
|
|
|
|
|
|
|
|
logger = get_logger("SYSTEM")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ── 系统组装 ───────────────────────────────────────────────────
|
2026-02-28 14:59:41 +00:00
|
|
|
|
def build_agent(agent_prompt) -> AgentClient:
|
2026-02-28 08:21:35 +00:00
|
|
|
|
"""
|
|
|
|
|
|
工厂函数:组装并返回完整的 Agent 实例
|
|
|
|
|
|
|
|
|
|
|
|
组装顺序:
|
|
|
|
|
|
1. 初始化 MCP Server,注册所有工具
|
|
|
|
|
|
2. 初始化 LLM 引擎
|
|
|
|
|
|
3. 初始化 Memory 模块
|
|
|
|
|
|
4. 组装 AgentClient
|
|
|
|
|
|
"""
|
|
|
|
|
|
logger.info("🔧 开始组装 Agent 系统...")
|
|
|
|
|
|
|
|
|
|
|
|
# 1. MCP Server:注册所有工具
|
|
|
|
|
|
mcp_server = MCPServer(server_name="DemoMCPServer")
|
|
|
|
|
|
mcp_server.register_tools(
|
|
|
|
|
|
CalculatorTool,
|
|
|
|
|
|
WebSearchTool,
|
|
|
|
|
|
FileReaderTool,
|
|
|
|
|
|
CodeExecutorTool,
|
2026-03-03 00:47:44 +00:00
|
|
|
|
ToolGeneratorTool
|
2026-02-28 08:21:35 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
# 2. LLM 引擎
|
|
|
|
|
|
llm = LLMEngine(model_name="gpt-4o")
|
|
|
|
|
|
|
|
|
|
|
|
# 3. 记忆模块
|
|
|
|
|
|
memory = MemoryStore(max_history=20)
|
|
|
|
|
|
|
|
|
|
|
|
# 4. 组装客户端
|
2026-02-28 14:59:41 +00:00
|
|
|
|
client = AgentClient(llm=llm, mcp_server=mcp_server, memory=memory, prompt=agent_prompt)
|
2026-02-28 08:21:35 +00:00
|
|
|
|
|
|
|
|
|
|
logger.info(f"✅ Agent 组装完成,已注册工具: {mcp_server.list_tools()}")
|
|
|
|
|
|
return client
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ── 演示场景 ───────────────────────────────────────────────────
|
|
|
|
|
|
def run_demo(client: AgentClient) -> None:
|
|
|
|
|
|
"""运行预设演示场景,展示各工具的完整调用链路"""
|
|
|
|
|
|
demo_cases = [
|
|
|
|
|
|
("🔢 数学计算", "计算 (100 + 200) × 3 等于多少"),
|
|
|
|
|
|
("🌐 网络搜索", "搜索 Python 最新版本的新特性"),
|
|
|
|
|
|
("📄 文件读取", "读取文件 config.json 的内容"),
|
|
|
|
|
|
("🐍 代码执行", '执行代码 `print("Hello, Agent!")`'),
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
logger.info("\n" + "═" * 60)
|
|
|
|
|
|
logger.info("🎬 开始演示模式,共 4 个场景")
|
|
|
|
|
|
logger.info("═" * 60)
|
|
|
|
|
|
|
|
|
|
|
|
for title, question in demo_cases:
|
|
|
|
|
|
logger.info(f"\n{'─' * 55}")
|
|
|
|
|
|
logger.info(f"📌 场景: {title}")
|
|
|
|
|
|
logger.info(f"{'─' * 55}")
|
|
|
|
|
|
|
|
|
|
|
|
response = client.chat(question)
|
|
|
|
|
|
|
|
|
|
|
|
print(f"\n{'─' * 55}")
|
|
|
|
|
|
print(f"👤 用户: {response.user_input}")
|
|
|
|
|
|
if response.tool_used:
|
|
|
|
|
|
print(f"🔧 工具: {response.tool_used}")
|
|
|
|
|
|
print(f"📤 输出: {response.tool_output[:120]}...")
|
|
|
|
|
|
print(f"🤖 回复:\n{response.final_reply}")
|
|
|
|
|
|
print()
|
|
|
|
|
|
|
|
|
|
|
|
# 打印记忆统计
|
|
|
|
|
|
stats = client.get_memory_stats()
|
|
|
|
|
|
logger.info(f"\n📊 Memory 统计: {stats}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ── 交互式对话循环 ─────────────────────────────────────────────
|
|
|
|
|
|
def run_interactive(client: AgentClient) -> None:
|
|
|
|
|
|
"""启动交互式命令行对话"""
|
|
|
|
|
|
print("\n" + "═" * 60)
|
|
|
|
|
|
print(" 🤖 Agent Demo — 交互模式")
|
|
|
|
|
|
print(" 输入 'quit' → 退出程序")
|
|
|
|
|
|
print(" 输入 'clear' → 清空会话历史")
|
|
|
|
|
|
print(" 输入 'stats' → 查看 Memory 统计")
|
|
|
|
|
|
print(" 输入 'tools' → 查看已注册工具列表")
|
|
|
|
|
|
print("═" * 60 + "\n")
|
|
|
|
|
|
|
|
|
|
|
|
while True:
|
|
|
|
|
|
try:
|
|
|
|
|
|
user_input = input("👤 你: ").strip()
|
|
|
|
|
|
except (KeyboardInterrupt, EOFError):
|
|
|
|
|
|
print("\n👋 再见!")
|
|
|
|
|
|
break
|
|
|
|
|
|
|
|
|
|
|
|
if not user_input:
|
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
|
|
# ── 内置命令 ──────────────────────────────────────────
|
|
|
|
|
|
match user_input.lower():
|
|
|
|
|
|
case "quit" | "exit":
|
|
|
|
|
|
print("👋 再见!")
|
|
|
|
|
|
break
|
|
|
|
|
|
case "clear":
|
|
|
|
|
|
client.clear_session()
|
|
|
|
|
|
print("✅ 会话已清空\n")
|
|
|
|
|
|
continue
|
|
|
|
|
|
case "stats":
|
|
|
|
|
|
print(f"📊 Memory 统计: {client.get_memory_stats()}\n")
|
|
|
|
|
|
continue
|
|
|
|
|
|
case "tools":
|
|
|
|
|
|
tools = client.mcp_server.list_tools()
|
|
|
|
|
|
print(f"🔧 已注册工具 ({len(tools)} 个): {', '.join(tools)}\n")
|
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
|
|
# ── 执行 Agent 完整流程 ───────────────────────────────
|
|
|
|
|
|
response = client.chat(user_input)
|
|
|
|
|
|
|
|
|
|
|
|
print(f"\n{'─' * 55}")
|
|
|
|
|
|
if response.tool_used:
|
|
|
|
|
|
print(f" 🔧 调用工具: {response.tool_used}")
|
|
|
|
|
|
print(f"🤖 Agent:\n{response.final_reply}")
|
|
|
|
|
|
print(f"{'─' * 55}\n")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ── 主函数 ─────────────────────────────────────────────────────
|
|
|
|
|
|
def main() -> None:
|
|
|
|
|
|
"""
|
|
|
|
|
|
主函数入口,支持两种运行模式:
|
|
|
|
|
|
|
|
|
|
|
|
python main.py → 交互模式(默认)
|
|
|
|
|
|
python main.py demo → 演示模式(自动执行预设场景)
|
|
|
|
|
|
"""
|
2026-02-28 14:59:41 +00:00
|
|
|
|
parser = argparse.ArgumentParser()
|
|
|
|
|
|
parser.add_argument("-d", "--daemon", help="服务模式", action="store_true")
|
|
|
|
|
|
parser.add_argument("-p", "--prompt", default="你是一个通用智能体,非常擅长将用户指令分解成可以执行的任务进行执行。", help="智能体提示此词, 例如:你是一个XXXXX,非常擅长……")
|
|
|
|
|
|
args = parser.parse_args(sys.argv[1:])
|
|
|
|
|
|
client = build_agent(args.prompt)
|
2026-02-28 08:21:35 +00:00
|
|
|
|
|
2026-02-28 14:59:41 +00:00
|
|
|
|
if args.daemon:
|
2026-02-28 08:21:35 +00:00
|
|
|
|
run_demo(client)
|
|
|
|
|
|
else:
|
|
|
|
|
|
run_interactive(client)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
|
main()
|