Tobatsu 2.0 · 方案
内部 Agent 通过 API 改一份 Dockerfile,系统自动构建 + 验证 + 上线;模板按名字引用,新任务自动用当前版本。
目标:一个模板缺依赖时,Agent 自己就能改 runtime——改 Dockerfile → 平台自动建 + 验证 → 候选 → 测试 → 升正式。没人手敲镜像、没人手改仓库。
前提(owner 定):用户都是信得过的内部 Agent。不做精细权限、不做 typed validation、不做依赖结构化模型。先把"能自助改 runtime 并自动构建"跑通。
docker/runtime-basic/Dockerfile 搬进库)。tobatsu-runtime-basic),不写版本号。_test 验 → 升正式 → 引用它的模板新任务自动用新版。好消息:下半截基本都在,只缺"Dockerfile 进库 + 接口 + 自动触发"。
runtime_version_pin_forbidden)。这块锁死了,不碰。poll_image_build_requests.py + 定时器)、构建脚本、runtime_profiles(名字+候选/正式)、候选→升级、worker 收敛——都在。runtime_dockerfile_revisions
id · runtime_id(稳定ID) · name(稳定名字) · revision(内部递增,模板不引用) · dockerfile_content(完整文本) · parent_runtime_id(从谁分叉) · base_revision_id · content_sha256 · smoke_command(可空,Agent 自带的一条附加验证) · created_by/at
最新版 = 同 runtime_id 下 revision 最大那行;回滚 = 再插一条复制旧内容。一张表够,revision 行本身就是历史。
扩 image_build_requests 三个可空字段:runtime_dockerfile_revision_id / runtime_name / log_path。老的 commit-only 构建请求照常工作。
| 接口 | 干什么 |
|---|---|
| GET /runtimes | 列出所有 runtime + 最新版 + 构建状态 + 当前 active/canary |
| GET /runtimes/{name} | 读一个 runtime 的 Dockerfile、父、构建状态 |
| POST /runtimes | 分叉:从某 base 拷一份成新 runtime,立即建 |
| PUT /runtimes/{name}/dockerfile | 主入口:改 Dockerfile → 插新版 → 同事务建 → 自动 CI |
| POST /runtimes/{name}/pull-base | 拉最新 base(Agent 自己合好的 Dockerfile,不做自动 merge) |
| POST /runtime-profiles/{id}/set-canary | 候选设成 canary(测试环境优先解析它) |
| POST /runtime-profiles/{id}/promote-active | 验过升正式(旧 active 归档) |
RUNTIME_DOCKERFILE_PATH + 可选 smoke command)。fc-match Montserrat)→ 注册候选 profile。_test 验 → promote-active。只让构建输入从"仓库固定 Dockerfile"变成"DB 里这条 Dockerfile",其余复用现有链路。
分叉把影响圈在 Mai,不让 MB/别的模板跟着换镜像。等字体确认是全平台通用,再合进 base。
POST /runtimes 从 base 分叉出 mai-runtime。PUT .../dockerfile 加字幕字体 + fc-match smoke → 自动建候选。set-canary → Mai 的 _test(配 runtime_name=mai-runtime,不写版本)发真单,快照钉 canary digest。promote-active → Mai prod 模板配同一个名字,新任务自动用 active。内部可信 Agent 直接改 Dockerfile,API 保存 + 触发 CI。先把闭环跑通。
smoke_command 是原始 shell、不是安全边界 —— 只给内部可信 Agent。pull-base。源:codex 最简稿 /tmp/codex-runtime-customization-plan.md + cc 代码核实。— 待 owner 拍 → 进入实现清单(DB migration → seed base → API → CI → Mai 首用)。