菜单

状态管理和存储

相关源文件

本文档涵盖了 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, updateInputMessagemessagesMap, messageEditingIds, messageLoadingIds
chatTopic主题管理saveToTopic, switchTopic, summaryTopicTitletopicMaps, activeTopicId, creatingTopic
chatPlugin插件/工具执行triggerToolCalls, invokeBuiltinTool, updatePluginStatepluginApiLoadingIds, toolCallingStreamIds
chatAiChatAI 消息生成sendMessage, regenerateMessage, internal_coreProcessMessagechatLoadingIds, abortController
chatThread会话线程createThread, switchThread, updateThreadTitlethreadMaps, 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

主题管理

主题将聊天消息组织成会话线程,并支持自动生成标题和持久化。

主题创建流程

  1. saveToTopic() src/store/chat/slices/topic/action.ts95-115 使用当前消息创建主题
  2. summaryTopicTitle() src/store/chat/slices/topic/action.ts138-173 生成 AI 驱动的标题
  3. 主题状态通过 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 中处理,它会

  1. 创建带有 LOADING_FLAT 内容的工具消息
  2. 路由到适当的插件类型处理器
  3. 用结果更新消息内容
  4. 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 进行数据获取,并使用乐观更新进行修改,从而与后端服务同步。

同步模式

  1. 获取:SWR hooks(如 useFetchMessagessrc/store/chat/slices/message/action.ts245-266 自动同步服务器数据
  2. 更新:操作(Actions)执行乐观更新,随后进行服务调用并刷新
  3. 加载:布尔标志用于跟踪操作状态,以便提供 UI 反馈

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.fetchPresetTaskResultAI 交互与工具执行
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