chat-a2a 是一个支持a2a协议的,基于multiagent 设计的问答服务。
项目特点
-
默认采用multiagent 回答用户问题,即一个问题至少经过一个plan agent和一个execute agent。
-
多个agent之间的关系有多种范式,本项目默认采用集中式编排范式,由主控 Agent(Planner)负责接收用户输入、拆分任务、分配给子 Agent 执行。
- 示例链路 query ==> plan ==> agent1 ==> plan ==> agent2 ==> ... ==> report
-
在工程上采用plan agent 与 execute agent 分离的设计,plan agent由本项目负责,execute agent的管理由a2a-runtime 负责,两个项目之间通过a2a协议通信。
- chat-a2a 只负责通过gate-agent(plan) 编排remote agent回答问题(也可以在chat-a2a中实现local agent),自身并不负责直接回答问题。
- chat-a2a负责维护会话、用户(还未加)、聊天等数据,remote agent 只负责根据输入给出输出即可(可以考虑接入mcp),理论上无需再访问db等存储。
-
agent问答记录直接存在message表中,地位与用户问题、最终答案相同。
id conv_id intention_id role type content agent 1 conv1 intention1 user 天气如何 2 conv1 intention1 agent query 天气如何 plan 3 conv1 intention1 agent input_required 您问到哪里的天气 weather 4 conv1 intention1 user 上海 5 conv1 intention1 agent query 上海天气如何 plan 6 conv1 intention1 agent answer 上海天气很热 weather 7 conv1 intention1 assistant 上海天气很热
关于问答
- 最小粒度的概念是message_id
- 最大粒度的概念是conversation_id 两者之间,一个较为中间粒度的概念是意图/intention_id(本来想叫task_id,但不想跟a2a 中的task_id对应)
考虑到问答链路, 以是否有人工参与,分为以下场景
- 简单问答,无需人工,plan 调度几次agent 即可回答
- plan ==> agent ==> report
- plan ==> agent1 ==> plan => agent2 ==> report
- plan ==> agent1 ==> plan ==> agent1 ==> report。(假设agent1 是一个检索agent,则在一次问答时可能被多次调用)
- 复杂问答
- plan ==> agent1(input_required) ==> user ==> plan ==> agent1 ==> report
- plan ==> agent1(input_required) ==> user ==> plan ==> agent1 ==> plan ==> agent2 ==> report
这些message 在db 里共用一个intention_id,主要用于在带有input_required场景下第二次user 进入plan时, 为plan恢复plan的上下文。
支持反问相关设计如下
- local/remote agent 反问通过input_required 来表达,这也是a2a推荐的方式
- 反问场景下,用户两次输入的问题属于同一个intention_id
- 用户/前端和gate_agent 并不感知某条agent 输出是否是反问,而是根据message表跟踪agent 执行记录。这样做可以让gate_agent 无需引入类似langgraph checkpoint机制 ,更灵活一些。
如果用户在反问场景下,不回应agent返回而是直接输入新问题,则仍沿用之前的task_id 会有问题,后续会继续优化。
用户:天气如何
AI:您问哪里的天气?
用户:曹操是谁
AI:xx
- 选择一个db,创建chat-a2a 数据库
- 运行migrations/up/v1.0.0.sql 创建数据库表
cp .env.example .env- 配置.env 文件,主要包括db 连接信息、llm 模型信息
- 安装python 依赖
poetry install - 启动a2a-runtime
- 运行chat-a2a
poetry run python -m main # 或配置venv 后运行 python main.py
项目仍不完善,欢迎共创

