Skip to main content

聊天

Elftia 的聊天系统是应用的核心交互界面,支持多标签页并行对话、消息分支与切换、流式响应实时展示、文件附件上传、会话组织管理,以及丰富的快捷命令和键盘操作。

使用场景

  • 与 AI 进行多轮对话,获取建议、解答问题或协作完成任务
  • 同时开启多个标签页,在不同话题之间自由切换
  • 对 AI 回复不满意时,重新生成回复并通过分支导航对比不同结果
  • 上传图片、文档等附件,让 AI 理解并分析文件内容
  • 使用斜杠命令快速执行内置操作
  • 通过 @ 符号引用项目文件,让 AI 了解代码上下文
  • 使用 // 快速插入预设提示词模板

多标签页

Elftia 支持同时打开多个聊天标签页,每个标签页拥有独立的会话上下文和消息历史。

操作步骤

  1. 点击标签栏的 + 按钮创建新标签页
  2. 在新标签页中开始独立的对话
  3. 点击不同的标签页在对话之间切换
  4. 右键点击标签页可以关闭或重命名

各标签页的消息、上下文和状态完全独立,不会相互干扰。

Tab Keep-alive(0.1.8)

切换标签页不会丢失状态:

  • 切走再切回,保留滚动位置、未发送的草稿、流式状态
  • 多个 tab 同时拉同一个 LLM 也不会互相覆盖(按 sessionId 隔离的流缓冲)
  • 后台 tab 的轮询、动画自动暂停,不烧 CPU

设置页、Agents 页等非聊天页面同样应用 keep-alive:你切到设置改一半切回再回来,刚才在哪个 tab、滚到哪、改了哪些字段都还在。

消息分支

消息分支是 Elftia 聊天系统的核心特性之一。当你重新生成 AI 回复或编辑已发送的消息时,系统会自动创建分支,保留所有历史版本供你随时查看和切换。

分支创建方式

操作结果
重新生成回复在当前 AI 消息位置创建新分支,保留原始回复
编辑已发送的消息从编辑位置创建新分支,后续对话基于修改后的内容继续

分支导航

当某条消息存在多个分支时,消息旁边会出现分支导航组件,显示:

  • 分支图标 — 标识当前消息有多个版本
  • 当前索引 / 总分支数 — 例如 2 / 3 表示共 3 个分支,当前查看第 2 个
  • 左右箭头 — 点击箭头在分支之间切换

使用步骤

  1. 将鼠标悬停在 AI 回复上,点击工具栏中的重新生成按钮
  2. 系统生成新回复并创建新分支
  3. 消息旁出现分支导航组件(如 1 / 2
  4. 点击左右箭头查看不同版本的回复
  5. 可以多次重新生成,每次都会增加一个新分支

:::tip 分支不会丢失 所有分支都会被持久保存。即使关闭应用后重新打开,分支历史依然完整可用。 :::

流式响应

AI 回复采用流式传输,消息内容会逐步实时显示在聊天界面中,而不是等待完整生成后一次性展示。

行为说明

  • 回复生成过程中,消息区域会实时更新内容
  • 消息底部显示加载指示器,表明回复仍在生成中
  • 生成过程中可以随时点击停止按钮中断回复
  • 中断后的部分回复会被保留
  • Markdown 格式(代码块、列表、标题等)在流式过程中即时渲染
  • 思考过程:推理模型的思考会以可折叠区域展示,写在最终回复上方

流式状态契约

每条 streaming 中的消息根 DOM 上有 data-streamingdata-stream-phase 标记,外部 driver(elftia-cli)可以可靠地等待消息完成。当 reasoning / tool-call / 内容 typing 任何一项还在进行中时,data-streaming 都为 "true"。这意味着 tool-call 结果延迟到达不会让流状态错误地变为 "false"

富内容渲染

聊天系统支持多种富内容类型的内嵌渲染:

内容渲染行为
Markdown标题、列表、代码块(语法高亮 + 一键复制)、表格、引用块
图片 / 视频内嵌预览,图片可打开 Lightbox 大图
音频内置播放器
推理过程可折叠区域,默认收起
工具调用工具名 + 参数 + 结果,可折叠
内嵌 HTML检测到完整 HTML 文档(含 <!DOCTYPE> / <html>)时,以 iframe 形式安全渲染(沙盒不允许 same-origin)
Question Form(design session 专用)单选 / 多选 / 文本 / direction-cards 等问卷型消息,提交后转为答复继续对话
JSON自动检测并格式化展示

附件上传

聊天支持多种方式上传附件,让 AI 分析文件内容。

上传方式

方式操作
拖放上传将文件从文件管理器拖入聊天输入区域
粘贴上传使用 Ctrl+V 粘贴剪贴板中的图片
文件选择器点击输入框旁的附件按钮,从文件对话框中选择文件

支持的文件类型

  • 图片 — PNG、JPG、GIF、WebP 等常见图片格式
  • 文档 — PDF、TXT、Markdown 等文本文件
  • 代码文件 — 各种编程语言的源代码文件

上传的附件会在输入框上方显示预览缩略图,发送前可以点击移除。

会话管理

Elftia 提供完善的会话组织和管理功能,帮助你高效管理大量对话。

文件夹

  • 在侧边栏创建文件夹,将相关会话归类整理
  • 支持多级嵌套文件夹结构
  • 拖拽会话到文件夹中进行归类

标签

  • 为会话添加自定义标签,方便分类标记
  • 通过标签快速筛选相关会话

搜索

  • 在侧边栏顶部的搜索框中输入关键词
  • 搜索范围涵盖会话标题和消息内容
  • 搜索结果实时高亮匹配项

固定会话

  • 右键点击会话,选择固定将其置顶
  • 固定的会话始终显示在列表最上方,不会被新会话推下

命令菜单(/ 斜杠命令)

在输入框中输入 / 会弹出命令菜单,提供一系列快速操作。

使用步骤

  1. 在聊天输入框中输入 /
  2. 命令菜单弹出,显示可用命令列表
  3. 继续输入文字可以筛选命令
  4. 使用上下箭头选择命令,按 Enter 执行
  5. 也可以直接点击命令执行

内置命令

命令说明
/clear清空当前会话的消息历史
/help显示帮助信息
/model快速切换当前使用的 AI 模型
/settings打开设置面板

:::info 自定义命令 除内置命令外,Agent 系统和插件也可以注册自定义命令。具体命令列表取决于当前激活的 Agent 和已安装的插件。命令面板(slash palette)支持模糊搜索,按 Tab 自动补全参数。 :::

文件引用(@ 符号)

在输入框中输入 @ 可以引用项目中的文件,将文件内容附加到消息上下文中。

使用步骤

  1. 在聊天输入框中输入 @
  2. 弹出文件选择下拉菜单,显示当前项目的文件列表
  3. 输入文件名关键词进行筛选
  4. 使用上下箭头选择文件,按 Enter 确认
  5. 文件引用会以标记形式插入到输入框中
  6. 发送消息时,被引用文件的内容会一并发送给 AI

:::tip 适用场景 文件引用功能在代码相关对话中特别有用。你可以引用源代码文件让 AI 分析代码逻辑、查找 bug 或提供优化建议。 :::

提示词快速插入(// 双斜杠)

在输入框中输入 // 可以快速插入预设的提示词模板。

使用步骤

  1. 在聊天输入框中输入 //
  2. 弹出提示词快速插入菜单
  3. 菜单显示收藏的提示词、最近使用的提示词和提示词链
  4. 选择一个提示词模板
  5. 如果模板包含变量(如 {{language}}),系统会弹出变量填写表单
  6. 填写变量后,最终的提示词内容会插入到输入框中

详细的提示词管理请参阅提示词文档。

键盘快捷键

快捷键操作
Enter发送消息(默认模式)
Ctrl+Enter发送消息(Ctrl+Enter 模式)或换行(默认模式)
Shift+Enter在输入框中换行
Esc关闭命令菜单或文件选择菜单
Up / Down在命令菜单或文件菜单中移动选择
Ctrl+V粘贴文本或图片

发送方式配置

你可以在设置中切换发送消息的快捷键方式:

模式Enter 键行为Ctrl+Enter 键行为
Enter 发送(默认)发送消息换行
Ctrl+Enter 发送换行发送消息

设置 > 通用 中可以切换发送方式。

完整对话流程

以下是一次完整对话的典型流程:

输入消息 → 发送 → 流式响应实时展示

对回复满意?
├── 是 → 继续对话
└── 否 → 重新生成(创建分支)

分支导航切换对比

选择满意的版本继续

常见问题

问题解决方案
消息发送后没有回复检查 LLM 提供商是否已配置 API Key,确认网络连接正常
流式响应中断可能是网络波动或 API 超时,尝试重新生成回复
附件上传失败检查文件大小是否超过限制,确认文件格式受支持
命令菜单不弹出确保 / 是在输入框最开始或空格之后输入的
分支导航不显示只有在消息存在多个分支时才会显示导航组件
@ 文件引用无响应需要先打开一个项目,文件引用功能依赖项目上下文

相关链接