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

作者
  • avatar
    姓名
    Nino
    职业
    Senior Tech Editor

在当前的 AI 开发浪潮中,大多数开发者构建的聊天机器人都是“孤岛”。这些机器人通常拥有私有的 API 接口,只能与特定的前端或系统通信。然而,AI 智能体的未来在于互操作性——即智能体之间能够像人类通过语言交流一样,通过标准协议互相发现并协作。今天,我们将探讨如何使用 A2A (Agent-to-Agent) 协议和 LangGraph 构建一个标准化的聊天机器人。通过结合 n1n.ai 提供的稳定 LLM API,你可以快速实现这一目标。

为什么选择 A2A 协议与 LangGraph?

在深入代码之前,我们需要理解这两个核心技术的价值:

  1. A2A 协议:可以将其类比为 AI 界的 HTTP。它定义了一套标准,包括“智能体卡片(Agent Card)”用于能力声明,以及基于 JSON-RPC 的消息交换格式。这意味着任何支持 A2A 的客户端都可以直接与你的机器人对话,无需适配私有接口。
  2. LangGraph:这是 LangChain 团队推出的高级框架,专门用于构建复杂的、有状态的多智能体系统。与传统的线性链式结构不同,LangGraph 允许循环引用,非常适合需要反复思考、调用工具或进行多轮对话的场景。
  3. 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()

进阶优化建议

  1. 多模型冗余:在生产环境中,建议通过 n1n.ai 接入多个模型。如果 GPT-4 出现速率限制,可以无缝切换到 Claude 3.5 Sonnet,确保服务的 99.9% 可用性。
  2. 状态持久化:LangGraph 支持 checkpointer。你可以将对话状态存储在 Redis 中,利用 A2A 请求中的 context_id 来实现跨会话的记忆能力。
  3. 流式响应 (Streaming):A2A 协议天然支持流式传输。在 AgentExecutor 中,你可以利用 chatbot_app.astream() 方法,将 LLM 生成的每一个 token 实时通过 event_queue 发送给客户端,极大提升用户体验。
  4. RAG 集成:你可以轻松地在 LangGraph 中增加一个检索节点,在调用 LLM 之前先从向量数据库获取背景知识,构建一个标准的 RAG (Retrieval-Augmented Generation) 智能体。

总结

通过本文的教程,你已经掌握了构建标准化 AI 智能体的核心技术栈。A2A 协议解决了“如何沟通”的问题,LangGraph 解决了“如何思考”的问题,而 n1n.ai 则解决了“底层动力”的问题。这种架构不仅让你的机器人更加专业,也为未来多智能体协作打下了坚实基础。

立即在 n1n.ai 获取免费 API 密钥,开启你的智能体开发之旅。