- Usage Dashboard: visual cards with success rate bars, token stats, latency
- Per-model breakdown and error tracking per provider
- Proxy records usage-stats.json after every request
- Google OAuth: browse for client_secret.json instead of fixed path
- Auto-copies selected file to ~/.cache/codex-proxy/
- Exponential backoff retry (2s/4s/8s) for rate limits and transient errors
- BGP routes retry before failing over to next route
- Socket SO_REUSEADDR prevents 'Address already in use' crashes
- Connection reset/broken pipe also retried
- BGP route count shown at proxy startup
- New AI BGP pool manager (create/edit/delete pools)
- Each pool has ordered routes from any configured endpoint
- Failover: tries primary, falls back to next route on error
- Pools appear in endpoint dropdown with shuffle icon
- Pool editor with route add/remove/reorder
- Fixed TOML breakage from multi-line paste
- Added OpenAdapter preset with 0G models
- Two presets: API Key and OAuth modes
- OAuth Login button: full Google OAuth2 flow with auto-refresh
- Auto-refreshes expired access tokens using refresh_token
- Gemini OpenAI-compatible endpoint works with existing proxy
- Models: gemini-2.5-flash, gemini-2.5-pro, gemini-2.0-flash, etc.
- Add Reasoning On/Off toggle and Effort selector in endpoint editor
- Proxy sends enable_thinking=false when reasoning is OFF
- Proxy sends reasoning_effort level when reasoning is ON
- Strip reasoning_content from output, force max_tokens=64000 minimum
- Fixes Crof mimo-v2.5-pro and similar reasoning model token exhaustion
- Strip reasoning_content from proxy output (Codex doesn't use it)
- Force max_tokens=64000 minimum for openai-compat providers
- Prevents models that emit large reasoning from running out of tokens
Instead of just truncating old items, the proxy now auto-compacts
them into a structured summary preserving key context:
- User requests, assistant responses, tool calls made, files touched
- Keeps original query + system messages + last 10 recent items
- 38 items -> 14 items in testing, with summary of dropped turns
- Similar to Claude Code's auto-compact and Codex CLI's /compact
- No extra API calls needed, instant, zero cost
Crof models (mimo, deepseek-v4-pro) return status=incomplete when
tool results contain too much text (e.g. full HTML pages at 8500+ tokens).
Auto-truncate tool outputs exceeding 8000 chars with truncation notice.
Combined with the 30-item conversation trim from previous commit.
Root cause: Codex sends function_call items with id=None, causing
tool_call_id mismatch between tool calls and tool results. Proxy now
resolves IDs by call_id + positional fallback.
Auto-trim: conversations exceeding 30 items are trimmed automatically,
keeping system messages, original user query, and most recent items.
This prevents context overflow on providers with smaller context
windows (Crof mimo-v2.5-pro stops responding at ~40 items).
- Fix None tool IDs in oa_input_to_messages with positional matching
- Auto-trim input to 30 items max (keeps head + tail)
- Add request/response logging to ~/.cache/codex-proxy/requests.log
- Proxy stderr visible in launcher terminal for debugging
- v2.1.2
Codex Desktop uses previous_response_id to chain conversation turns.
Without storing and resolving these, the proxy sent only the new
function_call_output to upstream providers, missing the original user
message and assistant tool call. This caused Crof.ai (and any provider
using tool calls) to stop after the first response.
- Add in-memory response store (50 entry LRU) keyed by response ID
- resolve_previous_response() reconstructs full input chain on multi-turn
- Fix orphan message output item when response has only tool calls
- Applies to all backends: openai-compat, anthropic, command-code
- v2.1.2
- Detects codex CLI (via 'which codex' + --version) and Desktop (via /opt/codex-desktop/start.sh)
- Shows green ✔ or yellow ✘ status bar on main page
- 'Install' button opens guide dialog with install commands
- Desktop/CLI launch buttons disabled when corresponding tool is missing
- Dependency status logged on startup
- _set_busy respects missing-state (won't re-enable disabled buttons)
- Rebuilt .deb as v2.0.1
- Added CHANGELOG constant to launcher with version history
- Added 'Changelog' button to header bar (opens formatted dialog)
- Title bar now shows version number (v2.0.0)
- Added CHANGELOG.md to repo root
- Rebuilt .deb with latest sources