Skip to content

v2.25.0

Choose a tag to compare

@ndycode ndycode released this 31 Oct 11:11
· 7 commits to main since this release

https://www.npmjs.com/package/codex-multi-auth/v/2.25.0

npm i -g codex-multi-auth@2.25.0

Codex voice and web search now work with runtime rotation on, the packaged-app router can chain a second local proxy, macOS app binds are managed through launchd, and GPT-6.1 Terra is a first-class model. API-key routes gain US endpoints and a PSP pool. Saved re-logins take effect in a running router, and refresh coordination fails closed. (#748, #749, #750, #751, #752, #753, #754, #756)

Added

  • Native voice through runtime rotation: /voice no longer fails with runtime_rotation_proxy_not_found. The proxy creates the call with a managed ChatGPT account and relays the call's sideband control WebSocket with that same account. Audio stays peer-to-peer over WebRTC. The wrapper and both app-bind modes point experimental_realtime_ws_base_url at the local proxy, so the local proxy token is never sent to the OpenAI realtime API. A value you set yourself is left alone, and the bind-written line is marked and removed on unbind. Voice rate limits and errors are passed through without replaying a call or cooling down the account. A call stays joinable for ten minutes after it is created or after its sideband last connected or disconnected. (#750)
  • Codex web search through runtime rotation: POST /alpha/search (web.run) is forwarded to /codex/alpha/search with a managed account. Search 4xx, 5xx, 429, and transport failures go back to Codex without replaying on another account and without rate-limiting the account for Responses. (#752)
  • App bind upstream proxy: codex-multi-auth rotation bind-app --upstream http://127.0.0.1:<port>[/path] chains one more local proxy behind the packaged-app router, for example Codex → codex-multi-auth → Headroom → OpenAI. Only numeric loopback HTTP URLs with an explicit port are accepted. The setting survives rebinds and reset-runtime, --no-upstream removes it, and rotation status shows it. (#753)
  • GPT-6.1 Terra (gpt-6.1-terra): low…ultra efforts with a low default, picker entries in both config templates, and pricing of $1 / $5 per 1M tokens (cached input $0.05, Fast 2x, 2x input and 1.5x output above 272K input). Before this, a gpt-6.1-terra request silently ran gpt-6.1-sol. With fallbackOnUnsupportedCodexModel enabled, an account without Terra retries gpt-5.6-terra. (#756)
  • Ultrafast pricing: responses billed at the ultrafast tier (gpt-6.1-sol) are priced at the published 6x Standard rate instead of being recorded without a cost. Ultrafast above 272K input stays unpriced. (#756)
  • API regions: codex-multi-auth login --api can pin a credential to the Global or US endpoint (us.api.openai.com). Failover stays within one region, and capability evidence is kept per region. (#749)
  • PSP API pool and model metadata: login --api offers Regular API, ZDR, and PSP (Private Safety Processing) pools, selected explicitly as api/, zdr/, or psp/<model>. Operators can declare Daybreak Red access and reasoning efforts for a model that discovery omits. (#749)

Changed

  • Saved re-logins without a restart: provider routers adopt a saved re-login without another restart, and credential reloads wait for in-flight refresh commits, so a rotated token is never overwritten by an older disk snapshot. Restart an existing router once after upgrading. (#751)
  • Refresh coordination fails closed: refresh-lease acquisition errors and wait timeouts block the refresh instead of sending an uncoordinated one, and expired locks are never stolen. Affected requests return refresh_coordination_unavailable without invalidating the account. A lock left behind by a failed write is removed. (#751)
  • macOS app router managed by launchd: bind-app, unbind-app, and reset-runtime load and unload the LaunchAgent with launchctl instead of only rewriting its plist, so launchd never respawns a router with an outdated identity token. If the router cannot be stopped, these commands, rotation enable, and rotation disable print a warning and a cleanup hint instead of reporting a clean restart. (#748)
  • API WebSocket bridge: quiet upstream responses keep the local bridge alive with a separate upstream-silence deadline, aging API sockets are retired between creates, and genuine upstream failures surface as upstream_websocket_disconnected. (#749)

Fixed

  • Native interrupts: response.interrupt is forwarded to the upstream socket that owns the response and is always answered. Interrupted responses (response.incomplete with reason interrupted, and response.output_item.interrupted) keep the previous_response_id chain intact. (#749, #754)
  • Disabled accounts during refresh: an account disabled while its token refresh was in flight now restarts account selection instead of being used with its old token. (#751)
  • API storage outages: explicit api/, zdr/, and psp/ routes stay available while the OAuth store is temporarily locked (EBUSY, EPERM, EACCES). (#749, #751)

Internal

  • A flaky automatic-API-check test is now deterministic. (#757)