base_agent/main.py

159 lines
4.7 KiB
Python
Raw Normal View History

2026-02-28 08:21:35 +00:00
"""
main.py
2026-03-30 08:48:36 +00:00
项目入口 启动 Agent 交互式对话 MCP Server stdio 模式
2026-03-09 05:37:29 +00:00
2026-03-30 08:48:36 +00:00
用法:
python main.py # 启动 Agent 交互式对话(默认)
python main.py --mode agent # 同上
python main.py --mode mcp # 启动本地 MCP Serverstdio 模式)
python main.py --mode check # 检查配置和依赖
2026-02-28 08:21:35 +00:00
"""
2026-03-30 08:48:36 +00:00
import argparse
import atexit
2026-02-28 08:21:35 +00:00
import sys
2026-03-09 05:37:29 +00:00
2026-02-28 08:21:35 +00:00
2026-03-30 08:48:36 +00:00
def run_agent() -> None:
"""启动 Agent 交互式对话"""
from agent.agent import create_agent
from config.settings import settings
2026-02-28 08:21:35 +00:00
2026-03-30 08:48:36 +00:00
print(settings.display())
2026-02-28 08:21:35 +00:00
2026-03-30 08:48:36 +00:00
agent, registry = create_agent()
atexit.register(registry.close)
2026-02-28 08:21:35 +00:00
2026-03-30 08:48:36 +00:00
print(agent.show_tools())
print("" * 60)
print("💡 命令: exit=退出 reset=清空历史 tools=查看工具列表")
print("" * 60)
2026-02-28 08:21:35 +00:00
while True:
try:
2026-03-30 08:48:36 +00:00
user_input = input("\n🧑 You: ").strip()
except (EOFError, KeyboardInterrupt):
2026-02-28 08:21:35 +00:00
print("\n👋 再见!")
break
if not user_input:
continue
match user_input.lower():
2026-03-30 08:48:36 +00:00
case "exit" | "quit":
2026-02-28 08:21:35 +00:00
print("👋 再见!")
break
2026-03-30 08:48:36 +00:00
case "reset":
agent.reset()
print("🔄 对话历史已清空")
2026-02-28 08:21:35 +00:00
case "tools":
2026-03-30 08:48:36 +00:00
print(agent.show_tools())
2026-03-09 05:37:29 +00:00
case _:
2026-03-30 08:48:36 +00:00
reply = agent.chat(user_input)
print(f"\n🤖 Agent: {reply}")
2026-03-09 05:37:29 +00:00
2026-03-30 08:48:36 +00:00
def run_mcp_server() -> None:
"""启动本地 MCP Serverstdio 模式)"""
from mcp.mcp_server import MCPServer
with MCPServer() as server:
server.run_stdio()
def run_check() -> None:
"""检查配置和依赖完整性"""
print("=" * 60)
print(" 🔍 项目依赖检查")
print("=" * 60)
checks = [
("pyyaml", "yaml", "pip install pyyaml"),
("openai", "openai", "pip install openai>=1.0.0"),
("httpx", "httpx", "pip install httpx>=0.27.0"),
("httpx-sse", "httpx_sse", "pip install httpx-sse>=0.4.0"),
("paramiko", "paramiko", "pip install paramiko>=3.0.0"),
2026-03-09 05:37:29 +00:00
]
2026-02-28 08:21:35 +00:00
2026-03-30 08:48:36 +00:00
all_ok = True
for pkg_name, import_name, install_cmd in checks:
try:
__import__(import_name)
print(f"{pkg_name:<15} 已安装")
except ImportError:
print(f"{pkg_name:<15} 未安装 → {install_cmd}")
all_ok = False
2026-02-28 08:21:35 +00:00
2026-03-30 08:48:36 +00:00
print()
2026-03-09 05:37:29 +00:00
2026-03-30 08:48:36 +00:00
# 配置检查
try:
from config.settings import settings
print(" ✅ config/settings.py 加载成功")
print(f" LLM : {settings.llm.provider} / {settings.llm.model_name}")
print(f" 本地工具: {settings.mcp.enabled_tools}")
skills = settings.enabled_mcp_skills
if skills:
print(f" 在线Skill: {[s.name for s in skills]}")
else:
print(" 在线Skill: (未配置)")
except Exception as e:
print(f" ❌ 配置加载失败: {e}")
all_ok = False
2026-03-09 05:37:29 +00:00
2026-03-30 08:48:36 +00:00
print()
2026-03-09 05:37:29 +00:00
2026-03-30 08:48:36 +00:00
# 工具注册检查
try:
from mcp.skill_registry import SkillRegistry
from tools.calculator import CalculatorTool
from tools.code_executor import CodeExecutorTool
from tools.file_reader import FileReaderTool
from tools.ssh_docker import SSHDockerTool
from tools.static_analyzer import StaticAnalyzerTool
from tools.web_search import WebSearchTool
registry = SkillRegistry()
registry.register_local_many(
CalculatorTool(), WebSearchTool(), FileReaderTool(),
CodeExecutorTool(), StaticAnalyzerTool(), SSHDockerTool(),
)
tools = registry.list_all_tools()
print(f" ✅ 本地工具注册 共 {len(tools)} 个:")
for t in tools:
print(f" 🔵 {t['name']}: {t['description'][:50]}")
except Exception as e:
print(f" ❌ 工具注册失败: {e}")
all_ok = False
2026-03-09 05:37:29 +00:00
2026-03-30 08:48:36 +00:00
print()
print("=" * 60)
if all_ok:
print(" ✅ 所有检查通过,项目可正常运行")
2026-02-28 08:21:35 +00:00
else:
2026-03-30 08:48:36 +00:00
print(" ⚠️ 存在问题,请按提示安装缺失依赖")
print("=" * 60)
def main() -> None:
parser = argparse.ArgumentParser(
description="Agent Demo —— 支持本地工具 + 在线 MCP Skill"
)
parser.add_argument(
"--mode",
choices=["agent", "mcp", "check"],
default="agent",
help="运行模式: agent交互对话| mcpMCP Server| check依赖检查",
)
args = parser.parse_args()
match args.mode:
case "agent":
run_agent()
case "mcp":
run_mcp_server()
case "check":
run_check()
2026-02-28 08:21:35 +00:00
if __name__ == "__main__":
main()