Skip to content

Releases: tuxevil/tuxevil-rotator

v3.7.0 - Audio transcription and live streaming

Choose a tag to compare

@tuxevil tuxevil released this 07 Sep 17:09

What's Changed

  • feat(audio): add OpenAI audio transcription endpoint and live streaming proxy by @javargasm in #33

Full Changelog: v3.6.1...v3.7.0

v3.6.1 - Quota pool reconciliation

Choose a tag to compare

@tuxevil tuxevil released this 05 Sep 15:44

Patch release focused on Google quota-state reconciliation.

Fixed

  • Reset-only quota entries are treated as exhausted instead of being discarded.
  • Partial quota snapshots preserve omitted pools from the last known-good state.
  • Claude and Gemini cooldowns reconcile independently and honor fresh provider reset deadlines.

Included

  • Effort-based model routing from #32.

See CHANGELOG.md for details.

v3.6.0 - Dynamic catalog hardening and partial model specification overrides

Choose a tag to compare

@tuxevil tuxevil released this 04 Sep 13:17

Highlights:\n\n- Dynamic Antigravity model ownership and quota-state persistence hardening (PR #30, contributed by @javargasm).\n- Partial modelSpecs overrides now survive configuration normalization and persistence, including context-window lookups (PR #31, contributed by @javargasm).\n\nSee CHANGELOG.md for the complete change list.

v3.5.0

Choose a tag to compare

@tuxevil tuxevil released this 03 Sep 17:46

Highlights

  • Added live Antigravity model discovery from successful quota polls, including dynamic model metadata, account availability, and per-account routing (#29 by @javargasm).
  • Added dynamic catalog safety for retired model IDs, operator modelSpecs overrides, full account identity keys, and removed-model routing (#29 by @javargasm).

Thanks to @javargasm for #29 and to @CyR1en for the Gemini 3.8 Flash work in #28.

v3.4.0 - Gemini 3.8 Flash support

Choose a tag to compare

@tuxevil tuxevil released this 03 Sep 12:36

Highlights

  • Added native Gemini 3.8 Flash support for gemini-3.8-flash-high, gemini-3.8-flash-medium, and gemini-3.8-flash-low.
  • Added 1M-token context limits, 65,536-token output limits, pricing, quota routing, dashboard visualization, telemetry, model discovery, and integration documentation.
  • Updated the default Antigravity client version to 2.11.0.
  • Removed Gemini 3.5 Flash from the user-facing catalog and defaults to match Antigravity 2.11.

Contributors

Thank you to @CyR1en for the Gemini 3.8 Flash implementation and regression coverage in PR #28.

npm publishing

This release is ready for npm publication as tuxevil-rotator@3.4.0. The package metadata and lockfile are aligned, and npm pack --dry-run was verified. Run npm publish when ready.

v3.3.2

Choose a tag to compare

@tuxevil tuxevil released this 28 Aug 15:28

Fixed

  • Model-scoped Antigravity cooldowns: RESOURCE_EXHAUSTED 429s now cool only the exhausted Claude or Gemini pool; sibling pools on the same account remain routable immediately (#26 by @javargasm).
  • Explicit reset duration honored on RESOURCE_EXHAUSTED: The rotator parses Resets in Xh Ym Zs from Antigravity error messages and applies that exact cooldown instead of the generic 30-minute cap. Falls back to 30 minutes when no duration is present (#26 by @javargasm).
  • Persisted Antigravity pool deadlines survive restarts: claude and gemini cooldown deadlines are no longer truncated to 30 minutes on startup; only generic model cooldowns are capped (#26 by @javargasm).
  • Untouched 100% pools show idle instead of a fake countdown: When Google reports remainingFraction >= 1 the reset timestamp is discarded and the pool renders as idle with no timer (#26 by @javargasm).
  • RAW POLL reconciliation of exhausted pool deadlines: A successful quota poll reporting 0% with a valid future reset replaces the stale cooldown deadline for that pool; invalid, past, or unchanged resets are ignored (#26 by @javargasm).
  • Serialized per-account quota polling with trailing repoll: Overlapping pollAccountQuota calls for the same account queue a single trailing repoll instead of running concurrently; pollAllQuotas is now single-flighted (#26 by @javargasm).
  • gpt-oss:20b kickstarts routed through Ollama: On multi-provider accounts (Google + Ollama), the kickstart for the Ollama session pool is correctly sent to the Ollama endpoint with the Ollama API key (#26 by @javargasm).
  • Kickstart actions hidden for disabled/flagged accounts: The dashboard no longer renders ▶ Start or Start Idle Timers buttons for accounts that are not eligible for kickstart (#26 by @javargasm).
  • gemini-3.7-flash-tiered added to OpenCode integration docs: Context window updated to 1,000,000 tokens; set as the recommended default model (#26 by @javargasm).
  • CodeQL security fixes: Strip internal error details from kickstart HTTP error responses (stack-trace exposure); annotate credentialFingerprint SHA-256 as a non-password deduplication hash.

v3.3.1

Choose a tag to compare

@tuxevil tuxevil released this 27 Aug 12:50

Fixed

  • Admin token propagation on hosted login: Propagate the configured admin token to the "Continue With Google" link on the /login landing page, preventing a 401 Unauthorized error when navigating to /auth/antigravity/start (#25 by @CelestialCreator).

Full Changelog: v3.3.0...v3.3.1

v3.3.0 - feat: queued multi-request Antigravity pooling (5x5 concurrent streams)

Choose a tag to compare

@tuxevil tuxevil released this 24 Aug 12:38

What's New in v3.3.0

Queued Multi-Request Antigravity Pooling (5×5 Concurrent Streams)

  • High Concurrency Capacity: Allows up to 5 concurrent Antigravity streams per account across model pools, with a 25-stream total across 5 accounts. Requests are distributed breadth-first by total account load across mixed Gemini and Claude traffic (#24 by @javargasm).
  • Config Defaults: maxConcurrentRequestsPerAccount and maxConcurrentRequestsPerProjectModel defaults raised from 1 to 5.

Process-Local Strict FIFO Request Queue

  • Queue Overflow Handling: Requests exceeding total pool capacity wait in a strict FIFO queue with automatic 300-second expiration (#24 by @javargasm).
  • Disconnect Cancellation: Client disconnects before admission abort immediately via AbortSignal, preventing lease leaks.
  • Immediate Wakeups: Enqueued requests automatically wake up upon lease releases, cooldown expiries, circuit-breaker resets, catalog additions, or config reloads.

Dashboard Concurrency Metrics

  • Account cards on the web dashboard display active vs. max concurrency (e.g. Concurrency: 3/5) for Google Antigravity accounts (#24 by @javargasm).

Canonical Project ID Resolution

  • Unified resolution of projectId across forwarding, quota polling, Code Assist passthrough, and admission gating, safely sanitizing whitespace and prioritizing nested credentials over legacy fields (#24 by @javargasm).

v3.2.3 - fix: 429 quota resilience, token refresh isolation, and concurrency safety

Choose a tag to compare

@tuxevil tuxevil released this 21 Aug 20:08

What's Fixed

Account-Scoped 429 RESOURCE_EXHAUSTED Recovery

  • When an individual account exhausts its quota (returning 429 RESOURCE_EXHAUSTED on Claude or Gemini), the proxy now safely releases the failed account before rotating, allowing immediate retry with the next eligible account in the pool instead of failing prematurely (#23 by @javargasm).

Synchronous Account Leasing & Atomic Concurrency Accounting

  • inFlightRequests reservation and model assignment tracking now occur synchronously and indivisibly at lease time before asynchronous save or refresh operations. If activation fails, in-flight counters are rolled back and token buckets are refunded immediately (#23 by @javargasm).

Snapshot-Based Token Refresh & Generation Tracking

  • Provider token refreshes execute against isolated account snapshot clones. Refreshed tokens are published only if the credential generation has not changed during flight, cleanly discarding stale tokens if credentials were reconfigured (#23 by @javargasm).

Provider-Scoped Token Publication

  • Token refreshes for multi-provider accounts (e.g. Google Antigravity + OpenAI Codex) now update strictly provider-owned fields, preventing cross-provider token and credential overwrites (#23 by @javargasm).

Identity Resolution with Non-Secret Credential Fingerprinting

  • Duplicate-email accounts without stable provider IDs are resolved using a 12-character SHA-256 non-secret credential fingerprint, isolating runtime state during replaceConfig (#23 by @javargasm).

Exact Incarnation Exclusion on Retry

  • rotateToNext(model, failedAccount) binds exclusion strictly to the exact runtime object instance, preventing false 503 errors when an account is replaced by a healthy incarnation (#23 by @javargasm).

v3.2.2 - fix: spend-logger memory leak, CTE idempotency, and virtual key cache bounding

Choose a tag to compare

@tuxevil tuxevil released this 21 Aug 12:09

What's Changed

This release resolves a critical memory leak in file-based storage mode, introduces atomic and idempotent PostgreSQL spend log tracking via CTEs, bounds the virtual-key in-memory cache, and surfaces official per-model context windows.

Fixed

  • Spend-logger memory leak in file-based storage mode: When running without PostgreSQL, flushSpendLogs() returned early without draining the spend log queue, leading to unbounded heap memory accumulation. logSpend() now short-circuits and clears queue when PostgreSQL is not configured (#22 by @javargasm).
  • Atomic PostgreSQL spend log insert & daily aggregation via CTE: Combined rotator_spend_logs insert and rotator_daily_spend upsert into a single atomic Common Table Expression query. Re-attempted inserts with existing request_id values produce 0 rows from ins_log, guaranteeing strict idempotency without double-counting on retries. On DB errors, only uncommitted logs are re-enqueued under a strict FIFO cap (MAX_QUEUE_CAP = 100) (#22 by @javargasm).
  • Virtual Key cache bounded: Added KEY_CACHE_MAX = 500 with 1-minute TTL and FIFO eviction to keyCache in src/virtual-keys.ts, preventing memory exhaustion from negative lookup caching and key scanning (#22 by @javargasm).
  • /v1/models no longer reports the outdated 500K Claude context window.

Added

  • Official per-model context windows surfaced across providers: Published upstream context windows for Claude (Opus 4.6 / Sonnet 4.6 → 1M, Opus 4.5 / Sonnet 4.5 → 200K), Google Gemini (3.1 Pro, 3 Pro, 3 Flash variants, 2.5 Pro/Flash → 1M each), and gpt-oss-120b (131,072) via src/providers/google-antigravity/catalog.ts.
  • /api/show lookup for Ollama model context windows: Dynamic context length lookup from Ollama.
  • ModelSpec.contextWindow: Context window spec exposed across /v1/models endpoints.

Changed

  • OpenAI Codex catalog updated to GPT-5.6 family official 1.05M window.
  • OpenCode Zen catalog exposes per-model context helper.
  • Claude Opus 4.6 / Sonnet 4.6 context window in MODEL_CATALOG raised to 1M.

Full changelog: https://github.com/tuxevil/tuxevil-rotator/blob/main/CHANGELOG.md