From 6b9c2754e8766ffb0c57cee153039c627becfe58 Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Sat, 21 Mar 2026 15:40:05 -0300 Subject: [PATCH 1/3] feat(providers): add LongCat AI, Pollinations, Cloudflare AI, Scaleway, AI/ML API New free providers: - LongCat AI (lc/): 50M tokens/day free during public beta - Pollinations AI (pol/): no API key needed, GPT-5/Claude/DeepSeek/Llama free - Cloudflare Workers AI (cf/): 10K Neurons/day, ~150 LLM responses, Whisper free - Scaleway AI (scw/): 1M free tokens for new accounts (EU/GDPR, Paris) - AI/ML API (aiml/): $0.025/day credits, 200+ models via single endpoint Provider metadata updates: - Together AI: hasFree=true + 3 permanently free model IDs (Llama 70B, Vision, DeepSeek) - Gemini: hasFree=true + freeNote (1,500 req/day free, no credit card) - NVIDIA NIM: already had hasFree=true, confirmed correct New executors: - open-sse/executors/pollinations.ts: optional auth (no key support) - open-sse/executors/cloudflare-ai.ts: dynamic URL with accountId credential Documentation: - README.md: 11-provider Ultimate Free Stack, 4 new pricing table rows - README.md: LongCat/Pollinations/Cloudflare AI/Scaleway provider detail sections - docs/i18n/pt-BR/README.md: updated pricing table + 4 new free provider sections - docs/i18n/cs/README.md: combo stack updated Tests: 821/821 pass (no regressions) --- README.md | 91 ++++- docs/i18n/cs/README.md | 574 +++++++++++----------------- docs/i18n/pt-BR/README.md | 87 ++++- open-sse/config/providerRegistry.ts | 104 +++++ open-sse/executors/cloudflare-ai.ts | 59 +++ open-sse/executors/index.ts | 8 + open-sse/executors/pollinations.ts | 46 +++ src/shared/constants/providers.ts | 69 +++- 8 files changed, 653 insertions(+), 385 deletions(-) create mode 100644 open-sse/executors/cloudflare-ai.ts create mode 100644 open-sse/executors/pollinations.ts diff --git a/README.md b/README.md index 0398c2c6fd..2b0e1f7f6e 100644 --- a/README.md +++ b/README.md @@ -718,7 +718,7 @@ Outcome: deep fallback depth for deadline-critical workloads **Point any IDE/CLI to:** `http://localhost:20128/v1` · API Key: `any-string` · Done. -> **Optional extra coverage (also free):** Groq API key (30 RPM free), NVIDIA NIM (40 RPM free, 70+ models), Cerebras (1M tok/day). +> **Optional extra coverage (also free):** Groq API key (30 RPM free), NVIDIA NIM (40 RPM free, 70+ models), Cerebras (1M tok/day), LongCat API key (50M tokens/day!), Cloudflare Workers AI (10K Neurons/day, 50+ models). ## ⚡ Quick Start @@ -923,18 +923,28 @@ When minimized, OmniRoute lives in your system tray with quick actions: | **🆓 FREE** | iFlow | **$0** | Unlimited | 5 models unlimited | | | Qwen | **$0** | Unlimited | 4 models unlimited | | | Kiro | **$0** | Unlimited | Claude Sonnet/Haiku (AWS Builder) | +| | LongCat Flash-Lite 🆕 | **$0** (50M tok/day 🔥) | 1 RPS | Largest free quota on Earth | +| | Pollinations AI 🆕 | **$0** (no key needed) | 1 req/15s | GPT-5, Claude, DeepSeek, Llama 4 | +| | Cloudflare Workers AI 🆕 | **$0** (10K Neurons/day) | ~150 resp/day | 50+ models, global edge | +| | Scaleway AI 🆕 | **$0** (1M tokens total) | Rate limited | EU/GDPR, Qwen3 235B, Llama 70B | > 🆕 **New models added (Mar 2026):** Grok-4 Fast family at $0.20/$0.50/M (benchmarked at 1143ms — 30% faster than Gemini 2.5 Flash), GLM-5 via Z.AI with 128K output, MiniMax M2.5 reasoning, DeepSeek V3.2 updated pricing, Kimi K2.5 via Moonshot direct API. **💡 $0 Combo Stack — The Complete Free Setup:** ``` -Gemini CLI (180K/mo free) - → iFlow (unlimited: kimi-k2-thinking, qwen3-coder-plus, deepseek-r1) - → Kiro (Claude Sonnet 4.5 + Haiku — unlimited, via AWS Builder ID) - → Qwen (4 models — unlimited) - → Groq (14.4K req/day — ultra-fast) - → NVIDIA NIM (70+ models — 40 RPM forever) +# 🆓 Ultimate Free Stack 2026 — 11 Providers, $0 Forever +Kiro (kr/) → Claude Sonnet/Haiku UNLIMITED +iFlow (if/) → kimi-k2-thinking, qwen3-coder-plus, deepseek-r1 UNLIMITED +LongCat Lite (lc/) → LongCat-Flash-Lite — 50M tokens/day 🔥 +Pollinations (pol/) → GPT-5, Claude, DeepSeek, Llama 4 — no key needed +Qwen (qw/) → qwen3-coder-plus, qwen3-coder-flash, qwen3-coder-next UNLIMITED +Gemini (gemini/) → Gemini 2.5 Flash — 1,500 req/day free API key +Cloudflare AI (cf/) → Llama 70B, Gemma 3, Mistral — 10K Neurons/day +Scaleway (scw/) → Qwen3 235B, Llama 70B — 1M free tokens (EU) +Groq (groq/) → Llama/Gemma ultra-fast — 14.4K req/day +NVIDIA NIM (nvidia/) → 70+ open models — 40 RPM forever +Cerebras (cerebras/) → Llama/Qwen world-fastest — 1M tok/day ``` **Zero cost. Never stops coding.** Configure this as one OmniRoute combo and all fallbacks happen automatically — no manual switching ever. @@ -1005,19 +1015,66 @@ Available free: `llama-3.3-70b`, `llama-3.1-8b`, `deepseek-r1-distill-llama-70b` Available free: `llama-3.3-70b-versatile`, `gemma2-9b-it`, `mixtral-8x7b`, `whisper-large-v3` -> **💡 The Ultimate Free Stack:** +### 🔴 LONGCAT AI (Free API Key — longcat.chat) 🆕 + +| Model | Prefix | Daily Free Quota | Notes | +| ----------------------------- | ------ | ----------------- | ----------------------- | +| `LongCat-Flash-Lite` | `lc/` | **50M tokens** 💥 | Largest free quota ever | +| `LongCat-Flash-Chat` | `lc/` | 500K tokens | Multi-turn chat | +| `LongCat-Flash-Thinking` | `lc/` | 500K tokens | Reasoning / CoT | +| `LongCat-Flash-Thinking-2601` | `lc/` | 500K tokens | Jan 2026 version | +| `LongCat-Flash-Omni-2603` | `lc/` | 500K tokens | Multimodal | + +> 100% free while in public beta. Sign up at [longcat.chat](https://longcat.chat) with email or phone. Resets daily 00:00 UTC. + +### 🟢 POLLINATIONS AI (No API Key Required) 🆕 + +| Model | Prefix | Rate Limit | Provider Behind | +| ---------- | ------ | ---------- | ------------------ | +| `openai` | `pol/` | 1 req/15s | GPT-5 | +| `claude` | `pol/` | 1 req/15s | Anthropic Claude | +| `gemini` | `pol/` | 1 req/15s | Google Gemini | +| `deepseek` | `pol/` | 1 req/15s | DeepSeek V3 | +| `llama` | `pol/` | 1 req/15s | Meta Llama 4 Scout | +| `mistral` | `pol/` | 1 req/15s | Mistral AI | + +> ✨ **Zero friction:** No signup, no API key. Add the Pollinations provider with an empty key field and it works immediately. + +### 🟠 CLOUDFLARE WORKERS AI (Free API Key — cloudflare.com) 🆕 + +| Tier | Daily Neurons | Equivalent Usage | Notes | +| ---- | ------------- | --------------------------------------- | ----------------------- | +| Free | **10,000** | ~150 LLM resp / 500s audio / 15K embeds | Global edge, 50+ models | + +Popular free models: `@cf/meta/llama-3.3-70b-instruct`, `@cf/google/gemma-3-12b-it`, `@cf/openai/whisper-large-v3-turbo` (free audio!), `@cf/qwen/qwen2.5-coder-15b-instruct` + +> Requires API Token + Account ID from [dash.cloudflare.com](https://dash.cloudflare.com). Store Account ID in provider settings. + +### 🟣 SCALEWAY AI (1M Free Tokens — scaleway.com) 🆕 + +| Tier | Free Quota | Location | Notes | +| ---- | ------------- | ------------ | ----------------------------------- | +| Free | **1M tokens** | 🇫🇷 Paris, EU | No credit card needed within limits | + +Available free: `qwen3-235b-a22b-instruct-2507` (Qwen3 235B!), `llama-3.1-70b-instruct`, `mistral-small-3.2-24b-instruct-2506`, `deepseek-v3-0324` + +> EU/GDPR compliant. Get API key at [console.scaleway.com](https://console.scaleway.com). + +> **💡 The Ultimate Free Stack (11 Providers, $0 Forever):** > > ``` -> Kiro (Claude, unlimited) -> → iFlow (5 models, unlimited) -> → Qwen (4 models, unlimited) -> → Gemini CLI (180K/mo) -> → Cerebras (1M tok/day) -> → Groq (14.4K req/day) -> → NVIDIA NIM (40 RPM, 70+ models) +> Kiro (kr/) → Claude Sonnet/Haiku UNLIMITED +> iFlow (if/) → kimi-k2-thinking, qwen3-coder-plus, deepseek-r1 UNLIMITED +> LongCat Lite (lc/) → LongCat-Flash-Lite — 50M tokens/day 🔥 +> Pollinations (pol/) → GPT-5, Claude, DeepSeek, Llama 4 — no key needed +> Qwen (qw/) → qwen3-coder models UNLIMITED +> Gemini (gemini/) → Gemini 2.5 Flash — 1,500 req/day free +> Cloudflare AI (cf/) → 50+ models — 10K Neurons/day +> Scaleway (scw/) → Qwen3 235B, Llama 70B — 1M free tokens (EU) +> Groq (groq/) → Llama/Gemma — 14.4K req/day ultra-fast +> NVIDIA NIM (nvidia/) → 70+ open models — 40 RPM forever +> Cerebras (cerebras/) → Llama/Qwen world-fastest — 1M tok/day > ``` -> -> Configure this as an OmniRoute combo and you'll never pay for AI again. ## 🎙️ Free Transcription Combo diff --git a/docs/i18n/cs/README.md b/docs/i18n/cs/README.md index 9f95d787ea..d77fab67ac 100644 --- a/docs/i18n/cs/README.md +++ b/docs/i18n/cs/README.md @@ -2,7 +2,7 @@ ### Nikdy nepřestávejte s kódováním. Chytré směrování k **BEZPLATNÝM a levným modelům AI** s automatickým přepínáním mezi záložními systémy. -*Váš univerzální API proxy – jeden endpoint, více než 44 poskytovatelů, nulové výpadky. Nyní s orchestrací agentů **MCP a A2A** .* +_Váš univerzální API proxy – jeden endpoint, více než 44 poskytovatelů, nulové výpadky. Nyní s orchestrací agentů **MCP a A2A** ._ **Dokončení chatu • Vkládání • Generování obrázků • Video • Hudba • Audio • Změna pořadí • **Vyhledávání na webu** • MCP server • A2A protokol • 100% TypeScript** @@ -30,26 +30,23 @@ Kliknutím zobrazíte snímky obrazovky z řídicího panelu -Strana | Snímek obrazovky ---- | --- -**Poskytovatelé** | ![Poskytovatelé](docs/screenshots/01-providers.png) -**Kombinace** | ![Kombinace](docs/screenshots/02-combos.png) -**Analytika** | ![Analytika](docs/screenshots/03-analytics.png) -**Zdraví** | ![Zdraví](docs/screenshots/04-health.png) -**Překladatel** | ![Překladatel](docs/screenshots/05-translator.png) -**Nastavení** | ![Nastavení](docs/screenshots/06-settings.png) -**Nástroje CLI** | ![Nástroje CLI](docs/screenshots/07-cli-tools.png) -**Protokoly používání** | ![Používání](docs/screenshots/08-usage.png) -**Koncové body** | ![Koncové body](docs/screenshots/09-endpoint.png) - - - +| Strana | Snímek obrazovky | +| ----------------------- | --------------------------------------------------- | +| **Poskytovatelé** | ![Poskytovatelé](docs/screenshots/01-providers.png) | +| **Kombinace** | ![Kombinace](docs/screenshots/02-combos.png) | +| **Analytika** | ![Analytika](docs/screenshots/03-analytics.png) | +| **Zdraví** | ![Zdraví](docs/screenshots/04-health.png) | +| **Překladatel** | ![Překladatel](docs/screenshots/05-translator.png) | +| **Nastavení** | ![Nastavení](docs/screenshots/06-settings.png) | +| **Nástroje CLI** | ![Nástroje CLI](docs/screenshots/07-cli-tools.png) | +| **Protokoly používání** | ![Používání](docs/screenshots/08-usage.png) | +| **Koncové body** | ![Koncové body](docs/screenshots/09-endpoint.png) | --- ### 🤖 Bezplatný poskytovatel umělé inteligence pro vaše oblíbené programátory -*Připojte libovolný nástroj IDE nebo CLI s umělou inteligencí přes OmniRoute — bezplatnou API bránu pro neomezené kódování.* +_Připojte libovolný nástroj IDE nebo CLI s umělou inteligencí přes OmniRoute — bezplatnou API bránu pro neomezené kódování._ @@ -68,7 +65,6 @@ Strana | Snímek obrazovky
- 📡 Všichni agenti se připojují přes http://localhost:20128/v1 nebo http://cloud.omniroute.online/v1 — jedna konfigurace, neomezené modely a kvóty --- @@ -161,9 +157,6 @@ Vývojáři platí za Claude Pro, Codex Pro nebo GitHub Copilot 20–200 dolarů - **Vlastní kombinace** — Přizpůsobitelné záložní řetězce se 6 strategiemi vyvažování (fill-first, round robin, P2C, náhodné, nejméně používané, nákladově optimalizované) - **Codex Business Quotas** — Sledování kvót pracovního prostoru firmy/týmu přímo v dashboardu - - -
🔌 2. „Potřebuji použít více poskytovatelů, ale každý má jiné API“
@@ -180,9 +173,6 @@ OpenAI používá jeden formát, Claude (Anthropic) jiný a Gemini ještě třet - **Strukturovaný výstup pro Gemini** — `json_schema` → automatická konverze `responseMimeType` / `responseSchema` - **Výchozí hodnota `stream` je `false`** – Odpovídá specifikaci OpenAI, čímž se zabrání neočekávanému SSE v Python/Rust/Go SDK. - - -
🌐 3. „Můj poskytovatel AI blokuje můj region/zemi“
@@ -199,9 +189,6 @@ Poskytovatelé jako OpenAI/Codex blokují přístup z určitých geografických - **TLS Fingerprint Spoofing** — Otisk prstu TLS podobný prohlížeči pomocí `wreq-js` pro obcházení detekce botů - **🔏 Porovnávání otisků prstů v CLI** — Změní pořadí záhlaví a polí v těle serveru tak, aby odpovídala nativním binárním podpisům v CLI, čímž drasticky snižuje riziko nahlašování účtu. IP adresa proxy je zachována — získáte současně stealth **i** maskování IP adresy. - - -
🆓 4. „Chci používat umělou inteligenci pro kódování, ale nemám peníze“
@@ -216,9 +203,6 @@ Ne každý si může dovolit zaplatit 20–200 dolarů měsíčně za předplatn - **NVIDIA NIM Free Access** — ~40 RPM developerský přístup k více než 70 modelům na build.nvidia.com (přechod z kreditů na čisté limity rychlosti) - **Strategie optimalizace nákladů** – Strategie směrování, která automaticky vybere nejlevnějšího dostupného poskytovatele - - -
🔒 5. „Potřebuji chránit svou bránu umělé inteligence před neoprávněným přístupem“
@@ -236,9 +220,6 @@ Při zpřístupnění brány umělé inteligence síti (LAN, VPS, Docker) může - **Ochrana proti vkládání výzev** – Sanitizace proti škodlivým vzorcům výzev - **Šifrování AES-256-GCM** – přihlašovací údaje jsou v klidovém stavu šifrovány - - -
🛑 6. „Můj poskytovatel selhal a já ztratil/a programovací tok“
@@ -254,9 +235,6 @@ Poskytovatelé umělé inteligence se mohou stát nestabilními, vracet chyby 5x - **Kombinovaný jistič** – Automaticky deaktivuje selhávajícího poskytovatele v rámci kombinovaného řetězce - **Dashboard stavu** — Monitorování provozuschopnosti, stavy jističů, uzamčení, statistiky mezipaměti, latence p50/p95/p99 - - -
🔧 7. „Konfigurace každého nástroje umělé inteligence je zdlouhavá a opakující se“
@@ -270,9 +248,6 @@ Vývojáři používají Cursor, Claude Code, Codex CLI, OpenClaw, Gemini CLI, K - **Průvodce zaváděním** – 4krokové nastavení pro začínající uživatele - **Jeden koncový bod, všechny modely** – jednou nakonfigurujte `http://localhost:20128/v1` a získejte přístup k více než 44 poskytovatelům - - -
🔑 8. „Správa OAuth tokenů od více poskytovatelů je peklo“
@@ -288,9 +263,6 @@ Claude Code, Codex, Gemini CLI, Copilot – všechny používají OAuth 2.0 s to - **OAuth Behind Nginx** — Používá `window.location.origin` pro kompatibilitu s reverzní proxy - **Průvodce vzdáleným OAuth** – Podrobný návod k přihlašovacím údajům Google Cloud na VPS/Dockeru - - -
📊 9. „Nevím, kolik utrácím ani kde“
@@ -305,9 +277,6 @@ Vývojáři používají více placených poskytovatelů, ale nemají jednotný - **Statistiky použití pro každý klíč API** — Počet požadavků a časové razítko posledního použití pro každý klíč - **Analytický panel** – Statistické karty, graf využití modelu, tabulka poskytovatelů s mírou úspěšnosti a latencí - - -
🐛 10. „Nedokážu diagnostikovat chyby a problémy ve volání umělé inteligence.“
@@ -324,9 +293,6 @@ Když volání selže, vývojář neví, zda se jednalo o limit rychlosti, vypr - **Souborové protokolování s rotací** – Konzolový interceptor zachycuje vše do protokolu JSON s rotací na základě velikosti - **Zpráva o systémových informacích** — příkaz `npm run system-info` vygeneruje `system-info.txt` s kompletním popisem vašeho prostředí (verze uzlu, verze OmniRoute, operační systém, nástroje CLI, stav Dockeru/PM2). Přiložte jej při hlášení problémů pro okamžité třídění. - - -
🏗️ 11. „Nasazení a údržba brány je složitá“
@@ -343,9 +309,6 @@ Instalace, konfigurace a údržba AI proxy v různých prostředích (lokální, - **Cloud Sync** – Konfigurace synchronizace mezi zařízeními pomocí Cloudflare Workers - **Zálohy databází** — Automatické zálohování, obnovení, export a import všech nastavení - - -
🌍 12. „Rozhraní je pouze v angličtině a můj tým nemluví anglicky“
@@ -359,9 +322,6 @@ Týmy v neanglicky mluvících zemích, zejména v Latinské Americe, Asii a Evr - **Vícejazyčné soubory README** — 30 kompletních překladů dokumentace - **Výběr jazyka** — Ikona glóbu v záhlaví pro přepínání v reálném čase - - -
🔄 13. „Potřebuji víc než jen chat – potřebuji vložené soubory, obrázky, zvuk.“
@@ -380,9 +340,6 @@ Umělá inteligence není jen dokončování chatu. Vývojáři potřebují gene - **Změna pořadí** — `/v1/rerank` — Změna pořadí relevance dokumentu - **Responses API** — Plná podpora `/v1/responses` pro Codex - - -
🧪 14. „Nemám způsob, jak testovat a porovnávat kvalitu napříč modely.“
@@ -397,9 +354,6 @@ Vývojáři chtějí vědět, který model je pro jejich případ použití nejl - **Tester chatu** — Kompletní okružní cesta s vizuálním vykreslováním odpovědí - **Živý monitor** — Stream všech požadavků procházejících proxy serverem v reálném čase - - -
📈 15. „Potřebuji škálovat bez ztráty výkonu“
@@ -415,9 +369,6 @@ S rostoucím objemem požadavků generují stejné otázky bez ukládání do me - **Mezipaměť pro ověření klíčů API** — třívrstvá mezipaměť pro výkon produkčního prostředí - **Dashboard s telemetrií** – latence p50/p95/p99, statistiky mezipaměti, dostupnost - - -
🤖 16. „Chci mít chování modelů globálně pod kontrolou“
@@ -434,9 +385,6 @@ Vývojáři, kteří chtějí všechny odpovědi v určitém jazyce, se specific - **Přepínání poskytovatele** – Povolení/zakázání všech připojení pro poskytovatele jedním kliknutím - **Blokovaní poskytovatelé** – Vyloučení konkrétních poskytovatelů ze seznamu `/v1/models` - - -
🧰 17. „Potřebuji nástroje MCP jako prvotřídní produktové funkce.“
@@ -449,9 +397,6 @@ Mnoho bran umělé inteligence odhaluje MCP pouze jako skrytý implementační d - Vyhrazená stránka pro správu MCP s procesy, nástroji, rozsahy a auditem - Vestavěný rychlý start pro `omniroute --mcp` a onboarding klienta - - -
🧠 18. „Potřebuji orchestraci A2A se synchronizací a cestami úloh streamu.“
@@ -464,9 +409,6 @@ Pracovní postupy agentů vyžadují jak přímé odpovědi, tak dlouhodobé str - Streamování SSE s šířením stavu terminálu - Rozhraní API životního cyklu úloh pro `tasks/get` a `tasks/cancel` - - -
🛰️ 19. „Potřebuji skutečný stav procesu MCP, ne odhadovaný stav.“
@@ -479,9 +421,6 @@ Provozní týmy potřebují vědět, zda je MCP skutečně aktivní, nejen zda j - API stavu MCP kombinující prezenční signál a nedávnou aktivitu - Karty stavu uživatelského rozhraní pro zobrazení aktuálnosti procesů/provozuschopnosti/prezenčního signálu - - -
📋 20. „Potřebuji auditovatelné provedení nástroje MCP“
@@ -494,9 +433,6 @@ Když nástroje mění konfiguraci nebo spouštějí operační akce, týmy pot - Filtruje podle nástroje, úspěchu/neúspěchu, klíče API a stránkování - Tabulka auditu dashboardu + koncové body statistik pro automatizaci - - -
🔐 21. „Potřebuji omezená oprávnění MCP pro každou integraci.“
@@ -509,9 +445,6 @@ Různí klienti by měli mít přístup ke kategoriím nástrojů s nejnižším - Vynucení rozsahu a viditelnost v uživatelském rozhraní správy MCP - Bezpečná výchozí poloha pro provozní nástroje - - -
⚙️ 22. „Potřebuji provozní kontroly bez nutnosti přesouvání“
@@ -524,9 +457,6 @@ Týmy potřebují rychlé změny v běhovém prostředí během incidentů nebo - Používejte profily odolnosti z předdefinovaných balíčků zásad - Resetujte stav jističe ze stejného ovládacího panelu - - -
🔄 23. „Potřebuji živý přehled o životním cyklu úkolů A2A a jejich zrušení.“
@@ -539,9 +469,6 @@ Bez přehledu o životním cyklu je obtížné třídit incidenty úkolů. - Podrobný přehled metadat úloh, událostí a artefaktů - Koncový bod zrušení úlohy a akce uživatelského rozhraní s potvrzením - - -
🌊 24. „Potřebuji metriky aktivního streamu pro A2A zátěž“
@@ -554,9 +481,6 @@ Streamovací pracovní postupy vyžadují provozní přehled o souběžnosti a - Časové razítko posledního úkolu a počty pro jednotlivé stavy - Karty A2A dashboardu pro monitorování provozu v reálném čase - - -
🪪 25. „Potřebuji standardní vyhledávání agentů pro klienty“
@@ -569,9 +493,6 @@ Externí klienti a orchestratoři potřebují pro onboarding strojově čitelná - Schopnosti a dovednosti zobrazené v uživatelském rozhraní pro správu - API pro stav A2A zahrnuje metadata pro zjišťování pro automatizaci - - -
🧭 26. „Potřebuji v uživatelském rozhraní produktu zjistitelnost protokolu.“
@@ -584,9 +505,6 @@ Pokud uživatelé nemohou objevit protokolové povrchy, kvalita přijetí a podp - Přepínání stavu inline služby (Online/Offline) pro MCP a A2A - Odkazy z přehledu na vyhrazené karty pro správu - - -
🧪 27. „Potřebuji komplexní ověření protokolu se skutečnými klienty.“
@@ -599,9 +517,6 @@ Simulované testy nestačí k ověření kompatibility protokolu před vydáním - Klientské testy A2A pro toky zjišťování, odesílání, streamování, načítání a zrušení - Křížová kontrola tvrzení oproti API pro audit MCP a úkoly A2A - - -
📡 28. „Potřebuji jednotnou pozorovatelnost napříč všemi rozhraními“
@@ -614,9 +529,6 @@ Rozdělení pozorovatelnosti podle protokolu vytváří slepá místa a delší - Stav + audit + telemetrie požadavků napříč vrstvami OpenAI, MCP a A2A - Provozní API pro stav a automatizaci - - -
💼 29. „Potřebuji jeden runtime pro proxy + nástroje + orchestraci agentů“
@@ -629,9 +541,6 @@ Spouštění mnoha samostatných služeb zvyšuje provozní náklady a počet po - Sdílené ověřování, odolnost, úložiště dat a pozorovatelnost - Konzistentní model politik napříč všemi interakčními plochami - - -
🚀 30. „Potřebuji agentské pracovní postupy bez slepení kódu.“
@@ -644,9 +553,6 @@ Týmy ztrácejí rychlost při spojování více ad-hoc služeb a skriptů. - Vestavěná uživatelská rozhraní pro správu protokolů a cesty pro ověřování kouře - Základy připravené pro produkční prostředí (zabezpečení, protokolování, odolnost, zálohování) - - - ### Příklady herních plánů (integrované případy užití) **Příručka A: Maximalizace placeného předplatného + levné zálohování** @@ -701,13 +607,13 @@ Outcome: deep fallback depth for deadline-critical workloads > Nastavte si kódování s umělou inteligencí během několika minut za **0 $/měsíc** . Propojte tyto bezplatné účty a využijte vestavěnou kombinaci **Free Stack** . -Krok | Akce | Poskytovatelé odemčeni ---- | --- | --- -1 | Připojení **Kiro** (AWS Builder ID OAuth) | Claude Sonnet 4.5, Haiku 4.5 – **neomezeně** -2 | Připojení k **iFlow** (Google OAuth) | kimi-k2-myšlení, qwen3-coder-plus, deepseek-r1... — **neomezeně** -3 | Připojení **Qwen** (kód zařízení) | qwen3-coder-plus, qwen3-coder-flash... — **neomezeně** -4 | Připojení **rozhraní příkazového řádku Gemini** (Google OAuth) | gemini-3-flash, gemini-2.5-pro — **180 000 GBP/měsíc zdarma** -5 | `/dashboard/combos` → Šablona **Free Stack (0 $)** | Automatické zařazení všech bezplatných poskytovatelů do routingu +| Krok | Akce | Poskytovatelé odemčeni | +| ---- | -------------------------------------------------------------- | ----------------------------------------------------------------- | +| 1 | Připojení **Kiro** (AWS Builder ID OAuth) | Claude Sonnet 4.5, Haiku 4.5 – **neomezeně** | +| 2 | Připojení k **iFlow** (Google OAuth) | kimi-k2-myšlení, qwen3-coder-plus, deepseek-r1... — **neomezeně** | +| 3 | Připojení **Qwen** (kód zařízení) | qwen3-coder-plus, qwen3-coder-flash... — **neomezeně** | +| 4 | Připojení **rozhraní příkazového řádku Gemini** (Google OAuth) | gemini-3-flash, gemini-2.5-pro — **180 000 GBP/měsíc zdarma** | +| 5 | `/dashboard/combos` → Šablona **Free Stack (0 $)** | Automatické zařazení všech bezplatných poskytovatelů do routingu | **V libovolném IDE/CLI naveďte:** `http://localhost:20128/v1` · Klíč API: `any-string` · Hotovo. @@ -732,13 +638,13 @@ omniroute Dashboard se otevírá na `http://localhost:20128` a základní URL API je `http://localhost:20128/v1` . -Příkaz | Popis ---- | --- -`omniroute` | Spuštění serveru ( `PORT=20128` , API a dashboard na stejném portu) -`omniroute --port 3000` | Nastavte kanonický/API port na 3000 -`omniroute --mcp` | Spuštění MCP serveru (transport stdio) -`omniroute --no-open` | Neotevírat prohlížeč automaticky -`omniroute --help` | Zobrazit nápovědu +| Příkaz | Popis | +| ----------------------- | ------------------------------------------------------------------- | +| `omniroute` | Spuštění serveru ( `PORT=20128` , API a dashboard na stejném portu) | +| `omniroute --port 3000` | Nastavte kanonický/API port na 3000 | +| `omniroute --mcp` | Spuštění MCP serveru (transport stdio) | +| `omniroute --no-open` | Neotevírat prohlížeč automaticky | +| `omniroute --help` | Zobrazit nápovědu | Volitelný režim s rozděleným portem: @@ -847,10 +753,10 @@ docker compose --profile base up -d docker compose --profile cli up -d ``` -Obraz | Štítek | Velikost | Popis ---- | --- | --- | --- -`diegosouzapw/omniroute` | `latest` | ~250 MB | Nejnovější stabilní verze -`diegosouzapw/omniroute` | `1.0.3` | ~250 MB | Aktuální verze +| Obraz | Štítek | Velikost | Popis | +| ------------------------ | -------- | -------- | ------------------------- | +| `diegosouzapw/omniroute` | `latest` | ~250 MB | Nejnovější stabilní verze | +| `diegosouzapw/omniroute` | `1.0.3` | ~250 MB | Aktuální verze | --- @@ -893,41 +799,47 @@ Po minimalizaci se OmniRoute nachází v systémové liště a nabízí rychlé ## 💰 Přehled cen -Úroveň | Poskytovatel | Náklady | Obnovení kvóty | Nejlepší pro ---- | --- | --- | --- | --- -**💳 PŘEDPLATNÉ** | Claude Code (profesionál) | 20 dolarů měsíčně | 5 hodin + týdně | Již přihlášen/a k odběru - | Kodex (Plus/Pro) | 20–200 USD/měsíc | 5 hodin + týdně | Uživatelé OpenAI - | Rozhraní příkazového řádku Gemini | **UVOLNIT** | 180 tisíc měsíčně + 1 tisíc denně | Každý! - | GitHub Copilot | 10–19 USD/měsíc | Měsíční | Uživatelé GitHubu -**🔑 KLÍČ API** | NVIDIA NIM | **ZDARMA** (vývoj navždy) | ~40 ot./min | 70+ otevřených modelů - | Mozky | **ZDARMA** (1 milion tok/den) | 60 000 otáček za minutu / 30 ot./min | Nejrychlejší na světě - | Groq | **ZDARMA** (30 ot./min.) | 14,4 tisíc otáček za minutu | Ultrarychlá lama/gema - | DeepSeek V3.2 | 0,27/1,10 USD za 1 milion | Žádný | Nejlepší zdůvodnění ceny a kvality - | xAI Grok-4 Rychlý | **0,20/0,50 USD za 1 milion** 🆕 | Žádný | Nejrychlejší + volání nástroje, ultranízké - | xAI Grok-4 (standardní) | 0,20/1,50 USD za 1 milion 🆕 | Žádný | Vlajková loď Reasoning od xAI - | Mistral | Zkušební verze zdarma + placené | Omezená sazba | Evropská umělá inteligence - | OpenRouter | Platba za použití | Žádný | Více než 100 modelů agregováno. -**💰 LEVNÉ** | GLM-5 (přes Z.AI) 🆕 | 0,5 USD/1 milion | Denně v 10:00 | Výstup 128 tisíc obrazových bodů, nejnovější vlajková loď - | GLM-4.7 | 0,6 USD/1 milion | Denně v 10:00 | Záloha rozpočtu - | MiniMax M2.5 🆕 | Vstup 0,3 USD/1 milion | 5hodinové válcování | Úvaha + agentní úkoly - | MiniMax M2.1 | 0,2 USD/1 milion | 5hodinové válcování | Nejlevnější varianta - | Kimi K2.5 (Moonshot API) 🆕 | Platba za použití | Žádný | Přímý přístup k Moonshot API - | Kimi K2 | 9 dolarů měsíčně bez závazků | 10 milionů tokenů/měsíc | Předvídatelné náklady -**🆓 ZDARMA** | iFlow | **0 dolarů** | Neomezený | 5 modelů neomezeně - | Qwen | **0 dolarů** | Neomezený | 4 modely neomezeně - | Kiro | **0 dolarů** | Neomezený | Claude Sonnet/Haiku (tvorce AWS) +| Úroveň | Poskytovatel | Náklady | Obnovení kvóty | Nejlepší pro | +| --------------------------------- | -------------------------------- | ------------------------------------ | ------------------------------------------ | --------------------------------------------------------- | +| **💳 PŘEDPLATNÉ** | Claude Code (profesionál) | 20 dolarů měsíčně | 5 hodin + týdně | Již přihlášen/a k odběru | +| Kodex (Plus/Pro) | 20–200 USD/měsíc | 5 hodin + týdně | Uživatelé OpenAI | +| Rozhraní příkazového řádku Gemini | **UVOLNIT** | 180 tisíc měsíčně + 1 tisíc denně | Každý! | +| GitHub Copilot | 10–19 USD/měsíc | Měsíční | Uživatelé GitHubu | +| **🔑 KLÍČ API** | NVIDIA NIM | **ZDARMA** (vývoj navždy) | ~40 ot./min | 70+ otevřených modelů | +| Mozky | **ZDARMA** (1 milion tok/den) | 60 000 otáček za minutu / 30 ot./min | Nejrychlejší na světě | +| Groq | **ZDARMA** (30 ot./min.) | 14,4 tisíc otáček za minutu | Ultrarychlá lama/gema | +| DeepSeek V3.2 | 0,27/1,10 USD za 1 milion | Žádný | Nejlepší zdůvodnění ceny a kvality | +| xAI Grok-4 Rychlý | **0,20/0,50 USD za 1 milion** 🆕 | Žádný | Nejrychlejší + volání nástroje, ultranízké | +| xAI Grok-4 (standardní) | 0,20/1,50 USD za 1 milion 🆕 | Žádný | Vlajková loď Reasoning od xAI | +| Mistral | Zkušební verze zdarma + placené | Omezená sazba | Evropská umělá inteligence | +| OpenRouter | Platba za použití | Žádný | Více než 100 modelů agregováno. | +| **💰 LEVNÉ** | GLM-5 (přes Z.AI) 🆕 | 0,5 USD/1 milion | Denně v 10:00 | Výstup 128 tisíc obrazových bodů, nejnovější vlajková loď | +| GLM-4.7 | 0,6 USD/1 milion | Denně v 10:00 | Záloha rozpočtu | +| MiniMax M2.5 🆕 | Vstup 0,3 USD/1 milion | 5hodinové válcování | Úvaha + agentní úkoly | +| MiniMax M2.1 | 0,2 USD/1 milion | 5hodinové válcování | Nejlevnější varianta | +| Kimi K2.5 (Moonshot API) 🆕 | Platba za použití | Žádný | Přímý přístup k Moonshot API | +| Kimi K2 | 9 dolarů měsíčně bez závazků | 10 milionů tokenů/měsíc | Předvídatelné náklady | +| **🆓 ZDARMA** | iFlow | **0 dolarů** | Neomezený | 5 modelů neomezeně | +| Qwen | **0 dolarů** | Neomezený | 4 modely neomezeně | +| Kiro | **0 dolarů** | Neomezený | Claude Sonnet/Haiku (tvorce AWS) | > 🆕 **Přidány nové modely (březen 2026):** řada Grok-4 Fast za 0,20 USD/0,50 USD/M (benchmarkováno na 1143 ms – o 30 % rychlejší než Gemini 2.5 Flash), GLM-5 přes Z.AI s výstupem 128K, uvažování MiniMax M2.5, aktualizované ceny DeepSeek V3.2, Kimi K2.5 přes Moonshot Direct API. **💡 Kombinovaný balík za 0 $ — Kompletní bezplatná instalace:** ``` -Gemini CLI (180K/mo free) - → iFlow (unlimited: kimi-k2-thinking, qwen3-coder-plus, deepseek-r1) - → Kiro (Claude Sonnet 4.5 + Haiku — unlimited, via AWS Builder ID) - → Qwen (4 models — unlimited) - → Groq (14.4K req/day — ultra-fast) - → NVIDIA NIM (70+ models — 40 RPM forever) +# 🆓 Ultimate Free Stack 2026 — 11 Providers, $0 Forever +Kiro (kr/) → Claude Sonnet/Haiku UNLIMITED +iFlow (if/) → kimi-k2-thinking, qwen3-coder-plus, deepseek-r1 UNLIMITED +LongCat Lite (lc/) → LongCat-Flash-Lite — 50M tokens/day 🔥 +Pollinations (pol/) → GPT-5, Claude, DeepSeek, Llama 4 — no key needed +Qwen (qw/) → qwen3-coder-plus, qwen3-coder-flash, qwen3-coder-next UNLIMITED +Gemini (gemini/) → Gemini 2.5 Flash — 1,500 req/day free API key +Cloudflare AI (cf/) → Llama 70B, Gemma 3, Mistral — 10K Neurons/day +Scaleway (scw/) → Qwen3 235B, Llama 70B — 1M free tokens (EU) +Groq (groq/) → Llama/Gemma ultra-fast — 14.4K req/day +NVIDIA NIM (nvidia/) → 70+ open models — 40 RPM forever +Cerebras (cerebras/) → Llama/Qwen world-fastest — 1M tok/day ``` **Nulové náklady. Nikdy nepřestávejte s kódováním.** Nakonfigurujte si to jako jednu kombinaci OmniRoute a všechny záložní režimy se provede automaticky – žádné ruční přepínání. @@ -942,59 +854,59 @@ Gemini CLI (180K/mo free) ### 🔵 CLAUDE MODELS (přes Kiro — AWS Builder ID) -Model | Předpona | Omezit | Limit rychlosti ---- | --- | --- | --- -`claude-sonnet-4.5` | `kr/` | **Neomezený** | Žádný hlášený denní limit -`claude-haiku-4.5` | `kr/` | **Neomezený** | Žádný hlášený denní limit -`claude-opus-4.6` | `kr/` | **Neomezený** | Nejnovější opus od Kira +| Model | Předpona | Omezit | Limit rychlosti | +| ------------------- | -------- | ------------- | ------------------------- | +| `claude-sonnet-4.5` | `kr/` | **Neomezený** | Žádný hlášený denní limit | +| `claude-haiku-4.5` | `kr/` | **Neomezený** | Žádný hlášený denní limit | +| `claude-opus-4.6` | `kr/` | **Neomezený** | Nejnovější opus od Kira | ### 🟢 MODELY IFLOW (Bezplatné OAuth — bez nutnosti platit kreditní kartou) -Model | Předpona | Omezit | Limit rychlosti ---- | --- | --- | --- -`kimi-k2-thinking` | `if/` | **Neomezený** | Žádný hlášený strop -`qwen3-coder-plus` | `if/` | **Neomezený** | Žádný hlášený strop -`deepseek-r1` | `if/` | **Neomezený** | Žádný hlášený strop -`minimax-m2.1` | `if/` | **Neomezený** | Žádný hlášený strop -`kimi-k2` | `if/` | **Neomezený** | Žádný hlášený strop +| Model | Předpona | Omezit | Limit rychlosti | +| ------------------ | -------- | ------------- | ------------------- | +| `kimi-k2-thinking` | `if/` | **Neomezený** | Žádný hlášený strop | +| `qwen3-coder-plus` | `if/` | **Neomezený** | Žádný hlášený strop | +| `deepseek-r1` | `if/` | **Neomezený** | Žádný hlášený strop | +| `minimax-m2.1` | `if/` | **Neomezený** | Žádný hlášený strop | +| `kimi-k2` | `if/` | **Neomezený** | Žádný hlášený strop | ### 🟡 MODELY QWEN (Ověření kódu zařízení) -Model | Předpona | Omezit | Limit rychlosti ---- | --- | --- | --- -`qwen3-coder-plus` | `qw/` | **Neomezený** | Žádný hlášený strop -`qwen3-coder-flash` | `qw/` | **Neomezený** | Žádný hlášený strop -`qwen3-coder-next` | `qw/` | **Neomezený** | Žádný hlášený strop -`vision-model` | `qw/` | **Neomezený** | Multimodální (obrázky) +| Model | Předpona | Omezit | Limit rychlosti | +| ------------------- | -------- | ------------- | ---------------------- | +| `qwen3-coder-plus` | `qw/` | **Neomezený** | Žádný hlášený strop | +| `qwen3-coder-flash` | `qw/` | **Neomezený** | Žádný hlášený strop | +| `qwen3-coder-next` | `qw/` | **Neomezený** | Žádný hlášený strop | +| `vision-model` | `qw/` | **Neomezený** | Multimodální (obrázky) | ### 🟣 Rozhraní GEMINI CLI (Google OAuth) -Model | Předpona | Omezit | Limit rychlosti ---- | --- | --- | --- -`gemini-3-flash-preview` | `gc/` | **180 tisíc tok/měsíc** + 1 tisíc/den | Měsíční reset -`gemini-2.5-pro` | `gc/` | 180 tisíc měsíčně (sdílený bazén) | Vysoká kvalita +| Model | Předpona | Omezit | Limit rychlosti | +| ------------------------ | -------- | ------------------------------------- | --------------- | +| `gemini-3-flash-preview` | `gc/` | **180 tisíc tok/měsíc** + 1 tisíc/den | Měsíční reset | +| `gemini-2.5-pro` | `gc/` | 180 tisíc měsíčně (sdílený bazén) | Vysoká kvalita | ### ⚫ NVIDIA NIM (Bezplatný klíč API — build.nvidia.com) -Úroveň | Denní limit | Limit rychlosti | Poznámky ---- | --- | --- | --- -Zdarma (vývojář) | Žádný limit tokenů | **~40 ot./min** | Více než 70 modelů; přechod na čisté limity sazeb v polovině roku 2025 +| Úroveň | Denní limit | Limit rychlosti | Poznámky | +| ---------------- | ------------------ | --------------- | ---------------------------------------------------------------------- | +| Zdarma (vývojář) | Žádný limit tokenů | **~40 ot./min** | Více než 70 modelů; přechod na čisté limity sazeb v polovině roku 2025 | Oblíbené bezplatné modely: `moonshotai/kimi-k2.5` (Kimi K2.5), `z-ai/glm4.7` (GLM 4.7), `deepseek-ai/deepseek-v3.2` (DeepSeek V3.2), `nvidia/llama-3.3-70b-instruct` , `deepseek/deepseek-r1` ### ⚪ CEREBRAS (Bezplatný klíč API — inference.cerebras.ai) -Úroveň | Denní limit | Limit rychlosti | Poznámky ---- | --- | --- | --- -Uvolnit | **1 milion tokenů/den** | 60 000 otáček za minutu / 30 ot./min | Nejrychlejší inference LLM na světě; denně se resetuje +| Úroveň | Denní limit | Limit rychlosti | Poznámky | +| ------- | ----------------------- | ------------------------------------ | ------------------------------------------------------ | +| Uvolnit | **1 milion tokenů/den** | 60 000 otáček za minutu / 30 ot./min | Nejrychlejší inference LLM na světě; denně se resetuje | Dostupné zdarma: `llama-3.3-70b` , `llama-3.1-8b` , `deepseek-r1-distill-llama-70b` ### 🔴 GROQ (Bezplatný API klíč — console.groq.com) -Úroveň | Denní limit | Limit rychlosti | Poznámky ---- | --- | --- | --- -Uvolnit | **14,4 tisíc otáček za minutu** | 30 ot./min na model | Žádná kreditní karta; limit 429, neúčtováno +| Úroveň | Denní limit | Limit rychlosti | Poznámky | +| ------- | ------------------------------- | ------------------- | ------------------------------------------- | +| Uvolnit | **14,4 tisíc otáček za minutu** | 30 ot./min na model | Žádná kreditní karta; limit 429, neúčtováno | K dispozici zdarma: `llama-3.3-70b-versatile` , `gemma2-9b-it` , `mixtral-8x7b` , `whisper-large-v3` @@ -1016,11 +928,11 @@ K dispozici zdarma: `llama-3.3-70b-versatile` , `gemma2-9b-it` , `mixtral-8x7b` > Přepisujte libovolné audio/video za **0 $** – Deepgram leady za 200 $ zdarma, AssemblyAI za 50 $ jako záložní nástroj, Groq Whisper jako neomezená nouzová záloha. -Poskytovatel | Bezplatné kredity | Nejlepší model | Limit rychlosti ---- | --- | --- | --- -🟢 **Deepgram** | **200 dolarů zdarma** (registrace) | `nova-3` — nejvyšší přesnost, více než 30 jazyků | Žádný limit RPM pro kredity zdarma -🔵 **AssemblyAI** | **50 dolarů zdarma** (registrace) | `universal-3-pro` — kapitoly, sentiment, osobní údaje | Žádný limit RPM pro kredity zdarma -🔴 **Groq** | **Navždy zdarma** | `whisper-large-v3` — OpenAI Šepot | 30 ot./min (omezená rychlost) +| Poskytovatel | Bezplatné kredity | Nejlepší model | Limit rychlosti | +| ----------------- | ---------------------------------- | ----------------------------------------------------- | ---------------------------------- | +| 🟢 **Deepgram** | **200 dolarů zdarma** (registrace) | `nova-3` — nejvyšší přesnost, více než 30 jazyků | Žádný limit RPM pro kredity zdarma | +| 🔵 **AssemblyAI** | **50 dolarů zdarma** (registrace) | `universal-3-pro` — kapitoly, sentiment, osobní údaje | Žádný limit RPM pro kredity zdarma | +| 🔴 **Groq** | **Navždy zdarma** | `whisper-large-v3` — OpenAI Šepot | 30 ot./min (omezená rychlost) | **Navrhovaná kombinace v `/dashboard/combos` :** @@ -1041,118 +953,118 @@ OmniRoute v2.0 je navržen jako operační platforma, nikoli pouze jako proxy pr ### 🆕 Nové — Vylepšení inspirovaná ClawRouterem (březen 2026) -Funkce | Co to dělá ---- | --- -⚡ **Grok-4 Rychlá rodina** | Modely xAI za 0,20 USD/0,50 USD/M – v benchmarku 1143 ms (o 30 % rychlejší než Gemini 2.5 Flash) -🧠 **GLM-5 přes Z.AI** | 128 tisíc výstupních dat, 0,5 USD/1 milion USD – nejnovější vlajková loď rodiny GLM -🔮 **MiniMax M2.5** | Úvaha + agentní úkoly za 0,30 USD/1 milion – významný upgrade oproti M2.1 -🎯 **Příznak volání nástroje pro každý model** | `toolCalling: true/false` v registru — AutoCombo přeskakuje modely, které nepodporují nástroje. -🌍 **Detekce vícejazyčného záměru** | Klíčová slova PT/ZH/ES/AR v bodování AutoCombo – lepší výběr modelu pro neanglický obsah -📊 **Záložní metody řízené benchmarkem** | Skutečná latence p95 z živých požadavků poskytuje kombinované skóre – AutoCombo se učí ze skutečných dat -🔁 **Požádat o deduplikaci** | Okno pro deduplikaci na základě hashování obsahu – bezpečné pro více agentů, zabraňuje duplicitním platbám -🔌 **Strategie pro zásuvné routery** | Rozšiřitelné rozhraní `RouterStrategy` – přidejte si vlastní logiku směrování jako pluginy +| Funkce | Co to dělá | +| ---------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | +| ⚡ **Grok-4 Rychlá rodina** | Modely xAI za 0,20 USD/0,50 USD/M – v benchmarku 1143 ms (o 30 % rychlejší než Gemini 2.5 Flash) | +| 🧠 **GLM-5 přes Z.AI** | 128 tisíc výstupních dat, 0,5 USD/1 milion USD – nejnovější vlajková loď rodiny GLM | +| 🔮 **MiniMax M2.5** | Úvaha + agentní úkoly za 0,30 USD/1 milion – významný upgrade oproti M2.1 | +| 🎯 **Příznak volání nástroje pro každý model** | `toolCalling: true/false` v registru — AutoCombo přeskakuje modely, které nepodporují nástroje. | +| 🌍 **Detekce vícejazyčného záměru** | Klíčová slova PT/ZH/ES/AR v bodování AutoCombo – lepší výběr modelu pro neanglický obsah | +| 📊 **Záložní metody řízené benchmarkem** | Skutečná latence p95 z živých požadavků poskytuje kombinované skóre – AutoCombo se učí ze skutečných dat | +| 🔁 **Požádat o deduplikaci** | Okno pro deduplikaci na základě hashování obsahu – bezpečné pro více agentů, zabraňuje duplicitním platbám | +| 🔌 **Strategie pro zásuvné routery** | Rozšiřitelné rozhraní `RouterStrategy` – přidejte si vlastní logiku směrování jako pluginy | ### 🚀 Předchozí verze v2.0.9+ — Hřiště, otisky prstů v CLI a ACP -Funkce | Co to dělá ---- | --- -🎮 **Modelové hřiště** | Stránka řídicího panelu pro přímé testování libovolného modelu – selektory poskytovatele/modelu/koncového bodu, editor Monaco, streamování, přerušení, načasování -🔏 **Porovnávání otisků prstů v CLI** | Řazení hlaviček/těl serveru podle poskytovatele tak, aby odpovídalo nativním podpisům CLI – přepínání pro jednotlivé poskytovatele v Nastavení > Zabezpečení. **Vaše IP adresa proxy serveru je zachována.** -🤝 **Podpora ACP (Agent Client Protocol)** | Vyhledávání agentů CLI (Codex, Claude, Goose, Gemini CLI, OpenClaw + 9 dalších), generátor procesů, koncový bod `/api/acp/agents` -🤖 **Řídicí panel agentů ACP** | Ladění › Stránka Agenti — mřížka 14 agentů se stavem instalace, verzí a formulářem pro vlastní agenta pro libovolný nástroj CLI. Uživatelé **OpenCode** získají tlačítko „Stáhnout opencode.json“, které automaticky vygeneruje konfiguraci připravenou k použití se všemi dostupnými modely. -🔧 **Směrování `apiFormat` pro vlastní model** | Vlastní modely s `apiFormat: "responses"` nyní správně směrují do překladače Responses API. -🏢 **Izolace pracovního prostoru Codexu** | Více pracovních prostorů Codexu na jeden e-mail – OAuth správně odděluje připojení podle ID pracovního prostoru -🔄 **Automatická aktualizace elektronů** | Desktopová aplikace kontroluje aktualizace + automaticky se instaluje po restartu +| Funkce | Co to dělá | +| ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 🎮 **Modelové hřiště** | Stránka řídicího panelu pro přímé testování libovolného modelu – selektory poskytovatele/modelu/koncového bodu, editor Monaco, streamování, přerušení, načasování | +| 🔏 **Porovnávání otisků prstů v CLI** | Řazení hlaviček/těl serveru podle poskytovatele tak, aby odpovídalo nativním podpisům CLI – přepínání pro jednotlivé poskytovatele v Nastavení > Zabezpečení. **Vaše IP adresa proxy serveru je zachována.** | +| 🤝 **Podpora ACP (Agent Client Protocol)** | Vyhledávání agentů CLI (Codex, Claude, Goose, Gemini CLI, OpenClaw + 9 dalších), generátor procesů, koncový bod `/api/acp/agents` | +| 🤖 **Řídicí panel agentů ACP** | Ladění › Stránka Agenti — mřížka 14 agentů se stavem instalace, verzí a formulářem pro vlastní agenta pro libovolný nástroj CLI. Uživatelé **OpenCode** získají tlačítko „Stáhnout opencode.json“, které automaticky vygeneruje konfiguraci připravenou k použití se všemi dostupnými modely. | +| 🔧 **Směrování `apiFormat` pro vlastní model** | Vlastní modely s `apiFormat: "responses"` nyní správně směrují do překladače Responses API. | +| 🏢 **Izolace pracovního prostoru Codexu** | Více pracovních prostorů Codexu na jeden e-mail – OAuth správně odděluje připojení podle ID pracovního prostoru | +| 🔄 **Automatická aktualizace elektronů** | Desktopová aplikace kontroluje aktualizace + automaticky se instaluje po restartu | ### 🤖 Operace s agenty a protokoly (v2.0) -Funkce | Co to dělá ---- | --- -🔧 **MCP Server (16 nástrojů)** | Nástroje IDE/agent prostřednictvím 3 transportů: stdio, SSE ( `/api/mcp/sse` ), Streamovatelný HTTP ( `/api/mcp/stream` ) -🤝 **A2A server (JSON-RPC + SSE)** | Spouštění úloh mezi agenty se synchronizací a streamováním -🧭 **Konsolidovaná stránka koncových bodů** | Stránka pro správu s kartami Endpoint Proxy, MCP, A2A a API Endpoints -🎚️ **Přepínače pro povolení/zakázání služby** | Přepínače ZAP/VYP pro MCP a A2A s trvalým nastavením (výchozí: VYP) -🛰️ **Srdeční tep za běhu MCP** | Skutečný stav procesu (pid, doba provozuschopnosti, stáří heartbeatu, transport, režim rozsahu) -📋 **Auditní záznam MCP** | Filtrovatelné protokoly auditu s hodnocením úspěchu/neúspěchu a klíčovým přiřazením -🔐 **Vynucování rozsahu MCP** | 9 podrobných oprávnění pro řízený přístup k nástrojům -📡 **Správa životního cyklu úkolů A2A** | Seznam/filtrování úloh, kontrola událostí/artefaktů, zrušení spuštěných úloh -📋 **Objevení karty agenta** | `/.well-known/agent.json` pro automatické vyhledávání klientů -🧪 **Testovací postroj Protocol E2E** | Skutečné MCP SDK + toky klientů A2A v `test:protocols:e2e` -⚙️ **Provozní kontroly** | Kombinace přepínačů, použití profilů odolnosti, resetování jističů z jednoho ovládacího panelu +| Funkce | Co to dělá | +| --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | +| 🔧 **MCP Server (16 nástrojů)** | Nástroje IDE/agent prostřednictvím 3 transportů: stdio, SSE ( `/api/mcp/sse` ), Streamovatelný HTTP ( `/api/mcp/stream` ) | +| 🤝 **A2A server (JSON-RPC + SSE)** | Spouštění úloh mezi agenty se synchronizací a streamováním | +| 🧭 **Konsolidovaná stránka koncových bodů** | Stránka pro správu s kartami Endpoint Proxy, MCP, A2A a API Endpoints | +| 🎚️ **Přepínače pro povolení/zakázání služby** | Přepínače ZAP/VYP pro MCP a A2A s trvalým nastavením (výchozí: VYP) | +| 🛰️ **Srdeční tep za běhu MCP** | Skutečný stav procesu (pid, doba provozuschopnosti, stáří heartbeatu, transport, režim rozsahu) | +| 📋 **Auditní záznam MCP** | Filtrovatelné protokoly auditu s hodnocením úspěchu/neúspěchu a klíčovým přiřazením | +| 🔐 **Vynucování rozsahu MCP** | 9 podrobných oprávnění pro řízený přístup k nástrojům | +| 📡 **Správa životního cyklu úkolů A2A** | Seznam/filtrování úloh, kontrola událostí/artefaktů, zrušení spuštěných úloh | +| 📋 **Objevení karty agenta** | `/.well-known/agent.json` pro automatické vyhledávání klientů | +| 🧪 **Testovací postroj Protocol E2E** | Skutečné MCP SDK + toky klientů A2A v `test:protocols:e2e` | +| ⚙️ **Provozní kontroly** | Kombinace přepínačů, použití profilů odolnosti, resetování jističů z jednoho ovládacího panelu | ### 🧠 Směrování a inteligence -Funkce | Co to dělá ---- | --- -🎯 **Inteligentní čtyřúrovňový záložní systém** | Automatická trasa: Předplatné → API klíč → Levné → Zdarma -📊 **Sledování kvót v reálném čase** | Počet tokenů v reálném čase + odpočet resetování pro každého poskytovatele -🔄 **Překlad formátu** | OpenAI ↔ Claude ↔ Gemini ↔ Odpovědi s konverzemi bezpečnými pro schéma -👥 **Podpora více účtů** | Více účtů na poskytovatele s inteligentním výběrem -🔄 **Automatická aktualizace tokenů** | Tokeny OAuth se automaticky obnovují při opakovaném pokusu. -🎨 **Vlastní kombinace** | 6 vyvažovacích strategií + řízení záložního řetězce -🌐 **Směrovač se zástupnými znaky** | dynamické směrování `provider/*` -🧠 **Přemýšlení o rozpočtových kontrolách** | Limity pro průchozí, automatické, vlastní a adaptivní uvažování -🔀 **Aliasy modelů** | Vestavěné + vlastní aliasování modelů a bezpečnost migrace -⚡ **Degradace pozadí** | Směrujte úlohy na pozadí s nízkou prioritou na levnější modely -🧪 **Chytré směrování s ohledem na úkoly** | Automatický výběr modelu podle typu obsahu (kódování/vize/analýza/sumarizace) -💬 **Vstřikování do systému** | Globální kontroly chování uplatňované konzistentně -📄 **Kompatibilita API pro odpovědi** | Plná podpora `/v1/responses` pro Codex a pokročilé agentické pracovní postupy +| Funkce | Co to dělá | +| ----------------------------------------------- | ----------------------------------------------------------------------------- | +| 🎯 **Inteligentní čtyřúrovňový záložní systém** | Automatická trasa: Předplatné → API klíč → Levné → Zdarma | +| 📊 **Sledování kvót v reálném čase** | Počet tokenů v reálném čase + odpočet resetování pro každého poskytovatele | +| 🔄 **Překlad formátu** | OpenAI ↔ Claude ↔ Gemini ↔ Odpovědi s konverzemi bezpečnými pro schéma | +| 👥 **Podpora více účtů** | Více účtů na poskytovatele s inteligentním výběrem | +| 🔄 **Automatická aktualizace tokenů** | Tokeny OAuth se automaticky obnovují při opakovaném pokusu. | +| 🎨 **Vlastní kombinace** | 6 vyvažovacích strategií + řízení záložního řetězce | +| 🌐 **Směrovač se zástupnými znaky** | dynamické směrování `provider/*` | +| 🧠 **Přemýšlení o rozpočtových kontrolách** | Limity pro průchozí, automatické, vlastní a adaptivní uvažování | +| 🔀 **Aliasy modelů** | Vestavěné + vlastní aliasování modelů a bezpečnost migrace | +| ⚡ **Degradace pozadí** | Směrujte úlohy na pozadí s nízkou prioritou na levnější modely | +| 🧪 **Chytré směrování s ohledem na úkoly** | Automatický výběr modelu podle typu obsahu (kódování/vize/analýza/sumarizace) | +| 💬 **Vstřikování do systému** | Globální kontroly chování uplatňované konzistentně | +| 📄 **Kompatibilita API pro odpovědi** | Plná podpora `/v1/responses` pro Codex a pokročilé agentické pracovní postupy | ### 🎵 Multimodální API -Funkce | Co to dělá ---- | --- -🖼️ **Generování obrázků** | `/v1/images/generations` s cloudovým a lokálním backendem -📐 **Vložení** | `/v1/embeddings` pro vyhledávání a RAG pipelines -🎤 **Přepis zvuku** | `/v1/audio/transcriptions` (Whisper a další poskytovatelé) -🔊 **Převod textu na řeč** | `/v1/audio/speech` (více enginů/poskytovatelů) -🎬 **Generování videa** | `/v1/videos/generations` (pracovní postupy ComfyUI + SD WebUI) -🎵 **Hudební generace** | `/v1/music/generations` (pracovní postupy ComfyUI) -🛡️ **Moderování** | Bezpečnostní kontroly `/v1/moderations` -🔀 **Změna pořadí** | `/v1/rerank` pro hodnocení relevance -🔍 **Vyhledávání na webu** 🆕 | `/v1/search` — 5 poskytovatelů (Serper, Brave, Perplexity, Exa, Tavily), více než 6 500 zdarma/měsíc, automatické přepnutí na záložní systém, mezipaměť +| Funkce | Co to dělá | +| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 🖼️ **Generování obrázků** | `/v1/images/generations` s cloudovým a lokálním backendem | +| 📐 **Vložení** | `/v1/embeddings` pro vyhledávání a RAG pipelines | +| 🎤 **Přepis zvuku** | `/v1/audio/transcriptions` (Whisper a další poskytovatelé) | +| 🔊 **Převod textu na řeč** | `/v1/audio/speech` (více enginů/poskytovatelů) | +| 🎬 **Generování videa** | `/v1/videos/generations` (pracovní postupy ComfyUI + SD WebUI) | +| 🎵 **Hudební generace** | `/v1/music/generations` (pracovní postupy ComfyUI) | +| 🛡️ **Moderování** | Bezpečnostní kontroly `/v1/moderations` | +| 🔀 **Změna pořadí** | `/v1/rerank` pro hodnocení relevance | +| 🔍 **Vyhledávání na webu** 🆕 | `/v1/search` — 5 poskytovatelů (Serper, Brave, Perplexity, Exa, Tavily), více než 6 500 zdarma/měsíc, automatické přepnutí na záložní systém, mezipaměť | ### 🛡️ Odolnost, bezpečnost a správa věcí veřejných -Funkce | Co to dělá ---- | --- -🔌 **Jističe** | Vypnutí/obnovení pro každý model s ovládáním prahových hodnot -🎯 **Modely s ohledem na koncové body** | Vlastní modely deklarují podporované koncové body + formát API -🛡️ **Stádo proti hromům** | Ochrana mutexu a semaforu při událostech opakování/rychlosti -🧠 **Sémantická + podpisová mezipaměť** | Snížení nákladů/latence díky dvěma vrstvám mezipaměti -⚡ **Žádost o idempotenci** | Okno ochrany proti duplikacím -🔒 **Falšování otisků prstů pomocí TLS** | Otisk TLS podobný prohlížeči – **snižuje detekci botů a nahlašování účtů** -🔏 **Porovnávání otisků prstů v CLI** | Shoduje se s nativními podpisy požadavků CLI – **snižuje riziko zablokování a zároveň zachovává IP adresu proxy** -🌐 **Filtrování IP adres** | Ovládání seznamu povolených/blokovaných položek pro odhalená nasazení -📊 **Upravitelné limity rychlosti** | Konfigurovatelné globální/na úrovni poskytovatele limity s perzistencí -🔑 **Správa klíčů API a stanovení rozsahu** | Bezpečné vydávání/rotace klíčů a kontroly modelu/poskytovatele -🛡️ **Chráněné `/models`** | Volitelné ověřování a skrytí poskytovatele pro katalog modelů +| Funkce | Co to dělá | +| ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | +| 🔌 **Jističe** | Vypnutí/obnovení pro každý model s ovládáním prahových hodnot | +| 🎯 **Modely s ohledem na koncové body** | Vlastní modely deklarují podporované koncové body + formát API | +| 🛡️ **Stádo proti hromům** | Ochrana mutexu a semaforu při událostech opakování/rychlosti | +| 🧠 **Sémantická + podpisová mezipaměť** | Snížení nákladů/latence díky dvěma vrstvám mezipaměti | +| ⚡ **Žádost o idempotenci** | Okno ochrany proti duplikacím | +| 🔒 **Falšování otisků prstů pomocí TLS** | Otisk TLS podobný prohlížeči – **snižuje detekci botů a nahlašování účtů** | +| 🔏 **Porovnávání otisků prstů v CLI** | Shoduje se s nativními podpisy požadavků CLI – **snižuje riziko zablokování a zároveň zachovává IP adresu proxy** | +| 🌐 **Filtrování IP adres** | Ovládání seznamu povolených/blokovaných položek pro odhalená nasazení | +| 📊 **Upravitelné limity rychlosti** | Konfigurovatelné globální/na úrovni poskytovatele limity s perzistencí | +| 🔑 **Správa klíčů API a stanovení rozsahu** | Bezpečné vydávání/rotace klíčů a kontroly modelu/poskytovatele | +| 🛡️ **Chráněné `/models`** | Volitelné ověřování a skrytí poskytovatele pro katalog modelů | ### 📊 Pozorovatelnost a analytika -Funkce | Co to dělá ---- | --- -📝 **Žádost + protokolování proxy** | Úplné protokolování požadavků/odpovědí a proxy -📋 **Sjednocený panel protokolů** | Zobrazení požadavků, proxy, auditu a konzole na jedné stránce -🔍 **Vyžádat si telemetrii** | Latence p50/p95/p99 a trasování požadavků -🏥 **Panel zdraví** | Doba provozuschopnosti, stavy jističů, uzamčení, statistiky mezipaměti -💰 **Sledování nákladů** | Kontrola rozpočtu a přehled o cenách pro jednotlivé modely -📈 **Analytické vizualizace** | Přehledy využití modelů/poskytovatelů a zobrazení trendů -🧪 **Rámec hodnocení** | Testování zlaté sady s konfigurovatelnými strategiemi shody +| Funkce | Co to dělá | +| ----------------------------------- | ---------------------------------------------------------------------- | +| 📝 **Žádost + protokolování proxy** | Úplné protokolování požadavků/odpovědí a proxy | +| 📋 **Sjednocený panel protokolů** | Zobrazení požadavků, proxy, auditu a konzole na jedné stránce | +| 🔍 **Vyžádat si telemetrii** | Latence p50/p95/p99 a trasování požadavků | +| 🏥 **Panel zdraví** | Doba provozuschopnosti, stavy jističů, uzamčení, statistiky mezipaměti | +| 💰 **Sledování nákladů** | Kontrola rozpočtu a přehled o cenách pro jednotlivé modely | +| 📈 **Analytické vizualizace** | Přehledy využití modelů/poskytovatelů a zobrazení trendů | +| 🧪 **Rámec hodnocení** | Testování zlaté sady s konfigurovatelnými strategiemi shody | ### ☁️ Nasazení a platforma -Funkce | Co to dělá ---- | --- -🌐 **Nasazení kdekoli** | Localhost, VPS, Docker, cloudová prostředí -💾 **Synchronizace s cloudem** | Synchronizace konfigurace přes cloud worker -🔄 **Zálohování/Obnovení** | Toky exportu/importu a obnovy po havárii -🧙 **Průvodce nástupem** | Průvodce prvním spuštěním -🔧 **Panel nástrojů CLI** | Nastavení oblíbených kódovacích nástrojů jedním kliknutím -🎮 **Modelové hřiště** | Otestujte libovolného poskytovatele/model/koncový bod z řídicího panelu -🔏 **Přepínač otisků prstů v příkazovém řádku** | Porovnávání otisků prstů podle poskytovatele v Nastavení > Zabezpečení -🌐 **i18n (30 jazyků)** | Plná jazyková podpora dashboardu a dokumentace s psaním zprava doleva -📂 **Adresář vlastních dat** | Přepsání `DATA_DIR` pro umístění úložiště +| Funkce | Co to dělá | +| ----------------------------------------------- | ------------------------------------------------------------------------- | +| 🌐 **Nasazení kdekoli** | Localhost, VPS, Docker, cloudová prostředí | +| 💾 **Synchronizace s cloudem** | Synchronizace konfigurace přes cloud worker | +| 🔄 **Zálohování/Obnovení** | Toky exportu/importu a obnovy po havárii | +| 🧙 **Průvodce nástupem** | Průvodce prvním spuštěním | +| 🔧 **Panel nástrojů CLI** | Nastavení oblíbených kódovacích nástrojů jedním kliknutím | +| 🎮 **Modelové hřiště** | Otestujte libovolného poskytovatele/model/koncový bod z řídicího panelu | +| 🔏 **Přepínač otisků prstů v příkazovém řádku** | Porovnávání otisků prstů podle poskytovatele v Nastavení > Zabezpečení | +| 🌐 **i18n (30 jazyků)** | Plná jazyková podpora dashboardu a dokumentace s psaním zprava doleva | +| 📂 **Adresář vlastních dat** | Přepsání `DATA_DIR` pro umístění úložiště | ### Hluboký pohled na funkce @@ -1203,12 +1115,12 @@ Předinstalovaná sada „OmniRoute Golden Set“ obsahuje testovací případy ### Strategie hodnocení -Strategie | Popis | Příklad ---- | --- | --- -`exact` | Výstup se musí přesně shodovat | `"4"` -`contains` | Výstup musí obsahovat podřetězec (bez rozlišení velkých a malých písmen) | `"Paris"` -`regex` | Výstup musí odpovídat vzoru regulárních výrazů | `"1.*2.*3"` -`custom` | Vlastní JS funkce vrací true/false | `(output) => output.length > 10` +| Strategie | Popis | Příklad | +| ---------- | ------------------------------------------------------------------------ | -------------------------------- | +| `exact` | Výstup se musí přesně shodovat | `"4"` | +| `contains` | Výstup musí obsahovat podřetězec (bez rozlišení velkých a malých písmen) | `"Paris"` | +| `regex` | Výstup musí odpovídat vzoru regulárních výrazů | `"1.*2.*3"` | +| `custom` | Vlastní JS funkce vrací true/false | `(output) => output.length > 10` | --- @@ -1240,9 +1152,6 @@ Užitečná API pro automatizaci: - `GET /api/mcp/audit` - `GET /api/mcp/audit/stats` - - -
🤝 Nastavení A2A (Agent2Agent)
@@ -1272,9 +1181,6 @@ Provozní uživatelské rozhraní: - `/dashboard/a2a` pro pozorovatelnost úloh/stavů/streamů a akce kouření - - -
🧪 Komplexní validace protokolu
@@ -1291,9 +1197,6 @@ Tím se ověřuje: - A2A objevování/odesílání/streamování/získávání/zrušení - Křížová kontrola dat v auditu MCP a API pro správu úloh A2A - - -
💳 Poskytovatelé předplatného
@@ -1369,9 +1272,6 @@ Models: gh/gemini-3-pro ``` - - -
🔑 Poskytovatelé klíčů API
@@ -1381,7 +1281,7 @@ Models: 1. Registrace: [build.nvidia.com](https://build.nvidia.com) 2. Získejte zdarma klíč API (včetně 1000 inferenčních kreditů) 3. Ovládací panel → Přidat poskytovatele → NVIDIA NIM: - - Klíč API: `nvapi-your-key` + - Klíč API: `nvapi-your-key` **Modely:** `nvidia/llama-3.3-70b-instruct` , `nvidia/mistral-7b-instruct` a více než 50 dalších @@ -1413,9 +1313,6 @@ Models: **Modely:** Získejte přístup k více než 100 modelům od všech hlavních poskytovatelů prostřednictvím jediného klíče API. - - -
💰 Levní poskytovatelé (záložní)
@@ -1425,8 +1322,8 @@ Models: 1. Registrace: [Zhipu AI](https://open.bigmodel.cn/) 2. Získejte klíč API z kódovacího plánu 3. Nástěnka → Přidat klíč API: - - Poskytovatel: `glm` - - Klíč API: `your-key` + - Poskytovatel: `glm` + - Klíč API: `your-key` **Použití:** `glm/glm-4.7` @@ -1452,9 +1349,6 @@ Models: **Tip pro profesionály:** Fixních 9 $/měsíc za 10 milionů tokenů = efektivní náklady 0,90 $/1 milion! - - -
🆓 BEZPLATNÍ poskytovatelé (nouzové zálohování)
@@ -1498,9 +1392,6 @@ Models: kr/claude-haiku-4.5 ``` - - -
🎨 Vytvořte kombinace
@@ -1531,9 +1422,6 @@ Models: Cost: $0 forever! ``` - - -
🔧 Integrace s rozhraním příkazového řádku
@@ -1637,9 +1525,6 @@ opencode > **Tip:** Do sekce `models` přidejte jakýkoli model dostupný ve vašem koncovém bodu OmniRoute `/v1/models` . Použijte formát `provider/model-id` z vašeho dashboardu OmniRoute. - - - --- ## 🐛 Řešení problémů @@ -1880,14 +1765,8 @@ Chcete-li získat přístup k kriterii pověření, můžete použít adresu **U > Toto řešení funguje na základě autorizačního kódu na adrese URL a nezávislého přesměrování přesměrování nebo jiného. - - - --- - - - ## 🛠️ Technologický stack
@@ -1909,28 +1788,25 @@ Chcete-li získat přístup k kriterii pověření, můžete použít adresu **U - **Docker** : [hub.docker.com/r/diegosouzapw/omniroute](https://hub.docker.com/r/diegosouzapw/omniroute) - **Odolnost** : Jistič, exponenciální odstavení, ochrana proti hromům, falešné TLS, automatické kombinované samoopravování - - - --- ## 📖 Dokumentace -Dokument | Popis ---- | --- -[Uživatelská příručka](docs/USER_GUIDE.md) | Poskytovatelé, kombinace, integrace CLI, nasazení -[Referenční informace k API](docs/API_REFERENCE.md) | Všechny koncové body s příklady -[MCP server](open-sse/mcp-server/README.md) | 16 nástrojů MCP, konfigurace IDE, klienti Python/TS/Go -[Server A2A](src/lib/a2a/README.md) | Protokol JSON-RPC 2.0, dovednosti, streamování, správa úloh -[Auto-Combo Engine](docs/auto-combo.md) | 6faktorové bodování, balíčky režimů, samoléčba -[Odstraňování problémů](docs/TROUBLESHOOTING.md) | Běžné problémy a jejich řešení -[Architektura](docs/ARCHITECTURE.md) | Architektura a interní prvky systému -[Přispívání](CONTRIBUTING.md) | Nastavení a pokyny pro vývoj -[Specifikace OpenAPI](docs/openapi.yaml) | Specifikace OpenAPI 3.0 -[Bezpečnostní zásady](SECURITY.md) | Hlášení zranitelností a bezpečnostní postupy -[Nasazení virtuálního počítače](docs/VM_DEPLOYMENT_GUIDE.md) | Kompletní průvodce: Nastavení virtuálního počítače + nginx + Cloudflare -[Galerie funkcí](docs/FEATURES.md) | Vizuální prohlídka řídicího panelu se snímky obrazovky -[Kontrolní seznam vydání](docs/RELEASE_CHECKLIST.md) | Kroky ověření před vydáním +| Dokument | Popis | +| ------------------------------------------------------------ | ----------------------------------------------------------------------- | +| [Uživatelská příručka](docs/USER_GUIDE.md) | Poskytovatelé, kombinace, integrace CLI, nasazení | +| [Referenční informace k API](docs/API_REFERENCE.md) | Všechny koncové body s příklady | +| [MCP server](open-sse/mcp-server/README.md) | 16 nástrojů MCP, konfigurace IDE, klienti Python/TS/Go | +| [Server A2A](src/lib/a2a/README.md) | Protokol JSON-RPC 2.0, dovednosti, streamování, správa úloh | +| [Auto-Combo Engine](docs/auto-combo.md) | 6faktorové bodování, balíčky režimů, samoléčba | +| [Odstraňování problémů](docs/TROUBLESHOOTING.md) | Běžné problémy a jejich řešení | +| [Architektura](docs/ARCHITECTURE.md) | Architektura a interní prvky systému | +| [Přispívání](CONTRIBUTING.md) | Nastavení a pokyny pro vývoj | +| [Specifikace OpenAPI](docs/openapi.yaml) | Specifikace OpenAPI 3.0 | +| [Bezpečnostní zásady](SECURITY.md) | Hlášení zranitelností a bezpečnostní postupy | +| [Nasazení virtuálního počítače](docs/VM_DEPLOYMENT_GUIDE.md) | Kompletní průvodce: Nastavení virtuálního počítače + nginx + Cloudflare | +| [Galerie funkcí](docs/FEATURES.md) | Vizuální prohlídka řídicího panelu se snímky obrazovky | +| [Kontrolní seznam vydání](docs/RELEASE_CHECKLIST.md) | Kroky ověření před vydáním | --- @@ -1938,14 +1814,14 @@ Dokument | Popis OmniRoute má **v plánu více než 210 funkcí** v několika fázích vývoje. Zde jsou klíčové oblasti: -Kategorie | Plánované funkce | Hlavní body ---- | --- | --- -🧠 **Směrování a inteligence** | 25+ | Směrování s nejnižší latencí, směrování založené na tagech, kontrola kvót před výstupem, výběr účtu P2C -🔒 **Zabezpečení a dodržování předpisů** | 20+ | Zpevnění SSRF, maskování přihlašovacích údajů, limit rychlosti pro každý koncový bod, stanovení rozsahu klíčů pro správu -📊 **Pozorovatelnost** | 15+ | Integrace OpenTelemetry, sledování kvót v reálném čase, sledování nákladů podle modelu -🔄 **Integrace poskytovatelů** | 20+ | Dynamický registr modelů, doba zchlazení poskytovatelů, Codex pro více účtů, analýza kvót Copilota -⚡ **Výkon** | 15+ | Dvojitá vrstva mezipaměti, mezipaměť výzev, mezipaměť odpovědí, udržování streamování, dávkové API -🌐 **Ekosystém** | 10+ | WebSocket API, horké opětovné načítání konfigurace, distribuované úložiště konfigurace, komerční režim +| Kategorie | Plánované funkce | Hlavní body | +| ---------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------ | +| 🧠 **Směrování a inteligence** | 25+ | Směrování s nejnižší latencí, směrování založené na tagech, kontrola kvót před výstupem, výběr účtu P2C | +| 🔒 **Zabezpečení a dodržování předpisů** | 20+ | Zpevnění SSRF, maskování přihlašovacích údajů, limit rychlosti pro každý koncový bod, stanovení rozsahu klíčů pro správu | +| 📊 **Pozorovatelnost** | 15+ | Integrace OpenTelemetry, sledování kvót v reálném čase, sledování nákladů podle modelu | +| 🔄 **Integrace poskytovatelů** | 20+ | Dynamický registr modelů, doba zchlazení poskytovatelů, Codex pro více účtů, analýza kvót Copilota | +| ⚡ **Výkon** | 15+ | Dvojitá vrstva mezipaměti, mezipaměť výzev, mezipaměť odpovědí, udržování streamování, dávkové API | +| 🌐 **Ekosystém** | 10+ | WebSocket API, horké opětovné načítání konfigurace, distribuované úložiště konfigurace, komerční režim | ### 🔜 Již brzy diff --git a/docs/i18n/pt-BR/README.md b/docs/i18n/pt-BR/README.md index bed2a3cf18..50184c828b 100644 --- a/docs/i18n/pt-BR/README.md +++ b/docs/i18n/pt-BR/README.md @@ -819,24 +819,28 @@ Quando minimizado, o OmniRoute fica na bandeja do sistema com ações rápidas: ## 💰 Preços Resumidos -| Tier | Provedor | Custo | Reset de Cota | Melhor Para | -| ----------------- | ----------------- | ---------------------------- | ----------------- | ----------------------- | -| **💳 ASSINATURA** | Claude Code (Pro) | $20/mês | 5h + semanal | Já é assinante | -| | Codex (Plus/Pro) | $20-200/mês | 5h + semanal | Usuários OpenAI | -| | Gemini CLI | **GRATUITO** | 180K/mês + 1K/dia | Todos! | -| | GitHub Copilot | $10-19/mês | Mensal | Usuários GitHub | -| **🔑 API KEY** | NVIDIA NIM | **GRATUITO** (1000 créditos) | Único | Testes gratuitos | -| | DeepSeek | Por uso | Nenhum | Melhor preço/qualidade | -| | Groq | Tier gratuito + pago | Limitado | Inferência ultra-rápida | -| | xAI (Grok) | Por uso | Nenhum | Modelos Grok | -| | Mistral | Tier gratuito + pago | Limitado | IA Europeia | -| | OpenRouter | Por uso | Nenhum | 100+ modelos | -| **💰 BARATO** | GLM-4.7 | $0.6/1M | Diário 10h | Backup econômico | -| | MiniMax M2.1 | $0.2/1M | Rotativo 5h | Opção mais barata | -| | Kimi K2 | $9/mês fixo | 10M tokens/mês | Custo previsível | -| **🆓 GRATUITO** | iFlow | $0 | Ilimitado | 8 modelos gratuitos | -| | Qwen | $0 | Ilimitado | 3 modelos gratuitos | -| | Kiro | $0 | Ilimitado | Claude gratuito | +| Tier | Provedor | Custo | Reset de Cota | Melhor Para | +| ----------------- | ----------------- | ---------------------------- | ----------------- | ------------------------------ | +| **💳 ASSINATURA** | Claude Code (Pro) | $20/mês | 5h + semanal | Já é assinante | +| | Codex (Plus/Pro) | $20-200/mês | 5h + semanal | Usuários OpenAI | +| | Gemini CLI | **GRATUITO** | 180K/mês + 1K/dia | Todos! | +| | GitHub Copilot | $10-19/mês | Mensal | Usuários GitHub | +| **🔑 API KEY** | NVIDIA NIM | **GRATUITO** (1000 créditos) | Único | Testes gratuitos | +| | DeepSeek | Por uso | Nenhum | Melhor preço/qualidade | +| | Groq | Tier gratuito + pago | Limitado | Inferência ultra-rápida | +| | xAI (Grok) | Por uso | Nenhum | Modelos Grok | +| | Mistral | Tier gratuito + pago | Limitado | IA Europeia | +| | OpenRouter | Por uso | Nenhum | 100+ modelos | +| **💰 BARATO** | GLM-4.7 | $0.6/1M | Diário 10h | Backup econômico | +| | MiniMax M2.1 | $0.2/1M | Rotativo 5h | Opção mais barata | +| | Kimi K2 | $9/mês fixo | 10M tokens/mês | Custo previsível | +| **🆓 GRATUITO** | iFlow | $0 | Ilimitado | 8 modelos gratuitos | +| | Qwen | $0 | Ilimitado | 3 modelos gratuitos | +| | Kiro | $0 | Ilimitado | Claude gratuito | +| | LongCat 🆕 | **$0** (50M tok/dia 🔥) | 1 req/s | Maior cota grátis do mundo | +| | Pollinations 🆕 | **$0** (sem chave API) | 1 req/15s | GPT-5, Claude, DeepSeek, Llama | +| | Cloudflare AI 🆕 | **$0** (10K Neurons/dia) | ~150 resp/dia | 50+ modelos, edge global | +| | Scaleway AI 🆕 | **$0** (1M tokens total) | Limitado por taxa | EU/GDPR, Qwen3 235B, Llama 70B | **💡 Dica Pro:** Comece com Gemini CLI (180K grátis/mês) + iFlow (ilimitado grátis) = $0 de custo! @@ -1223,6 +1227,53 @@ Modelos: kr/claude-haiku-4.5 ``` +### LongCat AI (GRATUITO 50M tokens/dia!) 🆕 + +1. Cadastre-se: [longcat.chat](https://longcat.chat) com e-mail ou telefone +2. Gere uma chave de API gratuita +3. Dashboard → Adicionar Provedor → LongCat + +**Modelos:** + +- `lc/LongCat-Flash-Lite` — **50M tokens/dia** 💥 (maior cota gratuita do mundo!) +- `lc/LongCat-Flash-Chat` — 500K tokens/dia +- `lc/LongCat-Flash-Thinking` — 500K tokens/dia (raciocínio) + +> 100% gratuito durante o beta público. Reset diário à meia-noite UTC. + +### Pollinations AI (SEM CHAVE NECESSÁRIA!) 🆕 + +1. Adicione o provedor Pollinations no Dashboard +2. Deixe o campo de chave API vazio (ou coloque qualquer string) +3. Comece a usar imediatamente! + +**Modelos via `pol/`:** `openai` (GPT-5), `claude`, `gemini`, `deepseek`, `llama` (Llama 4) + +> Sem cadastro, sem chave, sem cartão de crédito. 1 req/15s ilimitado. + +### Cloudflare Workers AI (GRATUITO 10K Neurons/dia!) 🆕 + +1. Cadastre-se: [dash.cloudflare.com](https://dash.cloudflare.com) +2. Gere um API Token em Profile → API Tokens +3. Copie seu Account ID (coluna direita do dashboard) +4. Dashboard → Adicionar Provedor → Cloudflare AI + - API Key: seu token + - Account ID: seu account ID + +**Modelos via `cf/`:** `@cf/meta/llama-3.3-70b-instruct`, `@cf/google/gemma-3-12b-it`, 50+ mais + +> 10K Neurons/dia ≈ 150 respostas de LLM ou 500s de transcrição Whisper gratuita! + +### Scaleway AI (1M tokens gratuitos!) 🆕 + +1. Cadastre-se: [console.scaleway.com](https://console.scaleway.com) +2. Gere uma chave de API IAM +3. Dashboard → Adicionar Provedor → Scaleway + +**Modelos via `scw/`:** `qwen3-235b-a22b-instruct-2507` (Qwen3 235B!), `llama-3.1-70b-instruct` + +> 1M tokens gratuitos para novas contas. Dados processados na 🇫🇷 França (EU/GDPR). +
diff --git a/open-sse/config/providerRegistry.ts b/open-sse/config/providerRegistry.ts index 53be97233b..3d19e360ce 100644 --- a/open-sse/config/providerRegistry.ts +++ b/open-sse/config/providerRegistry.ts @@ -883,6 +883,12 @@ export const REGISTRY: Record = { authType: "apikey", authHeader: "bearer", models: [ + { id: "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", name: "Llama 3.3 70B Turbo (🆓 Free)" }, + { id: "meta-llama/Llama-Vision-Free", name: "Llama Vision (🆓 Free)" }, + { + id: "deepseek-ai/DeepSeek-R1-Distill-Llama-70B-Free", + name: "DeepSeek R1 Distill 70B (🆓 Free)", + }, { id: "meta-llama/Llama-3.3-70B-Instruct-Turbo", name: "Llama 3.3 70B Turbo" }, { id: "deepseek-ai/DeepSeek-R1", name: "DeepSeek R1" }, { id: "Qwen/Qwen3-235B-A22B", name: "Qwen3 235B" }, @@ -1154,6 +1160,104 @@ export const REGISTRY: Record = { ], passthroughModels: true, }, + + // ── New Free Providers (2026) ───────────────────────────────────────────── + + longcat: { + id: "longcat", + alias: "lc", + format: "openai", + executor: "default", + baseUrl: "https://longcat.chat/api/v1/chat/completions", + authType: "apikey", + authHeader: "bearer", + // Free tier: 50M tokens/day (Flash-Lite) + 500K/day (Chat/Thinking) — 100% free while public beta + models: [ + { id: "LongCat-Flash-Lite", name: "LongCat Flash-Lite (50M tok/day 🆓)" }, + { id: "LongCat-Flash-Chat", name: "LongCat Flash-Chat (500K tok/day 🆓)" }, + { id: "LongCat-Flash-Thinking", name: "LongCat Flash-Thinking (500K tok/day 🆓)" }, + { id: "LongCat-Flash-Thinking-2601", name: "LongCat Flash-Thinking-2601 (🆓)" }, + { id: "LongCat-Flash-Omni-2603", name: "LongCat Flash-Omni-2603 (🆓)" }, + ], + }, + + pollinations: { + id: "pollinations", + alias: "pol", + format: "openai", + executor: "pollinations", + // No API key required for basic use. Proxy to GPT-5, Claude, Gemini, DeepSeek, Llama 4. + baseUrl: "https://text.pollinations.ai/openai/chat/completions", + authType: "apikey", // Optional — works without one too + authHeader: "bearer", + models: [ + { id: "openai", name: "GPT-5 via Pollinations (🆓)" }, + { id: "claude", name: "Claude via Pollinations (🆓)" }, + { id: "gemini", name: "Gemini via Pollinations (🆓)" }, + { id: "deepseek", name: "DeepSeek V3 via Pollinations (🆓)" }, + { id: "llama", name: "Llama 4 via Pollinations (🆓)" }, + { id: "mistral", name: "Mistral via Pollinations (🆓)" }, + ], + }, + + "cloudflare-ai": { + id: "cloudflare-ai", + alias: "cf", + format: "openai", + executor: "cloudflare-ai", + // URL is dynamic: uses accountId from credentials. The executor builds it. + baseUrl: "https://api.cloudflare.com/client/v4/accounts", + authType: "apikey", + authHeader: "bearer", + // 10K Neurons/day free: ~150 LLM responses or 500s Whisper audio — global edge + models: [ + { id: "@cf/meta/llama-3.3-70b-instruct", name: "Llama 3.3 70B (🆓 ~150 resp/day)" }, + { id: "@cf/meta/llama-3.1-8b-instruct", name: "Llama 3.1 8B (🆓)" }, + { id: "@cf/google/gemma-3-12b-it", name: "Gemma 3 12B (🆓)" }, + { id: "@cf/mistral/mistral-7b-instruct-v0.2-lora", name: "Mistral 7B (🆓)" }, + { id: "@cf/qwen/qwen2.5-coder-15b-instruct", name: "Qwen 2.5 Coder 15B (🆓)" }, + { id: "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", name: "DeepSeek R1 Distill 32B (🆓)" }, + ], + }, + + scaleway: { + id: "scaleway", + alias: "scw", + format: "openai", + executor: "default", + baseUrl: "https://api.scaleway.ai/v1/chat/completions", + authType: "apikey", + authHeader: "bearer", + // 1M tokens free for new accounts — EU/GDPR (Paris), no credit card needed under limit + models: [ + { id: "qwen3-235b-a22b-instruct-2507", name: "Qwen3 235B A22B (1M free tok 🆓)" }, + { id: "llama-3.1-70b-instruct", name: "Llama 3.1 70B (🆓 EU)" }, + { id: "llama-3.1-8b-instruct", name: "Llama 3.1 8B (🆓 EU)" }, + { id: "mistral-small-3.2-24b-instruct-2506", name: "Mistral Small 3.2 (🆓 EU)" }, + { id: "deepseek-v3-0324", name: "DeepSeek V3 (🆓 EU)" }, + { id: "gpt-oss-120b", name: "GPT-OSS 120B (🆓 EU)" }, + ], + }, + + aimlapi: { + id: "aimlapi", + alias: "aiml", + format: "openai", + executor: "default", + baseUrl: "https://api.aimlapi.com/v1/chat/completions", + authType: "apikey", + authHeader: "bearer", + // $0.025/day free credits — 200+ models via single aggregator endpoint + models: [ + { id: "gpt-4o", name: "GPT-4o (via AI/ML API)" }, + { id: "claude-3-5-sonnet-20241022", name: "Claude 3.5 Sonnet (via AI/ML API)" }, + { id: "gemini-1.5-pro", name: "Gemini 1.5 Pro (via AI/ML API)" }, + { id: "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo", name: "Llama 3.1 70B (via AI/ML API)" }, + { id: "deepseek-chat", name: "DeepSeek Chat (via AI/ML API)" }, + { id: "mistral-large-latest", name: "Mistral Large (via AI/ML API)" }, + ], + passthroughModels: true, + }, }; // ── Generator Functions ─────────────────────────────────────────────────── diff --git a/open-sse/executors/cloudflare-ai.ts b/open-sse/executors/cloudflare-ai.ts new file mode 100644 index 0000000000..b3f401989d --- /dev/null +++ b/open-sse/executors/cloudflare-ai.ts @@ -0,0 +1,59 @@ +import { BaseExecutor } from "./base.ts"; +import { PROVIDERS } from "../config/constants.ts"; + +/** + * CloudflareAIExecutor — handles dynamic URL construction with accountId. + * Cloudflare Workers AI uses the authenticated user's account ID in the URL. + * + * URL pattern: https://api.cloudflare.com/client/v4/accounts/{accountId}/ai/v1/chat/completions + * Auth: Bearer + * Docs: https://developers.cloudflare.com/workers-ai/ + * + * Free tier: 10,000 Neurons/day = ~150 LLM responses or 500s Whisper audio + * API Token: dash.cloudflare.com/profile/api-tokens + * Account ID: right sidebar of dash.cloudflare.com + */ +export class CloudflareAIExecutor extends BaseExecutor { + constructor() { + super("cloudflare-ai", PROVIDERS["cloudflare-ai"] || { format: "openai" }); + } + + buildUrl(_model: string, _stream: boolean, _urlIndex = 0, credentials: any = null): string { + // Account ID can be stored in providerSpecificData or at top level credentials + const accountId = + credentials?.providerSpecificData?.accountId || + credentials?.accountId || + process.env.CLOUDFLARE_ACCOUNT_ID; + + if (!accountId) { + throw new Error( + "Cloudflare Workers AI requires an Account ID. " + + "Add it in provider settings under 'Account ID'. " + + "Find it at: https://dash.cloudflare.com (right sidebar)." + ); + } + + return `https://api.cloudflare.com/client/v4/accounts/${accountId}/ai/v1/chat/completions`; + } + + buildHeaders(credentials: any, stream = true): Record { + const headers: Record = { + "Content-Type": "application/json", + Authorization: `Bearer ${credentials.apiKey || credentials.accessToken}`, + }; + + if (stream) { + headers["Accept"] = "text/event-stream"; + } + + return headers; + } + + transformRequest(_model: string, body: any, _stream: boolean, _credentials: any): any { + // Cloudflare uses full model paths like @cf/meta/llama-3.3-70b-instruct + // No transformation needed — user sends the full Cloudflare model path. + return body; + } +} + +export default CloudflareAIExecutor; diff --git a/open-sse/executors/index.ts b/open-sse/executors/index.ts index 46acf3fada..0544119dca 100644 --- a/open-sse/executors/index.ts +++ b/open-sse/executors/index.ts @@ -6,6 +6,8 @@ import { KiroExecutor } from "./kiro.ts"; import { CodexExecutor } from "./codex.ts"; import { CursorExecutor } from "./cursor.ts"; import { DefaultExecutor } from "./default.ts"; +import { PollinationsExecutor } from "./pollinations.ts"; +import { CloudflareAIExecutor } from "./cloudflare-ai.ts"; const executors = { antigravity: new AntigravityExecutor(), @@ -16,6 +18,10 @@ const executors = { codex: new CodexExecutor(), cursor: new CursorExecutor(), cu: new CursorExecutor(), // Alias for cursor + pollinations: new PollinationsExecutor(), + pol: new PollinationsExecutor(), // Alias + "cloudflare-ai": new CloudflareAIExecutor(), + cf: new CloudflareAIExecutor(), // Alias }; const defaultCache = new Map(); @@ -39,3 +45,5 @@ export { KiroExecutor } from "./kiro.ts"; export { CodexExecutor } from "./codex.ts"; export { CursorExecutor } from "./cursor.ts"; export { DefaultExecutor } from "./default.ts"; +export { PollinationsExecutor } from "./pollinations.ts"; +export { CloudflareAIExecutor } from "./cloudflare-ai.ts"; diff --git a/open-sse/executors/pollinations.ts b/open-sse/executors/pollinations.ts new file mode 100644 index 0000000000..55f9c6180e --- /dev/null +++ b/open-sse/executors/pollinations.ts @@ -0,0 +1,46 @@ +import { BaseExecutor } from "./base.ts"; +import { PROVIDERS } from "../config/constants.ts"; + +/** + * PollinationsExecutor — handles optional API key auth. + * Pollinations AI works WITHOUT any API key for basic use (1 req/15s). + * If an API key is provided, higher rate limits apply. + * + * Endpoint: https://text.pollinations.ai/openai/chat/completions + * Docs: https://pollinations.ai/docs + */ +export class PollinationsExecutor extends BaseExecutor { + constructor() { + super("pollinations", PROVIDERS["pollinations"] || { format: "openai" }); + } + + buildUrl(_model: string, _stream: boolean, _urlIndex = 0, _credentials = null): string { + return "https://text.pollinations.ai/openai/chat/completions"; + } + + buildHeaders(credentials: any, stream = true): Record { + const headers: Record = { + "Content-Type": "application/json", + }; + + // API key is OPTIONAL — skip Authorization header if no key provided + const key = credentials?.apiKey || credentials?.accessToken; + if (key) { + headers["Authorization"] = `Bearer ${key}`; + } + + if (stream) { + headers["Accept"] = "text/event-stream"; + } + + return headers; + } + + transformRequest(model: string, body: any, _stream: boolean, _credentials: any): any { + // Pollinations uses model names directly like "openai", "claude", "deepseek", etc. + // No transformation needed — the model name is already the Pollinations alias. + return body; + } +} + +export default PollinationsExecutor; diff --git a/src/shared/constants/providers.ts b/src/shared/constants/providers.ts index b124579c4e..8124f18936 100644 --- a/src/shared/constants/providers.ts +++ b/src/shared/constants/providers.ts @@ -161,11 +161,14 @@ export const APIKEY_PROVIDERS = { gemini: { id: "gemini", alias: "gemini", - name: "Gemini", + name: "Gemini (Google AI Studio)", icon: "diamond", color: "#4285F4", textIcon: "GE", website: "https://ai.google.dev", + hasFree: true, + freeNote: + "Free forever: 1,500 req/day for Gemini 2.5 Flash — no credit card, get key at aistudio.google.com", }, deepseek: { id: "deepseek", @@ -231,6 +234,9 @@ export const APIKEY_PROVIDERS = { color: "#0F6FFF", textIcon: "TG", website: "https://www.together.ai", + hasFree: true, + freeNote: + "$25 signup credits + 3 permanently free models: Llama 3.3 70B, Vision, DeepSeek-R1 distill", }, fireworks: { id: "fireworks", @@ -500,6 +506,67 @@ export const APIKEY_PROVIDERS = { website: "https://dashscope-intl.aliyuncs.com", hasFree: false, }, + longcat: { + id: "longcat", + alias: "lc", + name: "LongCat AI", + icon: "auto_awesome", + color: "#FF6B9D", + textIcon: "LC", + website: "https://longcat.chat", + hasFree: true, + freeNote: + "50M tokens/day (Flash-Lite) + 500K/day (Chat/Thinking) — 100% free while public beta", + }, + pollinations: { + id: "pollinations", + alias: "pol", + name: "Pollinations AI", + icon: "local_florist", + color: "#4CAF50", + textIcon: "PO", + website: "https://pollinations.ai", + hasFree: true, + freeNote: + "No API key needed — access GPT-5, Claude, Gemini, DeepSeek V3, Llama 4 free (1 req/15s)", + }, + "cloudflare-ai": { + id: "cloudflare-ai", + alias: "cf", + name: "Cloudflare Workers AI", + icon: "cloud", + color: "#F48120", + textIcon: "CF", + website: "https://developers.cloudflare.com/workers-ai/", + hasFree: true, + freeNote: + "Free 10K Neurons/day: ~150 LLM responses or 500s Whisper audio — edge inference globally", + authHint: "Requires API Token AND Account ID (found at dash.cloudflare.com)", + }, + scaleway: { + id: "scaleway", + alias: "scw", + name: "Scaleway AI", + icon: "cloud", + color: "#4F0599", + textIcon: "SCW", + website: "https://www.scaleway.com/en/ai/generative-apis/", + hasFree: true, + freeNote: "1M free tokens for new accounts — EU/GDPR compliant (Paris), Qwen3 235B & Llama 70B", + }, + aimlapi: { + id: "aimlapi", + alias: "aiml", + name: "AI/ML API", + icon: "hub", + color: "#6366F1", + textIcon: "AI", + website: "https://aimlapi.com", + hasFree: true, + freeNote: + "$0.025/day free credits — 200+ models (GPT-4o, Claude, Gemini, Llama) via single endpoint", + passthroughModels: true, + }, }; export const OPENAI_COMPATIBLE_PREFIX = "openai-compatible-"; From f0419396b512de2e18f81aa3eeabfdb21eedb180 Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Sat, 21 Mar 2026 15:44:35 -0300 Subject: [PATCH 2/3] chore(release): bump version to 2.9.3, update CHANGELOG MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Version bumped from 2.9.2 → 2.9.3 in package.json + docs/openapi.yaml - CHANGELOG.md updated with full release notes for 2.9.3 (5 new free providers, 2 metadata updates, 2 custom executors, docs) --- CHANGELOG.md | 38 ++++++++++++++++++++++++++++++++++++++ docs/openapi.yaml | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 42 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb52cb4b02..42e4221ac3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,44 @@ --- +## [2.9.3] — 2026-03-21 + +> Sprint: Add 5 new free AI providers — LongCat, Pollinations, Cloudflare AI, Scaleway, AI/ML API. + +### ✨ New Providers + +- **feat(providers/longcat)**: Add LongCat AI (`lc/`) — 50M tokens/day free (Flash-Lite) + 500K/day (Chat/Thinking) during public beta. OpenAI-compatible, standard Bearer auth. +- **feat(providers/pollinations)**: Add Pollinations AI (`pol/`) — no API key required. Proxies GPT-5, Claude, Gemini, DeepSeek V3, Llama 4 (1 req/15s free). Custom executor handles optional auth. +- **feat(providers/cloudflare-ai)**: Add Cloudflare Workers AI (`cf/`) — 10K Neurons/day free (~150 LLM responses or 500s Whisper audio). 50+ models on global edge. Custom executor builds dynamic URL with `accountId` from credentials. +- **feat(providers/scaleway)**: Add Scaleway Generative APIs (`scw/`) — 1M free tokens for new accounts. EU/GDPR compliant (Paris). Qwen3 235B, Llama 3.1 70B, Mistral Small 3.2. +- **feat(providers/aimlapi)**: Add AI/ML API (`aiml/`) — $0.025/day free credit, 200+ models (GPT-4o, Claude, Gemini, Llama) via single aggregator endpoint. + +### 🔄 Provider Updates + +- **feat(providers/together)**: Add `hasFree: true` + 3 permanently free model IDs: `Llama-3.3-70B-Instruct-Turbo-Free`, `Llama-Vision-Free`, `DeepSeek-R1-Distill-Llama-70B-Free` +- **feat(providers/gemini)**: Add `hasFree: true` + `freeNote` (1,500 req/day, no credit card needed, aistudio.google.com) +- **chore(providers/gemini)**: Rename display name to `Gemini (Google AI Studio)` for clarity + +### ⚙️ Infrastructure + +- **feat(executors/pollinations)**: New `PollinationsExecutor` — omits `Authorization` header when no API key provided +- **feat(executors/cloudflare-ai)**: New `CloudflareAIExecutor` — dynamic URL construction requires `accountId` in provider credentials +- **feat(executors)**: Register `pollinations`, `pol`, `cloudflare-ai`, `cf` executor mappings + +### 📝 Documentation + +- **docs(readme)**: Expanded free combo stack to 11 providers ($0 forever) +- **docs(readme)**: Added 4 new free provider sections (LongCat, Pollinations, Cloudflare AI, Scaleway) with model tables +- **docs(readme)**: Updated pricing table with 4 new free tier rows +- **docs(i18n/pt-BR)**: Updated pricing table + added LongCat/Pollinations/Cloudflare AI/Scaleway sections in Portuguese +- **docs(new-features/ai)**: 10 task spec files + master implementation plan in `docs/new-features/ai/` + +### 🧪 Tests + +- Test suite: **821 tests, 0 failures** (unchanged) + +--- + ## [2.9.2] — 2026-03-21 > Sprint: Fix media transcription (Deepgram/HuggingFace Content-Type, language detection) and TTS error display. diff --git a/docs/openapi.yaml b/docs/openapi.yaml index ce783d6f97..31ee7d0af5 100644 --- a/docs/openapi.yaml +++ b/docs/openapi.yaml @@ -1,7 +1,7 @@ openapi: 3.1.0 info: title: OmniRoute API - version: 2.9.2 + version: 2.9.3 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 fa4000de3f..04f712c24d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "omniroute", - "version": "2.9.2", + "version": "2.9.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "omniroute", - "version": "2.9.2", + "version": "2.9.3", "hasInstallScript": true, "license": "MIT", "workspaces": [ diff --git a/package.json b/package.json index 166265e4b3..3bdde1fc37 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "omniroute", - "version": "2.9.2", + "version": "2.9.3", "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": { From 81b3034c2f7b6e8b99d2b45fdfa6fc8b5c8cbd58 Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Sat, 21 Mar 2026 16:47:49 -0300 Subject: [PATCH 3/3] feat(providers/logos): add logos for 5 new free providers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - public/providers/longcat.png — pink cat icon (generated) - public/providers/pollinations.png — pixel bee icon (generated) - public/providers/aimlapi.png — indigo neural network icon (generated) - public/providers/cloudflare-ai.svg — Cloudflare official SVG (simpleicons.org) - public/providers/scaleway.svg — Scaleway official SVG (simpleicons.org) Icons serve at /providers/{id}.png (PNG fallback to SVG) --- public/providers/aimlapi.png | Bin 0 -> 38880 bytes public/providers/cloudflare-ai.svg | 1 + public/providers/longcat.png | Bin 0 -> 14685 bytes public/providers/pollinations.png | Bin 0 -> 18844 bytes public/providers/scaleway.svg | 1 + 5 files changed, 2 insertions(+) create mode 100644 public/providers/aimlapi.png create mode 100644 public/providers/cloudflare-ai.svg create mode 100644 public/providers/longcat.png create mode 100644 public/providers/pollinations.png create mode 100644 public/providers/scaleway.svg diff --git a/public/providers/aimlapi.png b/public/providers/aimlapi.png new file mode 100644 index 0000000000000000000000000000000000000000..190a6853b1d540cc4c3432947f3a3cfe63256c34 GIT binary patch literal 38880 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 \ No newline at end of file diff --git a/public/providers/longcat.png b/public/providers/longcat.png new file mode 100644 index 0000000000000000000000000000000000000000..b5c6be8f844213b426a98f0ea15bfa5e5e74e7bb GIT binary patch literal 14685 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�u+* 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 Wr~ZR#jVJvSScaleway \ No newline at end of file