返回目录

deepseek-cli

维护状态: 活跃

sandcn/deepseek-cli

DeepSeek 命令行工具(CLI),可在终端中直接调用 DeepSeek 能力,也适配 DeepSeek Harness 插件生态。

前往 GitHub
$ dsh plugin add deepseek-cli

安装

dsh 没有统一的安装命令——把该插件 README(见下方)中的配置行加入你的 profile/patch 配置,然后重启即可。

了解安装方式

3

星标

0

Fork

Python

语言

MIT

许可证

2026-05-30

创建于

2026-09-19

最近推送

README

DeepSeek-cli v2.2.0

全异步、高可扩展的 AI 聊天服务后端,支持多模型适配、增量流式 Markdown 渲染、工具调用系统、上下文压缩和终端交互界面。


快速开始

1. 安装依赖

项目使用 Python ≥ 3.9

方式一:一键安装(推荐)

# 安装全部核心依赖
pip install httpx rich Pygments Jinja2 beautifulsoup4 chardet aiofiles qrcode

# 安装开发依赖(测试/代码检查等)
pip install pytest pytest-asyncio pytest-xdist pytest-cov ruff mypy

方式二:通过项目安装(自动读取 pyproject.toml)

# 安装核心依赖
pip install .

# 安装开发依赖(测试/代码检查等)
pip install ".[dev]"

依赖库说明

用途 安装命令
httpx HTTP 请求库 pip install httpx
rich 终端富文本输出 pip install rich
Pygments 代码语法高亮 pip install Pygments
Jinja2 模板渲染 pip install Jinja2
beautifulsoup4 HTML 解析 pip install beautifulsoup4
chardet 字符编码检测 pip install chardet
aiofiles 异步文件操作 pip install aiofiles
qrcode 终端二维码生成(微信 ClawBot 登录) pip install qrcode

2. 配置

方式一:配置文件(推荐)

创建配置文件 ~/.chat_config/chatrc.json

{
    "provider": "deepseek",
    "api_key": "sk-你的API密钥",
    "model": "deepseek-v4-flash",
    "reasoning_effort": "max",
    "temperature": 0.2,
    "base_url": "https://api.deepseek.com/v1/chat/completions",
    "max_context_chars": 60000,
    "max_output_chars": 3000,
    "max_retries": 10,
    "retry_base_sec": 30,
    "max_session_messages": 0,
    "keep_recent_messages": 0,
    "theme": "dark",
    "max_context_tokens": 60000,
    "summary_token_budget": 2000,
    "auto_force_compress_threshold": 60000,
    "enable_notifications": true,
    "notify_on_chat_completion": true,
    "performance": {
        "http_client": {
            "connect_timeout": 30,
            "read_timeout": 120,
            "write_timeout": 120,
            "max_connections": 100,
            "max_connections_per_host": 20,
            "keep_alive_timeout": 15,
            "enable_pool": true,
            "enable_http2": true
        }
    }
}

配置文件位于 ~/.chat_config/chatrc.json,首次运行时自动创建(使用默认值)。

方式二:环境变量

部分配置项支持通过环境变量覆盖:

环境变量 说明 示例
CHAT_API_KEY API 密钥 export CHAT_API_KEY="sk-xxx"
CHAT_BASE_URL API 基础地址 export CHAT_BASE_URL="https://api.deepseek.com/v1/chat/completions"
CHAT_MODEL 模型名称 export CHAT_MODEL="deepseek-v4-flash"
CHAT_STAGGER_MIN_DELAY 流式输出最小延迟 export CHAT_STAGGER_MIN_DELAY="0.1"
CHAT_STAGGER_MAX_DELAY 流式输出最大延迟 export CHAT_STAGGER_MAX_DELAY="0.5"

环境变量优先级高于配置文件。

支持的多模型 Provider

Provider 适配器 说明
deepseek DeepSeekAdapter DeepSeek 官方 API(默认),支持 deepseek-flash(V4.1 Flash,原生多模态视觉)、v4-pro、v4-flash / v4-flash-vision-exp(旧名,已路由到 V4.1 Flash)、reasoner、chat、coder 系列
custom OpenAICompatAdapter 任意 OpenAI 兼容 API(OpenAI / GLM / 通义千问等),自动检测 reasoner 模型
anthropic AnthropicAdapter Anthropic Claude 系列模型(API 格式自动转换)
ollama OllamaAdapter 本地 Ollama 部署模型(默认 localhost:11434

3. 启动

交互式对话(默认)

python chat.py

启动终端交互界面,进入多轮对话。

单次问答模式

python chat.py -p "你好,请介绍一下自己"

输入一句话,大模型回答完成后立即退出,适合脚本调用。

从保存的会话恢复

python chat.py --load <会话ID>

指定模型

python chat.py -m deepseek-v4-pro
python chat.py --model deepseek-v4-pro

通过 -m / --model 临时覆盖配置文件中的模型,不影响配置文件。

多模态视觉(deepseek-flash)

deepseek-flash(DeepSeek V4.1 Flash)是 DeepSeek 最新一代模型,原生支持 多模态视觉理解,图片按 token 计费。旧模型名 deepseek-v4-flashdeepseek-v4-flash-vision-exp 已下线,请求统一路由到 V4.1 Flash(按相同 单价计费,同样具备视觉能力)。接入方式:

python chat.py -m deepseek-flash

该模型支持两种图片输入方式(图片仅支持出现在用户消息中):

  1. 用户消息直接传图:在输入中携带本地图片路径、![描述](图片路径或URL) 或 裸 http(s) 图片 URL,CLI 自动转换为图片 content blocks(本地图片自动 base64 内联,URL 原样传递):

    分析 /path/to/screenshot.png 里的报错信息
    看下 ![架构图](https://example.com/diagram.png)
    
  2. read_image 工具:AI 代理可主动调用 read_image 工具读取本地图像 (支持分块/灰度/旋转/翻转/缩放操作),多模态模型直接看到 base64 图片 (图片按原始尺寸返回,不做自动缩放)。

非多模态模型下,用户消息中的图片引用保持纯文本原样传递(模型不可见图片)。 如有多模态模型未被内置模式识别,可通过配置扩展:

python chat.py config set multimodal_models '["my-vision-model"]'

详细日志模式

python chat.py -v           # INFO 级别日志
python chat.py -vv          # DEBUG 级别日志

会话管理

python chat.py session list                   # 列出所有保存的会话
python chat.py session delete <会话ID>        # 删除指定会话
python chat.py session export <会话ID>        # 导出会话(打印到 stdout)
python chat.py session export <会话ID> -o chat.json  # 导出到文件

查看版本

python chat.py --version
python chat.py version

完整命令一览

命令 说明
python chat.py 交互式对话(默认)
python chat.py -p "你好" 单次问答模式
python chat.py --load abc123 从会话恢复
python chat.py -m deepseek-v4-pro 指定模型
python chat.py -v INFO 级别日志
python chat.py -vv DEBUG 级别日志
python chat.py session list 列出所有会话
python chat.py session delete abc123 删除会话
python chat.py session export abc123 导出会话
python chat.py config 显示全部配置(含敏感值脱敏)
python chat.py config get model 查询单个配置
python chat.py config set model deepseek-v4-pro 设置配置并持久化
python chat.py config reset model 重置配置为默认值
python chat.py --version 显示版本信息
python chat.py clawbot 微信 ClawBot 远程控制(扫码登录)
python chat.py clawbot --re-login 强制重新扫码登录

3.5 微信 ClawBot 远程控制(clawbot)

通过微信官方 ClawBot 插件协议(iLink Bot API)实现远程发命令 + 结果显示

python chat.py clawbot              # 启动(复用缓存凭证或扫码登录)
python chat.py clawbot --re-login   # 强制重新扫码登录

登录:终端会直接渲染微信官方登录二维码(手机扫码即可,无需打开文件),扫码确认后自动进入监听模式。

远程发命令(在微信里给 ClawBot 发消息):

微信消息 功能
普通文本 AI 对话(DeepSeek 会话引擎,可自动调用文件/Shell 等工具)
/shell <命令> 远程执行 Shell 命令并回显结果
/clear 清空当前会话上下文
/new 开始新会话
/status 显示模型、会话与连接状态
/time 显示连接剩余时间
/model <名称> 切换模型
/help 显示帮助

安全配对:首次发消息的用户需回复终端打印的配对码完成授权,之后该用户的所有命令都被处理;已授权用户持久化在 ~/.chat_config/clawbot_allowed.json

其他说明

  • 每个微信用户有独立会话(LRU 上限 20 个),结果分段回显到微信
  • 输入状态指示("正在输入")自动发送/取消
  • iLink 连接有效期 24 小时,到期前自动提醒并支持扫码重连

4. 快捷操作(终端交互模式下)

以下快捷键仅在终端交互式对话(python chat.py)中生效。

快捷键 功能
Enter 发送消息
Esc(双击) 清空当前输入框内容
Ctrl+G 使用 vim 编辑器编辑当前输入内容(支持 $EDITOR 环境变量)
Ctrl+O 编辑当前会话中的已有消息(触发 /editmsg 命令)
Ctrl+N 循环切换对话模型(RC 模型列表与内置 provider 模型合并,新增模型如 deepseek-flash 自动可切换)
Ctrl+P / 浏览输入历史(上一条)
浏览输入历史(下一条)
Ctrl+R 反向历史搜索(配置门控;默认重试上一轮)
Ctrl+T 循环切换配色主题(dark/light/high-contrast)
Ctrl+L 清屏
Ctrl+D 退出程序(输入为空时)
Ctrl+B 主 Agent 空模式切换
Ctrl+C(首次) 中断当前 AI 回复
Ctrl+C(再次) 强制退出程序
Tab 自动补全(命令名、会话 ID 等)
Shift+Tab 补全反向循环
PgUp / PgDn 补全弹窗翻页
Ctrl+A / Home 光标移到行首
Ctrl+E / End 光标移到行尾
Ctrl+F / 光标右移一字符
Ctrl+B(编辑) 光标左移一字符( 键)
Ctrl+← / 词跳转(等价 Alt+B / Alt+F
Ctrl+W / Alt+Backspace 删除光标前一个词
Alt+D 删除光标后一个词
Ctrl+U 删除光标到行首
Ctrl+K 删除光标到行尾
/ (补全可见) 移动补全高亮

5. 斜杠命令(终端交互模式下)

在对话输入框中以 / 开头输入命令:

命令 别名 功能
/help 显示所有可用命令
/clear 清空对话(保留系统提词)
/loop <N> <提词> 循环执行 N 次指定提词(每轮第1次用用户提词,第2次用固定提词"继续完成所有")
/pin 标记重要消息(压缩时保留)
/editmsg 编辑当前会话消息(同 Ctrl+O)
/undo 撤销上一轮对话
/retry /r 重新生成上一条回答
/edit 编辑并重新发送上一条输入
/model 切换模型(无参数时交互选择,支持序号/名称)
/reasoning [等级] 调整推理等级(low / medium / high / max,无参数时显示当前值)
/temperature [数值] 调整大模型温度(0.0 ~ 2.0,无参数时显示当前值,保存到配置)
/cost 查看 token 用量和费用
/config 显示/编辑程序配置(无参数打开独立配置界面:↑↓/jk 选择、Enter 编辑、Esc 关闭;枚举/布尔/模型走选择界面、list/dict 子 JSON 走递归结构化编辑界面(Enter 逐层下钻嵌套 · 标量编辑 · a 追加 · d 删除 · Esc 逐级返回、顶层保存)、数值/字符串走输入界面;亦支持 show/list/get <键>/set <键> <值>/reset <键>
/load <ID> 加载保存的对话
/sessions 列出所有保存的对话
/export [路径] 导出当前对话为 Markdown(含 SubAgent 聊天信息)
/theme <名称> 切换配色主题(dark / light / high-contrast)
/changes 显示文件沙盒中被修改文件的差异(可加文件名过滤)
exit 退出程序

SubAgent 聊天记录持久化:每个 SubAgent 的完整内部对话(system 提示词 / 任务指令 / 助手回复 / 工具调用与结果)会在其运行结束时记录到父 Agent,并随会话自动保存到 .chat/msg_list/<id>.jsonsubagents 字段;/load 加载会话时同步恢复, /export 导出 markdown 时一并包含。


工具系统(Tool System)

AI 代理在对话中可调用以下工具完成各类操作。共 19 个内置工具,涵盖文件操作、代码搜索、网络请求、用户交互等能力。

工具列表

工具名 缩写 分类 并行安全 功能说明
read_file rf IO 读取文件内容,支持指定行号范围、自动编码检测,可显示行号(默认关闭)
write_file wf IO 覆盖写入文件,自动创建父目录,原子写入
update_file uf IO 精确替换文件中的文本(old_string → new_string),支持 use_regex 正则替换
search sr 搜索 在项目源码中搜索正则表达式,自动排除非源码目录
find fn 搜索 按通配符模式查找文件和目录,支持深度控制
ls ls IO 列出目录内容,支持详细格式和隐藏文件显示
bash bs 执行 执行 shell 命令(安全沙盒保护,禁止替代专用工具)
bash_opt bo 执行 按 task_id 操作后台 bash 任务:read(读取当前已产生的全部输出并清空缓冲,立即返回)/ wait(等待完成取输出)/ kill(杀死进程树)/ stdin(发送文本输入)/ keys(发送光标键盘消息,跨平台 ANSI/VT100)
cp cp IO 复制文件或目录,保留元数据,支持沙盒撤回
mv mv IO 移动文件或目录,支持跨文件系统
rm rm IO 删除文件或目录(删除前自动备份到沙盒)
mkdir mk IO 创建目录,支持递归创建父目录
read_image ri IO 读取图像文件内容,支持分块读取与图像操作(灰度/旋转/翻转/缩放);图片按原始尺寸返回给模型(不做自动缩放);多模态 base64 图片(多模态模型如 deepseek-flash 直接看到图片)
web_search ws 网络 DeepSeek 官方原生联网搜索(Anthropic 兼容 Messages API + web_search_20250305),返回来源列表(标题/URL/摘要)
web_fetch 网络 获取指定 URL 的网页全文(自动提取正文,SSRF 防护,仅 http/https)
user_select us 交互 向用户显示交互式选择界面(单选/多选/超时回退/非交互回退,选项可带说明,TUI 中高亮选项时说明显示在右侧;支持并发提问——多个问题可同一轮同时弹出、以 tab 形式一起回答)
subagent sa Agent 并行派发子 Agent 执行独立任务(支持类型:map/review/plan/execute);直接后台执行,立即返回 {"task_id": "sa-xxx"} JSON,完成后结果自动插入对话(或由 subagent_opt 管理)。后台 subagent 仅主 Agent 可派发
subagent_opt so Agent 按 task_id 操作后台 subagent 任务(subagent 直接后台启动):read(读取当前状态与已产生的结果,立即返回)/ wait(等待完成取结果,timeout 秒,默认 300/0 无限)/ kill(取消后台 subagent 任务)/ wait_all(等待所有后台 subagent 任务完成,返回每个任务结果的 JSON 数组,无需 task_id)。仅主 Agent 可用
skill sk 技能 加载技能(skill)的完整指令(技能目录随系统提示词注入,任务与技能匹配或点名技能时调用)

工具分类

分类 工具 说明
文件 IO read_file, write_file, update_file, ls, cp, mv, rm, mkdir, read_image 读写文件、目录操作、文件管理、图像读取
代码搜索 search, find 正则搜索源码、通配符查找文件
命令执行 bash, bash_opt 安全沙盒中执行 shell 命令;按 task_id 操作后台 bash 任务(bash 后台任务注册在 bash 专用表 _background_tasks
网络访问 web_search, web_fetch 网页搜索(DeepSeek 官方原生搜索)与网页全文获取
用户交互 user_select 交互式选择弹窗(单选/多选/超时回退;支持并发提问,多问题 tab 一起显示)
Agent 调度 subagent, subagent_opt 并发派发原子 Agent 执行独立任务;按 task_id 操作后台 subagent 任务(subagent 后台任务注册在独立表 _subagent_tasks,与 bash 后台任务分表隔离)
技能 skill 加载可用技能(skill)的完整指令

工具设计原则

  • 纯异步 — 所有工具均基于 asyncio,不阻塞事件循环
  • 沙盒安全 — 文件操作自动备份,支持撤回(undo)
  • 元数据系统 — 每工具声明并行安全、网络依赖、超时估计等元数据,供调度层优化
  • 双端适配 — 同时支持终端(display())渲染路径

工具权限系统(v2.2.0+)

不同 SubAgent 类型对工具有不同的访问权限,通过 Func.can_use() 统一检查:

@classmethod
def can_use(cls, tool_name: str, agent_type: str = "execute", path: str | None = None) -> tuple[bool, str | None]:
    """检查指定类型的 agent 能否使用某工具。"""
  • agent_type 注入 — SubAgent 在 _handle_tool_calls() 中自动注入 func.agent_type = self.agent_type
  • 排除规则 — 定义在 src/core/subagent.py_TOOL_EXCLUSION_MAP(详见下方 SubAgent 类型表)
  • 路径白名单FileToolBase._validate_path_and_size() 对 plan Agent 实施路径限制,仅允许写入 .chat/plan/ 目录,防止误写项目源码

光标坐标追踪系统(CursorTracker)

新增于 v2.2.0,全局统一的终端光标坐标追踪基础设施,消除分散在各渲染组件中的坐标推算累积误差。

核心 API

方法 功能
move_to(row, col) 写 ANSI CUP 序列 + 更新内部坐标
move_xy(col, row) 0-based → 1-based 转换入口
set(row, col) 仅更新内部状态,不写终端
record_newlines(n) 追加 n 行后自动更新行号 + 列号复位
record_move_down(n) 下移 n 行(滚动场景)
save() / restore(pos) 检查点模式(返回/恢复 CursorPosition 快照),支持渲染前后坐标范围对比
pos → CursorPosition 获取当前坐标快照

集成架构

ChatUIConsumer
  └── CursorTracker(唯一实例,构造注入到所有子系统)
        ├── ContentRenderer   → _do_content / _do_tool_output 等 14 种渲染后调用 record_newlines()
        ├── RenderEngine       → _phase_render 记录渲染坐标范围,position_cursor 同步最终光标
        ├── _BottomBar         → force_redraw / sync_bottom_lines / ensure_cursor_* 中 set 光标位置
        └── _CompletionPopup   → render / render_cycle_update 中 set 弹窗行坐标

设计决策

  • 单线程使用 — 仅在 render 线程中操作,无需锁
  • 1-based 坐标 — 与终端 ANSI CUP 序列一致
  • 轻量无依赖 — 仅标准库,零外部依赖
  • 检查点模式save/restore 支持嵌套渲染场景的坐标回退

Agent 工作流程

本项目的核心是 Main-Sub Agent 架构,通过 subagent 委派任务给不同类型的子 Agent。

┌──────────────────────────────────────────────────────────────────┐
│                         Main Agent                               │
│                   主控 Agent,负责任务调度(6 步工作流)                 │
│                                                                  │
│  ① 规划 ─→ ② 探底分析 ─→ ③ 修改执行 ─→ ④ 审查 ─→ ⑤ 验证(完成)│
└───────┬───────┬───────┬───────┬───────┘
        │       │       │       │
        │dispatch│dispatch│dispatch│dispatch
        ▼       ▼       ▼       ▼
┌─────────────┐ ┌────────────┐ ┌────────────┐ ┌──────────────┐
│ plan        │ │ map        │ │ review     │ │ execute      │
│ SubAgent    │ │ SubAgent   │ │ SubAgent   │ │ SubAgent     │
│             │ │            │ │            │ │              │
│ 计划型      │ │ 只读分析型  │ │ 代码审查型  │ │ 执行型       │
│             │ │            │ │            │ │              │
│ • 任务拆解  │ │ • 项目探底 │ │ • P0-P3    │ │ • 读/写文件  │
│ • 依赖分析  │ │ • 模块地图 │ │   分级审查  │ │ • 修改代码   │
│ • 资源估算  │ │ • 调用链   │ │ • 循环审查  │ │ • 创建文件   │
│ • 风险识别  │ │ • 引用关系 │ │ • 阻断策略  │ │ • 测试运行   │
│ • 动态重规划│ │            │ │            │ │ • 执行验证   │
└─────────────┘ └────────────┘ └────────────┘ └──────────────┘

工作流说明

1. 规划 ──→  委派 plan SubAgent 制定结构化计划(任务拆解、依赖分析、风险评估)
     │
2. 探底 ──→  委派 map SubAgent 获取模块地图 + 调用链分析
     │         (只读分析,不修改代码)
     │
3. 修改 ──→  基于探底结果执行代码修改
     │         多个独立目标可并发派发 execute SubAgent
     │
4. 审查 ──→  委派 review SubAgent 逐文件审查
     │         P0/P1/P2 阻断修复,P3 纳入记录
     │         最多三轮循环审查
     │
5. 验证 ──→  语法检查 → 构建/编译 → 加测试 → 运行测试 → 运行验证

SubAgent 类型

各类型 SubAgent 通过 _TOOL_EXCLUSION_MAP(定义在 src/core/subagent.py)控制工具可用性。

类型 可用工具 用途
plan 只读分析 + write_file/update_file/mkdir(仅限 .chat/plan/ 目录) 任务拆解、依赖分析、生成计划文件到 .chat/plan/
map 只读(read_file/search/find/ls 等只读工具) 项目探底、模块地图、调用链追踪、引用关系分析
review 只读 + web_search(无 bash/bash_opt 等任何 shell 执行工具) Code Review、P0-P3 分级审查、跨文件一致性验证
execute 全工具(不含 user_select/subagent/subagent_opt/web_search) 读/写/改代码、执行测试、通用任务

工具排除策略(与 src/core/subagent.py_TOOL_EXCLUSION_MAP 一致):execute 排除 subagent/subagent_opt/user_select/web_search;map 排除 bash/bash_opt/write_file/update_file/rm/mv/cp/mkdir/web_search/subagent/subagent_opt/user_select;review 排除 bash/bash_opt/write_file/update_file/rm/mv/cp/mkdir/subagent/subagent_opt/user_select(纯只读审查:仅 read_file/search/find/ls/web_search,无任何 shell 执行能力);plan 排除 bash/bash_opt/rm/mv/cp/subagent/subagent_opt/user_select,write_file/update_file/mkdir 仅限 .chat/plan/ 目录。subagent_opt 与后台 subagent 均仅主 Agent 独有:SubAgent 工具白名单全类型排除 + 工具运行时 isinstance(agent, SubAgent) 双保险。SubAgent 在 _handle_tool_calls() 中注入 agent_type 到 Func 实例,Func.can_use() 进行统一检查。FileToolBase._validate_path_and_size() 额外实施 plan Agent 路径白名单校验。

并发调度策略

多个独立分析/审查任务同时触发时,同轮并发派发多个 SubAgent(如同时分析多个模块、同时审查多个文件),互不阻塞,缩短总执行时间。


目录结构

├── chat.py                # 入口脚本(asyncio.run(main()))
├── pyproject.toml         # 项目配置与依赖
├── prompts/               # 系统提示词(6 个文件)
│   ├── prompts_export_main.md    # 主 Agent 系统提示词
│   ├── prompts_export_main_empty.md  # 主 Agent 系统提示词(精简/空版本)
│   ├── prompts_export_map.md     # map SubAgent 探底提示词
│   ├── prompts_export_plan.md    # plan SubAgent 计划提示词
│   ├── prompts_export_execute.md  # execute SubAgent 提示词
│   ├── prompts_export_review.md  # review SubAgent 审查提示词

├── tests/                 # 测试(按模块划分,覆盖各功能域)
├── .chat/                 # 运行时数据目录(首次运行自动创建)
│   ├── memory/            # 跨对话记忆系统(索引 + 详情)
│   ├── plan/              # Plan Agent 计划文件
│   └── msg_list/          # 会话消息存储(JSON 格式)
│
├── src/                   # 核心源码
│   ├── app.py             # 入口 re-export
│   ├── app_init/          # 应用初始化(参数解析、模式选择)
│   ├── app_loop/          # 交互式/单次模式主循环
│   ├── application.py     # 应用层编排(Application、AppMode)
│   ├── chat_msgs.py       # 对话消息存/取/列/导出
│   ├── checkpoint.py      # 任务断点保存与恢复
│   ├── paths.py           # 路径常量
│   ├── terminal.py        # 终端颜色配置(始终启用颜色)
│   ├── _compat.py         # Python 版本兼容(dataclass/aclosing/get_event_loop)
│   │
│   ├── api/               # API 适配层
│   │   ├── client_async.py    # httpx 异步 HTTP 客户端
│   │   ├── model_async.py     # 模型调用入口 + 重试
│   │   ├── interrupt_async.py # 全局中断信号
│   │   ├── stream/            # 流式输出处理(含推理/工具调用/速度)
│   │   ├── stream_parse.py    # 流式工具调用解析
│   │   ├── tokens.py          # Token 启发式估算
│   │   ├── stats.py           # 会话级 Token 统计
│   │   ├── json_repair.py     # JSON 格式自动修复
│   │   ├── protocols.py       # LLM 协议定义
│   │   ├── telemetry.py        # API 层可观测性
│   │   ├── escape_monitor.py   # 键盘输入监听
│   │   ├── events.py           # API 事件定义
│   │   ├── _model_loops.py / _stats_core.py / _stream_lifecycle.py / _token_speed.py / _tool_parse_utils.py  # 内部辅助模块
│   │   ├── multimodal.py       # 多模态模型判定 + 图片 content blocks 构造(read_image 依赖)
│   │   ├── adapters/          # 多模型适配器(DeepSeek/OpenAI/Anthropic/Ollama)
│   │   └── _adapter_manager.py   # 适配器管理
│   │
│   ├── config/            # 配置系统
│   │   ├── loader.py          # 配置加载/持久化(~/.chat_config/chatrc.json)
│   │   ├── defaults.py        # 默认配置 + Provider 定义
│   │   └── schema.py          # 配置校验
│   │
│   ├── core/               # 核心业务逻辑
│   │   ├── agent.py           # Agent 对话代理(Pipeline 驱动)
│   │   ├── base_agent.py      # Agent 基类(消息管理、沙盒上下文)
│   │   ├── agent_di.py        # Agent 依赖注入工厂
│   │   ├── agent_builder.py   # Agent 构建器
│   │   ├── session.py         # ChatSession 纯领域会话对象(状态机驱动)
│   │   ├── state_machine.py   # 会话状态机(INIT→IDLE→RUNNING→COMPLETED/INTERRUPTED)
│   │   ├── subagent.py        # SubAgent 子代理(含 _TOOL_EXCLUSION_MAP 工具权限策略)
│   │   ├── pipeline.py        # Pipeline 中间件管道(Model-Execute 循环编排)
│   │   ├── compression.py     # 上下文压缩(策略模式)
│   │   ├── context_manager.py # 上下文管理器 + 消息上限控制
│   │   ├── context_selector.py / context_summarizer.py
│   │   ├── message_queue.py   # MessageQueue 异步消息队列
│   │   ├── message_edit.py    # 消息编辑功能
│   │   ├── file_change_record.py # 文件变更记录
│   │   ├── sandbox_manager.py # 文件沙盒管理器
│   │   ├── parallel_executor.py # ParallelExecutor 并行 SubAgent 调度
│   │   ├── tool_executor_async.py # AsyncToolExecutor 异步工具执行器
│   │   ├── tool_dag.py        # 工具 DAG 调度
│   │   ├── cache.py           # 增量统计缓存
│   │   ├── constants.py       # 主题常量
│   │   ├── commands/          # 命令系统(base / _ui_adapter / plugins/)
│   │   ├── exceptions.py      # 异常定义
│   │   ├── internal/          # 内部实现子模块
│   │   │   ├── agent/         # Agent 内部(spawner / callbacks / capture)
│   │   │   ├── shared/        # 共享工具(sandbox_history / stats_cache)
│   │   │   ├── session/       # 会话内部(persistence / messages)
│   │   │   └── commands/      # 命令内部(_command_core / _config_cmd / _data_cmd / _session_cmd)
│   │   ├── events/            # 核心事件总线 + 事件类型
│   │   ├── middleware/        # Pipeline 中间件(审计/中断/状态机/可观测性/工具适配器)
│   │   ├── ports/             # 六边形架构端口定义(8 个端口)
│   │   └── telemetry/         # 可观测性(指标/追踪/上下文传播)
│   │
│   ├── tui/                # 终端 UI 聊天渲染引擎(替代 chat_ui/)
│   │   ├── _assembly.py / _assembly_steps.py / _base_display.py / _completion.py / _completion_engine.py
│   │   ├── _config.py / _const.py / _consumer.py / _diff_renderer.py / _dispatcher.py / _format.py
│   │   ├── _input.py / _input_io.py / _input_parser.py / _input_buffer.py / _input_dispatcher.py
│   │   ├── _input_layout.py / _input_metrics.py / _input_orchestrator.py / _ink_bridge.py / _lifecycle.py
│   │   ├── _screen.py / _snapshot.py / _stdout_tracker.py / _subagent_panel.py / _subagent_render.py
│   │   ├── _subagent_state.py / _tool_icons.py / _width.py / input.py / _history_disk.py / _system_monitor.py
│   │   ├── app/               # AppModel + apply_cmd + 组件树(input_area/status_bar/toolcard/...)
│   │   ├── consumer/          # ChatUIConsumer 事件消费者 + 渲染入口
│   │   ├── core/              # 核心工具(color/style/singleton/_fx/_theme)
│   │   ├── events/            # UI 事件总线 + DisplayEvent 类型定义
│   │   ├── ink/               # React Ink 风格组件框架(调和器/flexbox/hooks/渲染器)
│   │   ├── pipeline/          # 消息编辑/显示管道
│   │   ├── state/             # 消费/注册表状态管理
│   │   └── subagent/          # SubAgent 面板子域聚合门面
│   │
│   ├── renderer/           # 增量流式 Markdown 渲染引擎
│   │   ├── engine.py          # RenderEngine 渲染引擎
│   │   ├── pipeline.py        # TokenPipeline 过滤器链
│   │   ├── recursive_parser.py # 递归下降解析器
│   │   ├── types.py           # Token/TokenType/RenderContext 类型
│   │   ├── states.py          # 渲染状态
│   │   ├── factory.py         # 渲染器工厂
│   │   ├── protocols.py       # 渲染协议
│   │   ├── output.py          # OutputAdapter 输出适配器
│   │   ├── indicator.py       # 流式指示器
│   │   ├── ast/               # AST 构建→扁平化→优化→渲染
│   │   ├── handlers/          # 块级元素处理器(code/table/mermaid/math/admonition 等)
│   │   ├── targets/           # 渲染目标抽象(RenderTarget / CompositeRenderTarget)
│   │   │   ├── __init__.py
│   │   │   └── base.py
│   │   │
│   │   ├── pipeline_filters/  # 流式优化过滤器
│   │   ├── math_symbols/      # 数学符号定义
│   │   ├── _rendering/        # 内部渲染辅助
│   │   └── _utils/            # 内部工具函数
│   │
│   ├── tools/              # 工具调用系统(19 个内置工具)
│   │   ├── base.py            # Func 基类 + 元数据系统(含 can_use 工具可用性检查 / agent_type)
│   │   ├── file_base.py       # FileToolBase 文件操作基类(含 plan agent 路径白名单)
│   │   ├── registry.py        # 工具注册表(自动发现 + 调度 + 元数据索引)
│   │   ├── read_file.py / write_file.py / update_file.py / read_image.py
│   │   ├── search.py / find.py / ls.py
│   │   ├── bash.py / cp.py / mv.py / rm.py / mkdir.py / skill_tool.py
│   │   ├── web_search.py / web_fetch.py / user_select.py / subagent.py / subagent_opt.py
│   │   ├── file_ops.py        # 文件操作原子工具(原子写入、路径安全校验、沙盒记录)
│   │   ├── _constants.py      # 共享常量(排除目录、安全路径、编码等)
│   │   ├── encoding.py        # 编码检测工具函数
│   │   ├── utils.py           # 工具通用辅助函数
│   │   ├── search_providers.py  # DeepSeek 官方原生搜索提供者(web_search 依赖)
│   │   └── page_fetcher.py    # 网页内容抓取(web_fetch 依赖)
│   │
│   ├── prompt_builder/     # 系统提示词构建
│   ├── notifications/      # 桌面通知(Termux/Linux/Windows)
│   └── observability/      # 可观测性门面(聚合指标/追踪/遥测日志)

六边形架构(Ports & Adapters)

核心层通过 8 个端口接口 访问基础设施,实现依赖倒置——核心层不直接依赖 apituichat_msgs 等具体实现模块,基础设施层通过适配器模式实现这些端口。

端口 文件 说明
ConfigPort ports/config.py 配置管理(读取/写入/默认值)
AsyncModelPort ports/model.py 异步模型调用(LLM API)+ ModelResult
PersistencePort ports/persistence.py 会话持久化(JSON 文件存储)
CheckpointPort ports/persistence.py 任务断点保存与恢复
EventPort ports/events.py 事件总线发布/订阅
InterruptPort ports/interrupt.py 中断信号检查
ObservabilityPort ports/observability.py 可观测性(指标/追踪)
ModelResult ports/model.py 模型调用结果数据类(input/output tokens / tool_calls)

设计原则:所有端口均为 Protocol 或抽象基类,核心层仅依赖端口接口,不感知具体实现。测试时可通过 Mock 适配器替换基础设施,实现核心逻辑的独立单元测试。


事件系统

核心事件总线(src/core/events/

通用事件发布/订阅系统,支持通配符订阅和优先级排序。定义 16 种事件类型

事件常量 事件类型字符串 说明
MODEL_CALL_STARTED model.call.started 模型调用开始
MODEL_CALL_COMPLETED model.call.completed 模型调用完成
MODEL_CALL_FAILED model.call.failed 模型调用失败
MODEL_STREAM_CHUNK model.stream.chunk 流式内容块
TOOL_CALL_STARTED tool.call.started 工具调用开始
TOOL_CALL_COMPLETED tool.call.completed 工具调用完成
TOOL_CALL_FAILED tool.call.failed 工具调用失败
SESSION_STARTED session.started 会话开始
SESSION_COMPLETED session.completed 会话完成
SESSION_INTERRUPTED session.interrupted 会话中断
SESSION_SAVED session.saved 会话保存
CONTEXT_COMPRESSED context.compressed 上下文压缩完成
CONTEXT_COMPRESS_FAILED context.compress.failed 上下文压缩失败
CONFIG_CHANGED config.changed 配置变更
APP_BOOTSTRAP app.bootstrap 应用启动
APP_SHUTDOWN app.shutdown 应用关闭

特性:通配符订阅(如 model.* 匹配所有模型事件)、优先级排序(EventPriority 枚举,LOWEST→HIGHEST)、不可变事件数据类(frozen dataclass)。

UI 事件总线(src/tui/events/

显示层事件系统,定义 24 种 DisplayEvent 类型(生命周期/工具调用/Agent 状态/模型阶段/流式内容/附加状态/通用输出/用户交互),基于 CoreEventBus 底层发布机制实现。DisplayEventBusDisplayEvent 子类提供类型安全包装,与核心事件(字符串类型)并行独立运作,确保终端共享相同的事件语义。


Pipeline 中间件管道

Pipeline 将 Agent 对话循环编排为可插拔中间件链。中间件按注册顺序依次执行,每个钩子可拦截/增强/跳过特定阶段。

中间件列表(5 个)

前往 GitHub

DSH Plugins 是独立的 DeepSeek Harness 插件市场,与 DeepSeek 官方无关,也不代表官方背书。第三方插件未经安全审计,安装前请审查源码。

每周获取最新的 DeepSeek Harness 插件,绝不滥发。