9 月 30 日上午,OpenAI 发布全天候智能体 Dot:GPT-6 Astra 驱动,配一台独立云端计算机,靠插件生态连 4000 多款应用,定位是全天候在线的虚拟雇员,会主动汇报进度,也能直接提交 PR。同一天开发者日的台上,主讲人让它为一款虚构音乐应用准备上线工作,智能体迟迟没有回应,演示被迫暂停。企业方事后没有说明原因,我也不知道原因,所以不打算编一个。
它提醒我一件事:主打随时待命的东西,难点不在会说话,在常驻。常驻意味着它是一套资源,不是一次调用。是资源就得讲基础设施那套规矩:配置能声明,上线前能校验,改坏了能回滚,动手之前能预演。
百炼 CLI 里有一整条 bl managed-agent。本机 bl 是 2.1.0(2026-09-28 发布),我从 2.0.1 升级之后重读了一遍命令面才开始实测:72 条子命令,覆盖 7 类资源,其中 14 条标 No Auth。实测跑在 9 月 30 日 12:56 到 13:30,声明、校验、版本、回滚、预演五件事全部跑通,一分钱没花,一个云资源没建。
Dots 说的每一项能力,在命令面里都有对应资源
bl managed-agent 管的 7 类资源是 Agent、Environment、Skill、Vault、Deployment、Session、File。把 Dot 发布会上的部件逐个对过去,落点是齐的。
| Dot 的说法 | 百炼这边的资源 |
|---|---|
| 一台独立云端计算机 | Environment,config.type 只有 cloud 与 self_hosted |
| 连 4000 多款应用 | Skill,以及声明里的 tools.builtin |
| 员工要拿密钥,不能外泄 | Vault,凭据字段写 secret_value: ${SERVICE_TOKEN} |
| 全天候待命,也要能被按停 | Deployment,配 pause 与 unpause |
| 主动汇报进度 | Session 的 events 与 event stream |
| 提交 PR 要带的素材 | File,upload 与 download |

资源类型对得上只是前提。差别在下面四环,每一环都有对应命令,都能在本地验证。
声明:一份 agents.yaml,密钥不进版本库
装 CLI 两条路,官方 skill 包让 coding agent 代跑,或者终端执行 npm install -g bailian-cli,命令一致。
bl managed-agent init 一次落两个文件:agents.yaml 与 .gitignore。模板里 provider 段只写环境变量引用,api_key: ${DASHSCOPE_API_KEY}、base_url: ${BAILIAN_BASE_URL},密钥不落文件。.gitignore 挡掉三项:agents.state.json(本地状态记录)、.openagentpack/versions/(版本快照目录)、.env。这三样恰好是一个 Agent 工程最容易被人顺手提交出去的东西。
Agent 段声明 model、instructions、environment、tools.builtin,环境段声明 type 与 networking。整份配置是可 review 的文本,这是后面三环能成立的原因。
校验:拦形状和交叉引用,不查目录存在性
bl managed-agent validate 的 help 写得很直白:Runs fully offline against local files。这句话决定了它能帮你到哪一步。我按它造了 10 个改坏的配置挨个喂进去,结果是拦下 6 类、放行 4 类。
拦下:引用未定义的 environment(退出码 1,错误码 config.agent.environment.unknown)、缺 instructions、YAML 语法错、networking.type 越界、${VAR} 指向未设置的环境变量、config.type 越界,后五条退出码都是 2。
放行:模型名不存在(qwen3.8-max-not-real 照过)、工具名不存在(teleport 照过)、version 字段随便写(模板是 "1",改成 "0" 和 "99" 都过)、agents: {} 一个 Agent 都不配。
这 4 类落在能力边界上,不在缺陷清单里:离线拿不到模型目录,也拿不到工具注册表,同文件里的交叉引用查得到,全局目录查不到。provider 白名单硬拦,报错给中英两份;type: self_hosted 被拒时报 bailian.environment.self_hosted.unsupported,并给出改用 cloud 或钉到 qoder provider 的修法。
退出码是三层协议:0 通过,1 语义诊断(消息带 [...] 错误码,进 diagnostics[]),2 模式与解析层拒绝。失败态下 validate --output json 的 stdout 仍然是合法的单一 JSON,{"error": {...}} 信封走 stderr,CI 里能直接 jq。
版本:内容寻址存储,git 的语义
bl managed-agent project init --project . 把单文件 YAML 摊成目录工程:agents/assistant/agent.json 放资源声明,agents/assistant/instructions.md 放提示词,agents/assistant/environments/dev/ 放环境。
版本存储是内容寻址的。.openagentpack/versions/project/ 下面是 blobs/、entries/、manifests/,文件名全按 SHA-256 命名。一条版本 entry 里带 parent_version、tree_hash、yaml_hash、created_by、created_at、message。父版本串成链,哈希指内容,created_by 记人。管的是 Agent 配置,语义是 git 那套。
回滚我实测跑通了。把 agent.json 里的 model 改成 broke-during-iteration,project version status 立刻从 source_status: clean 变 modified,project_revision 换了哈希。project version preview 把改之前的 before_yaml 渲染出来,project version restore --version-id <id> --yes 跑完,model 回到 QWEN-CUSTOM-MODEL,状态回到 clean。
restore 的帮助文本挂着风险标注。Risk: high,原文是 This restores the full directory source to the working tree. Version history and remote State will not move。配置退到了上一版,云上跑着的 Agent 还在按新版活着。本地回滚不等于线上回滚,线上那一半要再走 apply。
project build 不推进版本链,build 完 version list 还是一条。记版本要 publish,publish 要 Key。离线能验证的版本管理,到看历史、预览、回滚为止。
迁移这一步要单独提醒。project init 不带 --project . 时返回 converted_from_yaml: false,另建一个 managed-agent/ 子目录,里面是全新的 stock 工程,我 YAML 里改过的 model 一点没带走;带上才返回 true。同一趟还暴露一个不一致:bl managed-agent init 的模板默认模型是 qwen3.8-max,project init 建的目录工程默认是 qwen3.7-max,两个脚手架默认值不同。

预演:plan 讲 terraform 的语言,也确实只读
bl managed-agent plan 要 Key,但只读。输出是这三行:+ environment.dev (bailian)、+ agent.assistant (bailian)、Plan: 2 to create, 0 to update, 0 to destroy。
只读两个字我不太放心,跑完立刻查一次 bl managed-agent state list,返回 No resources tracked in state.。state 文件从头到尾是空的,这就是 0 元、0 云资源这句承诺的凭据。
再往下走到 apply 要 Key,在这里签一个。它先刷新云端状态、再按依赖创建或更新、执行前要加 --yes,会真的改资源,所以我没跑。
我停在哪,以及这条命令面的边界
apply、publish、session create、deployment run 一个没跑。它们会创建持久资源、会真调模型、会计费。所以 Agent 上线要等多久、流式响应长什么样、deployment 排程有多少延迟、模型名写错会不会在 apply 被打回,这几件事我不知道。OpenAI 那次演示卡在哪一层,我同样不清楚,不做因果推测。
生态视角下值得记的是那个比例:72 条子命令里 14 条 No Auth,全部落在声明、校验、版本、回滚这条主干上,不登录就能跑完,CI 能在一个没有云资源的环境里吃这套退出码。剩下那批命令管真资源的生命周期,边界按计费走。
覆盖面还有一处:file 资源的 source 指向根本不存在的本地文件,project validate 照样回 Project is valid (5e5ad44f0ec6)。本地文件在不在是伸手就能查的离线项,它没查;未知 skill 引用却被立刻拦下,所以这是覆盖面问题。validate 返回绿,不等于配置里每一处都对。
