Remote Workspace 远程工作区
让用户在浏览器中选择远程机器,启动 AI 编码会话,AI CLI 直接运行在远程机器上——无需 SSH,无需重复配置。
本页从服务器视角介绍该功能:架构、管理员配置、API 与安全设计。Agent 侧的运维内容(安装器 TLS 参数详解、启停脚本、
config.json配置项、openace命令行工具、终端服务器细节)见 REMOTE_AGENT.md,该页也链接回本页。
目录
概述
解决什么问题
Open ACE 工作区默认只能在服务器本机运行。用户需要操作远程机器(如开发/测试服务器)时,必须每次在会话中指示 AI 通过 SSH 连接远程机器,频繁提供凭据且容易遇到 SSH 故障。
如何解决
远程工作区功能让用户在创建会话时选择远程机器。AI CLI 直接运行在远程机器的 Agent 上,通过服务端代理访问 LLM API。所有 API Key 永远不会离开服务器。
核心特性
| 特性 | 说明 |
|---|---|
| 多 CLI 支持 | Qwen Code、Claude Code、OpenClaw 等 |
| API Key 代理 | Key 加密存储在服务器,远程 Agent 只拿到短生命周期、可回收的代理令牌 |
| 一行安装 | curl ... | bash 完成远程机器部署 |
| 统一配额 | 本地和远程会话共享同一套配额体系 |
| 自动重连 | Agent 断线后指数退避自动重连 |
架构
[浏览器 UI] <--HTTP/WS--> [Open ACE 服务器] <--HTTP 轮询--> [远程 Agent]
| |
[API Key 加密存储] [qwen-code-cli]
[配额管理器] [claude-code]
[会话管理器] [openclaw]
消息流
- 用户在浏览器输入消息 →
POST /api/remote/sessions/{id}/chat - 服务器将命令排队,等待 Agent 通过 HTTP 轮询拉取
- Agent 将消息喂给 CLI 子进程
- CLI 需要 LLM 调用 → 请求发往
POST /api/remote/llm-proxy - 服务器校验配额、注入真实 API Key、转发到 LLM 提供商
- LLM 流式响应:提供商 → 服务器 → Agent → 服务器 → 浏览器
- 服务器记录 Token 用量
通信方式
Agent 与服务器之间只有一种传输方式:
| 方式 | 状态 | 适用场景 | 特点 |
|---|---|---|---|
| HTTP 轮询 | 已实现,且是唯一传输方式 | 所有场景 | Agent 主动 POST 到 /api/remote/agent/message,服务器返回待执行命令,兼容性好 |
| WebSocket | 已移除 | - | 旧端点 GET /api/remote/agent/ws 已弃用,现在固定返回 410 Gone,提示改用 HTTP 轮询 |
不再存在"先试 WebSocket、失败再降级"的逻辑:当前版本的 Agent 只使用 HTTP 轮询,命令传输也不需要服务端部署任何 WebSocket worker(gevent 等)。
部署拓扑与运行态边界
Remote Workspace 可以运行在仓库提供的 Kubernetes 参考部署后面。可共享的控制面状态已经持久化,实时 socket bridge 仍保留在进程内:
- HTTP polling 命令队列、命令响应、session-to-machine 绑定、会话输出回放、远程机器、会话、消息、配额和审计记录均已持久化。
- 发送消息、暂停、恢复、停止、终止请求、切换模型和权限响应等远程会话控制 API 可以由任意 Web Pod 服务;下一次 Agent poll 会 claim 已持久化的命令。
- SSE 重连可以在浏览器断开或 Web Pod 重启后回放已持久化的会话输出。
- 实时终端 relay WebSocket 对象仍是进程内对象。活跃的浏览器到 Agent 终端 bridge 应使用粘性路由,或在故障转移后重新连接。
当前租户隔离覆盖用户、项目、工作区会话与消息、每日用量聚合、审计日志、远程机器、会话所有权、机器权限和配额。系统管理员有意保留全局运维可见性,用于支持和故障处理。
部署检查清单
从零到可用,按顺序完成以下步骤:
服务端(Open ACE 服务器)
# 1. 确认代码已更新到包含远程工作区模块
ls app/modules/workspace/api_key_proxy.py \
app/modules/workspace/remote_agent_manager.py \
app/modules/workspace/remote_session_manager.py \
app/routes/remote.py
# 2. 运行数据库迁移(创建 remote_machines、machine_assignments、api_key_store 表)
cd /path/to/open-ace
alembic upgrade head
# 3. 设置加密密钥(生产环境强烈推荐)
export OPENACE_ENCRYPTION_KEY="<your-random-32byte-key>"
# 或使用 openssl 生成:openssl rand -hex 32
# 4. 重启服务
sudo systemctl restart open-ace # 或你的启动方式
# 5. 验证 API 可访问
curl -s http://localhost:19888/api/remote/agent/install.sh | head -5
# 应该输出安装脚本内容
管理员操作
# 1. 管理员登录
curl -c cookies.txt -X POST http://<server>:19888/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"admin123"}'
# 2. 存储 LLM API Key(远程会话必需)
curl -b cookies.txt -X POST http://<server>:19888/api/remote/api-keys \
-H "Content-Type: application/json" \
-d '{
"provider": "openai",
"key_name": "production",
"api_key": "sk-xxx...",
"base_url": "https://api.openai.com/v1"
}'
# 3. 生成注册令牌
curl -b cookies.txt -X POST http://<server>:19888/api/remote/machines/register \
-H "Content-Type: application/json" \
-d '{"tenant_id": 1}'
# → {"registration_token": "abc123..."}