本文档涵盖了 LobeChat 基于 Zustand 构建的客户端状态管理系统,包括存储架构、操作模式和状态同步机制。该系统通过模块化的切片方法管理聊天消息、主题、UI 状态和 AI 交互。
有关服务器端数据持久化的信息,请参阅 Data Storage 有关 AI 模型提供者状态管理,请参阅 AI 模型提供者系统。
LobeChat 采用基于切片(slice)的架构,并使用 Zustand 进行状态管理,其中不同功能区域被组织成独立的切片,这些切片共同组成一个统一的存储(store)。
主存储(main store)使用工厂模式组合所有切片,位于 src/store/chat/store.ts36-51
Sources: src/store/chat/store.ts src/store/chat/initialState.ts
每个切片负责特定的功能领域,拥有自己的操作(actions)、状态(state)和选择器(selectors)。
| 切片 | 目的 | 关键操作 | 状态属性 |
|---|---|---|---|
chatMessage | 消息 CRUD 操作 | addAIMessage, deleteMessage, updateInputMessage | messagesMap, messageEditingIds, messageLoadingIds |
chatTopic | 主题管理 | saveToTopic, switchTopic, summaryTopicTitle | topicMaps, activeTopicId, creatingTopic |
chatPlugin | 插件/工具执行 | triggerToolCalls, invokeBuiltinTool, updatePluginState | pluginApiLoadingIds, toolCallingStreamIds |
chatAiChat | AI 消息生成 | sendMessage, regenerateMessage, internal_coreProcessMessage | chatLoadingIds, abortController |
chatThread | 会话线程 | createThread, switchThread, updateThreadTitle | threadMaps, activeThreadId |
Sources: src/store/chat/store.ts20-30 src/store/chat/slices/message/action.ts src/store/chat/slices/topic/action.ts src/store/chat/slices/plugin/action.ts
消息切片处理所有聊天消息操作,支持乐观更新和后端服务同步。
消息以会话和主题为键存储在映射中:src/store/chat/utils/messageMapKey.ts `messagesMap` 使用 `"sessionId"` 或 `"sessionId@@topicId"` 等键来分层组织消息。
消息操作通过 internal_dispatchMessage src/store/chat/slices/message/action.ts272-284 进行乐观更新,它在服务调用完成前立即更新 UI。这种模式可以防止异步操作期间的 UI 闪烁。
Sources: src/store/chat/slices/message/action.ts src/store/chat/slices/message/initialState.ts src/store/chat/slices/message/selectors.ts
主题将聊天消息组织成会话线程,并支持自动生成标题和持久化。
saveToTopic() src/store/chat/slices/topic/action.ts95-115 使用当前消息创建主题summaryTopicTitle() src/store/chat/slices/topic/action.ts138-173 生成 AI 驱动的标题internal_dispatchTopic() 进行乐观更新Sources: src/store/chat/slices/topic/action.ts src/store/chat/slices/topic/initialState.ts src/store/chat/slices/topic/selectors.ts
插件切片负责协调工具调用、函数执行和流式响应。
工具调用在 triggerToolCalls() src/store/chat/slices/plugin/action.ts252-290 中处理,它会
LOADING_FLAT 内容的工具消息default 类型工具触发后续 AI 消息Sources: src/store/chat/slices/plugin/action.ts src/store/chat/slices/builtinTool/initialState.ts
选择器(Selectors)提供计算状态和派生数据,并带有记忆化(memoization)以提高性能。
选择器在整个 UI 中用于派生计算状态
Sources: src/store/chat/slectors.ts src/store/chat/slices/message/selectors.ts src/store/chat/slices/topic/selectors.ts src/features/ChatInput/useSend.ts
存储(store)使用 SWR 进行数据获取,并使用乐观更新进行修改,从而与后端服务同步。
useFetchMessages) src/store/chat/slices/message/action.ts245-266 自动同步服务器数据Sources: src/store/chat/slices/message/action.ts245-269 src/store/chat/slices/topic/action.ts193-213 src/store/chat/slices/topic/action.ts287-289
聊天存储(chat store)通过明确定义的接口与其他系统组件集成。
| 集成 | 接口 | 用途 |
|---|---|---|
| 消息服务 | messageService.* | 消息的 CRUD 操作 |
| 主题服务 | topicService.* | 主题生命周期管理 |
| 聊天服务 | chatService.runPluginApi, chatService.fetchPresetTaskResult | AI 交互与工具执行 |
| Agent 存储 | useAgentStore.getState() | AI 调用的 Agent 配置 |
| 工具存储 | useToolStore.getState() | 插件验证与工具转换 |
| 文件存储 | useFileStore | 文件上传状态协调 |
存储(store)使用依赖注入模式来访问这些服务,同时通过测试文件中的模拟接口保持可测试性。
Sources: src/store/chat/slices/message/action.ts10-12 src/store/chat/slices/topic/action.ts14-16 src/store/chat/slices/plugin/action.ts10-14 src/features/ChatInput/useSend.ts19-22