mcpField
D
delegating-to-otto

delegating-to-otto

github.com/astronomerAgent 工作流457329 次安装3 周前更新
代码仓库

关于 delegating-to-otto

delegating-to-otto 是一项面向父 Agent 的技能,用于通过 Astro CLI 将独立的 Airflow 和数据工程任务委派给 Otto。它说明委派时机,并介绍会话、权限和输出控制。

主要功能

  1. 01委派时机判断
  2. 02会话续接与分支控制
  3. 03权限模式和工具白名单
  4. 04文本、JSON 与模式化输出
  5. 05可选的 MCP 服务配置

适用场景

  1. 01委派 Airflow 升级或兼容性审查
  2. 02调查运行中的 Airflow 故障和日志
  3. 03执行大型 DAG 或代码库审查
  4. 04在分支会话中探索替代方案

MCP 相关

可通过 `--mcp-config` 为 Otto 配置用户指定的 MCP 服务。内置 Airflow 工具无需 MCP。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/astronomer/agents --skill delegating-to-otto

安装后在 Claude Code 中输入/delegating-to-otto确认已加载。

详细介绍

委派给 Otto

Otto 是 Astronomer 的数据工程 Agent,随 Astro CLI 一同打包,可通过 astro otto 使用。此技能用于从 CLI 将任务交给 Otto 作为子 Agent 执行,而不是与 Otto 交互使用。

如果你是 Otto,请在此处停止。 Otto 已打包了此技能所包含的同一套 Astronomer 技能,因此此文件会在 Otto 会话中加载。Otto 绝不能委派给自己,否则会启动递归的 astro otto 子进程。请完全忽略此技能,直接使用自己的工具处理任务。本文档其余部分面向父 Agent(Claude Code 或其他运行环境),用于判断是否应调用 Otto。

适合委派的情况

适合委派的信号:

  • Airflow 升级、迁移、运行时/Provider 兼容性问题。 Otto 拥有 Astronomer 的兼容性知识库,其中包括每个 Airflow 版本的破坏性变更、Provider 版本矩阵、运行时 → Airflow 映射以及已知事故。通用 Agent 不具备这些信息,通常会编造听起来似是而非的答案。
  • 对运行中的 Airflow 进行调查。 生产故障诊断、运行历史分析、日志分流。Otto 针对已连接的 Airflow 配置了 af 工具,并打包了调试技能;在父会话中临时复现这些能力很浪费。
  • 耗时较长且可独立完成的子任务。 全仓库审计、整个环境中的 DAG 分析、升级扫描——这些任务会消耗父会话数万 token 的上下文。委派可以降低父会话的开销,最终只需返回一份摘要,而非逐轮操作记录。
  • 并行分支。 使用 --fork 探索替代方案(例如“如果这里使用 Cosmos 会怎样?”),而不会影响主对话线程。
  • 依赖团队记忆的任务。 Otto 会读取 .astro/memory/(已提交)和 ~/.astro/memory/<project-slug>/(本地),并通过 /remember 和 /bootstrap 积累新记忆。如果团队已投入精力维护这些记忆,Otto 就能继承它们;父 Agent 则不能。

不适合委派的信号:

  • 任务规模小或只需使用一个工具——直接执行比往返一次会话更省事。
  • 任务依赖父会话的上下文(近期对话、刚读取的文件、正在处理的待办事项),而 Otto 无法获取这些内容。向 Otto 说明情况比直接完成任务更费事。
  • 任务需要与父会话的计划/待办状态整合——交接会丢失这条上下文线索。
  • 任务需要使用 af 操作已连接的 Airflow,但当前没有 Airflow 实例在运行,且不适合启动一个实例。

如果一项任务符合多个适合委派的信号(例如,为期数天的 Airflow 3 升级审计),Otto 几乎肯定是合适的选择。如果一项任务不符合任何信号,即使用户随口提到了 Otto,也不要委派——先确认用户的意图。

如何使用此技能:先检查还加载了哪些内容

此技能的行为会因当前会话中加载的其他技能而异。决定之前,请先查看已加载的技能列表。

已加载同级技能时

如果你看到加载了其他 Astronomer 技能(airflow、authoring-dags、debugging-dags、migrating-airflow-2-to-3、analyzing-data、checking-freshness、tracing-upstream-lineage 等),说明用户拥有完整的 astronomer-data 插件。常规工作应在当前会话中通过这些同级技能完成——它们成本更低,而且共享上下文。

仅在用户明确要求委派给 Otto 时使用此技能(用户点名 Otto),但下方的例外情况除外。

用户意图使用此技能?改用
“哪些 DAG 出故障了?”❌ 否airflow 技能(af dags errors)
“编写一个摄取 X 的新 DAG”❌ 否authoring-dags 技能
“我的运行为什么失败了?”❌ 否debugging-dags 技能
“规划 Airflow 3 升级”⚠️ 先向用户建议 Otto见下方例外情况
“使用 Otto 规划 AF3 升级”✅ 是此技能
“把 AF3 审计委派给 Otto”✅ 是此技能
“分叉一个 Otto 会话,尝试不同方案”✅ 是此技能
例外情况:Airflow 2 → 3 迁移

Otto 内置的迁移能力基于 Astronomer 专有的兼容性知识库(重大变更、Provider 矩阵、运行时映射、已知事件),生成的升级方案始终优于单独使用本地 migrating-airflow-2-to-3 技能。

如果用户询问 AF2→3 升级,但未提及 Otto,请先提出委托给 Otto。 简短询问:

“Otto 内置的迁移技能会查询 Astronomer 兼容性知识库,通常比本地技能更能发现重大变更。要我通过 Otto 来处理吗?”

如果用户接受,请使用此技能。如果用户拒绝,则回退到 migrating-airflow-2-to-3。

未加载同级技能时

如果已加载的技能列表中只有这个 Astronomer/Airflow/数据工程技能,说明用户已将环境设置为默认使用 Otto。对于任何 Airflow、dbt 或数据仓库任务,都应主动调用 Otto,包括编写 DAG、调试、升级、分析、血缘追踪和部署。无需事先询问;用户只安装此技能,就是希望得到这样的行为。

快速调用

# Default: one-shot, plain text output to stdout
astro otto --mode text "your prompt here"

# Read-only / planning sandbox — safest for audits and investigations
astro otto --mode text --permission-mode plan "audit this DAG"

# Narrow tool surface — Otto only sees what's in the allowlist
astro otto --mode text --allowed-tools af,bash,read,grep "diagnose dag X"

# Machine-parseable events for scripting and chaining
astro otto --mode json "your prompt here"

有关会话连续性(-c、--fork、--session、--no-session),请参阅会话控制。有关模型和思考级别的选择,请参阅模型和推理选择。

会话控制

会话按工作目录持久化到磁盘。

标志行为
-c、--continue恢复此目录中最近的会话
-r、--resume打开交互式会话选择器
--session <id|path>打开指定会话 — 接受 8 个或更多字符的 ID 前缀或完整路径
--fork <id|path>将会话分叉为一个全新的副本;原会话保持不变。可用于尝试其他方案,而不影响主线程。
--no-session仅在内存中运行,不在磁盘上留下痕迹。用于一次性提问。
--export <id|path>将现有会话渲染为 HTML 并退出

模式选择

标志使用时机
--mode text默认模式。将纯文本流式输出到 stdout。
--mode json输出可供机器解析的事件,用于脚本处理或串联。

在文本模式下,流式传输会自动检测 TTY。使用 --stream / --no-stream 强制指定。

权限模式

Otto 可以写入文件并运行 shell 命令。请根据任务的风险级别选择权限模式。

模式行为
default根据配置的规则允许、拒绝或提示工具。执行具有破坏性的 astro/af 命令前,Otto 会先询问。
plan只读沙箱。 完全禁止 edit 和 write。将 bash 限制为只读允许列表(ls、cat、git、rg、af、astro 等)。用于审计、规划和调查。
acceptEdits自动允许在项目文件夹内执行 edit 和 write。其他工具仍遵循常规规则。
confirmEdits每次执行 edit、write 或非只读 bash 时都会提示确认。允许规则无法绕过此提示。
bypassPermissions允许所有操作,但无法绕过安全检查(见下文)。

将 --permission-mode plan 与 --mode text 配合使用,是最安全的一次性操作方式:Otto 可以读取,但无法修改内容。

--skip-permissions 对整个会话持续生效,权限高于 --permission-mode bypassPermissions。除非用户明确要求,否则请避免使用。

无法绕过的安全检查

即使处于 bypassPermissions 模式,甚至使用了 --skip-permissions,以下检查也会触发:

  • 读取或写入敏感文件:.env*、~/.ssh/**、~/.aws/**、shell rc 文件
  • 在项目外写入(项目根目录之外的路径)
  • 具有破坏性的 Astro/Airflow 命令:astro deploy、astro deployment delete、astro dev kill、af dags delete、af runs delete、af tasks clear、af connections delete、af variables delete 等。

不要以为使用 --skip-permissions 就能让 Otto 完全无人值守地运行。

工具允许列表

--allowed-tools <csv> 会将列表以外的所有内容从 Otto 的视野中完全移除。适用于范围较窄的任务:

# Only let Otto query Airflow and read files
astro otto --mode text --allowed-tools af,read,grep,find \
  "diagnose why model_orders failed yesterday"

# Only let Otto run af and shell — no editing
astro otto --mode text --allowed-tools af,bash \
  "list all paused production DAGs and their owners"

结构化输出

使用 --output-schema 强制 Otto 输出带类型的最终答案:

astro otto --mode json --output-schema @schema.json \
  "find DAGs with import errors and return as JSON"

需要使用 --mode text 或 --mode json。Otto 会注册一个合成的 submit_final_answer 工具,其载荷符合该架构。

模型与推理选择

可用模型集会在运行时从 Astronomer Gateway 获取,并且会随时间变化。不要将模型名称硬编码——先列出可用模型:

astro otto --list-models                  # full list
astro otto --list-models anthropic        # filter by substring

astro otto --model <id> --mode text "..."
astro otto --thinking <off|minimal|low|medium|high|xhigh> --mode text "..."

对于规划、迁移或全机群审计,选择上下文长度为 1M 的模型,并使用 --thinking medium 或 high。 对于机械式或脚本化任务,较小、较快的模型配合 --thinking low 通常就足够了。

默认设置会保存在 ~/.astro/otto/settings.json 中。

MCP 服务与扩展

  • MCP:传入 --mcp-config /path/to/mcp.json,以接入用户配置的服务(数据仓库、工单系统等)。Otto 的 Airflow 工具(af)已内置,无需为此使用 MCP。
  • 扩展:使用 --extension <name> / --no-extension <name> 按会话启用或禁用(可重复使用),也可通过 OTTO_EXTENSIONS / OTTO_DISABLED_EXTENSIONS 设置。持久化设置保存在 ~/.astro/otto/extensions.json 和 .astro/otto/extensions.json 中。

常见委派模式

仅进行调查规划
astro otto --mode text --permission-mode plan --thinking medium \
  "your investigation prompt"
使用结构化输出的脚本化流水线
astro otto --mode json --output-schema @schema.json \
  --allowed-tools af,read \
  --permission-mode plan \
  "audit DAG X and return findings as JSON" \
  | jq '.final_answer'

对于多轮委派,先启动一次,然后使用 -c 恢复。对于并行分支,请参阅会话控制中的 --fork。

成本与延迟

每次调用都会启动一个全新的 Agent,并拥有自己的上下文窗口。大多数情况下遵循两条规则即可:

  • 优先使用 -c / --session,而不是从头开始重新提示——这样可以保留缓存和先前的发现。
  • 根据任务选择 --thinking——xhigh 成本较高;low / medium 足以应对大多数工作。

Otto 会自动检测的内容

当你从 Astro 项目中启动 astro otto 时,CLI 会为你设置以下内容。无需手动导出:

变量设置来源
ASTRO_TOKEN、ASTRO_DOMAIN、ASTRO_ORGANIZATION当前的 astro login 上下文(在后台自动刷新)
AIRFLOW_API_URL如果 astro dev start 正在运行,则使用本地 Airflow 代理
AIRFLOW_USERNAME、AIRFLOW_PASSWORD连接本地 Airflow 时,默认为 admin/admin

Otto 还会从当前工作目录(cwd)向上遍历至 /,加载找到的所有 AGENTS.md 或 CLAUDE.md(以及 ~/.astro/otto/AGENTS.md)。如果同一文件夹中同时存在这两个文件,则以 AGENTS.md 为准。这意味着从项目文件夹委派任务给 Otto 时,它会自动获取该项目的说明。

注意:af 需要连接到 Airflow

如果无法访问任何 Airflow 实例,Otto 仍可读取和编辑 DAG 代码,但不会运行 af 命令。对于需要检查 DAG 运行、任务日志、连接或变量的任务,请确保本地 Airflow 已先启动(astro dev start),或通过 ~/.af/config.yaml 传入实例配置。

自动验证 DAG

dag-validation 扩展默认已启用。Otto 编辑或写入任何 dags/*.py 文件后,都会运行 af dags errors,并尝试在同一轮中自行修正——但前提是能够访问 Airflow 实例。

这对委派 DAG 编辑很方便,但也意味着:

  • 如果没有运行中的 Airflow,委派的编辑不会自动验证。
  • 如果希望只修改代码而不进行验证往返,请使用 --no-extension dag-validation 禁用此扩展。

子 Agent 扩展(默认关闭)

Otto 可通过 subagent 扩展派发自己的子进程。启用后会注册一个带有 fast 和 deep 模型层级的 subagent 工具——适用于委派由多个部分组成、并希望 Otto 自行并行处理的任务。

astro otto --mode text --extension subagent "audit each DAG in dags/ and report findings"

在 .astro/otto/extensions.json 中配置各层级的模型。

设置优先级

Otto 按以下顺序解析配置(越靠前优先级越高):

  1. CLI 标志(--model、--allowed-tools、--no-extension 等)
  2. 环境变量(OTTO_DISABLED_EXTENSIONS 等)
  3. 项目文件(.astro/otto/permissions.json、.astro/otto/extensions.json、.astro/config.yaml)
  4. 用户文件(~/.astro/otto/settings.json、~/.astro/config.yaml)
  5. 内置默认值

完整参考请参阅 Otto 设置。

验证 Otto 是否可用

astro otto version    # installed Otto version + update check
astro otto --help     # full flag reference
astro otto update     # pull latest Otto release

Otto 默认会自动更新(每天检查一次,并在下次启动时应用更新)。运行 astro config set -g otto.auto_update false 可选择退出自动更新。

如果系统无法识别 astro otto,则需要 Astro CLI v1.42 或更高版本。建议运行 brew upgrade astro,或使用他们采用的安装程序进行升级。

权威参考资料

评论

支持 Markdown