Skip to main content
CopilotKit 提供完整的 React 聊天运行时,与 LangGraph 配合使用时效果特别好,尤其是当你希望智能体返回结构化 UI 负载而不仅仅是纯文本时。在这种模式下,你的 LangGraph 部署同时提供图 API 和自定义 CopilotKit 端点,而前端将助手消息解析为动态 React 组件。 这种方法在以下场景中很有用:
  • 需要现成的聊天运行时,而不是自己连接 stream.messages
  • 需要自定义服务器端点,可以在已部署的图旁边添加特定于提供商的行为
  • 需要从受约束的组件注册表渲染结构化生成式 UI
有关 CopilotKit 特定的 API、UI 模式和运行时配置,请参阅 CopilotKit 文档

工作原理

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

安装

后端端点:
前端应用:

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

关键思想是 LangGraph 部署不仅提供图服务。它还可以加载 HTTP 应用,让你在部署旁边挂载额外的路由。 langgraph.json 中,将 http.app 指向你的自定义应用入口点:
然后创建 Hono 应用并注册 CopilotKit 路由:
app.ts
这个自定义应用是重要的扩展点:它挂载了一个 CopilotKit 感知的运行时,而不替换底层的 LangGraph 部署。 在该路由内,创建 CopilotRuntime 并使用 LangGraphAgent 将其指回已部署的图:
copilotkit.ts
路由适配器只是 TypeScript 设置的一半。你的 LangChain 智能体还需要中间件来读取转发的 output_schema 并将其转换为模型的结构化 responseFormat
agent.ts
这个中间件使前端的 useAgentContext({ description: "output_schema", ... }) 变得有用。CopilotKit 运行时转发 schema,智能体将其转换为模型必须遵循的结构化输出契约。 结果是清晰的关注点分离:
  • LangGraph 仍然负责图执行和持久化
  • CopilotKit 负责面向聊天的运行时契约
  • 你的自定义端点将两者粘合在一个部署中

构建前端应用

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

注册动态组件

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

将助手消息渲染为动态 UI

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

最佳实践

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