深入 OpenMuse 与 CopilotKit AG-UI 集成:Rich Threads 持久化与流式事件渲染内幕
发布时间:2026/10/2 7:13:43 锦皓数字建站

深入 OpenMuse 与 CopilotKit AG-UI 集成Rich Threads 持久化与流式事件渲染内幕【免费下载链接】openmuseA personal agent with a browser, terminal, files, and work that keeps going built with CopilotKit and AG-UI.项目地址: https://gitcode.com/gh_mirrors/op/openmuseOpenMuse 是一个自带浏览器、终端和文件的个人 Agent任务关闭 App 后也能继续推进。它基于 CopilotKit 构建核心体验由 AG-UI 流式事件与 Rich Threads 持久化两套机制支撑回复实时流式渲染为工具卡片整段对话随时可重放、重命名、归档与恢复。本文带你走进源码讲清这套机制是如何实现的。3 件事让你用上 Rich Threads 持久化OpenMuse 的客户端是共享 iOS、Android 与 Web 的 React Native 应用源码位于 apps/mobile/聊天、工具卡片与文档全部通过 CopilotKit 的 headless 钩子渲染。服务端则是一个 Hono API内嵌 CopilotRuntime 与任务引擎apps/server/src/agent.ts。启用 Rich Threads 只需三步克隆仓库并安装依赖git clone https://gitcode.com/gh_mirrors/op/openmuse运行npx copilotkitlatest login与npx copilotkitlatest project select生成项目密钥把密钥作为CPK_INTELLIGENCE_API_KEY放入 API 服务器环境变量后重启密钥必须只留在服务端——缺失时 API 会直接启动失败避免静默丢对话。主对话为何刷新后依然是同一条这是新手最容易困惑的地方为什么重新打开应用主对话不会变成一条新对话服务端先占座。客户端启动时请求 /api/main-thread服务端用insertIfAbsent为每个用户固化一个主对话 threadId再通过intelligence.getOrCreateThread在 CopilotKit Intelligence 中预置它。这样即便首条消息还没发出就刷新主对话也保持不变。客户端做重放。选择一条已保存对话时chat.tsx 会挂载一个私有 Agent 实例agentId形如openmuse-threadId然后调用copilotkit.connectAgent让 Intelligence 重放整条线程消息。切换过的对话会保持挂载草稿与消息队列不会因页面导航而丢失。线程菜单全靠useThreads。threads.tsx 中一个useThreads({ agentId: default, includeArchived: true, limit: 20 })钩子就覆盖了列出、重命名、归档、恢复与分页加载更多侧边聊天则由客户端生成全新 threadId在首次运行时落盘。注意自动命名被关闭agent.ts 中generateThreadNames: false命名完全交给用户。流式事件渲染内幕一条 AG-UI 事件之旅流式体验的关键在 engine/conversation.tsConversationAgent继承 AG-UI 的AbstractAgent其run()返回一个ObservableBaseEvent事件流。一次回复的骨架是RUN_STARTED→TEXT_MESSAGE_START/TEXT_MESSAGE_CONTENT增量文本/TEXT_MESSAGE_END→ 穿插TOOL_CALL_START/TOOL_CALL_ARGS/TOOL_CALL_END/TOOL_CALL_RESULT→RUN_FINISHED失败则RUN_ERROR这些事件经 app.ts 中挂载在/api/copilotkit/*的 runtime 以 SSE 推给客户端代码里甚至专门把字符串 chunk 转成字节流保证浏览器正确接收。工具卡片是钩子而非硬编码。客户端用useRenderTool为每个工具注册渲染器如browse_web→ 带实时截图的浏览器卡片、search_mail→ 邮件卡片再由useRenderToolCall在消息流中按toolCallId配对渲染详见 chat.tsx。这就是生成式 UIAgent 调一次工具界面上就多一张可交互卡片。富工具消息任务卡片为何永远是最新的重放一条老对话时消息里存的是任务 ID 而不是结果快照。渲染器thread-artifacts.tsx 中的TaskThreadCard拿到 ID 后实时请求/api/agent/tasks/id拉取当前任务状态、浏览器预览与 PDF 链接。还有一个安全细节文件和预览的短时效签名 URL 每次由服务端现场生成绝不存入线程消息。线程只保留稳定 ID既避免链接过期也让历史对话可无限期回放。跟随队列与停止让对话有手感的细节回复期间输入框保持可编辑后续消息进入可见、可删除的队列当前回复及其持久化完成后按序发送conversation-queue.ts。停止即暂停队列点停止按钮调用copilotkit.stopAgent草稿完整保留队列挂起而非清空SDK 层的错误也会通过订阅onError统一收敛conversation-run.ts。队列只活在打开的 App 里它不是服务器收件箱委派给服务端的长任务则是独立的持久化工作两者互不混淆。下一步从哪里继续读官方文档入口docs/README.mdRich Threads 配置与验证边界docs/RICH-THREADS.md交互设计与对话行为docs/EXPERIENCE.md服务端 Agent 与工具定义apps/server/src/engine/conversation.ts客户端线程与聊天实现apps/mobile/src/相关测试真实 runtime 模拟 Intelligence 边界tests/rich-threads.test.ts一句话总结Rich Threads 负责对话永远在AG-UI 流式事件负责过程看得见。两者在 OpenMuse 中分工清晰——持久化交给 CopilotKit Intelligence 与稳定 ID渲染交给事件驱动的 headless 钩子——这正是它既像聊天应用、又像工作台的原因。【免费下载链接】openmuseA personal agent with a browser, terminal, files, and work that keeps going built with CopilotKit and AG-UI.项目地址: https://gitcode.com/gh_mirrors/op/openmuse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。