使用 A2A 协议和 LangGraph 构建你的第一个 AI 聊天机器人
- 作者

- 姓名
- Nino
- 职业
- Senior Tech Editor
在当前的 AI 开发浪潮中,大多数开发者构建的聊天机器人都是“孤岛”。这些机器人通常拥有私有的 API 接口,只能与特定的前端或系统通信。然而,AI 智能体的未来在于互操作性——即智能体之间能够像人类通过语言交流一样,通过标准协议互相发现并协作。今天,我们将探讨如何使用 A2A (Agent-to-Agent) 协议和 LangGraph 构建一个标准化的聊天机器人。通过结合 n1n.ai 提供的稳定 LLM API,你可以快速实现这一目标。
为什么选择 A2A 协议与 LangGraph?
在深入代码之前,我们需要理解这两个核心技术的价值:
- A2A 协议:可以将其类比为 AI 界的 HTTP。它定义了一套标准,包括“智能体卡片(Agent Card)”用于能力声明,以及基于 JSON-RPC 的消息交换格式。这意味着任何支持 A2A 的客户端都可以直接与你的机器人对话,无需适配私有接口。
- LangGraph:这是 LangChain 团队推出的高级框架,专门用于构建复杂的、有状态的多智能体系统。与传统的线性链式结构不同,LangGraph 允许循环引用,非常适合需要反复思考、调用工具或进行多轮对话的场景。
- n1n.ai 的支持:高性能的智能体离不开稳定的底层大模型。 n1n.ai 聚合了全球顶尖的 LLM(如 GPT-4o, Claude 3.5 Sonnet, DeepSeek-V3 等),为开发者提供统一、高速且高可用的 API 接入点。
环境准备
在开始编写代码前,请确保你的开发环境已配置:
- Python 3.12+:利用最新的异步特性和类型提示。
- UV 包管理器:由 Astral 开发的极速 Python 包管理工具。安装命令:
curl -LsSf https://astral.sh/uv/install.sh | sh。 - API 密钥:访问 n1n.ai 获取 API 密钥,用于调用后台大模型。
第一步:初始化项目
使用 uv 创建一个隔离的虚拟环境并初始化项目:
mkdir a2a-langgraph-demo
cd a2a-langgraph-demo
uv venv
uv init
编辑 pyproject.toml 文件,添加必要的依赖项:
[project]
name = "a2a-langgraph-demo"
version = "0.1.0"
dependencies = [
"a2a-sdk[http-server]>=0.3",
"langgraph>=0.2",
"langchain-core>=0.3",
"langchain-openai>=0.2",
"uvicorn[standard]>=0.30",
"python-dotenv>=1.0.1"
]
执行 uv sync 完成安装。由于我们使用了 n1n.ai 的 API,网络延迟和稳定性将得到极大保障。
第二步:编写 LangGraph 核心逻辑
创建 agent.py。我们将定义一个简单的状态图,包含一个 LLM 节点。
from typing import Annotated
from langchain_core.messages import BaseMessage, HumanMessage
from langchain_openai import ChatOpenAI
from langgraph.graph import END, START, StateGraph
from langgraph.graph.message import add_messages
from typing_extensions import TypedDict
# 定义状态:使用 add_messages 确保消息列表是追加而非覆盖
class ChatState(TypedDict):
messages: Annotated[list[BaseMessage], add_messages]
def model_node(state: ChatState):
# 建议在 .env 中配置 OPENAI_BASE_URL 为 n1n.ai 的地址
model = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)
response = model.invoke(state["messages"])
return {"messages": [response]}
def build_app():
workflow = StateGraph(ChatState)
workflow.add_node("chatbot", model_node)
workflow.add_edge(START, "chatbot")
workflow.add_edge("chatbot", END)
return workflow.compile()
chatbot_app = build_app()
第三步:实现 A2A 智能体执行器 (Agent Executor)
这是连接 A2A 协议层与 LangGraph 业务层的桥梁。创建 agent_executor.py:
from a2a.server.agent_execution import AgentExecutor, RequestContext
from a2a.server.events import EventQueue
from a2a.utils import new_agent_text_message
from langchain_core.messages import HumanMessage
from agent import chatbot_app
class MyAgentExecutor(AgentExecutor):
async def execute(self, context: RequestContext, event_queue: EventQueue) -> None:
# 从 A2A 上下文中获取用户输入
user_text = context.get_user_input()
if not user_text:
await event_queue.enqueue_event(new_agent_text_message("请输入有效内容。"))
return
# 调用 LangGraph 流程
# 注意:在生产环境建议使用异步 ainvoke
inputs = {"messages": [HumanMessage(content=user_text)]}
result = await chatbot_app.ainvoke(inputs)
# 提取最后一条 AI 回复
ai_reply = result["messages"][-1].content
# 将结果推送到 A2A 事件队列
await event_queue.enqueue_event(new_agent_text_message(ai_reply))
async def cancel(self, context: RequestContext, event_queue: EventQueue) -> None:
# 暂不支持取消操作
raise NotImplementedError("Cancel not supported.")
第四步:启动 A2A 服务器
创建 server.py。这里我们需要定义“智能体卡片”,它是其他智能体识别你的关键。
import uvicorn
from a2a.server.apps import A2AStarletteApplication
from a2a.server.request_handlers import DefaultRequestHandler
from a2a.server.tasks import InMemoryTaskStore
from a2a.types import AgentCard, AgentSkill, AgentCapabilities
from agent_executor import MyAgentExecutor
from dotenv import load_dotenv
load_dotenv()
def start_server():
# 定义技能
chat_skill = AgentSkill(
id="chat",
name="基础聊天",
description="使用 LangGraph 驱动的标准化聊天机器人",
examples=["你好", "请介绍一下 A2A 协议"]
)
# 定义智能体卡片
card = AgentCard(
name="LangGraph-A2A-Bot",
description="基于 A2A 协议的示例智能体",
url="http://localhost:9999/",
capabilities=AgentCapabilities(streaming=True),
skills=[chat_skill]
)
# 绑定执行器
handler = DefaultRequestHandler(
agent_executor=MyAgentExecutor(),
task_store=InMemoryTaskStore()
)
# 构建应用
a2a_app = A2AStarletteApplication(agent_card=card, http_handler=handler)
app = a2a_app.build()
uvicorn.run(app, host="0.0.0.0", port=9999)
if __name__ == "__main__":
start_server()
进阶优化建议
- 多模型冗余:在生产环境中,建议通过 n1n.ai 接入多个模型。如果 GPT-4 出现速率限制,可以无缝切换到 Claude 3.5 Sonnet,确保服务的 99.9% 可用性。
- 状态持久化:LangGraph 支持
checkpointer。你可以将对话状态存储在 Redis 中,利用 A2A 请求中的context_id来实现跨会话的记忆能力。 - 流式响应 (Streaming):A2A 协议天然支持流式传输。在
AgentExecutor中,你可以利用chatbot_app.astream()方法,将 LLM 生成的每一个 token 实时通过event_queue发送给客户端,极大提升用户体验。 - RAG 集成:你可以轻松地在 LangGraph 中增加一个检索节点,在调用 LLM 之前先从向量数据库获取背景知识,构建一个标准的 RAG (Retrieval-Augmented Generation) 智能体。
总结
通过本文的教程,你已经掌握了构建标准化 AI 智能体的核心技术栈。A2A 协议解决了“如何沟通”的问题,LangGraph 解决了“如何思考”的问题,而 n1n.ai 则解决了“底层动力”的问题。这种架构不仅让你的机器人更加专业,也为未来多智能体协作打下了坚实基础。
立即在 n1n.ai 获取免费 API 密钥,开启你的智能体开发之旅。