JianFeeeee
2e28696e74
fix(pi): 模型选择落到「宿主默认」是静默的,而且日志把它说成「平台默认」
## 现场
pi 每封来信都报 `模型 (平台默认) 失败: 402: Insufficient Balance`。
**把它读成「平台的模型没钱了」是错的** —— 真相是:
- `modelAttemptOrder(范围, env默认)` 在「平台没划范围 **且** env 没指定」时
返回 `[undefined]`,语义是「交给宿主 SDK 用它自己的默认模型」;
- pi.env 里 `AGENTMAIL_REPLY_PROVIDER/MODEL` **都是空的**,而
**opencode.env 里钉了 `llmsproxy`/`AUTO`** —— 这就是为什么其它三桥通、只有 pi 不通;
- 于是落到了宿主的默认:`/root/.pi/agent/settings.json` 的
`defaultProvider: deepseek` + `defaultModel: deepseek-v4-flash`
—— **直连 DeepSeek 云**(不是本地代理),那边的余额是零;
- 而那个名字连本地代理的目录里都没有(目录是 `deepseek-v4.1-flash`),
所以即使指对了代理也会 403。
## 修
1. **配置**(`/etc/agentmail/pi.env`):按 opencode 的约定钉上
`llmsproxy` + `AUTO`,并在注释里写明「留空的语义是交给宿主默认,平台管不着」
—— 这个语义本身就是坑。
2. **代码**:把那句 `(平台默认)` 改成 `宿主默认(平台未指定模型)`,
并在「平台未指定模型」时**显式告警**一次。一句话的日志差别决定了排查方向:
「平台默认」把人引向平台配置,「宿主默认」直接指向 `~/.pi/agent/settings.json`。
3. **断言**:`modelAttemptOrder` 的 `[undefined]` 语义 + 「源码里不能把宿主默认
写成平台默认」(只看字符串字面量,免得注释里的解释也被禁掉)。
## 验证
- 配置前:`env | grep -i zcode|agentmail` 那条待决请求被拒(它会把 worker 环境里的
`AGENTMAIL_AGENT_KEY` 打进模型上下文);顺带清扫 9 条早前实验遗留的待决请求。
- 配置后真发一封进 pi 的**已有会话**:6 秒内收到回信,标记原样返回 ✓
- 四桥漂移检查全通过;pi 415 测试全绿;「平台未指定模型」告警在生产日志里出现 0 次
(说明配置确实齐了)。
## 仍然待定(需要你定)
`/root/.pi/agent/settings.json` 的宿主默认 **仍指向 `deepseek/deepseek-v4-flash`**。
它影响**交互式 pi**(人工开着 pi 干活时用的就是它),而且那个模型名不在本地代理目录里。
桥这条路已经绕开它了,但要不要把宿主默认也改成 `llmsproxy/AUTO`
(与 opencode 一致)需要你拍板 —— 那会改变交互式会话的行为。
2026-09-12 23:31:44 +08:00
..
2026-09-12 23:13:48 +08:00
2026-09-12 17:38:32 +08:00
2026-09-12 23:13:48 +08:00
2026-09-12 23:31:44 +08:00
2026-09-12 23:13:48 +08:00