CopilotKit 在 GitHub 上已经拿到 32,741 Stars,被 Google、LangChain、AWS、Microsoft、Mastra 同时采用——但大部分团队还是只把它当成一个"聊天浮窗"来用。他们错过了五个真正把它从 React 库升级为 Agentic Web 前端层的关键模式。
这个仓库 2023 年还只是一个 React 聊天 UI 辅助库,到 2026 年已经演化成跨平台 Agentic 框架,自带 AG-UI 协议(独立 14,060 星)、Generative UI 范式、以及 Agent 与 UI 之间的状态同步层。如果你写 React/Angular/Vue,你其实已经拥有了大多数底层能力——只是不知道这五个技巧。
隐藏用法 #1:把 Generative UI 当作 Tool 的"一等公民返回值"
大多数人的做法: 在聊天框里渲染"我帮你找到 3 个航班"这种纯文本。
隐藏技巧: 让后端 Tool 直接返回一个类型化完整的 React 组件描述,CopilotKit 的 <FrontendTool> 会在客户端自动把它 hydrate 成真正的 JSX。Agent 发出带 render 负载的 tool-call 事件,运行时在浏览器里直接解析为组件。
// agent.py(Python LangGraph Agent)
from copilotkit import CopilotKit
import json
ck = CopilotKit()
@ck.tool(name="show_flight_options", render=True)
def show_flight_options(origin: str, destination: str, dates: list[str]):
"""返回结构化航班数据,前端会渲染成卡片网格。"""
flights = search_flights(origin, destination, dates)
return {
"type": "flight_card_grid",
"flights": [
{"airline": f.airline, "price": f.price, "duration": f.duration}
for f in flights
],
}
// app/page.tsx — 注册渲染器
"use client";
import { FlightCardGrid } from "@/components/flight-card";
export default function Page() {
return (
<CopilotKit runtimeUrl="/api/copilotkit">
<FrontendTool
name="show_flight_options"
render={({ args }) => <FlightCardGrid flights={args.flights} />}
/>
<Chat />
</CopilotKit>
);
}
效果: Agent 的工具调用瞬间解析为一张样式完整的卡片网格。无需字符串解析、无需二次往返、无需 markdown 渲染。用户点选某张卡片后,下一步的 Agent 输入会直接拿到结构化的"已选航班"。
数据来源: CopilotKit 官方 README(2026-06-06)确认 <FrontendTool> 通过后端 Tool 的 render 标记启用。AG-UI 协议 GitHub 14,060 星、1,260 Forks(api.github.com,2026-06-06)。
隐藏用法 #2:Agent 与 UI 的双向共享状态
大多数人的做法: 把 tool-call 参数塞回 UI 端,再重新拉取一遍数据。
隐藏技巧: 用 useAgent().state 和 agent.setState() 建立一个双向同步的状态层——Agent 和 React 组件可以实时读写同一份状态。Agent 通过 SSE 发出 STATE_DELTA 事件,客户端应用增量更新而不必整树重渲染。
"use client";
import { useAgent } from "@copilotkit/react-core";
export function Dashboard() {
const { agent } = useAgent({ agentId: "analyst_agent" });
// 读取 Agent 状态(通过 AG-UI 同步)
const revenue = agent.state.revenue ?? 0;
const filter = agent.state.region ?? "ALL";
// UI 端写入——Agent 下一轮会看到这次变化
const onRegionChange = (r: string) => {
agent.setState({ region: r, revenue: 0 }); // 重置下游计算
};
return (
<div>
<select value={filter} onChange={(e) => onRegionChange(e.target.value)}>
<option value="ALL">全部地区</option>
<option value="NA">北美</option>
<option value="EU">欧洲</option>
</select>
<h1>${revenue.toLocaleString()}</h1>
</div>
);
}
效果: Agent 推理时直接看到用户当前正在操作的 React 状态。从 UI 端过滤仪表盘,下一步 Agent "看到"的数据会立刻改变——再也不需要手写 tool_arguments 这种命令式补丁。
数据来源: CopilotKit README 130-145 行确认 useAgent Hook 是程序化状态通道。AG-UI 规范把"双向状态同步"列为核心特性(ag-ui-protocol/ag-ui README,2026-06-06)。
隐藏用法 #3:把 Human-in-the-Loop 写成 Tool 的渲染动作,而不是条件分支
大多数人的做法: 在 Agent 图里加一个 if (user_confirmed) 节点,弹一个侧边弹窗让用户确认。
隐藏技巧: 用 useCopilotAction 的 renderAndWaitForResponse,让"用户输入"本身就是一次 Tool 调用。Agent 图暂停执行,UI 渲染一个确认表单,用户的选项作为 Tool 的返回值传回给 Agent。
"use client";
import { useCopilotAction } from "@copilotkit/react-core";
export function ApprovalForm() {
useCopilotAction({
name: "request_refund",
description: "在执行退款前请用户确认。",
parameters: [
{ name: "orderId", type: "string", required: true },
{ name: "amount", type: "number", required: true },
],
renderAndWaitForResponse: ({ args, respond }) => (
<div className="p-4 border rounded">
<p>
是否批准订单 {args.orderId} 的 ${args.amount} 退款?
</p>
<button onClick={() => respond({ approved: true })}>批准</button>
<button onClick={() => respond({ approved: false, reason: "user_declined" })}>
拒绝
</button>
</div>
),
});
return null;
}
效果: Agent 的 Tool 调用会一直阻塞到用户点击按钮,用户的决定作为正常的 Tool 返回值回到 Agent 端。不需要特殊的图节点、旁路状态机、也不会出现竞态条件。
数据来源: renderAndWaitForResponse API 是 CopilotKit 官方 HITL 原语(README 章节 "Human-in-the-Loop")。Slack 和 Teams 集成在应用外审批场景下共用同一个原语。
隐藏用法 #4:通过 AG-UI 协议让一个 Agent 跑在多个前端
大多数人的做法: 当产品要上移动端、Slack、或者合作方的网页时,再写一份独立的 React 组件树。
隐藏技巧: 用 AG-UI 协议保持 Agent 后端完全一致,只替换传输层。CopilotKit 官方为 React、Angular、Vue、React Native、Slack、Microsoft Teams 都提供了连接器,全部连到同一个 /api/copilotkit 端点。
# 同一个 Agent,只部署一次
npx copilotkit@latest deploy --target=cloud
# 三种不同前端,Agent 代码完全不动
# 1. Web(React/Next.js)
npx copilotkit@latest add-react /app
# 2. 移动端(React Native)
npx copilotkit@latest add-react-native /mobile
# 3. Slack
npx copilotkit@latest add-slack /slack-app
# agent.py 保持不变——唯一真实来源
from copilotkit import CopilotKitSDK
sdk = CopilotKitSDK()
# ... Tool 定义 ...
效果: 你的"Slack Agent"和"网页 Agent"在字面上是同一份 Python 或 TypeScript 文件。维护、测试、评估全部针对同一后端跑;只有 UI 客户端不同。
数据来源: CopilotKit README 列出 React/Next.js 为 GA、Angular/Vue/React Native 为 Supported、Slack/Teams 为 beyond-the-browser 集成(2026-06-06)。配套的 ag-ui-protocol/ag-ui 仓库 14,060 星确认 AG-UI 是底层传输协议(api.github.com,2026-06-06)。
隐藏用法 #5:每个用户维度的"自学习"——无需微调模型
大多数人的做法: 收集对话日志→微调模型→重新部署→祈祷效果变好。
隐藏技巧: 启用 CopilotKit 的 Continuous Learning from Human Feedback(CLHF)模块,它执行的是上下文强化学习——Agent 的 prompt 会被自动注入"该用户最近成功的(以及被修正的)交互"作为补充上下文。每个用户都得到一个为他个人定制的 Agent,而且不需要重训模型。
# 在 CopilotKit Cloud 控制台里启用 CLHF
copilotkit clhf enable --strategy=in_context_rl --window=20
# 在你的 Agent 中打开"上下文反馈通道"
from copilotkit import CopilotKitSDK
sdk = CopilotKitSDK()
@sdk.agent(name="support_agent", clhf=True)
def support_agent(ctx):
# CopilotKit 会把"每个用户最近 20 轮成功+被纠正的交互"
# 作为动态 system-message 块注入到 ctx.prompts
return run_llm(ctx.prompts, ctx.messages)
效果: Agent 真的会因为每个用户用得越多而越好用。用户的"别再推荐那个航班"和"就订这个吧"会流入下一轮 prompt,作为一份小而动态、用户专属的 system-message 块。不需要部署模型、不需要 GPU 成本、也不存在用聚合数据训练带来的隐私风险。
数据来源: CLHF(Self-Learning)出现在 CopilotKit README 的"Self-Learning (early access)"章节,定义为"上下文强化学习——Agent 从用户交互中自动变好,无需模型微调"(2026-06-06)。可通过 CopilotKit Cloud 或自托管启用。
总结
把 CopilotKit 从"聊天组件"升级成"2026 年 Agentic 平台"的五个模式:
- Generative UI 作为 Tool 返回值——返回 JSX 形态的数据,不要返回字符串
- 双向共享状态——让 Agent 看到用户正在看的东西
- Human-in-the-Loop 写成 Tool 渲染——把用户输入当成 Tool 调用,而不是图的分支
- 一个 Agent 跑在多个前端(AG-UI)——同一份 Python 文件驱动 Web、移动端、Slack
- 每用户维度的自学习——上下文强化学习,无需微调,无需 GPU
延伸阅读(dev.to 中文站):
你最想分享的 CopilotKit 玩法是什么? 在评论区贴一个你希望一年前就看到的 useCopilotAction 代码片段——我会在下一篇里挑最好的几个汇总。
Top comments (0)