mx-cli · git:20261020.e20c3c8 · 2026-10-20 · sha256 44dea2d97345ef62

mx-cli git:20261020.e20c3c8B

Immutable. This exact content never changes and is served at /api/v1/blob/44dea2d97345ef62.

---
name: mx-cli
description: modelmux 的 mx CLI 使用手册。用户要运行/查询/配置 mx(启动、重启、状态、模型、登录、账号池、额度、日志、Web 控制台、path),或不确定动词与渠道参数的顺序、该用 mx model list 还是 mx model <cid>、login 与 relogin 的区别时使用。也用于避免写出 mx <cid> <动词> 这种错误语序。
---

# mx CLI 使用

`mx` 是 modelmux 的仓库级 CLI。所有命令走同一个本地网关(默认 `127.0.0.1:4412`),对外是 OpenAI 兼容端点 `http://127.0.0.1:4412/v1`。

## 0. 语法铁律

```text
mx <动词> [<cid>] [参数]
```

- 动词永远在第一位,渠道 id 在第二位:`mx login catpaw`、`mx status catpaw`。
- 不要写 `mx catpaw status`:渠道名与动词共享位置会产生二义,补全器也无法工作。
- 仓库级动词(`start` / `stop` / `restart` / `web`)不带 cid;
  `status` / `model` / `bill` / `acct` / `path` / `login` / `relogin` 都可以带 cid ——
  `mx status <cid>` 才是「某渠道的状态」。
  `log` 也可以带 cid,但只有配 `--kind channel` 才有区别(渠道维度日志按 cid 分目录):
  `mx log catpaw --kind channel`。
- 命令组同样是动词在前:`mx model list` / `mx model usage`。
- 不确定时先 `mx --help`;脚本里加 `--json`。

## 1. 一页命令表

| 目标 | 命令 |
| --- | --- |
| 起网关(幂等) | `mx start` |
| 停网关 | `mx stop` |
| 重启 | `mx restart` |
| 网关 / 渠道状态 | `mx status` / `mx status <cid>` / `mx status --json` |
| 全池模型视图(有哪些模型) | `mx model list` |
| 池账本(各渠道用得怎么样) | `mx model usage` / `mx model usage --refresh` |
| 某渠道模型 | `mx model <cid>` / `mx model <cid> --refresh` |
| 登录 | `mx login <cid>`;`mx login list` |
| 强制重新授权 | `mx relogin <cid>`(**会清掉现有凭据**,别当成刷新用) |
| 账号池 | `mx acct [<cid>] list\|use <key>\|add\|remove <key>` |
| 额度 / 账单 | `mx bill [<cid>]` |
| 存储落点 | `mx path [<cid>]` / `mx path --all` |
| 日志 | `mx log ...`(排查流程见 log-triage 技能) |
| Web 控制台 | `mx web`(确保网关在跑并打开 `/web/`) |

> **`credentials.json` 不见了但账号池里还有货**:先 `mx acct <cid> list` 看池子
> (有些渠道的凭据只存池里,主文件缺失时 `status` 会显示「未登录」)。
> 池里有状态正常的账号就 `mx acct <cid> use <key>` —— 它会把池里那份复制回主凭据文件,
> **不用重新走浏览器授权**。2026-10-20 用这招恢复了 qodercn 与 workbuddyai。

## 2. 常用工作流

### 2.1 启动 / 重启并确认生效

```bash
mx start            # 幂等:已在跑直接返回
mx restart          # 改完代码或配置后
mx status --json    # reachable=true 且 stale_build=false
```

改了 `packages/**` 后必须先 `npm run build` 再 `mx restart`;只 restart 不 build,
运行的是旧代码,`status` 会报 `stale_build=true`。此时不要宣称修复已生效。

### 2.2 看模型:两个命令别混

```bash
mx model list                 # 池视图:有哪些模型(按渠道分组,渠道级账本状态只出现一次)
mx model usage                # 池账本:各渠道用得怎么样(每渠道一行)
mx model catpaw              # 渠道视角:catpaw 目录里的模型(读本地缓存)
mx model catpaw --refresh    # 强制重拉上游目录(失败即报错)
curl -s http://127.0.0.1:4412/v1/models   # 客户端实际看到的 id
```

对外 id 恒为 `<cid>/<model>`(如 `catpaw/deepseek-v4.1-flash`);裸模型名会被网关 400。

### 2.3 登录与账号池

```bash
mx login list                 # 可登录渠道
mx login catpaw               # 已有凭据时幂等,不会重新授权
mx relogin catpaw             # 清掉旧凭据后重新授权(token 过期/换号)
mx acct catpaw             # 账号池 + 当前生效账号
mx acct catpaw use <key>   # 切换生效账号
mx acct catpaw add         # 走该渠道登录流程并加入池
mx acct catpaw remove <key>    # 生效账号=同时登出;非必要不要删
```

凭据一律保留;连续失败只会标记 error 并跳过,不会自动删除。
不要手工删 `~/.modelmux/**/credentials.json`。

### 2.4 额度与账本

```bash
mx bill                     # 全部渠道的额度/账单(只读,不经网关)
mx bill catpaw              # 单渠道
mx model usage              # 池账本(各渠道用得怎么样:请求成败、已用量、冷却)
mx model usage --refresh    # 立刻重查各渠道账单
```

`mx bill` 是上游额度;`mx model usage` 是本地池账本,两者不是一回事。
两个视图都**不决定路由** —— 渠道由池 id 前缀(`<cid>/<模型>`)指定,账本只作健康度观察。

### 2.5 日志与 Web

```bash
mx log --list
mx log --kind access --outcome failure --lines 50
mx log --kind lifecycle --lines 30
mx web                        # 确保网关在跑 -> 打开 http://127.0.0.1:4412/web/
```

排查「为什么慢 / 为什么失败 / 网关挂了」时加载 `log-triage` 技能,
不要在本技能里重复展开日志字段与错误码。

## 3. 参数与坑

- `--json`:输出结构化结果,脚本优先;`--quiet` 少过程信息。
- `--refresh`:`model <cid>` 重拉目录;`model usage` 重查账单;失败即非零退出。
- `--wait <秒>`:启动健康等待(默认 30);`--strict` 让启动失败非零退出。
- `--realm`:登录域(渠道自定义);`--wechat`:微信扫码(仅声明支持的渠道,如 loomy)。
- `--addr` / `--ui-port`:覆盖监听地址;默认 `127.0.0.1:4412`,改端口后客户端 base URL 要同步。
- `mx log` 默认是 system 日志;查请求必须加 `--kind access`。
- 不要在网关有活跃流时随手 `mx restart`,会切断客户端请求。
- 所有 `mx` 命令都是本地操作,不需要管理员权限(端口被系统占用除外)。

## 4. 输出约定

- 先给可直接执行的命令,再解释一句;不要贴大段帮助文本。
- 需要判断结果时给判定字段:`reachable`、`stale_build`、`status`、`exit code`。
- 涉及敏感信息时不回显 token / cookie;`mx bill` 只展示额度数字。