- 新增 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>
836 lines
28 KiB
Markdown
836 lines
28 KiB
Markdown
# X-Agents 智能体平台架构设计
|
||
|
||
## 一、整体架构
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ 用户层 │
|
||
│ Web / App / API Consumer │
|
||
└─────────────────────────────────┬───────────────────────────────────────────┘
|
||
│ HTTP / WebSocket
|
||
▼
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Go API Gateway │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ • HTTP Server (Gin) • 认证鉴权 (JWT) ││
|
||
│ │ • 路由管理 • 限流熔断 ││
|
||
│ │ • 业务逻辑 • 日志监控 ││
|
||
│ │ • 数据库操作 • 权限控制 (RBAC) ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────┬───────────────────────────────────────────┘
|
||
│ HTTP JSON API
|
||
▼
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ Python Agent Engine │
|
||
│ ┌─────────────────────────────────────────────────────────────────────────┐│
|
||
│ │ • FastAPI Server • Agent Core (LangChain/AutoGen) ││
|
||
│ │ • LLM Adapter • Tool Registry (白名单) ││
|
||
│ │ • Memory Manager • Sandbox Executor (沙盒) ││
|
||
│ │ • RAG Pipeline • Audit Logger ││
|
||
│ └─────────────────────────────────────────────────────────────────────────┘│
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 二、系统分层
|
||
|
||
### 2.1 Go 后端层 (server/)
|
||
|
||
```
|
||
server/ # Go API Gateway 服务
|
||
├── cmd/api/ # 程序入口
|
||
│ └── main.go
|
||
├── internal/
|
||
│ ├── config/ # 配置管理
|
||
│ │ └── config.go
|
||
│ ├── handler/ # HTTP处理器
|
||
│ │ ├── auth_handler.go # 认证接口
|
||
│ │ ├── chat_handler.go # 聊天接口
|
||
│ │ └── approval_handler.go # 审批接口
|
||
│ ├── service/ # 业务逻辑
|
||
│ │ ├── auth_service.go
|
||
│ │ ├── chat_service.go
|
||
│ │ └── approval_service.go
|
||
│ ├── repository/ # 数据访问层
|
||
│ │ ├── user_repo.go
|
||
│ │ ├── agent_repo.go
|
||
│ │ └── audit_repo.go
|
||
│ ├── middleware/ # 中间件
|
||
│ │ └── auth.go
|
||
│ └── model/ # 数据模型
|
||
│ ├── user.go
|
||
│ ├── agent.go
|
||
│ └── audit.go
|
||
├── config/ # 配置文件
|
||
│ └── config.yaml
|
||
├── Dockerfile
|
||
├── go.mod
|
||
└── go.sum
|
||
```
|
||
|
||
### 2.2 Python Agent 层 (agent/)
|
||
|
||
```
|
||
agent/ # Python Agent Engine
|
||
├── app/
|
||
│ ├── main.py # FastAPI入口
|
||
│ ├── api/
|
||
│ │ └── routes.py # API路由
|
||
│ ├── agent/
|
||
│ │ ├── core/
|
||
│ │ │ ├── agent.py # Agent管理器
|
||
│ │ │ └── executor.py # Agent执行器
|
||
│ │ ├── tools/
|
||
│ │ │ ├── registry.py # 工具注册表(白名单)
|
||
│ │ │ └── impl/ # 工具实现
|
||
│ │ │ ├── search.py
|
||
│ │ │ ├── calculator.py
|
||
│ │ │ └── time_tool.py
|
||
│ │ └── memory/
|
||
│ │ └── session.py # 会话管理
|
||
│ ├── llm/
|
||
│ │ └── factory.py # LLM工厂
|
||
│ └── security/
|
||
│ ├── audit.py # 审计日志
|
||
│ └── approval.py # 审批服务
|
||
├── requirements.txt
|
||
├── Dockerfile
|
||
└── pyproject.toml
|
||
```
|
||
|
||
### 2.3 根目录结构
|
||
|
||
```
|
||
X-Agents/
|
||
├── server/ # Go API Gateway
|
||
├── agent/ # Python Agent Engine
|
||
├── web/ # 前端 (Vue.js)
|
||
├── docs/
|
||
│ └── ARCHITECTURE.md # 架构文档
|
||
├── docker-compose.yml # 容器编排
|
||
├── .env.example # 环境变量模板
|
||
└── README.md
|
||
│ ├── service/ # 业务逻辑
|
||
│ │ ├── chat_service.go
|
||
│ │ ├── agent_service.go
|
||
│ │ └── approval_service.go # 审批服务
|
||
│ ├── repository/ # 数据访问层
|
||
│ │ ├── user_repo.go
|
||
│ │ ├── agent_repo.go
|
||
│ │ └── audit_repo.go
|
||
│ ├── middleware/ # 中间件
|
||
│ │ ├── auth.go # 认证中间件
|
||
│ │ ├── rbac.go # 权限中间件
|
||
│ │ └── audit.go # 审计中间件
|
||
│ ├── client/ # 外部服务客户端
|
||
│ │ └── python_client.go # Python服务HTTP客户端
|
||
│ └── model/ # 数据模型
|
||
│ ├── user.go
|
||
│ ├── agent.go
|
||
│ └── audit.go
|
||
├── pkg/
|
||
│ ├── utils/ # 工具函数
|
||
│ └── errors/ # 错误定义
|
||
└── go.mod
|
||
```
|
||
|
||
### 2.2 Python AI 层 (智能逻辑)
|
||
|
||
```
|
||
python/
|
||
├── app/
|
||
│ ├── main.py # FastAPI入口
|
||
│ ├── api/
|
||
│ │ ├── routes.py # 路由定义
|
||
│ │ └── dependencies.py # 依赖注入
|
||
│ ├── agent/
|
||
│ │ ├── core/
|
||
│ │ │ ├── agent.py # Agent核心
|
||
│ │ │ ├── executor.py # 执行器
|
||
│ │ │ └── memory.py # 记忆管理
|
||
│ │ ├── tools/
|
||
│ │ │ ├── registry.py # 工具注册表
|
||
│ │ │ ├── base.py # 工具基类
|
||
│ │ │ ├── security.py # 安全检查
|
||
│ │ │ └── impl/ # 具体工具实现
|
||
│ │ │ ├── search.py
|
||
│ │ │ ├── calculator.py
|
||
│ │ │ ├── database.py
|
||
│ │ │ └── sandbox.py # 沙盒执行
|
||
│ │ └── sandbox/
|
||
│ │ ├── docker_sandbox.py
|
||
│ │ └── wasm_sandbox.py
|
||
│ ├── llm/
|
||
│ │ ├── factory.py # LLM工厂
|
||
│ │ ├── openai_adapter.py
|
||
│ │ ├── anthropic_adapter.py
|
||
│ │ └── base.py
|
||
│ ├── rag/
|
||
│ │ ├── vector_store.py # 向量存储
|
||
│ │ ├── retriever.py # 检索器
|
||
│ │ └── pipeline.py # RAG流程
|
||
│ └── security/
|
||
│ ├── permission.py # 权限检查
|
||
│ ├── approval.py # 审批管理
|
||
│ └── audit.py # 安全审计
|
||
├── requirements.txt
|
||
└── pyproject.toml
|
||
```
|
||
|
||
---
|
||
|
||
## 三、通信机制
|
||
|
||
### 3.1 HTTP API 通信
|
||
|
||
```
|
||
┌──────────────────┐ HTTP POST ┌──────────────────┐
|
||
│ │ ─────────────▶ │ │
|
||
│ Go Service │ JSON Request │ Python Service │
|
||
│ (Port: 8080) │ │ (Port: 8081) │
|
||
│ │ ◀───────────── │ │
|
||
└──────────────────┘ JSON Response └──────────────────┘
|
||
```
|
||
|
||
#### 接口设计
|
||
|
||
**1. Agent 聊天接口**
|
||
|
||
```
|
||
POST /api/v1/agent/chat
|
||
Content-Type: application/json
|
||
Authorization: Bearer <token>
|
||
|
||
Request:
|
||
{
|
||
"agent_id": "agent_001",
|
||
"message": "帮我查询用户数据",
|
||
"session_id": "session_xxx",
|
||
"context": {} // 额外上下文
|
||
}
|
||
|
||
Response:
|
||
{
|
||
"reply": "查询结果...",
|
||
"session_id": "session_xxx",
|
||
"tools_used": ["query_database"],
|
||
"metadata": {}
|
||
}
|
||
```
|
||
|
||
**2. 工具执行审批接口**
|
||
|
||
```
|
||
POST /api/v1/tool/approve
|
||
Request:
|
||
{
|
||
"request_id": "req_001",
|
||
"tool_name": "execute_sql",
|
||
"params": {"sql": "SELECT * FROM users"},
|
||
"reason": "用户查询自己的订单",
|
||
"approved": true // true=批准, false=拒绝
|
||
}
|
||
```
|
||
|
||
**3. 工具执行状态查询**
|
||
|
||
```
|
||
GET /api/v1/tool/request/{request_id}
|
||
Response:
|
||
{
|
||
"status": "pending|approved|rejected|completed",
|
||
"tool_name": "execute_sql",
|
||
"created_at": "2024-01-01T00:00:00Z",
|
||
"result": null // 如果已完成
|
||
}
|
||
```
|
||
|
||
### 3.2 Go → Python 客户端
|
||
|
||
```go
|
||
// internal/client/python_client.go
|
||
|
||
package client
|
||
|
||
type PythonAgentClient struct {
|
||
baseURL string
|
||
client *http.Client
|
||
}
|
||
|
||
type ChatRequest struct {
|
||
AgentID string `json:"agent_id"`
|
||
Message string `json:"message"`
|
||
SessionID string `json:"session_id"`
|
||
Context map[string]interface{} `json:"context"`
|
||
}
|
||
|
||
type ChatResponse struct {
|
||
Reply string `json:"reply"`
|
||
SessionID string `json:"session_id"`
|
||
ToolsUsed []string `json:"tools_used"`
|
||
Metadata map[string]interface{} `json:"metadata"`
|
||
}
|
||
|
||
// Chat 调用Python Agent服务
|
||
func (c *PythonAgentClient) Chat(ctx context.Context, req ChatRequest) (*ChatResponse, error) {
|
||
// 1. 构建请求
|
||
// 2. 添加超时
|
||
// 3. 发送请求
|
||
// 4. 处理响应
|
||
// 5. 错误处理
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 四、沙盒安全机制
|
||
|
||
### 4.1 安全架构总览
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────┐
|
||
│ 安全控制层 │
|
||
│ │
|
||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌──────────┐ │
|
||
│ │ 权限管理 │ │ 工具分级 │ │ 人工审批 │ │ 审计日志 │ │
|
||
│ │ (RBAC) │ │ (白名单) │ │ (Approval) │ │ (Audit) │ │
|
||
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ └────┬─────┘ │
|
||
└─────────┼─────────────────┼─────────────────┼─────────────────┼────────┘
|
||
│ │ │ │
|
||
▼ ▼ ▼ ▼
|
||
┌─────────────────────────────────────────────────────────────────────────┐
|
||
│ Agent 执行层 │
|
||
│ │
|
||
│ User Request ─▶ Permission Check ─▶ Tool Lookup ─▶ Execute ─▶ Result │
|
||
│ │ │ │ │
|
||
│ ▼ ▼ ▼ │
|
||
│ [Need Approval] ──▶ [Pending Queue] ──▶ [Notify] │
|
||
└─────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 4.2 工具安全等级
|
||
|
||
```python
|
||
# python/app/agent/tools/security.py
|
||
|
||
from enum import Enum
|
||
from dataclasses import dataclass
|
||
from typing import List, Callable
|
||
|
||
class SecurityLevel(Enum):
|
||
"""工具安全等级"""
|
||
SAFE = "safe" # 安全操作:搜索、计算、读取公开数据
|
||
REVIEW = "review" # 需要审核:修改数据、发送消息
|
||
DANGER = "danger" # 危险操作:删除数据、执行代码、敏感API
|
||
|
||
@dataclass
|
||
class ToolMetadata:
|
||
"""工具元数据"""
|
||
name: str
|
||
description: str
|
||
security_level: SecurityLevel
|
||
require_approval: bool # 是否需要人工审批
|
||
allowed_roles: List[str] # 允许调用的角色
|
||
rate_limit: int # 调用频率限制
|
||
timeout: int # 超时时间(秒)
|
||
|
||
class ToolSecurity:
|
||
"""工具安全管理"""
|
||
|
||
# 安全等级阈值
|
||
APPROVAL_THRESHOLD = SecurityLevel.REVIEW
|
||
|
||
@staticmethod
|
||
def check_permission(tool: ToolMetadata, user_role: str) -> bool:
|
||
"""检查用户权限"""
|
||
if user_role in tool.allowed_roles:
|
||
return True
|
||
return False
|
||
|
||
@staticmethod
|
||
def need_approval(tool: ToolMetadata) -> bool:
|
||
"""判断是否需要审批"""
|
||
return tool.security_level.value >= ToolSecurity.APPROVAL_THRESHOLD.value
|
||
```
|
||
|
||
### 4.3 工具注册与执行
|
||
|
||
```python
|
||
# python/app/agent/tools/registry.py
|
||
|
||
from typing import Dict, Callable, Any
|
||
from .security import ToolMetadata, SecurityLevel
|
||
|
||
class ToolRegistry:
|
||
"""工具注册表 - 白名单机制"""
|
||
|
||
def __init__(self):
|
||
self._tools: Dict[str, tuple[Callable, ToolMetadata]] = {}
|
||
|
||
def register(
|
||
self,
|
||
name: str,
|
||
func: Callable,
|
||
security_level: SecurityLevel = SecurityLevel.SAFE,
|
||
require_approval: bool = False,
|
||
allowed_roles: List[str] = None,
|
||
description: str = ""
|
||
):
|
||
"""注册工具到白名单"""
|
||
metadata = ToolMetadata(
|
||
name=name,
|
||
description=description,
|
||
security_level=security_level,
|
||
require_approval=require_approval or security_level == SecurityLevel.REVIEW,
|
||
allowed_roles=allowed_roles or ["user", "admin"],
|
||
rate_limit=100,
|
||
timeout=30
|
||
)
|
||
self._tools[name] = (func, metadata)
|
||
|
||
def get_tool(self, name: str) -> tuple[Callable, ToolMetadata]:
|
||
"""获取工具(必须在白名单中)"""
|
||
if name not in self._tools:
|
||
raise ValueError(f"Tool '{name}' not found in whitelist")
|
||
return self._tools[name]
|
||
|
||
def list_tools(self) -> List[ToolMetadata]:
|
||
"""列出所有可用工具"""
|
||
return [meta for _, meta in self._tools.values()]
|
||
```
|
||
|
||
### 4.4 沙盒执行
|
||
|
||
```python
|
||
# python/app/agent/tools/sandbox/docker_sandbox.py
|
||
|
||
import subprocess
|
||
import tempfile
|
||
import shutil
|
||
import os
|
||
from typing import Any, Dict
|
||
|
||
class DockerSandbox:
|
||
"""Docker沙盒执行环境"""
|
||
|
||
def __init__(self, image: str = "python-sandbox:latest", timeout: int = 30):
|
||
self.image = image
|
||
self.timeout = timeout
|
||
|
||
def execute(self, code: str, language: str = "python") -> Dict[str, Any]:
|
||
"""在沙盒中执行代码"""
|
||
|
||
# 1. 创建临时文件
|
||
with tempfile.NamedTemporaryFile(
|
||
mode='w',
|
||
suffix=f'.{language}',
|
||
delete=False
|
||
) as f:
|
||
f.write(code)
|
||
temp_path = f.name
|
||
|
||
try:
|
||
# 2. Docker容器执行
|
||
result = subprocess.run(
|
||
[
|
||
"docker", "run",
|
||
"--rm",
|
||
"--network", "none", # 断网
|
||
"--memory", "256m", # 内存限制
|
||
"--cpus", "0.5", # CPU限制
|
||
"-v", f"{temp_path}:/code/{os.path.basename(temp_path)}",
|
||
self.image,
|
||
"python", f"/code/{os.path.basename(temp_path)}"
|
||
],
|
||
capture_output=True,
|
||
timeout=self.timeout
|
||
)
|
||
|
||
return {
|
||
"success": result.returncode == 0,
|
||
"output": result.stdout.decode(),
|
||
"error": result.stderr.decode()
|
||
}
|
||
|
||
except subprocess.TimeoutExpired:
|
||
return {
|
||
"success": False,
|
||
"output": "",
|
||
"error": "Execution timeout"
|
||
}
|
||
finally:
|
||
# 3. 清理临时文件
|
||
os.unlink(temp_path)
|
||
|
||
# 使用示例
|
||
@sandbox.execute
|
||
def execute_code(code: str) -> str:
|
||
"""安全执行用户代码"""
|
||
pass
|
||
```
|
||
|
||
### 4.5 Human in the Loop (人工审批)
|
||
|
||
```python
|
||
# python/app/security/approval.py
|
||
|
||
from enum import Enum
|
||
from dataclasses import dataclass
|
||
from typing import Optional
|
||
from datetime import datetime
|
||
import asyncio
|
||
|
||
class ApprovalStatus(Enum):
|
||
PENDING = "pending"
|
||
APPROVED = "approved"
|
||
REJECTED = "rejected"
|
||
|
||
@dataclass
|
||
class ApprovalRequest:
|
||
"""审批请求"""
|
||
request_id: str
|
||
tool_name: str
|
||
params: dict
|
||
user_id: str
|
||
reason: str
|
||
status: ApprovalStatus
|
||
created_at: datetime
|
||
reviewed_at: Optional[datetime]
|
||
reviewed_by: Optional[str]
|
||
|
||
class ApprovalService:
|
||
"""审批服务"""
|
||
|
||
def __init__(self, http_client):
|
||
self.client = http_client
|
||
self.pending: Dict[str, ApprovalRequest] = {}
|
||
|
||
async def request_approval(
|
||
self,
|
||
tool_name: str,
|
||
params: dict,
|
||
user_id: str,
|
||
reason: str
|
||
) -> str:
|
||
"""请求审批"""
|
||
request_id = generate_uuid()
|
||
|
||
approval_req = ApprovalRequest(
|
||
request_id=request_id,
|
||
tool_name=tool_name,
|
||
params=params,
|
||
user_id=user_id,
|
||
reason=reason,
|
||
status=ApprovalStatus.PENDING,
|
||
created_at=datetime.now(),
|
||
reviewed_at=None,
|
||
reviewed_by=None
|
||
)
|
||
|
||
self.pending[request_id] = approval_req
|
||
|
||
# 通知Go后端有新审批
|
||
await self.notify_go_service(approval_req)
|
||
|
||
return request_id
|
||
|
||
async def wait_for_approval(self, request_id: str, timeout: int = 300) -> bool:
|
||
"""等待审批结果"""
|
||
start = datetime.now()
|
||
|
||
while (datetime.now() - start).seconds < timeout:
|
||
if request_id in self.pending:
|
||
status = self.pending[request_id].status
|
||
if status == ApprovalStatus.APPROVED:
|
||
return True
|
||
elif status == ApprovalStatus.REJECTED:
|
||
return False
|
||
await asyncio.sleep(1)
|
||
|
||
raise TimeoutError("Approval request timeout")
|
||
```
|
||
|
||
### 4.6 全链路审计
|
||
|
||
```python
|
||
# python/app/security/audit.py
|
||
|
||
from datetime import datetime
|
||
from typing import Any, Dict
|
||
import json
|
||
|
||
class AuditLogger:
|
||
"""审计日志"""
|
||
|
||
def __init__(self, log_file: str = "audit.log"):
|
||
self.log_file = log_file
|
||
|
||
def log(
|
||
self,
|
||
action: str,
|
||
user_id: str,
|
||
agent_id: str,
|
||
details: Dict[str, Any],
|
||
result: str = "success"
|
||
):
|
||
"""记录审计日志"""
|
||
entry = {
|
||
"timestamp": datetime.now().isoformat(),
|
||
"action": action,
|
||
"user_id": user_id,
|
||
"agent_id": agent_id,
|
||
"details": details,
|
||
"result": result
|
||
}
|
||
|
||
# 写入日志文件
|
||
with open(self.log_file, 'a') as f:
|
||
f.write(json.dumps(entry) + '\n')
|
||
|
||
# 发送到Go后端
|
||
self.send_to_backend(entry)
|
||
|
||
def log_tool_execution(
|
||
self,
|
||
user_id: str,
|
||
tool_name: str,
|
||
params: Dict[str, Any],
|
||
approved: bool,
|
||
result: Any
|
||
):
|
||
"""记录工具执行"""
|
||
self.log(
|
||
action="tool_execution",
|
||
user_id=user_id,
|
||
agent_id="",
|
||
details={
|
||
"tool_name": tool_name,
|
||
"params": params,
|
||
"approved": approved,
|
||
"result_preview": str(result)[:100]
|
||
}
|
||
)
|
||
```
|
||
|
||
---
|
||
|
||
## 五、权限模型 (Go端)
|
||
|
||
### 5.1 用户角色
|
||
|
||
```go
|
||
// go/internal/model/user.go
|
||
|
||
package model
|
||
|
||
// 权限级别
|
||
type PermissionLevel int
|
||
|
||
const (
|
||
PermissionRead PermissionLevel = 1 // 只读
|
||
PermissionWrite PermissionLevel = 2 // 读写
|
||
PermissionExecute PermissionLevel = 3 // 可执行工具
|
||
PermissionAdmin PermissionLevel = 4 // 管理员
|
||
)
|
||
|
||
// 角色定义
|
||
type Role struct {
|
||
ID string `json:"id"`
|
||
Name string `json:"name"`
|
||
Permissions []PermissionLevel `json:"permissions"`
|
||
}
|
||
|
||
// 用户
|
||
type User struct {
|
||
ID string `json:"id"`
|
||
Username string `json:"username"`
|
||
RoleID string `json:"role_id"`
|
||
Role *Role `json:"role,omitempty"`
|
||
}
|
||
```
|
||
|
||
### 5.2 Agent定义
|
||
|
||
```go
|
||
// go/internal/model/agent.go
|
||
|
||
package model
|
||
|
||
type Agent struct {
|
||
ID string `json:"id"`
|
||
Name string `json:"name"`
|
||
Description string `json:"description"`
|
||
OwnerID string `json:"owner_id"`
|
||
|
||
// Agent能力配置
|
||
Capabilities []string `json:"capabilities"` // 可用工具列表
|
||
MemoryLimit int64 `json:"memory_limit"` // 内存限制
|
||
Timeout int `json:"timeout"` // 超时时间
|
||
|
||
// 安全配置
|
||
SecurityLevel SecurityLevel `json:"security_level"`
|
||
AllowDangerousTools bool `json:"allow_dangerous_tools"`
|
||
|
||
CreatedAt time.Time `json:"created_at"`
|
||
UpdatedAt time.Time `json:"updated_at"`
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 六、部署架构
|
||
|
||
### 6.1 Docker Compose
|
||
|
||
```yaml
|
||
# docker-compose.yml
|
||
|
||
version: '3.8'
|
||
|
||
services:
|
||
# Go API 服务
|
||
go-api:
|
||
build: ./go
|
||
ports:
|
||
- "8080:8080"
|
||
environment:
|
||
- DATABASE_URL=postgres://user:pass@db:5432/agents
|
||
- PYTHON_SERVICE_URL=http://python-agent:8081
|
||
- JWT_SECRET=your-secret
|
||
depends_on:
|
||
- db
|
||
- python-agent
|
||
|
||
# Python Agent 服务
|
||
python-agent:
|
||
build: ./python
|
||
ports:
|
||
- "8081:8081"
|
||
environment:
|
||
- OPENAI_API_KEY=${OPENAI_API_KEY}
|
||
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
|
||
volumes:
|
||
- ./python/app:/app
|
||
- /var/run/docker.sock:/var/run/docker.sock # 如果需要Docker沙盒
|
||
|
||
# 数据库
|
||
db:
|
||
image: postgres:15
|
||
environment:
|
||
POSTGRES_USER: user
|
||
POSTGRES_PASSWORD: pass
|
||
POSTGRES_DB: agents
|
||
volumes:
|
||
- db-data:/var/lib/postgresql/data
|
||
|
||
# Redis (缓存/会话)
|
||
redis:
|
||
image: redis:7
|
||
volumes:
|
||
- redis-data:/data
|
||
|
||
# 向量数据库 (可选)
|
||
qdrant:
|
||
image: qdrant/qdrant
|
||
volumes:
|
||
- qdrant-data:/qdrant/storage
|
||
|
||
volumes:
|
||
db-data:
|
||
redis-data:
|
||
qdrant-data:
|
||
```
|
||
|
||
---
|
||
|
||
## 七、开发流程
|
||
|
||
### 7.1 请求流程图
|
||
|
||
```
|
||
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
|
||
│ 用户 │────▶│ Go │────▶│ Python │────▶│ LLM │────▶│ 返回 │
|
||
│ 请求 │ │ 鉴权 │ │ Agent │ │ +Tools │ │ 结果 │
|
||
└─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘
|
||
│ │
|
||
│ │
|
||
▼ ▼
|
||
┌─────────┐ ┌─────────┐
|
||
│ 检查 │ │ 权限 │
|
||
│ 权限 │ │ 检查 │
|
||
└─────────┘ └─────────┘
|
||
│
|
||
▼
|
||
┌─────────────────────┐
|
||
│ 工具安全等级判断 │
|
||
└─────────────────────┘
|
||
│
|
||
┌─────────────────┼─────────────────┐
|
||
│ │ │
|
||
▼ ▼ ▼
|
||
┌──────────┐ ┌──────────┐ ┌──────────┐
|
||
│ Safe │ │ Review │ │ Danger │
|
||
│ 直接执行 │ │ 等待审批 │ │ 拒绝执行 │
|
||
└──────────┘ └──────────┘ └──────────┘
|
||
```
|
||
|
||
### 7.2 目录结构总览
|
||
|
||
```
|
||
X-Agents/
|
||
├── docs/
|
||
│ └── ARCHITECTURE.md # 本文档
|
||
│
|
||
├── go/ # Go 后端
|
||
│ ├── cmd/
|
||
│ ├── internal/
|
||
│ ├── pkg/
|
||
│ ├── go.mod
|
||
│ └── Dockerfile
|
||
│
|
||
├── python/ # Python AI 层
|
||
│ ├── app/
|
||
│ │ ├── api/
|
||
│ │ ├── agent/
|
||
│ │ ├── llm/
|
||
│ │ ├── rag/
|
||
│ │ └── security/
|
||
│ ├── requirements.txt
|
||
│ └── Dockerfile
|
||
│
|
||
├── web/ # 前端 (Vue)
|
||
│ ├── src/
|
||
│ └── package.json
|
||
│
|
||
├── docker-compose.yml # 容器编排
|
||
└── README.md
|
||
```
|
||
|
||
---
|
||
|
||
## 八、总结
|
||
|
||
### 架构核心原则
|
||
|
||
| 原则 | 实现方式 |
|
||
|------|----------|
|
||
| **分层治理** | Go负责业务/权限,Python负责AI逻辑 |
|
||
| **安全优先** | 工具分级+权限控制+人工审批+审计日志 |
|
||
| **通信简洁** | HTTP JSON API,后续可升级gRPC |
|
||
| **可扩展** | 模块化设计,支持多Agent/多Python服务 |
|
||
| **可观测** | 全链路日志+监控 |
|
||
|
||
### 安全特性
|
||
|
||
- [x] 工具白名单机制
|
||
- [x] 安全等级分级 (Safe/Review/Danger)
|
||
- [x] RBAC权限控制
|
||
- [x] Human in the Loop 人工审批
|
||
- [x] 沙盒执行环境 (Docker)
|
||
- [x] 全链路审计日志
|
||
|
||
---
|
||
|
||
*本文档将随项目开发持续更新*
|