openclaw - 💡(How to fix) Fix Regression: /models picker no longer lists CLI runtime providers (claude-cli, codex-cli, google-gemini-cli) [1 pull requests]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…

After the model-runtime alias restructure (isLegacyRuntimeModelProvider introduced in src/agents/model-runtime-aliases.ts), the /models inline-button picker hides every CLI runtime provider — claude-cli, codex-cli, google-gemini-cli. The model references themselves still resolve when typed (/model status reports claude-cli/claude-opus-4-7 correctly), but the click-through discovery flow is broken.

Channel: Telegram (also affects any channel that renders buildModelsProviderData(...).providers as buttons).

Root Cause

src/agents/model-picker-visibility.ts:5:

export function isModelPickerVisibleProvider(provider: string): boolean {
  return !isLegacyRuntimeModelProvider(normalizeProviderId(provider));
}

isLegacyRuntimeModelProvider returns true for every entry in LEGACY_RUNTIME_MODEL_PROVIDER_ALIASES (model-runtime-aliases.ts:17-27), so the picker filters them all out.

commands-models.ts does build runtimeChoicesByProvider (line 188-205) listing the runtimes per canonical provider, but the per-provider runtime selector is a second click and most channels still render the provider list first — and that list is now CLI-free.

Fix Action

Fixed

Code Example

Current: claude-cli/claude-opus-4-6
Default: claude-cli/claude-opus-4-6
...
[claude-cli] endpoint: default ...
  • claude-cli/claude-opus-4-6 (opus)
  • claude-cli/claude-sonnet-4-6 (sonnet)

---

export function isModelPickerVisibleProvider(provider: string): boolean {
  return !isLegacyRuntimeModelProvider(normalizeProviderId(provider));
}
RAW_BUFFERClick to expand / collapse

Summary

After the model-runtime alias restructure (isLegacyRuntimeModelProvider introduced in src/agents/model-runtime-aliases.ts), the /models inline-button picker hides every CLI runtime provider — claude-cli, codex-cli, google-gemini-cli. The model references themselves still resolve when typed (/model status reports claude-cli/claude-opus-4-7 correctly), but the click-through discovery flow is broken.

Channel: Telegram (also affects any channel that renders buildModelsProviderData(...).providers as buttons).

Repro

  1. On 2026.5.12-beta.1 (or any build with model-picker-visibility.ts:5 !isLegacyRuntimeModelProvider(...) gate).
  2. In Telegram, send /models.
  3. Expected: see anthropic, openai, google, claude-cli, codex-cli, ... as clickable providers.
  4. Actual: only canonical providers shown. claude-cli / codex-cli etc. omitted. Users have to know the --runtime flag and type it manually.

/model status confirms the runtime ref is still addressable — it's just hidden from discovery:

Current: claude-cli/claude-opus-4-6
Default: claude-cli/claude-opus-4-6
...
[claude-cli] endpoint: default ...
  • claude-cli/claude-opus-4-6 (opus)
  • claude-cli/claude-sonnet-4-6 (sonnet)

Cause

src/agents/model-picker-visibility.ts:5:

export function isModelPickerVisibleProvider(provider: string): boolean {
  return !isLegacyRuntimeModelProvider(normalizeProviderId(provider));
}

isLegacyRuntimeModelProvider returns true for every entry in LEGACY_RUNTIME_MODEL_PROVIDER_ALIASES (model-runtime-aliases.ts:17-27), so the picker filters them all out.

commands-models.ts does build runtimeChoicesByProvider (line 188-205) listing the runtimes per canonical provider, but the per-provider runtime selector is a second click and most channels still render the provider list first — and that list is now CLI-free.

Why this matters for users

For users who routinely switch between Claude CLI / Codex CLI / Pi runtime from a single Telegram thread, the previous flow was:

  1. /models → tap claude-cli → tap a model → done (2 taps from list).

Now it's:

  1. Memorize the canonical-provider + --runtime <alias> form and type it (no inline-button path).

The runtime is genuinely a primary axis of choice in this workflow, not an implementation detail, so making it discoverable would be a real UX win.

Suggested fixes (pick one or combine)

  1. Show CLI runtime providers as siblings of canonical providers in the picker (revert the visibility filter, or gate it behind a config like models.showLegacyRuntimeProviders: true).
  2. Two-level click-through: when a user taps anthropic, surface a runtime selector ("via Pi" / "via claude-cli") before the model list. runtimeChoicesByProvider already provides the data.
  3. Both, behind a config flag — default to (2) for new users, allow (1) for the legacy flow.

Happy to put up a PR if maintainers signal which direction is preferred. (1) is the smallest diff; (2) is the more architecturally honest answer.

Affected versions

Observed on 2026.5.12-beta.1. The visibility filter was introduced earlier than the beta cut — checking blame on model-picker-visibility.ts:5.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING