跳转至

SOP:token_proxy 新增小米 MiMo 模型路由(mi-model-20260924)

主机:192.168.31.250(用户 rain)| 工程:/home/rain/Documents/services/token_proxy 性质:C 类变更(改配置 + 重启服务)| 执行日期:2026-09-24

1. 背景

用户已对接小米模型(https://api.xiaomimimo.com/v1,模型 mimo-v2.6-flash),要求 token 代理新增该上游,使 Trae 经代理请求小米模型时能记账并计入成本报表。执行前已用测试 key 实测确认小米 usage 字段格式(见第 6 章),无需改任何代码。

2. 目标(可验证状态)

  • /healthz 返回 routes 含 mi;
  • Trae 经 http://192.168.31.250:8788/mi 发起的请求产生 route=mi 的 usage.jsonl 记录,缓存命中/未命中明细非空;
  • cost_report.py 能取到 mimo-v2.6-flash 的价(成本非 0)。

3. 前置条件

# 条件 校验
1 服务当前 active 且配置可解析 systemctl --user is-active token-proxy
2 小米上游连通 实测已通过(2026-09-24 两条最小请求成功)
3 备份已生成 ls mi-model-20260924/backup/

4. 影响范围

  • 单主机 192.168.31.250,仅改 config.yaml 一个文件;
  • 需重启服务:systemctl --user restart token-proxy,会打断在途流式回答(执行时无在跑会话);
  • 既有 /ds、/glm 路由与三个不可再生数据文件(usage.jsonl / balance_history.jsonl / req_shape.jsonl)不受影响。

5. 分步操作

以下为与实现等价的操作序列(本次为手工编辑,无独立实现文件,以 config.yaml 现状为准):

cd /home/rain/Documents/services/token_proxy
# 1) 备份(高危前置:覆盖原文件前必须完成)
TS=$(date +%Y%m%d-%H%M%S)
mkdir -p mi-model-20260924/backup
cp -p config.yaml "mi-model-20260924/backup/config.yaml.bak.$TS"
# 2) 编辑 config.yaml 三处(已执行):
#    a. 头注释「客户端 base_url」清单加一行  /mi -> 小米 MiMo
#    b. routes 加  mi: https://api.xiaomimimo.com/v1
#    c. pricing.models 加 mimo-v2.6-flash(peak=off_peak=0.02/1.0/2.0,不分峰谷)
# 3) 重启生效(高危:打断在途流式回答;先确认无在跑会话)
systemctl --user restart token-proxy

6. 验证

systemctl --user is-active token-proxy        # 预期: active
python3 -c "import urllib.request,json; print(json.load(urllib.request.urlopen('http://127.0.0.1:8788/healthz')))"
# 预期: {'status': 'ok', 'routes': ['ds', 'glm', 'mi']}
diff mi-model-20260924/backup/config.yaml.bak.* config.yaml
# 预期: 恰好 3 处纯新增(注释 1 行、routes 1 行、pricing 段 8 行),无其它差异

已完成的验证(2026-09-24):以上三项全过;YAML 解析断言(mi 路由、mimo 价、deepseek-v4-flash 未被误改、thinking.inject=false)全过;幂等复跑配置解析零变化。

usage 格式实测(改配置前,A 类只读):非流式与流式(含 stream_options.include_usage)均返回 OpenAI 式 usage:

{"completion_tokens":13,"prompt_tokens":9,"total_tokens":22,
 "completion_tokens_details":{"reasoning_tokens":10},
 "prompt_tokens_details":{"cached_tokens":0}}

已被现有代码兼容:proxy.py 提取 prompt_tokens_details.cached_tokens,cost_report.py 走 GLM 回退(命中 = cached_tokens,未命中 = prompt_tokens − 命中);上游回显模型名 mimo-v2.6-flash 与价目表规范名一致,无需 aliases。测试 key 文件 /tmp/mimo_key 用后即删,未留档。

待办(用户侧):Trae 新建自定义模型 base_url=http://192.168.31.250:8788/mi、模型 mimo-v2.6-flash(按 SOP 一节约定同时保留直连兜底),发一条消息后核对 tail -n 1 logs/usage.jsonl 含 route=mi 且 cost 字段非 0——此为第 2 章目标的最终闭环。

7. 回滚

  • 备份位置:~~mi-model-20260924/backup/config.yaml.bak.20260924-123412~~ —— 该 backup 目录已于 2026-10-02 按台账判据删除,回滚点随之放弃(判据已满足:小米链路 1219 条记账、最近一条 2026-09-30 15:30 status=200,见 backlog-20261002/SOP.md 第 5.1 节);
  • 回滚步骤(已失效,须先自建快照):手工撤销 config.yaml 中 routes.mi、pricing.models.mimo-v2.6-flash 与头注释三处改动,再 systemctl --user restart token-proxy;
  • 回滚后验证:/healthz 的 routes 回到 ['ds','glm'];
  • 无数据回滚需求:本次未触碰任何日志数据文件。

8. 风险说明

风险 缓解
重启打断在途流式回答 执行前确认无在跑会话;已按此执行
小米 usage 字段若日后变更,缓存明细可能缺失 已实测当前格式并被现有解析覆盖;logging.resp_file 可事后查缺
价目表日后调价 pricing 版本化:新增条目放最前、不删旧条目(工程既有约定)
执行中曾误改 deepseek-v4-flash 价(4.0→4.5) 当场发现并已恢复为 4.0,最终 diff 确认无残留

来源:/home/rain/Documents/services/token_proxy/mi-model-20260924/SOP.md | 最后更新:2026-10-02 15:19(由 build/sync.py 同步,请勿在站点侧修改)