Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
19 changes: 19 additions & 0 deletions devlog/_plan/260910_account_model_picker/000_plan.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Selective Codex account models

Understood as: register selected account/model pairs in OpenCodex for review harnesses while preserving common pool-routed native models; validate locally and submit an upstream dev PR.

## Scope and rationale
Some models are available only to particular accounts. Review automation needs an explicit eligible-account selector without multiplying every model by every account. This feature selects catalog entries; it grants no provider entitlement and promises no change to refusals.

Reuse existing account namespaces and exact-account routing. Add an optional per-selector model allowlist to settings, extend the existing advanced-settings control, and keep common native rows visible in selective mode. Existing configurations without an allowlist retain their legacy projection until selection is saved. No credentials, routing policy, Daybreak wire normalization, or running service changes.

## Plan and audit
- Configuration validates public selector keys and bare native model IDs; absent means legacy all, empty object means none.
- GET/PUT settings exposes choices and persists selections with existing rollback and catalog convergence.
- Catalog consumers filter generated rows by the same allowlist. Selective mode leaves bare rows visible. Entitlement gates and exact-account failures remain unchanged.
- UI reuses the existing card, toggle, forms and locale files; account/model choices expand beneath the toggle. Quiet developer settings: variance 2, motion 1, density D5. No new visual system.
- Tests: configuration validation, save/rollback, selected-only catalog and common rows, exact-account regression, UI save/toggle/failure; local typecheck/full tests, GUI checks/build, docs build, privacy scan; independent security/correctness review and browser screenshots before PR.

Audit: a display allowlist must never become an authorization source. Unknown/deleted selectors must not be advertised. Disabling visibility must not remove routing bindings. Main means current main login, not a permanently pinned email identity.

User refinement: the original switch keeps its original default/legacy behavior. A second Customize per account toggle opts into selective projection; switching it off restores legacy behavior.
12 changes: 8 additions & 4 deletions docs-site/src/content/docs/fr/guides/codex-app-models.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@ Les entrées OpenAI utilisent deux routes d'identification : la connexion Codex
clé API avec espace de noms `openai-apikey/<model>`. Le simple passage de `codexAccountMode` entre Pool et
Direct ne change pas les identifiants du sélecteur. Toutefois, lorsque les lignes qualifiées par compte sont
activées avec `codexAccountPickerEnabled` et que `codexAccountNamespaces` contient des sélecteurs admissibles
dont les comptes associés existent toujours, opencodex ajoute une ligne
`<selector>/<native-openai-model>` distincte pour chaque compte associé et masque les lignes natives non
qualifiées du sélecteur Codex. Les libellés des sélecteurs sont des noms publics choisis par l'utilisateur et
dont les comptes associés existent toujours, le résultat dépend de `codexAccountPickerModels`. Lorsque cette
table est omise, le comportement historique ajoute une ligne `<selector>/<native-openai-model>` pour chaque
modèle pris en charge et masque les lignes natives non qualifiées du sélecteur Codex. Lorsque la table est
présente, les modèles natifs du groupe commun restent visibles sous forme de lignes non qualifiées, et seules
les paires de modèles et de comptes sélectionnées reçoivent des lignes qualifiées. Les libellés des sélecteurs sont des noms publics choisis par l'utilisateur et
Comment thread
coderabbitai[bot] marked this conversation as resolved.
n'ont aucune signification intégrée quant au rôle du compte. Choisir une ligne qualifiée utilise exclusivement
le compte associé, ne change pas le compte Pool actif et échoue de façon fermée au lieu de changer de compte
si la cible n'est pas disponible. Si le catalogue Codex propre à un compte contient un identifiant visible de
Expand All @@ -26,6 +28,8 @@ filtre les entrées mal formées ; cela ne prouve pas que l'identifiant provient
cache appartient à l'utilisateur. Consultez les
[sélecteurs exacts de compte Codex](/fr/reference/configuration/routing/#sélecteurs-exacts-de-comptes-codex).

Pour activer cette option, choisir les modèles, enregistrer ou revenir au mode précédent, consultez les [étapes de configuration en anglais](/guides/codex-app-models/#select-only-particular-account-models).

`gpt-daybreak-blue-latest` suit cette règle d'observation uniquement pour les lignes qualifiées par compte et
n'est pas ajouté à la liste d'autorisation native non qualifiée. Une entrée `customModels` distincte et
explicite peut exposer le même identifiant transmis comme `openai/gpt-daybreak-blue-latest` par
Expand Down Expand Up @@ -139,7 +143,7 @@ approximation fondée sur un ancien modèle d'entrée.
| Route | Identifiants du sélecteur et métadonnées du catalogue |
| --- | --- |
| Connexion Codex (lignes qualifiées par compte désactivées) | Identifiants natifs non qualifiés comme `gpt-5.6-sol`, `gpt-5.6-terra` et `gpt-5.6-luna` ; Pool ou Direct est choisi avec `codexAccountMode`. Les lignes GPT-5.6 utilisent une fenêtre de catalogue de 372 000 jetons. |
| Connexion Codex (lignes qualifiées par compte activées avec des sélecteurs admissibles) | Une ligne `<selector>/<native-openai-model>` par sélecteur admissible et modèle natif pris en charge ; chaque ligne utilise exclusivement le compte associé, et les lignes natives non qualifiées sont masquées dans le sélecteur. Les métadonnées natives et les fenêtres de contexte sont préservées. |
| Connexion Codex (lignes qualifiées par compte activées avec des sélecteurs admissibles) | Lorsque `codexAccountPickerModels` est omis, chaque sélecteur admissible reçoit tous les modèles natifs pris en charge et les lignes natives non qualifiées sont masquées. Lorsque la table est présente, les modèles natifs du groupe commun restent visibles sous forme de lignes non qualifiées et seules les paires de modèles et de sélecteurs choisies reçoivent des lignes qualifiées. Chaque ligne qualifiée utilise exclusivement le compte associé. Les métadonnées natives et les fenêtres de contexte sont préservées. |
| Connexion Codex (ligne Daybreak transférée explicitement) | `openai/gpt-daybreak-blue-latest` uniquement lorsque l'entrée `customModels` exacte est configurée sur le fournisseur canonique `openai`. Elle conserve l'identifiant Daybreak transmis et utilise l'instantané de capacités Sol épinglé (contexte de 372 000 jetons ; compactage automatique à 334 800 jetons). |
| OpenAI (clé API) | Exactement dix lignes avec espace de noms : `gpt-5.5`, `gpt-5.6`, Sol/Terra/Luna, les trois identifiants virtuels `*-pro` et les deux alias Daybreak (contexte de 1 050 000 jetons ; entrée maximale de 922 000 jetons pour les dix) |
| OpenRouter | `openrouter/openai/gpt-5.6-sol`, `openrouter/openai/gpt-5.6-terra`, `openrouter/openai/gpt-5.6-luna` (1 050 000) |
Expand Down
25 changes: 21 additions & 4 deletions docs-site/src/content/docs/guides/codex-app-models.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,11 @@ OpenAI entries use two credential routes: native Codex login and the namespaced
`openai-apikey/<model>` API-key transport. Changing `codexAccountMode` between Pool and Direct by
itself does not change picker ids. When account-qualified picker rows are enabled by
`codexAccountPickerEnabled` and `codexAccountNamespaces` has eligible selectors whose
mapped accounts still exist, however,
opencodex adds separate `<selector>/<native-openai-model>` rows for the mapped accounts and hides
the bare native rows from the Codex picker. Selector labels are user-chosen public names with no
mapped accounts still exist, the result depends on `codexAccountPickerModels`. When that map is
omitted, legacy behavior adds separate `<selector>/<native-openai-model>` rows for every supported
model and hides the bare native rows from the Codex picker. When the map is present, common pooled
native models remain visible as bare rows, and only the selected model and account pairs receive
qualified rows. Selector labels are user-chosen public names with no
built-in account-role meaning. Selecting a qualified row uses only its mapped account, does not
change the active Pool account, and fails closed instead of switching accounts when the target is
unavailable. If Codex's account-scoped catalog contains a visible, API-supported OpenAI-family id
Expand Down Expand Up @@ -197,7 +199,7 @@ metadata instead of an older-template approximation.
| Route | Picker ids and catalog metadata |
| --- | --- |
| Codex login (account-qualified rows disabled) | Bare native ids such as `gpt-5.6-sol`, `gpt-5.6-terra`, and `gpt-5.6-luna`; Pool or Direct is selected through `codexAccountMode`. GPT-5.6 rows use a 922,000-token catalog window. |
| Codex login (account-qualified rows enabled with eligible selectors) | One `<selector>/<native-openai-model>` row per eligible selector and supported native model; each row uses only its mapped account, and bare native rows are hidden from the picker. Native metadata and context windows are preserved. |
| Codex login (account-qualified rows enabled with eligible selectors) | With `codexAccountPickerModels` omitted, every eligible selector receives every supported native model and bare native rows are hidden. With the map present, common pooled native models remain visible as bare rows and only selected model and selector pairs receive qualified rows. Each qualified row uses only its mapped account. Native metadata and context windows are preserved. |
| Codex login (explicit Daybreak forward row) | `openai/gpt-daybreak-blue-latest` only when the exact `customModels` row is configured on the canonical `openai` provider. It keeps the Daybreak wire id and uses the pinned Sol capability snapshot (922,000 context; 829,800 automatic compaction). |
| OpenAI (API key) | Exactly ten namespaced rows: `gpt-5.5`, `gpt-5.6`, Sol/Terra/Luna, the three `*-pro` virtual ids, and the two Daybreak aliases (1,050,000 context; 922,000 max input for all ten) |
| OpenRouter | `openrouter/openai/gpt-5.6-sol`, `openrouter/openai/gpt-5.6-terra`, `openrouter/openai/gpt-5.6-luna` (922,000) |
Expand Down Expand Up @@ -321,3 +323,18 @@ opencodex rewrites `models_cache.json` with a deliberately stale cache wrapper w
visibility, priority, or metadata changes, so the next Codex model refresh reads the new catalog.

After a catalog or model-cache write, OpenCodex invalidates its cached app-server observation so the next request checks process freshness again. A configuration sync also invalidates the observation when catalog contents are unchanged. This refresh does not restart Codex processes.


## Select only particular account models

In **Advanced settings**, enable **Target a specific Codex account from the model picker**, then
**Customize models per account**. Select the models to expose for each account and save.
Common native models remain in the picker and continue to use the configured Direct/Pool
routing. Selected entries such as `main/gpt-daybreak-blue-latest` use only the mapped account.
Comment thread
thisisjun786 marked this conversation as resolved.
This is useful for review harnesses when model access differs between accounts; selecting a
model does not grant upstream access or guarantee that a review will be accepted.

The original switch keeps its existing behavior until customization is enabled. Turning
customization off restores the original all-account projection. Turning the original switch
off hides account entries without deleting the routing bindings or saved selection.
The `main` selector follows the current main Codex login, not a permanently bound email address.
6 changes: 4 additions & 2 deletions docs-site/src/content/docs/ja/guides/codex-app-models.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ opencodex は Codex アプリにパッチを適用しません。Codex CLI/TUI
リリースは renderer 側で追加の remote allowlist を適用し、routed row を picker から除外する
ことがあります。明示的な `nativeAlias: true` combo が、この上流不具合向けの互換モードです。

OpenAI エントリには、ネイティブ Codex ログインと、名前空間付きの `openai-apikey/<model>` API キーという 2 つの資格情報ルートがあります。`codexAccountMode` だけを Pool と Direct の間で変更しても、ピッカー ID は変わりません。ただし、`codexAccountPickerEnabled` によって account-qualified picker 行が有効で、`codexAccountNamespaces` に対象アカウントが存在する selector がある場合、opencodex は対応するアカウントごとに `<selector>/<native-openai-model>` 行を追加し、ピッカーでは bare native 行を非表示にします。Selector 名はユーザーが決める公開ラベルであり、組み込みのアカウント role の意味はありません。`selector` 付きの行を選択すると、対応付けられたアカウントだけが使用され、アクティブな Pool アカウントは変更されません。対象を利用できない場合、別のアカウントへ切り替えずにリクエストが失敗します。詳しくは [Codex アカウントの明示的な selector](/reference/configuration/routing/#exact-codex-account-selectors) を参照してください。
OpenAI エントリには、ネイティブ Codex ログインと、名前空間付きの `openai-apikey/<model>` API キーという 2 つの資格情報ルートがあります。`codexAccountMode` だけを Pool と Direct の間で変更しても、ピッカー ID は変わりません。ただし、`codexAccountPickerEnabled` によって account-qualified picker 行が有効で、`codexAccountNamespaces` に対象アカウントが存在する selector がある場合、結果は `codexAccountPickerModels` によって変わります。この map を省略すると、従来の動作として、すべての対応モデルに `<selector>/<native-openai-model>` 行が追加され、ピッカーの bare native 行は非表示になります。map が存在する場合、共通プールの native model は bare 行として表示されたままで、選択したモデルとアカウントの組み合わせだけに qualified 行が追加されます。Selector 名はユーザーが決める公開ラベルであり、組み込みのアカウント role の意味はありません。`selector` 付きの行を選択すると、対応付けられたアカウントだけが使用され、アクティブな Pool アカウントは変更されません。対象を利用できない場合、別のアカウントへ切り替えずにリクエストが失敗します。詳しくは [Codex アカウントの明示的な selector](/reference/configuration/routing/#exact-codex-account-selectors) を参照してください。

有効化、モデルの選択と保存、元のモードへの戻し方は、[英語版の設定手順](/guides/codex-app-models/#select-only-particular-account-models)を参照してください。

`codexAccountNamespaces` map が空の場合、account-qualified picker 行は off です。空でない map で `codexAccountPickerEnabled` を省略すると、後方互換性のため有効として扱われます。`false` にすると、mapping を削除せず、明示的な `<selector>/<native-openai-model>` routing も無効にせずに、生成された qualified 行を非表示にして picker の bare native 行を復元します。

Expand Down Expand Up @@ -53,7 +55,7 @@ visibility = "list"
|ルート |ピッカー ID とカタログのメタデータ |
| --- | --- |
| Codex ログイン (account-qualified 行が無効) | `gpt-5.6-sol`、`gpt-5.6-terra`、`gpt-5.6-luna` などの bare native id を表示し、`codexAccountMode` に従って Pool または Direct を使用します。GPT-5.6 行のカタログ ウィンドウは 922,000 トークンです。 |
| Codex ログイン (account-qualified 行が有効で、有効な selector あり) | 有効な selector とサポート対象 native model の各組み合わせに `<selector>/<native-openai-model>` 行を表示します。各行は対応付けられたアカウントだけを使用し、bare native 行はピッカーで非表示になります。Native metadata と context window は保持されます。 |
| Codex ログイン (account-qualified 行が有効で、有効な selector あり) | `codexAccountPickerModels` を省略すると、各 selector にすべての対応 native model の行が追加され、bare native 行は非表示になります。map が存在する場合、共通プールの native model は bare 行として表示されたままで、選択したモデルと selector の組み合わせだけに qualified 行が追加されます。各 qualified 行は対応付けられたアカウントだけを使用します。Native metadata と context window は保持されます。 |
| OpenAI (API キー) |正確に 8 つの名前空間行: `gpt-5.5`、`gpt-5.6`、Sol/Terra/Luna、および 3 つの `*-pro` 仮想 ID (コンテキスト 922,000、8 つすべての最大入力 922,000) |
|オープンルーター | `openrouter/openai/gpt-5.6-sol`、`openrouter/openai/gpt-5.6-terra`、`openrouter/openai/gpt-5.6-luna` (922,000) |
| Cursor | 静的フォールバックには `cursor/gpt-5.6-sol`、`cursor/gpt-5.6-terra`、`cursor/gpt-5.6-luna` (1,000,000) と、Grok 4.5 / 4.6 の通常・Fast 行 (500,000) が含まれます。4.6 は `xhigh` も公開し、ライブアカウントの検出によって表示される行が決まります。 |
Expand Down
Loading
Loading