Skip to content

xiaoni0v0/TreeChat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

96 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TreeChat · 树状 AI 对话

AI 声明:本项目大量使用 AI 辅助完成。

我苦 AI Apps 久矣,它们都是“线性”的,每当我想对某个节点进行临时提问时,都会污染上下文。又或者想多次生成,但切换起来很麻烦。

这款 TreeChat 应运而生,旨在把 AI 对话从「线性」变成「树状」:

  • 根节点为空(或一段系统提示);
  • = 你发送的消息;节点 = AI 的回复;
  • 可从任意节点拉出一条新边继续提问(即开分支);
  • 删除任意子树
  • 每次请求只把「根 → 当前叶子」路径上的消息喂给模型——天然裁剪上下文,省 token 也更聚焦;
  • 支持多个 Sheet(类似 Excel 工作表),每个 Sheet 是一棵完全独立的对话树,标签页随时切换。

运行

需要 Python 3.7+,无需 pip 安装任何包

python app.py

浏览器会自动打开 http://127.0.0.1:8000。首次启动会弹出设置界面让你填写 API Key。

打包为可执行文件

# Windows
build.bat
# Linux / macOS
./build.sh

需要 PyInstaller ≥ 4.3(更低版本下打包出的可执行文件会因为找不到内置的 index.html/static/ 资源而无法正常启动——4.3 之前入口脚本的 __file__ 只是裸文件名、没有路径信息,4.3 起才固定是打包目录内的绝对路径)。产物在 dist/ 目录下。

支持的模型平台

在设置界面(右上角)可以切换平台和模型,并填写对应的 API Key:

平台 模型
DeepSeek DeepSeek V4 Flash / V4 Pro
OpenAI GPT-4o / GPT-4o mini / o1 / o3-mini
Groq Llama 3.3 70B / Llama 3.1 8B / Gemma 2 9B / Mixtral 8×7B
xAI / Grok Grok 3 / Grok 3 Mini
Mistral Mistral Large / Small / 7B
Kimi moonshot-v1-128k / 32k / 8k
智谱 GLM GLM-4 / GLM-4 Flash
通义千问 Qwen Max / Plus / Turbo / VL Max / VL Plus / VL Turbo

API Key 持久化存储在浏览器 localStorage,重启 Python 端后自动恢复,无需重填。

操作

操作 桌面端 移动端
选中节点 单击节点卡片 单击节点卡片
平移画布 拖拽空白处 单指滑动
缩放 滚轮 / + / - / 适配按钮 双指捏合
右键菜单 右键节点或画布 长按节点 600ms
切换视图 底部「树图 / 对话」Tab
拉新分支 选中节点 → 输入框 → Enter 同左
换行 Shift + Enter
折叠/展开节点 节点 ▼ 按钮 / F 节点 ▼ 按钮
拖拽重排兄弟节点 拖拽节点卡片左右移动 同左
设为主线 输入框旁「主线」按钮 / 右键菜单 右键菜单
节点样式(背景色/文字色/形状) 右键菜单 长按菜单
删除子树 「删除此子树」按钮 / Del 「删除此子树」按钮
回到根节点 H
附加图片 图片按钮 / Ctrl+V 粘贴 图片按钮
思考模式 输入框旁「思考」按钮(支持的模型) 同左
切换 / 新建 / 关闭 / 改名 Sheet 顶栏下方标签栏 同左
Sheet 拖拽排序 直接拖动标签 长按标签 500ms 后拖动

Sheet(多棵树)

类似 Excel 的多工作表:顶栏下方一条标签栏,每个标签是一棵完全独立的对话树(各自的节点、系统提示、模型、折叠状态、画布视角),随时点击切换,互不干扰。

  • 切换:点击标签
  • 新建:标签栏末尾「+」,新建一棵空树并自动切过去
  • 改名:双击标签名字,输入后按 Enter 或点击别处提交,Esc 取消
  • 关闭:标签上的「×」,只有 1 个 Sheet 时不显示,2 个及以上时常驻显示(不需要 hover);需二次确认,至少保留一个 Sheet,无法全部关闭
  • 拖拽排序:直接拖动标签调整顺序,其它标签会实时挪位置让出空档(和拖拽树节点重排的手感一致);桌面端鼠标拖拽,移动端长按标签 500ms 激活拖拽(避免和横向滑动浏览标签冲突)
  • 切到别的 Sheet 不会打断其它 Sheet 正在进行的 AI 回复——生成完成后切回去就能看到完整内容
  • 导出仍然只导出当前 Sheet(一棵树),不会把所有 Sheet 打包在一起;导入 / 清空同样只作用于当前 Sheet,不影响其它 Sheet
  • 「清除一切本地数据」是唯一会清空全部 Sheet 的操作

主线功能

将根节点 → 当前选中节点的路径设为「主线」,该路径在树图中垂直排列,其余分支挂在两侧。适合把最重要的对话链条放到视觉中心。

  • 输入框旁「主线」按钮:把当前选中节点设为主线终点(再次点击或选中根节点时还原)
  • 右键菜单「设为主线」:同上
  • 主线终点节点卡片显示绿色边框;选中节点卡片显示蓝色边框

节点样式自定义

右键节点(或移动端长按)弹出的菜单中可以分别设置:

  • 背景颜色:6 个预设色 + 自定义取色器,点击即时生效;「默认」(斜杠圆图标)清除自定义颜色,恢复主题默认外观
  • 文字颜色:同样 6 个预设色 + 自定义取色器;「默认」即自动模式——根据背景颜色的亮度自动选择黑/白墨水色,不设置时保证任意背景色下都清晰可读
  • 节点形状:圆角矩形(默认)/ 直角矩形 / 胶囊形,三选一

三者互不影响,可以任意组合。

对话字号

设置界面「参数 & 系统」标签页里有一个滑动条(12–24px,默认 14px),可以自由调整对话区字号,拖动时实时预览。只影响对话气泡文字(含代码块、表格),不影响树节点卡片。

拖拽重排

在同一父节点下,直接拖拽节点卡片左右移动即可调整兄弟顺序。松手后树图会以平滑动画重新排列,不影响对话内容。

深色 / 浅色主题

页面自动跟随系统颜色偏好切换深色 / 浅色,无需手动设置。

如果系统已设为浅色但页面仍显示深色,请检查 Chrome 的「自动深色模式」实验性标志(chrome://flags/#enable-force-dark),将其设为 Default 后重启浏览器。

移动端支持(手机 / 平板)

在 768px 以下屏幕自动切换为移动端布局:

  • 底部导航栏:「树图」和「对话」两个 Tab 切换;选中树节点后自动跳转到对话视图
  • 触摸手势:单指平移画布,双指捏合缩放,长按节点 600ms 弹出右键菜单(含震动反馈)
  • 设置弹窗:从底部以抽屉形式展开
  • 导出 / 导入 / 清空按钮保留在顶栏(自动压缩尺寸以适配窄屏)

隐藏浏览器工具栏 / 地址栏

  • iOS:Safari 打开后点击分享 → 「添加到主屏幕」,从主屏图标打开即为全屏独立窗口,没有 Safari 的工具栏和地址栏
  • Android:顶栏「全屏」按钮,点击后隐藏浏览器地址栏和系统状态栏;再点一次或按返回键退出

多模态(图片)

支持向模型发送图片。在输入框区域点击图片图标按钮,或直接 Ctrl+V 粘贴图片。

图片以 base64 格式存储在浏览器的 IndexedDB 中(绕过 localStorage 的 5 MB 限制),刷新页面后图片不会丢失

并非所有模型都支持图片输入。通义千问需使用 Qwen VL 系列模型(如 Qwen VL Max),普通 Qwen Max/Plus/Turbo 为纯文本模型。

思考模式

DeepSeek V4 Flash/Pro 和 Grok 3 Mini 支持可切换的思考模式。选中这些模型后,输入框右侧会出现「思考」按钮,点击激活后 AI 会在回复前展示思考过程(以可折叠的「💭 思考过程」框呈现)。

并发流式输出

可以同时向多个节点发送消息并同时接收回复。正在生成中的节点树卡片显示「生成中…」,可以切换到其他节点继续操作,互不干扰。

继续生成

如果生成中途被中断(刷新页面、网络断开、手动点击「停止」),节点标题会显示「模型名 · 未完成」,回复气泡右下角出现「继续生成」按钮。点击后会把已有的部分回复作为上下文发给模型,让它从中断处接续——无需重新开始。

对话树持久化 & 导入导出

所有 Sheet 的对话树(文字 + 图片附件)自动保存在浏览器本地,刷新页面不丢失:文字内容存入 localStorage,图片附件存入 IndexedDB

  • 导出:点击顶栏「导出」按钮,将当前 Sheet 的对话树(含图片)保存为 .json 文件,不含其它 Sheet。
  • 导入:点击「导入」按钮选择文件,或直接把 .json 文件拖进页面即可恢复,覆盖当前 Sheet。导入前若当前 Sheet 非空,会弹确认提示,不影响其它 Sheet。
  • 清除一切本地数据:打开设置界面(右上角「设置」),点击左下角「清除一切本地数据」,可一键删除所有 API Key、全部 Sheet 的对话记录、图片附件和设置。操作不可撤销,页面将自动重载。

有任何问题都可以发 issue,作者会尽力解决。

About

一个 AI 对话应用,把 AI 对话从「线性」变成「树状」。

Resources

License

Stars

Watchers

Forks

Contributors

Languages