Agent CLI 概览与工作流程
一、概述
1.1 什么是 Agent CLI
Agent CLI 是智能体(AI Agent)与计算机系统交互的核心范式。在智能体语境下,CLI(Command Line Interface,命令行界面) 是 AI 操控环境最原始、最强大的手段——AI 通过生成文本命令直接与操作系统、文件系统、外部工具进行交互。
核心定义: Agent CLI = 自然语言输入 → LLM 推理 → 结构化命令生成 → 安全执行 → 结果解析 → 自然语言回答
架构定位: 在整个 Agent 工具调用体系中,CLI 处于执行层——它不负责”理解意图”(那是 Function Call 的事),不负责”协议通信”(那是 MCP 的事),也不负责”流程引导”(那是 Skill 的事),CLI 只负责一件事:把任务可靠地执行出来。
┌──────────────────────────────────────────────────┐
│ Skill(认知与流程层) │
│ 告诉 Agent:什么时候、按什么顺序、用什么标准做 │
├──────────────────────────────────────────────────┤
│ MCP(协议与通信层) │
│ 标准化 Agent 与外部系统的连接方式 │
├──────────────────────────────────────────────────┤
│ Function Call(意图与参数层) │
│ 将自然语言翻译为结构化的函数调用指令 │
├──────────────────────────────────────────────────┤
│ CLI(执行与行动层) ← 本文焦点 │
│ 可靠地、可复现地执行每一个具体任务 │
└──────────────────────────────────────────────────┘
1.2 为什么 AI 选择 CLI
LLM 本质上是文本生成模型——输入文本、输出文本。而 CLI 恰恰是计算机世界中最纯粹的文本交互范式:命令是文本,参数是文本,输出也是文本。这种天生的”语法同构”决定了 CLI 是 AI 与操作系统交互的最短路径:
| 交互方式 | 优势 | 劣势 |
|---|---|---|
| GUI(图形界面) | 人类直观 | 需模拟鼠标点击、像素识别,脆弱且难以泛化 |
| API 调用 | 结构精准 | 需为每个工具单独编写适配代码 |
| CLI(命令行) | 文本天然适配 AI,50年Unix生态沉淀 | 需安全沙箱保障 |
相比其他方式,CLI 提供了一条统一且强大的中间路径:Unix 50 年积淀的管道(|)、重定向(>)、脚本组合能力,让 AI 通过简单的文本命令即可编排任意复杂的操作链。
二、核心架构:CLI-First 模式
2.1 设计哲学
构建确定性的 CLI 工具,再用 AI 提示词包装它。 Deterministic code execution > ad-hoc prompting
Requirements(需求) → CLI Tool(实现) → Prompting Layer(编排)
要做什么 怎么做 智能调度
反模式(Prompt-Driven):
用户请求 → AI 临时生成代码/操作 → 结果不可复现、难以调试
正确模式(CLI-First):
用户请求 → AI 使用确定性 CLI → 结果一致、可复现、可测试
2.2 CLI-First 三步法
第一步:理解需求 —— 梳理系统需要支持的操作、数据实体、查询需求、输出格式、边界情况。
第二步:构建确定性 CLI —— 为每个操作用明确的命令实现:
# 命令结构:tool <command> <subcommand> [options]
# 创建操作
evals use-case create --name newsletter-summary --description "..."
evals test-case add --use-case newsletter-summary --file test.json
# 执行操作
evals run --use-case newsletter-summary --model claude-3-5-sonnet
# 查询操作
evals query runs --use-case newsletter-summary --limit 10
evals query runs --model gpt-4o --score-min 0.8
# 对比操作
evals compare models --use-case newsletter-summary --prompt v1.0.0
CLI 设计关键特征:
- 显式:每个操作都有具名的命令
- 一致:遵循标准 CLI 约定(标志、选项、子命令)
- 确定性:相同命令始终产生相同结果
- 可组合:命令可串联或脚本化
- 可发现:
tool --help展示所有命令
第三步:用提示词包装 —— AI 将用户意图映射为 CLI 命令序列:
用户:"运行 newsletter-summary 的评估,比较 Claude 和 GPT-4"
AI 执行:
1. evals run --use-case newsletter-summary --model claude-3-5-sonnet
2. evals run --use-case newsletter-summary --model gpt-4o
3. evals compare models --use-case newsletter-summary
4. 向用户呈现结构化的对比结果
2.3 提示词层的职责边界
| 提示词层负责 | 提示词层不负责 |
|---|---|
| 理解用户意图 | 用临时代码复制 CLI 功能 |
| 将意图映射为 CLI 命令 | 绕过 CLI 直接生成方案 |
| 按正确顺序执行命令 | 执行本应由 CLI 完成的操作 |
| 处理错误和重试逻辑 | ”简单操作”就跳过 CLI |
| 向用户总结结果 |
三、完整工作流程
3.1 ReAct 循环范式
Agent CLI 的执行遵循 ReAct(Reasoning + Acting) 范式,核心循环为:
思考(Reasoning) → 行动(Action) → 观察(Observation) → 思考(Reasoning) → ...
单次任务的完整六步流程:
┌────────────────────────────────────────────────────────────┐
│ ① 输入解析 │
│ 用户通过自然语言提出需求,Agent 接收并开始处理 │
├────────────────────────────────────────────────────────────┤
│ ② 推理决策 │
│ LLM 分析任务,判断需要调用哪些 CLI 工具或命令组合 │
├────────────────────────────────────────────────────────────┤
│ ③ 命令生成 │
│ Agent 根据推理结果生成具体的 Shell 命令 │
├────────────────────────────────────────────────────────────┤
│ ④ 安全执行 │
│ 命令在沙箱环境或受控 shell 中执行,经过白名单和权限校验 │
├────────────────────────────────────────────────────────────┤
│ ⑤ 结果解析 │
│ Agent 捕获输出,进行结构化解析,提取关键信息 │
├────────────────────────────────────────────────────────────┤
│ ⑥ 反馈回答 │
│ 将执行结果转化为自然语言,向用户呈现最终答案 │
└────────────────────────────────────────────────────────────┘
3.2 实际交互示例
# 用户提问(自然语言)
"我的电脑磁盘空间不够了,帮我看看是什么占用了空间?"
# Agent 内部推理
→ LLM 判断需要先查看磁盘使用情况
# 执行命令 1:查看磁盘整体使用率
$ df -h /
输出: /dev/sda1 100G 85G 15G 85% /
# 执行命令 2:找出最大的前10个文件/目录
$ du -sh /home/* 2>/dev/null | sort -rh | head -10
输出: 32G /home/user/Downloads
# Agent 最终回答
"检测到您的根目录使用率已达 85%,主要占用空间的是
/home/user/Downloads 文件夹(32G)。建议清理 Downloads
文件夹中的无用大文件。"
3.3 多步骤编排流程
复杂任务中,Agent 会将多个 CLI 命令编排为工具链:
用户:"运行所有评估用例,找出不及格的"
# 步骤1:获取所有用例列表
evals list use-cases --json
# 步骤2:对每个用例运行评估
for each use_case:
evals run --use-case <id>
# 步骤3:查询不及格结果
evals query runs --status failed --json
# 步骤4:向用户呈现结构化报告
四、工作原理
4.1 核心机制:文本→命令→执行→反馈
┌─────────────┐
自然语言输入 ──────▶ │ LLM 推理 │
└──────┬──────┘
│
┌──────▼──────┐
│ 工具选择与 │
│ 参数生成 │
└──────┬──────┘
│
┌───────────────┼───────────────┐
│ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ Shell 命令 │ │ 文件操作 │ │ API 调用 │
│ (bash) │ │ (Read/Edit/│ │ (HTTP/ │
│ │ │ Write) │ │ RPC) │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└───────────────┼───────────────┘
│
┌──────▼──────┐
│ 输出捕获与 │
│ 结构化解析 │
└──────┬──────┘
│
┌──────▼──────┐
│ 自然语言 │
│ 回答生成 │
└─────────────┘
4.2 安全机制
CLI 执行环境必须经过严格的安全控制:
| 安全层 | 机制 | 说明 |
|---|---|---|
| 沙箱隔离 | 在受控环境中执行,限制文件系统和网络访问 | 防止误操作影响宿主机 |
| 命令白名单 | 预定义允许执行的命令集合 | 阻止危险命令(rm -rf / 等) |
| 权限校验 | 执行前检查操作权限 | 防止越权访问 |
| 输出过滤 | 对执行结果进行安全过滤 | 防止敏感信息泄露 |
| 超时控制 | 设置命令执行时间上限 | 防止死循环占用资源 |
4.3 命令配置标志设计
CLI 工具应通过标志暴露执行行为控制,使工作流能无需代码更改即可适应不同场景:
# 执行模式标志
tool run --fast # 快速模式(省时,轻量)
tool run --thorough # 全面模式(耗时,深度)
tool run --dry-run # 预览模式(只展示不执行)
# 输出控制标志
tool run --format json # 机器可读
tool run --format markdown # 人类可读
tool run --quiet # 最小输出
tool run --verbose # 详细日志
# 资源配置标志
tool run --model haiku # 快速/低成本模型
tool run --model sonnet # 平衡型模型
tool run --model opus # 强大/高成本模型
# 后处理标志
tool generate --thumbnail # 生成缩略图版本
tool process --no-cache # 绕过缓存,强制重新执行
标志设计原则:
- 合理默认值:不带标志时工具也能正常工作
- 显式覆盖:标志修改默认行为
- 布尔标志:
--flag启用,不出现则禁用 - 值标志:
--flag <value>用于选择(模型、格式等) - 可组合:标志之间应逻辑兼容
4.4 工具间协作机制
当一个任务需要多个工具配合时,Agent 采用以下协作模式:
| 模式 | 说明 | 适用场景 |
|---|---|---|
| 管道组合 | `cmd1 | cmd2 |
| 顺序编排 | 依次执行多个命令 | 有依赖关系的步骤 |
| 并行分派 | 同时启动多个子Agent | 独立问题域并发处理 |
| 条件分支 | 根据执行结果选择下一步 | 需要动态决策的场景 |
4.5 多 Agent 并行模式
面对多个独立任务时,Agent CLI 支持并行 Agent 分派:
用户:"修复这3个不同模块的测试失败"
Agent 1 → 修复 auth 模块测试(独立问题域)
Agent 2 → 修复 batch 模块测试(独立问题域) 同时执行
Agent 3 → 修复 abort 模块测试(独立问题域)
并行分派原则:
- 一个 Agent 一个独立问题域 —— 不共享状态,不相互依赖
- 任务规格化 —— 每个 Agent 获得明确的范围、目标和约束
- 结果集成 —— Agent 返回后统一审查,运行全量测试验证
五、在整个 Agent 体系中的定位
5.1 四种核心范式对比
Agent 工具调用体系中存在四种核心范式,CLI 是其中最基础也是最强大的执行手段:
| 维度 | CLI | Function Call | MCP | Skill |
|---|---|---|---|---|
| 控制力 | 极高(系统级) | 中高(API级) | 中(资源级) | 中(流程级) |
| 稳定性 | 低(自然语言生成) | 高(Schema校验) | 极高(协议化) | 高(模版化) |
| 安全性 | 极具挑战 | 较好(权限内) | 良好(标准鉴权) | 极高(受控闭环) |
| 建设成本 | 中 | 中 | 高(早期) | 极低 |
| 核心价值 | 直接、通用执行 | 结构化参数提取 | 标准化集成 | 领域知识固化 |
| 类比 | AI 的”四肢” | AI 的”手” | AI 的”USB-C” | AI 的”肌肉记忆” |
5.2 协同工作模式
在实际 Agent 系统中,四种范式协同工作:
用户请求
│
▼
Skill 匹配 ← "这是一个代码审查任务,加载 code-reviewer Skill"
│
▼
Function Call ← "需要调用 read_file(git diff) 获取变更内容"
│
▼
MCP 连接 ← "通过 git-server 获取仓库差异"
│
▼
CLI 执行 ← 实际执行 bash 命令、读写文件、运行 linter
│
▼
结果返回 ← Skill 格式化为结构化的审查报告
六、最佳实践
6.1 CLI 设计准则
- 分层命令结构:
tool command subcommand --flag value - 多输出格式:人类可读默认 +
--json机器可读 - 幂等性:相同命令多次执行结果一致,
--force强制覆盖 - 验证机制:
--dry-run预览、--explain说明 - 清晰错误信息:指出具体错误 + 建议修复方案
- 退出码规范:0 = 成功,1 = 用户错误,2 = 系统错误
6.2 提示词层最佳实践
// 正确:始终使用 CLI
await bash('evals run --use-case newsletter-summary');
// 错误:用临时代码复制 CLI 功能
const config = await readYaml('...');
for (const test of tests) {
// ... 手动实现
}
6.3 何时使用 CLI-First 模式
应该使用 CLI-First:
- 需要多次重复执行的操作
- 相同输入必须产生相同输出的场景
- 涉及文件、数据库、配置等状态管理
- 需要查询、过滤、聚合数据
- 需要独立于 AI 进行测试
- 用户可能需要脚本化或自动化
不需要 CLI-First:
- 仅执行一次的操作
- 简单的单个文件读写
- 纯计算(无状态管理或副作用)
- 临时数据分析
七、关键结论
构建能脱离 AI 完美运行的工具,然后再用 AI 让它们更易用。 Build tools that work perfectly without AI, then add AI to make them easier to use.
Agent CLI 的本质是:AI 作为编排者,确定性代码作为执行者。AI 负责理解意图、选择工具、编排流程;CLI 工具负责可靠地、可复现地执行每个具体任务。这种分工使得 Agent 系统同时具备了 AI 的灵活性和传统软件的可靠性。
本文档基于 PAI 系统架构、CLI-First 设计模式、智能体工具调用体系等源文件合成。 最后更新:2026年5月