-
-
Notifications
You must be signed in to change notification settings - Fork 80.7k
[Bug]: Discord /model picker shows stale model after hot-reloaded default switch #104614
Copy link
Copy link
Closed
Closed
Copy link
Labels
P2Normal backlog priority with limited blast radius.Normal backlog priority with limited blast radius.clawsweeper:fix-shape-clearClawSweeper found a clear likely implementation shape for this issue.ClawSweeper found a clear likely implementation shape for this issue.clawsweeper:queueable-fixClawSweeper marked this issue as an existing queue_fix_pr work candidate.ClawSweeper marked this issue as an existing queue_fix_pr work candidate.clawsweeper:source-reproClawSweeper found a high-confidence source-level issue reproduction.ClawSweeper found a high-confidence source-level issue reproduction.impact:auth-providerAuth, provider routing, model choice, or SecretRef resolution may break.Auth, provider routing, model choice, or SecretRef resolution may break.impact:ux-frictionUser-facing flow adds avoidable confusion or support burden without fully blocking progress.User-facing flow adds avoidable confusion or support burden without fully blocking progress.issue-rating: 🦞 diamond lobsterVery strong issue quality with high-confidence source-level or clear reproduction.Very strong issue quality with high-confidence source-level or clear reproduction.maturity:stableIssue affects a taxonomy feature currently scored M4/M5.Issue affects a taxonomy feature currently scored M4/M5.no-staleExclude from stale automationExclude from stale automation
Description
Metadata
Metadata
Assignees
Labels
P2Normal backlog priority with limited blast radius.Normal backlog priority with limited blast radius.clawsweeper:fix-shape-clearClawSweeper found a clear likely implementation shape for this issue.ClawSweeper found a clear likely implementation shape for this issue.clawsweeper:queueable-fixClawSweeper marked this issue as an existing queue_fix_pr work candidate.ClawSweeper marked this issue as an existing queue_fix_pr work candidate.clawsweeper:source-reproClawSweeper found a high-confidence source-level issue reproduction.ClawSweeper found a high-confidence source-level issue reproduction.impact:auth-providerAuth, provider routing, model choice, or SecretRef resolution may break.Auth, provider routing, model choice, or SecretRef resolution may break.impact:ux-frictionUser-facing flow adds avoidable confusion or support burden without fully blocking progress.User-facing flow adds avoidable confusion or support burden without fully blocking progress.issue-rating: 🦞 diamond lobsterVery strong issue quality with high-confidence source-level or clear reproduction.Very strong issue quality with high-confidence source-level or clear reproduction.maturity:stableIssue affects a taxonomy feature currently scored M4/M5.Issue affects a taxonomy feature currently scored M4/M5.no-staleExclude from stale automationExclude from stale automation
Type
Fields
Priority
None yet
Bug type
Behavior bug (incorrect output/state without crash)
Beta release blocker
No
Summary
On
2026.7.1-beta.5, the Discord/modelpicker can show a stale current model after the default model changes and hot-reloads successfully. In the observed case,openclaw models statusand a no-override direct agent run both proved the agent default wasopenai/gpt-5.6-terra, but the Discord picker still displayed the current model asgpt-5.5.A related picker interaction also produced the ephemeral notice:
That notice came from the Discord picker path, not from the model runner. The model itself was available and runnable through the Codex harness.
Steps to reproduce
Observed on a live Discord DM agent:
2026.7.1-beta.5 (b6387af)with Discord enabled and the bundledcodexplugin enabled.openai/gpt-*routes through the Codex harness.openai/gpt-5.5.{ "agents": { "defaults": { "models": { "openai/gpt-5.6-luna": { "alias": "luna" }, "openai/gpt-5.6-terra": { "alias": "terra" }, "openai/gpt-5.6-sol": { "alias": "sol" } } } } }openclaw models set terraObserved status excerpt:
{ "defaultModel": "openai/gpt-5.6-terra", "resolvedDefault": "openai/gpt-5.6-terra", "aliases": { "luna": "openai/gpt-5.6-luna", "terra": "openai/gpt-5.6-terra", "sol": "openai/gpt-5.6-sol" }, "allowed": [ "ollama-cloud/kimi-k2.5:cloud", "ollama-cloud/glm-5.2", "openai/gpt-5.5", "openai/gpt-5.6-luna", "openai/gpt-5.6-terra", "openai/gpt-5.6-sol" ] }openclaw agent \ --agent main \ --session-key agent:main:model-smoke-default-terra-20260711 \ --message "Reply with exactly: DEFAULT_TERRA_OK" \ --json \ --timeout 240Observed result excerpt:
{ "status": "ok", "text": "DEFAULT_TERRA_OK", "provider": "openai", "model": "gpt-5.6-terra", "harness": "codex", "fallbackUsed": false }/modelpicker in the DM.Expected behavior
The Discord
/modelpicker should reflect the current selected/default model after a hot-reloaded default model change.In this case, after
openclaw models set terra, the picker should showopenai/gpt-5.6-terraas current/default, or otherwise clearly distinguish selected vs effective model if those are intentionally different.If an older picker message was generated before the model change, interacting with it should produce a refresh/expired-picker message that tells the user to reopen
/model, not "that model isn't available anymore" when the model is actually available.Actual behavior
The Discord picker still displayed the current model as
gpt-5.5even though:openclaw models status --jsonreporteddefaultModelandresolvedDefaultasopenai/gpt-5.6-terra.openai, modelgpt-5.6-terra, harnesscodex, with no fallback.agents.defaults.model.primary.Earlier in the same repro session, selecting Terra through the picker produced:
OpenClaw version
OpenClaw 2026.7.1-beta.5 (b6387af)Operating system
Ubuntu VPS
Install method
User-local npm global install, managed by
openclaw-gateway.serviceas a systemd user service.Model
openai/gpt-5.5openai/gpt-5.6-terraopenai/gpt-5.6-luna,openai/gpt-5.6-solProvider / routing chain
OpenAI provider model refs through the bundled Codex app-server harness:
openaigpt-5.6-terracodexfalseAdditional provider/model setup details
The CLI paths understood the alias correctly:
openclaw models set terraresolved and persisted:
The failure appears specific to the Discord picker display/interaction state, not to model availability or runtime routing.
Logs, screenshots, and evidence
Gateway hot reload evidence:
The exact "not available anymore" string is present in the installed Discord picker handler in
dist/provider-JveWbP3C.jsaround theparsed.action === "model"path. That path resolves the selected model from the interaction and checks it against freshly loaded picker data before showing:Possible clue: the agent-local
models.jsonfile on the host was stale/empty while the live config/status/direct-run paths were correct. I did not prove that file is the root cause, but it may be worth checking whether Discord picker data can read stale catalog/session state after a hot reload.Related issues
This seems related but not identical to existing model-state issues:
AgentSession.this.modelsnapshot is stale after/modelswitch.models.mode=replace.This report is specifically about the Discord
/modelpicker showing stale current model state and/or rejecting an actually available model after a hot-reloaded default switch.Impact and severity
Moderate UX/operational correctness bug. The model can be running correctly while the Discord picker tells the user the old model is current or that the new model is unavailable. That sends operators toward provider/auth debugging even though the runner and config are healthy.
Additional information
Workaround: use canonical model refs or the CLI-supported setter path, then trust
/status/models status/ actual run metadata over the Discord picker until the picker is refreshed or fixed.