本文档详细介绍了 AppFlowy 中的 AI 聊天系统。AI 聊天系统实现了 AI 对话的聊天界面,管理对话状态和消息处理,并提供专门的 UI 组件以支持实时流式传输来显示聊天消息。
有关 AI 架构和本地 AI 集成的信息,请参阅第 6.1 和 6.3 页。
AI 聊天系统遵循分层架构,将聊天 UI 组件、对话管理、消息处理和流式传输基础设施分离开来。
来源
AI 聊天系统通过结构化流程处理对话,该流程负责消息创建、流式传输和状态更新。
来源
AIChatPage 作为主要的聊天界面入口,提供 BLoC 提供者并处理文件拖放和键盘事件。
主要功能
DropTarget 支持文件拖放 frontend/appflowy_flutter/lib/plugins/ai_chat/chat_page.dart51-60来源
聊天系统实现了专门的 UI 组件,用于以适当的样式和交互渲染不同类型的消息。
ChatAIMessageWidget 管理 AI 响应的渲染,支持流式传输和交互式操作。
主要功能
ChatAIMessageBloc 管理流式状态 frontend/appflowy_flutter/lib/plugins/ai_chat/presentation/message/ai_text_message.dart71-82ChatUserMessageWidget 处理用户消息显示,支持文件附件。
特性
来源
ChatBloc 通过与专门的管理器类协调,处理聊天功能的各个方面,从而协调对话状态。
| 组件 | 目的 | 关键方法 |
|---|---|---|
ChatMessageHandler | 消息创建和处理 | clearErrorMessages, createTextMessage, createAnswerStreamMessage |
ChatStreamManager | 流生命周期管理 | prepareStreams, sendStreamRequest, stopStream, disposeAnswerStream |
ChatSettingsManager | 聊天配置管理 | updateSelectedSources, selectedSourcesNotifier |
ChatMessageListener | 后端消息事件处理 | start, stop, 消息回调 |
ChatBloc 通过以下方式管理对话状态:
InMemoryChatController 进行消息列表管理 frontend/appflowy_flutter/lib/plugins/ai_chat/application/chat_bloc.dart35-36来源
AI 聊天系统提供了一个动画消息列表,用于处理实时更新和优化渲染。
主要功能
来源
AI 聊天插件支持多种 AI 响应格式。
格式化功能
来源
AI 聊天系统通过专门的流类实现实时消息流式传输,这些流类处理与 Rust 后端的通信。
AnswerStream 处理来自后端的不同类型的事件:
| 事件前缀 | 处理方法 | 目的 |
|---|---|---|
AIStreamEventPrefix.data | _handleEvent | 处理 AI 响应文本块 |
AIStreamEventPrefix.error | _handleEvent | 处理错误消息 |
AIStreamEventPrefix.metadata | _handleEvent | 处理参考来源和进度 |
AIStreamEventPrefix.aiResponseLimit | _handleEvent | 处理配额限制已达到 |
AIStreamEventPrefix.aiImageResponseLimit | _handleEvent | 处理图片配额限制 |
AIStreamEventPrefix.aiMaxRequired | _handleEvent | 处理需要高级升级 |
AIStreamEventPrefix.localAINotReady | _handleEvent | 处理本地 AI 初始化 |
AIStreamEventPrefix.aiFollowUp | _handleEvent | 处理后续问题设置 |
关键流式传输功能
RawReceivePort.nativePort 进行原生端口通信 frontend/appflowy_flutter/lib/plugins/ai_chat/application/chat_message_stream.dart50_text 字段中实时文本累积 frontend/appflowy_flutter/lib/plugins/ai_chat/application/chat_message_stream.dart68-70来源
AI 聊天系统实现了全面的错误处理,涵盖流式传输错误、AI 服务限制和本地 AI 状态。
| 错误类型 | 错误代码 | 显示消息 | 处理器 |
|---|---|---|---|
| 响应限制 | AIResponseLimitExceeded | 请所有者升级到 AI Max | onAIResponseLimit |
| 图片限制 | AIImageResponseLimitExceeded | 购买 AI Max | onAIImageResponseLimit |
| 需要高级版 | AIMaxRequired | 自定义升级消息 | onAIMaxRequired |
| 本地 AI 未就绪 | LocalAINotReady | 本地 AI 初始化中 | onInitializingLocalAI |
| 服务不可用 | AIServiceUnavailable | AI 服务器不可用 | onError |
错误检测发生在多个层面
AnswerStream._handleEvent() 中处理流事件 frontend/appflowy_flutter/lib/plugins/ai_chat/application/chat_message_stream.dart77-82ChatAIMessageBloc 中进行错误状态检查 frontend/appflowy_flutter/lib/plugins/ai_chat/application/chat_ai_message_bloc.dart155-162来源
AI 聊天系统提供响应式输入组件,可适应桌面和移动平台,并具有全面的提示处理功能。
关键输入功能
来源
聊天系统定义了几种实体类型来表示消息和聊天状态的不同方面
| 实体 | 目的 | 关键属性 | 文件位置 |
|---|---|---|---|
ChatMessageRefSource | AI回复的参考来源 | id, name, source | chat_entity.dart26-41 |
ChatFile | 消息中的文件附件 | filePath, fileName, fileType | chat_entity.dart66-110 |
AIChatProgress | AI处理进度信息 | step | chat_entity.dart44-55 |
OnetimeShotType | 特殊消息类型标识符 | sendingMessage, relatedQuestion, error | chat_entity.dart126-130 |
PromptResponseState | 聊天交互状态 | ready, sendingQuestion, streamingAnswer, relatedQuestionsReady | chat_entity.dart57-64 |
| 实体 | 目的 | 关键属性 | 用途 |
|---|---|---|---|
ChatLoadingState | 消息加载状态 | loading(), finish(error?) | 加载指示器 |
LoadChatMessageStatus | 聊天列表状态 | loading, loadingRemote, ready | 消息分页 |
ChatFileMap | 文件附件映射 | Map<String, ChatFile> | 文件管理 |
ChatMentionedPageMap | 页面引用映射 | Map<String, ViewPB> | 文档集成 |
系统使用特定的元数据键进行消息处理
| 常量 | 值 | 目的 |
|---|---|---|
errorMessageTextKey | "errorMessageText" | 错误消息内容 |
systemUserId | "system" | 系统消息标识符 |
aiResponseUserId | "0" | AI回复标识符 |
messageRefSourceJsonStringKey | "ref_source_json_string" | 参考来源数据 |
messageChatFileListKey | "chat_files" | 文件附件列表 |
messageQuestionIdKey | "question_id" | 问题消息标识符 |
onetimeShotType | "OnetimeShotType" | 特殊消息类型 |
来源
AI聊天系统实现了复杂的高度管理,以实现最佳的聊天布局和滚动性能。
ChatMessageHeightManager提供以下几个关键功能
| 方法 | 目的 | 用途 |
|---|---|---|
cacheHeight() | 存储消息高度以进行布局计算 | 由MessageHeightCalculator调用 |
calculateMinHeight() | 计算AI回复消息的最小高度 | 确保视口正确使用 |
calculateRelatedQuestionMinHeight() | 计算相关问题小部件的高度 | 保持布局一致性 |
isAnswerMessage() | 通过后缀识别AI回复消息 | 用于高度计算逻辑 |
getOriginalMessageId() | 从回复消息中提取原始消息ID | 将回复高度映射到问题 |
系统使用平台特定的屏幕偏移
高度计算通过从可用屏幕空间中减去缓存的消息高度来确保最佳视口使用 frontend/appflowy_flutter/lib/plugins/ai_chat/application/chat_message_height_manager.dart102-103
来源
AI聊天插件为AppFlowy中的AI模型交互提供了一个强大的接口。它具有实时流式响应、多种格式选项、本地和云AI模型支持、全面的错误处理以及文档集成。该实现采用清晰的架构,使用Flutter BLoC进行状态管理,并遵循关注点分离的最佳实践。