Plugins unavailable with ChatGPT login and custom model provider using env_key
Summary
I am using Codex Desktop with ChatGPT login and a custom model provider that uses a separate API key via env_key. Model requests to the custom provider succeed, but plugin discovery / plugin marketplace can still fail or become unavailable.
This looks like a Codex/plugin-discovery issue rather than a model-provider authentication issue: the model provider auth is separated from ChatGPT auth, so Codex should be able to use the custom key for model requests and ChatGPT auth for plugins/connectors.
Environment
- OS: macOS
- Codex CLI:
codex-cli 0.130.0 - Codex Desktop:
0.130.0-alpha.5observed in logs - Auth mode: ChatGPT
- Model provider: custom provider
- Wire API:
responses
Config
model_provider = "cato_company_gpt"
model = "gpt-5.5"
[model_providers.cato_company_gpt]
base_url = "https://model.zhenguanyu.com/v1"
name = "Company Model Platform"
env_key = "MODEL_API_KEY"
wire_api = "responses"
Auth status
$ codex login status
Logged in using ChatGPT
Expected behavior
When using a custom model provider with env_key while also logged in with ChatGPT, Codex should use:
MODEL_API_KEYfor model requests to the custom model provider- ChatGPT auth for plugins, plugin marketplace, connectors, remote plugin sync, and MCP app tools
Plugins should remain available while the active model provider is custom.
Actual behavior
Model requests to the custom provider succeed, but plugin discovery / plugin marketplace can fail. Logs include:
failed to warm featured plugin ids cache
remote plugin sync request to https://chatgpt.com/backend-api/plugins/featured?platform=codex failed with status 403 Forbidden
Directly requesting the same endpoint returns a Cloudflare challenge / 403 instead of JSON, even while codex login status reports ChatGPT auth:
https://chatgpt.com/backend-api/plugins/featured?platform=codex
=> 403 Forbidden
=> content-type: text/html; charset=UTF-8
=> Cloudflare challenge page
Why this seems like a Codex issue
Using env_key successfully separates the custom model provider's authentication from Codex's ChatGPT login. This resolves the earlier failure mode where requires_openai_auth = true caused the custom model provider to receive a ChatGPT token and return 401.
However, after separating model auth from ChatGPT auth, plugin availability still appears to depend on Codex's remote plugin discovery path under chatgpt.com/backend-api/plugins/featured. If this endpoint fails, plugin marketplace / discovery can become unavailable even though:
- ChatGPT login is active
- model requests succeed through the custom provider
- local installed plugin MCP tools may still work if already available/cached
Question
Are Codex plugins officially supported when using a custom model provider with env_key while authenticated with ChatGPT?
If yes, plugin discovery / plugin marketplace should probably continue to work with ChatGPT auth regardless of the active model provider, or degrade gracefully when plugins/featured cannot be warmed.
3 Comments
+1 Same for me here, not able to use plugins from openai when using a custom provider
I can reproduce this on the current macOS ChatGPT/Codex Desktop with a custom Azure Foundry provider, but without ChatGPT or OpenAI API-key login. This is not a failed catalog fetch: the signed renderer removes the successfully loaded catalog before it reaches the UI.
Environment
26.727.513510.146.0-alpha.9.2azure_foundrycodex login statusreportsNot logged in; no~/.codex/auth.json)The effective app-server state is:
The official reserved catalog itself loads correctly:
However, the installed signed renderer contains this predicate:
The plugin-directory hook computes:
For this supported custom-provider configuration,
authMethodisnull, so the predicate returnstrue.Pnithen selects both reserved marketplace names:and
Fniremoves them from theplugin/listresponse before the UI rows are flattened. The observable result is therefore:This also means setting
features.plugins=true,features.apps=true, orfeatures.remote_plugin=truecannot fix the problem. Manually adding the reserved marketplace is rejected, and using a renamed/local copy would not be an acceptable substitute for the official catalog.This overlaps with the renderer path documented in #29478, although that report reaches the hide path through the Statsig gate while authenticated with ChatGPT. Here the decisive input is
authMethod=nullfor a custom provider withrequiresOpenaiAuth=false.Expected behavior
Installation visibility and connector authorization should be separate states:
plugin/listsuccessfully returns the official catalog withinstallation=AVAILABLE, the Plugin Directory should display it.ON_INSTALLorON_USEaccording to their declared policy.Please either:
requiresOpenaiAuth=falsecustom-provider sessions as eligible to view/install the catalog; orCould the Codex team confirm whether hiding all
openai-curatedentries forauthMethod=nullis intended? If it is not intended, the fix needs to be in the signed Desktop renderer (or a supported host flag), because the backend catalog, manifest, SHA, and installation policies are already valid.Submitted the same minimal reproduction through the official app-server feedback channel with
includeLogs=false(no conversation/log upload). Feedback ID:no-active-thread-019fc5f8-a1b2-70e2-89eb-8e5b2f09bed5.