把 Taiji / TAAC 训练与评估平台变成任何人和任何 agent 都能读取、比较、归档、提交训练、发布模型和收集线上评估证据的实验命令行工具。
TAAC2026 CLI 面向 https://taiji.algo.qq.com/training、/model 和 /evaluation:它可以抓取训练任务、指标、日志、checkpoint、代码文件,比较两个 config.yaml 的语义差异,发布 checkpoint 为模型,创建/停止/抓取评估任务,并通过已捕获的 Taiji API 流程准备、上传、创建和启动训练任务。所有本地产物默认收进 outputs/taiji-output/,不会把根目录弄得一团乱。
SKILL.md 是通用 agent 操作手册:Codex、Claude Code、OpenAI Agents SDK、Cursor、Aider,或者任何能读仓库文件并运行 shell 的 agent,都可以按它来使用本 CLI。
直接把这段话发给你的 agent:
请安装并使用这个通用 agent CLI:
https://github.com/ZhongKuang/TAAC2026-CLI.git
安装后请运行 npm install。需要全局 CLI 时运行 npm link。
需要浏览器模式时再安装 Chromium:
npx playwright install chromium
手动安装:
git clone https://github.com/ZhongKuang/TAAC2026-CLI.git
cd TAAC2026-CLI
npm install
npm link
npx playwright install chromium之后可以直接运行:
taac2026 --help如果当前仓库已经内置了本工具,可以直接进入 .codex/skills/taac2026-cli/ 后运行 npm install,或从仓库根目录用 node .codex/skills/taac2026-cli/bin/taac2026.mjs ...。
每天早上醒来,第一反应不该是打开官网、点进一个个实例、手动检查训练曲线。但现实常常是这样:metric 一多,就要拖着鼠标在页面里上下滑,逐个找 AUC、logloss、valid/test-like 指标;刚记住一个实例的数值,切到下一个实例准备对比,前一个又忘了,只好再回去重复打开。
训练报错也一样折磨人。你要点进实例、打开 logs、复制粘贴,再解释这次跑的是哪份代码、哪个 commit、哪个 config。agent 如果拿不到日志、代码和配置的稳定快照,就只能靠你转述,很难真正定位问题。
更糟的是提交训练本身也容易出错。好不容易写了一版不错的代码,上传时却可能传错 zip、忘了换 config、只改了标题没改超参数,白白跑几个 epoch 才发现。于是每次提交都变成一场小心翼翼的人工仪式。
最关键的是,训练产出的 metric 明明应该交给 agent 跨实例分析,却常常只能靠人脑短时记忆做比较。TAAC2026 CLI 的目的就是把这些“页面劳动”变成可归档、可比较、可自动化的实验数据流。
| 痛点 | TAAC2026 CLI 怎么解决 |
|---|---|
| 每天手动点开多个实例看曲线 | 批量抓取 Job、实例、checkpoint 和 metrics,输出 jobs.json、all-metrics-long.csv、all-checkpoints.csv。 |
| metric 多了以后只能靠鼠标滑动和人脑记忆对比 | 把指标转成长表,保留 jobId + instanceId + metric + step,让 agent 可以一次性跨 Job / Run 做排序、对比和总结。 |
| 同一个 Job 多次 Run 容易混在一起 | 用 jobId + instanceId 区分每次运行,避免“这个 AUC 到底是哪次跑出来的”。 |
| 报错后需要手动复制日志,再口头解释代码版本 | 自动归档 Pod log、Job detail、训练代码文件和 config.yaml,让 agent 拿着完整现场排查。 |
| 对比两个实验配置时只能肉眼扫 YAML | compare-config-yaml.mjs 做语义 diff,按配置路径报告新增、删除和变化项。 |
| 上传训练容易传错 zip / config / run.sh / 标题和说明 | prepare-taiji-submit.mjs 先生成提交包和 manifest,记录 Job Name、Description、Git HEAD、dirty 状态和待上传文件。 |
| 想自动提交但又怕误启动训练 | submit-taiji.mjs 默认 dry-run;真实创建必须显式 --execute --yes,启动必须额外 --run。 |
| 线上评估分、infer 代码和失败日志只能在网页里看 | eval scrape 把 evaluation 任务、线上 AUC、event log 和 inference 代码一起归档。 |
| 工具产物散落根目录,越用越乱 | 所有本地产物默认写入 outputs/taiji-output/,包括浏览器 profile、抓取结果、提交包、dry-run/live 结果和 config diff。 |
- 一键抓取最近所有训练,把实验指标整理成可分析表格。
- 帮你回答“这一版到底比上一版强在哪里,弱在哪里”。
- 结合 Job 描述、config diff、日志和曲线,定位训练报错或指标异常。
- 在提交前检查本次 zip/config/run.sh/name/description 是否和 manifest 一致。
- 复用一个稳定模板 Job,自动替换
code.zip、config.yaml,并可显式覆写run.sh后按需启动训练。 - 把训练 checkpoint 发布成模型,再创建评估任务,并把线上评估分、infer 代码和 event log 拉回本地。
- 把平台页面里的短暂信息沉淀成长期可复盘的实验资产。
这些命令的定位是“收集证据、减少误操作、打通流程”。它们不会替你拍脑袋决定哪个实验最好,但会把做判断需要的上下文一次性整理出来。
| 命令 | 能做什么 | 常见用途 |
|---|---|---|
scrape |
抓 Job 列表、实例、metrics、checkpoint、日志和训练代码;支持全量、增量、单 Job 定向抓取。 | 每天同步平台实验;失败后把日志和代码现场拉回本地。 |
diff-config |
语义比较两个 YAML,不受字段顺序和格式影响。 | 快速确认两版 config.yaml 到底改了哪些参数。 |
prepare-submit |
准备本地提交包,记录上传文件、Job Name、Description、Git HEAD 和 dirty 状态。 | 提交前把“打算上传什么”固化成 manifest。 |
submit |
dry-run 或 live 执行复制模板 Job、上传 trainFiles、创建 Job、可选 Run。 | 自动提交训练;默认安全预演,live 需要 --execute --yes。 |
submit doctor |
检查提交包结构、文件 hash 和 manifest。 | 提交前防止 zip/config/run.sh 或说明信息错位。 |
submit verify |
回读平台 trainFiles,和本地提交包做 hash / config 对齐。 | 提交后确认平台实际收到的就是本地这版。 |
compare jobs |
把多个 Job 的描述、状态、best/final 指标和人工分整理成证据表。 | 少读 CSV,快速看一组实验的横向差异。 |
compare-runs |
对比 base 与 exp,合并 config diff、指标差异和 checkpoint 候选。 | 判断“一次改动”带来的曲线变化,但不替你做最终决策。 |
config diff-ref |
用本地 config 对齐某个明确 Job 的平台配置。 | 检查当前配置是否和某个线上实验一致。 |
ledger sync |
从抓取结果同步结构化实验账本。 | 长期沉淀实验记录,方便复盘。 |
logs |
从已抓日志中抽取 Error / Traceback 和尾部上下文。 | 快速定位失败原因,减少复制粘贴日志。 |
diagnose job |
汇总失败 Job 的状态、日志、配置和代码线索。 | 把“为什么挂了”变成 agent 可读的诊断包。 |
ckpt-select |
按显式规则列出 checkpoint 候选,例如 valid_auc 或 pareto。 |
找候选 checkpoint,避免手动翻曲线。 |
ckpt-publish |
把训练 checkpoint 发布成 Taiji 模型;默认 dry-run,live 需确认。 | 从训练流程串到模型管理页。 |
model list |
查询已发布模型,支持搜索。 | 找到要用于评估的模型 ID 和来源 Job。 |
eval create |
创建评估任务;支持 --submit-name 从本地 outputs/submit/*/<name>/inference_code 上传推理包。 |
把“发布模型 -> 提交 infer -> 创建评估”串起来。 |
eval list |
查看评估任务状态和分数。 | 跟踪 infer 是否成功、AUC 是否出来。 |
eval scrape |
翻页抓评估任务、分数,并可下载 event log 与 inference 代码文件。 | 把线上 test AUC、infer 代码和失败/EDA 日志拉成本地证据包。 |
eval stop |
停止评估任务;默认 dry-run,live 需确认。 | 停掉误提交或不想继续占资源的评估。 |
evaluation 是 eval 的别名;文档统一使用 eval。
| 产物 | 内容 |
|---|---|
outputs/taiji-output/training/jobs.json |
完整原始和归一化 Job / instance / metric / code 元数据。 |
outputs/taiji-output/training/jobs-summary.csv |
一行一个 Job,适合快速 grep、排序和人工浏览。 |
outputs/taiji-output/training/all-metrics-long.csv |
长表 metrics,保留 jobId + instanceId + metric + step。 |
outputs/taiji-output/training/all-checkpoints.csv |
checkpoint 名称、指标、发布状态和来源实例。 |
outputs/taiji-output/training/logs/<jobId>/<instanceId>.txt |
Pod 日志文本。 |
outputs/taiji-output/training/code/<jobId>/files/... |
平台 trainFiles 下载副本。 |
outputs/taiji-output/training/code/<jobId>/job-detail.json |
Job detail 原始响应和 trainFiles 元数据。 |
outputs/taiji-output/reports/config-diffs/ |
config 语义 diff 输出。 |
outputs/taiji-output/submit/bundle/ |
本地准备好的提交包和 manifest。 |
outputs/taiji-output/submit/live/<timestamp>/ |
live submit / run 的请求计划和响应。 |
outputs/taiji-output/evaluation/evaluations/ |
评估任务汇总、线上分数、event log 和 inference 代码文件。 |
outputs/taiji-output/reports/ |
compare、diagnose、model、eval 等命令的 JSON / Markdown 报告。 |
outputs/taiji-output/secrets/ |
Cookie 或 headers 的推荐存放位置,永远不要提交。 |
把浏览器里已经登录成功的 Cookie 保存到:
outputs/taiji-output/secrets/taiji-cookie.txt
抓取全部训练任务:
taac2026 scrape --all --cookie-file outputs/taiji-output/secrets/taiji-cookie.txt --headless增量同步会完整扫描 Job list,但对本地已有、终态、且 updateTime/status/jzStatus 没变的 Job 跳过 detail、代码、实例、metric 和 log 的深拉:
taac2026 scrape --all --incremental --cookie-file outputs/taiji-output/secrets/taiji-cookie.txt --direct只核查某个 Job 的详情、代码文件和指标时,可以按平台内部 ID 定向抓取:
taac2026 scrape --all --job-internal-id 56242 --cookie-file outputs/taiji-output/secrets/taiji-cookie.txt --direct服务器上 Chromium 不稳定时,用后端直连模式:
taac2026 scrape --all --cookie-file outputs/taiji-output/secrets/taiji-cookie.txt --direct比较两个配置:
taac2026 diff-config old-config.yaml new-config.yaml
taac2026 diff-config old-config.yaml new-config.yaml --json --out diff.json--out diff.json 会写到 outputs/taiji-output/reports/config-diffs/diff.json,不会掉到根目录。
这些工具只整理证据和拦截低级错误,不替你决定哪个实验更值得提交。
提交前检查 bundle:
taac2026 submit doctor --bundle outputs/taiji-output/submit/bundle提交后回读平台文件,确认平台实际 code.zip/config.yaml/run.sh 和本地 bundle 一致:
taac2026 scrape --all --job-internal-id 56242 --cookie-file outputs/taiji-output/secrets/taiji-cookie.txt --direct
taac2026 submit verify --bundle outputs/taiji-output/submit/bundle --job-internal-id 56242跨实验整理指标、描述里的人工 test 分、valid/test-like 曲线证据:
taac2026 compare jobs 56242 58244 --json对比一个 base 和一个实验 Job,合并 config diff、best/final 指标差异、同向性和候选 checkpoint 规则结果:
taac2026 compare-runs --base 58244 --exp 56242 --config --metrics --json比较当前配置和某个明确 Job 的平台配置,不做“最高分对齐”假设:
taac2026 config diff-ref --config config.yaml --job-internal-id 56242 --json同步结构化实验账本,或诊断失败 Job:
taac2026 ledger sync
taac2026 diagnose job --job-internal-id 56242 --json快速抽取错误日志,或按明确指标规则列出 checkpoint 候选:
taac2026 logs --job 60414 --errors --tail 100 --json
taac2026 ckpt-select --job 56242 --by valid_auc --json把指定训练 checkpoint 发布成模型。默认 dry-run,只生成计划;真正发布必须显式 --execute --yes。默认模型名为 <Job Name> epoch<N> val auc <AUC>,描述复用 Job Description。若缓存里目标 checkpoint 已经是发布态,live 发布会被拦住,除非额外传 --force,避免重复创建模型。
taac2026 ckpt-publish --job 56242 --ckpt "global_step7236.epoch=4.AUC=0.865213.Logloss=0.273911.best_model" --json
taac2026 ckpt-publish --job 56242 --by valid_auc --json
taac2026 ckpt-publish --job 56242 --ckpt "global_step7236.epoch=4.AUC=0.865213.Logloss=0.273911.best_model" --instance-id 95cdb4769de33483019df8ac5f843305 --json
taac2026 ckpt-publish --job 56242 --ckpt "global_step7236.epoch=4.AUC=0.865213.Logloss=0.273911.best_model" --cookie-file outputs/taiji-output/secrets/taiji-cookie.txt --execute --yes --json查看已发布模型,创建或停止评估任务。eval create 默认 dry-run。推荐用 --submit-name 从本地 outputs/submit/<日期>/<提交包名>/inference_code 里找到打包机已经整理好的推理代码,并上传该目录第一层所有文件。--file-dir 是手动兜底路径,默认只打包 dataset.py、dense_transform.py、eda.py、infer.py、model.py 这几个直接文件,避免误把仓库根目录杂物传上去。真实创建必须显式 --execute --yes。
taac2026 model list --cookie-file outputs/taiji-output/secrets/taiji-cookie.txt --search "V1.4.6" --out model-list.json
taac2026 eval create --model-id 29132 --creator ams_2026_1029735554728157691 --submit-name V1.4.6_fusion_time_item_dense_main7683bde --out eval-create.json
taac2026 eval create --model-name "1.4.6 epoch" --submit-name V1.4.6_fusion_time_item_dense_main7683bde --cookie-file outputs/taiji-output/secrets/taiji-cookie.txt --out eval-create.json
taac2026 eval create --model-search "1.4.6" --submits-root ./outputs/submit --submit-name V1.4.6_fusion_time_item_dense_main7683bde --cookie-file outputs/taiji-output/secrets/taiji-cookie.txt --out eval-create.json
taac2026 eval list --cookie-file outputs/taiji-output/secrets/taiji-cookie.txt --page-size 20 --out eval-list.json
taac2026 eval scrape --task-id 62726 --logs --code --cookie-file outputs/taiji-output/secrets/taiji-cookie.txt --out eval-scrape.json
taac2026 eval create --model-id 29132 --creator ams_2026_1029735554728157691 --submit-name V1.4.6_fusion_time_item_dense_main7683bde --cookie-file outputs/taiji-output/secrets/taiji-cookie.txt --execute --yes --out eval-create-live.json
taac2026 eval stop --task-id 62362 --cookie-file outputs/taiji-output/secrets/taiji-cookie.txt --execute --yes --out eval-stop-live.jsoneval create 还支持 --image-name、--include-all-files 等低频选项;--include-all-files 会上传目录第一层所有文件,使用前应明确确认。model list、eval create/list/stop 默认打印 JSON;传 --out xxx.json 时会按类型写入 outputs/taiji-output/reports/model/ 或 outputs/taiji-output/reports/evaluation/。
eval scrape 会写入 outputs/taiji-output/evaluation/evaluations/eval-summary.csv、eval-tasks.json、logs/<evalTaskId>.txt 和 code/<evalTaskId>/files/...。它只抓证据,不创建或启动评估任务。--out-dir 是显式输出目录:默认是 outputs/taiji-output/evaluation/evaluations/;如果写 --out-dir foo,会写到当前目录下的 foo,不是自动变成 outputs/taiji-output/foo。推荐自定义时写成 --out-dir outputs/taiji-output/evaluation/evaluations-<name>。
提交链路分两层:先准备,再执行。默认只 dry-run,不会误上传、误创建、误启动。
公开版推荐使用最简单、最稳定的 Taiji trainFiles 形态:
code.zip
run.sh
config.yaml
code.zip放项目代码,由你的仓库脚本或 agent 打包生成。run.sh是平台入口,负责解压/定位代码并读取config.yaml启动训练。config.yaml放本次实验参数。
本仓库提供了一个不含真实代码的最小示例:
examples/minimal-taiji-submit/
code/
run.sh
config.yaml
你的 agent 可以参考这个形态打包:把项目代码放进 code.zip,把实验参数写入 config.yaml,用 run.sh 作为统一入口。自动提交脚本默认替换 code.zip 和 config.yaml;如果传入 --run-sh ./run.sh,也会显式覆写模板里的同名 run.sh。模板 Job 里必须已有这些同名 trainFiles;只有明确加 --allow-add-file 时才允许新增。
如果别人的模板不是 zip 形态,而是散文件,例如 main.py + dataset.py + run.sh,也可以用通用文件适配:
taac2026 prepare-submit \
--template-job-url "https://taiji.algo.qq.com/training/..." \
--file-dir "./taiji-files" \
--name "loose_files_exp"--file-dir 只扫描目录第一层文件;自动识别 code.zip、config.yaml、run.sh,其他第一层文件都会进入 generic trainFiles。比如目录里有:
taiji-files/
dataset.py
model.py
ns_groups.json
run.sh
train.py
trainer.py
utils.py
就会准备覆写同名 run.sh,以及 dataset.py/model.py/ns_groups.json/train.py/trainer.py/utils.py 这些散文件。子目录会被忽略,避免不小心把项目目录整体传上去。
也可以单独列文件:
taac2026 prepare-submit \
--template-job-url "https://taiji.algo.qq.com/training/..." \
--zip "./outputs/submit/0505/V1.4.0/code.zip" \
--config "./outputs/submit/0505/V1.4.0/config.yaml" \
--run-sh "./outputs/submit/0505/V1.4.0/run.sh" \
--file "./main.py" \
--file "./local_dataset.py=dataset.py" \
--name "v1.4.0_mixed_files"--file ./main.py 会按 basename 替换模板里的 main.py;--file ./local_dataset.py=dataset.py 会把本地文件上传后替换模板里的 dataset.py。code.zip、config.yaml、run.sh 是一等文件名,不能通过 --file 传,必须使用 --zip、--config、--run-sh,或让 --file-dir 自动识别。
准备一个提交包:
taac2026 prepare-submit \
--template-job-url "https://taiji.algo.qq.com/training/..." \
--zip "./outputs/submit/0505/V1.4.0/code.zip" \
--config "./outputs/submit/0505/V1.4.0/config.yaml" \
--run-sh "./outputs/submit/0505/V1.4.0/run.sh" \
--name "v1.4.0_item_reinit" \
--description "item id reinit + dense transform" \
--run不传 --run-sh 时会沿用模板 Job 里的旧 run.sh。
它会写入:
outputs/taiji-output/submit/bundle/
manifest.json
NEXT_STEPS.md
files/code.zip
files/config.yaml
files/run.sh # 仅在传入 --run-sh 时存在
files/generic/... # 仅在传入 --file 或 --file-dir 发现散文件时存在
生成 dry-run 提交计划:
taac2026 submit \
--bundle outputs/taiji-output/submit/bundle \
--cookie-file outputs/taiji-output/secrets/taiji-cookie.txt \
--template-job-internal-id <TEMPLATE_JOB_INTERNAL_ID>真实上传并创建 Job:
taac2026 submit \
--bundle outputs/taiji-output/submit/bundle \
--cookie-file outputs/taiji-output/secrets/taiji-cookie.txt \
--template-job-internal-id <TEMPLATE_JOB_INTERNAL_ID> \
--execute --yes上传、创建并启动训练:
taac2026 submit \
--bundle outputs/taiji-output/submit/bundle \
--cookie-file outputs/taiji-output/secrets/taiji-cookie.txt \
--template-job-internal-id <TEMPLATE_JOB_INTERNAL_ID> \
--execute --yes --run只有用户明确要启动训练时才加 --run;普通上传验证先用上一段 create-only 命令。
如果模板 Job 里没有同名 code.zip、config.yaml,或在传入 --run-sh / --file / --file-dir 时没有对应同名 trainFile,脚本会默认报错,避免旧文件和新文件同时存在。只有明确要新增 trainFiles 时才加:
taac2026 submit ... --execute --yes --allow-add-file- Cookie、headers 建议放在
outputs/taiji-output/secrets/,HAR 和分析证据放在outputs/taiji-output/reports/,不要提交。 - 所有脚本默认按类型把本地产物写到
outputs/taiji-output/training/、evaluation/、submit/或reports/。 - 相对输出路径不能包含
..;如果确实要写到外部位置,请使用绝对路径。 eval scrape --out-dir是显式目录参数;默认是outputs/taiji-output/evaluation/evaluations/,自定义时推荐仍写在outputs/taiji-output/evaluation/下。submit-taiji.mjs默认 dry-run。- 真实平台写操作必须显式加
--execute --yes。 - 启动训练必须额外显式加
--run。 ckpt-publish --force、submit --allow-add-file、eval create --include-all-files都需要额外确认。- 脚本会保留模板 Job 的环境、镜像和入口;默认严格替换模板中已有的
code.zip和config.yaml,传入--run-sh时才严格替换同名run.sh,传入--file或--file-dir时才严格替换对应通用文件。
outputs/taiji-output/
training/
jobs.json
jobs-summary.csv
all-checkpoints.csv
all-metrics-long.csv
browser-profile/
code/<jobId>/
logs/<jobId>/
evaluation/
evaluations/
eval-summary.csv
eval-tasks.json
code/<evalTaskId>/
logs/<evalTaskId>.txt
submit/
bundle/
bundles/
live/<timestamp>/
local/
notes/
runs/
reports/
checkpoint/
compare/
config-diffs/
diagnose/
evaluation/
ledger/experiments.json
logs/
model/
smoke/
submit/
secrets/
推荐在业务仓库里加入:
outputs/taiji-output/适合这些场景:
- 想让 agent 总结一批 Taiji Job 的训练指标。
- 想比较两个实验版本的
config.yaml。 - 想把每个 Job 的代码、日志、checkpoint 和指标归档起来。
- 想用一个已成功的模板 Job 自动提交下一组代码和配置。
- 想让 agent 先整理历史实验的证据,再由人和 agent 共同判断下一步策略。
不适合这些场景:
- Cookie 已经过期或被出口 IP / 浏览器指纹绑定。
- 平台接口发生变化且没有新的 DevTools 请求样本。
- 需要完全无人工确认地消耗线上训练资源。
| 脚本 | 用途 |
|---|---|
bin/taac2026.mjs / taac2026 |
统一 CLI 入口,分发到下列子命令 |
scripts/scrape-taiji.mjs |
抓取 Job、实例、指标、日志、checkpoint、代码文件 |
scripts/compare-config-yaml.mjs |
语义比较两个 YAML 配置 |
scripts/prepare-taiji-submit.mjs |
准备本地提交包,记录 Git 状态和上传文件 |
scripts/submit-taiji.mjs |
dry-run 或显式执行 Taiji 上传、创建、Run 流程 |
scripts/experiment-tools.mjs |
提交前检查、提交后回读校验、实验对比、账本同步、日志诊断、checkpoint 选择与发布 |
scripts/evaluation-tools.mjs |
模型列表、评估创建 dry-run / live、评估列表、评估证据抓取和停止 |
401/403:Cookie 过期、缺失,或登录态绑定了出口环境。- Playwright 失败但
--direct成功:优先用--direct。 - 两种模式都
401:先在同一机器上测试完整Copy as cURL。 - Job 有实例但指标为空:可能是任务失败、实例未产出 metrics,或平台响应结构变化。
- 代码文件下载失败:先看
code/<jobId>/job-detail.json和train-files.json。脚本会优先把trainFiles[].path当 COS key,用 federation token 下载;如果拿到平台前端 HTML、zip 魔数不对、config.yaml不是 mapping,或大小不匹配,会标为失败而不是悄悄保存假文件。
npm run check
npm run testcheck 会对所有 bundled scripts 执行 node --check;test 会跑提交安全和输出路径的小型行为测试。