CopilotKit 提供了一个完整的 React 聊天运行时,当您希望智能体返回结构化 UI 负载而非仅返回纯文本时,它与 LangGraph 的配合尤为出色。在此模式下,您的 LangGraph 部署同时服务图形 API 和一个自定义的 CopilotKit 端点,而前端则将助手消息解析为动态的 React 组件。 在服务器端,copilotkit 包提供了 CopilotKitMiddleware,使得 LangGraph 图形、LangChain 智能体或 Deep Agent 能够遵循 Agent UI (AG-UI) 线路协议,将工具和消息事件流式传输到聊天 UI,并读写共享的 CopilotKit 状态切片,同时提供辅助函数以便在您的图形前端挂载一个与 CopilotKit 兼容的 HTTP 端点。 当您需要以下功能时,这种方法非常有用:
  • 一个现成的聊天运行时,而不是自己手动接线 stream.messages
  • 一个自定义的服务器端点,可以在部署的图形旁边添加特定于提供商的行为
  • 从受限组件注册表渲染的结构化生成式 UI
CopilotKit for LangGraph 文档还介绍了基于同一中间件和客户端的 生成式 UI、人在回路中 (HITL) 和共享状态。
有关 CopilotKit 特定的 API、UI 模式和运行时配置,请参阅 CopilotKit 文档。有关 Deep Agent 的演练,请参阅 CopilotKit 文档中的 Deep Agents and CopilotKit。

工作原理

从高层次看,CopilotKit 位于您的 React 应用和 LangGraph 部署之间。前端将对话状态发送到挂载在图形 API 旁边的自定义 /api/copilotkit 路由,该路由将请求转发给 LangGraph,而响应则会返回助手消息以及您的组件注册表可以渲染的任何结构化 UI 负载。
  1. 照常部署图形:使用 LangSmith 或 LangGraph 开发服务器。
  2. 使用 HTTP 应用扩展部署:在图形 API 旁边挂载一个 CopilotKit 路由。
  3. 将前端包装在 CopilotKit 中:并将其指向该自定义运行时 URL。
  4. 注册动态 UI 组件:并在渲染时将助手响应解析为这些组件。

Python 服务器端您将获得什么

copilotkit 及相关包是 LangGraph 部署与 CopilotKit 客户端之间的桥梁。 CopilotKitMiddleware 对于 create_deep_agent 和 create_agent 创建的图形(当您将其添加到 middleware 列表中时)是相同的中间件。对于带有 CopilotKitState 和 FastAPI 桥接的 create_agent 图形,请遵循下面的 Python main.py 示例。结构化生成式 UI(例如客户端的 useAgentContext 和 output_schema)需要额外的中间件,将 Copilot 状态映射到结构化输出策略,如本节中可展开的 src/middleware.py 示例所示。 在 langgraph.json 的 http 键上挂载 app,遵循常规的 LangGraph 或 LangSmith 部署方式,因此一个进程同时为图形和同一个 FastAPI 应用服务 CopilotKit 客户端。

安装

后端端点:
中间件包与 Deep Agents 技术栈并存。将其与您的聊天模型包一起安装(此示例使用 OpenAI):
前端应用:

将 CopilotKit 与 Deep Agent 结合使用

将 CopilotKitMiddleware 添加到传递给 create_deep_agent 的 middleware 列表中。该中间件允许 CopilotKit 路由前端工具调用,并使聊天状态与您的图形保持一致。将您配置的任何其他中间件保留在同一列表中。 编译好的图形随后即可插入到支持 CopilotKit 或 AG-UI 的进程中(例如,下面的 FastAPI 模式)或 CopilotKit 文档中的指南,如 Deep Agents and CopilotKit。

使用自定义端点扩展 LangGraph 部署

核心思想是 LangGraph 部署不仅仅服务图形。它还可以加载一个 HTTP 应用,这使您能够在部署本身旁边挂载额外的路由。 在 langgraph.json 中,将 http.app 指向您的自定义应用入口点:
在 Python 中,创建一个 FastAPI 应用,并通过 CopilotKit 的 AG-UI 桥接暴露 LangGraph 智能体:
main.py
这个自定义应用是关键的扩展点:它在不替换底层 LangGraph 部署的情况下,挂载了一个支持 CopilotKit 的运行时。 在 Python 中,等效的工作发生在中间件中:规范化 CopilotKit 上下文,并将来自 useAgentContext(...) 的 output_schema 转发到模型的结构化输出配置中。
src/middleware.py
结果是清晰的关注点分离:
  • LangGraph 仍然负责图形执行和持久化
  • CopilotKit 负责面向聊天的运行时契约
  • 您的自定义端点将它们粘合在一次部署中
当您使用 CopilotKit 运行时适配器时,请将您的 CopilotKit runtimeUrl 指向 FastAPI(或其他)应用暴露的路由,而不仅仅是原始的图形 REST 接口。 遵循 CopilotKit 文档中关于 Node CopilotRuntime 中的 LangGraphHttpAgent 或 LangGraphAgent 的说明;Python 端的图形和中间件仍然定义工具行为和智能体逻辑。 :::

构建前端应用

在前端,将您的应用包装在 CopilotKit 中,并将其指向自定义运行时 URL:
这里有两个重要部分:
  • runtimeUrl="/api/copilotkit" 将聊天发送到您的自定义后端路由,而不是直接发送到原始的 LangGraph API
  • useAgentContext(...) 将 UI 架构发送给智能体,以便模型知道应该产生什么结构化输出格式

注册动态组件

组件注册表位于 useChatKit() 中。在此您定义允许智能体发出的组件集合,例如卡片、行、列、图表、代码块和按钮。
这个注册表成为了智能体与 UI 之间的契约。模型不是在生成任意的 JSX,而是在生成必须根据您暴露的组件和属性进行验证的结构化数据。

将助手消息渲染为动态 UI

一旦助手响应到达,自定义消息渲染器将决定如何显示它。在此示例中:
  • 助手消息根据 UI 套件架构被解析为结构化 JSON
  • 有效的结构化输出被渲染为真实的 React 组件
  • 用户消息被渲染为普通的聊天气泡
这种渲染器模式使得集成感觉很原生:
  • CopilotKit 处理聊天状态和传输
  • 自定义渲染器决定助手负载如何成为 UI
  • Hashbrown 将经过验证的结构化数据转换为具体的 React 元素

资源

最佳实践

  • 保持自定义端点轻量: 用它来将 CopilotKit 适配到您的图形部署,而不是复制图形内部已有的业务逻辑
  • 显式发送架构: useAgentContext 应在每次页面挂载时描述 UI 契约
  • 注册受限的组件集: 只暴露您确实希望模型使用的组件和属性
  • 将渲染视为解析步骤: 在渲染助手内容之前,根据您的架构对其进行解析
  • 保持用户消息为纯文本: 只有助手消息需要结构化渲染器;用户消息可以保持为普通的聊天气泡