diff --git a/CHANGELOG.md b/CHANGELOG.md index 60ac81c4d9..5db91068cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,32 +8,60 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ## [Unreleased] +--- + +## [0.5.0] — 2026-02-15 + +Dashboard refinements, LLM evaluation framework, combo strategies expansion, and UI/UX polish. + ### Added +#### Dashboard & UI + +- **Shared UI Component Library** — Refactored dashboard with reusable component architecture +- **ModelAvailabilityBadge** — New component showing model availability status per provider +- **Landing Page Retheme** — Visual refresh with updated color palette and modern aesthetic +- **Providers Overview Modal** — Click provider cards to view available models with copy-to-clipboard + +#### Combo Strategies + +- **Random Strategy** — Random model selection for even distribution +- **Least-Used Strategy** — Routes to the least recently used model using combo metrics +- **Cost-Optimized Strategy** — Leverages pricing infrastructure to route to cheapest available model + +#### LLM Evaluations + +- **Golden Set Testing** — Built-in evaluation framework with 10 test cases +- **API Key Integration** — EvalsTab now makes real LLM calls through the proxy endpoint +- **Provider Alias Filtering** — Enhanced model filtering with provider-aware aliases +- **4 Match Strategies** — exact, contains, regex, and custom JS function evaluation + #### Phase 5 — Foundation & Security -- **Domain State Persistence** — SQLite-backed persistence for 4 domain modules (fallback chains, budgets, cost history, lockout state, circuit breakers) via `domainState.js` with 5 new tables in `core.js` -- **Write-Through Cache** — `fallbackPolicy.js`, `costRules.js`, `lockoutPolicy.js`, and `circuitBreaker.js` now use in-memory Map + SQLite write-through for state survival across restarts -- **Race Condition Fix** — `route.js` `ensureInitialized()` replaced boolean flag with Promise-based singleton to prevent parallel initialization +- **Domain State Persistence** — SQLite-backed persistence for 4 domain modules via `domainState.js` +- **Write-Through Cache** — In-memory Map + SQLite write-through for state survival across restarts +- **Race Condition Fix** — `route.js` `ensureInitialized()` with Promise-based singleton #### Phase 6 — Architecture Refactoring -- **OAuth Provider Extraction** — Monolithic `providers.js` (1051 → 144 lines) split into 12 individual modules under `src/lib/oauth/providers/` with a thin wrapper + registry index -- **Policy Engine** — Centralized request evaluation against lockout, budget, and fallback policies (`policyEngine.js`) with `evaluateRequest()` and `evaluateFirstAllowed()` entry points -- **Deterministic Round-Robin** — `comboResolver.js` now uses persistent `Map` counter per combo instead of time-based modulo -- **Telemetry Window Accuracy** — `requestTelemetry.js` now adds `recordedAt` timestamps to history entries and accurately filters by `windowMs` +- **OAuth Provider Extraction** — `providers.js` (1051 → 144 lines) split into 12 modules +- **Policy Engine** — Centralized request evaluation (`policyEngine.js`) +- **Deterministic Round-Robin** — Persistent counter per combo +- **Telemetry Window Accuracy** — `recordedAt` timestamps with accurate `windowMs` filtering #### Tests -- 22 new tests: `domain-persistence.test.mjs` (16 tests), `policy-engine.test.mjs` (6 tests) -- Test isolation fix for `observability-fase04.test.mjs` — unique CircuitBreaker names prevent DB state bleed +- 22 new tests: `domain-persistence.test.mjs` (16), `policy-engine.test.mjs` (6) - Total: **295+ tests passing** (up from 273 in v0.3.0) ### Fixed -- **Proxy decoupling** — `proxy.js` no longer self-fetches `/api/settings`; imports `getSettings()` directly from `localDb` -- **Default password** — `.env.example` `INITIAL_PASSWORD` changed from `123456` → `CHANGEME` -- **Server init error handling** — `server-init.js` now uses `console.error` + `process.exit(1)` instead of silent `console.log` +- **Proxy decoupling** — `proxy.js` imports `getSettings()` directly from `localDb` +- **Default password** — `.env.example` `INITIAL_PASSWORD` changed to `CHANGEME` +- **Server init error handling** — `server-init.js` uses `console.error` + `process.exit(1)` +- **Chat completions TypeError** — Fixed `ensureInitialized` error in API route +- **Evals Tab** — Fixed case count display and added real LLM call integration +- **Routing Tab** — Removed deprecated random strategy option --- diff --git a/README.md b/README.md index 3ca6b718a8..a3dd6734f0 100644 --- a/README.md +++ b/README.md @@ -255,7 +255,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines. ```bash # Create a release — npm publish happens automatically -gh release create v0.4.0 --title "v0.4.0" --generate-notes +gh release create v0.5.0 --title "v0.5.0" --generate-notes ``` --- diff --git a/docs/openapi.yaml b/docs/openapi.yaml index 10bb1ca67a..b04c81b4d8 100644 --- a/docs/openapi.yaml +++ b/docs/openapi.yaml @@ -1,7 +1,7 @@ openapi: 3.1.0 info: title: OmniRoute API - version: 0.4.0 + version: 0.5.0 description: | OmniRoute is a local-first AI API proxy router. It provides an OpenAI-compatible endpoint that routes requests to multiple AI providers with load balancing, diff --git a/package-lock.json b/package-lock.json index f5508831c9..ecae7ab2f8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "omniroute", - "version": "0.4.0", + "version": "0.5.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "omniroute", - "version": "0.4.0", + "version": "0.5.0", "license": "MIT", "workspaces": [ "open-sse" @@ -39,7 +39,8 @@ "zustand": "^5.0.10" }, "bin": { - "omniroute": "bin/omniroute.mjs" + "omniroute": "bin/omniroute.mjs", + "omniroute-reset-password": "bin/reset-password.mjs" }, "devDependencies": { "@playwright/test": "^1.58.2", diff --git a/package.json b/package.json index 2f3979aac5..d63ceb960c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "omniroute", - "version": "0.4.0", + "version": "0.5.0", "description": "Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.", "type": "module", "bin": {