refactor: 重构 Agent 模块
- 删除旧的 agent 核心文件 - 新增 supervisor, memory, skills 等模块 - 重构 main.py 服务入口 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,58 +1,20 @@
|
||||
"""
|
||||
X-Agents Python Agent Service
|
||||
智能体引擎服务入口
|
||||
FastAPI Agent Engine Server
|
||||
"""
|
||||
import os
|
||||
from contextlib import asynccontextmanager
|
||||
|
||||
from fastapi import FastAPI
|
||||
import time
|
||||
from typing import Optional
|
||||
from fastapi import FastAPI, HTTPException
|
||||
from pydantic import BaseModel
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
|
||||
from app.api import routes
|
||||
from app.agent.core.agent import AgentManager
|
||||
from app.security.audit import AuditLogger
|
||||
from app.agent.core import AgentCore, Supervisor, AgentConfig
|
||||
from app.agent.llm import LLMFactory
|
||||
|
||||
|
||||
# 全局组件
|
||||
agent_manager: AgentManager = None
|
||||
audit_logger: AuditLogger = None
|
||||
app = FastAPI(title="X-Agents Python Engine", version="1.0.0")
|
||||
|
||||
|
||||
@asynccontextmanager
|
||||
async def lifespan(app: FastAPI):
|
||||
"""应用生命周期管理"""
|
||||
global agent_manager, audit_logger
|
||||
|
||||
# 启动时初始化
|
||||
audit_logger = AuditLogger()
|
||||
|
||||
# 初始化 Agent 管理器
|
||||
agent_manager = AgentManager(
|
||||
llm_provider=os.getenv("LLM_PROVIDER", "openai"),
|
||||
openai_api_key=os.getenv("OPENAI_API_KEY"),
|
||||
anthropic_api_key=os.getenv("ANTHROPIC_API_KEY"),
|
||||
)
|
||||
|
||||
# 加载 Agent 配置
|
||||
await agent_manager.load_agents()
|
||||
|
||||
print("Agent service started successfully")
|
||||
|
||||
yield
|
||||
|
||||
# 关闭时清理
|
||||
print("Agent service shutting down")
|
||||
|
||||
|
||||
# 创建 FastAPI 应用
|
||||
app = FastAPI(
|
||||
title="X-Agents Agent Service",
|
||||
description="AI Agent Engine for X-Agents Platform",
|
||||
version="1.0.0",
|
||||
lifespan=lifespan,
|
||||
)
|
||||
|
||||
# CORS 中间件
|
||||
# CORS
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=["*"],
|
||||
@@ -61,24 +23,180 @@ app.add_middleware(
|
||||
allow_headers=["*"],
|
||||
)
|
||||
|
||||
# 注册路由
|
||||
app.include_router(routes.router, prefix="/agent", tags=["Agent"])
|
||||
|
||||
# === 请求/响应模型 ===
|
||||
|
||||
class ChatRequest(BaseModel):
|
||||
"""对话请求"""
|
||||
agent_id: int
|
||||
message: str
|
||||
user_id: int = 1
|
||||
session_id: Optional[str] = None
|
||||
|
||||
|
||||
@app.get("/health")
|
||||
async def health_check():
|
||||
"""健康检查"""
|
||||
return {
|
||||
"status": "healthy",
|
||||
"service": "agent",
|
||||
"version": "1.0.0"
|
||||
class TeamChatRequest(BaseModel):
|
||||
"""多智能体群聊请求"""
|
||||
supervisor_agent_id: int
|
||||
member_agent_ids: list[int]
|
||||
message: str
|
||||
user_id: int = 1
|
||||
session_id: Optional[str] = None
|
||||
strategy: str = "parallel"
|
||||
|
||||
|
||||
class ChatResponse(BaseModel):
|
||||
"""对话响应"""
|
||||
agent_id: int
|
||||
response: str
|
||||
tool_calls: list = []
|
||||
tokens_used: int = 0
|
||||
duration_ms: int = 0
|
||||
session_id: Optional[str] = None
|
||||
|
||||
|
||||
# === 模拟数据存储 ===
|
||||
# TODO: 后续替换为从数据库加载
|
||||
_mock_agents = {
|
||||
1: {
|
||||
"id": 1,
|
||||
"name": "数据分析助手",
|
||||
"role_description": "你是一个专业的数据分析助手,擅长分析数据、生成报告。",
|
||||
"model_provider": "openai",
|
||||
"model_name": "gpt-4",
|
||||
"skills": [1, 2]
|
||||
},
|
||||
2: {
|
||||
"id": 2,
|
||||
"name": "代码审查助手",
|
||||
"role_description": "你是一个专业的代码审查助手,擅长审查代码、发现bug。",
|
||||
"model_provider": "openai",
|
||||
"model_name": "gpt-4",
|
||||
"skills": [3]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
def get_agent_config(agent_id: int) -> AgentConfig:
|
||||
"""获取智能体配置"""
|
||||
agent_data = _mock_agents.get(agent_id)
|
||||
if not agent_data:
|
||||
raise HTTPException(status_code=404, detail="Agent not found")
|
||||
|
||||
return AgentConfig(
|
||||
id=agent_data["id"],
|
||||
name=agent_data["name"],
|
||||
role_description=agent_data["role_description"],
|
||||
model_provider=agent_data["model_provider"],
|
||||
model_name=agent_data["model_name"],
|
||||
skills=agent_data.get("skills", [])
|
||||
)
|
||||
|
||||
|
||||
# === API 路由 ===
|
||||
|
||||
@app.get("/")
|
||||
async def root():
|
||||
"""根路径"""
|
||||
return {"message": "X-Agents Python Engine", "version": "1.0.0"}
|
||||
|
||||
|
||||
@app.get("/health")
|
||||
async def health():
|
||||
return {"status": "healthy"}
|
||||
|
||||
|
||||
@app.post("/agent/chat", response_model=ChatResponse)
|
||||
async def chat(request: ChatRequest):
|
||||
"""
|
||||
单智能体对话
|
||||
"""
|
||||
start_time = time.time()
|
||||
|
||||
# 获取智能体配置
|
||||
try:
|
||||
config = get_agent_config(request.agent_id)
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=400, detail=str(e))
|
||||
|
||||
# 创建智能体实例
|
||||
agent = AgentCore(config)
|
||||
|
||||
# 生成 session_id
|
||||
session_id = request.session_id or f"session_{int(time.time())}"
|
||||
|
||||
# 执行对话
|
||||
try:
|
||||
result = await agent.run(request.message, request.user_id, session_id)
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
duration_ms = int((time.time() - start_time) * 1000)
|
||||
|
||||
return ChatResponse(
|
||||
agent_id=request.agent_id,
|
||||
response=result.content,
|
||||
tool_calls=result.tool_calls,
|
||||
tokens_used=result.tokens_used,
|
||||
duration_ms=duration_ms,
|
||||
session_id=session_id
|
||||
)
|
||||
|
||||
|
||||
@app.post("/agent/team/chat")
|
||||
async def team_chat(request: TeamChatRequest):
|
||||
"""
|
||||
多智能体群聊
|
||||
"""
|
||||
start_time = time.time()
|
||||
|
||||
# 创建主智能体
|
||||
try:
|
||||
supervisor_config = get_agent_config(request.supervisor_agent_id)
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=400, detail=str(e))
|
||||
|
||||
supervisor_agent = AgentCore(supervisor_config)
|
||||
|
||||
# 创建子智能体
|
||||
members = []
|
||||
for member_id in request.member_agent_ids:
|
||||
try:
|
||||
member_config = get_agent_config(member_id)
|
||||
members.append(AgentCore(member_config))
|
||||
except:
|
||||
continue
|
||||
|
||||
if not members:
|
||||
raise HTTPException(status_code=400, detail="No valid member agents")
|
||||
|
||||
# 创建调度器
|
||||
supervisor = Supervisor(supervisor_agent, members, request.strategy)
|
||||
|
||||
# 生成 session_id
|
||||
session_id = request.session_id or f"team_session_{int(time.time())}"
|
||||
|
||||
# 执行群聊
|
||||
try:
|
||||
result = await supervisor.run(request.message, request.user_id, session_id)
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
duration_ms = int((time.time() - start_time) * 1000)
|
||||
|
||||
return {
|
||||
"message": "X-Agents Agent Service",
|
||||
"docs": "/docs"
|
||||
"supervisor_agent_id": request.supervisor_agent_id,
|
||||
"response": result["main_response"],
|
||||
"subtask_results": result["subtask_results"],
|
||||
"strategy": result["strategy"],
|
||||
"duration_ms": duration_ms,
|
||||
"session_id": session_id
|
||||
}
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import uvicorn
|
||||
port = int(os.getenv("AGENT_PORT", "8081"))
|
||||
uvicorn.run(app, host="0.0.0.0", port=port)
|
||||
|
||||
Reference in New Issue
Block a user