Version
Pikiloom v0.4.71 / ghcr.io/xiaotonng/pikiloom:0.4.71 (verified in the published ARM64 image).
Summary
The GPT-5.6 adaptation is working in the model catalog, dashboard dispatch, and Codex driver. There appears to be one remaining Telegram-specific path that still converts native Codex ultra to max.
The Telegram /models confirmation path calls bot.switchEffortForChat(...):
switchEffortForChat() currently applies the old agent-agnostic conversion:
const ultra = effort === 'ultra';
const realEffort = ultra ? 'max' : effort;
Source: src/bot/bot.ts
For Codex, workflow capability is false, so selecting Ultra through Telegram stores max, the picker subsequently reports max, and the app-server receives max rather than native ultra.
The dashboard path already uses splitEffortForAgent(), which correctly returns:
splitEffortForAgent('codex', 'ultra')
// { effort: 'ultra', workflow: false }
Reproduction
- Select the
codex agent and gpt-5.6-sol (or gpt-5.6-terra).
- In Telegram, open
/models.
- Select
Ultra and confirm.
- Reopen
/models or inspect the next Codex turn.
The effective effort is max instead of ultra.
Expected behavior
- Codex
max remains max.
- Codex
ultra remains ultra and is sent verbatim to the app-server.
- Claude keeps its existing display alias behavior:
ultra -> max + workflow orchestration.
Suggested fix
Reuse splitEffortForAgent(cs.agent, effort) inside switchEffortForChat() instead of performing the unconditional ultra -> max conversion, and add a Telegram /models regression test for Codex Ultra.
Version
Pikiloom
v0.4.71/ghcr.io/xiaotonng/pikiloom:0.4.71(verified in the published ARM64 image).Summary
The GPT-5.6 adaptation is working in the model catalog, dashboard dispatch, and Codex driver. There appears to be one remaining Telegram-specific path that still converts native Codex
ultratomax.The Telegram
/modelsconfirmation path callsbot.switchEffortForChat(...):command-ui.tscommand-ui.tsswitchEffortForChat()currently applies the old agent-agnostic conversion:Source:
src/bot/bot.tsFor Codex,
workflowcapability is false, so selectingUltrathrough Telegram storesmax, the picker subsequently reportsmax, and the app-server receivesmaxrather than nativeultra.The dashboard path already uses
splitEffortForAgent(), which correctly returns:Reproduction
codexagent andgpt-5.6-sol(orgpt-5.6-terra)./models.Ultraand confirm./modelsor inspect the next Codex turn.The effective effort is
maxinstead ofultra.Expected behavior
maxremainsmax.ultraremainsultraand is sent verbatim to the app-server.ultra->max+ workflow orchestration.Suggested fix
Reuse
splitEffortForAgent(cs.agent, effort)insideswitchEffortForChat()instead of performing the unconditionalultra -> maxconversion, and add a Telegram/modelsregression test for CodexUltra.