openai-chatkit-advanced-samples
OpenAI 官方 Agent 对话框架,通过 Widget 系统让 AI 能够实时推送结构化 UI 组件到前端
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
OpenAI 官方 Agent 对话框架,通过 Widget 系统让 AI 能够实时推送结构化 UI 组件到前端
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象这样一个场景:你和 AI 助手对话,不仅能聊天,还能直接让它帮你订机票、改行程、搜索新闻——而且结果以精美卡片的形式实时渲染在聊天界面里。这就是 OpenAI ChatKit 试图解决的核心问题:让 AI Agent 从"能说会道"进化到"能动手办事"。

图1:Cat Lounge 示例中,用户为虚拟猫咪取名并照顾其状态
2024 年,OpenAI 正式推出 Responses API 和 Agent 工具链,ChatKit 正是在这一背景下诞生的官方 SDK。它并非一个独立的 AI 模型或服务,而是一套前后端集成框架,帮助开发者快速构建具有工具调用能力和丰富 UI 交互的对话式应用。
ChatKit 的设计理念可以类比为"AI 应用的 Bootstrap"——它已经处理好了 Agent 与前端之间最繁琐的通信协议、事件流和组件封装,开发者只需要关注业务逻辑(定义工具、设计 prompt)即可。
这个仓库的架构非常清晰:每个示例都是一个前后端分离的最小可行产品(MVP)。
后端层(Python / FastAPI):
核心依赖是 openai-chatkit>=1.5.3,配合 openai>=1.40。后端通过 @function_tool 装饰器定义业务工具——以 Cat Lounge 为例,feed_cat、play_with_cat、clean_cat 三个函数分别对应猫咪养成游戏中的喂食、玩耍、清洁操作。Agent 在收到用户请求后,会调用对应的工具函数,然后通过 ServerToolCallEvent 将结果以结构化事件的形式推送给前端。
值得注意的是,ChatKit 后端的事件流采用流式 Server-Sent Events(SSE),每次工具调用和 Agent 响应都是一个独立的 Event,分段推送到前端,保证了大模型生成过程中的实时反馈。
前端层(TypeScript / React / Vite):
前端引入 @openai/chatkit-react 组件库,提供了开箱即用的 ChatKitPanel(消息面板)和 ChatComposer(输入框)。更重要的是,前端通过 onClientTool 和 onServerTool 回调来劫持工具调用的生命周期:
onServerTool:当后端 Agent 触发工具时,前端可以先拦截,执行客户端逻辑(如弹出选择器、切换 UI 状态),再决定是否让工具真正执行。onClientTool:纯前端工具,不经过后端,适合即时交互(如表情动画、Canvas 操作)。前端的状态管理采用 Zustand,这是一个轻量级的 React 状态库,比 Redux 简洁得多,适合这类需要跨组件共享对话状态的场景。

图2:Customer Support 示例中,Agent 工具调用后右侧面板实时展示行程信息
仓库内置了四个场景化示例,覆盖了不同的复杂度和功能深度:
| 示例 | 场景 | 工具类型 | 特色功能 |
|---|---|---|---|
| Cat Lounge | 虚拟猫咪养成 | 后端状态读写 | 猫咪命名建议 Widget |
| Customer Support | 航空公司客服 | 航班查询、改签、退票 | 实时面板 + 语音输入 |
| News Guide | 新闻编辑室助手 | 全文检索、标签搜索 | @提及作者/文章、页面上下文 |
| Metro Map | 地铁线路规划 | 地图数据查询 | React Flow 画布交互 |
Cat Lounge 是最基础的示例,展示了如何用 ChatKit 构建一个带状态的对话 Agent。后端的 CatStore 维护每条对话线程(thread)中的猫咪状态,工具函数直接读写这个状态,并将变化通过事件流推送给前端刷新 UI。
Customer Support 则复杂得多,引入了实时数据源(航班时刻表)和多工具协同——Agent 需要先查询用户行程,再根据用户意图调用改签或退票工具,最后用右侧面板展示操作结果。语音输入(speech-to-text)则由 ChatKit 的 dictation 功能提供支持。
News Guide 是检索增强生成(RAG)的典型实现:Agent 拥有完整的新闻元数据检索工具链(按标签、关键词、作者、页面搜索),还可以通过 @Elowen 这种 @提及语法触发人员查询,返回带有预览卡片的结构化结果。
Metro Map 展示了如何将对话 Agent 与图形界面深度集成。Agent 调用 get_map、list_stations、get_line_route 等工具查询地铁数据后,结果不仅以文字回复,还会在右侧的 React Flow 画布上高亮对应线路和站点。用户还可以用对话指令"Add a new station named Aurora"来触发画布编辑——Agent 调用 show_line_selector 流式返回线路选择 Widget,前端进入 placement mode 让用户在画布上放置新站点。
ChatKit 最具特色的设计是 Widget(小组件)系统。传统的 AI 对话只能返回文字,Widget 让 Agent 可以"推送"结构化的 UI 元素给用户。
Widget 分两种:
build_widget_response() 构建,包含显示文本和动作按钮,前端渲染为可交互卡片。onServerTool 拦截后自行构建,适合需要访问 DOM 或 Canvas 的场景(如 React Flow 节点操作)。Widget 的设计思路参考了 Slack/Figma 的 Block Kit——Agent 返回一个声明式的 Widget 描述,前端负责渲染和交互,交互结果再传回 Agent,形成一个"对话 → 工具 → UI → 对话"的闭环。
从部署角度看,这个项目有几个关键要求:
npm run <example> 命令可以一键同时启动前后端。目前没有提供 Docker 支持,也不支持一键部署到云平台。对于想快速尝鲜的开发者,需要分别安装 Node.js 20+ 和 Python 3.11+ 环境。虽然有一定门槛,但文档非常清晰,任何有基本 Web 开发经验的工程师都能在 10-15 分钟内跑起来。
react@19,这是较新的版本,可能与某些第三方库存在兼容性问题。ChatKit 的出现填补了 OpenAI Agent 生态中前端集成层的空白。在 ChatKit 之前,开发者想用 OpenAI 的 Agent SDK 构建有丰富 UI 的应用,需要自己处理 SSE 流、工具调用协议、消息渲染等一系列工程问题。ChatKit 把这些都封装成了可复用的组件。
从行业趋势看,AI 应用正在从"对话即服务"(Chatbot)向"对话即平台"(Agentic App)演进——用户不再只是和 AI 聊天,而是通过对话指令来操控真实系统(订票、编辑文档、操作图形界面)。ChatKit 正是这一趋势的一个具体实现,它代表了 AI 前端交互设计的一个方向:让 AI 能力通过 Widget 和工具调用,真正嵌入到用户的操作流程中。