| import os |
| import sys |
| import logging |
| from contextlib import asynccontextmanager |
|
|
| from dotenv import load_dotenv |
| load_dotenv() |
|
|
| |
| logging.basicConfig( |
| level=logging.INFO, |
| format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", |
| handlers=[logging.StreamHandler(sys.stdout)] |
| ) |
| logger = logging.getLogger(__name__) |
|
|
| |
| BACKEND_APP_DIR = os.path.dirname(os.path.abspath(__file__)) |
| |
| if BACKEND_APP_DIR not in sys.path: |
| sys.path.insert(0, BACKEND_APP_DIR) |
| logger.info(f"✅ 已将 backend_app 加入搜索路径: {BACKEND_APP_DIR}") |
|
|
| |
| from fastapi import FastAPI, HTTPException |
| from fastapi.responses import JSONResponse |
|
|
| from helloAgents.tools.registry import global_registry |
| from helloAgents.tools.builtin.rag_tool import RAGTool |
| from helloAgents.tools.builtin.memory_tool import MemoryTool |
| from helloAgents.tools.builtin.terminal_tool import TerminalTool |
| from helloAgents.tools.builtin.search_tool import SearchTool |
| from helloAgents.tools.builtin.calculator import CalculatorTool |
| from helloAgents.tools.builtin.note_tool import NoteTool |
| from helloAgents.tools.builtin.protocol_tools import MCPTool, A2ATool, ANPTool |
| from helloAgents.core.exceptions import ( |
| HelloAgentsException, |
| http_exception_handler, |
| hello_agents_exception_handler, |
| general_exception_handler |
| ) |
|
|
| import logging |
|
|
| |
| logging.getLogger("pdfminer").setLevel(logging.ERROR) |
| logging.getLogger("pdfminer.pdffont").setLevel(logging.ERROR) |
|
|
|
|
| import torch |
| print(torch.cuda.is_available()) |
| print(torch.cuda.device_count()) |
| |
| def register_all_core_tools(): |
| """注册所有核心工具到全局注册表""" |
| tools_registered = [] |
|
|
| try: |
| |
| logger.info("🔄 初始化RAG工具...") |
| rag_tool = RAGTool() |
| if not rag_tool.initialized: |
| raise RuntimeError(f"RAG工具初始化失败: {getattr(rag_tool, 'init_error', '未知错误')}") |
| global_registry.register_tool(rag_tool) |
| tools_registered.append(("rag", "✅")) |
| logger.info("✅ RAG工具已注册") |
| except Exception as e: |
| logger.error(f"❌ RAG工具注册失败: {e}") |
| tools_registered.append(("rag", "❌")) |
|
|
| try: |
| |
| logger.info("🔄 初始化记忆工具...") |
| memory_tool = MemoryTool() |
| global_registry.register_tool(memory_tool) |
| tools_registered.append(("memory", "✅")) |
| logger.info("✅ 记忆工具已注册") |
| except Exception as e: |
| logger.error(f"❌ 记忆工具注册失败: {e}") |
| tools_registered.append(("memory", "❌")) |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| try: |
| |
| logger.info("🔄 初始化MCP协议工具...") |
|
|
| |
| server_script = os.path.join(os.path.dirname(__file__), "helloAgents", "protocols", "mcp", "mcpServer", "sendEmailServer.py") |
| send_qq_email_mcp_tool = MCPTool( |
| name="send_qq_email", |
| description="发送qq邮件", |
| |
| server="http://127.0.0.1:8081/mcp", |
| auto_expand=True |
| ) |
| global_registry.register_tool(send_qq_email_mcp_tool) |
| tools_registered.append(("send_qq_email_mcp_tool", "✅")) |
| logger.info("✅ 基础MCP工具已注册") |
| except Exception as e: |
| logger.error(f"❌ MCP工具注册失败: {e}") |
| tools_registered.append(("send_qq_email_mcp_tool", "❌")) |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
|
|
| |
| logger.info("📋 核心工具注册完成:") |
| for tool_name, status in tools_registered: |
| logger.info(f" {status} {tool_name}") |
|
|
| |
| all_tools = global_registry.list_tools() |
|
|
| return all_tools |
|
|
|
|
|
|
|
|
| |
| @asynccontextmanager |
| async def lifespan(app: FastAPI): |
| |
| logger.info("🚀 应用启动中...") |
|
|
| try: |
| |
| register_all_core_tools() |
|
|
|
|
| logger.info("✅ 所有核心工具已成功注册到全局注册表") |
|
|
| except Exception as e: |
| logger.critical(f"❌ 工具初始化失败,应用启动终止: {e}") |
| raise |
|
|
| yield |
|
|
| |
| logger.info("🔌 应用关闭中...") |
| try: |
| |
| rag_tool = global_registry.get_tool("rag") |
| if rag_tool: |
| |
| |
| logger.info("✅ RAG工具资源已清理") |
|
|
| |
| logger.info("✅ 所有工具资源已清理") |
| except Exception as e: |
| logger.error(f"⚠️ 清理工具资源时发生警告: {e}") |
|
|
| |
| app = FastAPI( |
| title="Llama3.2 RAG 服务", |
| description="集成RAGTool的检索增强生成服务", |
| version="1.0.0", |
| lifespan=lifespan, |
| reload=False |
| ) |
|
|
| |
| |
| try: |
| from api.api_router import api_router |
| app.include_router(router=api_router, prefix='/api/v1') |
| logger.info("✅ 已注册API路由: /api/v1") |
| except ImportError as e: |
| logger.error(f"❌ 导入API路由失败: {e}") |
| raise |
|
|
| |
| |
| app.add_exception_handler(HTTPException, http_exception_handler) |
| app.add_exception_handler(HelloAgentsException, hello_agents_exception_handler) |
| app.add_exception_handler(Exception, general_exception_handler) |
| logger.info("✅ 全局异常处理器已注册") |
|
|
| |
| @app.get("/") |
| async def root(): |
| """根路由:健康检查""" |
| |
| rag_tool = global_registry.get_tool("rag") |
| rag_status = "✅ 已初始化" if getattr(rag_tool, "initialized", False) else "❌ 未初始化" |
| |
| return JSONResponse( |
| content={ |
| "message": "Llama3.2 服务启动成功!", |
| "rag_tool_status": rag_status, |
| "registered_tools": global_registry.list_tools(), |
| "api_prefix": "/api/v1" |
| } |
| ) |