A2A CLI:在终端中发现、调用和管理智能体

A2A CLI:在终端中发现、调用和管理智能体

October 1, 2026·技术文章·A2A CLI, 命令行, 编码助手, 自动化

A2A 让智能体之间能够对话。但世界上大部分角色并不是智能体:shell 脚本、定时任务、构建步骤、测试工具,或者只需要交接一项任务的编码助手。官方的 A2A CLI(a2a)是一个命令行客户端,为所有 A2A 智能体提供同一套命令界面。

它填补的空白

A2A 是双向的:任何 A2A 智能体都可以作为客户端,把任务交给另一个智能体。但这只在智能体之间成立。脚本、定时任务、构建步骤、测试工具,或者坐在终端前的人,都很难发现智能体的能力、向它发送消息并跟进任务直至完成。

还有另一个空白:随着生态增长,社区和各语言 SDK 都出现了自己的命令行工具,它们在命令名、参数、输出形态和传输处理上各不相同,为其中一个写的脚本无法用于另一个。

A2A CLI 同时填补这两个空白:任何能运行命令的对象,无论是你自己、一个脚本,还是调用工具的模型或编码环境,都可以用同一种标准方式访问 A2A 智能体。它基于 A2A Go SDK 中的 CLI 构建,使用 A2A Protocol v1.0。

三种用法

  • 赋能 AI 编码助手:给编码智能体提供 a2a 工具,它就能把工作交给专业的远程 A2A 智能体,无需定制集成代码;
  • 即时交互:在终端中获取 Agent Card、发送消息并实时接收流式更新;
  • 自动化工作流:协议原生的 JSON 输出和可预期的退出码,让 a2a 易于接入流水线,把非 A2A 系统桥接到 A2A 智能体。

安装

# macOS / Linux(Homebrew)
brew tap a2aproject/a2a-cli https://github.com/a2aproject/a2a-cli
brew install a2a
# Windows(WinGet)
winget install a2aproject.a2acli
# 从源码安装(Go)
go install github.com/a2aproject/a2a-cli@latest
# go install 会把二进制命名为 a2a-cli,需要重命名为 a2a
mv "$(command -v a2a-cli)" "$(dirname "$(command -v a2a-cli)")/a2a"

也可以从最新发布 下载预构建的压缩包,解压后把 a2a 放到 PATH 中。安装之后,三条命令即可开始:

# 发现智能体的卡片
a2a card get https://agent.example.com

# 发送消息并等待结果
a2a send -a https://agent.example.com "Hello, what can you do?"

# 在事件到达时流式接收
a2a send -a https://agent.example.com --stream "Summarize this document"

动手:把普通脚本变成 A2A 智能体

不需要 SDK,也不需要任何 A2A 专用代码,就能得到一个可以交互的服务端。CLI 内置了两种服务模式:

  • --echo:把收到的消息原样返回,相当于 A2A 的“ping”,是确认连接最快的方法;
  • --exec:把任何从 stdin 读取、向 stdout 写入的程序变成可用的 A2A 服务端。任何脚本都能成为智能体。

--echo 与 --exec 面向学习、演示和测试,不用于生产环境。

第 1 步:用 echo 服务端热身

在终端 A 启动最简单的服务端:

a2a server --echo --port 8080

在终端 B 发送消息,得到相同文本的回复:

a2a send -a http://localhost:8080 "hello world from A2A"

这就是一次完整的 A2A 往返。用 Ctrl-C 停止,接下来让它真正做点事。

第 2 步:写一个“不懂 A2A”的智能体

--exec 的约定很简单:CLI 把收到的消息通过 stdin 传给程序,把程序输出到 stdout 的内容作为响应;退出码 0 表示成功,非 0 表示失败;stderr 会被记录并附加到失败信息中。任何能读 stdin、写 stdout 的语言都符合要求。

将下面的脚本保存为 a2a_unaware_agent.py,它把每个单词按行编号输出,并带有短暂延迟,用来模拟真实智能体的工作,也为第 4 步的流式传输做铺垫:

#!/usr/bin/env python3
"""An A2A-unaware agent.

`a2a server --exec` pipes the incoming message to stdin and turns stdout
into the response. Exit 0 => completed, non-zero => failed. Use `python3 -u`
so stdout is unbuffered and chunks stream promptly.
"""

import sys
import time


def main() -> int:
    message = sys.stdin.read().strip()
    if not message:
        print("error: empty message", file=sys.stderr)
        return 1

    # Stream one line per word so --chunk can split on newline.
    for i, word in enumerate(message.split(), start=1):
        print(f"{i}. {word}")
        sys.stdout.flush()
        time.sleep(0.3)
    return 0


if __name__ == "__main__":
    sys.exit(main())

由于 --exec 只是把 stdin 接到 stdout,在引入 CLI 之前就可以先验证脚本本身:

$ echo "hello world" | python a2a_unaware_agent.py
1. hello
2. world

第 3 步:对外提供服务并与之对话

在终端 A 用服务端包装脚本。不带 --chunk 时,--exec 会等脚本结束,再把全部输出作为一次响应返回:

a2a server --exec "python3 -u a2a_unaware_agent.py" --port 8080

在终端 B 发现并发送任务:

# 通过读取卡片确认服务已启动
a2a card get -a http://localhost:8080

# 一次性发送消息并获得回复
a2a send -a http://localhost:8080 "hello world from A2A"
# -> 1. hello
#    2. world
#    3. from
#    4. A2A

你用一个普通的 Python 脚本,搭起了一个可被发现的 A2A 智能体。

第 4 步:分块流式返回

长时间运行的智能体不应该让你等到完整答案。再次启动同一个脚本,这次用换行符设置 --chunk,让每一行作为单独的流式片段发送(终端 A):

a2a server --exec "python3 -u a2a_unaware_agent.py" --chunk=$'\n' --port 8080

然后实时观察片段到达(终端 B):

a2a send -a http://localhost:8080 --stream "one two three four"

同样的脚本、同样的服务模式、同样的 CLI,只是改了 --chunk 参数,响应就从缓冲变成了流式。

还能做什么

echo 与 exec 只是入门。a2a CLI 还提供:

  • Agent Card 发现:读取、保存并复用智能体的能力描述;
  • 丰富的消息与任务:构建多部分消息,同步或异步发送,并跟踪任务的完整生命周期;
  • 流式传输:随更新产生而消费;
  • 适合自动化的输出:JSON 输出和可预期的退出码,适用于流水线和脚本;
  • 跨传输一致性:开箱支持 JSON-RPC、REST 和 gRPC,并支持无需重新编译即可添加的自定义传输插件。

让编码助手使用 CLI

CLI 是一个干净的工具界面,可以交给 AI 编码助手,让它自行把工作委派给 A2A 智能体。a2a-cli Agent Skill 教会 Claude Code、Cursor、Codex 等编码环境从命令行驱动 a2a:

npx skills add https://github.com/a2aproject/a2a-cli --skill a2a-cli

该 Skill 驱动的是 a2a 二进制,因此请先安装 CLI。

从这里开始

A2A CLI 以 Apache License 2.0 开源。更多工具见官方 SDK 。

来源:Meet the A2A CLI(官方博客)