# heng-agent
**Repository Path**: bkywksj/heng-agent
## Basic Information
- **Project Name**: heng-agent
- **Description**: 中文优先的终端编码智能体(GitHub 镜像:https://github.com/bkywksj/heng-agent):读代码、改代码、跑命令;支持 DeepSeek、Kimi、通义、GLM、Claude 等,兼容 Claude Code 配置
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-10-27
- **Last Updated**: 2026-10-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# heng-agent
类似 Claude Code 的终端编码智能体:用中文派活,它读代码、改代码、跑命令,直到任务完成。
支持 Anthropic 与 OpenAI 两种协议,内置 DeepSeek、Kimi、GLM、通义千问、OpenAI、OpenRouter、Ollama 与 heng 自己的模型,
也能接任意兼容中转站。
## 安装
一条命令装好(没有 uv 会先自动装 uv;pypi.org 连不上会自动改用清华镜像;已装过就升级到最新版)。
有新版本时欢迎页会提示,运行 `heng-agent upgrade` 升级(每天最多后台查一次,可用 `settings.update_check` 关掉):
```powershell
# Windows(PowerShell)
irm https://gitee.com/bkywksj/heng-agent/raw/master/install.ps1 | iex
```
```bash
# macOS / Linux
curl -LsSf https://gitee.com/bkywksj/heng-agent/raw/master/install.sh | sh
```
(在国外把地址换成 `https://raw.githubusercontent.com/bkywksj/heng-agent/master/install.ps1`、`…/install.sh`。)
已经有 [uv](https://docs.astral.sh/uv/)(Python 的包管理工具,会自动准备好 Python)的话,也可以直接:
```bash
uv tool install heng-agent # 装成全局命令,任何目录都能敲 heng-agent
heng-agent upgrade # 升级(Windows 上会开个新窗口、等 heng-agent 退出后再升级)
uv tool uninstall heng-agent # 卸载
```
从源码装:`git clone` 本仓库后,在仓库目录里 `uv tool install .`。
装完如果提示「not on your PATH」,运行一次 `uv tool update-shell` 再重开终端。
**第一次运行**会引导你配置模型服务:先自动找电脑上现成的配置(环境变量里的 `DEEPSEEK_API_KEY` 等密钥、
Claude Code 里配的中转站、Codex 的 `~/.codex/config.toml` 里用 API key 的服务商与 `codex login --api-key` 存的密钥),
能一键用上;没有就选服务商、填密钥。配好后自动测一下连接,失败会说清楚原因(密钥不对、余额不足、连不上)。
随时可以用 `/config provider` 修改。
> Claude 订阅(Pro / Max)、ChatGPT 账号的登录**不能**拿来在 heng-agent 里用:订阅账号的登录令牌只给官方客户端用,
> 第三方读出来调接口违反服务条款,可能导致封号。heng-agent 只用 API key。想用订阅额度,就直接用 Claude Code / Codex。
### 平台支持
主要在 Windows(Windows Terminal)上开发与测试;macOS、Linux 上核心功能(对话、工具、MCP、钩子、会话……)
都能用,以下几项暂时只在 Windows 上有:
| 功能 | Windows | macOS / Linux |
|---|---|---|
| AI 回复时按 ESC 中断、Ctrl+B 转后台 | ✅ | 暂不支持,用 Ctrl+C 中断 |
| Alt+V 粘贴剪贴板里的图片、文件 | ✅ | 暂不支持,用 `@文件路径` |
| Shift+Enter 换行 | ✅ | 取决于终端;Ctrl+J、Alt+Enter 处处可用 |
## 最快上手(以 DeepSeek 为例)
```bash
export DEEPSEEK_API_KEY=你的密钥 # PowerShell:$env:DEEPSEEK_API_KEY="..."
cd 你的项目目录
heng-agent --provider deepseek
```
## 服务商
`heng-agent --list-providers` 列出全部配置档、默认用哪个、密钥是否已设置(只显示已设置 / 未设置,不显示密钥)。
| 名字 | 协议 | 密钥环境变量 | 说明 |
|---|---|---|---|
| `heng` | anthropic | `HENG_AGENT_API_KEY` | 本机 heng serve(自己的模型或 proxy 转发),**默认** |
| `anthropic` | anthropic | `ANTHROPIC_API_KEY` | Anthropic 官方 |
| `deepseek` | anthropic | `DEEPSEEK_API_KEY` | DeepSeek |
| `kimi` | anthropic | `MOONSHOT_API_KEY` | Kimi(月之暗面) |
| `glm` | anthropic | `ZHIPU_API_KEY` | 智谱 GLM |
| `qwen` | openai | `DASHSCOPE_API_KEY` | 通义千问(阿里云百炼) |
| `openai` | openai | `OPENAI_API_KEY` | OpenAI |
| `openrouter` | openai | `OPENROUTER_API_KEY` | 一个密钥用多家模型 |
| `ollama` | openai | 不需要 | 本机 Ollama |
预设里的模型名只是建议值(各家改名很频繁),用 `--model` 临时换,或在配置文件里改。
界面里随时 `/provider deepseek` 切换服务商(对话历史保留),`/model 名字` 换模型。
### 配置文件 `~/.heng-agent/config.json`
自己的中转站、改默认服务商、改预设的模型名都写在这里:
```json
{
"default": "deepseek",
"profiles": {
"deepseek": {"preset": "deepseek", "model": "deepseek-flash"},
"永夜": {
"protocol": "anthropic",
"base_url": "https://你的中转站地址",
"model": "claude-opus-4-8",
"api_key": "sk-..."
}
}
}
```
- `preset`:继承一个内置预设,只写要改的字段。
- 密钥二选一:`api_key_env`(读环境变量,推荐)或 `api_key`(写在这个文件里;文件只在你的用户目录,不会进任何项目)。
- `auth`:密钥放哪个请求头,`auto`(默认,两种都带)/ `x-api-key` / `bearer`。中转站报 401 时试试改这个。
- **代理**:默认按 `HTTP_PROXY` / `HTTPS_PROXY` 等环境变量走。要单独指定,在 `settings` 里写 `"proxy"`
(管模型请求、MCP 的 http 连接、web_fetch),或在某个配置档里写 `"proxy"`(只管这个服务商,优先于 `settings`)。
取值:代理地址 `http://主机:端口`、`socks5://主机:端口`,或 `direct`(不走代理,环境变量设了也不用)。
例如国外的走代理、国内的直连:`"settings": {"proxy": "http://127.0.0.1:7890"}`,再给 `deepseek` 配置档写 `"proxy": "direct"`。
本机地址(localhost、127.0.0.1)始终直连;代理只能写在用户配置里,项目配置写了会报错(别人的仓库不能替你决定请求发到哪)。
`/doctor` 会显示当前实际走的代理。
**不支持 Claude 订阅账号登录(OAuth)**:Anthropic 的条款只允许订阅账号的登录凭据用在它自己的客户端里,
第三方工具使用有封号风险。用 Claude 请用 API 密钥(`anthropic` 预设)或中转站。
## 接自己的模型(heng)
```bash
# 终端 1:在 heng 模型仓库的目录启动模型服务
.venv/Scripts/heng.exe serve configs/serve/heng-mini.yaml # 自己训练的模型
# 或 configs/serve/proxy-claude.yaml(需 HENG_UPSTREAM_API_KEY),把请求转发到 Claude
# 终端 2:在项目目录
heng-agent --provider heng --model heng-mini-0.1
```
## 常用参数
| 参数 | 作用 |
|---|---|
| `--provider 名字` | 用哪个服务商配置档 |
| `--model` / `--base-url` | 临时覆盖模型名 / 地址 |
| `--resume` | 接着这个目录上次的会话聊 |
| `-p "任务"` | 非交互:执行完这一个任务就退出(需要确认的操作一律拒绝) |
| `--permission-mode ask` | 默认,手动确认:改文件、跑命令前都问你 |
| `--permission-mode accept-edits` | 自动改文件:改文件不问,跑命令还问 |
| `--permission-mode plan` | 计划模式:只读代码,交出计划等你批准,批准后再动手(见下文「计划模式」) |
| `--permission-mode auto` | 全部放行:什么都不问,直接执行(相当于 Claude Code 的 bypass permissions;只在 CI、一次性沙箱等可信环境用;仍不能读写工作目录以外) |
| `--workdir` | 指定工作目录(默认当前目录) |
## 界面里
- 输入框:**Enter 发送,Shift+Enter 换行**(其他终端里用 Ctrl+J / Alt+Enter),`/` 补全命令,`@` 补全文件路径,
Shift+Tab 切换权限模式(边框颜色跟着变)。
- **底部状态栏**两行:第一行是项目名与 git 分支(`*` = 有没提交的改动)· 服务商与模型 · MCP · 上一次的输出速度(低于 15 t/s 标橙色,多半是中转站拥堵或限流)·
上下文进度条 · 额度;第二行是权限模式与提醒(后台任务、快到自动压缩)。窗口窄时第一行按
额度 → 速度 → 分支 → 服务商名 → token 数 → 进度条的顺序省掉,不会截断。
- **MCP**:`⠹ MCP 3` 橙色 = 还在连(数字是已连上的个数),`✓ MCP 6` 绿色 = 都连上了,`✗ MCP 5` 红色 = 有连不上的
(`/mcp` 看原因)。三种写法一样宽,连接过程中状态栏不跳动。
- **额度**:按服务地址认出服务商,用同一把 API key 查(每 3 分钟最多一次,后台查、不拖慢输入):
DeepSeek、Moonshot、硅基流动显示余额;Kimi Code 显示 5 小时与本周期剩几次;智谱 GLM Coding Plan 显示
5 小时已用百分比与重置倒计时;new-api / one-api 一类中转站显示余额(不限额度的显示已用多少)。
查不到的(本机服务、Anthropic 官方订阅要登录令牌、OpenRouter 要管理密钥)就不显示。
- **自定义状态栏**:在用户配置里写一条命令,它的输出替换状态栏第一行(只认用户配置,项目配置里写了不生效——它会执行命令):
```json
{"settings": {"status_line": "node ~/my-statusline.js"}}
```
命令从标准输入收到会话信息的 JSON(字段同 Claude Code 的 statusLine:`model`、`workspace`、`cwd`、`session_id`、
`context_window`,另有 `heng` 段:服务商、权限模式、输出速度),标准输出的前三行替换第一行,可以带 ANSI 颜色;
每问答完刷新一次,超过 5 秒没结束算失败;MCP 状态挪到第二行。给 Claude Code 写过状态栏脚本的,
写 `"status_line": "claude"` 就直接用 `~/.claude/settings.json` 里的 `statusLine`。不写就是上面的内置两行。
- **拖入文件 / 粘贴截图**:消息里出现的文件绝对路径(拖入文件、**智码终端里 Ctrl+V 粘贴的截图**都是这样进来的)
发送时自动变成附件;工作目录以外的文件先复制到 `.heng-agent/attachments/`(自带 `.gitignore`,不进仓库)。
在 Windows Terminal 里粘贴截图用 **Alt+V**:Windows Terminal 自己处理 Ctrl+V 且只粘文字,截图到不了程序
(Claude Code 在 Windows 上也是 Alt+V);把 Ctrl+V 交给程序的终端里 Ctrl+V 也能直接粘截图。
- **/config**:在对话里查看与修改配置,改完立即生效。`/config provider` 引导式添加服务商(自动取模型列表让你挑、
密钥输入不回显);`/config set profiles.yongye.model claude-opus-5`、`/config set settings.permission_mode plan`;
`/config edit` 用记事本打开配置文件。改错了自动恢复原配置。加 `--project` 改项目配置。
- 配置文件的 `settings` 段可以写启动默认值:`permission_mode`、`max_tokens`、`max_rounds`、`bash_timeout`、
`context_window`、`compact_ratio`、`image_preview`(命令行参数优先)。
- **图片缩略图**:附图发送后,在 Windows Terminal(1.22 起)里直接画出缩略图(Sixel)。`image_preview`:
`auto`(默认,只在 Windows Terminal 里画)/ `on` / `off`;不支持 Sixel 的终端会显示成一屏乱码,所以默认不在别处画。
- **会话**:`/resume` 弹出这个目录的会话列表选一个接着聊(`/resume 关键词` 按会话名、第一句话筛选);`/rename 名字`
给会话起名;启动时 `heng-agent -c` 直接接最近的会话。
- **模型**:`/model` 向服务商取可用模型、方向键选,当前会话立即生效,可以顺手存成默认。
- **计划模式**:大改动先 Shift+Tab 切到 `plan`(或 `/mode plan`)再说任务。它只读代码、想清楚后交出计划
(改哪些文件、怎么改、怎么验证),完整显示给你选:**开始执行**(改文件、跑命令前问你,切到 `ask`)、
**开始执行、改文件不问**(切到 `accept-edits`),或**继续规划**(留在计划模式,接着说要改哪里)。
批准后它在同一轮里接着按计划做,不用再说一遍。编辑器里(ACP)同样弹这三个选项,模式下拉框跟着变。
- **权限规则**:确认框里选「以后都允许」,规则写进用户配置;`/permissions` 查看与增删,例如
`/permissions allow bash(npm test)`、`/permissions deny bash(git push*)`。写法 `工具名` 或 `工具名(匹配内容)`,可用 `*`。
**拒绝规则优先于一切**(auto 模式下也拒绝);**bash 组合命令(`&&` `;` `|` 重定向、`$(...)` 等)不适用允许规则**,
照常询问,免得 `bash(git status*)` 放过 `git status && rm -rf …`;**项目配置只能加拒绝规则**,别人的仓库没法给自己放开命令。
- **提示缓存**(Anthropic 协议默认开启):系统提示词与对话历史命中缓存后按 0.1 倍计价,长对话省钱明显;`/cost`
显示命中率。不想用就在配置档里写 `"prompt_cache": false`。
- **输入框快捷键**:Ctrl+R 搜历史输入(Enter 采用、接着改);Ctrl+G 用外部编辑器写长消息(`$EDITOR`,没设用记事本;
VS Code 写 `code --wait`);Ctrl+T 显示 / 隐藏输入框上方的任务清单。
- **会话工具**:`/context` 看上下文被什么占着;`/diff` 看这次会话改过的文件;`/copy` 复制上一条回复的原文(`/copy 2` 复制倒数第二条;回复里有代码块时可以只复制其中一段)。回复顶格显示、行尾不带空格,代码块不铺背景,鼠标拖选复制出来也是干净的;
`/export [路径]` 导出 Markdown;`/compact 要求` 按你的要求压缩(如「只保留数据库迁移相关的」)。
- **任务完成提醒**:任务跑超过 `notify_after` 秒(默认 30,0 关闭)结束时响铃,Windows Terminal 会闪任务栏。
- **记忆**:输入以 `#` 开头的一句话(如 `# 这个项目用 pnpm`)不发给模型,选记进项目或用户的 HENG.md,立即生效;
`/memory` 查看、`/memory edit project|user` 用编辑器改。大项目的子目录可以有自己的 HENG.md(如 `frontend/HENG.md`),
模型第一次读写那个目录的文件时自动附上,每份只附一次。
- **内置命令**:`/commit [要求]` 按仓库风格写提交信息并提交(不 push、不改历史);`/review [关注点]` 审查没提交的改动,
按严重程度列问题。在 `.heng-agent/commands/` 放同名的 `commit.md` / `review.md` 就能按自己团队的规矩改写。
- **`/doctor`**:检查配置、服务商连接(会真的连一次)、密钥、代理、终端、git、记忆、钩子、MCP、会话目录。
`/doctor copy` 把检查结果连同最近的日志复制下来(用户目录换成 ~),反馈问题时直接贴。
- **查看状态**:`/status` 一屏看全版本、模型、会话、权限、MCP、说明文件;`/usage`(`/cost`)本会话的用量与花费、
缓存命中率;`/stats` 今天 / 近 7 天 / 近 30 天的统计,按项目、按模型排名;`/context` 上下文被什么占着;
`/hooks` 生效的钩子。
- **后台任务**:开发服务器、watch 这类不会自己结束的命令,模型会用 `run_in_background` 放到后台跑,之后用 `bash_output`
看新输出、`kill_task` 停掉。前台命令跑着时按 **Ctrl+B** 也能把它转到后台(进程不停、已有输出不丢)。
`/tasks` 查看、`/tasks kill bg1` 停止;状态栏会显示「后台 N」;退出 heng-agent(含 `-p` 结束)时停掉全部后台任务。
- **思考模式**:`/think` 切换(`/think on|off`、`/think 16000` 设预算、`/think show` 看最近一次思考),也可在配置
`settings.thinking` / `settings.thinking_budget` 里常开。思考过程不刷屏:等待动画里显示想了多少字,结束后折叠成一行。
Anthropic 协议下思考块(带签名)原样存进历史、调工具后原样传回(服务要求);OpenAI 协议(DeepSeek 推理模型等)
是否思考由模型决定,`reasoning_content` 只显示、不进历史(传回去会报错)。
- **思考强度**:`/effort` 选(或 `/effort high`、`/effort auto` 回到服务默认),也可写 `settings.effort`;状态栏显示 `✻ high`。
请求怎么写按模型自动适配:Claude 4.6 以后用自适应思考加 `effort`(low / medium / high / xhigh / max);
Opus 5.5、Sonnet 5.5、Fable 的思考关不掉,`/think off` 时按 low 强度少想;更早的 Claude 与 DeepSeek、Kimi、GLM 等
仍用思考预算,强度换算成预算(low 2k … max 64k);OpenAI 协议发 `reasoning_effort`(只有 low / medium / high)。
- **自定义子智能体角色**:在 `.heng-agent/agents/名字.md`(项目)或 `~/.heng-agent/agents/`(用户)定义「测试员」「审查员」
这类角色——开头写 `description`(模型据此挑)与 `tools`(不写就是只读),正文是它的提示词。模型用 `task` 工具派它们。
只读角色不用确认、可以并行;带 `write_file` / `edit_file` / `bash` 的角色按你的权限模式确认、不并行,改的文件能 `/undo`。
`/agents` 查看,`/agents new 名字` 建模板并打开编辑器,存好马上生效。
- **git 工作树隔离**:想试个有风险的改动、或让两件事互不干扰时,`heng-agent -w 名字` 启动,或会话里 `/worktree new 名字`,
就在 `.heng-agent/worktrees/名字`(分支 `heng/名字`)里干活,不碰主分支和你没提交的改动(这个目录自动被 git 忽略)。
`/worktree` 列出、`/worktree switch 名字|main` 切换、`/worktree remove 名字` 删除(分支没合并就保留)。
改完在工作树里 `/commit`,回主目录 `git merge heng/名字`——合并可能冲突,不自动做。
## 内置技能
装好就有、不用配置的技能,模型在任务对得上时自动读它的完整说明再动手(`/skills` 查看):
| 技能 | 什么时候用 |
|---|---|
| debugging | 报错、测试失败、行为不对:先复现、再定位、找到根因再修,最后加回归测试 |
| writing-tests | 写测试:照项目已有的框架与风格,覆盖正常路径、边界与出错情况 |
| refactoring | 重构:先有测试兜底,小步改、每步都验证,行为不变 |
| codebase-tour | 读懂陌生项目:怎么跑起来、模块怎么分工、关键流程怎么走 |
| security-check | 安全检查:密钥泄露、注入、越权、不安全的输入与依赖,按严重程度报告 |
想按自己团队的习惯改写,在 `.heng-agent/skills/<同名>/SKILL.md`(项目)或 `~/.heng-agent/skills/`(用户)放一个同名技能即可替换。
## 兼容 Claude Code 与 AGENTS.md
从别的编码工具转过来,项目里现成的配置直接能用,不用迁移:
| 配置 | 读哪里 | 说明 |
|---|---|---|
| 项目说明 | 根目录的 `HENG.md`、`AGENTS.md`、`CLAUDE.md`、`CLAUDE.local.md`;子目录里的同名文件 | 都读;内容一样的(如 CLAUDE.md 链到 AGENTS.md)只算一份;CLAUDE.md 的 `@路径` 引用会展开 |
| 用户说明 | `~/.heng-agent/HENG.md`、`~/.claude/CLAUDE.md` | |
| 技能 | `.claude/skills/`、`~/.claude/skills/` | 格式一样;同名时 `.heng-agent/` 的优先 |
| 子智能体 | `.claude/agents/`、`~/.claude/agents/` | Claude 的工具名(Read、Bash……)自动对应;不写 tools 时照 Claude 的规则继承全部工具 |
| MCP | 项目根目录的 `.mcp.json` | 支持 `${变量}`、`${变量:-默认值}`;项目里的服务照样要确认信任才启动 |
| 自定义命令 | `.claude/commands/`(可分子目录)、`~/.claude/commands/` | 支持 `$ARGUMENTS`、`$1`…`$9`、`argument-hint`、``!`命令` ``(先跑命令把输出拼进去:用户级的直接跑,项目里的先问你,脚本模式只在 auto 时跑) |
| 权限规则 | `~/.claude/settings.json`;项目 `.claude/settings.json`、`settings.local.json` | 规则自动翻译(`Bash(npm test:*)` → `bash(npm test*)` 等);项目里的只采用拒绝规则;它的 `defaultMode` 不跟,权限模式由 heng-agent 自己定 |
| 钩子 | 同上几个 `settings.json` 的 `hooks` | 支持 PreToolUse、PostToolUse、UserPromptSubmit、Stop、SessionStart:照 Claude 的约定从标准输入传 JSON(工具名报 `Bash`、`Edit`……,文件参数是绝对路径的 `file_path`),设 `CLAUDE_PROJECT_DIR`,认退出码 2 与标准输出的 JSON 决定(`decision: block`、`permissionDecision: deny`、`additionalContext`);项目里的要确认信任 |
拒绝规则对组合命令逐段检查(`cd x && 危险命令` 也拦得住),文件路径换写法(`./.env`、`E:\项目\.env`)也拦得住。
欢迎页会显示「兼容加载:……」,`/doctor` 也列出来。
几份说明并存时:系统提示词里按优先级从低到高排列——用户级在前、项目级在后,同一级里
`CLAUDE.md` < `AGENTS.md` < `CLAUDE.local.md` < `HENG.md`,并明确告诉模型「内容冲突时以后面的为准」;子目录的说明比根目录的更具体。
读到了写给 Claude Code 的说明时,还会附一段工具名对照(Bash → bash、Edit → edit_file……)。`/memory` 按这个顺序列出每份说明
各占多少 token、`#` 快速记忆写进哪个文件,合计超过 1 万 token 时提醒精简(如 CLAUDE.md 里只写一行 `@AGENTS.md`)。
`/init` 默认生成 `AGENTS.md`(跨工具的开放标准,别的工具也读得到),
项目里已有说明文件就更新现有的。不想读 Claude Code 的用户级配置(`~/.claude` 里的),在配置里设
`settings.claude_user_config` 为 `false`;项目里的照读。
有些 Claude 钩子是专给 Claude Code 自己用的集成(如智码的会话记录器),在 heng-agent 里跑会出错或记错,
用 `settings.claude_hooks_skip` 跳过:命令里含其中任一段文字的 Claude 钩子不跑,如 `["aicoder-claude-session-recorder"]`。
## 开发版与正式版
开发 heng-agent 的同时自己也在用它,两边互不干扰:
| | 正式版 | 开发版 |
|---|---|---|
| 命令 | `heng-agent` | `heng-dev`(`scripts/install_dev_command.py` 装一次;或直接跑仓库里的 `.venv/Scripts/heng-agent`) |
| 代码 | 从打了标签的版本装进环境,装好就不变 | 直接跑仓库源码,改完立即生效 |
| 数据 | `~/.heng-agent` | `~/.heng-agent-dev`(第一次运行从正式版复制一份配置,之后各改各的) |
| 标记 | — | 欢迎页品红边框、品红字标与「开发版」徽标,窗口标题带「[开发版]」,版本号带 git 位置 |
是不是开发版看代码在哪儿就知道(仓库的 `src/` 下就是开发版),也可以用环境变量 `HENG_AGENT_CHANNEL=dev|release` 强制;
`HENG_AGENT_HOME` 或 `--home` 可以直接指定数据目录。配置里有当前版本不认识的设置(新版写的)时只提示、不拦启动。
发布:改 `pyproject.toml` 与 `src/heng_agent/__init__.py` 里的版本号 → 在 CHANGELOG.md 记下改动 → 提交、打标签 `v版本号` →
从标签构建安装包装成正式版(见 CHANGELOG.md 开头的「发布步骤」)。
## 在编辑器里用(ACP)
`heng-agent --acp` 以 [Agent Client Protocol](https://agentclientprotocol.com)(ACP)运行:编辑器或桌面应用通过标准输入输出
驱动它,在自己的界面里聊天——流式显示回答、思考与工具调用,改文件、跑命令前在编辑器里弹窗确认(改文件时能直接看到改动对比),
随时取消,也能列出、恢复以前的会话。支持 ACP 的客户端都能用,比如 Zed:
```json
{
"agent_servers": {
"heng-agent": { "command": "heng-agent", "args": ["--acp"] }
}
}
```
其他支持 ACP 的客户端(JetBrains 系列 IDE 等)按各自的说明添加命令 `heng-agent --acp` 即可。
- 服务商与密钥用 heng-agent 自己的配置(先在终端里运行一次 `heng-agent` 按引导配好),或者由客户端启动时用环境变量给(见下);
- 客户端里有三个下拉框:模型(列出配好、能用的服务商)、权限模式(手动确认 / 自动改文件 / 计划模式 / 全部放行)、思考(开 / 关);
- 项目里还没被信任的钩子与 MCP 服务在 ACP 模式下不加载(没法弹信任确认):在终端里打开一次这个项目、确认信任即可。
### 启动时用环境变量给服务商
别的程序(如智码)启动 heng-agent 时,可以用环境变量直接给服务商——只在这次运行里用,不写进配置文件,
也不会弹第一次用的引导;终端模式、`-p` 与 `--acp` 都认:
| 环境变量 | 说明 |
|---|---|
| `HENG_AGENT_BASE_URL` | 服务地址。设了它才启用,设了就是这次运行的默认服务商(名字叫 `env`) |
| `HENG_AGENT_API_KEY` | 密钥 |
| `HENG_AGENT_MODEL` | 模型名(必填) |
| `HENG_AGENT_PROTOCOL` | `anthropic`(默认)或 `openai` |
| `HENG_AGENT_AUTH` | `auto`(默认)、`x-api-key` 或 `bearer` |
命令行的 `--provider` 仍然优先。用专门的变量名、不读 `ANTHROPIC_BASE_URL` 这类:不少人为别的工具全局设着
`ANTHROPIC_API_KEY`,一看到就用会悄悄绕开你在 heng-agent 里配好的默认服务商。
## 脚本模式(-p)
```bash
heng-agent -p "把 cart.py 的运费改成 15 元" --allowed-tools "edit_file,bash(python -m pytest*)"
cat error.log | heng-agent -p "分析这段错误" # 管道内容附在问题后面
echo "解释一下 README" | heng-agent -p # 只写 -p:管道内容就是问题
heng-agent -p "统计代码行数" --output-format json # 结束时输出一个 JSON:result、session_id、usage……
heng-agent -p "跑测试" --output-format stream-json # 每个事件一行 JSON,给别的程序实时展示进度
```
`-p` 没人可问,需要确认的操作默认都拒绝:用 `--allowed-tools` 放行(规则写法同 `/permissions`,逗号分隔),
`--disallowed-tools` 额外禁止;或用 `--permission-mode accept-edits` / `auto`。
- **回答过程中输入框一直在**:可以接着打字,Enter 把这句话排进队列(灰色列在输入框上方)——普通的话在这批工具跑完时
插进这一问,模型下一步就能看到;命令等这一问结束再执行(`/status`、`/usage`、`/tasks`、`/effort`、`/think` 这类马上执行)。
光标在第一行时按 **↑** 把排着队的话全部取回来改。不想等了按 **Ctrl+X Ctrl+S** 立刻发送:框里的话也排进去,
打断这一问,排着队的话马上按顺序发出(同 Claude Code 的 send now)。
- **`/btw 问题`**:旁支问题——随口问一句(回答中、平时都行),不打断正在进行的回答。它看得到到目前为止的对话,
但不调工具、不进对话历史,答案显示在一个框里;之前问过的旁支问题会一起带上。
- **下一句建议**:每一问答完后,空的输入框里会用灰字给出一句你可能接着要说的话(比如回答最后问「要不要先做第一条」,
建议就是「好,先做第一条吧」),按 **Tab** 或 **→** 填进输入框,可以改了再 Enter 发;直接打字就消失。
没有明显的下一步时不给;计划模式里不给。每一问会多一次模型请求:主对话上一次请求读写过缓存时
(不管哪种协议,以实际用量为准),请求和主对话的前缀完全一样,几乎全部读缓存(实测 DeepSeek:读缓存 1.5 万、
新算不到 200 token);服务不缓存时只带最近 3 问压成的几千字,不随对话变长而变贵。每次用量记在日志里。
不想要就在配置的 `settings` 里写 `"prompt_suggestions": false`(或 `/config set settings.prompt_suggestions false`)。
- 回答中按 **ESC**(或 Ctrl+C)中断这一问:等模型时立刻断开(不会被当成网络抖动去重试),跑命令时连同子进程一起停掉;
框里没发的草稿留着,排着队的话接着发;不退出程序。确认框里用 ↑↓ / y / a / n 选,**ESC 等于拒绝**
(中文输入法开着时字母会被输入法截走,用 ↑↓ 加 Enter)。
- **ESC**:输入框里有字时**双击**清空;空输入框里**双击 ESC**(或 `/rewind`)选一问,对话与它改过的文件一起回到它之前,
那一问的原话放回输入框,改了重发。**Ctrl+C**:第一次清空输入框,空输入框里连按两次退出。清掉的草稿存进了历史,
按 ↑ 能找回。Ctrl+L 清屏。
- 要改文件时会显示红绿对比,回答 `y` 这次允许、`a` 本会话一直允许、`n` 拒绝。
- 斜杠命令:`/help` `/clear`(新会话)`/mode`(权限模式)`/provider`(服务商)`/model` `/compact`(压缩历史)
`/undo`(撤销上一问)`/todo`(任务清单)`/cost`(累计用量与金额)`/exit`。
- **`@路径`**:输入里写 `@src/app.py`,文件内容直接附上。**`!命令`**:自己直接跑命令(不经过模型),
输出会附在你下一句话里告诉模型。
- **撤销**:`/undo` 把上一问用 write_file / edit_file 改过的文件恢复原样(新建的删掉),对话也退回去。
**bash 命令造成的改动(删文件、git 操作、构建产物)无法撤销**。
- **花费**:在配置档里填 `price_in` / `price_out`(每百万 token 的价格,按服务商控制台填)和 `currency`,
`/cost` 就按金额显示。预设不带价格:各家常调价,写死容易显示错的数。
命中缓存的部分另算:`price_cache_read` / `price_cache_write`(每百万 token),不填按输入价的 0.1 倍 / 1.25 倍
(Anthropic 的定价)。走 OpenAI 协议的服务商(DeepSeek、通义、Kimi、OpenAI)大多也自动缓存,但折扣各不相同、
写入一般不另收钱,按控制台填上 `price_cache_read`、`price_cache_write` 填 0,金额才准。
- **读网页**(`web_fetch` 工具):除 `auto` 模式外都会先问你,网址完整显示——模型可能把代码内容拼进网址带出去。
- 回复按 Markdown 渲染(代码块、列表、表格),边生成边成形。
- **自动重试**:限流(429)、过载(529)、服务端错误、网络中断时自动重试,最多 4 次,界面上会提示。
- **自动压缩**:对话快撑满模型上下文(超过 80%)时,把旧历史总结成摘要继续干。上下文长度在配置档里用
`context_window` 设;不写就自动定:先向服务商查(Anthropic 官方的模型接口、OpenRouter 的模型列表;中转站一般查不到),
查不到按模型名推断(Claude、DeepSeek、Kimi、GLM、通义、OpenAI、Gemini、MiniMax 的常见型号,数字取自各家官方文档),
都不认识用 128K(ollama 预设 32K)。
`/status` 里写着长度是从哪来的;推断错了用 `/config set profiles.<服务商>.context_window 数字` 改,马上生效。
## 多开与配置隔离
可以同时开多个 heng-agent,互不干扰:
- **各实例独立**:`--provider`、`/provider`、`/mode`、「本会话一直允许」都只在各自进程的内存里;配置文件只读不写。
- **会话不会互相覆盖**:会话 id 带随机后缀,同一目录同一秒开两个也各写各的。
`heng-agent --sessions` 列出这个目录的全部会话,`--resume` 接最近的,`--resume ` 接指定的。
- **同一个文件别让两个实例同时改**:后写的会覆盖先写的(Claude Code 也一样)。多开时让它们处理不同的文件或目录。
配置分三层,后面的覆盖前面的:
| 层 | 位置 | 用途 |
|---|---|---|
| 内置预设 | 程序自带 | deepseek、kimi、glm… |
| 用户配置 | `~/.heng-agent/config.json` | 你的中转站、密钥、默认服务商 |
| 项目配置 | `项目根目录/.heng-agent/config.json` | 这个项目默认用哪个服务商、哪个模型 |
项目配置例子(项目 A 默认用 DeepSeek 的便宜模型,密钥仍在用户配置或环境变量里):
```json
{"default": "ds-fast", "profiles": {"ds-fast": {"preset": "deepseek", "model": "deepseek-flash"}}}
```
`preset` 也能引用用户配置里定义的配置档(比如带密钥的中转站),项目里只写要改的字段。
**项目配置里不许写 `api_key`**:项目目录可能被提交进仓库,写了会直接报错。
**完全独立的一套配置**(不同账号、不同客户):用环境变量 `HENG_AGENT_HOME` 或 `--home` 指到另一个目录,
配置、会话、输入历史都分开:
```bash
HENG_AGENT_HOME=~/.heng-agent-客户A heng-agent
```
## 技能、自定义命令、钩子
**技能**:某类任务的做法说明,模型用得上时自己去读。放在 `.heng-agent/skills/<名字>/SKILL.md`(项目)
或 `~/.heng-agent/skills/<名字>/SKILL.md`(所有项目通用),同名时项目的优先:
```markdown
---
name: test-style
description: 本项目写单元测试的规矩(新增或修改测试前必读)
---
- 每个测试方法第一行写中文 docstring,说明测的是什么
- 边界值至少测「刚好等于」和「差一点」
```
系统提示词里只列名字和 description,模型觉得对得上才读全文,所以装再多也不挤占上下文。技能目录里可以放模板、
清单等其他文件,模型按需读。`/skills` 查看已有技能。
**自定义命令**:把常用提示词存成 `.heng-agent/commands/<名字>.md`(或 `~/.heng-agent/commands/`),输入 `/名字 参数`
就展开发给模型。正文里的 `$ARGUMENTS` 换成参数,没写就把参数接在末尾。`-p "/名字 参数"` 同样可用。
内置命令(`/help`、`/undo`……)优先,同名的自定义命令不生效。
**钩子**:工具执行前后自动跑的命令,写在 `config.json`:
```json
{
"hooks": {
"pre_tool": [{"match": "bash", "command": "python scripts/check_cmd.py"}],
"post_tool": [{"match": "edit_file|write_file", "command": "ruff format \"$HENG_FILE\""}]
}
}
```
- `match` 按工具名正则匹配;环境变量 `HENG_TOOL`、`HENG_TOOL_INPUT`(参数 JSON)、`HENG_FILE`(改的是哪个文件)。
- `pre_tool` 退出码 **2** 拦下这次调用,输出作为原因告诉模型;`post_tool` 的输出附在结果后面给模型
(格式化改了什么、检查报了什么错)。
- 另有三个不针对工具的事件(`match` 可省,环境变量 `HENG_PROMPT` 是用户这句话 / 模型最后的回复):
- `user_prompt_submit`:消息发给模型前跑。输出作为补充上下文附在消息后面(如当前分支、最近的报错);
退出码 **2** 拦下这条消息不发(如防止把密钥发出去)。
- `stop`:模型准备停下时跑。退出码 **2** 要求模型继续,输出交给模型(如「测试还没过,接着修」),最多连续 3 次。
- `session_start`:启动时跑,输出附进系统提示词(如注入项目当前状态)。
- **项目里的钩子要你确认信任才会运行**:克隆来的仓库可能带着恶意钩子。交互模式第一次遇到会把命令完整列出来问你;
钩子内容一改就要重新确认;`-p` 模式下没信任过的项目钩子直接跳过。用户目录里的钩子是你自己写的,直接生效。
## 子智能体、图片、MCP
**子智能体**(`task` 工具):模型可以把调研 / 探索类的事交给子智能体去做(在大项目里找相关代码、梳理调用关系……),
子智能体独立搜索阅读,只把结论带回来,主对话不会被中间过程挤满。同一轮发出多个会**并行执行**(最多 4 个)。
子智能体**只读**(读文件、找文件、搜内容),不能改文件、跑命令,也不能再派子智能体;要改代码由主智能体来做。
- **后台子智能体**:模型可以把不急着用结论的调研放到后台(`run_in_background`),派出去马上接着干别的。
它做完时:主智能体正在回答,就在这批工具跑完时把结论插进去;空闲,就自动发起一问把结论交给它
(显示成一行「◆ 后台子智能体 #1「…」做完了」,框里敲了一半的字留着)。主对话按 ESC 不会把后台的停掉。
- **子智能体面板**:有子智能体在跑时,状态栏下面列出 `● main` 和每个子智能体(任务、用时、token、是否后台)。
在输入框最后一行按 **↓** 选中,**Enter** 看它到现在为止读了哪些、搜了什么、写了什么,**ESC** 返回输入框。
**图片**:输入里 `@截图.png` 就把图片附上(png / jpg / gif / webp,单张 ≤ 5 MB)。**能不能看图取决于模型**:
Claude、GPT 等支持;DeepSeek 等纯文本模型不支持。
**MCP**:接入外部工具服务,在 `config.json` 里配置。两种连接方式:`command` 启动一个程序(stdio),
`url` 连一个已经在跑的服务(http,即 MCP 的 Streamable HTTP):
```json
{
"mcp_servers": {
"sigil": {"command": "sigil-mcp", "args": ["--stdio"], "env": {"FOO": "bar"}, "timeout": 60},
"ai-workstation": {"url": "https://ai-workstation-mcp.agilefr.com/mcp", "headers": {"Authorization": "Bearer 令牌"}}
}
}
```
- 也认 `mcpServers` 这个写法(Claude Code、Kimi 用的),它们的配置可以直接贴过来。老式 SSE 传输不支持。
- 启动时每个服务一行:`MCP server "aicoder" connected · 90 tools (stdio)`,连不上的红色显示原因。
- **工具多时按需加载**:接几个大服务很容易上百个工具(实测 6 个常用服务 361 个、声明约 10 万 token),每次请求都带上
会占掉一半上下文、每问都花这么多钱。所以 MCP 工具声明超过上下文的 10% 时,先不发声明,只给模型一个 `tool_search`:
它按关键词搜,搜到的工具立即加载、下一步就能调用(实测每次请求从约 10 万 token 降到约 3 千)。
配置 `settings.mcp_tool_search`:`auto`(默认)/ `on` / `off`。
- 工具注册成 `mcp__服务名__工具名`;`/mcp` 查看已接入的工具。
- 外部工具可能写数据库、发消息,**除 `auto` 模式外调用前都会问你**(`plan` 模式也一样)。
- **项目里配置的 MCP 服务要你确认信任才会启动**,和钩子一样:配置一改(包括换了 url)就要重新确认,`-p` 模式下没信任过的直接跳过。
- 启动失败的服务跳过并提示,不影响其他服务;退出时关掉 stdio 服务的进程、结束 http 服务的会话。
## 项目记忆
在项目根目录放一个 `HENG.md`,写上项目规矩(技术栈、命名约定、提交规范……),每次启动自动读入。
所有项目通用的写在 `~/.heng-agent/HENG.md`。
## 故障排查
先在 heng-agent 里运行 `/doctor`,一项项看是哪一环出了问题;要反馈问题就运行 `/doctor copy`,把复制下来的内容贴上。
运行日志在数据目录的 `logs/heng-agent.log`(正式版 `~/.heng-agent/logs/`,开发版 `~/.heng-agent-dev/logs/`)。
| 现象 | 原因与处理 |
|---|---|
| 敲 `heng-agent` 提示找不到命令 | 安装时改了 PATH,要**重开一个终端**才生效;还不行就运行 `uv tool update-shell` 再重开 |
| 一启动就报 `ModuleNotFoundError: heng_agent` | 多半是 Windows 上 heng-agent 开着时升级 / 重装:文件被占用,装到一半失败。关掉所有 heng-agent 窗口,重新运行一键安装命令 |
| `heng-agent upgrade` 说已是最新,但刚发了新版本 | uv 缓存了旧的版本列表(0.3.2 起升级时会刷新)。旧版本手动运行 `uv tool install --force --upgrade --refresh-package heng-agent heng-agent` |
| 连不上服务商 | 看 `/doctor` 的「服务商连接」与「代理」两行:地址、密钥、请求实际走的代理。要单独指定或不走代理,见上文「代理」 |
| 中转站报 401 | 配置档里试试改 `auth`:`bearer` 或 `x-api-key` |
| Shift+Enter 不能换行 | Windows Terminal 里运行 `/terminal-setup`;任何终端里 Ctrl+J、Alt+Enter 都能换行 |
| 配了 MCP 服务,有的连不上 | 欢迎页与 `/mcp` 会列出原因;改好后 `/mcp reconnect 服务名`,不用重启 |
| 出现「内部错误」 | 程序的 bug:这一问作废、会话照常。运行 `/doctor copy` 反馈给我们 |
## 开发
```bash
uv venv --python D:/software/dev/python/python.exe .venv
uv pip install --python .venv/Scripts/python.exe -e ".[dev]"
PYTHONIOENCODING=utf-8 .venv/Scripts/python.exe -m pytest -q
```
设计见 `docs/design/00-总体设计.md`,开发约定见 `CLAUDE.md`。