diff --git a/CHANGELOG.md b/CHANGELOG.md index ae270e10..181d83e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,9 +20,12 @@ - **feat(vision-bridge):** Add automatic image description fallback for non-vision models via `VisionBridgeGuardrail` (priority 5). Intercepts image-bearing requests to non-vision models, extracts descriptions via a configurable vision model (default: gpt-4o-mini), and replaces images with text before forwarding. Fails open on any error. (#1476) - **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 with full i18n translations for batch processing workflows. (#1479) +- **feat(usage):** MiniMax + MiniMax-CN quota tracking in provider limits dashboard. (#1516) +- **feat(providers):** Fix OpenRouter remote discovery and unify managed model sync. (#1521) ### 🐛 Bug Fixes +- **fix(providers):** Resolve 400 errors for GLM and Antigravity Claude adapter during request translation by scoping prompt caching to compatible Anthropic endpoints and flattening system instructions. (#1514, #1520, #1522) - **fix(core):** Strip `reasoning_content` from OpenAI format messages for non-reasoning models to prevent upstream HTTP 400 validation errors. (#1505) - **fix(ui):** Add missing UI wiring for "Add Memory" and "Import" buttons on the `/dashboard/memory` page. (#1506) - **fix(core):** Add periodic runtime log rotation checks to prevent disk exhaustion in long-running instances. (#1504 — thanks @ether-btc) @@ -45,6 +48,7 @@ - **fix(core):** Fix reference counting in `ModelStatusContext` — changed `registeredModels` from `Set` to `Map` to prevent polling stop when one component unmounts while others still track the same model. - **fix(security):** Prompt injection guard failures now return an explicit 500 response instead of silently passing through (fail-closed policy). - **fix(security):** Encryption now derives new keys from a secret-based salt while falling back to the legacy static-salt key during decryption, preserving existing stored credentials. +- **fix(combo):** Resolve context truncation bug in combo routing to prevent incomplete execution states. (#1517) ### ♻️ Refactoring diff --git a/docs/i18n/README.md b/docs/i18n/README.md index 445229cb..30da8b00 100644 --- a/docs/i18n/README.md +++ b/docs/i18n/README.md @@ -1,38 +1,45 @@ # 🌐 Multilingual Documentation — 9router -Translations of documentation into 32 languages. Code blocks remain in English. +Translations of documentation into 39 languages. Code blocks remain in English. --- -- 🇪🇸 **Español** (`es`): [Docs Root](./es/README.md) -- 🇫🇷 **Français** (`fr`): [Docs Root](./fr/README.md) +- 🇸🇦 **العربية** (`ar`): [Docs Root](./ar/README.md) +- 🇧🇬 **Български** (`bg`): [Docs Root](./bg/README.md) +- 🇧🇩 **বাংলা** (`bn`): [Docs Root](./bn/README.md) +- 🇨🇿 **Čeština** (`cs`): [Docs Root](./cs/README.md) +- 🇩🇰 **Dansk** (`da`): [Docs Root](./da/README.md) - 🇩🇪 **Deutsch** (`de`): [Docs Root](./de/README.md) +- 🇪🇸 **Español** (`es`): [Docs Root](./es/README.md) +- 🇮🇷 **فارسی** (`fa`): [Docs Root](./fa/README.md) +- 🇫🇮 **Suomi** (`fi`): [Docs Root](./fi/README.md) +- 🇫🇷 **Français** (`fr`): [Docs Root](./fr/README.md) +- 🇮🇳 **ગુજરાતી** (`gu`): [Docs Root](./gu/README.md) +- 🇮🇱 **עברית** (`he`): [Docs Root](./he/README.md) +- 🇮🇳 **हिन्दी** (`hi`): [Docs Root](./hi/README.md) +- 🇭🇺 **Magyar** (`hu`): [Docs Root](./hu/README.md) +- 🇮🇩 **Bahasa Indonesia** (`id`): [Docs Root](./id/README.md) - 🇮🇹 **Italiano** (`it`): [Docs Root](./it/README.md) -- 🇷🇺 **Русский** (`ru`): [Docs Root](./ru/README.md) -- 🇨🇳 **中文(简体)** (`zh-CN`): [Docs Root](./zh-CN/README.md) - 🇯🇵 **日本語** (`ja`): [Docs Root](./ja/README.md) - 🇰🇷 **한국어** (`ko`): [Docs Root](./ko/README.md) -- 🇸🇦 **العربية** (`ar`): [Docs Root](./ar/README.md) -- 🇮🇳 **हिन्दी** (`hi`): [Docs Root](./hi/README.md) -- 🇮🇳 **हिन्दी (IN)** (`in`): [Docs Root](./in/README.md) -- 🇹🇭 **ไทย** (`th`): [Docs Root](./th/README.md) -- 🇻🇳 **Tiếng Việt** (`vi`): [Docs Root](./vi/README.md) -- 🇮🇩 **Bahasa Indonesia** (`id`): [Docs Root](./id/README.md) +- 🇮🇳 **मराठी** (`mr`): [Docs Root](./mr/README.md) - 🇲🇾 **Bahasa Melayu** (`ms`): [Docs Root](./ms/README.md) - 🇳🇱 **Nederlands** (`nl`): [Docs Root](./nl/README.md) -- 🇵🇱 **Polski** (`pl`): [Docs Root](./pl/README.md) -- 🇸🇪 **Svenska** (`sv`): [Docs Root](./sv/README.md) - 🇳🇴 **Norsk** (`no`): [Docs Root](./no/README.md) -- 🇩🇰 **Dansk** (`da`): [Docs Root](./da/README.md) -- 🇫🇮 **Suomi** (`fi`): [Docs Root](./fi/README.md) -- 🇵🇹 **Português (Portugal)** (`pt`): [Docs Root](./pt/README.md) -- 🇷🇴 **Română** (`ro`): [Docs Root](./ro/README.md) -- 🇭🇺 **Magyar** (`hu`): [Docs Root](./hu/README.md) -- 🇧🇬 **Български** (`bg`): [Docs Root](./bg/README.md) -- 🇸🇰 **Slovenčina** (`sk`): [Docs Root](./sk/README.md) -- 🇺🇦 **Українська** (`uk-UA`): [Docs Root](./uk-UA/README.md) -- 🇮🇱 **עברית** (`he`): [Docs Root](./he/README.md) - 🇵🇭 **Filipino** (`phi`): [Docs Root](./phi/README.md) +- 🇵🇱 **Polski** (`pl`): [Docs Root](./pl/README.md) +- 🇵🇹 **Português (Portugal)** (`pt`): [Docs Root](./pt/README.md) - 🇧🇷 **Português (Brasil)** (`pt-BR`): [Docs Root](./pt-BR/README.md) -- 🇨🇿 **Čeština** (`cs`): [Docs Root](./cs/README.md) +- 🇷🇴 **Română** (`ro`): [Docs Root](./ro/README.md) +- 🇷🇺 **Русский** (`ru`): [Docs Root](./ru/README.md) +- 🇸🇰 **Slovenčina** (`sk`): [Docs Root](./sk/README.md) +- 🇸🇪 **Svenska** (`sv`): [Docs Root](./sv/README.md) +- 🇰🇪 **Kiswahili** (`sw`): [Docs Root](./sw/README.md) +- 🇮🇳 **தமிழ்** (`ta`): [Docs Root](./ta/README.md) +- 🇮🇳 **తెలుగు** (`te`): [Docs Root](./te/README.md) +- 🇹🇭 **ไทย** (`th`): [Docs Root](./th/README.md) - 🇹🇷 **Türkçe** (`tr`): [Docs Root](./tr/README.md) +- 🇺🇦 **Українська** (`uk-UA`): [Docs Root](./uk-UA/README.md) +- 🇵🇰 **اردو** (`ur`): [Docs Root](./ur/README.md) +- 🇻🇳 **Tiếng Việt** (`vi`): [Docs Root](./vi/README.md) +- 🇨🇳 **中文 (简体)** (`zh-CN`): [Docs Root](./zh-CN/README.md) diff --git a/docs/i18n/ar/CHANGELOG.md b/docs/i18n/ar/CHANGELOG.md index 11e05404..61f3589b 100644 --- a/docs/i18n/ar/CHANGELOG.md +++ b/docs/i18n/ar/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog (العربية) -🌐 **Languages:** 🇺🇸 [English](../../../CHANGELOG.md) · 🇪🇸 [es](../es/CHANGELOG.md) · 🇫🇷 [fr](../fr/CHANGELOG.md) · 🇩🇪 [de](../de/CHANGELOG.md) · 🇮🇹 [it](../it/CHANGELOG.md) · 🇷🇺 [ru](../ru/CHANGELOG.md) · 🇨🇳 [zh-CN](../zh-CN/CHANGELOG.md) · 🇯🇵 [ja](../ja/CHANGELOG.md) · 🇰🇷 [ko](../ko/CHANGELOG.md) · 🇸🇦 [ar](../ar/CHANGELOG.md) · 🇮🇳 [hi](../hi/CHANGELOG.md) · 🇮🇳 [in](../in/CHANGELOG.md) · 🇹🇭 [th](../th/CHANGELOG.md) · 🇻🇳 [vi](../vi/CHANGELOG.md) · 🇮🇩 [id](../id/CHANGELOG.md) · 🇲🇾 [ms](../ms/CHANGELOG.md) · 🇳🇱 [nl](../nl/CHANGELOG.md) · 🇵🇱 [pl](../pl/CHANGELOG.md) · 🇸🇪 [sv](../sv/CHANGELOG.md) · 🇳🇴 [no](../no/CHANGELOG.md) · 🇩🇰 [da](../da/CHANGELOG.md) · 🇫🇮 [fi](../fi/CHANGELOG.md) · 🇵🇹 [pt](../pt/CHANGELOG.md) · 🇷🇴 [ro](../ro/CHANGELOG.md) · 🇭🇺 [hu](../hu/CHANGELOG.md) · 🇧🇬 [bg](../bg/CHANGELOG.md) · 🇸🇰 [sk](../sk/CHANGELOG.md) · 🇺🇦 [uk-UA](../uk-UA/CHANGELOG.md) · 🇮🇱 [he](../he/CHANGELOG.md) · 🇵🇭 [phi](../phi/CHANGELOG.md) · 🇧🇷 [pt-BR](../pt-BR/CHANGELOG.md) · 🇨🇿 [cs](../cs/CHANGELOG.md) · 🇹🇷 [tr](../tr/CHANGELOG.md) +🌐 **Languages:** 🇺🇸 [English](../../../CHANGELOG.md) · 🇸🇦 [ar](../ar/CHANGELOG.md) · 🇧🇬 [bg](../bg/CHANGELOG.md) · 🇧🇩 [bn](../bn/CHANGELOG.md) · 🇨🇿 [cs](../cs/CHANGELOG.md) · 🇩🇰 [da](../da/CHANGELOG.md) · 🇩🇪 [de](../de/CHANGELOG.md) · 🇪🇸 [es](../es/CHANGELOG.md) · 🇮🇷 [fa](../fa/CHANGELOG.md) · 🇫🇮 [fi](../fi/CHANGELOG.md) · 🇫🇷 [fr](../fr/CHANGELOG.md) · 🇮🇳 [gu](../gu/CHANGELOG.md) · 🇮🇱 [he](../he/CHANGELOG.md) · 🇮🇳 [hi](../hi/CHANGELOG.md) · 🇭🇺 [hu](../hu/CHANGELOG.md) · 🇮🇩 [id](../id/CHANGELOG.md) · 🇮🇹 [it](../it/CHANGELOG.md) · 🇯🇵 [ja](../ja/CHANGELOG.md) · 🇰🇷 [ko](../ko/CHANGELOG.md) · 🇮🇳 [mr](../mr/CHANGELOG.md) · 🇲🇾 [ms](../ms/CHANGELOG.md) · 🇳🇱 [nl](../nl/CHANGELOG.md) · 🇳🇴 [no](../no/CHANGELOG.md) · 🇵🇭 [phi](../phi/CHANGELOG.md) · 🇵🇱 [pl](../pl/CHANGELOG.md) · 🇵🇹 [pt](../pt/CHANGELOG.md) · 🇧🇷 [pt-BR](../pt-BR/CHANGELOG.md) · 🇷🇴 [ro](../ro/CHANGELOG.md) · 🇷🇺 [ru](../ru/CHANGELOG.md) · 🇸🇰 [sk](../sk/CHANGELOG.md) · 🇸🇪 [sv](../sv/CHANGELOG.md) · 🇰🇪 [sw](../sw/CHANGELOG.md) · 🇮🇳 [ta](../ta/CHANGELOG.md) · 🇮🇳 [te](../te/CHANGELOG.md) · 🇹🇭 [th](../th/CHANGELOG.md) · 🇹🇷 [tr](../tr/CHANGELOG.md) · 🇺🇦 [uk-UA](../uk-UA/CHANGELOG.md) · 🇵🇰 [ur](../ur/CHANGELOG.md) · 🇻🇳 [vi](../vi/CHANGELOG.md) · 🇨🇳 [zh-CN](../zh-CN/CHANGELOG.md) --- @@ -8,19 +8,76 @@ --- -## [3.7.0] — 2026-04-19 +## [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(providers):** Add search functionality to the providers dashboard with i18n support. (#1511 — thanks @th-ch) +- **feat(providers):** Register 6 new models in the opencode-go provider catalog. (#1510 — thanks @kang-heewon) +- **feat(providers):** Add ModelScope provider (Chinese AI marketplace) with Kimi K2.5, GLM-5, and Step-3.5-Flash integration. (#1430 — thanks @clousky2020) +- **feat(providers):** Add LM Studio as an OpenAI-compatible local provider for self-hosted model inference. +- **feat(providers):** Add Grok 4.3 thinking model support for xAI web executor requests. - **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(core):** Add OpenAI Batch Processing API support — submit, monitor, and manage batch jobs through the proxy with full lifecycle tracking. +- **feat(vision-bridge):** Add automatic image description fallback for non-vision models via `VisionBridgeGuardrail` (priority 5). Intercepts image-bearing requests to non-vision models, extracts descriptions via a configurable vision model (default: gpt-4o-mini), and replaces images with text before forwarding. Fails open on any error. (#1476) - **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 with full i18n translations for batch processing workflows. (#1479) +- **feat(usage):** MiniMax + MiniMax-CN quota tracking in provider limits dashboard. (#1516) +- **feat(providers):** Fix OpenRouter remote discovery and unify managed model sync. (#1521) ### 🐛 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) +- **fix(providers):** Resolve 400 errors for GLM and Antigravity Claude adapter during request translation by scoping prompt caching to compatible Anthropic endpoints and flattening system instructions. (#1514, #1520, #1522) +- **fix(core):** Strip `reasoning_content` from OpenAI format messages for non-reasoning models to prevent upstream HTTP 400 validation errors. (#1505) +- **fix(ui):** Add missing UI wiring for "Add Memory" and "Import" buttons on the `/dashboard/memory` page. (#1506) +- **fix(core):** Add periodic runtime log rotation checks to prevent disk exhaustion in long-running instances. (#1504 — thanks @ether-btc) +- **fix(build):** Resolve missing `process` module in webpack client build for pino-abstract-transport. (#1509 — thanks @hartmark) +- **fix(ui):** Add dark mode support for native dropdown `