聊天系统(中文译文)
原始 DeepWiki 页面:https://deepwiki.com/open-webui/open-webui/4-chat-system
翻译时间:2026-06-09T16:08:00.148Z
翻译模型:deepseek-chat
原文字符数:11478
项目:Open WebUI (open-webui)
---
聊天系统
相关源文件
以下文件为本 wiki 页面的生成提供了上下文:
backend/open_webui/tools/builtin.pybackend/open_webui/utils/middleware.pybackend/open_webui/utils/tools.pysrc/lib/components/chat/Chat.sveltesrc/lib/components/chat/MessageInput.sveltesrc/lib/components/chat/Messages.sveltesrc/lib/components/chat/Messages/Message.sveltesrc/lib/components/chat/Messages/MultiResponseMessages.sveltesrc/lib/components/chat/Messages/ResponseMessage.sveltesrc/lib/components/chat/Messages/UserMessage.sveltesrc/lib/components/workspace/Models/BuiltinTools.sveltesrc/lib/utils/index.ts
目的与范围
聊天系统是 Open WebUI 的核心界面,负责管理用户与 AI 模型之间的对话交互。本文档涵盖了消息的编写、处理、展示以及 AI 响应实时流式传输所涉及的架构、组件和数据流。
有关处理 AI 请求和工具执行的后端处理管道信息,请参阅后端处理管道。有关实时通信基础设施的详细信息,请参阅实时通信架构。
---
架构概览
聊天系统采用分层组件结构构建,以 Chat.svelte 作为主要编排器。它负责管理状态、协调子组件,并与后端 API 和 WebSocket 事件集成。
组件架构图
graph TB
Chat["Chat.svelte<br/>(主编排器)"]
MessageInput["MessageInput.svelte<br/>(输入处理器)"]
Messages["Messages.svelte<br/>(消息列表)"]
Message["Message.svelte<br/>(消息包装器)"]
UserMessage["UserMessage.svelte<br/>(用户显示)"]
ResponseMessage["ResponseMessage.svelte<br/>(AI 响应)"]
MultiResponse["MultiResponseMessages.svelte<br/>(多模型)"]
ContentRenderer["ContentRenderer.svelte<br/>(Markdown/代码)"]
Chat --> MessageInput
Chat --> Messages
Chat --> Navbar["Navbar.svelte"]
Chat --> ChatControls["ChatControls.svelte"]
Messages --> Message
Message --> UserMessage
Message --> ResponseMessage
Message --> MultiResponse
ResponseMessage --> ContentRenderer
ResponseMessage --> Citations["Citations.svelte"]
ResponseMessage --> CodeExecutions["CodeExecutions.svelte"]
MessageInput --> RichTextInput["RichTextInput.svelte"]
MessageInput --> FileItem["FileItem.svelte"]
MessageInput --> InputMenu["InputMenu.svelte"]
Chat -.->|"Socket.IO 事件"| SocketHandler["chatEventHandler()"]
Chat -.->|"API 调用"| Backend["后端 API"]
来源:
src/lib/components/chat/Chat.svelte:98-111src/lib/components/chat/Messages.svelte:19-23src/lib/components/chat/Messages/Message.svelte:1-50
---
核心组件与职责
Chat.svelte - 主编排器
Chat.svelte 组件(src/lib/components/chat/Chat.svelte:1-120)是主要控制器,负责管理:
| 职责 | 关键状态变量 | 关键函数 |
|---|---|---|
| 聊天会话管理 | chat, chatIdProp, history | loadChat(), navigateHandler() |
| 消息历史 | history.messages, history.currentId | createMessagePair(), addMessages() |
| 模型选择 | selectedModels, atSelectedModel | setDefaults(), selectedModelIds |
| 实时事件 | socket, eventTarget | chatEventHandler(), chatCompletedHandler() |
| 消息队列 | chatRequestQueues | processNextInQueue() |
| 文件处理 | files, chatFiles | uploadFile(), processWeb() |
关键状态初始化:
// 来自 Chat.svelte 的核心状态
let history = {
messages: {},
currentId: null
};
let selectedModels = [''];
let generating = false;
来源:
src/lib/components/chat/Chat.svelte:138-169src/lib/components/chat/Chat.svelte:183-247
Messages.svelte - 消息列表管理器
Messages.svelte 组件(src/lib/components/chat/Messages.svelte:1-50)负责渲染消息列表并处理:
- 历史遍历:通过
buildMessages()函数,沿着parentId指针从树状结构中重建线性消息列表src/lib/components/chat/Messages.svelte:85-103。 - 流式性能优化:在高频流式传输期间,通过
handleHistoryChange()使用requestAnimationFrame节流重建消息列表src/lib/components/chat/Messages.svelte:107-132。 - 分支导航:使用
gotoMessage()、showPreviousMessage()和showNextMessage()在不同消息分支(同级)之间导航src/lib/components/chat/Messages.svelte:160-248。 - 持久化:当结构发生变化时,通过
updateChat()更新后端聊天记录src/lib/components/chat/Messages.svelte:146-158。
来源:
src/lib/components/chat/Messages.svelte:85-158src/lib/components/chat/Messages.svelte:160-248
MessageInput.svelte - 输入处理器
MessageInput.svelte 组件(src/lib/components/chat/MessageInput.svelte:1-150)提供:
- 富文本界面:与
RichTextInput.svelte集成,并支持命令建议src/lib/components/chat/MessageInput.svelte:73-94。 - 上下文控制:
webSearchEnabled、imageGenerationEnabled和codeInterpreterEnabled的开关控制src/lib/components/chat/MessageInput.svelte:133-138。 - 动态变量:处理模板变量和剪贴板内容
src/lib/components/chat/MessageInput.svelte:185-228。 - 队列消息:管理
messageQueue以顺序处理多个提示src/lib/components/chat/MessageInput.svelte:144-147。
来源:
src/lib/components/chat/MessageInput.svelte:125-150src/lib/components/chat/MessageInput.svelte:185-228
---
消息历史数据结构
聊天系统使用基于树的消息历史结构,支持分支对话和每条用户消息的多个响应。
消息历史结构图
graph TD
Root["history 对象<br/>(src/lib/utils/index.ts)"]
M1["message1 (用户)<br/>id: uuid<br/>parentId: null<br/>childrenIds: [uuid2, uuid3]"]
M2["message2 (助手)<br/>id: uuid2<br/>parentId: uuid1<br/>childrenIds: []"]
M3["message3 (助手)<br/>id: uuid3<br/>parentId: uuid1<br/>childrenIds: [uuid4]"]
M4["message4 (用户)<br/>id: uuid4<br/>parentId: uuid3<br/>childrenIds: []"]
Root -->|"currentId"| M4
Root -->|"messages {}"| M1
M1 --> M2
M1 --> M3
M3 --> M4
消息对象模式: MessageType 接口定义了单个消息节点的属性 src/lib/components/chat/Messages/ResponseMessage.svelte:67-116。
{
id: string, // 通过 uuidv4() 生成的 UUID
parentId: string | null, // 指向前一条消息的指针
childrenIds: string[], // 分支路径
role: string, // 'user' 或 'assistant'
content: string, // 文本内容
done: boolean, // 流式传输状态
files?: Array<{ type, url }>, // 附件
statusHistory?: Array<{}>, // 工具/搜索状态更新
code_executions?: Array<{}> // Pyodide/Jupyter 的执行结果
}
来源:
src/lib/utils/index.ts:195-226src/lib/components/chat/Messages/ResponseMessage.svelte:67-116
---
变量替换系统
聊天系统在将用户提示发送给模型之前,会动态替换其中的占位符。
- 内置变量:由
textVariableHandler()处理src/lib/components/chat/MessageInput.svelte:205-250。 - 自定义变量:由
inputVariableHandler()处理src/lib/components/chat/MessageInput.svelte:185-203。 - 模板令牌:
replaceTokens()处理{{char}}和{{user}}以实现角色扮演或角色一致性,以及文件特定的占位符,如{{VIDEO_FILE_ID_...}}src/lib/utils/index.ts:55-83。
- {{CLIPBOARD}}:替换为 navigator.clipboard 中的文本。
- 触发 InputVariablesModal.svelte 以处理通过 extractInputVariables() 提取的用户定义字段。
来源:
src/lib/components/chat/MessageInput.svelte:185-250src/lib/utils/index.ts:55-83
---
消息渲染系统
ResponseMessage.svelte - AI 响应显示
ResponseMessage.svelte 组件(src/lib/components/chat/Messages/ResponseMessage.svelte:1-65)管理 AI 输出的呈现:
- 内容渲染:将文本传递给
ContentRenderer.svelte进行 Markdown 和 LaTeX 处理src/lib/components/chat/Messages/ResponseMessage.svelte:57。 - 引用来源:使用
Citations.svelte渲染 RAG 来源src/lib/components/chat/Messages/ResponseMessage.svelte:55。 - 代码执行:通过
CodeExecutions.svelte显示交互式 Python 结果src/lib/components/chat/Messages/ResponseMessage.svelte:56。 - 状态更新:使用
StatusHistory.svelte显示后台进程历史(例如,网络搜索步骤)src/lib/components/chat/Messages/ResponseMessage.svelte:64。
来源:
src/lib/components/chat/Messages/ResponseMessage.svelte:54-65src/lib/components/chat/Messages/ResponseMessage.svelte:123-136
MultiResponseMessages.svelte - 多模型对比
当选择了多个模型时,MultiResponseMessages.svelte(src/lib/components/chat/Messages/MultiResponseMessages.svelte:1-55)负责处理并排显示:
- 模型分组:根据
modelIdx组织消息同级src/lib/components/chat/Messages/MultiResponseMessages.svelte:157-182。 - 响应合并:允许通过
mergeResponsesHandler()将多个模型输出的内容合并到单条消息中src/lib/components/chat/Messages/MultiResponseMessages.svelte:223-231。
来源:
src/lib/components/chat/Messages/MultiResponseMessages.svelte:157-231
---
子系统文档
有关特定聊天子系统的详细信息,请参阅以下子页面: