From aa2a7d12be430e1f0fc00bb3bc4a4ee2f61a6bd6 Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Wed, 25 Mar 2026 08:20:04 -0300 Subject: [PATCH] =?UTF-8?q?chore(release):=20v3.0.1=20=E2=80=94=20hotfix?= =?UTF-8?q?=20for=20proxy=5F=20prefix,=20LongCat=20validation,=20and=20MCP?= =?UTF-8?q?=20tool=20schemas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 190 +++++++++++++++++++++++++++++----------------- docs/openapi.yaml | 2 +- package-lock.json | 4 +- package.json | 2 +- 4 files changed, 126 insertions(+), 72 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c535b1cc24..43ca872249 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,53 @@ --- +## [3.0.1] β€” 2026-03-25 + +### πŸ”§ Hotfix Patch β€” Critical Bug Fixes + +Three critical regressions reported by users after the v3.0.0 launch have been resolved. + +#### fix(translator): strip `proxy_` prefix in non-streaming Claude responses (#605) + +The `proxy_` prefix added by Claude OAuth was only stripped from **streaming** responses. In **non-streaming** mode, `translateNonStreamingResponse` had no access to the `toolNameMap`, causing clients to receive mangled tool names like `proxy_read_file` instead of `read_file`. + +**Fix:** Added optional `toolNameMap` parameter to `translateNonStreamingResponse` and applied prefix stripping in the Claude `tool_use` block handler. `chatCore.ts` now passes the map through. + +#### fix(validation): add LongCat specialty validator to skip /models probe (#592) + +LongCat AI does not expose `GET /v1/models`. The generic `validateOpenAICompatibleProvider` validator fell through to a chat-completions fallback only if `validationModelId` was set, which LongCat doesn't configure. This caused provider validation to fail with a misleading error on add/save. + +**Fix:** Added `longcat` to the specialty validators map, probing `/chat/completions` directly and treating any non-auth response as a pass. + +#### fix(translator): normalize object tool schemas for Anthropic (#595) + +MCP tools (e.g. `pencil`, `computer_use`) forward tool definitions with `{type:"object"}` but without a `properties` field. Anthropic's API rejects these with: `object schema missing properties`. + +**Fix:** In `openai-to-claude.ts`, inject `properties: {}` as a safe default when `type` is `"object"` and `properties` is absent. + +--- + +### πŸ”€ Community PRs Merged (2) + +| PR | Author | Summary | +| -------- | ------- | -------------------------------------------------------------------------- | +| **#589** | @flobo3 | docs(i18n): fix Russian translation for Playground and Testbed | +| **#591** | @rdself | fix(ui): improve Provider Limits light mode contrast and plan tier display | + +--- + +### βœ… Issues Resolved + +`#592` `#595` `#605` + +--- + +### πŸ§ͺ Tests + +- **926 tests, 0 failures** (unchanged from v3.0.0) + +--- + ## [3.0.0] β€” 2026-03-24 ### πŸŽ‰ OmniRoute v3.0.0 β€” The Free AI Gateway, Now with 67+ Providers @@ -16,39 +63,39 @@ ### πŸ†• New Providers (+31 since v2.9.5) -| Provider | Alias | Tier | Notes | -|----------|-------|------|-------| -| **OpenCode Zen** | `opencode-zen` | Free | 3 models via `opencode.ai/zen/v1` (PR #530 by @kang-heewon) | -| **OpenCode Go** | `opencode-go` | Paid | 4 models via `opencode.ai/zen/go/v1` (PR #530 by @kang-heewon) | -| **LongCat AI** | `lc` | Free | 50M tokens/day (Flash-Lite) + 500K/day (Chat/Thinking) during public beta | -| **Pollinations AI** | `pol` | Free | No API key needed β€” GPT-5, Claude, Gemini, DeepSeek V3, Llama 4 (1 req/15s) | -| **Cloudflare Workers AI** | `cf` | Free | 10K Neurons/day β€” ~150 LLM responses or 500s Whisper audio, edge inference | -| **Scaleway AI** | `scw` | Free | 1M free tokens for new accounts β€” EU/GDPR compliant (Paris) | -| **AI/ML API** | `aiml` | Free | $0.025/day free credits β€” 200+ models via single endpoint | -| **Puter AI** | `pu` | Free | 500+ models (GPT-5, Claude Opus 4, Gemini 3 Pro, Grok 4, DeepSeek V3) | -| **Alibaba Cloud (DashScope)** | `ali` | Paid | International + China endpoints via `alicode`/`alicode-intl` | -| **Alibaba Coding Plan** | `bcp` | Paid | Alibaba Model Studio with Anthropic-compatible API | -| **Kimi Coding (API Key)** | `kmca` | Paid | Dedicated API-key-based Kimi access (separate from OAuth) | -| **MiniMax Coding** | `minimax` | Paid | International endpoint | -| **MiniMax (China)** | `minimax-cn` | Paid | China-specific endpoint | -| **Z.AI (GLM-5)** | `zai` | Paid | Zhipu AI next-gen GLM models | -| **Vertex AI** | `vertex` | Paid | Google Cloud β€” Service Account JSON or OAuth access_token | -| **Ollama Cloud** | `ollamacloud` | Paid | Ollama's hosted API service | -| **Synthetic** | `synthetic` | Paid | Passthrough models gateway | -| **Kilo Gateway** | `kg` | Paid | Passthrough models gateway | -| **Perplexity Search** | `pplx-search` | Paid | Dedicated search-grounded endpoint | -| **Serper Search** | `serper-search` | Paid | Web search API integration | -| **Brave Search** | `brave-search` | Paid | Brave Search API integration | -| **Exa Search** | `exa-search` | Paid | Neural search API integration | -| **Tavily Search** | `tavily-search` | Paid | AI search API integration | -| **NanoBanana** | `nb` | Paid | Image generation API | -| **ElevenLabs** | `el` | Paid | Text-to-speech voice synthesis | -| **Cartesia** | `cartesia` | Paid | Ultra-fast TTS voice synthesis | -| **PlayHT** | `playht` | Paid | Voice cloning and TTS | -| **Inworld** | `inworld` | Paid | AI character voice chat | -| **SD WebUI** | `sdwebui` | Self-hosted | Stable Diffusion local image generation | -| **ComfyUI** | `comfyui` | Self-hosted | ComfyUI local workflow node-based generation | -| **GLM Coding** | `glm` | Paid | BigModel/Zhipu coding-specific endpoint | +| Provider | Alias | Tier | Notes | +| ----------------------------- | --------------- | ----------- | --------------------------------------------------------------------------- | +| **OpenCode Zen** | `opencode-zen` | Free | 3 models via `opencode.ai/zen/v1` (PR #530 by @kang-heewon) | +| **OpenCode Go** | `opencode-go` | Paid | 4 models via `opencode.ai/zen/go/v1` (PR #530 by @kang-heewon) | +| **LongCat AI** | `lc` | Free | 50M tokens/day (Flash-Lite) + 500K/day (Chat/Thinking) during public beta | +| **Pollinations AI** | `pol` | Free | No API key needed β€” GPT-5, Claude, Gemini, DeepSeek V3, Llama 4 (1 req/15s) | +| **Cloudflare Workers AI** | `cf` | Free | 10K Neurons/day β€” ~150 LLM responses or 500s Whisper audio, edge inference | +| **Scaleway AI** | `scw` | Free | 1M free tokens for new accounts β€” EU/GDPR compliant (Paris) | +| **AI/ML API** | `aiml` | Free | $0.025/day free credits β€” 200+ models via single endpoint | +| **Puter AI** | `pu` | Free | 500+ models (GPT-5, Claude Opus 4, Gemini 3 Pro, Grok 4, DeepSeek V3) | +| **Alibaba Cloud (DashScope)** | `ali` | Paid | International + China endpoints via `alicode`/`alicode-intl` | +| **Alibaba Coding Plan** | `bcp` | Paid | Alibaba Model Studio with Anthropic-compatible API | +| **Kimi Coding (API Key)** | `kmca` | Paid | Dedicated API-key-based Kimi access (separate from OAuth) | +| **MiniMax Coding** | `minimax` | Paid | International endpoint | +| **MiniMax (China)** | `minimax-cn` | Paid | China-specific endpoint | +| **Z.AI (GLM-5)** | `zai` | Paid | Zhipu AI next-gen GLM models | +| **Vertex AI** | `vertex` | Paid | Google Cloud β€” Service Account JSON or OAuth access_token | +| **Ollama Cloud** | `ollamacloud` | Paid | Ollama's hosted API service | +| **Synthetic** | `synthetic` | Paid | Passthrough models gateway | +| **Kilo Gateway** | `kg` | Paid | Passthrough models gateway | +| **Perplexity Search** | `pplx-search` | Paid | Dedicated search-grounded endpoint | +| **Serper Search** | `serper-search` | Paid | Web search API integration | +| **Brave Search** | `brave-search` | Paid | Brave Search API integration | +| **Exa Search** | `exa-search` | Paid | Neural search API integration | +| **Tavily Search** | `tavily-search` | Paid | AI search API integration | +| **NanoBanana** | `nb` | Paid | Image generation API | +| **ElevenLabs** | `el` | Paid | Text-to-speech voice synthesis | +| **Cartesia** | `cartesia` | Paid | Ultra-fast TTS voice synthesis | +| **PlayHT** | `playht` | Paid | Voice cloning and TTS | +| **Inworld** | `inworld` | Paid | AI character voice chat | +| **SD WebUI** | `sdwebui` | Self-hosted | Stable Diffusion local image generation | +| **ComfyUI** | `comfyui` | Self-hosted | ComfyUI local workflow node-based generation | +| **GLM Coding** | `glm` | Paid | BigModel/Zhipu coding-specific endpoint | **Total: 67+ providers** (4 Free, 8 OAuth, 55 API Key) + unlimited OpenAI/Anthropic-Compatible custom providers. @@ -60,15 +107,15 @@ Auto-generate and issue OmniRoute API keys programmatically with per-provider and per-account quota enforcement. -| Endpoint | Method | Description | -|----------|--------|-------------| -| `/api/v1/registered-keys` | `POST` | Issue a new key β€” raw key returned **once only** | -| `/api/v1/registered-keys` | `GET` | List registered keys (masked) | -| `/api/v1/registered-keys/{id}` | `GET/DELETE` | Get metadata / Revoke | -| `/api/v1/quotas/check` | `GET` | Pre-validate quota before issuing | -| `/api/v1/providers/{id}/limits` | `GET/PUT` | Configure per-provider issuance limits | -| `/api/v1/accounts/{id}/limits` | `GET/PUT` | Configure per-account issuance limits | -| `/api/v1/issues/report` | `POST` | Report quota events to GitHub Issues | +| Endpoint | Method | Description | +| ------------------------------- | ------------ | ------------------------------------------------ | +| `/api/v1/registered-keys` | `POST` | Issue a new key β€” raw key returned **once only** | +| `/api/v1/registered-keys` | `GET` | List registered keys (masked) | +| `/api/v1/registered-keys/{id}` | `GET/DELETE` | Get metadata / Revoke | +| `/api/v1/quotas/check` | `GET` | Pre-validate quota before issuing | +| `/api/v1/providers/{id}/limits` | `GET/PUT` | Configure per-provider issuance limits | +| `/api/v1/accounts/{id}/limits` | `GET/PUT` | Configure per-account issuance limits | +| `/api/v1/issues/report` | `POST` | Report quota events to GitHub Issues | **Security:** Keys stored as SHA-256 hashes. Raw key shown once on creation, never retrievable again. @@ -83,6 +130,7 @@ Auto-refreshes model lists for connected providers every **24 hours**. Runs on s #### πŸ”€ Per-Model Combo Routing (#563) Map model name patterns (glob) to specific combos for automatic routing: + - `claude-sonnet*` β†’ code-combo, `gpt-4o*` β†’ openai-combo, `gemini-*` β†’ google-combo - New `model_combo_mappings` table with glob-to-regex matching - Dashboard UI section: "Model Routing Rules" with inline add/edit/toggle/delete @@ -122,12 +170,14 @@ Full media generation playground at `/dashboard/media`: Image Generation, Video, ### πŸ› Bug Fixes (40+) #### OAuth & Auth + - **#537** β€” Gemini CLI OAuth: clear actionable error when `GEMINI_OAUTH_CLIENT_SECRET` missing in Docker - **#549** β€” CLI settings routes now resolve real API key from `keyId` (not masked strings) - **#574** β€” Login no longer freezes after skipping wizard password setup - **#506** β€” Cross-platform `machineId` rewritten (Windows REG.exe β†’ macOS ioreg β†’ Linux β†’ hostname fallback) #### Providers & Routing + - **#536** β€” LongCat AI: fixed `baseUrl` and `authHeader` - **#535** β€” Pinned model override: `body.model` correctly set to `pinnedModel` - **#570** β€” Unprefixed Claude models now resolve to Anthropic provider @@ -137,6 +187,7 @@ Full media generation playground at `/dashboard/media`: Image Generation, Video, - **#511** β€” `` tag injected into first content chunk (not after `[DONE]`) #### CLI & Tools + - **#527** β€” Claude Code + Codex loop: `tool_result` blocks now converted to text - **#524** β€” OpenCode config saved correctly (XDG_CONFIG_HOME, TOML format) - **#522** β€” API Manager: removed misleading "Copy masked key" button @@ -146,12 +197,14 @@ Full media generation playground at `/dashboard/media`: Image Generation, Video, - **#492** β€” CLI detects `mise`/`nvm`-managed Node when `app/server.js` missing #### Streaming & SSE + - **PR #587** β€” Revert `resolveDataDir` import in responsesTransformer for Cloudflare Workers compat (@k0valik) - **PR #495** β€” Bottleneck 429 infinite wait: drop waiting jobs on rate limit (@xandr0s) - **#483** β€” Stop trailing `data: null` after `[DONE]` signal - **#473** β€” Zombie SSE streams: timeout reduced 300s β†’ 120s for faster fallback #### Media & Transcription + - **Transcription** β€” Deepgram `video/mp4` β†’ `audio/mp4` MIME mapping, auto language detection, punctuation - **TTS** β€” `[object Object]` error display fixed for ElevenLabs-style nested errors - **Upload limits** β€” Media transcription increased to 2GB (nginx `client_max_body_size 2g` + `maxDuration=300`) @@ -214,27 +267,27 @@ Full media generation playground at `/dashboard/media`: Image Generation, Video, ### πŸ”€ Community PRs Merged (10) -| PR | Author | Summary | -|----|--------|---------| -| **#587** | @k0valik | fix(sse): revert resolveDataDir import for Cloudflare Workers compat | -| **#582** | @jay77721 | feat(proxy): model name prefix stripping option | -| **#581** | @jay77721 | fix(npm): link electron-release to npm-publish workflow | -| **#578** | @hijak | feat: configurable context length in model metadata | -| **#575** | @zhangqiang8vip | feat: per-model upstream headers, compat PATCH, chat alignment | -| **#562** | @coobabm | fix: MCP session management, Claude passthrough, detectFormat | -| **#561** | @zen0bit | fix(i18n): Czech translation corrections | -| **#555** | @k0valik | fix(sse): centralized `resolveDataDir()` for path resolution | -| **#546** | @k0valik | fix(cli): `--version` returning `unknown` on Windows | -| **#544** | @k0valik | fix(cli): secure CLI tool detection via installation paths | -| **#542** | @rdself | fix(ui): light mode contrast CSS theme variables | -| **#530** | @kang-heewon | feat: OpenCode Zen + Go providers with `OpencodeExecutor` | -| **#512** | @zhangqiang8vip | feat: per-protocol model compatibility (`compatByProtocol`) | -| **#497** | @zhangqiang8vip | fix: dev-mode HMR resource leaks (ZWS v5) | -| **#495** | @xandr0s | fix: Bottleneck 429 infinite wait (drop waiting jobs) | -| **#494** | @zhangqiang8vip | feat: MiniMax developerβ†’system role fix | -| **#480** | @prakersh | fix: stream flush usage extraction | -| **#479** | @prakersh | feat: Codex 5.3/5.4 and Anthropic pricing entries | -| **#475** | @only4copilot | feat(i18n): improved Chinese translation | +| PR | Author | Summary | +| -------- | --------------- | -------------------------------------------------------------------- | +| **#587** | @k0valik | fix(sse): revert resolveDataDir import for Cloudflare Workers compat | +| **#582** | @jay77721 | feat(proxy): model name prefix stripping option | +| **#581** | @jay77721 | fix(npm): link electron-release to npm-publish workflow | +| **#578** | @hijak | feat: configurable context length in model metadata | +| **#575** | @zhangqiang8vip | feat: per-model upstream headers, compat PATCH, chat alignment | +| **#562** | @coobabm | fix: MCP session management, Claude passthrough, detectFormat | +| **#561** | @zen0bit | fix(i18n): Czech translation corrections | +| **#555** | @k0valik | fix(sse): centralized `resolveDataDir()` for path resolution | +| **#546** | @k0valik | fix(cli): `--version` returning `unknown` on Windows | +| **#544** | @k0valik | fix(cli): secure CLI tool detection via installation paths | +| **#542** | @rdself | fix(ui): light mode contrast CSS theme variables | +| **#530** | @kang-heewon | feat: OpenCode Zen + Go providers with `OpencodeExecutor` | +| **#512** | @zhangqiang8vip | feat: per-protocol model compatibility (`compatByProtocol`) | +| **#497** | @zhangqiang8vip | fix: dev-mode HMR resource leaks (ZWS v5) | +| **#495** | @xandr0s | fix: Bottleneck 429 infinite wait (drop waiting jobs) | +| **#494** | @zhangqiang8vip | feat: MiniMax developerβ†’system role fix | +| **#480** | @prakersh | fix: stream flush usage extraction | +| **#479** | @prakersh | feat: Codex 5.3/5.4 and Anthropic pricing entries | +| **#475** | @only4copilot | feat(i18n): improved Chinese translation | **Thank you to all contributors!** πŸ™ @@ -255,11 +308,11 @@ Full media generation playground at `/dashboard/media`: Image Generation, Video, ### πŸ“¦ Database Migrations -| Migration | Description | -|-----------|-------------| -| **008** | `registered_keys`, `provider_key_limits`, `account_key_limits` tables | -| **009** | `requested_model` column in `call_logs` | -| **010** | `model_combo_mappings` table for per-model combo routing | +| Migration | Description | +| --------- | --------------------------------------------------------------------- | +| **008** | `registered_keys`, `provider_key_limits`, `account_key_limits` tables | +| **009** | `requested_model` column in `call_logs` | +| **010** | `model_combo_mappings` table for per-model combo routing | --- @@ -310,6 +363,7 @@ docker pull diegosouzapw/omniroute:3.0.0 ## [3.0.0-rc.16] β€” 2026-03-24 ### ✨ New Features + - Increased media transcription limits - Added Model Context Length to registry metadata - Added per-model upstream custom headers via configuration UI diff --git a/docs/openapi.yaml b/docs/openapi.yaml index d93c6cea0d..a35efa4b1c 100644 --- a/docs/openapi.yaml +++ b/docs/openapi.yaml @@ -1,7 +1,7 @@ openapi: 3.1.0 info: title: OmniRoute API - version: 3.0.0 + version: 3.0.1 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 f4e632845a..51038949d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "omniroute", - "version": "3.0.0", + "version": "3.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "omniroute", - "version": "3.0.0", + "version": "3.0.1", "hasInstallScript": true, "license": "MIT", "workspaces": [ diff --git a/package.json b/package.json index 6146dcc777..db34fc9ca6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "omniroute", - "version": "3.0.0", + "version": "3.0.1", "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": {