DeepSeek-TUI
终端内运行的编码智能体,专为DeepSeek V4模型打造,单二进制无Node/Python依赖。内置MCP客户端、沙箱和任务队列,支持1M token上下文、思维链流式显示和三种操作模式。亮点包括原生RLM并行推理、LSP诊断集成、会话保存恢复及工作区回滚,适合使用DeepSeek API进行代码辅助的开发人员。
README
DeepSeek TUI
一个以终端为本的编码助手,构建于 DeepSeek V4 的 100 万 token 上下文和前缀缓存之上。单个二进制文件,无需 Node/Python 运行时——开箱即提供 MCP 客户端、沙箱和持久化任务队列。
npm i -g deepseek-tui

这是什么?
DeepSeek TUI 是一个完全运行在终端中的编码助手。它赋予 DeepSeek 前沿模型直接访问你工作区的权限——读取和编辑文件、运行 shell 命令、搜索网络、管理 git、编排子代理——全部通过一个快速、键盘驱动的 TUI 完成。
专为 DeepSeek V4(deepseek-v4-pro / deepseek-v4-flash)打造,支持 100 万 token 上下文窗口和原生思维模式(chain-of-thought,思维链)流式输出。在处理任务时,实时观察模型的推理过程。
核心特性
- 原生 RLM(
rlm_query工具)—— 并行派发 1–16 个廉价的deepseek-v4-flash子模型,利用现有 DeepSeek 客户端进行批量分析、分解或并行推理 - 思维模式流式输出 —— 显示 DeepSeek 在推理你代码时的思维链
- 完整工具套件 —— 文件操作、shell 执行、git、网络搜索/浏览、应用补丁、子代理、MCP 服务器
- 100 万 token 上下文 —— 上下文填满时自动智能压缩
- 三种交互模式 —— Plan(只读探索)、Agent(交互式且需审批)、YOLO(自动审批)。基于分解优先的系统提示,引导模型在行动前执行
checklist_write、update_plan和生成子代理 - 推理强度等级 —— 通过 Shift+Tab 在
off → high → max之间循环 - 会话保存/恢复 —— 对长时间会话设置检查点并恢复
- 工作区回滚 —— 侧置 git 在每个轮次前后生成快照,通过
/restore和revert_turn回滚,不影响仓库的.git - HTTP/SSE 运行时 API ——
deepseek serve --http用于无头代理工作流 - MCP 协议 —— 连接 Model Context Protocol 服务器以扩展工具能力;详见 docs/MCP.md
- 实时成本追踪 —— 逐轮和会话级别的 token 使用量及费用估算
- 深色主题 —— DeepSeek 蓝色调色板
架构概览
DeepSeek TUI 的架构遵循 dispatcher(调度器)→ TUI → engine(引擎)→ tools(工具) 模式。
deepseek CLI 二进制文件是一个轻量级调度器,负责解析子命令并将交互式会话委托给 deepseek-tui 配套二进制文件。TUI 运行一个基于 ratatui 的界面,与执行代理循环的异步引擎通信:用户输入通过流式客户端(兼容 OpenAI Chat Completions)流向 LLM,从响应中提取工具调用并通过类型化的工具注册表(shell、文件操作、git、网络、子代理、MCP)进行分派,结果流式返回并写入对话记录。
在幕后,引擎管理会话状态、轮次追踪和一个持久化任务队列。LSP 子系统(crates/tui/src/lsp/)通过生成语言服务器(rust-analyzer、pyright 等)并在下一推理步骤之前将错误注入模型上下文,提供编辑后诊断。递归语言模型(RLM)子系统为代理提供了一个沙箱化的 Python REPL,用于批量分类和子 LLM 编排。详见 docs/ARCHITECTURE.md 完整说明。
快速开始
npm install -g deepseek-tui
deepseek
预构建的二进制文件已发布到 Linux x64、Linux ARM64(v0.8.8+)、macOS x64、macOS ARM64 和 Windows x64。对于其他平台——musl、riscv64、FreeBSD 等——请参阅下方的 从源码构建 或完整的 docs/INSTALL.md 指南。
Linux ARM64(Raspberry Pi、Asahi、Graviton、鸿蒙 PC)
从 v0.8.8 开始,npm i -g deepseek-tui 可在基于 glibc 的 ARM64 Linux 上工作。如果你仍在使用 v0.8.7 或更早版本(会出现 Unsupported architecture: arm64 错误),请升级或使用 cargo install:
# 需要 Rust 1.85+ (https://rustup.rs)
cargo install deepseek-tui-cli --locked # 提供 `deepseek`
cargo install deepseek-tui --locked # 提供 `deepseek-tui`
你也可以直接从 Releases 页面 下载 deepseek-linux-arm64 和 deepseek-tui-linux-arm64,然后将两者并排放置在 PATH 中的某个目录中。从 x64 交叉编译到 ARM64 的方法已在 docs/INSTALL.md 中记录。
中国 / 镜像友好安装
如果从中国大陆访问 GitHub 或 npm 下载速度较慢,可以通过 Cargo 注册表镜像安装 Rust crates:
# ~/.cargo/config.toml
[source.crates-io]
replace-with = "tuna"
[source.tuna]
registry = "sparse+https://mirrors.tuna.tsinghua.edu.cn/crates.io-index/"
然后安装标准的 deepseek 调度器和配套的 TUI 二进制文件(两者都需要——调度器将工作委托给 TUI 运行时):
cargo install deepseek-tui-cli --locked # 提供 `deepseek`
cargo install deepseek-tui --locked # 提供 `deepseek-tui`
deepseek --version
当 GitHub 发布资产可访问时,你也可以直接从 GitHub Releases 页面下载预构建的二进制文件。当存在镜像发布资产目录时,TUNA、rsproxy、腾讯 COS 或阿里云 OSS 镜像也可以在 DEEPSEEK_TUI_RELEASE_BASE_URL 下使用。
首次启动时,系统会提示你输入 DeepSeek API 密钥。TUI 会将其保存到你的用户配置文件 ~/.deepseek/config.toml 中,这样无论在哪个文件夹中都能使用,无需操作系统凭据提示。
你也可以提前设置:
# 推荐——保存到 ~/.deepseek/config.toml;在任何地方都有效
# (交互式 shell、IDE 终端、脚本、cron):
deepseek auth set --provider deepseek
# 环境变量替代方案——注意在 zsh 中,~/.zshrc 中的 export 只影响交互式 shell。
# 如果你想在所有上下文(登录 shell、IDE、脚本)中都生效,请将其放入 ~/.zshenv:
export DEEPSEEK_API_KEY="你的 DEEPSEEK API 密钥"
deepseek
# 验证二进制文件正在读取哪个源:
deepseek doctor
要轮换或删除已保存的密钥,请运行
deepseek auth clear --provider deepseek(或使用旧别名deepseek logout), 然后再次运行deepseek auth set --provider deepseek。
使用 NVIDIA NIM
deepseek auth set --provider nvidia-nim --api-key "你的 NVIDIA API 密钥"
deepseek --provider nvidia-nim
# 或进程级别:
DEEPSEEK_PROVIDER=nvidia-nim NVIDIA_API_KEY="..." deepseek
其他 DeepSeek V4 提供商
deepseek auth set --provider fireworks --api-key "你的 FIREWORKS API 密钥"
deepseek --provider fireworks --model deepseek-v4-pro
# SGLang 是自托管的;本地部署时认证为可选。
SGLANG_BASE_URL="http://localhost:30000/v1" deepseek --provider sglang --model deepseek-v4-flash
从源码构建适用于任何 Tier-1 Rust 目标——包括 Linux musl/riscv64、FreeBSD,以及早于我们预构建二进制文件的 ARM64 发行版。
# Linux 构建依赖(Debian/Ubuntu/openEuler/Kylin):
# sudo apt-get install -y build-essential pkg-config libdbus-1-dev
# # RHEL 系列:sudo dnf install -y gcc make pkgconf-pkg-config dbus-devel
git clone https://github.com/Hmbown/DeepSeek-TUI.git
cd DeepSeek-TUI
cargo install --path crates/cli --locked # 需要 Rust 1.85+;提供 `deepseek`
cargo install --path crates/tui --locked # 提供 `deepseek-tui`
两个二进制文件都是必需的——deepseek 调度器在运行时委托给 deepseek-tui。交叉编译、镜像和平台特定说明详见 docs/INSTALL.md。
v0.8.8 更新内容
一个专注于稳定性的版本:在 v0.8.6 / v0.8.7 基础之上进行了大量 UX 优化,并修复了生产会话中暴露的一些粗糙边缘。没有模型或 API 更改;所有现有配置和会话都保持正常工作。
🪟 TUI 优化
- 视觉重试 / 退避横幅 当上游限流或返回 5xx 时显示,带有每秒倒计时,使卡住的会话明显可见而非无声冻结(#499)。
- MCP 健康状态芯片 在页脚中——一个带颜色的
MCP n/n字样反映了有多少已配置的服务器实际可达,当未配置服务器时隐藏(#502)。 - 工具输出溢出 将完整内容路由到
~/.deepseek/tool_outputs/<id>.txt,单元格中可见前 32 KiB 的内容;现有的详情分页器追加完整输出,因此不会隐藏任何内容,只是分页(#500)。 - 多日时间段格式化 ——
humanize_duration按s → m → h → d → w递增,最多显示两个单位,因此长时间运行的会话显示为2d 3h而不是188415s(#447)。 - 累积
已工作 Nh Mm页脚芯片 当会话超过 60 秒时出现,在窄宽度下优先丢弃,以免将更重要的芯片挤出屏幕(#448)。 - OSC 8 超链接 —— 对话记录中的 URL 可在 iTerm2、Terminal.app、Ghostty、Kitty、WezTerm、Alacritty 以及现代 gnome-terminal/konsole 中通过 Cmd+点击打开;传统终端仅显示可见文本(#498)。
- 行内差异渲染 针对
edit_file和write_file—— 工具结果在正文开头输出统一差异格式,由差异感知渲染器处理,显示行号和带颜色的+/-边栏(#505)。 - Composer 草稿暂存 —— Ctrl+S 将当前草稿保存到
~/.deepseek/composer_stash.jsonl,/stash list显示暂存草稿,/stash pop按后进先出恢复,/stash clear清空文件。自我修复的 JSONL 解析器,200 条上限,多行草稿可保留(#440)。 - 斜杠菜单布局不再抖动 聊天区域不再因输入过程中匹配条目数量变化而闪烁——在 Windows 10 PowerShell + WSL 上报告过,由于每个单元格的写入开销使重绘明显滞后。Composer 现在在整个斜杠/提及会话期间保留其面板最大边框。
♿ 无障碍
NO_ANIMATIONS=1环境变量(也可使用1/true/yes/on)强制在启动时启用low_motion = true和fancy_animations = false,无论保存的设置如何;新的docs/ACCESSIBILITY.md文档记录了所有运动/输出旋钮(#450)。- 键盘增强标志 在所有关闭路径上弹出,包括 panic、Ctrl+Z 挂起和外部编辑器调用,因此崩溃的 TUI 永远不会将终端置于原始模式(#443/#444)。
- Kitty 键盘协议(
DISAMBIGUATE_ESCAPE_CODES)在启动时推送,以便 kitty 协议终端报告 Option/Alt 修饰键的明确事件;传统终端不受影响(#442)。
🤖 代理 / 子代理
- 子代理上限从 5 提高到 10(可通过
[subagents].max_concurrent配置,硬上限 20)。已完成的代理不再计入运行中上限(#509)。 - 多代理扇出 UI 冻结修复 ——
SharedSubAgentManager现在使用Arc<RwLock<…>>;读取路径获取读锁,而不是在Mutex上争用(#510)。 - 子代理输出汇总 然后才合并到父上下文,因此子节点返回 100KB 证据不会破坏父窗口(#511)。
Implementer+Verifier子代理角色 已接入agent_spawn/agent_assign模式,因此模型可按名称引用它们(#404)。agent_list默认显示当前会话视图 —— 除非include_archived=true,否则过滤掉先前会话(#405)。- 紧凑的
agent_spawn渲染 在实时模式下折叠为单头行;对话回放保留完整块(#409)。 agent_swarm/spawn_agents_on_csv//swarm已在 v0.8.5 中移除——确认在此版本中不再存在;多子扇出不再是模型可调用的工具。
🛠️ 工作流 / 可扩展性
load_skill模型可调用工具 —— 接收 skill id,在一个调用中返回 SKILL.md 正文及同级配套文件列表。可在 Plan 和 Agent / Yolo 模式下使用(#434)。- 跨工具技能发现 —— skills 目录和
load_skill会遍历.agents/skills、skills、.opencode/skills、.claude/skills和~/.deepseek/skills,按首次命中优先级(#432)。 /hooks只读生命周期钩子列表 按事件分组显示已配置的钩子,包含名称/命令预览/超时/条件。注明全局[hooks].enabled状态。/hooks events列出所有支持的HookEvent值(#460)。- 每个
HookEvent现在都有实时生产者 ——tool_call_before/tool_call_after/message_submit/on_error在运行时触发,除了现有的会话生命周期和模式变化事件。在 v0.8.8 中钩子仍为只读观察者(#455)。 instructions = [...]配置数组 允许你叠加额外的系统提示文件;每个文件路径上限 100 KiB,项目数组完全替换用户数组(#454)。deepseek pr <N>子命令 通过gh获取 PR 的标题/正文/差异,并以审查提示启动 TUI 并预填入 composer。代码点安全的差异上限为 200 KiB;可选的--repo/--checkout(#451)。- 用户记忆 MVP(可选)——
~/.deepseek/memory.md作为<user_memory>块注入系统提示;在 composer 中键入# foo会追加带时间戳的要点而不触发轮次;/memory [show|path|clear|edit]供检查。默认关闭;通过[memory] enabled = true或DEEPSEEK_MEMORY=on启用(#489–#493)。
🔒 安全性
- 项目配置密钥在工作区范围被拒绝 —— 恶意的
./.deepseek/config.toml不再能覆盖api_key、base_url、provider或mcp_config_path。最宽松的值(approval_policy = "auto"、sandbox_mode = "danger-full-access")也在项目范围被拒绝(#417)。 SSL_CERT_FILE被尊重 在 HTTPS 客户端中,因此企业 CA / MITM 代理用户可以连接——支持 PEM 包和 DER 回退;失败时记录警告并继续(#418)。- Execpolicy heredoc 解析 ——
normalize_command在 shlex 分词前剥离 heredoc 主体,因此auto_allow = ["cat > file.txt"]能匹配 heredoc 形式cat <<EOF > file.txt\nbody\nEOF。识别<<DELIM/<<-DELIM/<<'DELIM'/<<"DELIM";保留<<<(here-string)不变(#419)。 不要自动批准 git -C ...运行时修复已在 v0.8.7 主分支上发布(#416)——此处包含以保持完整性。
📦 打包
- Linux ARM64 预构建 已添加到发布矩阵;npm 包装器在
aarch64-linux上自动选择正确的二进制文件。新的docs/INSTALL.md涵盖所有安装路径(npm、cargo、预构建、源码)。 deepseek update已修复 —— v0.8.7 的自更新器使用了 Rust ARCH 常量(aarch64/x86_64)而非发布资产命名(arm64/x64),导致该命令在所有平台上失败。现已正确映射,并拒绝将.sha256兄弟文件作为主二进制文件(#503)。- CI 工作流清理 —— 修剪了三个重复/死亡的工作流;
release.ymlbuild任务现在允许在手动workflow_dispatch时跳过parity门控(#507)。
🐛 Bug 修复
- Composer Option+Backspace 现在按词删除(#488)。
- 离线 composer 队列为会话限定范围 —— 旧的无范围队列在失败时关闭,而不是将内容泄漏到无关聊天中(#487)。
display_path测试竞态 + Windows 分隔符 —— 测试不再修改$HOME;home 相对后缀与MAIN_SEPARATOR_STR连接,因此 Windows 显示~\projects\foo(#506)。- 页脚从
app.ui_theme读取状态行颜色(#449)。
🔑 认证与入门
- 无自动操作系统凭据提示 —— 启动、
doctor、doctor --json和普通调度器设置现在使用 CLI 标志 →~/.deepseek/config.toml→ 环境变量。 - 一个设置命令随处可用 ——
deepseek auth set --provider deepseek和 TUI 内入门屏幕都写入共享的用户配置文件,因此密钥可从任何文件夹使用,无需依赖~/.zshrc传播。 - 入门屏幕措辞重写 —— "步骤 1:打开 https://platform.deepseek.com/api_keys" / "步骤 2:粘贴到下方并按 Enter",并附有显式说明显示密钥保存位置。
- 缺少密钥的错误现在可操作 ——
DeepSeek API key not found退出消息首先列出基于配置的 CLI 命令,然后列出环境变量替代方案,并附带~/.zshrcvs~/.zshenv说明,因为 zsh 用户的环境变量仅影响交互式 shell。 - 调度器提供商/认证一致性 —— 标准
deepseek入口点现在接受 TUI 广告的相同 DeepSeek V4 提供商(包括fireworks、sglang),并且旧的deepseek login --api-key/deepseek logout现在共享相同的基于配置的路径。
完整变更日志:CHANGELOG.md。
v0.8.7 更新内容
基于 v0.8.6 的快速补丁,以解除复制/选择的阻塞。
✂️ 选择功能现在覆盖整个对话记录
v0.8.6 中引入的选择收紧将复制/选择限制在用户和助手消息正文,导致无法复制系统笔记、思维块或工具输出中的文本。v0.8.7 移除了该限制,因此渲染的对话记录块再次可从头到尾选择。
v0.8.7 已知问题(已在 v0.8.8 中修复):
deepseek update失败,提示no asset found for platform …,因为自更新器中的平台字符串映射使用了aarch64/x86_64而非发布工件的arm64/x64(#503)。npm i -g deepseek-tui在 ARM64 Linux 上退出并提示Unsupported architecture: arm64 on platform linux,因为 v0.8.7 未发布deepseek-linux-arm64资产。在 v0.8.8 发布之前,请通过以下方式安装:
# x64 Linux / macOS / Windows npm i -g deepseek-tui # ARM64 Linux(鸿蒙、openEuler、Asahi、Raspberry Pi、Graviton 等)—— # 使用 Cargo 从源码构建(Rust 1.85+): cargo install deepseek-tui-cli --locked # 提供 `deepseek` cargo install deepseek-tui --locked # 提供 `deepseek-tui`
完整变更日志:CHANGELOG.md。
v0.8.6 更新内容
📝 AGENTS.md 引导(/init)
/init 遍历工作区,自动检测项目类型(Cargo.toml、package.json、pyproject.toml 等),并写入一个初始的 AGENTS.md,包含构建/测试命令、工作区布局以及从 git log 推断的约定。重新运行会显示建议更新的差异,同时不覆盖已有更改。
🔍 行内 LSP 诊断
每次 apply_patch/edit_file/write_file 之后,引擎向 LSP 服务器发送 textDocument/didChange,并将错误/警告显示在工具结果中。可通过 /lsp on|off 和 [lsp] 配置节进行配置。目前支持 rust-analyzer、pyright、typescript-language-server、gopls 和 clangd。
🔄 自更新(deepseek update)
deepseek update 获取最新的 GitHub 发布版,下载平台正确的二进制文件并经过 SHA256 验证,然后原子替换正在运行的二进制文件。无需再记住 cargo install 或 npm install -g。
🌐 会话共享(/share)
/share 将当前会话导出为静态 HTML 页面,并通过 gh CLI 上传到 GitHub Gist,生成一个可点击的 URL,你可以粘贴到任意位置。
📖 文档刷新
README 英雄区更新了意图声明和架构总结。ARCHITECTURE.md 针对 v0.8.6 进行了清理(移除了 swarm 工具表面,更新了 crate 映射)。CONTRIBUTING.md 现在包含"PR 形态"一节。
完整变更日志:CHANGELOG.md。
v0.8.5 更新内容
🛡️ fetch_url 的 SSRF 保护
fetch_url 现在在连接前验证目标主机名和 IP —— 对回环地址仅允许 localhost 的 HTTP,对远程主机进行 DNS 固定,并拦截内部 IP 范围。由 Hafeez Pizofreude(#261)和 Jason 贡献。
🖥️ 模式驱动配置编辑器
/config tui 打开一个由 schemaui 驱动的表单风格配置编辑器。仅 /config 打开旧的原生模态框;/config web 启动浏览器界面(需要 web 特性)。由 Unic(YuniqueUnic)通过 #365 贡献。
🏷️ DeepseekCN 提供商
ApiProvider::DeepseekCN 针对中国用户使用 api.deepseeki.com。首次运行时当系统区域设置为 zh-* 时自动检测。
🔐 原子文件写入
所有写入 ~/.deepseek/ 的操作现在都通过 write_atomic(临时文件 + fsync + 重命名)进行,防止写入中途崩溃导致的数据损坏。
🧵 Panic 安全基础
spawn_supervised 捕获并记录任务 panic 并附带崩溃转储,而不是静默丢弃任务。
⌨️ /config <key> <value> 绑定
/config model deepseek-v4-flash、/config locale zh-Hans 等命令可在会话中实时更改设置,无需打开编辑器。
完整变更日志:CHANGELOG.md。
感谢
v0.8.5 在以下贡献者的帮助下发布:
- Hafeez Pizofreude ——
fetch_url的 SSRF 保护和 Star History 图表 - Unic (YuniqueUnic) —— 模式驱动配置 UI(TUI + web)
- Jason —— SSRF 安全加固
v0.8.0 更新内容
⚡ Shell 稳定性和发送后响应性
已完成后台 shell 任务在观测到完成时会立即释放其活动进程和管道句柄,同时保持作业记录可供检查。这防止了长时间运行的会话达到 Too many open files (os error 24),该错误曾导致检查点保存失败,并使 shell 生成、消息发送、关闭和 Esc/取消路径出现延迟或失败。
🪟 Windows REPL 运行时 CI 加固
Windows 为 REPL 运行时测试设置了更长的 Python 引导就绪超时,以匹配 GitHub 运行器启动时的争用,同时不削弱其他平台的引导失败检测。
🌏 Cargo 镜像安装文档
README 现在包含 TUNA Cargo 镜像设置和直接发布资产指南,适用于 GitHub/npm 访问缓慢的用户。
🧪 测试加固
新的回归覆盖率证明,已完成后台 shell 作业在 exec_shell_wait 后会放弃其活动进程句柄。
完整变更日志:CHANGELOG.md。
v0.7.8 更新内容
⚡ Shell 控制:前台到后台分离 + exec_shell_cancel
现在可以将正在运行的前台命令移至后台交互式会话——在命令执行时按下 Ctrl+B 可打开 shell 控制,然后可以分离它(它继续运行,并可通过 exec_shell_wait 查询)或取消当前轮次。
新工具:exec_shell_cancel —— 按 task_id 取消特定的后台 shell 任务,或使用 all: true 取消所有正在运行的后台任务。
支持取消的 exec_shell_wait —— 当 exec_shell_wait 阻塞时取消轮次,会停止等待但保留后台任务继续运行。
🐛 Unicode glob 搜索修复
包含多字节字符的文件名(例如 dialogue_line__冰糖.mp3)不再使 matches_glob 函数 panic——字节索引切片已替换为基于 char_indices() 的边界安全迭代。
🔄 扇出 UI 协调
扇出卡不再预填充零状态的工作器,消除了"0 完成 · 0 运行中 · 0 失败 · N 等待"与侧边栏"N 运行中"之间的矛盾。侧边栏现在在来自旧式扇出调用的第一个进度事件到达前显示"正在调度 N"。
完整变更日志:CHANGELOG.md。
v0.7.6 更新内容
🌐 UI 本地化
DeepSeek TUI 现在支持你的语言。新的 locale 设置位于 settings.toml 中,控制 UI 界面——composer、历史搜索、/config、帮助覆盖层和状态提示——而不影响模型输出语言。
| 设置 | 显示 |
|---|---|
locale = \"auto\" |
检查 LC_ALL → LC_MESSAGES → LANG(默认) |
locale = \"ja\" |
日语 |
locale = \"zh-Hans\" |
简体中文 |
locale = \"pt-BR\" |
葡萄牙语(巴西) |
locale = \"en\" |
英语回退 |