Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
881f593
chore: bump version to 3.7.0
diegosouzapw Apr 20, 2026
77f326e
fix(dashboard): correct TOML round-trip corruption in codex config se…
benzntech Apr 20, 2026
d6cbdc1
feat: add ModelScope provider with circuit breaker and daily quota lo…
clousky2020 Apr 20, 2026
333f0b9
chore(release): v3.7.0 — all changes in ONE commit
diegosouzapw Apr 20, 2026
bfe6415
chore(workflow): clarify release version parity and changelog segrega…
diegosouzapw Apr 20, 2026
9311f2a
docs(changelog): add missing security fixes 163 and 164 to 3.7.0 notes
diegosouzapw Apr 20, 2026
bd5dd7c
docs(i18n): improve Ukrainian (uk-UA) translation quality
andruwa13 Apr 20, 2026
a2a7eb5
docs(i18n): fix Ukrainian translation issues from PR review
andruwa13 Apr 20, 2026
3245779
Apply suggestion from @gemini-code-assist[bot]
andruwa13 Apr 20, 2026
eaa74af
Merge remote-tracking branch 'origin/docs/uk-ua-translation-improveme…
andruwa13 Apr 20, 2026
b38e57d
refactor: unify resilience controls (#1449)
rdself Apr 21, 2026
1d3d99b
fix(combo): resolve cross-provider thinking 400 and http clipboard (#…
diegosouzapw Apr 21, 2026
20f0457
fix: resolve skills, memory, and encryption system issues (#1456)
oyi77 Apr 21, 2026
ceca26a
fix(encryption): return null on decryption failure to prevent sending…
oyi77 Apr 21, 2026
496114a
fix(sse): enable tool calling for GPT OSS and DeepSeek Reasoner model…
Tasogarre Apr 21, 2026
d19b8d8
deps: bump the production group with 4 updates (#1463)
dependabot[bot] Apr 21, 2026
9754b04
deps: bump the development group with 4 updates (#1464)
dependabot[bot] Apr 21, 2026
cde6f56
Merge release/v3.7.0 into translation branch and resolve conflicts
diegosouzapw Apr 21, 2026
0c24ab4
✅ test(settings-api): add test harness for proper isolation
clousky2020 Apr 20, 2026
3478dea
♻️ refactor(fallback): make provider failure thresholds configurable
clousky2020 Apr 20, 2026
a389f26
fix(fallback): merge new provider failure threshold fields in profile
clousky2020 Apr 20, 2026
0d86244
fix: address PR review comments
clousky2020 Apr 20, 2026
3834768
feat(providers): add lm studio and grok 4.3 support
diegosouzapw Apr 21, 2026
f651a27
🐛 fix(providers): add optional chaining to connection object
clousky2020 Apr 21, 2026
96d0f57
feat: auto-inject stream_options.include_usage for OpenAI format stre…
diegosouzapw Apr 21, 2026
25e22df
chore(release): v3.7.0 — finalization
diegosouzapw Apr 21, 2026
1dae161
Merge remote-tracking branch 'origin/release/v3.7.0' into release/v3.7.0
diegosouzapw Apr 21, 2026
76b0f07
Merge pull request #1473 from clousky2020/provider
diegosouzapw Apr 21, 2026
03769eb
feat: add support for OpenAI batch processing
hartmark Apr 21, 2026
3502c5a
fix(fallback): use shared CircuitBreaker instead of undefined constan…
clousky2020 Apr 21, 2026
9cd36af
fix(codex): preserve namespace MCP tools forwarded to Codex Responses…
vanminhph Apr 21, 2026
de1bea8
fix: deduplicate case-variant anthropic-version header in Claude Code…
uwuclxdy Apr 21, 2026
495ca29
docs: add Arch Linux AUR install notes (#1478)
JasonLandbridge Apr 21, 2026
0d852ab
fix: restore local test fixes for encryption and resilience
diegosouzapw Apr 21, 2026
2e36599
fix: resolve code rebase issues
hartmark Apr 21, 2026
b925be2
fix: update prompt injection test for fail-closed policy
diegosouzapw Apr 21, 2026
b709dca
feat(vision-bridge): add automatic image description fallback for non…
herjarsa Apr 21, 2026
8bb1c83
chore: merge release/v3.7.0
diegosouzapw Apr 21, 2026
56608a4
feat(ui): add batch processing dashboard page and translations
diegosouzapw Apr 21, 2026
0937c5a
chore(release): v3.7.0 — final integration of batch ui and versions
diegosouzapw Apr 21, 2026
a7d30d9
test: isolate batch API unit tests with temp DATA_DIR to prevent sche…
diegosouzapw Apr 21, 2026
a94359c
fix: add batch item dispatching to specific handlers based on URL
hartmark Apr 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 24 additions & 10 deletions .agents/workflows/generate-release.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,19 +52,19 @@ Before creating the release, you must ensure the codebase and supply chain are s
git checkout -b release/v2.x.y
```

### 2. Determine new version
### 2. Determine and sync version

Check current version in `package.json` and increment the **patch** number only:
Check current version in `package.json`:

```bash
grep '"version"' package.json
```

Version format: `2.x.y` — examples:

- `2.1.2` → `2.1.3` (patch)
- `2.1.9` → `2.1.10` (patch)
- `2.1.10` → `2.2.0` (minor threshold — do manually with `sed`)
> **🔴 BRANCH-VERSION PARITY RULE**: The logical version in `package.json` MUST exactly match the release branch name. For example, if you are on `release/v3.7.0`, the version in `package.json` MUST be `3.7.0`.
>
> - If this is the FIRST time generating a release for a new minor/major branch (e.g., bumping from 3.6.9 to 3.7.0), you MUST ensure the version is bumped to match the new branch logic.
> - If you are just bumping a patch on the current branch (e.g., 3.6.9 to 3.6.10), use:
> `npm version patch --no-git-tag-version`

> **⚠️ ATOMIC COMMIT RULE — Version bump MUST happen before committing feature files.**
>
Expand Down Expand Up @@ -97,15 +97,29 @@ npm install

### 4. Finalize CHANGELOG.md

Replace `[Unreleased]` header with the new version and date.
Keep an empty `## [Unreleased]` section above it.
> **🔴 NO MIXUPS RULE**: Ensure you do NOT mix the backlog of the previous version with the new one. The new version section must ONLY contain the features and fixes for the current release.

Replace the `[Unreleased]` header with the new version and date.
Keep an empty `## [Unreleased]` section above it, separated by a horizontal rule (`---`).

```markdown
## [Unreleased]

---

## [2.x.y] — YYYY-MM-DD
## [3.7.0] — 2026-04-19

### ✨ New Features

- ...

### 🐛 Bug Fixes

- ...

---

## [3.6.9] — 2026-04-19
```

### 5. Update openapi.yaml version ⚠️ MANDATORY
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -176,3 +176,6 @@ bin/omniroute.mjs
.omc/
audit-report.json
bun.lock

# Private environment variables for .http-client
http-client.private.env.json
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,24 @@

---

## [3.7.0] — 2026-04-21

### ✨ New Features

- **feat(providers):** Add ModelScope provider (Chinese AI marketplace) with Kimi K2.5, GLM-5, and Step-3.5-Flash integration. (#1430)
- **feat(core):** Implement provider-level Circuit Breaker to prevent cascading failures across connections, enforcing a 10-minute cooldown after 5 consecutive transient failures. (#1430)
- **feat(core):** Add daily quota exhaustion lock to detect "quota exceeded" signals and lock the specific model until midnight. (#1430)
- **feat(core):** Auto-inject `stream_options.include_usage = true` for OpenAI format streams to guarantee token usage is reported correctly during streaming. (#1423)
- **feat(dashboard):** Introduce real-time model status badges with countdown timers in the provider detail and combo panel interfaces. (#1430)
- **feat(dashboard):** Add Batch/File management data grid to the Dashboard. (#1479)

### 🐛 Bug Fixes

- **fix(dashboard):** Correct TOML round-trip corruption in Codex config serializer by dequoting keys and preserving array/boolean structures properly. (#1438)
- **fix(security):** Resolve CodeQL alert 164 (ReDoS in extraction) and 163 (incomplete URL sanitization) (#163, #164)

---

## [3.6.9] — 2026-04-19

### ✨ New Features
Expand Down
79 changes: 46 additions & 33 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -324,12 +324,13 @@ AI providers can become unstable, return 5xx errors, or hit temporary rate limit

**How OmniRoute solves it:**

- **Settings-Driven Lock Hierarchy** — Provider profiles control default account/model lockouts, global model quarantine, and provider circuit breakers from one control surface, while explicit upstream `Retry-After` windows still take priority
- **Exponential Backoff** — Progressive retry delays for both account/model lockouts and higher-level quarantine
- **Request Queue & Pacing** — Per-connection request buckets smooth bursts before they hit upstream rate caps
- **Connection Cooldown** — A single connection cools down after retryable failures with optional upstream `Retry-After` hints and exponential backoff
- **Provider Circuit Breaker** — The provider only trips after fallback is exhausted and the provider request still fails with provider-wide transient errors; connection-scoped `429` rate limits stay in Connection Cooldown
- **Wait For Cooldown** — The server can wait for the earliest connection cooldown to expire and retry the same client request automatically
- **Anti-Thundering Herd** — Mutex + semaphore protection against concurrent retry storms
- **Combo Fallback Chains** — If the primary provider fails, automatically falls through the chain with no intervention
- **Combo Circuit Breaker** — Auto-disables failing providers within a combo chain
- **Health Dashboard** — Uptime monitoring, circuit breaker states, lockouts, cache stats, p50/p95/p99 latency
- **Health Dashboard** — Uptime monitoring, provider circuit breaker states, cooldowns, cache stats, p50/p95/p99 latency

</details>

Expand Down Expand Up @@ -470,7 +471,7 @@ As request volume grows, without caching the same questions generate duplicate c
- **Semantic Cache** — Two-tier cache (signature + semantic) reduces cost and latency
- **Request Idempotency** — 5s deduplication window for identical requests
- **Rate Limit Detection** — Per-provider RPM, min gap, and max concurrent tracking
- **Editable Rate Limits** — Configurable defaults in Settings → Resilience with persistence
- **Request Queue & Pacing** — Configurable queue, pacing, and concurrency defaults in Settings → Resilience
- **API Key Validation Cache** — 3-tier cache for production performance
- **Health Dashboard with Telemetry** — p50/p95/p99 latency, cache stats, uptime

Expand Down Expand Up @@ -567,8 +568,8 @@ Teams need quick runtime changes during incidents or cost events.
**How OmniRoute solves it:**

- Switch combo activation directly from MCP dashboard
- Apply resilience profiles from pre-defined policy packs
- Reset circuit breaker state from the same operations panel
- Tune queue, cooldown, breaker, and wait settings from the dedicated Resilience page
- Review live provider breaker state from the Health dashboard

</details>

Expand Down Expand Up @@ -774,6 +775,15 @@ omniroute

Dashboard opens at `http://localhost:20128` and API base URL is `http://localhost:20128/v1`.

#### Arch Linux (AUR)

Arch Linux users can install the [AUR package](https://aur.archlinux.org/packages/omniroute-bin), which installs OmniRoute and provides a systemd user service:

```bash
yay -S omniroute-bin
systemctl --user enable --now omniroute.service
```

| Command | Description |
| ----------------------- | ----------------------------------------------------------- |
| `omniroute` | Start server (`PORT=20128`, API and dashboard on same port) |
Expand Down Expand Up @@ -1352,7 +1362,7 @@ OmniRoute v3.6 is built as an operational platform, not just a relay proxy.
| 🔢 **Hybrid Token Counting** | Uses provider-side `/messages/count_tokens` when available; falls back to estimation — accurate usage tracking without guessing |
| 🌱 **Model Alias Auto-Seed** | 30+ cross-proxy dialect aliases normalised at startup — no more routing mismatches |
| 🛡️ **Safe Outbound Fetch** | All provider validation and model discovery go through a guarded fetch layer blocking private/local URLs with retry, timeout, and SSRF protection |
| 🔄 **Cooldown-Aware Retries** | Chat requests auto-retry on model-scoped cooldowns with configurable `requestRetry` and `maxRetryIntervalSec` |
| ⏳ **Wait For Cooldown** | Server-side chat retries when every candidate connection is cooling down; configurable `enabled`, `maxRetries`, and `maxRetryWaitSec` |
| 🔍 **Runtime Env Validation** | Startup validates all env vars with Zod schemas — clear errors for missing secrets, invalid URLs, or wrong types |
| 📋 **Compliance Audit Expansion** | Structured audit logs with pagination, request context, auth events, provider CRUD events, and SSRF-blocked validation logging |
| 🔐 **TPS Log Metric** | Log details modal shows Tokens Per Second (TPS) — quick performance at-a-glance for every request |
Expand Down Expand Up @@ -1406,7 +1416,7 @@ OmniRoute v3.6 is built as an operational platform, not just a relay proxy.
| 📡 **A2A Task Lifecycle Management** | List/filter tasks, inspect events/artifacts, cancel running tasks |
| 📋 **Agent Card Discovery** | `/.well-known/agent.json` for client auto-discovery |
| 🧪 **Protocol E2E Test Harness** | Real MCP SDK + A2A client flows in `test:protocols:e2e` |
| ⚙️ **Operational Controls** | Switch combo, apply resilience profiles, reset breakers from one control surface |
| ⚙️ **Operational Controls** | Switch combos, tune resilience settings, and review breaker state from dedicated Health and Settings surfaces |

### 🧠 Routing & Intelligence

Expand Down Expand Up @@ -1446,35 +1456,38 @@ OmniRoute v3.6 is built as an operational platform, not just a relay proxy.

### 🛡️ Resilience, Security & Governance

| Feature | What It Does |
| ----------------------------------- | --------------------------------------------------------------------------------------- |
| 🔌 **Circuit Breakers** | Per-model trip/recover with threshold controls |
| 🎯 **Endpoint-Aware Models** | Custom models declare supported endpoints + API format |
| 🛡️ **Anti-Thundering Herd** | Mutex + semaphore protections on retry/rate events |
| 🧠 **Semantic + Signature Cache** | Cost/latency reduction with two cache layers |
| ⚡ **Request Idempotency** | Duplicate protection window |
| 🔒 **TLS Fingerprint Spoofing** | Browser-like TLS fingerprint — **reduces bot detection and account flagging** |
| 🔏 **CLI Fingerprint Matching** | Matches native CLI request signatures — **reduces ban risk while preserving proxy IP** |
| 🌐 **IP Filtering** | Allowlist/blocklist control for exposed deployments |
| 📊 **Editable Rate Limits** | Configurable global/provider-level limits with persistence |
| 📉 **Graceful Degradation** | Multi-layer capability fallbacks protecting core gateway operations |
| 📜 **Config Audit Trail** | Diff-based change tracking preventing operational drift with simple rollbacks |
| ⏳ **Provider Health Sync** | Proactive token expiration monitoring triggering alerts before authorization failures |
| 🚪 **Auto-Disable Banned Accounts** | Operational circuit breaker sealing permanently blocked token accounts automatically |
| 🔑 **API Key Management + Scoping** | Secure key issuance/rotation and model/provider controls |
| 👁️ **Scoped API Key Reveal** 🆕 | Opt-in recovery of API keys via `ALLOW_API_KEY_REVEAL` |
| 🛡️ **Protected `/models`** | Optional auth gating and provider hiding for model catalog |
| 🛡️ **Safe Outbound Fetch** 🆕 | Guarded fetch for provider calls — blocks private/local URLs, retries, SSRF protection |
| 🔄 **Cooldown-Aware Retries** 🆕 | Auto-retry chat on model cooldowns; configurable `requestRetry` / `maxRetryIntervalSec` |
| 🔍 **Runtime Env Validation** 🆕 | Zod-based env schema validation at startup with actionable error messages |
| 📋 **Compliance Audit v2** 🆕 | Pagination, request context, auth events, provider CRUD, and SSRF-blocked logging |
| Feature | What It Does |
| ----------------------------------- | ------------------------------------------------------------------------------------------------------- |
| 🔌 **Provider Circuit Breakers** | Provider-wide trip/recover after fallback exhaustion with configurable thresholds |
| 🔒 **Daily Quota Lock** 🆕 | Detects exhaustion signals and locks routing for the specific model until midnight |
| 🎯 **Endpoint-Aware Models** | Custom models declare supported endpoints + API format |
| 🛡️ **Anti-Thundering Herd** | Mutex + semaphore protections on retry/rate events |
| 🧠 **Semantic + Signature Cache** | Cost/latency reduction with two cache layers |
| ⚡ **Request Idempotency** | Duplicate protection window |
| 🔒 **TLS Fingerprint Spoofing** | Browser-like TLS fingerprint — **reduces bot detection and account flagging** |
| 🔏 **CLI Fingerprint Matching** | Matches native CLI request signatures — **reduces ban risk while preserving proxy IP** |
| 🌐 **IP Filtering** | Allowlist/blocklist control for exposed deployments |
| 🚦 **Request Queue & Pacing** | Configurable per-connection request buckets for RPM, spacing, concurrency, and max wait |
| 📉 **Graceful Degradation** | Multi-layer capability fallbacks protecting core gateway operations |
| 📜 **Config Audit Trail** | Diff-based change tracking preventing operational drift with simple rollbacks |
| ⏳ **Provider Health Sync** | Proactive token expiration monitoring triggering alerts before authorization failures |
| ❄️ **Connection Cooldown** | Retryable 408/429/5xx failures cool down a single connection with optional upstream hints |
| 🚪 **Auto-Disable Banned Accounts** | Permanently blocked token accounts can be disabled automatically |
| 🔑 **API Key Management + Scoping** | Secure key issuance/rotation and model/provider controls |
| 👁️ **Scoped API Key Reveal** 🆕 | Opt-in recovery of API keys via `ALLOW_API_KEY_REVEAL` |
| 🛡️ **Protected `/models`** | Optional auth gating and provider hiding for model catalog |
| 🛡️ **Safe Outbound Fetch** 🆕 | Guarded fetch for provider calls — blocks private/local URLs, retries, SSRF protection |
| ⏳ **Wait For Cooldown** 🆕 | Auto-retry chat after connection cooldowns; configurable `enabled`, `maxRetries`, and `maxRetryWaitSec` |
| 🔍 **Runtime Env Validation** 🆕 | Zod-based env schema validation at startup with actionable error messages |
| 📋 **Compliance Audit v2** 🆕 | Pagination, request context, auth events, provider CRUD, and SSRF-blocked logging |

### 📊 Observability & Analytics

| Feature | What It Does |
| -------------------------------- | ----------------------------------------------------- |
| 📝 **Request + Proxy Logging** | Full request/response and proxy logging |
| 📉 **Streamed Detailed Logs** 🆕 | Reconstructs SSE payload streams cleanly into the UI |
| 📉 **Streamed Detailed Logs** | Reconstructs SSE payload streams cleanly into the UI |
| 🏷️ **Real-Time Model Badges** 🆕 | Live model status and daily quota countdown timers |
| 📋 **Unified Logs Dashboard** | Request, proxy, audit, and console views in one page |
| 🔍 **Request Telemetry** | p50/p95/p99 latency and request tracing |
| 🏥 **Health Dashboard** | Uptime, breaker states, lockouts, cache stats |
Expand Down Expand Up @@ -2281,7 +2294,7 @@ OmniRoute has **218+ features planned** across multiple development phases. Here
| 🧠 **Routing & Intelligence** | 25+ | Lowest-latency routing, tag-based routing, quota preflight, quota-aware P2C, step-based combo routing |
| 🔒 **Security & Compliance** | 20+ | SSRF hardening, credential cloaking, rate-limit per endpoint, management key scoping |
| 📊 **Observability** | 15+ | OpenTelemetry integration, real-time quota monitoring, combo target health, cost tracking per model |
| 🔄 **Provider Integrations** | 20+ | Dynamic model registry, provider cooldowns, multi-account Codex, Copilot quota parsing |
| 🔄 **Provider Integrations** | 20+ | Dynamic model registry, connection cooldowns, multi-account Codex, Copilot quota parsing |
| ⚡ **Performance** | 15+ | Dual cache layer, prompt cache, response cache, streaming keepalive, batch API |
| 🌐 **Ecosystem** | 10+ | WebSocket API, config hot-reload, distributed config store, commercial mode |

Expand Down
31 changes: 6 additions & 25 deletions docs/API_REFERENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -284,12 +284,12 @@ GET response includes `agents[]` (id, name, binary, version, installed, protocol

### Resilience & Rate Limits

| Endpoint | Method | Description |
| ----------------------- | --------- | ------------------------------- |
| `/api/resilience` | GET/PATCH | Get/update resilience profiles |
| `/api/resilience/reset` | POST | Reset circuit breakers |
| `/api/rate-limits` | GET | Per-account rate limit status |
| `/api/rate-limit` | GET | Global rate limit configuration |
| Endpoint | Method | Description |
| ----------------------- | --------- | ---------------------------------------------------------------------------------- |
| `/api/resilience` | GET/PATCH | Get/update request queue, connection cooldown, provider breaker, and wait settings |
| `/api/resilience/reset` | POST | Reset provider circuit breakers |
| `/api/rate-limits` | GET | Per-account rate limit status |
| `/api/rate-limit` | GET | Global rate limit configuration |

### Evals

Expand Down Expand Up @@ -443,25 +443,6 @@ Content-Type: application/json
}
```

---

## Model Availability

```bash
# Get real-time model availability across all providers
GET /api/models/availability

# Check availability for a specific model
POST /api/models/availability
Content-Type: application/json

{
"model": "claude-sonnet-4-5-20250929"
}
```

---

## Request Processing

1. Client sends request to `/v1/*`
Expand Down
Loading