feat: 重构前后端架构,添加Go后端和Python Agent服务

- 新增 Go 语言后端服务(server/),包含用户认证、Agent管理、数据库连接等API
- 新增 Python Agent 服务(agent/),实现Agent核心逻辑和工具集
- 前端从原生HTML迁移到Vue.js框架(web/src/)
- 添加 Docker Compose 支持(docker-compose.yml)
- 添加项目架构文档(docs/ARCHITECTURE.md)
- 添加环境变量示例(.env.example)和本地启动脚本(start-local.ps1)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-06 16:39:42 +08:00
parent 6fe3c412f4
commit b2bc9988a9
90 changed files with 9317 additions and 469 deletions

149
agent/app/api/routes.py Normal file
View File

@@ -0,0 +1,149 @@
"""
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