You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(codex): account pause controls and bulk exhaustion (#667)
Maintainer takeover of #565. Persisted pause exclusion, bulk pause-exhausted, GUI controls, docs. Integrated with account namespaces and Spark quota scopes on current dev.
Copy file name to clipboardExpand all lines: docs-site/src/content/docs/ko/reference/configuration.md
+5Lines changed: 5 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -52,6 +52,7 @@ namespaced selected id를 bare id로 바꿉니다.
52
52
|`codexShimAutoRestore?`|`boolean`|`true`| 완료된 외부 Codex 업데이트가 이전에 설치한 shim을 교체하면 자동으로 복구합니다. 끄려면 `false`로 설정하거나 프로세스에 `OPENCODEX_CODEX_SHIM_AUTO_RESTORE=0`을 설정합니다. |
53
53
|`syncResumeHistory?`|`boolean`|`true`| 되돌릴 수 있는 Codex App 기록 호환 모드. opencodex가 원래 Codex thread metadata를 백업하고, 예전 OpenAI interactive row를 `opencodex`로 재매핑하며, opencodex가 만든 `exec` row를 App에 보이는 source로 잠시 승격합니다. `ocx stop` / `ocx restore`는 백업한 OpenAI row를 복원하고 남은 opencodex user thread를 OpenAI로 돌려 네이티브 Codex가 `config.toml`에서 프록시를 제거한 뒤에도 이어서 열 수 있게 합니다. 끄려면 `false`로 설정합니다. |
54
54
|`codexAccounts?`|`CodexAccount[]`|`[]`| Codex Auth 대시보드에서 관리하는 ChatGPT/Codex pool 계정 metadata. secret은 `codex-accounts.json`에 따로 둡니다. |
55
+
|`pausedCodexAccountIds?`|`string[]`|`[]`| Codex Auth에서 재개할 때까지 이후의 모든 Pool 선택에서 제외할 계정 ID. 메인 계정을 일시 중지하면 `__main__`도 포함됩니다. |
55
56
|`codexAccountNamespaces?`|`Record<string,string>`| — | 공개 model selector namespace에서 저장된 Codex 계정 target으로 연결하는 선택적 map입니다. 이 foundation layer는 map을 검증하고 저장하지만 picker row를 추가하거나 routing을 변경하지 않습니다. |
56
57
|`activeCodexAccountId?`|`string`| — | 수동으로 선택한 pool 계정. 선택 시 기존 thread affinity를 지우고 다음 요청부터 적용하며, 진행 중인 요청은 기존 계정을 유지합니다. |
57
58
|`autoSwitchThreshold?`|`number`|`80`| 새 세션 자동 전환용 사용량 백분율 threshold. 알려진 5시간, 주간, 30일 quota window 중 가장 높은 점수를 씁니다. `0`이면 quota 자동 전환을 끕니다. `quota` 전략과 `fill-first` drain threshold에도 사용됩니다. |
@@ -87,6 +88,10 @@ pool 계정 추가와 quota 갱신은 대시보드의 **Codex Auth** 페이지
87
88
아닌 계정 metadata만 저장하고, access/refresh token은 강화된 Codex 계정 credential store에 따로
88
89
보관합니다. 기존 thread id는 계정 affinity를 유지하며, 새 세션은 `accountPoolStrategy`, quota,
89
90
cooldown, health에 따라 자동 라우팅됩니다.
91
+
일시 중지된 계정과 quota metadata는 계속 표시되지만 자동 전환, 재시도/failover 선택, cooldown 복구 probe, 수동 활성화에서는 제외됩니다.
92
+
일시 중지는 해당 계정의 thread affinity map도 지웁니다. 진행 중인 요청은 이미 확보한 credential을 유지하지만, 이후 턴은 다시 라우팅되며 일시 중지된 계정은 재사용할 수 없습니다.
93
+
상태는 재시작 후에도 유지되며, 모든 계정이 일시 중지되면 Pool 라우팅은 계정을 몰래 선택하지 않고 실패합니다.
94
+
**한도 도달 계정 일시 중지**는 credential이 있는 적격 계정만 먼저 새로고친 뒤 관련 quota window가 이번 응답에서 100%로 확인된 계정만 일시 중지합니다. credential이 없는 계정과 quota가 없거나 새로고침에 실패한 계정은 변경하지 않습니다.
90
95
91
96
**rotation 전략**(새 세션만; bound thread는 변경 없음): `quota`(기본) — `autoSwitchThreshold` 초과 시
92
97
최저 usage 선택; `round-robin` — 균등 분배, `accountPoolStickyLimit`(기본 `1`, 1–100)로 한 선택당
Copy file name to clipboardExpand all lines: docs-site/src/content/docs/reference/configuration.md
+9Lines changed: 9 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -57,6 +57,7 @@ differing backup and rewrites known legacy namespaced selected ids to bare ids.
57
57
|`codexShimAutoRestore?`|`boolean`|`true`| Restore a previously installed Codex shim when a completed external Codex update replaces it. Set `false`, or set `OPENCODEX_CODEX_SHIM_AUTO_RESTORE=0` for a process-level opt-out. |
58
58
|`syncResumeHistory?`|`boolean`|`true`| Reversible Codex App history compatibility mode. opencodex backs up original Codex thread metadata, remaps old OpenAI interactive rows to `opencodex`, and temporarily promotes opencodex-created `exec` rows to an app-visible source. `ocx stop` / `ocx restore` restore backed-up OpenAI rows and eject remaining opencodex user threads to OpenAI so native Codex can resume them after the proxy is removed from `config.toml`. Set `false` to opt out. |
59
59
|`codexAccounts?`|`CodexAccount[]`|`[]`| ChatGPT/Codex pool account metadata managed by the Codex Auth dashboard. Secrets live separately in `codex-accounts.json`. |
60
+
|`pausedCodexAccountIds?`|`string[]`|`[]`| Accounts excluded from every future Pool selection until resumed in Codex Auth. Includes the main `__main__` account when paused. |
60
61
|`codexAccountNamespaces?`|`Record<string,string>`| — | Optional public model-selector namespace → stored Codex account target map. This foundation layer validates and persists the map but does not add picker rows or change routing. |
61
62
|`activeCodexAccountId?`|`string`| — | Manually selected Pool account. Selection clears existing thread affinity and applies to the next request; in-flight requests keep their captured account. |
62
63
|`autoSwitchThreshold?`|`number`|`80`| Usage percent threshold for new-session auto-switching. The score uses the hottest known 5h, weekly, or 30d quota window. Set `0` to disable quota auto-switching. Used by the `quota` strategy and as the drain threshold for `fill-first`. |
@@ -115,6 +116,14 @@ credential store. Existing thread ids keep account affinity, while new sessions
115
116
`accountPoolStrategy`, quota, cooldown, and health. A pre-stream upstream **429**/**402** on one pool
116
117
account is retried once on an eligible alternate account in the same request (so Codex CLI does not
117
118
stall on a depleted primary while another account still has quota).
119
+
Pause keeps an account and its quota metadata visible, but excludes it from automatic switching,
120
+
retry/failover selection, cooldown recovery probes, and manual activation. Pausing also clears that
121
+
account's thread-affinity map: in-flight requests keep their captured credentials, but subsequent
122
+
turns are re-routed and cannot reuse the paused account. The exclusion survives
123
+
restarts; if every account is paused, Pool routing fails instead of silently selecting one.
124
+
**Pause exhausted** first refreshes eligible accounts that have credentials available and pauses
125
+
only those whose relevant quota window is freshly confirmed at 100%; accounts without credentials
126
+
and unknown or failed quota refreshes are left unchanged.
118
127
:::
119
128
120
129
**Rotation strategies** (new sessions only; bound threads are unchanged):
Copy file name to clipboardExpand all lines: docs-site/src/content/docs/ru/reference/configuration.md
+7Lines changed: 7 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -56,6 +56,7 @@ opencodex настраивается файлом `~/.opencodex/config.json`. Е
56
56
|`codexShimAutoRestore?`|`boolean`|`true`| Восстанавливает ранее установленный shim после того, как завершённое внешнее обновление Codex заменило его. Для отключения задайте `false` или установите процессу `OPENCODEX_CODEX_SHIM_AUTO_RESTORE=0`. |
57
57
|`syncResumeHistory?`|`boolean`|`true`| Обратимый режим совместимости истории Codex App. opencodex резервирует исходные метаданные потоков Codex, переназначает старые интерактивные строки OpenAI на `opencodex` и временно повышает созданные opencodex строки `exec` до видимого в приложении источника. `ocx stop` / `ocx restore` восстанавливают зарезервированные строки OpenAI и возвращают оставшиеся пользовательские потоки opencodex обратно к OpenAI, чтобы нативный Codex мог возобновлять их после удаления прокси из `config.toml`. Установите `false`, чтобы отказаться. |
58
58
|`codexAccounts?`|`CodexAccount[]`|`[]`| Метаданные аккаунтов пула ChatGPT/Codex, управляемые дашбордом Codex Auth. Секреты хранятся отдельно в `codex-accounts.json`. |
59
+
|`pausedCodexAccountIds?`|`string[]`|`[]`| ID аккаунтов, исключённых из всех будущих выборов Pool до возобновления в Codex Auth. При паузе основного аккаунта включает `__main__`. |
59
60
|`codexAccountNamespaces?`|`Record<string,string>`| — | Необязательная map публичного namespace селектора модели на сохранённую цель аккаунта Codex. Этот foundation layer проверяет и сохраняет map, но не добавляет строки picker и не меняет routing. |
60
61
|`activeCodexAccountId?`|`string`| — | Вручную выбранный аккаунт пула. Выбор очищает существующие привязки потоков и действует со следующего запроса; выполняющиеся запросы сохраняют захваченный аккаунт. |
61
62
|`autoSwitchThreshold?`|`number`|`80`| Порог процента использования для автопереключения новых сессий. Оценка использует самое «горячее» из известных окон квоты — 5-часовое, недельное или 30-дневное. Установите `0`, чтобы отключить автопереключение по квоте. Используется стратегией `quota` и как порог исчерпания для `fill-first`. |
@@ -94,6 +95,12 @@ raw id аккаунтов и email приватными, а селектор и
94
95
защищённом хранилище учётных данных аккаунтов Codex. Существующие id потоков сохраняют привязку к
95
96
аккаунту; новые сессии маршрутизируются по `accountPoolStrategy`, квоте, cooldown и
96
97
работоспособности.
98
+
Приостановленный аккаунт и его метаданные квоты остаются видимыми, но исключаются из автоматического переключения,
99
+
повторов/failover, проб восстановления cooldown и ручной активации. Пауза также очищает карту affinity потоков
100
+
этого аккаунта: выполняющиеся запросы сохраняют захваченные учётные данные, но последующие ходы
101
+
перемаршрутизируются и не могут повторно использовать приостановленный аккаунт. Состояние сохраняется после перезапуска;
102
+
если приостановлены все аккаунты, маршрутизация Pool завершается ошибкой, а не выбирает аккаунт скрытно.
103
+
**Приостановить исчерпанные** сначала обновляет только подходящие аккаунты с доступными учётными данными и приостанавливает только те, для которых актуальное окно квоты в этом ответе подтверждено на уровне 100%. Аккаунты без учётных данных, с неизвестной квотой или неудачным обновлением не меняются.
97
104
98
105
**Стратегии ротации** (только новые сессии; привязанные потоки не меняются): `quota` (по умолчанию)
99
106
— выбор наименьшего usage при превышении `autoSwitchThreshold`; `round-robin` — равномерное
0 commit comments