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 后拖动 |
类似 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,作者会尽力解决。