设计 Agent-Native CLI:AI 时代的 10 项原则
几十年来,命令行界面 (CLI) 的设计一直是以终端前的用户为主要用户。我们针对视觉对齐、ANSI 颜色和交互式提示进行了优化——这些元素对人类来说很直观,但往往会成为 AI agent 的障碍。
随着 agent 越来越多地成为我们 API 的主要消费者,设计理念必须发生转变。
Trevin Chow 最近提出了一个“Agent-Native CLI”框架,借鉴了他自己的工作以及 Cloudflare 和 HeyGen 等公司的实现。其核心论点很简单:当你首先为 agent 设计时,人类实际上会从由此产生的严谨性和一致性中受益。
第一层级:不要破坏 Agent
第一层级原则侧重于防御性设计。这些是确保 agent 不会挂起、无限循环或静默失败的基础要求。
1. 默认非交互式
Agent 无法回答“您确定吗?[y/N]”之类的提示。如果一个命令在等待输入时挂起,agent 就会直接停止。
- 标准: 每个可能需要提示的命令都必须具有
--no-input或--yes标志。 - 优化: Cloudflare 标准化使用
--force来绕过破坏性操作,并明确禁止使用--skip-confirmations以保持可预测的词汇表。
2. 结构化、可解析的输出
虽然人类喜欢表格,但 agent 需要可以可靠提取的数据。
- 标准: 在每个返回数据的命令上提供
--json标志。 - 优化: 保持严格的一致性。避免混合使用
--format=json和--output json。使用 stdout 用于数据,使用 stderr 用于诊断信息。
3. 具有教学意义且列举式的错误信息
像“invalid visibility”这样的错误对 agent 来说是一个死胡同。而像“--visibility must be one of: public, private, unlisted”这样的错误则允许 agent 在单次重试中进行自我纠正。
- 标准: 当拒绝不符合 enum 或 schema 的输入时,直接在错误消息中呈现有效的取值范围。
4. 安全重试与明确的变更边界
Agent 经常进行重试。如果没有幂等性,重试的“create”命令会导致重复的资源。
- 标准: 使用幂等性 token 或自然键。
- 优化: 为具有后果的操作实现
--dry-run,并确保破坏性操作需要一个明确的、非默认的标志。
5. 受限的响应
无限制的输出会浪费 token 并可能撑爆 agent 的上下文窗口。
- 标准: 在所有列表类命令上实现分页、限制和过滤。
- 优化: 提供截断消息,明确教导 agent 如何缩小下一次查询的范围(例如,“add --limit=N to see more”)。
第二层级:赋能 Agent
一旦 CLI 稳定下来,下一个目标是随着使用频率的增加使其变得更有用。这一层通常最好通过代码生成 (codegen) 或 schema 而非手动编码来实现。
6. 跨 CLI 词汇一致性
Agent 会构建关于 CLI 如何工作的通用模型。如果大多数工具使用 get 但你的工具使用 info,agent 会消耗 token 和重试次数来弄清楚这一点。
- 标准: 遵循社区惯例(例如,
get,list,create,update,delete)。 - 优化: 在 schema 层强制执行此规则,以防止因人工审核而产生的“瑞士奶酪”式的一致性。
7. 三层内省机制
渐进式帮助发现对于 agent 来说是不够的。它们需要工具能力的机器可读地图。
- 第一层: 面向人类的标准
--help。 - 第二层:
agent-context——一个版本化的、机器可读的 JSON,描述了 CLI 的全貌。 - 第三层: 技能清单 (例如,
SKILL.md)——长篇散文,教导 agent 如何将操作组合成复杂的流程。
8. 异步感知执行
强迫 agent 为异步任务编写自己的轮询循环是极其耗费 token 且易错的。
- 标准: 提供一个
--wait标志,直到完成为止阻塞。 - 优化: 维护一个本地任务账本(例如,
~/.cli/jobs.jsonl),这样如果 agent 在轮询中途断开连接,下一次调用可以恢复正在进行中的任务,而不是启动一个新任务。
9. 通过 Profile 实现持久化身份
无状态的 CLI 会迫使 agent 每次都必须重新指定相同的配置标志。
- 标准: 实现一个 profile 系统(
profile save,profile use)来封装配置。 - 优化: 在
agent-context中呈现可用的 profiles,以便 agent 可以发现现有的身份,而无需解析配置文件。 - **10. 双向 I/O Agent 经常需要将产物(如生成的视频或日志)移动到特定目的地。
- 标准: 实现一个支持
stdout,file:<path>, 和webhook:<url>的--deliver标志。 - 优化: 包含一个
feedback命令,允许 agent 直接向维护者报告摩擦点(例如,“此标志已被记录但被拒绝”)。
辩论:Agent-Native vs. Unix-Native
并非所有开发者都同意“agent-native”这个标签。一些人认为,这些原则其实就是一直以来应该遵循的“优秀的 CLI 设计”。
“如果你见过 jq,你就不需要任何人告诉你 --json 是一个非常有价值的东西……这仅仅是将命令行界面作为接口来严肃对待。除了在边缘部分,它几乎与 AI 无关。”
其他人则警告不要为了 agent 而过度设计,从而牺牲了人类的可用性,认为如果给 agent 提供足够好的“面向 LLM 的 manpage”,它们就足以应付混乱的 CLI。
无论哲学分歧如何,实际结果是一样的:一个可预测、结构化且一致的 CLI 对每种用户都更优,无论是碳基生命还是硅基生命。