学习笔记 · Obsidian

Deep Agents Code:审批、目标、Rubric 与远程沙箱

LangChain

三种审批模式

默认 gated actions 包括文件写/改/删、shell、web 请求和 task 委派;ls、read_file、glob、grep 等只读工具不提示。

模式行为适用边界
Manual每个 gated action 人工确认默认、风险最高的本地任务
Auto例行动作自动放行,不确定项交给模型分类可信本地仓库的提效实验
YOLO不审查任何 gated action仅接受全部风险的隔离环境

Auto 是启发式授权,不是 sandbox、OS capability 或安全证明。它要求 experimental opt-in;远程 sandbox 激活时会回退到 Manual。YOLO 需一次性风险确认,键盘不能从 Manual/Auto 切入;从 YOLO 切出后不能键盘切回。

Auto 与 YOLO 只适用于交互 TUI,不用于 -n、piped stdin 或 ACP server。Headless 使用 fail-closed MCP、文件工具 allowlist 和 shell allowlist。

Auto 的决策链

Auto 保留 gated-action 规则,只改变审查方式:

  1. 明确例行、低风险动作直接通过,例如普通源文件写入或只读 Git 命令。
  2. 敏感目标和变更性动作进入 classifier;只有用户 literal prompt 可作为授权依据。
  3. 多次 deny、超时或 classifier 故障后,回退人工审批。

Classifier 默认复用主模型,可单独指定更快、更便宜的模型。优先级:会话 /auto model → CLI flag → 环境变量 → config → 继承主模型。项目 .env 不能指定该模型,避免仓库控制授权者。

Classifier 默认 20 秒。超时 batch fail closed 为 classifier_unavailable,重复发生回退 Manual;优先换更快模型,再考虑提高 1–300 秒范围内的 timeout。

执行副作用前会重新校验 thread、mode、batch 和精确调用集合。若 classifier 期间切回 Manual,旧 Auto 结果不能静默执行。

Auto 无法覆盖的边界

  • MCP 的 read-only annotation 来自 server 自报。
  • 父级 Auto 不覆盖 delegated subagent 内部动作。
  • 显式开启的 js_eval / dynamic fan-out 不会逐动作走父级审批。
  • 分类输入输出仍可能被模型供应商和 tracing backend 看见。

因此敏感任务必须同时用最小工具、remote sandbox、网络/凭证隔离与产物 review。

Goal 与 Rubric

两者都是质量门,但用途不同:

机制谁定义标准生命周期
Goal用户给目标,Agent 草拟 acceptance criteria,人工 review跨多 turn 持续,可 amend/pause/resume
Rubric用户已知 criteria,直接给 grader可只作用下一 turn 或 sticky

Goal 适合“结果明确、验收标准尚需展开”的开放工作。/goal <objective> 先生成 criteria,用户可接受、编辑、要求修订或取消;接受后每一 follow-up turn 都会评分,直到完成、blocked、暂停或清除。

/goal amend 协调修改 objective 与 criteria,仍需 review;pause 保留但不驱动中间任务,resume 从现有对话继续。Grader 模型与最大迭代可独立设置。

Rubric 适合已知门槛:sticky criteria、文件 criteria 或 next-turn gate。非交互无法暂停 Goal review,所以用 --rubric,并可显式指定 grader model 与 max iterations。

生产实践:

  • Criteria 必须可观察、可验证,避免“质量要好”等循环性描述。
  • Rubric 迭代上限与 Agent graph recursion limit 分开设定。
  • Grader 最好有确定性证据工具(tests、lint、schema check),不要只让 LLM 自评。
  • 达到迭代上限不等于通过;自动化脚本要区分 satisfied 与 cap exhaustion。
  • “blocked” 应表示确实无法继续,而不是预算将尽。

Remote sandbox 架构

dcode 使用 sandbox-as-tool:模型循环、memory 与工具 dispatch 留在本机,read_file、write_file、execute 等实际作用于远端环境。本机工作区不会自动上传;必须用 setup script 或 provider file-transfer API 播种。

当前内置 provider:LangSmith、AgentCore、Daytona、Modal、Runloop、Vercel。E2B 是第三方 package provider。LangSmith 默认包含,其余通过 extra 安装;all-sandboxes 不包含第三方 provider。

常用 flags:

Flag作用
--sandbox TYPE选择 provider;裸 flag 使用 config default
--sandbox-id ID重连已有环境,不创建/清理
--sandbox-snapshot-name NAME使用或创建 snapshot;与 sandbox ID 互斥
--sandbox-setup PATH创建后运行 setup script

裸 --sandbox 接受可选值,应放命令末尾,否则后一个 positional argument 可能被当作 provider 名。生产脚本优先显式写 provider。

默认工作目录因 provider 不同:LangSmith /root、AgentCore /tmp、Daytona /home/your-name、Modal /workspace、Runloop/E2B /home/your-name、Vercel /vercel/sandbox。Setup、execute 与路径假设必须统一。

Provider 扩展与优先级

发现优先级为 config-declared > third-party entry point > built-in。第三方 package 注册 deepagents_code.sandbox_providers entry point;本地/企业实现可在 config 用 class_path 声明。

Config provider 可描述 working dir、package hint、是否支持 sandbox ID、是否支持 snapshot,以及传给 get_or_create() 的 params。重用 built-in name 会覆盖它。

class_path 会在本机 import 并执行任意 Python module-level code。它不是远端 sandbox 内的代码,而是 dcode 进程权限下的本机代码;只有完全信任的配置才能使用。

Setup scripts 与 secrets

Setup script 适合 clone repo、安装依赖和初始化工作目录。文档说明 ${VAR} 会用本地环境变量展开,这意味着密钥可能被直接写入远端 shell 输入、文件、进程环境或日志。

安全做法:

  • Setup script 本身必须受版本控制与审查。
  • 不从不可信项目读取 setup script。
  • 优先使用 provider 的认证代理或短期、最小权限 token。
  • 不把长期 API keys 写入 sandbox 文件或环境。
  • 用 file-transfer API 上传必要源码,不上传整个 home 或 .env。
  • 给 sandbox TTL、资源上限与清理策略。

远端隔离只保护本机,不防间接提示注入。Agent 仍可在 sandbox 内读取所有可达文件并通过允许的网络外传;审批与网络限制必须共同存在。

推荐运行策略

场景推荐组合
可信本地仓库、日常开发Manual;必要时实验 Auto;文件/shell 收窄
不可信仓库Remote sandbox + Manual + 拒绝项目 MCP/hooks
CI 代码检查非交互 + 明确文件工具 + 最小 -S + timeout/max-turns + rubric
需要自主修改的隔离任务Remote sandbox + Manual 产物 review;不要把 Auto 当隔离
纯分析、不需写入只读文件工具,不暴露 execute/write/delete

YOLO 只能在已经接受“无需审查的一切副作用”时使用;远端 sandbox 能降低宿主损害,却不能自动保护远端凭证、数据与网络。