今天演示下 A2A 框架如何实现远程代理,让 AI 帮我们做报销单。
回顾下 A2A 的架构,核心的三部分,用户、客户端、远程代理,后面程序分别有 客户端和远程代理的实现。
首先下载代码:
git clone https://github.com/google/A2A/
cd A2A
里面提供了很多框架集成 A2A 的示例:
• Agent Development Kit (ADK)
• CrewAI
• Enterprise Data Agent (Gemini + Mindsdb)
• LangGraph
• Genkit
• LlamaIndex
• Marvin
• Semantic Kernel
• AG2 + MCP
运行客户端
我们先运行客户端 ui 程序,客户端可以认为是我们的主代理,同时负责与用户进行交互。
cd demo/ui
echo "GOOGLE_API_KEY=your_api_key_here" >> .env
uv run main.py
新建一个聊天,输入hello,测试一下,
提示当前没有任何的远程代理。
运行远程代理
我们现在启动一个 google_adk 的远程代理示例:
cd ../../samples/agents/google_adk/
cp ../../../../demo/ui/.env ./
uv run .
输入如下
INFO: Started server process [89962]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://localhost:10002 (Press CTRL+C to quit)添加远程代理
我们打开 Agents 页面,然后点击添加:
弹窗里输入我们看到的地址localhost:10002,然后点击读取:
可以看到这个代理的信息:
点击保存就能看到我们添加的 远程代理 了:
这是一个报销代理,为了方便,我们把页面翻译成中文:
用户提交报销任务
然后再新建一个聊天,大模型是理解中文的,我们直接用中文问,「你当前有那些代理」:
新建一个聊天,让 AI 帮我们做一个报销单、
输入报销去北京出差费用 2000, 日期 : 2024-12-12
客户端检测到代理:报销代理,然后根据你当前的信息自动填写表单,返回给你,
这里我们确认无误不需要修改直接提交,
经过短暂的处理,报销申请审批通过了。(只要报销存在,报销代理会自动审批报销单)
事件驱动
我们下面分析一下整个过程中有哪些事件,点击事件菜单:
我们关注下ActorRole和内容三列:
任务列表
最后看一下任务列表,点击任务列表菜单、
目前只有一个报销任务提交给了报销代理。
实现远程代理
下面简单讲一下如何使用 Python 实现一个远程代理。
首先定义一个远程代理类:
class ReimbursementAgent(AgentWithTaskManager):
"""An agent that handles reimbursement requests."""
SUPPORTED_CONTENT_TYPES = ['text', 'text/plain']
def__init__(self):
self._agent = self._build_agent()
self._user_id = 'remote_agent'
self._runner = Runner(
app_name=self._agent.name,
agent=self._agent,
artifact_service=InMemoryArtifactService(),
session_service=InMemorySessionService(),
memory_service=InMemoryMemoryService(),
)
然后实现_build_agent方法、
def _build_agent(self) -> LlmAgent:
"""Builds the LLM agent for the reimbursement agent."""
return LlmAgent(
model='gemini-2.0-flash-001',
name='reimbursement_agent',
description=('代理的简短介绍'),
instruction="""代理的提示词,什么情况下使用哪个提示词""",
tools=[ # 工具列表
create_request_form,
reimburse,
return_form,
],
)
提示词参考:
您是负责处理员工报销流程的代理。
收到报销申请后,首先应使用 create_request_form() 创建一个新的申请表单。仅在用户提供默认值的情况下才提供默认值,否则请使用空字符串作为默认值。
1. “日期”:交易日期。
2. “金额”:交易金额。
3. “业务理由/目的”:报销原因。
创建表单后,应返回调用 return_form 的结果,其中包含 create_request_form 调用中的表单数据。
收到用户填写完毕的表单后,应检查表单是否包含所有必需信息:
1. “日期”:交易日期。
2. “金额”:申请报销的金额。
3. “业务理由/目的”:报销的项目/对象/工件。
如果您没有掌握所有信息,则应直接通过调用 request_form 方法拒绝该请求,并提供缺少的字段。
对于有效的报销申请,您可以使用 reimburse() 为员工报销。
* 在您的回复中,您应该包含 request_id 和报销申请的状态。
代理定义了 三个方法:
• create_request_form,
• reimburse,
• return_form,
实际业务中可以自己构建表单和填写业务逻辑。一般表单都是 agent 返回 Schema 然后再 客户端渲染,Schema 的格式约定好即可。
代码
最后再重复下, A2A 的官方代码库: https://github.com/google/A2A/[1],有兴趣的可以自己运行,或者根据代码库样例集成自己的业务。
页面使用了 Google 自己的 Python Web UI 框架,整体看起来还行,不过有时候反应比较慢,大家运行的时候注意卡的话耐心等待。
引用链接
[1]:https://github.com/google/A2A/
领取专属 10元无门槛券
私享最新 技术干货