Files
X-Agents/agent/app/api/routes.py

150 lines
3.9 KiB
Python
Raw Normal View History

"""
API 路由定义
"""
from typing import Optional
from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel
from app.agent.core.agent import AgentManager
from app.security.approval import ApprovalService
router = APIRouter()
# 全局依赖(实际应该注入)
_agent_manager: Optional[AgentManager] = None
_approval_service: Optional[ApprovalService] = None
def get_agent_manager() -> AgentManager:
"""获取 Agent 管理器"""
# 这里应该从 app.state 获取
from app.main import agent_manager
if agent_manager is None:
raise HTTPException(status_code=503, detail="Agent service not initialized")
return agent_manager
def get_approval_service() -> ApprovalService:
"""获取审批服务"""
global _approval_service
if _approval_service is None:
_approval_service = ApprovalService()
return _approval_service
# ==================== 请求/响应模型 ====================
class ChatRequest(BaseModel):
"""聊天请求"""
agent_id: str
message: str
session_id: str = ""
context: dict = {}
class ChatResponse(BaseModel):
"""聊天响应"""
reply: str
session_id: str
tools_used: list[str] = []
metadata: dict = {}
class ApprovalRequest(BaseModel):
"""审批请求"""
request_id: str
tool_name: str
params: dict
reason: str
approved: bool
# ==================== API 端点 ====================
@router.post("/chat", response_model=ChatResponse)
async def chat(
request: ChatRequest,
agent_manager: AgentManager = Depends(get_agent_manager)
):
"""处理 Agent 聊天请求"""
try:
# 生成会话ID
if not request.session_id:
import uuid
request.session_id = str(uuid.uuid4())
# 执行 Agent
result = await agent_manager.execute(
agent_id=request.agent_id,
message=request.message,
session_id=request.session_id,
context=request.context
)
return ChatResponse(
reply=result.get("reply", ""),
session_id=request.session_id,
tools_used=result.get("tools_used", []),
metadata=result.get("metadata", {})
)
except ValueError as e:
raise HTTPException(status_code=404, detail=str(e))
except Exception as e:
raise HTTPException(status_code=500, detail=f"Agent execution failed: {str(e)}")
@router.post("/tool/request")
async def request_tool_execution(
request: dict,
approval_service: ApprovalService = Depends(get_approval_service)
):
"""请求执行工具(需要审批)"""
tool_name = request.get("tool_name")
params = request.get("params", {})
user_id = request.get("user_id", "unknown")
agent_id = request.get("agent_id")
reason = request.get("reason", "")
# 创建审批请求
request_id = await approval_service.request_approval(
tool_name=tool_name,
params=params,
user_id=user_id,
agent_id=agent_id or "",
reason=reason
)
return {
"request_id": request_id,
"status": "pending"
}
@router.get("/tools")
async def list_tools(agent_manager: AgentManager = Depends(get_agent_manager)):
"""列出所有可用工具"""
tools = agent_manager.list_tools()
return {"tools": [tool.dict() for tool in tools]}
@router.get("/agents")
async def list_agents(agent_manager: AgentManager = Depends(get_agent_manager)):
"""列出所有已加载的 Agent"""
agents = agent_manager.list_agents()
return {"agents": agents}
@router.get("/agent/{agent_id}")
async def get_agent(
agent_id: str,
agent_manager: AgentManager = Depends(get_agent_manager)
):
"""获取特定 Agent 信息"""
agent_info = agent_manager.get_agent_info(agent_id)
if not agent_info:
raise HTTPException(status_code=404, detail="Agent not found")
return agent_info