docs(codex-app-models): document Desktop remote allowlist limitation (#241) - #999
docs(codex-app-models): document Desktop remote allowlist limitation (#241)#999Yuxin-Qiao wants to merge 1 commit into
Conversation
Codex Desktop's remote-server mode filters the model picker against the client's own available_models allowlist (active with the remote use_hidden_models setting), so routed catalog entries that the app-server loads and serves do not appear in the picker. Record the limitation and the two workarounds (set model directly in config.toml, or use CLI/TUI) and sync the section across zh-cn, ko, ru, ja. Refs lidge-jun#241. Upstream: openai/codex#19694.
📝 WalkthroughWalkthroughThe guides document Codex Desktop remote-server model filtering across English, Japanese, Korean, Russian, and Simplified Chinese. They describe the difference between Desktop and CLI/TUI model availability and provide configuration workarounds. ChangesDesktop remote-server model documentation
Estimated code review effort: 1 (Trivial) | ~5 minutes Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d849dc631e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| Until Desktop exposes a control for the allowlist: | ||
|
|
||
| - Set the model directly in `~/.codex/config.toml` on the remote machine, for example | ||
| `model = "input/grok-4.5"`. The picker may show `Custom`, but requests still use the configured |
There was a problem hiding this comment.
Use a configured provider in the workaround example
In a standard configuration, input is not a provider, so copying this workaround does not select a routed model: routeModel strips a namespace only when it matches a configured provider, and otherwise may forward the entire invalid input/grok-4.5 string to the default provider. Use a real documented route such as xai/grok-4.5, or an explicit <provider>/<model> placeholder, and update the translated copies accordingly.
AGENTS.md reference: docs-site/AGENTS.md:L10-L10
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs-site/src/content/docs/guides/codex-app-models.md`:
- Around line 151-153: Update the model configuration examples in the five
locale workaround sections to use a configured provider/model identifier:
docs-site/src/content/docs/guides/codex-app-models.md:151-153,
docs-site/src/content/docs/ja/guides/codex-app-models.md:103-103,
docs-site/src/content/docs/ko/guides/codex-app-models.md:147-148,
docs-site/src/content/docs/ru/guides/codex-app-models.md:155-157, and
docs-site/src/content/docs/zh-cn/guides/codex-app-models.md:100-100. Replace the
unconfigured input/grok-4.5 example with model =
"<provider>/<model>", or use xai/grok-4.5 or cursor/grok-4.5 only
where that provider is configured.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: bdb19f9d-03e6-4be0-bdad-457b230654cd
📒 Files selected for processing (5)
docs-site/src/content/docs/guides/codex-app-models.mddocs-site/src/content/docs/ja/guides/codex-app-models.mddocs-site/src/content/docs/ko/guides/codex-app-models.mddocs-site/src/content/docs/ru/guides/codex-app-models.mddocs-site/src/content/docs/zh-cn/guides/codex-app-models.md
| - Set the model directly in `~/.codex/config.toml` on the remote machine, for example | ||
| `model = "input/grok-4.5"`. The picker may show `Custom`, but requests still use the configured | ||
| routed model. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
# Verify whether `input` is an actual provider and whether the example resolves.
rg -n \
'input/grok-4\.5|xai/grok-4\.5|cursor/grok-4\.5|["'\'']input["'\'']|provider.*input' \
.Repository: lidge-jun/opencodex
Length of output: 50375
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
printf '%s\n' '--- affected documentation ---'
for f in \
docs-site/src/content/docs/guides/codex-app-models.md \
docs-site/src/content/docs/ja/guides/codex-app-models.md \
docs-site/src/content/docs/ko/guides/codex-app-models.md \
docs-site/src/content/docs/ru/guides/codex-app-models.md \
docs-site/src/content/docs/zh-cn/guides/codex-app-models.md
do
echo "### $f"
rg -n -C 4 'input/grok-4\.5|model directly|モデルを直接|직접 설정|напрямую|直接设置' "$f"
done
printf '%s\n' '--- routing and provider declarations ---'
fd -t f . src | sort | while read -r f; do
if rg -q 'routeModel|provider.*model|model.*provider|providers:' "$f"; then
echo "### $f"
rg -n -C 3 'routeModel|provider.*model|model.*provider|providers:' "$f" | head -160
fi
done
printf '%s\n' '--- exact input-provider evidence outside documentation/data fields ---'
rg -n --glob '!docs-site/**' --glob '!*.json' \
'(^|[^[:alnum:]_-])input/grok-4\.5([^[:alnum:]_.-]|$)|provider[[:space:]]*[:=][[:space:]]*["'\''`]input["'\''`]|["'\''`]input["'\''`][[:space:]]*:' \
src tests gui scripts || trueRepository: lidge-jun/opencodex
Length of output: 50376
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
printf '%s\n' '--- routeModel definition and call sites ---'
rg -l --glob '*.ts' 'export (async )?function routeModel|function routeModel|routeModel\s*=' src tests | sort
rg -n -C 8 --glob '*.ts' \
'export (async )?function routeModel|function routeModel|routeModel\s*=' \
src tests | head -240
printf '%s\n' '--- provider-name validation and config lookup ---'
rg -n -C 8 --glob '*.ts' \
'isValidProviderName|defaultProvider|config\.providers\[|providers\[provider|providers\[model' \
src tests | head -320
printf '%s\n' '--- provider registry entries ---'
rg -n -C 3 --glob '*.ts' --glob '*.json' \
'provider(Name|Id)?[[:space:]]*[:=].*(xai|cursor|input)|["'\''](xai|cursor|input)["'\'']' \
src tests | head -240
printf '%s\n' '--- exact example count in all affected locales ---'
python3 - <<'PY'
from pathlib import Path
files = [
Path("docs-site/src/content/docs/guides/codex-app-models.md"),
Path("docs-site/src/content/docs/ja/guides/codex-app-models.md"),
Path("docs-site/src/content/docs/ko/guides/codex-app-models.md"),
Path("docs-site/src/content/docs/ru/guides/codex-app-models.md"),
Path("docs-site/src/content/docs/zh-cn/guides/codex-app-models.md"),
]
for path in files:
text = path.read_text()
print(f"{path}: input/grok-4.5={text.count('input/grok-4.5')}, "
f"xai/grok-4.5={text.count('xai/grok-4.5')}, "
f"cursor/grok-4.5={text.count('cursor/grok-4.5')}")
PYRepository: lidge-jun/opencodex
Length of output: 50375
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
printf '%s\n' '--- complete routing branches ---'
sed -n '340,465p' src/router.ts
printf '%s\n' '--- routing tests for unknown namespaces and configured providers ---'
rg -n -C 8 --glob '*.test.ts' \
'No provider configured for model|routeModel\(.*\/|unknown.*provider|provider.*not configured|defaultProvider' \
tests | head -320
printf '%s\n' '--- provider/model documentation context ---'
for f in \
docs-site/src/content/docs/guides/providers.md \
docs-site/src/content/docs/reference/adapters.md \
docs-site/src/content/docs/guides/codex-app-models.md
do
echo "### $f"
rg -n -C 5 'provider/model|provider-qualified|direct|configured|xai/grok-4\.5|cursor/grok-4\.5|openai-chat|catalog' "$f" | head -220
done
printf '%s\n' '--- standalone route decision verifier ---'
python3 - <<'PY'
def route_decision(providers, default_provider, model_id):
slash = model_id.find("/")
if slash > 0:
namespace = model_id[:slash]
if namespace in providers:
return ("explicit-provider", namespace, model_id[slash + 1:])
if model_id.startswith(("gpt-", "o")):
if "openai" in providers:
return ("native-openai", "openai", model_id)
raise RuntimeError(f"no enabled OpenAI provider for {model_id}")
for name, provider in providers.items():
if provider.get("defaultModel") == model_id:
return ("provider-default", name, provider["defaultModel"])
if model_id in provider.get("models", []):
return ("provider-model-list", name, model_id)
if default_provider in providers:
return ("default-provider-fallback", default_provider, model_id)
raise RuntimeError(f"No provider configured for model: {model_id}")
configs = [
(
"xai configured, input absent",
{"xai": {"models": ["grok-4.5"]}},
"xai",
"input/grok-4.5",
),
(
"cursor configured, input absent",
{"cursor": {"models": ["grok-4.5"]}},
"cursor",
"input/grok-4.5",
),
(
"input explicitly configured",
{"input": {"models": ["grok-4.5"]}},
"input",
"input/grok-4.5",
),
]
for name, providers, default_provider, model_id in configs:
try:
print(name, "=>", route_decision(providers, default_provider, model_id))
except RuntimeError as exc:
print(name, "=> ERROR:", exc)
PYRepository: lidge-jun/opencodex
Length of output: 50377
Use the configured provider/model identifier in all five locale workarounds.
input is not a built-in provider. When it is not configured, routeModel falls through to the default provider and preserves input/grok-4.5, which can cause the upstream request to fail. Replace the example with model = "<provider>/<model>", or use xai/grok-4.5 or cursor/grok-4.5 only when that provider is configured.
Apply this change to docs-site/src/content/docs/guides/codex-app-models.md:151-153 and the corresponding lines in the Japanese, Korean, Russian, and Chinese pages.
📍 Affects 5 files
docs-site/src/content/docs/guides/codex-app-models.md#L151-L153(this comment)docs-site/src/content/docs/ja/guides/codex-app-models.md#L103-L103docs-site/src/content/docs/ko/guides/codex-app-models.md#L147-L148docs-site/src/content/docs/ru/guides/codex-app-models.md#L155-L157docs-site/src/content/docs/zh-cn/guides/codex-app-models.md#L100-L100
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs-site/src/content/docs/guides/codex-app-models.md` around lines 151 -
153, Update the model configuration examples in the five locale workaround
sections to use a configured provider/model identifier:
docs-site/src/content/docs/guides/codex-app-models.md:151-153,
docs-site/src/content/docs/ja/guides/codex-app-models.md:103-103,
docs-site/src/content/docs/ko/guides/codex-app-models.md:147-148,
docs-site/src/content/docs/ru/guides/codex-app-models.md:155-157, and
docs-site/src/content/docs/zh-cn/guides/codex-app-models.md:100-100. Replace the
unconfigured input/grok-4.5 example with model =
"<provider>/<model>", or use xai/grok-4.5 or cursor/grok-4.5 only
where that provider is configured.
Source: Path instructions
Adds devlog/_plan/260805_issue_pr_triage: a prior-art index over the whole tracked devlog corpus, a frozen surface inventory, per-item verdicts for 17 bug-class issues and all 25 open PRs, an issue-PR cross-link matrix, and a dependency-ordered action queue. The prior-art pass is the load-bearing part: 8 issues and 8 PRs had never been investigated, while #92 has passed through 26 devlog units and is still open. Seven of the eight new issues are real defects; #1045 is already fixed on dev. #1043 and #1024 share one root cause, and #999/#1056 are complementary halves of #241 rather than duplicates. No code, no GitHub writes.
Summary
available_modelsallowlist (active with the remoteuse_hidden_modelssetting), after the app-server has already loaded and served the routed catalog entries.model = "<provider>/<model>"directly in~/.codex/config.toml(the picker may showCustom, but requests still route correctly), or use Codex CLI/TUI, which do not apply the allowlist.zh-cn,ko,ru, andjalocales.Why
Validation
typecheck/testare unaffected.git diff --checkclean;bun run privacy:scanpasses.bun installandnpm installstall on thepretendardfont tarball through the current network. CI docs build is the gate.Summary by CodeRabbit