mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-17 04:32:31 +03:00
Merge branch 'release/v3.8.49' into feat/port-pr-2371-provider-quota-visibility
This commit is contained in:
@@ -1425,6 +1425,12 @@ APP_LOG_TO_FILE=true
|
||||
# NANOBANANA_POLL_TIMEOUT_MS=120000 # Max wait for job completion (default: 120s)
|
||||
# NANOBANANA_POLL_INTERVAL_MS=2500 # Poll frequency (default: 2.5s)
|
||||
|
||||
# ── Microsoft Designer Web (Image Generation) ──
|
||||
# Polling config for the microsoft-designer-web submit-then-poll image job.
|
||||
# Used by: open-sse/handlers/imageGeneration/providers/designerWeb.ts
|
||||
# DESIGNER_WEB_POLL_TIMEOUT_MS=60000 # Max wait for job completion (default: 60s)
|
||||
# DESIGNER_WEB_POLL_INTERVAL_MS=2000 # Poll frequency (default: 2s)
|
||||
|
||||
# ── AWS Bedrock (Kiro / Audio) ──
|
||||
# Region used to construct AWS Bedrock endpoints. Used by:
|
||||
# src/lib/providers/validation.ts and open-sse/handlers/audioSpeech.ts.
|
||||
|
||||
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@@ -519,7 +519,7 @@ jobs:
|
||||
with:
|
||||
node-version: ${{ env.CI_NODE_VERSION }}
|
||||
- name: Fetch base branch
|
||||
run: git fetch --no-tags origin "${GITHUB_BASE_REF}" --depth=1
|
||||
run: git fetch --no-tags origin "${GITHUB_BASE_REF}"
|
||||
- name: Validate source changes include tests
|
||||
run: node scripts/check/check-pr-test-policy.mjs --summary-file .artifacts/pr-test-policy.md
|
||||
# Anti test-masking: flag net assert removal / new assert.ok(true) in changed tests.
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
## Project
|
||||
|
||||
Unified AI proxy/router — route any LLM through one endpoint. Multi-provider support
|
||||
with **250 provider entries** (OpenAI, Anthropic, Gemini, DeepSeek, Groq, xAI, Mistral, Fireworks,
|
||||
with **259 provider entries** (OpenAI, Anthropic, Gemini, DeepSeek, Groq, xAI, Mistral, Fireworks,
|
||||
Cohere, NVIDIA, Cerebras, Pollinations, Puter, Cloudflare AI, HuggingFace, DeepInfra,
|
||||
SambaNova, Meta Llama API, Moonshot AI, AI21 Labs, Databricks, Snowflake, and many more)
|
||||
with **MCP Server** (94 tools), **A2A v0.3 Protocol**, and **Electron desktop app**.
|
||||
|
||||
> **Live counts (v3.8.47)**: providers 250 · MCP tools 94 · MCP scopes 30 · A2A skills 6 ·
|
||||
> **Live counts (v3.8.49)**: providers 259 · MCP tools 94 · MCP scopes 30 · A2A skills 6 ·
|
||||
> open-sse services 134 · routing strategies 17 · auto-combo scoring factors 12 ·
|
||||
> DB modules 95 · DB migrations 110 · base tables 17 · search providers 11 ·
|
||||
> i18n locales 42. **Refresh with `npm run check:docs-all`.**
|
||||
|
||||
@@ -35,7 +35,7 @@ For full test matrix, see `CONTRIBUTING.md` → "Running Tests". For deep archit
|
||||
|
||||
## Project at a Glance
|
||||
|
||||
**OmniRoute** — unified AI proxy/router. One endpoint, 250 LLM providers, auto-fallback.
|
||||
**OmniRoute** — unified AI proxy/router. One endpoint, 259 LLM providers, auto-fallback.
|
||||
|
||||
| Layer | Location | Purpose |
|
||||
| ------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
|
||||
45
README.md
45
README.md
@@ -6,7 +6,7 @@
|
||||
|
||||
# 🚀 OmniRoute — The Free AI Gateway
|
||||
|
||||
### Never stop coding. Connect every AI tool to **250 providers** — **90+ free** — through one endpoint.
|
||||
### Never stop coding. Connect every AI tool to **259 providers** — **90+ free** — through one endpoint.
|
||||
|
||||
**Plug Claude Code, Codex, Cursor, Cline, Copilot & Antigravity into FREE Claude / GPT / Gemini. Auto-fallback.**
|
||||
<br/>
|
||||
@@ -31,8 +31,8 @@
|
||||
|
||||
</br>
|
||||
|
||||
[](#-250-ai-providers--90-free)
|
||||
[](#-250-ai-providers--90-free)
|
||||
[](#-251-ai-providers--90-free)
|
||||
[](#-251-ai-providers--90-free)
|
||||
[](docs/reference/FREE_TIERS.md)
|
||||
[](#%EF%B8%8F-save-1595-tokens--automatically)
|
||||
[](#-combos--the-flagship)
|
||||
@@ -42,13 +42,13 @@
|
||||
|
||||
### 💬 Join the community
|
||||
|
||||
[](https://discord.gg/EkzRkpzKYt)
|
||||
[](https://discord.gg/U47eFqAXCn)
|
||||
[](https://t.me/omnirouteOficial)
|
||||
[](https://chat.whatsapp.com/JI7cDQ1GyaiDHhVBpLxf8b?mode=gi_t)
|
||||
[](https://chat.whatsapp.com/BTGJXIyjeNIIgExvTMGGhI)
|
||||
[](https://chat.whatsapp.com/LTSpdFhXTxjH4R6CCNiKWz)
|
||||
[](https://omniroute.online)
|
||||
|
||||
**Questions, provider tips, roadmap & support → [Discord](https://discord.gg/EkzRkpzKYt) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Global](https://chat.whatsapp.com/JI7cDQ1GyaiDHhVBpLxf8b?mode=gi_t) / [🇧🇷 Brasil](https://chat.whatsapp.com/BTGJXIyjeNIIgExvTMGGhI)**
|
||||
**Questions, provider tips, roadmap & support → [Discord](https://discord.gg/U47eFqAXCn) · [Telegram](https://t.me/omnirouteOficial) · WhatsApp [🌍 Global](https://chat.whatsapp.com/JI7cDQ1GyaiDHhVBpLxf8b?mode=gi_t) / [🇧🇷 Brasil](https://chat.whatsapp.com/LTSpdFhXTxjH4R6CCNiKWz)**
|
||||
|
||||
<br/>
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||

|
||||

|
||||
|
||||
[**🚀 Quick Start**](#-quick-start) • [**🎯 Combos**](#-combos--the-flagship) • [**🌐 Providers**](#-250-ai-providers--90-free) • [**🔌 CLI & MCP**](#-full-cli--a2a--mcp) • [**🗜️ Compression**](#%EF%B8%8F-save-1595-tokens--automatically) • [**🌍 Website**](https://omniroute.online)
|
||||
[**🚀 Quick Start**](#-quick-start) • [**🎯 Combos**](#-combos--the-flagship) • [**🌐 Providers**](#-251-ai-providers--90-free) • [**🔌 CLI & MCP**](#-full-cli--a2a--mcp) • [**🗜️ Compression**](#%EF%B8%8F-save-1595-tokens--automatically) • [**🌍 Website**](https://omniroute.online)
|
||||
|
||||
[💥 The Promise](#-the-promise) • [🤔 Why](#-why-omniroute) • [🏆 What Sets Apart](#-what-sets-omniroute-apart) • [🤖 Compatible CLIs](#-compatible-clis--coding-agents) • [🖥️ Where It Runs](#%EF%B8%8F-where-omniroute-runs--anywhere) • [🔒 Private](#-private--local-first) • [🎬 In Action](#-omniroute-in-action) • [📚 Explore More](#-explore-more) • [📧 Support](#-support--community)
|
||||
|
||||
@@ -149,11 +149,11 @@
|
||||
|
||||
</div>
|
||||
|
||||
> One endpoint. **250 providers.** Never stop building — and let OmniRoute pick the cheapest one that works.
|
||||
> One endpoint. **259 providers.** Never stop building — and let OmniRoute pick the cheapest one that works.
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td width="33%" valign="top"><b>🚫 Never hit limits</b><br/><sub>Auto-fallback across 250 providers in milliseconds. Quota out? Next provider takes over — zero downtime.</sub></td>
|
||||
<td width="33%" valign="top"><b>🚫 Never hit limits</b><br/><sub>Auto-fallback across 259 providers in milliseconds. Quota out? Next provider takes over — zero downtime.</sub></td>
|
||||
<td width="33%" valign="top"><b>💸 Save up to 95% tokens</b><br/><sub>RTK + Caveman stacked compression cuts 15–95% of eligible tokens (~89% avg on tool-heavy sessions).</sub></td>
|
||||
<td width="33%" valign="top"><b>🆓 $0 to start</b><br/><sub>90+ providers with a free tier, 11 free <i>forever</i> (Kiro, Qoder, Pollinations, LongCat…). No card needed.</sub></td>
|
||||
</tr>
|
||||
@@ -186,24 +186,7 @@
|
||||
|
||||
<div align="center">
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────┐
|
||||
│ Your IDE / CLI (Claude Code, Cursor, Cline…) │
|
||||
└─────────────────────────┬──────────────────────────────────┘
|
||||
│ http://localhost:20128/v1
|
||||
▼
|
||||
┌──────────────────────────────────────────────────────────┐
|
||||
│ OmniRoute — Smart Router │
|
||||
│ RTK + Caveman compression · 18 routing strategies │
|
||||
│ Circuit breakers · TLS stealth · MCP · A2A · Guardrails │
|
||||
└─────────────────────────┬──────────────────────────────────┘
|
||||
┌─────────────┬────┴────────┬─────────────┐
|
||||
▼ Tier 1 ▼ Tier 2 ▼ Tier 3 ▼ Tier 4
|
||||
SUBSCRIPTION API KEY CHEAP FREE
|
||||
Claude Code, DeepSeek, GLM $0.5, Kiro, Qoder,
|
||||
Codex, Copilot Groq, xAI MiniMax $0.2 Pollinations
|
||||
quota out? ───▶ budget hit? ─▶ budget hit? ─▶ always on
|
||||
```
|
||||
<img src="./docs/diagrams/tier-cascade.svg" width="100%" alt="OmniRoute request flow: your IDE or CLI (Claude Code, Cursor, Cline…) calls one local endpoint (http://localhost:20128/v1); the OmniRoute Smart Router (RTK + Caveman compression, 18 routing strategies, circuit breakers, TLS stealth, MCP, A2A, guardrails) auto-falls back across 4 provider tiers — Tier 1 Subscription (Claude Code, Codex, Copilot), quota out? Tier 2 API Key (DeepSeek, Groq, xAI), budget hit? Tier 3 Cheap (GLM $0.5, MiniMax $0.2), budget hit? Tier 4 Free (Kiro, Qoder, Pollinations) — always on."/>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -314,7 +297,7 @@ Result: 4 layers of fallback = zero downtime
|
||||
|
||||
| Feature | OmniRoute | Other routers |
|
||||
| -------------------------------------- | ------------------------------------------------------------------- | ------------- |
|
||||
| 🌐 Providers | **250** | 20–100 |
|
||||
| 🌐 Providers | **251** | 20–100 |
|
||||
| 🆓 Free providers | **90+ (11 free forever)** | 1–5 |
|
||||
| 🔀 Routing strategies | **18** (priority, weighted, cost-optimized, context-relay, fusion…) | 1–3 |
|
||||
| 🗜️ Token compression | **RTK + Caveman stacked (15–95%)** | None / 20–40% |
|
||||
@@ -395,11 +378,11 @@ Result: 4 layers of fallback = zero downtime
|
||||
|
||||
<div align="center">
|
||||
|
||||
# 🌐 250 AI Providers — 90+ Free
|
||||
# 🌐 251 AI Providers — 90+ Free
|
||||
|
||||
</div>
|
||||
|
||||
> The most complete catalog of any open-source router: **250 providers**, **90+ with a free tier**, **11 free forever**.
|
||||
> The most complete catalog of any open-source router: **259 providers**, **90+ with a free tier**, **11 free forever**.
|
||||
|
||||
<div align="center">
|
||||
|
||||
@@ -907,7 +890,7 @@ Compression: aggressive (~50%) → double your free quota · Cost: $0/mo
|
||||
**Will I be charged by OmniRoute?** No — it's free, open-source software on your machine. You only pay paid providers directly. OmniRoute has no billing system.
|
||||
**Are FREE providers really unlimited?** Mostly — Qoder, Pollinations, LongCat, and Cloudflare are free with no per-account credit cap. Kiro is free too but capped at ~50 credits/month per account. Stack multiple free providers in a combo and auto-fallback keeps you serving for $0.
|
||||
**Will compression hurt quality?** No — it only compresses the **input**; code, URLs, JSON are always protected.
|
||||
**Does it work where AI is blocked?** Yes — 3-level proxy + 1proxy marketplace reach all 250 providers.
|
||||
**Does it work where AI is blocked?** Yes — 3-level proxy + 1proxy marketplace reach all 259 providers.
|
||||
|
||||
📖 [User Guide](docs/guides/USER_GUIDE.md) · [API Reference](docs/reference/API_REFERENCE.md) · [Environment Config](docs/reference/ENVIRONMENT.md)
|
||||
|
||||
|
||||
@@ -1,17 +1,22 @@
|
||||
import { execFile } from "node:child_process";
|
||||
import { t } from "../i18n.mjs";
|
||||
|
||||
function parsePort(value, fallback) {
|
||||
const parsed = parseInt(String(value), 10);
|
||||
return Number.isFinite(parsed) && parsed > 0 && parsed <= 65535 ? parsed : fallback;
|
||||
}
|
||||
|
||||
export function registerDashboard(program) {
|
||||
program
|
||||
.command("dashboard")
|
||||
.description(t("dashboard.description"))
|
||||
.option("--url", t("dashboard.urlOnly"))
|
||||
.option("--port <port>", "Port the server is running on", "20128")
|
||||
.option("--port <port>", "Port the server is running on")
|
||||
.option("--tui", t("dashboard.tui") || "Open interactive TUI dashboard (terminal UI)")
|
||||
.action(async (opts, cmd) => {
|
||||
if (opts.tui) {
|
||||
const globalOpts = cmd.optsWithGlobals();
|
||||
const port = opts.port ? parseInt(String(opts.port), 10) : 20128;
|
||||
const port = parsePort(opts.port ?? process.env.PORT ?? "20128", 20128);
|
||||
const baseUrl = globalOpts.baseUrl ?? `http://localhost:${port}`;
|
||||
const apiKey = globalOpts.apiKey ?? null;
|
||||
const { startInteractiveTui } = await import("../tui/Dashboard.jsx");
|
||||
@@ -24,7 +29,7 @@ export function registerDashboard(program) {
|
||||
}
|
||||
|
||||
export async function runDashboardCommand(opts = {}) {
|
||||
const port = opts.port ? parseInt(String(opts.port), 10) : 20128;
|
||||
const port = parsePort(opts.port ?? process.env.PORT ?? "20128", 20128);
|
||||
const dashboardUrl = `http://localhost:${port}`;
|
||||
|
||||
if (opts.url) {
|
||||
|
||||
25
bin/cli/utils/versionFastPath.mjs
Normal file
25
bin/cli/utils/versionFastPath.mjs
Normal file
@@ -0,0 +1,25 @@
|
||||
/**
|
||||
* Decide whether a CLI invocation is a bare `--version`/`-V` query that should
|
||||
* short-circuit BEFORE the runtime polyfill import, env-file loading, and
|
||||
* Commander's command registration (~70 command modules) are loaded.
|
||||
*
|
||||
* Scope is intentionally narrow — only a single, unambiguous `--version`/`-V`
|
||||
* argument fast-paths. Anything else (extra args, a subcommand, `--help`,
|
||||
* global options like `--lang`/`--output` alongside it) falls through to the
|
||||
* normal Commander flow. Unlike `--version`, OmniRoute's `--help` output is
|
||||
* generated dynamically from every registered subcommand, so skipping
|
||||
* registration would change (truncate) the help text — that flag is
|
||||
* deliberately NOT fast-pathed here.
|
||||
*
|
||||
* Mirrors the intent of upstream 9router PR #2414 (fast-path help/version
|
||||
* before expensive self-heal hooks), adapted to OmniRoute's Commander-based
|
||||
* CLI where the equivalent expensive work is eager command registration
|
||||
* rather than npm-install-based runtime self-healing.
|
||||
*
|
||||
* @param {string[]} argv - process.argv (node + script + args).
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isVersionFastPath(argv) {
|
||||
const args = Array.isArray(argv) ? argv.slice(2) : [];
|
||||
return args.length === 1 && (args[0] === "--version" || args[0] === "-V");
|
||||
}
|
||||
@@ -4,6 +4,9 @@
|
||||
* OmniRoute CLI entry point.
|
||||
*
|
||||
* Special bypasses (handled before Commander):
|
||||
* --version / -V (alone) Fast-path: print the version and exit, skipping the
|
||||
* tsx/esm + polyfill imports, env-file loading, and
|
||||
* Commander's ~70-command registration entirely.
|
||||
* --mcp Start MCP server over stdio
|
||||
* reset-encrypted-columns Recovery tool for broken encrypted credentials
|
||||
* reset-password Reset the admin/management password
|
||||
@@ -19,6 +22,26 @@ import { isNativeBinaryCompatible } from "../scripts/build/native-binary-compat.
|
||||
import { getNodeRuntimeSupport, getNodeRuntimeWarning } from "./nodeRuntimeSupport.mjs";
|
||||
import { getDefaultDataDir } from "./cli/data-dir.mjs";
|
||||
import { shouldProvisionStorageKey } from "./cli/utils/storageKeyProvision.mjs";
|
||||
import { isVersionFastPath } from "./cli/utils/versionFastPath.mjs";
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = dirname(__filename);
|
||||
const ROOT = join(__dirname, "..");
|
||||
|
||||
// Fast-path a bare `--version`/`-V` query BEFORE the tsx/esm registration, the
|
||||
// polyfill import, env-file loading, or Commander's command registration (~70
|
||||
// modules — DB, providers, OAuth, etc.) run. None of that work is needed to answer
|
||||
// "what version is this" — mirrors upstream 9router PR #2414 (fast-path help/version
|
||||
// ahead of expensive self-heal hooks), adapted to OmniRoute's Commander CLI where the
|
||||
// equivalent expensive work is eager command registration rather than npm-install-based
|
||||
// runtime self-healing. `--help` is intentionally NOT fast-pathed here: its output is
|
||||
// generated dynamically from every registered subcommand, so skipping registration
|
||||
// would truncate the help text instead of just speeding it up.
|
||||
if (isVersionFastPath(process.argv)) {
|
||||
const pkg = JSON.parse(readFileSync(join(ROOT, "package.json"), "utf8"));
|
||||
console.log(pkg.version);
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
// Register tsx so dynamic imports of .ts source files (referenced as .js per
|
||||
// TypeScript conventions) resolve correctly. The build never emits .js for
|
||||
@@ -26,10 +49,6 @@ import { shouldProvisionStorageKey } from "./cli/utils/storageKeyProvision.mjs";
|
||||
await import("tsx/esm");
|
||||
await import("../open-sse/utils/setupPolyfill.ts");
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = dirname(__filename);
|
||||
const ROOT = join(__dirname, "..");
|
||||
|
||||
// MCP stdio transport uses stdout exclusively for JSON-RPC messages.
|
||||
// Redirect console.log/warn to stderr early (before loadEnvFile and DB init)
|
||||
// so no startup output corrupts the protocol.
|
||||
|
||||
1
changelog.d/features/6540-hidepaid-ui-selects.md
Normal file
1
changelog.d/features/6540-hidepaid-ui-selects.md
Normal file
@@ -0,0 +1 @@
|
||||
- **feat(dashboard):** Replace free-text model inputs in the Routing (web search route), Combo Defaults (handoff model), and Background Degradation tabs with a `hidePaidModels`-aware `ModelSelectField`, add a fail-open "paid-only pattern" warning to the per-model routing rule pattern field, and reject paid-only model targets at save time on `PATCH /api/settings`, `PATCH /api/settings/combo-defaults`, and `PUT /api/settings/background-degradation` when `hidePaidModels` is on ([#6540](https://github.com/diegosouzapw/OmniRoute/issues/6540))
|
||||
1
changelog.d/features/6653-deepinfra-video-provider.md
Normal file
1
changelog.d/features/6653-deepinfra-video-provider.md
Normal file
@@ -0,0 +1 @@
|
||||
- feat(sse): add DeepInfra as a video-generation provider via its native synchronous inference endpoint (#6653)
|
||||
@@ -0,0 +1 @@
|
||||
- feat(providers): add Freepik (Magnific Mystic) API-key image generation provider — async submit/poll flow with realism/fluid/zen/flexible/super_real/editorial_portraits models (#6654)
|
||||
1
changelog.d/features/6655-revai-stt-provider.md
Normal file
1
changelog.d/features/6655-revai-stt-provider.md
Normal file
@@ -0,0 +1 @@
|
||||
- feat(providers): add Rev AI speech-to-text provider with async job upload/poll/transcript flow (#6655)
|
||||
@@ -0,0 +1 @@
|
||||
- **feat(providers):** add **Segmind** as an image + video generation provider — `x-api-key` auth against `POST https://api.segmind.com/v1/{model}`, with a curated starter model list (Flux, Stable Diffusion XL/3.5, Kandinsky for image; Wan, Hunyuan, LTX, Kling for video) (#6656).
|
||||
1
changelog.d/features/6657-gladia-stt-provider.md
Normal file
1
changelog.d/features/6657-gladia-stt-provider.md
Normal file
@@ -0,0 +1 @@
|
||||
- feat(providers): add Gladia as an async speech-to-text provider (#6657)
|
||||
1
changelog.d/features/6658-novita-video-gen-provider.md
Normal file
1
changelog.d/features/6658-novita-video-gen-provider.md
Normal file
@@ -0,0 +1 @@
|
||||
- feat(video): add Novita AI as a video-generation provider (Wan/Kling async submit-poll) (#6658)
|
||||
@@ -0,0 +1 @@
|
||||
- feat(providers): add Mixedbread AI as an embeddings provider (`mxbai-embed-large-v1`, `mxbai-embed-2d-large-v1`, free tier) (#6660)
|
||||
@@ -0,0 +1 @@
|
||||
- **feat(providers):** add Felo (felo.ai) as a free, no-signup, no-API-key chat/search-agent aggregator provider (`felo-web`) — joins the existing `-web` family (DuckDuckGo AI Chat, Blackbox, etc). Five models (`felo-chat`, `felo-search`, `felo-scholar`, `felo-social`, `felo-document`) map to Felo's search categories; the executor opens a search thread then translates Felo's bespoke SSE stream into OpenAI-compatible chunks (#6666).
|
||||
1
changelog.d/features/6668-edgetts-audio-tts-provider.md
Normal file
1
changelog.d/features/6668-edgetts-audio-tts-provider.md
Normal file
@@ -0,0 +1 @@
|
||||
- **feat(sse):** add EdgeTTS (Microsoft Edge "Read Aloud") as a free, no-API-key `audio-tts` provider — the first WebSocket-transport speech provider, with per-client-IP rate limiting. (#6668)
|
||||
1
changelog.d/features/6670-freetheai-gateway-provider.md
Normal file
1
changelog.d/features/6670-freetheai-gateway-provider.md
Normal file
@@ -0,0 +1 @@
|
||||
- feat(providers): add FreeTheAi as an OpenAI-compatible gateway provider with a free Discord-signup tier (#6670)
|
||||
@@ -0,0 +1 @@
|
||||
- feat(sse): add Microsoft Designer as an unofficial web-session image provider, reverse-engineered submit-then-poll DallE.ashx flow (#6672)
|
||||
1
changelog.d/features/6737-vary-accept-encoding.md
Normal file
1
changelog.d/features/6737-vary-accept-encoding.md
Normal file
@@ -0,0 +1 @@
|
||||
- **feat(api):** add `Vary: Accept-Encoding` to token-authenticated `/v1*`/`/v1beta*` responses so downstream caches distinguish compressed vs uncompressed variants (RFC 9110 §12.5.5). (thanks @chirag127)
|
||||
1
changelog.d/features/6758-notion-web-provider.md
Normal file
1
changelog.d/features/6758-notion-web-provider.md
Normal file
@@ -0,0 +1 @@
|
||||
- feat(sse): add Notion AI Web (Unofficial/Experimental) cookie-session provider (#6758)
|
||||
@@ -0,0 +1 @@
|
||||
- **feat(dashboard):** add per-routing-combo compression-mode override to the Compression Combos page under Context & Cache, alongside the existing combo-card quick override. (#6760)
|
||||
@@ -0,0 +1 @@
|
||||
- **feat(sse):** preserve `tools`/`tool_choice` for tool-bearing requests through fusion combos — bypass panel synthesis and route straight to the judge with tools intact (#6771 — thanks @chirag127).
|
||||
1
changelog.d/features/6801-xp-audit-log-retention.md
Normal file
1
changelog.d/features/6801-xp-audit-log-retention.md
Normal file
@@ -0,0 +1 @@
|
||||
- feat(db): include `xp_audit_log` in the automatic retention/prune cycle, with a configurable `retention.xpAuditLog` setting (#6801)
|
||||
@@ -0,0 +1 @@
|
||||
- feat(api): add a structured `X-Routing-Fallback-Reason` header to relay routing responses, exposing a stable machine-readable reason code alongside the legacy `X-Routing-Fallback` detail string (#6872)
|
||||
1
changelog.d/features/6873-model-latency-stats-api.md
Normal file
1
changelog.d/features/6873-model-latency-stats-api.md
Normal file
@@ -0,0 +1 @@
|
||||
- **feat(api):** new **GET /api/usage/model-latency-stats** management endpoint exposes the existing rolling per-provider/model latency aggregate (avg/p50/p95/p99, success rate) already used internally by auto-combo routing — supports `windowHours`/`minSamples`/`maxRows`/`provider`/`model` filters (#6873).
|
||||
1
changelog.d/features/6880-connection-cache-override.md
Normal file
1
changelog.d/features/6880-connection-cache-override.md
Normal file
@@ -0,0 +1 @@
|
||||
- **feat(providers):** let a custom/openai-compatible connection opt into prompt-cache behavior via a per-connection `cache` capability override, unblocking `prompt_cache_key` injection, the compression cache-aware guard, and `cache_control` passthrough for `openai-compatible-chat-<uuid>`-style connections. (thanks @andrea-kingautomation)
|
||||
@@ -0,0 +1 @@
|
||||
- **feat(dashboard):** add a Type filter (No Signup / OAuth Login / API Key) and an "Easiest first" sort toggle to Free Provider Rankings, so zero-setup NOAUTH providers can be surfaced without eyeballing the Type column. (#6915)
|
||||
1
changelog.d/features/6928-comfyui-base-url-field.md
Normal file
1
changelog.d/features/6928-comfyui-base-url-field.md
Normal file
@@ -0,0 +1 @@
|
||||
- **feat(providers):** expose an editable base-URL field on the ComfyUI connection so Docker-network setups (e.g. `http://comfyui:8188`) work for image, video, and music generation ([#6928](https://github.com/diegosouzapw/OmniRoute/issues/6928))
|
||||
1
changelog.d/features/6976-openrouter-embeddings.md
Normal file
1
changelog.d/features/6976-openrouter-embeddings.md
Normal file
@@ -0,0 +1 @@
|
||||
- **feat(providers):** refresh the curated OpenRouter embeddings catalog (`open-sse/config/embeddingRegistry.ts`) with the current lineup — `openai/text-embedding-3-small`/`-large`, `qwen/qwen3-embedding-8b`/`-4b`, `baai/bge-m3`, `mistralai/mistral-embed-2312`, `google/gemini-embedding-001` — and fold curated embedding/rerank entries into OpenRouter's live model-discovery response (`src/app/api/providers/[id]/models/route.ts`), additively and deduped by id, so they no longer only appear on the no-config `local_catalog` fallback. OpenRouter serves embeddings via a dedicated `/api/v1/embeddings` endpoint (omitted from `/v1/models`), so the live-discovery success path previously returned chat models only ([#6976](https://github.com/diegosouzapw/OmniRoute/issues/6976)). Regression guard: `tests/unit/openrouter-embeddings-catalog-6976.test.ts`.
|
||||
1
changelog.d/features/6977-quota-auto-ping.md
Normal file
1
changelog.d/features/6977-quota-auto-ping.md
Normal file
@@ -0,0 +1 @@
|
||||
- **feat(quota):** Add opt-in auto-ping to keep Codex quota windows warm — per-connection toggle in Settings → AI that sends a tiny request right after a Codex session window resets, so it isn't cold on the next real request ([#6977](https://github.com/diegosouzapw/OmniRoute/issues/6977))
|
||||
1
changelog.d/features/7023-optional-enum-null-sentinel.md
Normal file
1
changelog.d/features/7023-optional-enum-null-sentinel.md
Normal file
@@ -0,0 +1 @@
|
||||
- **feat(sse):** Add optional-enum `null`-omission idiom for Responses-API (codex) strict-mode tool schemas, closing the #6951 follow-up ([#7023](https://github.com/diegosouzapw/OmniRoute/issues/7023))
|
||||
1
changelog.d/features/7034-x-goog-api-key-client-auth.md
Normal file
1
changelog.d/features/7034-x-goog-api-key-client-auth.md
Normal file
@@ -0,0 +1 @@
|
||||
- **feat(auth):** accept the `x-goog-api-key` header for client-facing auth so `gemini-cli` and other `@google/genai`-based clients can use OmniRoute as a native `/v1beta` gateway (#7034 — thanks @QRcode1337).
|
||||
1
changelog.d/features/7209-kiro-gpt56-family.md
Normal file
1
changelog.d/features/7209-kiro-gpt56-family.md
Normal file
@@ -0,0 +1 @@
|
||||
- **feat(kiro):** register the GPT-5.6 Sol/Terra/Luna model family (272k context window). (thanks @SemonCat)
|
||||
1
changelog.d/features/7210-codex-plan-labels.md
Normal file
1
changelog.d/features/7210-codex-plan-labels.md
Normal file
@@ -0,0 +1 @@
|
||||
- **feat(dashboard):** show the Codex subscription plan label in provider connection rows and the quota view, falling back to the plan captured at OAuth import when the live usage endpoint doesn't report one. (thanks @CarmeloCampos)
|
||||
@@ -0,0 +1 @@
|
||||
- **feat(dashboard):** add a "Reorder" button to provider connections that sorts them by availability (using OmniRoute's connection-cooldown/testStatus model), persisting the new priority order. (thanks @fzrilsh)
|
||||
1
changelog.d/features/7213-usage-extended-periods.md
Normal file
1
changelog.d/features/7213-usage-extended-periods.md
Normal file
@@ -0,0 +1 @@
|
||||
- **feat(dashboard):** add 180D and 365D periods to the Cost Explorer range selector. The new ranges thread through `parseCostRange`/`COST_RANGE_VALUES` and the `getRangeStartIso` handlers in the analytics and requests-by-provider-date usage routes, so cost/usage analytics can be viewed over a half-year and full-year window (#7213)
|
||||
@@ -0,0 +1 @@
|
||||
- **feat(sse):** GitHub Copilot Claude models now route through Copilot's native `/v1/messages` endpoint (prompt-cache token counts, no more lossy tool-call round-trip). (thanks @yidecode)
|
||||
@@ -0,0 +1 @@
|
||||
- **feat(mitm):** Antigravity MITM model mappings now support an optional per-model reasoning-effort override (Default/None/Low/Medium/High/XHigh) alongside the destination-model remap. (thanks @trfi)
|
||||
1
changelog.d/features/7238-xai-grok-imagine-video.md
Normal file
1
changelog.d/features/7238-xai-grok-imagine-video.md
Normal file
@@ -0,0 +1 @@
|
||||
- **feat(sse):** add native xAI Grok Imagine video generation provider — `xai/grok-imagine-video` on `/v1/videos/generations` using your own xAI key, instead of only via the kie proxy market. (thanks @anndev-69)
|
||||
1
changelog.d/features/7241-grok-build-cli-setup.md
Normal file
1
changelog.d/features/7241-grok-build-cli-setup.md
Normal file
@@ -0,0 +1 @@
|
||||
- **feat(cli):** add Grok Build CLI tool setup — writes a `[model.omniroute]` custom model into `~/.grok/config.toml` and restores your previous default on Reset. (thanks @rixzkiye)
|
||||
1
changelog.d/features/7246-chenzk-provider.md
Normal file
1
changelog.d/features/7246-chenzk-provider.md
Normal file
@@ -0,0 +1 @@
|
||||
- **feat(provider):** add Chenzk API OpenAI-compatible gateway. (thanks @CahyokPutraDev99)
|
||||
1
changelog.d/fixes/1253-kiro-sso-cache-clientid.md
Normal file
1
changelog.d/fixes/1253-kiro-sso-cache-clientid.md
Normal file
@@ -0,0 +1 @@
|
||||
- **fix(oauth):** resolve Kiro AWS SSO cache client credentials by matching the token's own `clientId` (including tokens with a direct `clientId` field instead of `clientIdHash`) instead of a region/latest-expiry guess, fixing spurious "Bad credentials" on refresh when multiple stale SSO client registrations are cached (thanks @XCrag).
|
||||
1
changelog.d/fixes/1904-custom-model-vision-toggle.md
Normal file
1
changelog.d/fixes/1904-custom-model-vision-toggle.md
Normal file
@@ -0,0 +1 @@
|
||||
- **fix(dashboard):** the "Custom Models" add/edit form now has a "Vision capable" toggle so a custom OpenAI-compatible model can be manually flagged as vision-capable when the provider's discovery metadata doesn't report an image input modality (thanks @nguyenphi37)
|
||||
1
changelog.d/fixes/2057-combo-custom-provider-models.md
Normal file
1
changelog.d/fixes/2057-combo-custom-provider-models.md
Normal file
@@ -0,0 +1 @@
|
||||
- **fix(dashboard):** include never-tested custom provider connections in the combo builder's active-provider list so their models load without requiring a manual connection test first. (thanks @fajarbossit)
|
||||
1
changelog.d/fixes/2482-minimax-image-provider.md
Normal file
1
changelog.d/fixes/2482-minimax-image-provider.md
Normal file
@@ -0,0 +1 @@
|
||||
- **fix(providers):** MiniMax Text-to-Image now works — a `minimax` image-generation provider (`minimax-image` format, `image-01`/`image-01-live` models) was registered, since MiniMax previously had entries in the music/audio/video registries but none in the image registry, so any MiniMax image-model request fell through to a 404/unmatched-format response. (thanks @felipeleite)
|
||||
1
changelog.d/fixes/2540-gpt5-tools-reasoning-effort.md
Normal file
1
changelog.d/fixes/2540-gpt5-tools-reasoning-effort.md
Normal file
@@ -0,0 +1 @@
|
||||
- **fix(openai):** strip `reasoning_effort`/`reasoning` for GPT-5.x models on the raw `openai` Chat Completions surface when the request carries function `tools` — upstream rejects that combination with HTTP 400 ("Function tools with reasoning_effort are not supported ... Please use /v1/responses instead"), and the dashboard has no `reasoning_effort:"none"` override to work around it client-side — thanks @techsolutionmta
|
||||
1
changelog.d/fixes/6764-fusion-combo-ref.md
Normal file
1
changelog.d/fixes/6764-fusion-combo-ref.md
Normal file
@@ -0,0 +1 @@
|
||||
- **fix(routing):** fusion combos no longer silently drop `combo-ref` panel members — a referenced combo is now dispatched as one black-box panel voice instead of being dropped (#6764)
|
||||
1
changelog.d/fixes/6794-electron-turbopack-symlinks.md
Normal file
1
changelog.d/fixes/6794-electron-turbopack-symlinks.md
Normal file
@@ -0,0 +1 @@
|
||||
- **fix(electron): materialize Turbopack hashed-module symlinks during packaging (#6724, #6594)** (#6794 — thanks @huohua-dev).
|
||||
1
changelog.d/fixes/6916-provider-limits-spacing-local.md
Normal file
1
changelog.d/fixes/6916-provider-limits-spacing-local.md
Normal file
@@ -0,0 +1 @@
|
||||
- fix(providers): `PROVIDER_LIMITS_SYNC_SPACING_MS` now also throttles local / API-key (Ollama) connections, not just OAuth — spaced between concurrency chunks so a local endpoint isn't hit by a simultaneous refresh burst (#6916)
|
||||
1
changelog.d/fixes/6953-empty-signature-thinking-block.md
Normal file
1
changelog.d/fixes/6953-empty-signature-thinking-block.md
Normal file
@@ -0,0 +1 @@
|
||||
- fix(sse): stop forwarding empty-signature thinking blocks verbatim to Anthropic-native legs, which permanently poisoned combo fallback (#6953)
|
||||
@@ -0,0 +1 @@
|
||||
- **fix(dashboard):** the combos builder now hides provider connections the user has explicitly disabled, instead of relying only on stale test-status (#6984 — thanks @attid).
|
||||
1
changelog.d/fixes/6986-grok-cli-tools-cap.md
Normal file
1
changelog.d/fixes/6986-grok-cli-tools-cap.md
Normal file
@@ -0,0 +1 @@
|
||||
- **fix(providers):** cap grok-cli tools at 200 per request, matching xAI's cli-chat-proxy limit, and document the non-reasoning capability of grok-build/grok-composer-2.5-fast in the registry (#6986, thanks @gitcommit90)
|
||||
1
changelog.d/fixes/7049-dashboard-port-env-fallback.md
Normal file
1
changelog.d/fixes/7049-dashboard-port-env-fallback.md
Normal file
@@ -0,0 +1 @@
|
||||
- **fix(cli):** `omniroute dashboard` (no `--port` flag) now respects `PORT` from the environment instead of always opening `localhost:20128`, matching `serve`/`launch` precedence (`--port` > `PORT` env > `20128` default) (#7049 — thanks @kaon0388v1).
|
||||
1
changelog.d/fixes/7125-onboarding-tiers-layout.md
Normal file
1
changelog.d/fixes/7125-onboarding-tiers-layout.md
Normal file
@@ -0,0 +1 @@
|
||||
- **fix(dashboard):** align onboarding tier descriptions and localize the tier step header and flow copy ([#7125](https://github.com/diegosouzapw/OmniRoute/pull/7125)) — thanks @Wibias
|
||||
@@ -0,0 +1 @@
|
||||
- **fix(translator):** preserve Gemini thinking-mode `thought:true` parts as `reasoning_content` instead of leaking them into visible assistant text on the OpenAI request bridge. (thanks @warelik)
|
||||
@@ -0,0 +1 @@
|
||||
- **fix(translator):** register the missing OpenAI→Gemini response projection so combo-routed OpenAI-native providers no longer leak raw `chat.completion.chunk` shapes to Gemini-format clients. (thanks @warelik)
|
||||
1
changelog.d/fixes/7208-cli-version-fastpath.md
Normal file
1
changelog.d/fixes/7208-cli-version-fastpath.md
Normal file
@@ -0,0 +1 @@
|
||||
- **fix(cli):** `omniroute --version` now fast-paths before the tsx/esm + polyfill imports, env-file loading, and Commander's full command registration, cutting local runtime from ~1.5s to ~0.3s. (thanks @Jordannst)
|
||||
1
changelog.d/fixes/7234-bulk-add-keys-no-overwrite.md
Normal file
1
changelog.d/fixes/7234-bulk-add-keys-no-overwrite.md
Normal file
@@ -0,0 +1 @@
|
||||
- **api:** bulk-add API keys no longer overwrite existing provider connections — a colliding auto- or custom-generated name now gap-fills a free suffix instead of silently replacing a saved connection's key/state. (thanks @asynx6)
|
||||
@@ -0,0 +1 @@
|
||||
- fix(sse): feed the compression pipeline the authoritative vision capability instead of the conservative model-id heuristic, so vision models absent from the fragment list (e.g. gpt-5.5) no longer have their image_url blocks silently stripped (#7237)
|
||||
1
changelog.d/fixes/7242-openai-gpt56-responses-routing.md
Normal file
1
changelog.d/fixes/7242-openai-gpt56-responses-routing.md
Normal file
@@ -0,0 +1 @@
|
||||
- **fix(sse):** route the public OpenAI GPT-5.6 family (`gpt-5.6`, `-sol`, `-terra`, `-luna`) through the Responses API — Chat Completions rejects GPT-5.6 requests that combine function tools with an active `reasoning_effort`. (thanks @Jordannst)
|
||||
1
changelog.d/fixes/7244-grok-cli-honor-proxy.md
Normal file
1
changelog.d/fixes/7244-grok-cli-honor-proxy.md
Normal file
@@ -0,0 +1 @@
|
||||
- **fix(providers):** honor a configured proxy on Grok Build egress — the grok-cli executor used raw `https.request()` and bypassed the proxy context, leaking the host IP on chat inference and OAuth token refresh. (thanks @ryanngit)
|
||||
1
changelog.d/fixes/7247-nvidia-nim-catalog.md
Normal file
1
changelog.d/fixes/7247-nvidia-nim-catalog.md
Normal file
@@ -0,0 +1 @@
|
||||
- **fix(nvidia):** expand NIM chat model catalog with newly-observed models. (thanks @spacesky-cell)
|
||||
@@ -0,0 +1 @@
|
||||
- **fix(sse):** synthetic bypass responses for Claude-format clients no longer drop their content — `mergeChunksToResponse()` now reconstructs the message from streamed content blocks instead of returning an empty array. (thanks @KunN-21)
|
||||
1
changelog.d/fixes/7249-windows-build-isolation.md
Normal file
1
changelog.d/fixes/7249-windows-build-isolation.md
Normal file
@@ -0,0 +1 @@
|
||||
- **fix(build):** isolate Windows HOME/AppData during next build. (thanks @KunN-21)
|
||||
@@ -0,0 +1 @@
|
||||
- fix(dashboard): providers model-name filter now matches an aggregator's live/synced catalog, not just the static curated registry (#7250)
|
||||
@@ -0,0 +1 @@
|
||||
- fix(sse): project non-streaming JSON responses back to the Gemini/Antigravity `{response:{candidates}}` envelope instead of leaking the raw OpenAI `choices[]` shape, so tool calls are no longer dropped for Gemini-family clients on the JSON path (#7255) (thanks @warelik)
|
||||
1
changelog.d/fixes/7258-zhtw-missing-placeholder.md
Normal file
1
changelog.d/fixes/7258-zhtw-missing-placeholder.md
Normal file
@@ -0,0 +1 @@
|
||||
- fix(i18n): treat `__MISSING__:` sync-script placeholders as absent so the EN fallback renders instead of the raw sentinel (#7258)
|
||||
@@ -0,0 +1 @@
|
||||
- fix(sse): lazy-load playwright in claudeTurnstileSolver so unsupported platforms (e.g. Termux/Android) don't crash on boot (#7265)
|
||||
1
changelog.d/fixes/7266-proxyfetch-caller-abort-log.md
Normal file
1
changelog.d/fixes/7266-proxyfetch-caller-abort-log.md
Normal file
@@ -0,0 +1 @@
|
||||
- **fix(sse):** stop logging a caller-initiated request abort/timeout as a noisy proxy transport failure in `proxyFetch`. (thanks @TuyulSpam)
|
||||
@@ -0,0 +1 @@
|
||||
- fix(sse): classify 401 "model X is not supported" as model-not-found so it locks the model out instead of looping forever (#7268)
|
||||
1
changelog.d/fixes/7272-costs-page-500.md
Normal file
1
changelog.d/fixes/7272-costs-page-500.md
Normal file
@@ -0,0 +1 @@
|
||||
- fix(dashboard): resolve `ReferenceError: t is not defined` crashing `/dashboard/costs` when a filtered slice has zero-cost rows (#7272)
|
||||
@@ -0,0 +1 @@
|
||||
- fix(cli): Windows MITM root-CA check/uninstall keyed off the hardcoded legacy hostname `daily-cloudcode-pa.googleapis.com` instead of the actual generated CA's identity — they now derive a SHA-1 thumbprint from the real `certPath` file (same pattern `#6338` used for the DNS side of this anti-pattern) (#7275)
|
||||
1
changelog.d/fixes/7279-cli-detector-windows-drift.md
Normal file
1
changelog.d/fixes/7279-cli-detector-windows-drift.md
Normal file
@@ -0,0 +1 @@
|
||||
- fix(cli): reuse cliRuntime's win32-aware `locateCommand`/`shell:true` probe in tool-detector so installed CLIs (npm `.cmd` shims) are no longer reported as absent on native Windows (#7279)
|
||||
1
changelog.d/fixes/7284-conn-test-429.md
Normal file
1
changelog.d/fixes/7284-conn-test-429.md
Normal file
@@ -0,0 +1 @@
|
||||
- fix(dashboard): connection Test surfaces a rate-limit warning on 429 chat-probe responses instead of an unqualified pass (#7284)
|
||||
1
changelog.d/fixes/7285-combo-finish-reason.md
Normal file
1
changelog.d/fixes/7285-combo-finish-reason.md
Normal file
@@ -0,0 +1 @@
|
||||
- fix(sse): combo failover now detects OpenAI-shape streams truncated without `finish_reason`/`[DONE]` (#7285)
|
||||
1
changelog.d/fixes/7288-sqljs-preinit-ordering-gap.md
Normal file
1
changelog.d/fixes/7288-sqljs-preinit-ordering-gap.md
Normal file
@@ -0,0 +1 @@
|
||||
- **fix(db):** `getDbInstance()` now guarantees sql.js WASM has already been pre-initialized (via a top-level await in `src/lib/db/core.ts`) before ANY consumer can reach it, closing an ordering gap where early startup steps (`ensureSecrets()`, `clearStaleCrashCooldowns()`, `getSettings()`, `initAuditLog()`) called `getDbInstance()` before `ensureDbReadyForBoot()` had a chance to run `preInitSqlJs()` — turning a recoverable driver failure into a hard boot crash (`sql.js WASM ainda não foi pré-inicializado`) whenever both `better-sqlite3` and `node:sqlite` failed to open an existing `storage.sqlite`. `tryOpenSync()` also now logs the real underlying cause of each swallowed sync-driver failure instead of an empty `catch {}`. (#7288, #7494)
|
||||
1
changelog.d/fixes/7289-cursor-effort-suffix.md
Normal file
1
changelog.d/fixes/7289-cursor-effort-suffix.md
Normal file
@@ -0,0 +1 @@
|
||||
- fix(sse): split effort/reasoning suffix off pinned Claude/GPT model ids before sending to cursor's server (#7289)
|
||||
1
changelog.d/fixes/7293-strict-system-message-hoist.md
Normal file
1
changelog.d/fixes/7293-strict-system-message-hoist.md
Normal file
@@ -0,0 +1 @@
|
||||
- fix(sse): hoist client-injected `system` messages to index 0 for strict OpenAI-compatible providers (xiaomi-mimo) regardless of origin (#7293)
|
||||
1
changelog.d/fixes/7297-bedrock-images.md
Normal file
1
changelog.d/fixes/7297-bedrock-images.md
Normal file
@@ -0,0 +1 @@
|
||||
- fix(sse): treat Uint8Array/Buffer as opaque binary in log redaction to stop per-byte enumeration on Bedrock Converse image requests (#7297)
|
||||
@@ -0,0 +1 @@
|
||||
- fix(chatgpt-web): recognize `update_content.messages[]` (plural array) celsius WebSocket frames so async image_gen pointers are no longer silently dropped (#7357)
|
||||
1
changelog.d/fixes/7364-glm-4.6v-max-tokens-clamp.md
Normal file
1
changelog.d/fixes/7364-glm-4.6v-max-tokens-clamp.md
Normal file
@@ -0,0 +1 @@
|
||||
- fix(sse): clamp glm-4.6v max_tokens to the 32768 ceiling for zai and glm providers, wiring stripUnsupportedParams into GlmExecutor's own transform path (#7364)
|
||||
1
changelog.d/fixes/7364-zai-glm-target-format.md
Normal file
1
changelog.d/fixes/7364-zai-glm-target-format.md
Normal file
@@ -0,0 +1 @@
|
||||
- fix(sse): honor per-model targetFormat override for zai/glm-coding-apikey buildUrl and make custom-model id lookup case-insensitive (#7364)
|
||||
1
changelog.d/fixes/7387-sticky-quota-exhausted.md
Normal file
1
changelog.d/fixes/7387-sticky-quota-exhausted.md
Normal file
@@ -0,0 +1 @@
|
||||
- fix(sse): combo session stickiness now releases a connection whose per-window quota is exhausted, matching the provider-level session-affinity pin (#7387)
|
||||
1
changelog.d/fixes/7388-codex-ws-history-per-turn.md
Normal file
1
changelog.d/fixes/7388-codex-ws-history-per-turn.md
Normal file
@@ -0,0 +1 @@
|
||||
- fix(cli): log Codex Responses WebSocket history/usage per logical turn instead of once per connection (#7388)
|
||||
1
changelog.d/fixes/7521-codex-test-probe-model.md
Normal file
1
changelog.d/fixes/7521-codex-test-probe-model.md
Normal file
@@ -0,0 +1 @@
|
||||
- Fixed the Codex connection **Test** button always reporting success for ChatGPT-account tokens: the probe used `gpt-5.3-codex`, a codex-only model ChatGPT accounts reject with a 400 — the same status the probe treats as "auth OK", so a bad token was indistinguishable from a good one. It now probes with `gpt-5.5`, a model ChatGPT-account sessions actually support (#7521).
|
||||
1
changelog.d/fixes/7522-codex-import-validate-refresh.md
Normal file
1
changelog.d/fixes/7522-codex-import-validate-refresh.md
Normal file
@@ -0,0 +1 @@
|
||||
- The Codex account import (`POST /api/oauth/codex/import`) now validates each record's `refresh_token` against OpenAI's OAuth endpoint before persisting the connection: an already-invalidated session (`refresh_token_invalidated` / a dead `auth.json`) is rejected with a clear "run `codex login` again and re-import" message instead of importing as `active` and failing confusingly on first use. Valid tokens import as before, with any rotated tokens applied (#7522).
|
||||
1
changelog.d/fixes/7523-codex-oauth-remote-host.md
Normal file
1
changelog.d/fixes/7523-codex-oauth-remote-host.md
Normal file
@@ -0,0 +1 @@
|
||||
- The PKCE OAuth start (`/api/oauth/[provider]/start-callback-server`, used by Codex/Windsurf/Devin) now detects when OmniRoute is being driven from a remote host and returns a reverse-tunnel hint (`remoteHost`, `tunnelCommand`, `message`) instead of hanging silently: the callback server binds the *server's* localhost:PORT, so a browser on a different machine would redirect to its own localhost and never complete. Loopback access is unchanged (#7523).
|
||||
1
changelog.d/fixes/7529-search-static-catalog.md
Normal file
1
changelog.d/fixes/7529-search-static-catalog.md
Normal file
@@ -0,0 +1 @@
|
||||
- fix(providers): search providers now expose a static model catalog derived from `searchTypes`, fixing "does not support models listing" 400 for serper-search, brave-search, perplexity-search, exa-search, tavily-search, google-pse-search, youcom-search, searxng-search, zai-search (#7529)
|
||||
1
changelog.d/fixes/7532-tool-search-responses-to-chat.md
Normal file
1
changelog.d/fixes/7532-tool-search-responses-to-chat.md
Normal file
@@ -0,0 +1 @@
|
||||
- fix(sse): map `tool_search` to a Chat function tool instead of dropping it during Responses->Chat translation (#7532)
|
||||
@@ -0,0 +1 @@
|
||||
- fix(sse): gate `verbosity`/`prompt_cache_key` on OpenAI destination during Responses->Chat translation, stopping the leak to non-OpenAI upstreams like NVIDIA (#7533)
|
||||
1
changelog.d/fixes/7534-usage-provider-display-name.md
Normal file
1
changelog.d/fixes/7534-usage-provider-display-name.md
Normal file
@@ -0,0 +1 @@
|
||||
- fix(api): Usage page "by provider" table now shows the configured provider display name (e.g. "OpenAI Codex") instead of the raw internal provider id (e.g. "codex") (#7534)
|
||||
@@ -0,0 +1 @@
|
||||
- fix(api): Usage page "model usage" table no longer lists the same logical model twice when it was recorded under both a bare and a provider-prefixed spelling (e.g. `glm-5.2` and `z-ai/glm-5.2`) — the in-memory dedup key now uses the normalized model name (#7535)
|
||||
@@ -0,0 +1 @@
|
||||
- fix(codex): non-stream Codex (ChatGPT-account) chat no longer 502s with "Response body is already used". `peekCodexSseTransientError` now checks the content-type before touching `response.body`: on the wreq-js TLS-fingerprint transport the Response is backed by a native body handle and merely accessing `.body` disturbs it, so the empty-content-type non-stream response was being consumed by the peek guard and then re-read by `readNonStreamingResponseBody`. Streaming was unaffected. Validated live on the VPS (`codex/gpt-5.5` + `codex/gpt-5.6-terra` non-stream now return 200) (#7536)
|
||||
1
changelog.d/fixes/codex-nonstream-body-double-read.md
Normal file
1
changelog.d/fixes/codex-nonstream-body-double-read.md
Normal file
@@ -0,0 +1 @@
|
||||
- Fixed every non-streaming Codex (ChatGPT-account) chat request failing with `[502]: Response body is already used (reset after 1m)`: `peekCodexSseTransientError` re-acquired a reader on the upstream `response.body` after `releaseLock()` to continue draining it, which throws on undici. It now keeps the single reader it already holds. The thrown TypeError was also being mis-classified as a 60s rate limit (cooldown + circuit breaker) — that misfire disappears with the double-read fixed.
|
||||
1
changelog.d/maintenance/7213-7603-filesize-baseline.md
Normal file
1
changelog.d/maintenance/7213-7603-filesize-baseline.md
Normal file
@@ -0,0 +1 @@
|
||||
- **maintenance(quality):** re-baseline `file-size` for two legitimately-grown files from the v3.8.49 owner-PR campaign — `src/app/api/usage/analytics/route.ts` 942→948 (180d/365d range cases, #7213) and `tests/unit/audio-transcription-handler.test.ts` added to `testFrozen` at 824 (Gladia STT test cases, #7603). Fast-gates PR→release skip `check:file-size`, so this only surfaced on re-sync; no behavior change.
|
||||
@@ -0,0 +1 @@
|
||||
- **Antivirus false-positive note** (`docs/guides/TROUBLESHOOTING.md`): documents why Avast/AVG quarantine the packaged `README.md` with `MD:HttpRequest-inf[Susp]` — a heuristic false positive on the ~15 `http://localhost:20128` examples the file ships with (via `package.json` → `files`). Covers how to stop the notifications, how to report the false positive upstream, and why the localhost examples are deliberately left alone. (#7295 — reported by @DemonNCoding, #5946)
|
||||
1
changelog.d/maintenance/7615-readme-tier-cascade-svg.md
Normal file
1
changelog.d/maintenance/7615-readme-tier-cascade-svg.md
Normal file
@@ -0,0 +1 @@
|
||||
- **README tier-cascade diagram animated** (`docs/diagrams/tier-cascade.svg`): the ASCII 4-tier auto-fallback block in the README is now a self-contained animated SVG (SMIL-only, 16 KB, 16s loop in 4 acts — quota-out/budget-hit hand-offs down to the always-on free tier) that plays inside GitHub's `<img>` sandbox; full flow preserved in the img alt text, hand-authored-diagrams section added to `docs/diagrams/README.md` (#7615).
|
||||
1
changelog.d/maintenance/7616-docs-provider-count-259.md
Normal file
1
changelog.d/maintenance/7616-docs-provider-count-259.md
Normal file
@@ -0,0 +1 @@
|
||||
- **Docs provider-count sync** (`README.md`, `AGENTS.md`, `CLAUDE.md`): provider-count mentions bumped 253 → 259 to match the auto-generated catalog, un-blocking the strict `check:docs-counts` gate that had started failing on every PR targeting the release branch (#7616).
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user