execution-environments.md 7.5 KB

系统运行环境、服务授权与虚拟机网络

在 Bot 设置 → 环境与授权 中由管理员统一配置。Hermes 继续运行主模型和会话。默认运行环境决定未指定目标时的执行位置;各环境开关与设备、Bot 授权独立决定可用能力,可以同时允许多个环境。

默认运行环境 未指定目标时的行为
不指定 按任务选择已允许的环境;目标不明确时澄清
服务器本机 优先在 Hermes 所属节点执行;虚拟机、其他电脑和浏览器仍可按授权使用
虚拟环境 脚本优先通过 computer_* 在 Bot 对应的虚拟机中执行;其他已允许的环境仍可使用

用户明确指定的目标优先于默认值。托管浏览器已开启且可用时,未指定浏览器或设备的“打开网页”“打开百度”“用浏览器”默认使用托管浏览器,也优先于默认运行环境;明确指定其他浏览器、使用该环境已有登录或继续操作已指定页面时沿用相应目标。未开放、未授权、离线及人工接管仍分别校验,不能借默认值绕过。

每轮绑定默认环境版本,更改从下一轮生效。旧版将默认环境当成独占限制的会话首次进入新逻辑时重建,保留对话记录,清除遗留的环境限制;后续正常复用。现有安装仍默认服务器本机,新安装不指定,但这些默认值不再关闭其他环境。原生工具和 Skill 沿用 Hermes Profile 已开放的权限,已授权 MCP(包括 stdio)与已连接应用不因默认位置被排除。

原生工具始终跟随 Hermes 节点。Yaoyao 的服务器桌面桥只在默认 Hermes 使用回环地址直连时挂载,并要求原有桌面授权;远程 Hermes 不会借用 Yaoyao 主机桌面。server 明确指服务器,local/“本机”及省略目标仍按本轮消息来源电脑解析;未知来源不能猜测。已授权电脑之间及电脑与虚拟机之间可显式传文件。

系统变量与授权

配置使用现有服务器加密密钥密封保存到系统空间;管理接口只回显名称、用途、变量名和 Bot 授权列表。新增 Bot 没有默认使用权限。账号级已连接应用保持原有归属,不自动升级为全系统共享凭据。

资源授权不依赖默认运行环境。API 服务通过获准的服务工具使用;系统变量和临时登录文件只在实际调用虚拟机脚本时注入,不注入 Hermes 或桌面宿主进程,也不自动复制其他设备的登录态。在服务器执行的原生工具继续使用该节点的原有配置和登录。

支持三类系统资源:

  • 环境变量:JSON 字符串映射,按资源授予 Bot。保留运行时内部变量、进程加载选项、HOME/PATH 和网络代理变量,防止覆盖执行边界。同一 Bot 的变量名不能重复。
  • API 服务:管理员指定 HTTPS 根地址、Bearer 令牌,以及可选的脚本变量名。适用于服务本身发行的模型或生图 API 密钥;yaoyao_service_request 只接受该根路径下的请求,不跟随重定向。具体请求格式由 Skill 指定。返回体上限 8 MiB,超大的图像响应应通过虚拟机 SDK 写入文件再导出。
  • Codex CLI 登录:显式导入 auth.json,仅在虚拟机命令期间生成临时 CODEX_HOME;CLI 必须已安装。登录文件采用临时副本,CLI 的续期结果不回写全系统授权;到期后由管理员重新导入。它不会被解释为通用生图 API 密钥。Grok Bot 云登录同样不能直接当作 xAI API 密钥。

普通接口、模型提示和工具参数不含凭据。Runner 在任务授权有效时通过专用接口读取任务环境;值不写入命令队列或全局进程环境。命令通过 stdin 收到变量和文件,临时文件结束后清理,常见输出中的凭据值被隐藏。授权变更或撤销使旧任务后续调用失效。

共享虚拟机内的程序属于同一个操作系统用户。为避免把一个 Bot 的凭据暴露给未获授权的同机成员,注入脚本变量前会检查共享成员均获准使用相应资源;否则应选择独立环境或使用后端服务工具。

虚拟机代理

启用后,所有受管虚拟环境使用独立网络网关的命名空间。网关只有 lo 与 tun0,没有可以直连公网的网卡;桌面容器没有 NET_ADMIN 权限。tun2socks 将所有 TCP 转交给 Runner 的受控连接代理,支持 HTTP CONNECT 和 SOCKS5 上游认证。上游密码留在 Runner 内存,不放进桌面或网关镜像。

DNS 在虚拟机内映射为临时地址,连接时还原域名;Runner 经同一上游代理查询 DNS over HTTPS,并检查实际目标地址。继续限制为公网 80/443,拒绝内网、宿主、元数据地址以及其他端口。UDP/QUIC、IPv6 直接出口不开放;无法代理的流量不会改为直连。关闭代理保留原有网络行为:动态环境使用原来的受控应用代理,旧 Compose 环境保持断网。

修改代理先关闭旧通道并结束相关虚拟机工具任务,之后使用新配置。节点状态区分离线、旧版本、待更新、未生效与已同步,并提示缺少网络网关等具体原因;已同步后仍会在实例启动时检查出口隔离。代理测试从执行节点发起,先检查网络网关,再测试已保存的代理连接,不代表某个服务的账号授权有效。服务器本机命令、Hermes 模型请求、托管浏览器及 Yaoyao 后端代发的 HTTP 服务/MCP 请求使用各自的网络配置。

更新部署

  1. 更新 Web、Runner 和 Hermes 工具桥。工具桥改动需要重新加载 Hermes,不能只复制文件。
  2. 动态 Docker/Podman:重新准备一次虚拟机镜像,会同时构建 localhost/yaoyao/network:1。需容器运行时支持 /dev/net/tun 和隔离网关的 NET_ADMIN;业务容器不会获得它们。
  3. Compose:使用重新生成的 compose.desktops.yaml 或 compose.desktops.cursor.yaml 构建并更新部署。每个桌面新增一个网络网关和独立 IPC 卷,Web 只读挂载该卷;桌面不挂载网关 IPC。自定义清单须增加 networkSocketPath,缺失时明确拒绝启用。
  4. 在设置页保存代理并测试。旧实例的工作目录保留,网络模式变化由现有资源池在释放后重建容器。

网关基于 tun2socks 官方 Linux 配置,固定使用 v2.6.0 源码构建;与示例不同,本实现没有备用直连网卡。

接口与验证

管理员接口前缀 /api/app/admin/execution:GET /、PUT /environment、PUT /proxy、POST /proxy/test,以及 /resources 的新增、按 ID 更新和删除。更新使用配置版本防止覆盖并发编辑;密钥字段省略表示保留,代理密码传空字符串表示清除。

Runner 新增 execution-context-v1 和 vm-egress-v1 能力、仅机器认证可访问的任务环境/网络配置接口,以及 network.configure、network.test 指令。任务上下文回调仍绑定原连接、Bot、账号和本轮授权。

自动测试覆盖管理员边界、默认环境与多环境授权独立、旧会话迁移、托管浏览器优先、跨电脑文件传输与消息来源、加密存储、Bot 授权撤销与共享成员检查、服务请求范围、命令临时文件清理、HTTP/SOCKS5 握手与经代理的 TLS DNS 请求、代理并发切换与失效连接回收及表单行为;tests/live/managedNetwork.live.test.ts 使用真实 Docker 验证无代理变量的 TCP 程序、DNS、代理故障无直连、业务 root 无网络管理权以及资源清理。