github diegosouzapw/OmniRoute v3.5.4

10 hours ago

✨ New Features

  • Detailed Token Tracking: Added granular token breakdown columns (cache read, cache write, reasoning) to call logs with proper null vs zero distinction. Includes DB migration 018 and 5-label UI display per provider capability (#1017 — thanks @rdself).
  • Legacy JSON Config Import/Export: Restored JSON-based settings export and import for migration from legacy 9router configurations. Security-hardened with Zero-Trust redaction of passwords and requireLogin fields, and automatic pre-import database backups (#1012 — thanks @luandiasrj).
  • Non-Stream Aliases: Added API support for explicit non-streaming aliases (non_stream, disable_stream, disable_streaming, streaming=false), normalized at the boundary before provider translation (#1036 — thanks @wlfonseca).
  • Russian Dashboard Localization: Comprehensive Russian translation for the dashboard UI, including fixes for 2 Ukrainian locale keys (#1003 — thanks @mercs2910).

🐛 Bug Fixes

  • Anthropic Streaming Input Undercount: Fixed a critical bug where Anthropic streaming prompt_tokens only reported non-cached tokens (e.g., in=3 when actual total was 113,616). Cache tokens are now summed into prompt_tokens during streaming (#1017).
  • Built-in Responses API Tool Types: Preserved built-in Responses API tools (web_search, file_search, computer, code_interpreter, image_generation) from being silently stripped by the empty-name tool filter — these tools carry no .name field (#1014 — thanks @rdself).
  • Cursor/Codex Responses Compatibility: Fixed empty output in Cursor when using Codex models by hoisting system input items to instructions, sanitizing invalid tool names, and detecting Responses-format payloads on chat/completions endpoint (#1002 — thanks @mercs2910).
  • OAuth Token Expiry Display: Fixed OAuth connections showing "expired" badge even with valid tokens by reading tokenExpiresAt (updated on refresh) instead of expiresAt (original grant timestamp) (#1032 — thanks @tombii).
  • Codex Fast-Tier Copy: Corrected dashboard settings copy from service_tier=fast to service_tier=priority, matching the actual Codex wire format (#1045 — thanks @kfiramar).
  • macOS Desktop App Startup: Stabilized packaged macOS app launch by excluding desktop artifacts from the standalone bundle and improving launch path detection (#1004 — thanks @mercs2910).
  • macOS Sidebar Layout: Fixed macOS traffic light overlap, sidebar spacing, and button overflow in the Electron desktop app (#1001 — thanks @mercs2910).

⚡ Performance

  • Analytics Page Load: Dramatically reduced analytics page load times (30s→1-2s for 50K entries) via date-filtered DB queries, parallel Promise.all() cost calculations, and merged 6 COUNT queries into a single CASE WHEN aggregate (#1038 — thanks @oyi77).

🔒 Security & Dependencies

  • Node Base Image: Upgraded Docker base from 22-bookworm-slim to 22.22.2-trixie-slim (#1011 — Snyk).
  • Production Dependencies: Bumped 5 production dependencies (#1044 — Dependabot).
  • Vite: Bumped from 8.0.3 to 8.0.5 (#1031 — Dependabot).
  • Development Dependencies: Bumped 4 development dependencies (#1030 — Dependabot).

🧪 Tests

  • Token Accounting Tests: Added 18 new unit tests covering detailed token breakdown, null vs zero semantics, per-provider token extraction, and Anthropic streaming input fix (#1017).
  • Built-in Tool Tests: Added 3 new test cases for built-in Responses API tool type preservation (#1014).
  • ChatCore Sanitization: Updated sanitization tests to accommodate Responses format detection (PR #1002) and built-in tool preservation (PR #1014).

🛠️ Maintenance

  • PR Workflow: Updated /review-prs workflow to merge PRs into the release branch (release/vX.Y.Z) instead of directly into main, ensuring proper pre-release staging.

Coverage

  • 2537 tests, 2532 passing — Statement coverage: 91.95%, Branch coverage: 78.79%, Function coverage: 93.19%

What's Changed

  • [Snyk] Security upgrade node from 22-bookworm-slim to 22.22.2-trixie-slim by @diegosouzapw in #1011
  • deps: bump the production group across 1 directory with 5 updates by @dependabot[bot] in #1044
  • deps: bump vite from 8.0.3 to 8.0.5 by @dependabot[bot] in #1031
  • deps: bump the development group with 4 updates by @dependabot[bot] in #1030
  • fix: preserve built-in Responses API tool types in empty-name filter by @rdself in #1014
  • feat: detailed token tracking + fix Anthropic input undercount by @rdself in #1017
  • fix(ui): use tokenExpiresAt for OAuth token expiry display by @tombii in #1032
  • feat(api): aceitar aliases explícitos para resposta sem stream by @wlfonseca in #1036
  • perf: reduce analytics page load — DB filter, parallel costs, merged queries by @oyi77 in #1038
  • feat: restore legacy JSON config import/export by @luandiasrj in #1012
  • fix(settings): align Codex fast-tier copy with the actual wire value by @kfiramar in #1045
  • fix(codex): improve Cursor/Codex Responses compatibility by @mercs2910 in #1002
  • feat(i18n): add Russian dashboard localization by @mercs2910 in #1003
  • fix(desktop): stabilize packaged app startup on macOS by @mercs2910 in #1004
  • chore(release): v3.5.4 by @diegosouzapw in #1052

New Contributors

Full Changelog: v3.5.3...v3.5.4

Don't miss a new OmniRoute release

NewReleases is sending notifications on new releases.