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。
python app.py [--host HOST] [--port PORT] [--server] [--do-not-mask-key] [--do-not-log-file]| 参数 | 说明 |
|---|---|
--host |
绑定地址,默认 127.0.0.1(仅本机可访问) |
--port |
绑定端口,默认 8000 |
--server |
服务器模式:绑定 0.0.0.0,局域网/公网可访问(而不是仅本机) |
--do-not-mask-key |
不在日志里隐藏 API Key(仅用于调试,不要在暴露给他人的环境下使用) |
--do-not-log-file |
不写日志文件(默认会把请求记录写进 logs/ 目录,用于排查问题;日志中的图片等附件内容已做脱敏,见下) |
日志默认开启,与是否加 --server 无关;写在程序所在目录下的 logs/latest.log,超过 10MB 会自动归档压缩。
附件内容(图片等 base64 数据)在写入日志前会被脱敏替换成大小提示,不会明文落盘;API Key 默认打码显示。
# Windows
build.bat
# Linux / macOS
./build.sh需要 PyInstaller ≥ 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 / Grok 2 |
| 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 |
| Claude | Claude Sonnet 5 / Opus 4.8 / Haiku 4.5 |
| Gemini | Gemini 3.5 Flash / 3.1 Pro / 3.1 Flash-Lite |
API Key 保存在浏览器本地,重启后无需重填。
| 操作 | 桌面端 | 移动端 |
|---|---|---|
| 选中节点 | 单击节点卡片 | 单击节点卡片 |
| 平移画布 | 拖拽空白处 | 单指滑动 |
| 缩放 | 滚轮 / + / - / 适配按钮 | 双指捏合 |
| 右键菜单 | 右键节点或画布 | 长按节点 600ms |
| 切换视图 | — | 底部「树图 / 对话」Tab |
| 拉新分支 | 选中节点 → 输入框 → Enter | 同左 |
| 换行 | Shift + Enter | — |
| 折叠/展开节点 | 节点 ▼ 按钮 / F |
节点 ▼ 按钮 |
| 拖拽重排兄弟节点 | 拖拽节点卡片左右移动 | 同左 |
| 设为主线 | 输入框旁「主线」按钮 / 右键菜单 | 右键菜单 |
| 节点样式(背景色/文字色/形状) | 右键菜单 | 长按菜单 |
| 删除子树 | 「删除此子树」按钮 / Del |
「删除此子树」按钮 |
| 回到根节点 | H |
— |
| 附加图片/文件 | 附件按钮 / Ctrl+V 粘贴 / 拖进对话区 | 附件按钮 |
| 思考模式 | 输入框旁「思考」按钮(支持的模型) | 同左 |
| 联网搜索 | 输入框旁「搜索」按钮(需先填 Tavily Key) | 同左 |
| 切换 / 新建 / 关闭 / 改名 Sheet | 顶栏下方标签栏 | 同左 |
| Sheet 拖拽排序 | 直接拖动标签 | 长按标签后拖动 |
| 树内查找节点 | Ctrl+F / 右键空白处「查找」 |
右键菜单「查找」 |
类似 Excel 的多工作表:顶栏下方一条标签栏,每个标签是一棵完全独立的对话树,随时点击切换,互不干扰。
- 切换:点击标签
- 新建:标签栏末尾「+」
- 改名:双击标签名字
- 关闭:标签上的「×」(至少保留一个,关闭前会二次确认)
- 拖拽排序:直接拖动标签调整顺序(移动端长按后拖动)
- 切换 Sheet 不会打断其它 Sheet 正在进行的回复
- 导出 / 清空只作用于当前 Sheet,不影响其它 Sheet;导入会新建一个 Sheet,同样不影响其它 Sheet
- 「清除一切本地数据」是唯一会清空全部 Sheet 的操作
将根节点 → 当前选中节点的路径设为「主线」,该路径在树图中垂直排列,其余分支挂在两侧,适合把最重要的对话链条放到视觉中心。
- 输入框旁「主线」按钮 / 右键菜单「设为主线」:设置或还原主线
- 主线终点节点显示绿色边框;选中节点显示蓝色边框
右键节点(或移动端长按)弹出的菜单中可以分别设置:
- 背景颜色:预设色 + 自定义取色器
- 文字颜色:预设色 + 自定义取色器,「默认」会按背景色深浅自动选清晰可读的颜色
- 节点形状:圆角矩形(默认)/ 直角矩形 / 胶囊形
三者可任意组合。
设置界面「参数 & 系统」标签页里可以调整对话区字号(12–24px),只影响对话内容,不影响树节点卡片。
页面自动跟随系统颜色偏好切换深色 / 浅色。
如果系统已设为浅色但页面仍显示深色,检查 Chrome 的
chrome://flags/#enable-force-dark,设为 Default 后重启浏览器。
768px 以下屏幕自动切换为移动端布局:
- 底部「树图 / 对话」Tab 切换,选中节点后自动跳转到对话视图
- 触摸手势:单指平移画布,双指捏合缩放,长按节点弹出右键菜单
- 导出 / 导入 / 清空按钮保留在顶栏
- iOS:Safari 分享 → 「添加到主屏幕」,从主屏图标打开即为全屏独立窗口
- Android:顶栏「全屏」按钮,点击后隐藏地址栏,再点一次或按返回键退出
点击附件按钮、Ctrl+V 粘贴,或把文件拖进对话区域,都可以给消息附加文件:
- 图片:作为视觉输入发给模型(需模型支持,见下)
- 文本 / 代码类文件(
.txt/.md/.csv/.json/代码文件等,含.svg):内容会自动读取并发给模型 - PDF、Office 文档、压缩包等:不支持,会被直接拒绝,不允许附加——PDF 不能像图片一样直接发送,不同模型对它的处理方式并不统一,容易导致请求报错
附件以 base64 格式存储在浏览器的 IndexedDB 中,刷新页面不会丢失; 对话区和树图节点卡片上会分别显示图片 / 其它文件两类图标,一眼区分。
并非所有模型都支持图片:设置界面的模型下拉框里,模型名字后面带 👁 标记的支持图片附件; 其它模型上传图片会被拒绝并提示。文本 / 代码类附件不受此限制。
DeepSeek V4 Flash/Pro 和 Grok 3 Mini 支持思考模式:选中这些模型后输入框旁会出现「思考」按钮,开启后 AI 会先展示思考过程再回复。
在设置界面「参数 & 系统」标签页填写 Tavily API Key 后,输入框旁会出现「搜索」按钮(没填 key 则不显示)。 开启后,模型会自己判断要不要联网查资料、查什么关键词——不是每条消息都会触发搜索,纯闲聊或不需要实时信息的问题模型不会调用。
每发生一次搜索,会在它实际发生的位置嵌入一个可折叠的「🔍 搜索: 关键词」气泡——模型如果是在思考过程中决定搜索,气泡就出现在思考过程里面; 如果是话说到一半又去查了点资料,气泡就出现在回复正文对应的位置,而不是统一堆在开头。点开能看到搜索到的网页标题、链接和摘要,刷新页面后依然能看到。
联网搜索基于各平台通用的 tool calling 机制,理论上对所有支持的模型都开放;如果发现某个模型效果不好,可以先关掉这个模型的搜索开关。
可以同时向多个节点发送消息并同时接收回复,互不干扰。
如果生成中途被中断(刷新页面、断网、手动停止),可以点击「继续生成」从中断处接着生成,无需重新开始。
所有 Sheet 的对话树自动保存在浏览器本地,刷新页面不丢失。
- 导出:顶栏「导出」按钮,将当前 Sheet(含名字)保存为
.json文件 - 导入:点击「导入」按钮,或把
.json文件拖进左侧树图区域,会新建一个 Sheet装载导入的内容并自动切过去 - 拖进右侧对话区域则是添加附件,而不是导入
- 清除一切本地数据:设置界面左下角,一键删除所有 API Key、全部 Sheet 的对话记录和设置,操作不可撤销
有任何问题都可以发 issue,作者会尽力解决。