Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

131 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。

命令行参数

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 / 右键空白处「查找」 右键菜单「查找」

Sheet(多棵树)

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

About

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

Resources

Stars

Watchers

Forks

Releases

Contributors

Languages