# Reasonix 使用指南
README
·
English
·
规格
> 日常配置与使用。工程契约与内部实现(数据类型、registry、包结构、路线图)见
> **[规格 SPEC.md](./SPEC.md)**。
## 目录
- [配置](#配置)
- [CLI 命令参考](./CLI.zh-CN.md)
- [环境变量](#环境变量)
- [Serve Web 前端](#serve-web-前端)
- [配置路径](./CONFIG_PATHS.zh-CN.md)
- [思考语言](./REASONING_LANGUAGE.zh-CN.md)
- [任务合约与暂停策略](./TASK_CONTRACT.zh-CN.md)
- [自定义 OpenAI-compatible provider](#自定义-openai-compatible-provider)
- [桌面端 Hooks](./DESKTOP_HOOKS.zh-CN.md)
- [快捷键](#快捷键)
- [权限与沙盒](#权限与沙盒)
- [能力诊断](#能力诊断)
- [插件(MCP)](#插件mcp)
- [斜杠命令](#斜杠命令)
- [@ 引用](#-引用)
- [双模型协同](#双模型协同)
## 配置
优先级:**flag > `./reasonix.toml` > 用户配置文件 > 内置默认值**。从
**Reasonix v1.8.1** 开始,用户配置位于 macOS/Linux 的
`~/.reasonix/config.toml`,Windows 为 `%AppData%\reasonix\config.toml`;迁移和相关数据路径见
[配置路径](./CONFIG_PATHS.zh-CN.md)。标注为“仅用户/全局”的字段(包括 agent 轮数上限)不会被 `./reasonix.toml` 覆盖。
Provider 通过 `api_key_env` 命名密钥,真实密钥值保存在 CLI 与桌面端共用的
Reasonix 全局 `/.env`。项目 `.env`、home `.env`、继承的 shell 环境变量、旧 credentials 和系统 keyring 都不再作为 provider key 的运行时 fallback;旧凭据只作为迁移来源读取。项目 `.env` 仍会作为当前 workspace 范围内的 MCP/plugin 非 provider `${VAR}` 展开来源,但不会导入 provider key 或 Reasonix 控制变量。全局 `config.toml` 和 `.env` 的完整结构见
[配置路径](./CONFIG_PATHS.zh-CN.md)。
桌面端和 CLI 端的可见思考语言设置,见 [思考语言](./REASONING_LANGUAGE.zh-CN.md)。
桌面端 Hooks 的 JSON 配置、事件 key 和 payload 字段,见 [桌面端 Hooks](./DESKTOP_HOOKS.zh-CN.md)。
`SessionStart` hook 可通过 stdout 或 `hookSpecificOutput.additionalContext` 把插件/工作流 bootstrap 内容一次性注入下一轮真实用户输入上下文,而不是写入稳定 system prompt。
插件包可通过 `hooks/session-start-codex` 或插件根目录 `CLAUDE.md` 提供该启动上下文;Claude 风格 `.claude/settings.json` command hooks 也会按同名事件映射到 Reasonix hooks。
```toml
default_model = "deepseek-flash" # 执行器;设 [agent].planner_model 可加规划器
# language = "zh" # 界面语言;为空则按 $LANG / $REASONIX_LANG 自动检测
[ui]
# shortcut_layout = "desktop" # classic|desktop;兼容旧配置
# cursor_shape = "bar" # block|underline|bar;CLI/TUI 输入光标
[agent]
reasoning_language = "auto" # 可见思考过程语言:auto|zh|en
# plan_mode_allowed_tools = ["mcp__legacy__reader"] # 旧 MCP 只读信任别名;不改变 Plan 可用性
# plan_mode_read_only_commands = ["gh issue view"] # 仅兼容旧配置;Plan bash 现由 Permissions 决定
# planner_model = "deepseek-pro" # 可选的低频规划器
# subagent_model = "deepseek-pro" # runAs=subagent skill 的默认模型
# subagent_models = { review = "deepseek-pro", security_review = "deepseek-pro" }
# max_subagent_depth = 2 # 子代理嵌套委派深度;设为 1 可恢复旧的单层边界
auto_plan = "off" # 仅用户级生效;off|on;off 表示计划模式仅手动开启
# auto_plan_classifier = "deepseek-flash" # 可选;只在边界任务上调用
tool_result_snip_ratio = 0.6 # 在摘要 compaction 前先缩短旧工具输出
[[providers]]
name = "deepseek-flash"
kind = "openai"
base_url = "https://api.deepseek.com"
model = "deepseek-v4-flash"
api_key_env = "DEEPSEEK_API_KEY"
# 还有预设:deepseek-pro
[tools]
enabled = [] # 省略/为空 = 全部内置工具
bash_timeout_seconds = 120 # 前台安全上限;设为 0 表示不设工具层超时
mcp_call_timeout_seconds = 300 # MCP 调用默认安全上限;可用 plugin/tool 覆盖
[environment]
enabled = true # 启动时把 OS、shell 和常见工具摘要稳定注入 prompt
# [environment.tools]
# go = "/opt/homebrew/bin/go" # 可选:显式可信路径;workspace 内路径不会在启动时自动执行
[skills]
# paths = ["~/my-skills", "../shared/skills"] # 额外的自定义技能目录
# excluded_paths = ["~/.agents/skills"] # 隐藏约定来源,不删除目录
# disabled_skills = ["review"] # 隐藏技能,直到 /skill enable
[permissions]
mode = "ask" # 无规则命中时 writer 的兜底:ask|allow|deny
deny = ["Bash(rm -rf*)", "Bash(git push*)"] # 任何模式下都硬阻断
allow = ["Bash(go test:*)"] # 从不询问
[sandbox]
# workspace_root = "" # 文件写工具被限制在此目录;留空 = 当前目录
# allow_write = ["/tmp"] # write_file/edit_file/multi_edit/move_file 额外可写的目录
# forbid_read = ["${HOME}/.ssh"] # agent 不可读取或列出的路径
[serve]
auth_mode = "none" # none|token|password;绑定到非 localhost 前请先开启认证
# token = "" # 可选固定 token;token 模式为空时启动时自动生成
# password_hash = "" # 用 reasonix serve --hash-password --password '...' 生成
# behind_proxy = false # 只在可信反向代理后方设为 true
[[plugins]]
name = "example"
command = "reasonix-plugin-example"
call_timeout_seconds = 600 # 可选:单个 MCP server 的调用超时
tool_timeout_seconds = { "generate_video" = 1800 } # 可选:raw MCP tool 名称
```
完整 schema 与每个字段的契约见 [`SPEC.md` §5](./SPEC.md#5-configuration-toml)。
旧字段 `[agent].plan_mode_allowed_tools` 仍会被解析并重新渲染。具体的
`mcp____` 条目继续充当本地只读信任别名,但推荐把已审计的 raw MCP reader
名称写到对应 server 的 `trusted_read_only_tools`。这个字段不会放行或阻断主 Plan 工作流中的调用。
`[agent].plan_mode_read_only_commands` 也继续参与配置 round-trip,但主 Plan 工作流不再维护独立的
bash allowlist 或信任提示。Plan 与常规模式使用相同的 Permissions 规则做 bash 分类和审批;Sandbox
仍是文件系统、进程和网络的强制边界。独立 planner 和显式只读 subagent runner 继续使用自己的严格
只读工具 registry 与前台命令分类器。
### 环境变量
多数日常设置应写在 `config.toml` 或前文提到的 Reasonix 全局 `.env` 中。下面这些变量是进程级高级开关;
需要在启动 Reasonix 之前设置。项目 `.env` 不是 Reasonix 控制变量的运行时来源。
## Serve Web 前端
`reasonix serve` 会用同一个本地 Reasonix 引擎启动浏览器 UI。适合不安装桌面端但想用可视化界面、
在远程开发机上通过 tunnel 使用,或把当前会话临时共享给浏览器查看的场景。
```bash
cd your-project
reasonix serve
# 打开 http://127.0.0.1:8787
```
默认监听 `127.0.0.1:8787`,认证模式是 `auth_mode = "none"`。这个默认值只适合本机使用。
如果要绑定到非 loopback 地址、通过 tunnel 暴露,或放到反向代理后面,请先开启认证再分享 URL:
```bash
reasonix serve --auth token
reasonix serve --addr 0.0.0.0:8787 --auth token
reasonix serve --auth password --password 'temporary-password'
```
Token 模式会在终端打印带 `?token=...` 的分享链接;可通过 `--token` 或 `[serve].token`
复用固定 token。Password 模式必须在启动时传 `--password`,或在配置里保存 bcrypt hash:
```bash
reasonix serve --hash-password --password 'strong-password'
# /config.toml
[serve]
auth_mode = "password" # none|token|password
password_hash = "$2a$12$..."
behind_proxy = true # 仅可信反向代理后方使用
```
Web UI 提供聊天、工具审批、会话历史、rewind/fork/summarize、模型与 reasoning effort 控件、
Goal、由 `todo_write` 工具驱动的实时 Todo 面板,以及已配置 provider 的余额显示。临时启动可用
`--model`、`--max-steps` 或 `--resume`;不传 `--model` 时,`serve` 使用用户全局
`default_model`。
## 通过 ACP 接入编辑器
`reasonix acp` 向 ACP 编辑器客户端公开三条彼此独立的会话轴:
- `modes`:`normal`、`plan`、`goal`。选择 Goal 后,下一条用户输入会成为活动目标,
并启动 Reasonix 现有的 Goal 持续推进循环。
- `work_mode`:`economy`、`balanced`、`delivery`。切换时会原子重建 Controller,
同时保留历史、协作方式和工具权限。`reasonix acp --profile ...` 仍可设置启动默认值。
- `tool_approval`:`ask`、`auto`、`yolo`。切换权限不会重建 Controller,也不会改变
协作方式或工作模式。
模型和推理强度仍是独立的 ACP 配置项。Reasonix 会按 ACP 会话持久化这三条轴;旧会话元数据
缺少新字段时,工作模式继承 ACP 进程的启动 profile(未传 `--profile` 时为均衡),权限和
协作方式使用“询问 + 常规”。为兼容旧版混合 mode 列表,`session/set_mode` 仍接受
`default`(常规 + 询问)和 `auto`(常规 + Yolo),新客户端应使用拆分后的独立选择器。
## 自定义 OpenAI-compatible provider
在桌面端打开 **设置 -> 模型 -> 接入 -> 添加模型服务 -> 自定义供应商**,用于接入代理、
聚合平台或自建 OpenAI-compatible chat API / Anthropic-compatible Messages API 服务。
常用服务优先使用 **添加模型服务 -> 推荐预设**。Reasonix 可以预填可编辑的自定义 provider:
Kimi CN、Kimi Global、Kimi Coding Plan、MiMo API、MiMo Anthropic、MiMo Token Plan
CN/SGP/AMS 及其 Anthropic-compatible 变体、MiniMax CN/Global API、MiniMax
CN/Global Anthropic、GLM CN、Z.AI Global、GLM/Z.AI Coding Plan 的
OpenAI-compatible 与 Anthropic-compatible 端点、OpenCode Go、OpenCode Go
Anthropic、OpenCode Zen Anthropic、Qwen/DashScope CN/Global、Qwen Coding Plan
CN/Global 的 OpenAI-compatible 与 Anthropic-compatible 端点、StepFun
OpenAI-compatible 与 Anthropic-compatible 端点、NovitaAI、GMI Cloud、Vercel AI
Gateway、HuggingFace Router、NVIDIA NIM、KiloCode 和 Ollama Cloud。Plan 表示
访问/付费形态;只有服务商确实提供不同区域端点时,预设名才同时带 CN/Global。
因此 Kimi Coding Plan 是独立 plan 端点,Kimi 直连 API 才拆成 CN 和 Global。
预设路径通常只需要填写服务商 API Key:真实 key 会写入 Reasonix home `.env`,
`config.toml` 只保存端点、模型列表、key 环境变量名、上下文窗口、视觉模型元数据、
中国区端点直连、MiniMax `reasoning_split`、GLM/MiniMax thinking heuristic、
Anthropic-compatible 网关需要的 Bearer 认证、Ollama Cloud max-effort 支持,
以及 OpenCode Go 的每模型 reasoning 覆盖。添加后仍然可以打开 provider 卡片,
继续修改模型、请求头、端点或兼容设置。
**API 地址** 填写服务端点。默认模式下,Reasonix 会预览并把聊天请求发送到:
```text
/chat/completions
```
如果服务商给的是完整请求 URL,例如 `https://gateway.example.com/v1/chat/completions`,
开启 **完整 URL**。开启后 Reasonix 会直接使用该地址,不再追加 `/chat/completions`。
输入框下方的预览就是最终请求地址。
模型发现会基于 API 地址尝试 `/models`、`/v1/models` 等候选地址。如果网关要求单独的
模型列表端点,在 **兼容设置** 中填写 `models_url`,例如
`https://gateway.example.com/v1/models`。如果接口不支持模型发现,也可以手动填写模型列表。
**完整 URL** 仍使用 OpenAI-compatible chat 请求体;它不会切换成 OpenAI Responses API
的请求 schema。
### 兼容设置
**兼容设置(通常不用改)** 用于处理认证变量、模型发现地址、请求头、以及 reasoning/thinking
请求格式和普通 OpenAI-compatible 默认行为不一致的网关。除非服务商文档明确要求,或代理报错说明
不兼容,否则保持默认值即可。Kimi Coding Plan、MiniMax CN/Global Anthropic 这类 Anthropic-compatible 服务,
保存前在基础区域把接入协议切到 **Anthropic-compatible**。
| 字段 | 作用 | 什么时候改 |
| --- | --- | --- |
| `api_key_env` | 该 provider 使用的 API key 环境变量名。桌面端保存的真实 key 会写入 Reasonix home `.env` 的同名变量;TOML 配置里只保存变量名。 | 多个 provider 需要不同 key 时改名;服务不需要 API key 时可以留空。 |
| `models_url` | 只用于自动发现模型列表的 URL。聊天请求仍使用上方的 API 地址或完整 URL。 | `/models` 或 `/v1/models` 不是该网关模型列表地址时填写。 |
| 额外请求头 | 静态 HTTP header,一行一个 `Header: value`。 | OpenRouter 等网关要求 `HTTP-Referer`、`X-Title` 或类似站点来源 header 时使用。API key 仍放在上方密钥字段,不要重复写到这里。 |
| 额外请求体 | 合并到聊天请求体顶层的 JSON 对象。 | 仅用于服务商专用开关,例如 `{"enable_thinking": true}`。`model`、`messages`、`tools`、`stream`、`thinking` 等核心字段仍由 Reasonix 控制,且不接受 `null` 值。 |
| Authorization: Bearer | 对 Anthropic-compatible provider,把已保存的 API key 用 `Authorization: Bearer ` 发送,而不是 `x-api-key`。 | MiniMax Global、Vercel AI Gateway 等网关文档明确要求 Bearer 认证时开启。 |
| 模型能力模式 | 指定 Reasonix 对该 provider 使用哪种 reasoning 请求协议。 | 默认用“自动识别”。只有网关被误判,或模型文档要求特定 reasoning 格式时再切换。 |
| Thinking 覆盖 | provider 专用的 `thinking.type` 覆盖项。 | 默认用 Auto。只有后端文档明确支持 `enabled`、`disabled` 或 `adaptive` 时再手动指定;不支持的值可能让中转站拒绝请求。 |
| 余额查询 URL | 可选的钱包余额查询接口。 | 服务商提供余额接口,且希望桌面端状态栏显示余额时填写。 |
| 上下文窗口 | 该 provider 可保留的最大上下文 token 数。`0` 表示使用模型服务默认值。 | 模型实际上下文大小和 Reasonix 默认值或内置元数据不一致时填写。 |
模型能力模式选项:
| 选项 | 作用 |
| --- | --- |
| 自动识别(推荐) | Reasonix 根据模型能力元数据和端点自动选择请求格式。 |
| DeepSeek 思考 | 使用 DeepSeek 风格的 thinking 控制,包括 `thinking.type` 和 DeepSeek 支持的推理深度。 |
| OpenAI reasoning | 使用标准 OpenAI-compatible 的 `reasoning_effort` 档位。 |
| 普通聊天(不发送思考参数) | 不发送 reasoning 或 thinking 控制字段。适合会拒绝 reasoning 参数的普通文本代理。 |
Thinking 覆盖选项:
| 选项 | 作用 |
| --- | --- |
| Auto(使用服务默认) | 不写 provider 级 `thinking` 覆盖,让 Reasonix 使用 provider/model 默认行为。 |
| Enabled(开启) | 对兼容 provider 发送 `thinking.type = "enabled"`。 |
| Disabled(关闭) | 对兼容 provider 发送 `thinking.type = "disabled"`。DeepSeek 风格 provider 下还会避免继续发送推理深度提示。 |
| Adaptive(自适应) | 仅在服务文档明确支持 adaptive thinking 时使用,例如 MiniMax-M3 风格端点;语义是发送或保留 `thinking.type = "adaptive"`。 |
## 快捷键
这里按使用端来写,因为用户通常是先知道“我现在在桌面端/CLI”,再找对应按键。
桌面端仍用 `Shift+Tab` 切换 Plan;CLI 则用它在 Ask、Auto、Plan 之间循环。
`Ctrl/Cmd+Y` 只管 YOLO。桌面端粘贴继续走系统快捷键;CLI 则把终端原生文本粘贴
和应用接管的图片粘贴拆成不同快捷键。
`[ui].shortcut_layout` 仍被接受以兼容旧配置,但下面的快捷键行为已经跨布局统一。
CLI/TUI 文本输入可通过 `[ui].cursor_shape` 设置光标形状,支持 `underline`、`block`
和 `bar`。默认值是 `bar`:位置清晰,同时不会在中英混排输入时覆盖 CJK 双宽字符。
想使用传统终端块状光标可设为 `block`,偏好更弱的下划线光标可设为 `underline`。
该设置不影响桌面端或 Web 输入框。
### 桌面端 GUI
桌面端快捷键在 **设置 → 快捷键** 中管理。选择一行后按下新的组合键,Reasonix 会为桌面端保存该绑定。
如果新组合键和已有动作冲突,会拒绝保存,避免一个快捷键触发两个动作。按 `?` 或点击 topic bar
里的帮助按钮可打开快捷键帮助表;帮助表由同一份快捷键 registry 生成,因此会同步显示自定义后的绑定。
全局快捷键:
| 按键或控件 | 作用 | 说明 |
| --- | --- | --- |
| macOS `Cmd+K`,Windows/Linux `Ctrl+K` | 打开或关闭命令面板 | 打开时会聚焦搜索框;`Esc` 关闭命令面板。 |
| macOS `Cmd+,`,Windows/Linux `Ctrl+,` | 打开设置 | 在设置里的 **快捷键** 页可自定义桌面端绑定。 |
| macOS `Cmd+W`,Windows/Linux `Ctrl+W` | 关闭当前顶部标签页 | 最后一个标签页仍由原有关闭保护保留。 |
| `Cmd+B` / `Ctrl+B` | 显示或隐藏左侧边栏 | 和点击侧边栏开关是同一个动作。 |
| `Cmd+Shift+B` / `Ctrl+Shift+B` | 展开或收起最近的 shell 输出 | 和点击折叠 shell 输出提示是同一个动作。 |
| macOS `Cmd+1`-`Cmd+9`,其它平台 `Ctrl+1`-`Ctrl+9` | 跳转到侧边栏中对应编号的可见对话 | 短暂按住 `Cmd`/`Ctrl` 会显示编号标记;已有自定义快捷键占用相同按键时,自定义动作优先生效。 |
| macOS `Cmd++`、`Cmd+-`、`Cmd+0`;其它平台 `Ctrl++`、`Ctrl+-`、`Ctrl+0` | 放大、缩小或重置文字大小 | 对把加号上报为 `=` 的键盘也兼容。 |
| `?` | 打开键盘快捷键帮助表 | 帮助表显示当前实际生效的桌面端绑定。 |
输入框快捷键:
| 按键或控件 | 作用 | 说明 |
| --- | --- | --- |
| `Enter` | 发送当前消息 | IME 组合输入确认不会被截获。 |
| `Shift+Enter` | 插入换行 | 输入框保持焦点。 |
| `Shift+Tab` | 切换 Plan 开/关 | Plan 只改变“先规划”的工作流;内置 writer 仍走当前 Ask/Auto/YOLO 与 Sandbox,MCP writer/destructive 目标在整个规划阶段保持硬阻断。 |
| `Cmd+Y` / `Ctrl+Y` | 切换 YOLO 开/关 | 关闭 YOLO 时会尽量恢复之前的 Ask/Auto 基底。 |
| macOS `Cmd+V`,Windows/Linux `Ctrl+V` | 粘贴剪贴板内容 | 剪贴板图片会作为附件加入;图片也可以拖进输入框。 |
| 输入边界处的普通 `Up` / `Down` | 回放更旧或更新的已提交提示词 | 带修饰键的方向键和原生文本导航仍交给 textarea。 |
| 运行中按 `Esc` | 取消当前 turn | 如果后端尚未开始回复,会恢复草稿。 |
菜单与控件:
| 按键或控件 | 作用 | 说明 |
| --- | --- | --- |
| 斜杠、`@` 或 past-chat 菜单中的 `Up` / `Down` | 移动高亮项 | past-chat 搜索框使用同一套导航键。 |
| 这些菜单中的 `Enter` / `Tab` | 接受高亮项 | 类似目录的条目可能继续打开下一层菜单。 |
| 这些菜单中的 `Esc` | 关闭当前菜单或退出 past-chat 搜索 | 关闭后可继续正常输入。 |
| Ask / Auto / YOLO 审批控件 | 直接选择工具审批姿态 | 点击操作不受快捷键规则影响。 |
| 工具审批卡片 | `Left` / `Right`、`Enter`、`1`-`4`、`Esc` | 移动高亮动作、确认当前高亮、直接选择编号动作,或拒绝。默认高亮是“允许一次”。 |
| 计划审批卡片 | `Left` / `Right`、`Enter`、`1`-`3`、`Esc` | 在“修改计划 / 开始执行 / 退出计划”之间移动。默认高亮是“开始执行”。 |
| Plan 控件 | 切换 Plan 开/关 | 和 `Shift+Tab` 是同一个模式。 |
| 协作菜单里的 Goal | 启动、查看或清除 Goal | Goal 不进入任何快捷键循环。 |
### CLI / TUI
输入框上下边线使用当前主题强调色,默认光标为细竖线。长草稿会增长到可用的最大高度;
超过后,在输入框内滚轮只滚动草稿视图,不移动插入光标,在 transcript 区域滚轮仍滚动
对话。使用 `/theme auto|light|dark` 选择背景模式,也可运行不带参数的 `/theme` 查看
命名配色,再用 `/theme