1. 先搞清楚 Deli AutoResearch 到底解决什么问题
Deli AutoResearch 是一个自博弈 Agent 框架,核心卖点是让 Agent 在无人值守的情况下连续跑几十小时甚至几天,完成文献综述、实验设计、论文撰写这类长程任务。它适合谁?适合手里有 285B 级别模型推理资源、想跑 RL 实验验证链路、又不想被 Agent 反复“假死”拖垮的工程团队。
大部分 Agent 框架跑不过 24 小时,原因不是模型不够聪明,而是三个工程层面的死穴:认知循环、假死停滞、运行时崩溃。认知循环指的是 Agent 连续迭代相似方向,收益递减却跳不出来;假死停滞更隐蔽,Agent 输出一段摘要后等用户确认,外部看轮询还在跑,实际工作已经停了;运行时脆弱性则是上下文压缩静默破坏循环、关闭会话连带关闭定时器,而且这些失败默认不会被注意到。
Deli AutoResearch 的解法很 radical:不开源代码,只开源协议。整个框架就是一个自包含的 SKILL.md 文件,定义了行为约束、状态文件格式、停滞检测规则、看门狗机制和子 Agent 调度模式。工程实现细节留给使用者自己填,反而让它能适配任何支持 cron 和文件系统的平台。
我试过把这套协议骨架接到自己的 285B 模型 RL 实验链路上,下面把配置骨架和验证路径完整拆一遍。你需要准备的是:一个能跑 285B 模型推理的 API 通道、一台常驻的 Linux 机器、以及基础的 shell 和 cron 操作能力。
2. TaoToken 前置:统一 Key/API 通道接入
Deli AutoResearch 的 SKILL.md 协议本身不绑定任何模型供应商,但你要跑 285B 模型的 RL 实验,需要一个稳定的 API 通道来承载 GRPO 训练中的采样请求。TaoToken 在这里的角色是统一 Key 和 API 入口,让你不用在多个供应商之间来回切换配置。
接入方式很简单,先拿到 API Key,然后配置到环境变量里。访问 https://taotoken.net/api-keys 创建 Key,注意这个页面是 deep link,创建后复制保存。
拿到 Key 之后,在项目根目录创建.env文件:
# .env TAOTOKEN_API_KEY=sk-your-key-here TAOTOKEN_BASE_URL=https://taotoken.net/api然后在 settings.json 里引用这个环境变量。Deli AutoResearch 的 settings.json 是框架级配置,控制模型通道、超时、重试策略:
{ "model_provider": { "name": "taotoken", "base_url": "${TAOTOKEN_BASE_URL}", "api_key_env": "TAOTOKEN_API_KEY", "default_model": "deepseek-v4-285b", "timeout_seconds": 120, "max_retries": 3, "retry_backoff": "exponential" }, "runtime": { "max_session_rounds": 15, "max_session_minutes": 30, "stale_threshold": 2, "escalate_threshold": 4 }, "watchdog": { "l0_heartbeat_timeout_hours": 2, "l1_cron_interval_minutes": 60, "l2_callback_first_line": "update_last_seen" } }这里的关键参数是max_session_rounds和max_session_minutes,它们直接对应 SKILL.md 里的“单会话上限 15 轮或 30 分钟”约束。超过就强制重启新会话,切断认知循环的根因。
如果你要跑长期编码或 Agent 任务,可以考虑 Coding Plan 方案,在 https://taotoken.net/coding-plan 查看具体配额和接入方式。对于 285B 模型的 RL 实验,采样请求量大,建议先确认配额是否覆盖你的 batch size 和 N 值。
3. 可复制配置:SKILL.md 骨架与 config.toml
SKILL.md 是整个框架的协议核心,它不是代码,而是一份行为约束文档。你需要把它放在任务目录的根下,框架启动时会读取它来约束 Agent 行为。下面是一个可直接复制的最小骨架:
# SKILL.md - Deli AutoResearch Protocol ## Hard Rules 1. Zero-interaction: 运行期间不提示用户,不进入 Plan Mode,不结束于问题。 2. Ready means execute: 准备完毕直接执行,不问“要不要提交”。 3. Callback means report-alive: 每次回调第一行更新 last_seen。 4. Persist state to files: 所有进度写入文件,不依赖对话记忆。 5. Guardian/worker separation: 看门狗不读取任务数据、不修改状态。 ## State Files - state/task_spec.md: 目标 / 里程碑 / 成功标准 - state/progress.json: {iteration, total_findings, status, stale_count} - state/findings.jsonl: 累积发现(追加模式) - state/directions_tried.json: 已尝试方向(防循环) - state/iteration_log.jsonl: 每轮迭代摘要 ## Stale Detection - 一轮迭代 0 新发现,或指标下降 → stale_count + 1 - stale_count >= 2 → 改变结构约束(不是战术参数) - stale_count >= 4 → 标记需要人工关注 - 新方向必须与所有历史方向不同 ## Pivot Strategies 1. 从相反的假设重新开始 2. 找结构上相似的跨领域案例 3. 改变验证标准(必要条件换充分条件) 4. 缩小/扩大问题范围 ## Sub-Agent Modes - A. 目标驱动研究迭代 - B. 并行探索复杂子问题 - C. 实验运行长计算任务 - D. 验证迭代后 QAconfig.toml 则是运行时配置,控制看门狗层级和子 Agent 调度:
[watchdog.l0] type = "shell_guard" heartbeat_timeout_hours = 2 action = "emergency_patrol" [watchdog.l1] type = "persistent_cron" interval_minutes = 60 action = "check_last_seen_and_restart" [watchdog.l2] type = "business_loop" callback_first_line = "update_last_seen" [sub_agent] mode_a_max_rounds = 15 mode_b_parallel_limit = 4 mode_c_poll_interval_minutes = 5 mode_d_qa_enabled = true [experiment] model = "deepseek-v4-285b" method = "grpo" batch_size = 512 group_size = 16 context_length = 32768 dataset_size = 18953 verifier_noise = [0, 0.10, 0.30, 0.45] total_runs = 12这里verifier_noise数组对应论文里的验证器噪声实验,ε 从 0 到 0.45 四档。group_size是 GRPO 的 N 值,每组采样 16 条。这些参数直接决定你的 GPU 时间消耗,3570 卡时是 12 次 run 的总量,单次约 297 卡时。
状态文件系统需要提前创建目录结构:
mkdir -p {task}/state {task}/logs touch {task}/state/findings.jsonl touch {task}/state/iteration_log.jsonl echo '{"iteration":0,"total_findings":0,"status":"init","stale_count":0}' > {task}/state/progress.json echo '[]' > {task}/state/directions_tried.json4. 验证请求:确认 RL 实验链路可用
配置写完之后,不要直接上 285B 全量实验,先用小规模请求验证链路。第一步是确认 API 通道能正常返回:
curl -s -X POST "${TAOTOKEN_BASE_URL}/v1/chat/completions" \ -H "Authorization: Bearer ${TAOTOKEN_API_KEY}" \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-v4-285b", "messages": [{"role": "user", "content": "Reply with OK only."}], "max_tokens": 8 }' | jq -r '.choices[0].message.content'如果返回OK,说明 Key 和通道正常。接着验证 GRPO 采样接口,用一个小 batch 模拟训练时的采样请求:
import os, requests, json base = os.environ["TAOTOKEN_BASE_URL"] key = os.environ["TAOTOKEN_API_KEY"] payload = { "model": "deepseek-v4-285b", "prompt": "Solve: 2x + 3 = 11. Show steps.", "n": 4, "temperature": 0.7, "max_tokens": 256 } resp = requests.post( f"{base}/v1/completions", headers={"Authorization": f"Bearer {key}"}, json=payload, timeout=120 ) data = resp.json() for i, choice in enumerate(data["choices"]): print(f"sample {i}: {choice['text'][:80]}...")n=4对应 GRPO 的 group size 缩小版,实际训练用 16。如果 4 条采样都能返回且格式正确,说明采样链路通了。
第三步验证看门狗心跳。手动触发一次 L2 回调,检查 last_seen 是否更新:
python3 -c " import json, time p = '{task}/state/progress.json' d = json.load(open(p)) d['last_seen'] = int(time.time()) d['iteration'] += 1 json.dump(d, open(p, 'w')) print('last_seen updated:', d['last_seen']) "然后检查 L1 cron 是否能检测到超时。把 last_seen 改成 3 小时前,等 cron 跑一轮,看是否触发重启:
python3 -c " import json, time p = '{task}/state/progress.json' d = json.load(open(p)) d['last_seen'] = int(time.time()) - 3*3600 json.dump(d, open(p, 'w')) print('simulated stale:', d['last_seen']) "如果 cron 配置正确,下一轮 L1 检查会读取到超时并重启对应循环。这一步验证通过,说明三层看门狗机制可用。
最后验证停滞检测。手动把 stale_count 设为 2,观察框架是否注入扰动策略:
python3 -c " import json p = '{task}/state/progress.json' d = json.load(open(p)) d['stale_count'] = 2 json.dump(d, open(p, 'w')) print('stale_count set to 2') "下一轮迭代启动时,框架应该读取到 stale_count >= 2,并改变结构约束而非调参。你可以在 iteration_log.jsonl 里看到转向记录。
5. 本篇常见错排查
报错一:TAOTOKEN_API_KEY not found
原因通常是.env文件没有被加载。Deli AutoResearch 的 settings.json 用${TAOTOKEN_API_KEY}引用环境变量,但 shell 不会自动读取.env。解决方式是在启动脚本里显式 source:
set -a source .env set +a python3 run_agent.pyset -a让所有变量自动 export,set +a恢复。如果你用 systemd 管理常驻进程,在 service 文件里加EnvironmentFile=/path/to/.env。
报错二:stale_count一直不增长,Agent 卡住但没被检测到
检查 L2 回调是否真的在每次回调第一行更新 last_seen。SKILL.md 里写了Callback means report-alive,但如果你自己实现的 worker 没有遵守这条,看门狗就瞎了。验证方式:
tail -f {task}/logs/heartbeat.jsonl如果这个文件长时间没有新行,说明 L2 回调没在写。检查你的 worker 代码,确保每次回调入口处有:
def on_callback(state): state["last_seen"] = int(time.time()) save_state(state) # ... 业务逻辑报错三:GRPO 采样返回model not found
285B 模型的名称在不同通道可能不一样。先用模型列表接口确认可用名称:
curl -s "${TAOTOKEN_BASE_URL}/v1/models" \ -H "Authorization: Bearer ${TAOTOKEN_API_KEY}" | jq -r '.data[].id'把返回的模型 ID 填到 settings.json 的default_model和 config.toml 的model字段。不要硬编码猜测的名称。
报错四:cron 任务不执行
L1 看门狗依赖持久 cron,但很多环境的 cron 需要显式指定用户和路径。检查 crontab:
crontab -l确保有类似这样的条目:
*/60 * * * * cd /path/to/task && /usr/bin/python3 watchdog_l1.py >> logs/cron.log 2>&1注意用绝对路径,cron 的环境变量和交互式 shell 不一样。如果 cron 日志为空,先手动跑一遍watchdog_l1.py确认脚本本身没问题。
报错五:上下文压缩后定时器丢失
这是运行时脆弱性的典型表现。SKILL.md 的 Hard Rule 4 要求所有进度写入文件,但如果你在 worker 里用了内存定时器,上下文压缩会把它干掉。解决方式是把定时逻辑外置到 L0 shell guard:
#!/bin/bash # l0_guard.sh while true; do now=$(date +%s) last=$(python3 -c "import json; print(json.load(open('{task}/state/progress.json'))['last_seen'])") diff=$((now - last)) if [ $diff -gt 7200 ]; then echo "L0 emergency patrol triggered at $(date)" >> logs/heartbeat.jsonl python3 emergency_patrol.py fi sleep 300 done这个脚本不依赖任何会话,常驻 shell 里跑,上下文压缩影响不到它。
6. 语义一致 CTA:把链路跑通之后
配置骨架和验证路径都跑通之后,你手里应该有一个能自主运行、带三层看门狗、支持 GRPO 采样的 Agent 框架。接下来要做的是把它接到真实的 285B 模型 RL 实验上。
如果你在接入过程中遇到 API 通道问题,先去 https://taotoken.net/api-keys 确认 Key 状态,然后对照 https://taotoken.net/doc 的接入文档检查 base_url 和认证头格式。文档里有完整的请求示例和错误码说明。
验证模型本身是否可用,可以用模型对话页面快速测试,在 https://taotoken.net/model-chat 发一条简单请求,确认 285B 模型能正常响应。这一步能排除模型名称错误或配额不足的问题。
如果你打算长期跑编码或 Agent 任务,Coding Plan 的配额模式可能比按量计费更划算,具体在 https://taotoken.net/coding-plan 查看。对于 3570 卡时这种量级的实验,提前确认配额上限能避免跑到一半被限流。
最后提醒一点:Deli AutoResearch 的 SKILL.md 协议约束的是行为,不是模型能力。去掉约束,越界行为就会回来。三层看门狗和状态文件系统是这套框架真正值钱的地方,配置的时候不要偷懒省掉任何一层。