UFO Agent Server 分布式编排服务器架构与实战指南
Agent Server 是 UFO 分布式多智能体系统的核心编排引擎,它通过持久化 WebSocket 连接将星座编排器(Constellation Client)与异构设备智能体(Device Client)编织成一张数字智能体星系。本文基于仓库文档与源码,系统讲解 Agent Server 的四层架构、双客户端模型、会话生命周期、AIP 协议消息流、双 API 接口、平台支持、部署运维与故障排查,读完即可独立完成服务器的启动、客户端接入、任务分发与生产化部署。
什么是 Agent Server
Agent Server 是一个基于 FastAPI 的异步 WebSocket 服务器(入口见 ufo/server/app.py),承担 UFO 分布式架构中的通信枢纽角色:它桥接星座编排器、设备智能体与外部系统,通过统一的 AIP(Agent Interaction Protocol)协议接口完成消息的解析、路由与状态维护。
核心职责
| 能力 | 描述 | 关键收益 |
|---|---|---|
| 连接管理 | 跟踪设备与星座客户端生命周期 | 实时感知设备可用性 |
| 任务编排 | 协调跨设备的分布式任务执行 | 集中式工作流控制 |
| 状态管理 | 维护会话生命周期与执行上下文 | 支持有状态的多轮任务执行 |
| 双 API 接口 | WebSocket(AIP)+ HTTP(REST) | 灵活的集成方式 |
| 韧性 | 优雅处理断连、超时与失败 | 生产级可靠性 |
为什么需要 Agent Server
- 集中式控制:多设备工作流的单一编排点;
- 协议抽象:客户端通过 AIP 协议通信,屏蔽网络复杂性(协议定义见 aip/messages.py);
- 异步设计:非阻塞执行带来高并发能力;
- 平台无关:支持 Windows、Linux,macOS 开发中。
Agent Server 属于 UFO 分布式 服务器-客户端架构 的一部分:服务器负责编排与状态管理,Agent Clients 负责命令执行。完整设计依据见 服务器-客户端架构。
架构解析
服务器遵循清晰的分层关注点分离原则,将 Web 服务、连接管理与协议处理解耦。
分层架构与组件交互
graph TB
subgraph "Web Layer"
FastAPI[FastAPI App]
HTTP[HTTP API]
WS[WebSocket /ws]
end
subgraph "Service Layer"
WSM[Client Connection Manager]
SM[Session Manager]
WSH[WebSocket Handler]
end
subgraph "Clients"
DC[Device Clients]
CC[Constellation Clients]
end
FastAPI --> HTTP
FastAPI --> WS
HTTP --> SM
HTTP --> WSM
WS --> WSH
WSH --> WSM
WSH --> SM
DC -->|WebSocket| WS
CC -->|WebSocket| WS
从源码看(ufo/server/app.py),FastAPI 应用初始化了两个核心管理器与一个共享的 WebSocket 处理器:SessionManager、ClientConnectionManager 与 UFOWebSocketHandler,三者通过构造注入互相协作,保证每个组件职责单一。
核心组件职责对照
| 组件 | 职责 | 关键操作 |
|---|---|---|
| FastAPI 应用 | Web 服务层 | HTTP 端点路由、WebSocket 连接接收(/ws)、请求/响应处理、CORS 与中间件 |
| Client Connection Manager | 连接注册表 | 客户端身份跟踪、会话↔客户端映射、设备信息缓存、连接生命周期钩子 |
| Session Manager | 执行生命周期 | 平台相关会话创建、后台异步任务执行、结果回调投递、会话取消 |
| WebSocket Handler | 协议实现 | AIP 消息解析与路由、客户端注册、心跳监控、任务/命令分发 |
组件文档:
- Session Manager —— 会话生命周期与后台执行
- Client Connection Manager —— 连接注册表与客户端跟踪
- WebSocket Handler —— AIP 协议消息处理
- HTTP API —— REST 端点规范
关键能力一:多客户端协调
服务器支持两种职责不同的客户端类型,这是分布式架构的角色基础(枚举定义见 aip/messages.py#L282-L291)。
客户端类型对比
| 维度 | Device Client(设备客户端) | Constellation Client(星座客户端) |
|---|---|---|
| 角色 | 任务执行者 | 任务编排者 |
| 连接 | 长连接 WebSocket | 长连接 WebSocket |
| 注册 | ClientType.DEVICE |
ClientType.CONSTELLATION |
| 能力 | 本地执行、遥测上报 | 多设备协调 |
| Target 字段 | 不需要 | 路由必需 |
| 示例 | Windows 智能体、Linux 智能体 | ConstellationClient 编排器 |
Device Client(设备客户端)
- 在 Windows/Linux 机器上本地执行任务;
- 上报硬件规格与实时状态(如 CPU 核数、内存总量,见 ws/handler.py#L277-L284 的连接日志);
- 通过 MCP 工具服务器响应命令;
- 将执行日志流式回传服务器。
Constellation Client(星座客户端)
- 从中心点编排多设备工作流;
- 通过
target_id将任务派发到指定目标设备; - 协调跨设备的复杂 DAG 执行;
- 聚合多设备结果。
两类客户端均连接 /ws 端点并使用 REGISTER 消息注册,服务器根据 client_type 字段区分行为。值得注意的是,handle_task_request 会强制校验:设备客户端只能以自身为 target_id 运行任务,禁止向对等设备派发任务;星座客户端则必须提供 target_id 且目标必须是已连接的设备客户端。
关键能力二:会话生命周期管理
与无状态的 HTTP 服务器不同,Agent Server 在整个任务执行期间维护会话状态,支持多轮交互与结果回调。会话由 SessionManager 统一管理,内部通过 sessions、session_id_dict 等字典维护会话注册表。
会话生命周期状态机
stateDiagram-v2
[*] --> Created: create_session()
Created --> Running: Start execution
Running --> Completed: Success
Running --> Failed: Error
Running --> Cancelled: Disconnect
Completed --> [*]
Failed --> [*]
Cancelled --> [*]
note right of Running
Async background execution
Non-blocking server
end note
生命周期阶段详解
| 阶段 | 触发条件 | Session Manager 动作 | 服务器状态 |
|---|---|---|---|
| Created | HTTP 派发或 AIP TASK |
平台相关会话实例化(SessionFactory) |
生成会话 ID |
| Running | 后台任务启动 | 异步执行,不阻塞事件循环 | 等待结果 |
| Completed | TASK_END(成功) |
回调投递到客户端 | 结果缓存 |
| Failed | TASK_END(错误) |
错误回调投递 | 错误记入日志 |
| Cancelled | 客户端断连 | 取消异步任务并清理 | 会话移除 |
平台相关会话
SessionManager 根据目标平台创建不同会话类型:
- Windows:
WindowsSession,支持 UI 自动化(UIA)、COM API 集成、原生应用控制、截图; - Linux:
LinuxSession,支持 bash 自动化、GUI 工具(xdotool)、包管理、进程控制; - 自动探测或通过
--platform参数覆盖。
从源码看,SessionManager.__init__ 通过 SessionFactory 组合 create_session/create_service_session(session_manager.py#L170-L191),并根据 platform.system().lower() 自动探测平台;后台执行由 execute_task_async 启动 asyncio.create_task 完成(session_manager.py#L378-L385),保证 WebSocket 心跳与消息处理不被阻塞。
Session Manager 职责清单
- 平台抽象:屏蔽 Windows/Linux 差异;
- 后台执行:非阻塞异步任务;
- 回调路由:通过 WebSocket 投递结果(
TASK_END消息构造见 session_manager.py#L525-L533); - 资源清理:断连时取消任务;
- 结果缓存:为 HTTP 检索保存结果(
set_results/get_result)。
关键能力三:弹性通信(AIP 协议)
服务器实现了 Agent Interaction Protocol(AIP),提供结构化、类型安全的通信并自动处理失败。所有消息基于 Pydantic 模型定义与校验(见 aip/messages.py)。
协议特性
| 特性 | 实现 | 收益 |
|---|---|---|
| 结构化消息 | Pydantic 模型 + 校验 | 类型安全、自动序列化 |
| 连接健康 | 每 20-30s 心跳 | 早期失败检测 |
| 错误恢复 | 指数退避重连 | 瞬时故障容忍 |
| 状态跟踪 | 会话-客户端映射 | 断连时正确清理 |
| 消息关联 | request_id、prev_response_id 链 |
请求-响应追踪 |
心跳由 HeartbeatProtocol 实现,默认间隔 30 秒(_heartbeat_interval: float = 30.0);服务器端在 handle_heartbeat 中通过 HeartbeatProtocol.send_heartbeat_ack() 应答,维持连接健康。
断连处理流程
sequenceDiagram
participant Client
participant Server
participant SM as Session Manager
Client-xServer: Connection lost
Server->>SM: Cancel sessions
SM->>SM: Cleanup resources
Server->>Server: Remove from registry
Note over Server: Client can reconnect<br/>with same client_id
重要安全约束:当客户端(设备或星座)断连时,所有关联会话会被立即取消,防止孤儿任务与资源泄漏。从 ws/handler.py#L288-L341 的 disconnect 逻辑可以看到,设备断连时取消其设备会话(reason=device_disconnected),星座断连时取消其星座会话(reason=constellation_disconnected)。
源码中的安全设计亮点
服务器还内置了多层安全防御(可在 session_manager.py 与 ws/handler.py 中看到完整实现):
- 会话所有权绑定:
SessionOwnershipError拒绝其他客户端复用同一session_id,防止跨客户端结果回放; - 结果发送者校验:
is_authorized_result_sender确保只有执行任务的目标设备才能返回COMMAND_RESULTS,防止伪造结果注入; - 身份/角色防伪:注册时绑定
client_id/client_type,后续消息若声明不同身份将被拒绝; task_name清洗:通过sanitize_task_name阻止路径穿越(如../escape)注入日志目录。
关键能力四:双 API 接口
服务器提供两种 API 风格:面向智能体客户端的实时 WebSocket,以及面向外部系统的简单 HTTP。
WebSocket API(基于 AIP)
用途:与智能体客户端的实时双向通信。
| 消息类型 | 方向 | 用途 |
|---|---|---|
REGISTER |
客户端→服务器 | 初始能力通告 |
TASK |
服务器→客户端 | 任务分配(带命令) |
COMMAND |
服务器→客户端 | 单条命令执行 |
COMMAND_RESULTS |
客户端→服务器 | 执行结果 |
TASK_END |
双向 | 任务完成通知 |
HEARTBEAT |
双向 | 连接保活 |
DEVICE_INFO_REQUEST/RESPONSE |
双向 | 遥测交换 |
ERROR |
双向 | 错误状态上报 |
import json
import websockets
async with websockets.connect("ws://localhost:5000/ws") as ws:
# 以设备客户端身份注册
await ws.send(json.dumps({
"message_type": "REGISTER",
"client_id": "windows_agent_001",
"client_type": "device",
"metadata": {"platform": "windows", "gpu": "NVIDIA RTX 3080"}
}))
注意:当前仓库的 WebSocket 端点要求以 token 查询参数传入 API Key(见 app.py#L95-L106),服务启动时会打印自动生成的 API Key,使用时应带上该参数。
HTTP REST API
用途:外部系统(HTTP 客户端、CI/CD 等)的任务派发与监控。
| 端点 | 方法 | 用途 | 认证 |
|---|---|---|---|
/api/dispatch |
POST | 向设备派发任务 | API Key(必需) |
/api/task_result/{task_name} |
GET | 获取任务结果 | API Key(必需) |
/api/clients |
GET | 列出已连接客户端 | API Key(必需) |
/api/health |
GET | 服务器健康检查 | API Key(必需) |
从 api.py 的实现看,所有 /api/* 端点均通过 _make_auth_dependency 校验 X-API-Key 请求头(secrets.compare_digest 防时序攻击),不携带有效 Key 将返回 401;/api/dispatch 还会校验 task_name 必须匹配 [A-Za-z0-9._-] 且不能以 . 开头,防止路径穿越。
# 向设备派发任务
curl -X POST http://localhost:5000/api/dispatch \
-H "Content-Type: application/json" \
-H "X-API-Key: <your_api_key>" \
-d '{
"client_id": "my_windows_device",
"request": "Open Notepad and type Hello World",
"task_name": "test_task_001"
}'
# 响应: {"status": "dispatched", "session_id": "session_abc123", "task_name": "test_task_001"}
# 获取结果
curl http://localhost:5000/api/task_result/test_task_001 \
-H "X-API-Key: <your_api_key>"
完整端点规范见 HTTP API 参考。
工作流实战示例
完整的任务派发流程(HTTP + WebSocket 设备执行)
sequenceDiagram
participant EXT as External System
participant HTTP as HTTP API
participant SM as Session Manager
participant WSH as WebSocket Handler
participant DC as Device Client
EXT->>HTTP: POST /api/dispatch<br/>{client_id, request, task_name}
HTTP->>SM: create_session()
SM->>SM: Create platform session
SM-->>HTTP: session_id
HTTP-->>EXT: 200 {session_id, task_name}
SM->>WSH: send_task(session_id, task)
WSH->>DC: TASK message (AIP)
DC-->>WSH: ACK
rect rgb(240, 255, 240)
Note over DC: Background Execution
DC->>DC: Execute via MCP tools
DC->>DC: Generate results
end
DC->>WSH: COMMAND_RESULTS
WSH->>SM: on_result_callback()
SM->>SM: Cache results
DC->>WSH: TASK_END (COMPLETED)
WSH->>SM: on_task_end()
EXT->>HTTP: GET /task_result/{session_id}
HTTP->>SM: get_results()
SM-->>HTTP: results
HTTP-->>EXT: 200 {results}
绿色高亮部分突出设备端的异步执行——它不会阻塞服务器。实际上 /api/dispatch 通过 TaskExecutionProtocol.send_task_assignment 将任务直接下发到目标设备的 WebSocket(api.py#L90-L106),随后 SessionManager.execute_task_async 在后台运行会话并回调 send_result 将 TASK_END 结果发回请求方。
多设备星座编排工作流
sequenceDiagram
participant CC as Constellation Client
participant Server as Agent Server
participant D1 as Device 1 (GPU)
participant D2 as Device 2 (CPU)
CC->>Server: REGISTER (constellation)
Server-->>CC: HEARTBEAT (OK)
Note over CC: Plan multi-device DAG
CC->>Server: TASK (target: device_1)<br/>Subtask 1: Image processing
Server->>D1: TASK (forward)
CC->>Server: TASK (target: device_2)<br/>Subtask 2: Data extraction
Server->>D2: TASK (forward)
par Parallel Execution
D1->>D1: Process image on GPU
D2->>D2: Extract data from DB
end
D1->>Server: COMMAND_RESULTS
Server->>CC: COMMAND_RESULTS (from device_1)
D2->>Server: COMMAND_RESULTS
Server->>CC: COMMAND_RESULTS (from device_2)
Note over CC: Combine results,<br/>Update DAG
D1->>Server: TASK_END
D2->>Server: TASK_END
Server->>CC: TASK_END (both tasks)
服务器在此扮演消息路由器:将任务转发到目标设备,并将结果路由回星座编排器。任务完成时回调会同时向星座客户端与目标设备发送 TASK_END(ws/handler.py#L828-L855)。更多多设备编排细节见 Constellation 文档。
平台支持
服务器自动探测客户端平台并创建相应会话实现。
| 平台 | 会话类型 | 能力 | 状态 |
|---|---|---|---|
| Windows | WindowsSession |
UI 自动化(UIA)、COM API 集成、原生应用控制、截图 | 完整支持 |
| Linux | LinuxSession |
Bash 自动化、GUI 工具(xdotool)、包管理、进程控制 | 完整支持 |
| macOS | (规划中) | AppleScript、UI 自动化、原生应用控制 | 开发中 |
平台自动探测与覆盖
服务器在客户端注册时自动探测平台。可通过 --platform 参数全局覆盖,用于测试或特定部署场景:
python -m ufo.server.app --platform windows # 强制 Windows 会话
python -m ufo.server.app --platform linux # 强制 Linux 会话
python -m ufo.server.app # 自动探测(默认)
何时使用 --platform 覆盖:
- 在无真实设备时测试跨平台会话;
- 服务器容器平台与目标平台不同;
- 调试特定平台的会话行为。
配置详解
服务器开箱即用,带有合理的默认配置。高级配置继承自 UFO 的中央配置系统。
命令行参数
python -m ufo.server.app [OPTIONS]
从 app.py 的 parse_args 源码确认,可用选项如下:
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--port |
int | 5000 | 服务监听端口 |
--host |
str | 127.0.0.1 |
绑定地址(0.0.0.0 仅用于需远程访问时) |
--api-key |
str | 自动生成 | HTTP/WebSocket 认证 API Key(不提供则自动生成并打印) |
--platform |
str | 自动探测 | 强制平台(windows、linux、mobile) |
--log-level |
str | WARNING |
日志级别(DEBUG、INFO、WARNING、ERROR、CRITICAL、OFF) |
--local |
flag | False | 仅限本地连接 |
配置示例:
# 开发环境:仅本地 + 调试日志
python -m ufo.server.app --local --log-level DEBUG --port 8000
# 生产环境:外部访问 + info 日志
python -m ufo.server.app --host 0.0.0.0 --port 5000 --log-level INFO
# 测试:强制 Linux 会话
python -m ufo.server.app --platform linux --port 9000
补充说明(与文档默认值略有差异,以源码为准):当前仓库源码中 --host 默认绑定 127.0.0.1 以保证本地安全,--log-level 默认 WARNING;文档表格中给出的 0.0.0.0 与 INFO 更适合作为显式指定的生产参数。此外服务器以 uvicorn 启动并设置 ws_max_size=100MB(app.py#L145),支持大消息传输。
UFO 配置继承
服务器使用 UFO 的中央配置(config_dev.yaml 或 config/config_loader.py 加载的配置):
| 配置节 | 继承设置 |
|---|---|
| Agent Strategies | HostAgent、AppAgent、EvaluationAgent 配置 |
| LLM Models | 模型端点、API Keys、temperature 设置 |
| Automators | UI 自动化、COM API、Web 自动化配置 |
| Logging | 日志文件路径、轮转、格式 |
| Prompts | 智能体系统提示词、示例模板 |
例如 session_manager.py#L17 通过 get_ufo_config() 读取配置,并用 ufo_config.system.eva_session 控制会话是否启用评估(session_manager.py#L174-L190)。完整配置文档见 Configuration Guide。
监控与运维
健康监控
# 服务器健康与在线状态
curl http://localhost:5000/api/health -H "X-API-Key: <your_api_key>"
# 响应:
# {
# "status": "healthy",
# "online_clients": [...]
# }
# 已连接客户端列表
curl http://localhost:5000/api/clients -H "X-API-Key: <your_api_key>"
# 响应:
# {
# "online_clients": ["windows_001", "linux_002", ...]
# }
完整的监控策略(性能指标采集、日志聚合模式、告警配置、仪表盘搭建)见 Monitoring Guide。
错误处理矩阵
服务器优雅处理常见失败场景以维持系统稳定性。
| 场景 | 服务器检测 | 自动动作 | 客户端影响 |
|---|---|---|---|
| 设备断连 | 心跳超时 / WebSocket 关闭 | 取消设备会话、通知星座 | 任务失败,星座重试 |
| 星座断连 | 心跳超时 / WebSocket 关闭 | 继续设备执行、跳过回调 | 设备完成但结果未投递 |
| 任务执行失败 | TASK_END 带错误状态 |
记录错误、存入结果 | 客户端经回调/HTTP 收到错误 |
| 网络分区 | 心跳超时 | 标记断连、启用重连 | 客户端以相同 ID 重连 |
| 服务器崩溃 | 不适用 | 客户端经心跳探测 | 客户端重连到新实例 |
重连支持:客户端可用相同 client_id 重连,服务器会重新注册客户端并恢复心跳监控,但不会恢复之前的会话(会话是临时的)。
最佳实践
开发环境
# 隔离到 localhost,开启详细日志
python -m ufo.server.app \
--host 127.0.0.1 \
--port 5000 \
--local \
--log-level DEBUG
开发清单:
- 使用
--local标志防止外部访问; - 开启
DEBUG日志获得详细追踪; - 单独终端监控日志:
tail -f logs/ufo_server.log; - 先单设备测试再添加多客户端;
- 使用 HTTP API 快速测试任务派发;
- 用客户端断连验证心跳监控。
开发测试模式(三终端):
# 终端 1:调试日志启动服务器
python -m ufo.server.app --local --log-level DEBUG
# 终端 2:连接设备客户端
python -m ufo.client.client --ws --ws-server ws://127.0.0.1:5000/ws
# 终端 3:派发测试任务
curl -X POST http://127.0.0.1:5000/api/dispatch \
-H "Content-Type: application/json" \
-H "X-API-Key: <your_api_key>" \
-d '{"client_id": "windowsagent", "request": "Open Notepad", "task_name": "test_001"}'
生产部署
默认配置并非生产就绪,需要落实以下安全与可靠性措施。
生产架构:
graph LR
Internet[Internet]
LB[Load Balancer<br/>nginx/HAProxy]
SSL[SSL/TLS<br/>Termination]
subgraph "UFO Server Cluster"
S1[Server Instance 1<br/>:5000]
S2[Server Instance 2<br/>:5001]
S3[Server Instance 3<br/>:5002]
end
Monitor[Monitoring<br/>Prometheus/Grafana]
PM[Process Manager<br/>systemd/PM2]
Internet --> LB
LB --> SSL
SSL --> S1
SSL --> S2
SSL --> S3
PM -.Manages.-> S1
PM -.Manages.-> S2
PM -.Manages.-> S3
S1 -.Metrics.-> Monitor
S2 -.Metrics.-> Monitor
S3 -.Metrics.-> Monitor
生产清单:
| 类别 | 建议 | 理由 |
|---|---|---|
| 反向代理 | nginx、Apache 或云负载均衡 | SSL 终止、限流、DDoS 防护 |
| SSL/TLS | 启用 WSS(WebSocket Secure) | 加密客户端-服务器通信 |
| 认证 | 为 FastAPI 添加认证中间件 | 防止未授权访问 |
| 进程管理 | systemd(Linux)、PM2(Node.js)、Docker | 崩溃自动重启、资源限制 |
| 监控 | /api/health 轮询、指标导出 |
主动发现问题 |
| 日志 | 结构化日志、日志聚合(ELK) | 集中化调试与审计追踪 |
| 资源限制 | 设置最大连接数、内存上限 | 防止资源耗尽 |
Nginx 配置示例:
upstream ufo_server {
server localhost:5000;
}
server {
listen 443 ssl;
server_name ufo-server.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# WebSocket 端点
location /ws {
proxy_pass http://ufo_server;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 3600s;
}
# HTTP API
location /api/ {
proxy_pass http://ufo_server;
proxy_set_header Host $host;
}
}
扩展策略
服务器可水平扩展以应对高负载部署,但需要谨慎的会话管理。
| 模式 | 描述 | 适用场景 | 注意事项 |
|---|---|---|---|
| 垂直扩展 | 单实例增加 CPU/内存 | < 100 并发客户端 | 最简单,无会话分发 |
| 水平扩展(粘性会话) | 多实例 + 会话亲和 | 100-1000 客户端 | 负载均衡将同一客户端路由到同一实例 |
| 水平扩展(共享状态) | 多实例 + Redis | > 1000 客户端 | 需要会话状态外部化 |
当前限制:当前实现将会话状态保存在内存中(见 session_manager.py#L65-L89 的内存字典结构)。水平扩展时应使用粘性会话(客户端亲和)让负载均衡将客户端路由到一致实例。未来规划:基于 Redis 的共享状态后端,实现真正的无状态水平扩展。
故障排查
常见问题
问题:客户端无法连接
# 症状:连接被拒绝
Error: WebSocket connection to 'ws://localhost:5000/ws' failed
# 诊断:
1. 检查服务器是否运行: curl http://localhost:5000/api/health -H "X-API-Key: <key>"
2. 验证端口: netstat -an | grep 5000
3. 检查防火墙: sudo ufw status
# 解决:以正确的 host 绑定启动服务器
python -m ufo.server.app --host 0.0.0.0 --port 5000
问题:会话不执行
# 症状:任务已派发但无结果
# 诊断:
1. 检查服务器日志错误
2. 确认客户端已连接: curl http://localhost:5000/api/clients -H "X-API-Key: <key>"
3. 检查 target_id 是否匹配 client_id
# 解决:确保请求中的 client_id 与已注册客户端一致
curl -X POST http://localhost:5000/api/dispatch \
-H "X-API-Key: <your_api_key>" \
-d '{"client_id": "correct_client_id", "request": "test", "task_name": "test_001"}'
问题:内存泄漏 / 内存占用过高
# 症状:服务器内存随时间增长
# 诊断:
1. 检查日志中的会话清理
2. 监控 /api/health 的会话数
3. 使用 memory_profiler 分析
# 解决:
# 确保客户端发送 TASK_END 完成会话
# 定期重启服务器(systemd 可处理)
# 实现会话超时(未来特性)
调试模式
# 最大冗余度调试
python -m ufo.server.app \
--log-level DEBUG \
--local \
--port 5000 2>&1 | tee debug.log
# 实时观察日志
tail -f debug.log | grep -E "(ERROR|WARNING|Session|WebSocket)"
相关文档导航
快速上手
| 文档 | 用途 |
|---|---|
| Quick Start | 5 分钟内跑通服务器 |
| 客户端注册 | 客户端如何连接服务器 |
架构与组件
| 文档 | 用途 |
|---|---|
| Session Manager | 任务执行生命周期深度剖析 |
| Client Connection Manager | 连接注册表内部机制 |
| WebSocket Handler | AIP 协议消息处理 |
| HTTP API | REST 端点规范 |
运维
| 文档 | 用途 |
|---|---|
| Monitoring | 健康检查、指标、告警 |
关联文档
| 文档 | 用途 |
|---|---|
| AIP 协议 | 通信协议规范 |
| Agent 架构 | 智能体设计与 FSM 框架 |
| 服务器-客户端架构 | 分布式架构设计依据 |
| 客户端概览 | 设备客户端架构 |
| MCP 集成 | Model Context Protocol 工具服务器 |
下一步学习路径
1. 运行服务器(5 分钟)
- 跟随 Quick Start Guide;
- 验证
/api/health正常响应。
2. 连接客户端(10 分钟)
- 使用 Device Client;
- 在服务器日志中确认注册成功;
- 检查
/api/clients端点。
3. 派发任务(15 分钟)
- 使用 HTTP API 发送任务;
- 通过
/api/task_result获取结果; - 在日志中观察 WebSocket 消息流。
4. 理解架构(30 分钟)
- 阅读 Session Manager 内部机制;
- 研究 WebSocket Handler 协议实现;
- 回顾 AIP 协议 消息类型。
5. 部署到生产(时间不定)
- 配置反向代理(nginx);
- 配置 SSL/TLS;
- 实现监控;
- 测试故障转移场景。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust4.26 K641- DDeepSeek-V4.1-FlashDeepSeek-V4.1-Flash 是一个多模态混合专家(MoE)模型,拥有 5520 亿骨干参数,并支持最多一百万 token 的上下文长度。该模型原生支持图像和文本输入,并以自回归方式生成文本Python870
SlideSCIPPT插件,支持素材库、AI助手、一键添加图片标题,复制粘贴位置、一键图片对齐、一键插入Markdown(加粗、超链接等行内样式、代码块、LaTeX等块级样式)、便捷导出图片!C#611
Agent-Reach给你的 AI Agent 一键装上互联网能力。13 个平台(网页/GitHub/YouTube/小红书/B站/Twitter/Reddit 等)多后端路由,当下最稳的接入方式替你选好、装好、体检好。GitHub 主仓库同步镜像。Python1284
new-apiAI模型聚合管理中转分发系统,一个应用管理您的所有AI模型,支持将多种大模型转为统一格式调用,支持OpenAI、Claude、Gemini等格式,可供个人或者企业内部管理与分发渠道使用。🍥 A Unified AI Model Management & Distribution System. Aggregate all your LLMs into one app and access them via an OpenAI-compatible API, with native support for Claude (Messages) and Gemini formats.Go23245
JeecgBoot🔥企业级低代码平台集成了AI应用平台,帮助企业快速实现低代码开发和构建AI应用!前后端分离架构 SpringBoot,SpringCloud、Mybatis,Ant Design4、 Vue3.0、TS+vite!强大的代码生成器让前后端代码一键生成,无需写任何代码! 引领AI低代码开发模式: AI生成->OnlineCoding-> 代码生成-> 手工MERGE,显著的提高效率,又不失灵活~Java37451