159 lines
4.8 KiB
Python
159 lines
4.8 KiB
Python
"""
|
||
main.py
|
||
项目入口 —— 启动 Agent 交互式对话 或 MCP Server stdio 模式
|
||
|
||
用法:
|
||
python main.py # 启动 Agent 交互式对话(默认)
|
||
python main.py --mode agent # 同上
|
||
python main.py --mode mcp # 启动本地 MCP Server(stdio 模式)
|
||
python main.py --mode check # 检查配置和依赖
|
||
"""
|
||
|
||
import argparse
|
||
import atexit
|
||
import sys
|
||
|
||
|
||
def run_agent() -> None:
|
||
"""启动 Agent 交互式对话"""
|
||
from agent.agent import create_agent
|
||
from config.settings import settings
|
||
|
||
print(settings.display())
|
||
|
||
agent, registry = create_agent()
|
||
atexit.register(registry.close)
|
||
|
||
print(agent.show_tools())
|
||
print("─" * 60)
|
||
print("💡 命令: exit=退出 reset=清空历史 tools=查看工具列表")
|
||
print("─" * 60)
|
||
|
||
while True:
|
||
try:
|
||
user_input = input("\n🧑 You: ").strip()
|
||
except (EOFError, KeyboardInterrupt):
|
||
print("\n👋 再见!")
|
||
break
|
||
|
||
if not user_input:
|
||
continue
|
||
|
||
match user_input.lower():
|
||
case "exit" | "quit":
|
||
print("👋 再见!")
|
||
break
|
||
case "reset":
|
||
agent.reset()
|
||
print("🔄 对话历史已清空")
|
||
case "tools":
|
||
print(agent.show_tools())
|
||
case _:
|
||
reply = agent.chat(user_input)
|
||
print(f"\n🤖 Agent: {reply}")
|
||
|
||
|
||
def run_mcp_server() -> None:
|
||
"""启动本地 MCP Server(stdio 模式)"""
|
||
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"),
|
||
# ]
|
||
#
|
||
# 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
|
||
#
|
||
# print()
|
||
#
|
||
# # 配置检查
|
||
# 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
|
||
#
|
||
# print()
|
||
#
|
||
# # 工具注册检查
|
||
# 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
|
||
#
|
||
# print()
|
||
# print("=" * 60)
|
||
# if all_ok:
|
||
# print(" ✅ 所有检查通过,项目可正常运行")
|
||
# else:
|
||
# 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(交互对话)| mcp(MCP Server)| check(依赖检查)",
|
||
)
|
||
args = parser.parse_args()
|
||
|
||
match args.mode:
|
||
case "agent":
|
||
run_agent()
|
||
case "mcp":
|
||
run_mcp_server()
|
||
# case "check":
|
||
# run_check()
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main() |