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。
从这里开始
- 代码仓库:a2aproject/a2a-cli ;
- 实践教程(Cookbook):位于仓库的
examples/目录,从第一个服务端一路讲到流式、配置和完整的任务生命周期; - 初次接触 A2A:先读什么是 A2A 与 Python 教程 。
A2A CLI 以 Apache License 2.0 开源。更多工具见官方 SDK 。