From bfa9cd15b7b01bcdbe841aed47eae28c0d74a7e9 Mon Sep 17 00:00:00 2001 From: zenobit Date: Thu, 19 Mar 2026 03:48:41 +0100 Subject: [PATCH] Add Czech language + Fix VM_DEPLOYMENT_GUIDE.md English source Author: zenobit --- .agents/workflows/update-docs.md | 4 +- README.md | 2 +- docs/API_REFERENCE.md | 2 +- docs/ARCHITECTURE.md | 2 +- docs/CODEBASE_DOCUMENTATION.md | 2 +- docs/FEATURES.md | 2 +- docs/TROUBLESHOOTING.md | 2 +- docs/USER_GUIDE.md | 2 +- docs/VM_DEPLOYMENT_GUIDE.md | 210 +- docs/i18n/cs/A2A-SERVER.md | 196 ++ docs/i18n/cs/API_REFERENCE.md | 451 +++ docs/i18n/cs/ARCHITECTURE.md | 782 +++++ docs/i18n/cs/AUTO-COMBO.md | 63 + docs/i18n/cs/CHANGELOG.md | 715 +++++ docs/i18n/cs/CLI-TOOLS.md | 341 +++ docs/i18n/cs/CODEBASE_DOCUMENTATION.md | 589 ++++ docs/i18n/cs/CONTRIBUTING.md | 273 ++ docs/i18n/cs/FEATURES.md | 143 + docs/i18n/cs/MCP-SERVER.md | 83 + docs/i18n/cs/README.md | 2010 +++++++++++++ docs/i18n/cs/RELEASE_CHECKLIST.md | 33 + docs/i18n/cs/SECURITY.md | 169 ++ docs/i18n/cs/TROUBLESHOOTING.md | 254 ++ docs/i18n/cs/USER_GUIDE.md | 814 +++++ docs/i18n/cs/VM_DEPLOYMENT_GUIDE.md | 399 +++ ...001-proxy-registry-limit-generalization.md | 45 + ...api-error-contract-management-endpoints.md | 31 + .../0003-security-checklist-proxy-limits.md | 15 + docs/i18n/cs/electron/README.md | 254 ++ docs/i18n/cs/i18n/README.html | 164 ++ docs/i18n/cs/i18n/README.md | 26 + docs/i18n/cs/open-sse/mcp-server/README.md | 587 ++++ llm.txt | 4 +- scripts/i18n/generate-multilang.mjs | 9 + src/i18n/config.ts | 64 +- src/i18n/messages/cs.json | 2606 +++++++++++++++++ 36 files changed, 11201 insertions(+), 147 deletions(-) create mode 100644 docs/i18n/cs/A2A-SERVER.md create mode 100644 docs/i18n/cs/API_REFERENCE.md create mode 100644 docs/i18n/cs/ARCHITECTURE.md create mode 100644 docs/i18n/cs/AUTO-COMBO.md create mode 100644 docs/i18n/cs/CHANGELOG.md create mode 100644 docs/i18n/cs/CLI-TOOLS.md create mode 100644 docs/i18n/cs/CODEBASE_DOCUMENTATION.md create mode 100644 docs/i18n/cs/CONTRIBUTING.md create mode 100644 docs/i18n/cs/FEATURES.md create mode 100644 docs/i18n/cs/MCP-SERVER.md create mode 100644 docs/i18n/cs/README.md create mode 100644 docs/i18n/cs/RELEASE_CHECKLIST.md create mode 100644 docs/i18n/cs/SECURITY.md create mode 100644 docs/i18n/cs/TROUBLESHOOTING.md create mode 100644 docs/i18n/cs/USER_GUIDE.md create mode 100644 docs/i18n/cs/VM_DEPLOYMENT_GUIDE.md create mode 100644 docs/i18n/cs/adr/0001-proxy-registry-limit-generalization.md create mode 100644 docs/i18n/cs/adr/0002-api-error-contract-management-endpoints.md create mode 100644 docs/i18n/cs/adr/0003-security-checklist-proxy-limits.md create mode 100644 docs/i18n/cs/electron/README.md create mode 100644 docs/i18n/cs/i18n/README.html create mode 100644 docs/i18n/cs/i18n/README.md create mode 100644 docs/i18n/cs/open-sse/mcp-server/README.md create mode 100644 src/i18n/messages/cs.json diff --git a/.agents/workflows/update-docs.md b/.agents/workflows/update-docs.md index 9808194d..ab3bd26a 100644 --- a/.agents/workflows/update-docs.md +++ b/.agents/workflows/update-docs.md @@ -56,13 +56,13 @@ README.pt-BR.md README.pt.md README.es.md README.fr.md README.it.md README.de.md README.nl.md README.sv.md README.no.md README.da.md README.fi.md README.ru.md README.uk-UA.md README.bg.md README.sk.md README.pl.md README.ro.md README.hu.md README.ar.md README.he.md README.th.md README.in.md README.id.md README.ms.md README.vi.md -README.ja.md README.ko.md README.zh-CN.md README.phi.md +README.ja.md README.ko.md README.zh-CN.md README.phi.md README.cs.md ``` **docs/i18n/ directories (29 languages):** ``` -docs/i18n/{ar,bg,da,de,es,fi,fr,he,hu,id,in,it,ja,ko,ms,nl,no,phi,pl,pt,pt-BR,ro,ru,sk,sv,th,uk-UA,vi,zh-CN}/ +docs/i18n/{ar,bg,cs,da,de,es,fi,fr,he,hu,id,in,it,ja,ko,ms,nl,no,phi,pl,pt,pt-BR,ro,ru,sk,sv,th,uk-UA,vi,zh-CN}/ Each contains: API_REFERENCE.md, ARCHITECTURE.md, CODEBASE_DOCUMENTATION.md, FEATURES.md, TROUBLESHOOTING.md, USER_GUIDE.md ``` diff --git a/README.md b/README.md index 6e5db968..c7a74c11 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ _Your universal API proxy — one endpoint, 44+ providers, zero downtime. Now wi -🌐 **Available in:** 🇺🇸 [English](README.md) | 🇧🇷 [Português (Brasil)](docs/i18n/pt-BR/README.md) | 🇪🇸 [Español](docs/i18n/es/README.md) | 🇫🇷 [Français](docs/i18n/fr/README.md) | 🇮🇹 [Italiano](docs/i18n/it/README.md) | 🇷🇺 [Русский](docs/i18n/ru/README.md) | 🇨🇳 [中文 (简体)](docs/i18n/zh-CN/README.md) | 🇩🇪 [Deutsch](docs/i18n/de/README.md) | 🇮🇳 [हिन्दी](docs/i18n/in/README.md) | 🇹🇭 [ไทย](docs/i18n/th/README.md) | 🇺🇦 [Українська](docs/i18n/uk-UA/README.md) | 🇸🇦 [العربية](docs/i18n/ar/README.md) | 🇯🇵 [日本語](docs/i18n/ja/README.md) | 🇻🇳 [Tiếng Việt](docs/i18n/vi/README.md) | 🇧🇬 [Български](docs/i18n/bg/README.md) | 🇩🇰 [Dansk](docs/i18n/da/README.md) | 🇫🇮 [Suomi](docs/i18n/fi/README.md) | 🇮🇱 [עברית](docs/i18n/he/README.md) | 🇭🇺 [Magyar](docs/i18n/hu/README.md) | 🇮🇩 [Bahasa Indonesia](docs/i18n/id/README.md) | 🇰🇷 [한국어](docs/i18n/ko/README.md) | 🇲🇾 [Bahasa Melayu](docs/i18n/ms/README.md) | 🇳🇱 [Nederlands](docs/i18n/nl/README.md) | 🇳🇴 [Norsk](docs/i18n/no/README.md) | 🇵🇹 [Português (Portugal)](docs/i18n/pt/README.md) | 🇷🇴 [Română](docs/i18n/ro/README.md) | 🇵🇱 [Polski](docs/i18n/pl/README.md) | 🇸🇰 [Slovenčina](docs/i18n/sk/README.md) | 🇸🇪 [Svenska](docs/i18n/sv/README.md) | 🇵🇭 [Filipino](docs/i18n/phi/README.md) +🌐 **Available in:** 🇺🇸 [English](README.md) | 🇧🇷 [Português (Brasil)](docs/i18n/pt-BR/README.md) | 🇪🇸 [Español](docs/i18n/es/README.md) | 🇫🇷 [Français](docs/i18n/fr/README.md) | 🇮🇹 [Italiano](docs/i18n/it/README.md) | 🇷🇺 [Русский](docs/i18n/ru/README.md) | 🇨🇳 [中文 (简体)](docs/i18n/zh-CN/README.md) | 🇩🇪 [Deutsch](docs/i18n/de/README.md) | 🇮🇳 [हिन्दी](docs/i18n/in/README.md) | 🇹🇭 [ไทย](docs/i18n/th/README.md) | 🇺🇦 [Українська](docs/i18n/uk-UA/README.md) | 🇸🇦 [العربية](docs/i18n/ar/README.md) | 🇯🇵 [日本語](docs/i18n/ja/README.md) | 🇻🇳 [Tiếng Việt](docs/i18n/vi/README.md) | 🇧🇬 [Български](docs/i18n/bg/README.md) | 🇩🇰 [Dansk](docs/i18n/da/README.md) | 🇫🇮 [Suomi](docs/i18n/fi/README.md) | 🇮🇱 [עברית](docs/i18n/he/README.md) | 🇭🇺 [Magyar](docs/i18n/hu/README.md) | 🇮🇩 [Bahasa Indonesia](docs/i18n/id/README.md) | 🇰🇷 [한국어](docs/i18n/ko/README.md) | 🇲🇾 [Bahasa Melayu](docs/i18n/ms/README.md) | 🇳🇱 [Nederlands](docs/i18n/nl/README.md) | 🇳🇴 [Norsk](docs/i18n/no/README.md) | 🇵🇹 [Português (Portugal)](docs/i18n/pt/README.md) | 🇷🇴 [Română](docs/i18n/ro/README.md) | 🇵🇱 [Polski](docs/i18n/pl/README.md) | 🇸🇰 [Slovenčina](docs/i18n/sk/README.md) | 🇸🇪 [Svenska](docs/i18n/sv/README.md) | 🇵🇭 [Filipino](docs/i18n/phi/README.md) | 🇨🇿 [Čeština](docs/i18n/cs/README.md) --- diff --git a/docs/API_REFERENCE.md b/docs/API_REFERENCE.md index b795722c..39c6f3f5 100644 --- a/docs/API_REFERENCE.md +++ b/docs/API_REFERENCE.md @@ -1,6 +1,6 @@ # API Reference -🌐 **Languages:** 🇺🇸 [English](API_REFERENCE.md) | 🇧🇷 [Português (Brasil)](i18n/pt-BR/API_REFERENCE.md) | 🇪🇸 [Español](i18n/es/API_REFERENCE.md) | 🇫🇷 [Français](i18n/fr/API_REFERENCE.md) | 🇮🇹 [Italiano](i18n/it/API_REFERENCE.md) | 🇷🇺 [Русский](i18n/ru/API_REFERENCE.md) | 🇨🇳 [中文 (简体)](i18n/zh-CN/API_REFERENCE.md) | 🇩🇪 [Deutsch](i18n/de/API_REFERENCE.md) | 🇮🇳 [हिन्दी](i18n/in/API_REFERENCE.md) | 🇹🇭 [ไทย](i18n/th/API_REFERENCE.md) | 🇺🇦 [Українська](i18n/uk-UA/API_REFERENCE.md) | 🇸🇦 [العربية](i18n/ar/API_REFERENCE.md) | 🇯🇵 [日本語](i18n/ja/API_REFERENCE.md) | 🇻🇳 [Tiếng Việt](i18n/vi/API_REFERENCE.md) | 🇧🇬 [Български](i18n/bg/API_REFERENCE.md) | 🇩🇰 [Dansk](i18n/da/API_REFERENCE.md) | 🇫🇮 [Suomi](i18n/fi/API_REFERENCE.md) | 🇮🇱 [עברית](i18n/he/API_REFERENCE.md) | 🇭🇺 [Magyar](i18n/hu/API_REFERENCE.md) | 🇮🇩 [Bahasa Indonesia](i18n/id/API_REFERENCE.md) | 🇰🇷 [한국어](i18n/ko/API_REFERENCE.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/API_REFERENCE.md) | 🇳🇱 [Nederlands](i18n/nl/API_REFERENCE.md) | 🇳🇴 [Norsk](i18n/no/API_REFERENCE.md) | 🇵🇹 [Português (Portugal)](i18n/pt/API_REFERENCE.md) | 🇷🇴 [Română](i18n/ro/API_REFERENCE.md) | 🇵🇱 [Polski](i18n/pl/API_REFERENCE.md) | 🇸🇰 [Slovenčina](i18n/sk/API_REFERENCE.md) | 🇸🇪 [Svenska](i18n/sv/API_REFERENCE.md) | 🇵🇭 [Filipino](i18n/phi/API_REFERENCE.md) +🌐 **Languages:** 🇺🇸 [English](API_REFERENCE.md) | 🇧🇷 [Português (Brasil)](i18n/pt-BR/API_REFERENCE.md) | 🇪🇸 [Español](i18n/es/API_REFERENCE.md) | 🇫🇷 [Français](i18n/fr/API_REFERENCE.md) | 🇮🇹 [Italiano](i18n/it/API_REFERENCE.md) | 🇷🇺 [Русский](i18n/ru/API_REFERENCE.md) | 🇨🇳 [中文 (简体)](i18n/zh-CN/API_REFERENCE.md) | 🇩🇪 [Deutsch](i18n/de/API_REFERENCE.md) | 🇮🇳 [हिन्दी](i18n/in/API_REFERENCE.md) | 🇹🇭 [ไทย](i18n/th/API_REFERENCE.md) | 🇺🇦 [Українська](i18n/uk-UA/API_REFERENCE.md) | 🇸🇦 [العربية](i18n/ar/API_REFERENCE.md) | 🇯🇵 [日本語](i18n/ja/API_REFERENCE.md) | 🇻🇳 [Tiếng Việt](i18n/vi/API_REFERENCE.md) | 🇧🇬 [Български](i18n/bg/API_REFERENCE.md) | 🇩🇰 [Dansk](i18n/da/API_REFERENCE.md) | 🇫🇮 [Suomi](i18n/fi/API_REFERENCE.md) | 🇮🇱 [עברית](i18n/he/API_REFERENCE.md) | 🇭🇺 [Magyar](i18n/hu/API_REFERENCE.md) | 🇮🇩 [Bahasa Indonesia](i18n/id/API_REFERENCE.md) | 🇰🇷 [한국어](i18n/ko/API_REFERENCE.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/API_REFERENCE.md) | 🇳🇱 [Nederlands](i18n/nl/API_REFERENCE.md) | 🇳🇴 [Norsk](i18n/no/API_REFERENCE.md) | 🇵🇹 [Português (Portugal)](i18n/pt/API_REFERENCE.md) | 🇷🇴 [Română](i18n/ro/API_REFERENCE.md) | 🇵🇱 [Polski](i18n/pl/API_REFERENCE.md) | 🇸🇰 [Slovenčina](i18n/sk/API_REFERENCE.md) | 🇸🇪 [Svenska](i18n/sv/API_REFERENCE.md) | 🇵🇭 [Filipino](i18n/phi/API_REFERENCE.md) | 🇨🇿 [Čeština](i18n/cs/API_REFERENCE.md) Complete reference for all OmniRoute API endpoints. diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 258d62df..deaf9d44 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -1,6 +1,6 @@ # OmniRoute Architecture -🌐 **Languages:** 🇺🇸 [English](ARCHITECTURE.md) | 🇧🇷 [Português (Brasil)](i18n/pt-BR/ARCHITECTURE.md) | 🇪🇸 [Español](i18n/es/ARCHITECTURE.md) | 🇫🇷 [Français](i18n/fr/ARCHITECTURE.md) | 🇮🇹 [Italiano](i18n/it/ARCHITECTURE.md) | 🇷🇺 [Русский](i18n/ru/ARCHITECTURE.md) | 🇨🇳 [中文 (简体)](i18n/zh-CN/ARCHITECTURE.md) | 🇩🇪 [Deutsch](i18n/de/ARCHITECTURE.md) | 🇮🇳 [हिन्दी](i18n/in/ARCHITECTURE.md) | 🇹🇭 [ไทย](i18n/th/ARCHITECTURE.md) | 🇺🇦 [Українська](i18n/uk-UA/ARCHITECTURE.md) | 🇸🇦 [العربية](i18n/ar/ARCHITECTURE.md) | 🇯🇵 [日本語](i18n/ja/ARCHITECTURE.md) | 🇻🇳 [Tiếng Việt](i18n/vi/ARCHITECTURE.md) | 🇧🇬 [Български](i18n/bg/ARCHITECTURE.md) | 🇩🇰 [Dansk](i18n/da/ARCHITECTURE.md) | 🇫🇮 [Suomi](i18n/fi/ARCHITECTURE.md) | 🇮🇱 [עברית](i18n/he/ARCHITECTURE.md) | 🇭🇺 [Magyar](i18n/hu/ARCHITECTURE.md) | 🇮🇩 [Bahasa Indonesia](i18n/id/ARCHITECTURE.md) | 🇰🇷 [한국어](i18n/ko/ARCHITECTURE.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/ARCHITECTURE.md) | 🇳🇱 [Nederlands](i18n/nl/ARCHITECTURE.md) | 🇳🇴 [Norsk](i18n/no/ARCHITECTURE.md) | 🇵🇹 [Português (Portugal)](i18n/pt/ARCHITECTURE.md) | 🇷🇴 [Română](i18n/ro/ARCHITECTURE.md) | 🇵🇱 [Polski](i18n/pl/ARCHITECTURE.md) | 🇸🇰 [Slovenčina](i18n/sk/ARCHITECTURE.md) | 🇸🇪 [Svenska](i18n/sv/ARCHITECTURE.md) | 🇵🇭 [Filipino](i18n/phi/ARCHITECTURE.md) +🌐 **Languages:** 🇺🇸 [English](ARCHITECTURE.md) | 🇧🇷 [Português (Brasil)](i18n/pt-BR/ARCHITECTURE.md) | 🇪🇸 [Español](i18n/es/ARCHITECTURE.md) | 🇫🇷 [Français](i18n/fr/ARCHITECTURE.md) | 🇮🇹 [Italiano](i18n/it/ARCHITECTURE.md) | 🇷🇺 [Русский](i18n/ru/ARCHITECTURE.md) | 🇨🇳 [中文 (简体)](i18n/zh-CN/ARCHITECTURE.md) | 🇩🇪 [Deutsch](i18n/de/ARCHITECTURE.md) | 🇮🇳 [हिन्दी](i18n/in/ARCHITECTURE.md) | 🇹🇭 [ไทย](i18n/th/ARCHITECTURE.md) | 🇺🇦 [Українська](i18n/uk-UA/ARCHITECTURE.md) | 🇸🇦 [العربية](i18n/ar/ARCHITECTURE.md) | 🇯🇵 [日本語](i18n/ja/ARCHITECTURE.md) | 🇻🇳 [Tiếng Việt](i18n/vi/ARCHITECTURE.md) | 🇧🇬 [Български](i18n/bg/ARCHITECTURE.md) | 🇩🇰 [Dansk](i18n/da/ARCHITECTURE.md) | 🇫🇮 [Suomi](i18n/fi/ARCHITECTURE.md) | 🇮🇱 [עברית](i18n/he/ARCHITECTURE.md) | 🇭🇺 [Magyar](i18n/hu/ARCHITECTURE.md) | 🇮🇩 [Bahasa Indonesia](i18n/id/ARCHITECTURE.md) | 🇰🇷 [한국어](i18n/ko/ARCHITECTURE.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/ARCHITECTURE.md) | 🇳🇱 [Nederlands](i18n/nl/ARCHITECTURE.md) | 🇳🇴 [Norsk](i18n/no/ARCHITECTURE.md) | 🇵🇹 [Português (Portugal)](i18n/pt/ARCHITECTURE.md) | 🇷🇴 [Română](i18n/ro/ARCHITECTURE.md) | 🇵🇱 [Polski](i18n/pl/ARCHITECTURE.md) | 🇸🇰 [Slovenčina](i18n/sk/ARCHITECTURE.md) | 🇸🇪 [Svenska](i18n/sv/ARCHITECTURE.md) | 🇵🇭 [Filipino](i18n/phi/ARCHITECTURE.md)| 🇨🇿 [Čeština](i18n/cs/ARCHITECTURE.md) _Last updated: 2026-03-04_ diff --git a/docs/CODEBASE_DOCUMENTATION.md b/docs/CODEBASE_DOCUMENTATION.md index 303880c1..990b05b5 100644 --- a/docs/CODEBASE_DOCUMENTATION.md +++ b/docs/CODEBASE_DOCUMENTATION.md @@ -1,6 +1,6 @@ # omniroute — Codebase Documentation -🌐 **Languages:** 🇺🇸 [English](CODEBASE_DOCUMENTATION.md) | 🇧🇷 [Português (Brasil)](i18n/pt-BR/CODEBASE_DOCUMENTATION.md) | 🇪🇸 [Español](i18n/es/CODEBASE_DOCUMENTATION.md) | 🇫🇷 [Français](i18n/fr/CODEBASE_DOCUMENTATION.md) | 🇮🇹 [Italiano](i18n/it/CODEBASE_DOCUMENTATION.md) | 🇷🇺 [Русский](i18n/ru/CODEBASE_DOCUMENTATION.md) | 🇨🇳 [中文 (简体)](i18n/zh-CN/CODEBASE_DOCUMENTATION.md) | 🇩🇪 [Deutsch](i18n/de/CODEBASE_DOCUMENTATION.md) | 🇮🇳 [हिन्दी](i18n/in/CODEBASE_DOCUMENTATION.md) | 🇹🇭 [ไทย](i18n/th/CODEBASE_DOCUMENTATION.md) | 🇺🇦 [Українська](i18n/uk-UA/CODEBASE_DOCUMENTATION.md) | 🇸🇦 [العربية](i18n/ar/CODEBASE_DOCUMENTATION.md) | 🇯🇵 [日本語](i18n/ja/CODEBASE_DOCUMENTATION.md) | 🇻🇳 [Tiếng Việt](i18n/vi/CODEBASE_DOCUMENTATION.md) | 🇧🇬 [Български](i18n/bg/CODEBASE_DOCUMENTATION.md) | 🇩🇰 [Dansk](i18n/da/CODEBASE_DOCUMENTATION.md) | 🇫🇮 [Suomi](i18n/fi/CODEBASE_DOCUMENTATION.md) | 🇮🇱 [עברית](i18n/he/CODEBASE_DOCUMENTATION.md) | 🇭🇺 [Magyar](i18n/hu/CODEBASE_DOCUMENTATION.md) | 🇮🇩 [Bahasa Indonesia](i18n/id/CODEBASE_DOCUMENTATION.md) | 🇰🇷 [한국어](i18n/ko/CODEBASE_DOCUMENTATION.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/CODEBASE_DOCUMENTATION.md) | 🇳🇱 [Nederlands](i18n/nl/CODEBASE_DOCUMENTATION.md) | 🇳🇴 [Norsk](i18n/no/CODEBASE_DOCUMENTATION.md) | 🇵🇹 [Português (Portugal)](i18n/pt/CODEBASE_DOCUMENTATION.md) | 🇷🇴 [Română](i18n/ro/CODEBASE_DOCUMENTATION.md) | 🇵🇱 [Polski](i18n/pl/CODEBASE_DOCUMENTATION.md) | 🇸🇰 [Slovenčina](i18n/sk/CODEBASE_DOCUMENTATION.md) | 🇸🇪 [Svenska](i18n/sv/CODEBASE_DOCUMENTATION.md) | 🇵🇭 [Filipino](i18n/phi/CODEBASE_DOCUMENTATION.md) +🌐 **Languages:** 🇺🇸 [English](CODEBASE_DOCUMENTATION.md) | 🇧🇷 [Português (Brasil)](i18n/pt-BR/CODEBASE_DOCUMENTATION.md) | 🇪🇸 [Español](i18n/es/CODEBASE_DOCUMENTATION.md) | 🇫🇷 [Français](i18n/fr/CODEBASE_DOCUMENTATION.md) | 🇮🇹 [Italiano](i18n/it/CODEBASE_DOCUMENTATION.md) | 🇷🇺 [Русский](i18n/ru/CODEBASE_DOCUMENTATION.md) | 🇨🇳 [中文 (简体)](i18n/zh-CN/CODEBASE_DOCUMENTATION.md) | 🇩🇪 [Deutsch](i18n/de/CODEBASE_DOCUMENTATION.md) | 🇮🇳 [हिन्दी](i18n/in/CODEBASE_DOCUMENTATION.md) | 🇹🇭 [ไทย](i18n/th/CODEBASE_DOCUMENTATION.md) | 🇺🇦 [Українська](i18n/uk-UA/CODEBASE_DOCUMENTATION.md) | 🇸🇦 [العربية](i18n/ar/CODEBASE_DOCUMENTATION.md) | 🇯🇵 [日本語](i18n/ja/CODEBASE_DOCUMENTATION.md) | 🇻🇳 [Tiếng Việt](i18n/vi/CODEBASE_DOCUMENTATION.md) | 🇧🇬 [Български](i18n/bg/CODEBASE_DOCUMENTATION.md) | 🇩🇰 [Dansk](i18n/da/CODEBASE_DOCUMENTATION.md) | 🇫🇮 [Suomi](i18n/fi/CODEBASE_DOCUMENTATION.md) | 🇮🇱 [עברית](i18n/he/CODEBASE_DOCUMENTATION.md) | 🇭🇺 [Magyar](i18n/hu/CODEBASE_DOCUMENTATION.md) | 🇮🇩 [Bahasa Indonesia](i18n/id/CODEBASE_DOCUMENTATION.md) | 🇰🇷 [한국어](i18n/ko/CODEBASE_DOCUMENTATION.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/CODEBASE_DOCUMENTATION.md) | 🇳🇱 [Nederlands](i18n/nl/CODEBASE_DOCUMENTATION.md) | 🇳🇴 [Norsk](i18n/no/CODEBASE_DOCUMENTATION.md) | 🇵🇹 [Português (Portugal)](i18n/pt/CODEBASE_DOCUMENTATION.md) | 🇷🇴 [Română](i18n/ro/CODEBASE_DOCUMENTATION.md) | 🇵🇱 [Polski](i18n/pl/CODEBASE_DOCUMENTATION.md) | 🇸🇰 [Slovenčina](i18n/sk/CODEBASE_DOCUMENTATION.md) | 🇸🇪 [Svenska](i18n/sv/CODEBASE_DOCUMENTATION.md) | 🇵🇭 [Filipino](i18n/phi/CODEBASE_DOCUMENTATION.md) | 🇨🇿 [Čeština](i18n/cs/CODEBASE_DOCUMENTATION.md) > A comprehensive, beginner-friendly guide to the **omniroute** multi-provider AI proxy router. diff --git a/docs/FEATURES.md b/docs/FEATURES.md index 0b969985..1e7e9881 100644 --- a/docs/FEATURES.md +++ b/docs/FEATURES.md @@ -1,6 +1,6 @@ # OmniRoute — Dashboard Features Gallery -🌐 **Languages:** 🇺🇸 [English](FEATURES.md) | 🇧🇷 [Português (Brasil)](i18n/pt-BR/FEATURES.md) | 🇪🇸 [Español](i18n/es/FEATURES.md) | 🇫🇷 [Français](i18n/fr/FEATURES.md) | 🇮🇹 [Italiano](i18n/it/FEATURES.md) | 🇷🇺 [Русский](i18n/ru/FEATURES.md) | 🇨🇳 [中文 (简体)](i18n/zh-CN/FEATURES.md) | 🇩🇪 [Deutsch](i18n/de/FEATURES.md) | 🇮🇳 [हिन्दी](i18n/in/FEATURES.md) | 🇹🇭 [ไทย](i18n/th/FEATURES.md) | 🇺🇦 [Українська](i18n/uk-UA/FEATURES.md) | 🇸🇦 [العربية](i18n/ar/FEATURES.md) | 🇯🇵 [日本語](i18n/ja/FEATURES.md) | 🇻🇳 [Tiếng Việt](i18n/vi/FEATURES.md) | 🇧🇬 [Български](i18n/bg/FEATURES.md) | 🇩🇰 [Dansk](i18n/da/FEATURES.md) | 🇫🇮 [Suomi](i18n/fi/FEATURES.md) | 🇮🇱 [עברית](i18n/he/FEATURES.md) | 🇭🇺 [Magyar](i18n/hu/FEATURES.md) | 🇮🇩 [Bahasa Indonesia](i18n/id/FEATURES.md) | 🇰🇷 [한국어](i18n/ko/FEATURES.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/FEATURES.md) | 🇳🇱 [Nederlands](i18n/nl/FEATURES.md) | 🇳🇴 [Norsk](i18n/no/FEATURES.md) | 🇵🇹 [Português (Portugal)](i18n/pt/FEATURES.md) | 🇷🇴 [Română](i18n/ro/FEATURES.md) | 🇵🇱 [Polski](i18n/pl/FEATURES.md) | 🇸🇰 [Slovenčina](i18n/sk/FEATURES.md) | 🇸🇪 [Svenska](i18n/sv/FEATURES.md) | 🇵🇭 [Filipino](i18n/phi/FEATURES.md) +🌐 **Languages:** 🇺🇸 [English](FEATURES.md) | 🇧🇷 [Português (Brasil)](i18n/pt-BR/FEATURES.md) | 🇪🇸 [Español](i18n/es/FEATURES.md) | 🇫🇷 [Français](i18n/fr/FEATURES.md) | 🇮🇹 [Italiano](i18n/it/FEATURES.md) | 🇷🇺 [Русский](i18n/ru/FEATURES.md) | 🇨🇳 [中文 (简体)](i18n/zh-CN/FEATURES.md) | 🇩🇪 [Deutsch](i18n/de/FEATURES.md) | 🇮🇳 [हिन्दी](i18n/in/FEATURES.md) | 🇹🇭 [ไทย](i18n/th/FEATURES.md) | 🇺🇦 [Українська](i18n/uk-UA/FEATURES.md) | 🇸🇦 [العربية](i18n/ar/FEATURES.md) | 🇯🇵 [日本語](i18n/ja/FEATURES.md) | 🇻🇳 [Tiếng Việt](i18n/vi/FEATURES.md) | 🇧🇬 [Български](i18n/bg/FEATURES.md) | 🇩🇰 [Dansk](i18n/da/FEATURES.md) | 🇫🇮 [Suomi](i18n/fi/FEATURES.md) | 🇮🇱 [עברית](i18n/he/FEATURES.md) | 🇭🇺 [Magyar](i18n/hu/FEATURES.md) | 🇮🇩 [Bahasa Indonesia](i18n/id/FEATURES.md) | 🇰🇷 [한국어](i18n/ko/FEATURES.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/FEATURES.md) | 🇳🇱 [Nederlands](i18n/nl/FEATURES.md) | 🇳🇴 [Norsk](i18n/no/FEATURES.md) | 🇵🇹 [Português (Portugal)](i18n/pt/FEATURES.md) | 🇷🇴 [Română](i18n/ro/FEATURES.md) | 🇵🇱 [Polski](i18n/pl/FEATURES.md) | 🇸🇰 [Slovenčina](i18n/sk/FEATURES.md) | 🇸🇪 [Svenska](i18n/sv/FEATURES.md) | 🇵🇭 [Filipino](i18n/phi/FEATURES.md) | 🇨🇿 [Čeština](i18n/cs/FEATURES.md) Visual guide to every section of the OmniRoute dashboard. diff --git a/docs/TROUBLESHOOTING.md b/docs/TROUBLESHOOTING.md index 120092d6..5596b897 100644 --- a/docs/TROUBLESHOOTING.md +++ b/docs/TROUBLESHOOTING.md @@ -1,6 +1,6 @@ # Troubleshooting -🌐 **Languages:** 🇺🇸 [English](TROUBLESHOOTING.md) | 🇧🇷 [Português (Brasil)](i18n/pt-BR/TROUBLESHOOTING.md) | 🇪🇸 [Español](i18n/es/TROUBLESHOOTING.md) | 🇫🇷 [Français](i18n/fr/TROUBLESHOOTING.md) | 🇮🇹 [Italiano](i18n/it/TROUBLESHOOTING.md) | 🇷🇺 [Русский](i18n/ru/TROUBLESHOOTING.md) | 🇨🇳 [中文 (简体)](i18n/zh-CN/TROUBLESHOOTING.md) | 🇩🇪 [Deutsch](i18n/de/TROUBLESHOOTING.md) | 🇮🇳 [हिन्दी](i18n/in/TROUBLESHOOTING.md) | 🇹🇭 [ไทย](i18n/th/TROUBLESHOOTING.md) | 🇺🇦 [Українська](i18n/uk-UA/TROUBLESHOOTING.md) | 🇸🇦 [العربية](i18n/ar/TROUBLESHOOTING.md) | 🇯🇵 [日本語](i18n/ja/TROUBLESHOOTING.md) | 🇻🇳 [Tiếng Việt](i18n/vi/TROUBLESHOOTING.md) | 🇧🇬 [Български](i18n/bg/TROUBLESHOOTING.md) | 🇩🇰 [Dansk](i18n/da/TROUBLESHOOTING.md) | 🇫🇮 [Suomi](i18n/fi/TROUBLESHOOTING.md) | 🇮🇱 [עברית](i18n/he/TROUBLESHOOTING.md) | 🇭🇺 [Magyar](i18n/hu/TROUBLESHOOTING.md) | 🇮🇩 [Bahasa Indonesia](i18n/id/TROUBLESHOOTING.md) | 🇰🇷 [한국어](i18n/ko/TROUBLESHOOTING.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/TROUBLESHOOTING.md) | 🇳🇱 [Nederlands](i18n/nl/TROUBLESHOOTING.md) | 🇳🇴 [Norsk](i18n/no/TROUBLESHOOTING.md) | 🇵🇹 [Português (Portugal)](i18n/pt/TROUBLESHOOTING.md) | 🇷🇴 [Română](i18n/ro/TROUBLESHOOTING.md) | 🇵🇱 [Polski](i18n/pl/TROUBLESHOOTING.md) | 🇸🇰 [Slovenčina](i18n/sk/TROUBLESHOOTING.md) | 🇸🇪 [Svenska](i18n/sv/TROUBLESHOOTING.md) | 🇵🇭 [Filipino](i18n/phi/TROUBLESHOOTING.md) +🌐 **Languages:** 🇺🇸 [English](TROUBLESHOOTING.md) | 🇧🇷 [Português (Brasil)](i18n/pt-BR/TROUBLESHOOTING.md) | 🇪🇸 [Español](i18n/es/TROUBLESHOOTING.md) | 🇫🇷 [Français](i18n/fr/TROUBLESHOOTING.md) | 🇮🇹 [Italiano](i18n/it/TROUBLESHOOTING.md) | 🇷🇺 [Русский](i18n/ru/TROUBLESHOOTING.md) | 🇨🇳 [中文 (简体)](i18n/zh-CN/TROUBLESHOOTING.md) | 🇩🇪 [Deutsch](i18n/de/TROUBLESHOOTING.md) | 🇮🇳 [हिन्दी](i18n/in/TROUBLESHOOTING.md) | 🇹🇭 [ไทย](i18n/th/TROUBLESHOOTING.md) | 🇺🇦 [Українська](i18n/uk-UA/TROUBLESHOOTING.md) | 🇸🇦 [العربية](i18n/ar/TROUBLESHOOTING.md) | 🇯🇵 [日本語](i18n/ja/TROUBLESHOOTING.md) | 🇻🇳 [Tiếng Việt](i18n/vi/TROUBLESHOOTING.md) | 🇧🇬 [Български](i18n/bg/TROUBLESHOOTING.md) | 🇩🇰 [Dansk](i18n/da/TROUBLESHOOTING.md) | 🇫🇮 [Suomi](i18n/fi/TROUBLESHOOTING.md) | 🇮🇱 [עברית](i18n/he/TROUBLESHOOTING.md) | 🇭🇺 [Magyar](i18n/hu/TROUBLESHOOTING.md) | 🇮🇩 [Bahasa Indonesia](i18n/id/TROUBLESHOOTING.md) | 🇰🇷 [한국어](i18n/ko/TROUBLESHOOTING.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/TROUBLESHOOTING.md) | 🇳🇱 [Nederlands](i18n/nl/TROUBLESHOOTING.md) | 🇳🇴 [Norsk](i18n/no/TROUBLESHOOTING.md) | 🇵🇹 [Português (Portugal)](i18n/pt/TROUBLESHOOTING.md) | 🇷🇴 [Română](i18n/ro/TROUBLESHOOTING.md) | 🇵🇱 [Polski](i18n/pl/TROUBLESHOOTING.md) | 🇸🇰 [Slovenčina](i18n/sk/TROUBLESHOOTING.md) | 🇸🇪 [Svenska](i18n/sv/TROUBLESHOOTING.md) | 🇵🇭 [Filipino](i18n/phi/TROUBLESHOOTING.md) | 🇨🇿 [Čeština](i18n/cs/TROUBLESHOOTING.md) Common problems and solutions for OmniRoute. diff --git a/docs/USER_GUIDE.md b/docs/USER_GUIDE.md index 5a043224..78d32a4e 100644 --- a/docs/USER_GUIDE.md +++ b/docs/USER_GUIDE.md @@ -1,6 +1,6 @@ # User Guide -🌐 **Languages:** 🇺🇸 [English](USER_GUIDE.md) | 🇧🇷 [Português (Brasil)](i18n/pt-BR/USER_GUIDE.md) | 🇪🇸 [Español](i18n/es/USER_GUIDE.md) | 🇫🇷 [Français](i18n/fr/USER_GUIDE.md) | 🇮🇹 [Italiano](i18n/it/USER_GUIDE.md) | 🇷🇺 [Русский](i18n/ru/USER_GUIDE.md) | 🇨🇳 [中文 (简体)](i18n/zh-CN/USER_GUIDE.md) | 🇩🇪 [Deutsch](i18n/de/USER_GUIDE.md) | 🇮🇳 [हिन्दी](i18n/in/USER_GUIDE.md) | 🇹🇭 [ไทย](i18n/th/USER_GUIDE.md) | 🇺🇦 [Українська](i18n/uk-UA/USER_GUIDE.md) | 🇸🇦 [العربية](i18n/ar/USER_GUIDE.md) | 🇯🇵 [日本語](i18n/ja/USER_GUIDE.md) | 🇻🇳 [Tiếng Việt](i18n/vi/USER_GUIDE.md) | 🇧🇬 [Български](i18n/bg/USER_GUIDE.md) | 🇩🇰 [Dansk](i18n/da/USER_GUIDE.md) | 🇫🇮 [Suomi](i18n/fi/USER_GUIDE.md) | 🇮🇱 [עברית](i18n/he/USER_GUIDE.md) | 🇭🇺 [Magyar](i18n/hu/USER_GUIDE.md) | 🇮🇩 [Bahasa Indonesia](i18n/id/USER_GUIDE.md) | 🇰🇷 [한국어](i18n/ko/USER_GUIDE.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/USER_GUIDE.md) | 🇳🇱 [Nederlands](i18n/nl/USER_GUIDE.md) | 🇳🇴 [Norsk](i18n/no/USER_GUIDE.md) | 🇵🇹 [Português (Portugal)](i18n/pt/USER_GUIDE.md) | 🇷🇴 [Română](i18n/ro/USER_GUIDE.md) | 🇵🇱 [Polski](i18n/pl/USER_GUIDE.md) | 🇸🇰 [Slovenčina](i18n/sk/USER_GUIDE.md) | 🇸🇪 [Svenska](i18n/sv/USER_GUIDE.md) | 🇵🇭 [Filipino](i18n/phi/USER_GUIDE.md) +🌐 **Languages:** 🇺🇸 [English](USER_GUIDE.md) | 🇧🇷 [Português (Brasil)](i18n/pt-BR/USER_GUIDE.md) | 🇪🇸 [Español](i18n/es/USER_GUIDE.md) | 🇫🇷 [Français](i18n/fr/USER_GUIDE.md) | 🇮🇹 [Italiano](i18n/it/USER_GUIDE.md) | 🇷🇺 [Русский](i18n/ru/USER_GUIDE.md) | 🇨🇳 [中文 (简体)](i18n/zh-CN/USER_GUIDE.md) | 🇩🇪 [Deutsch](i18n/de/USER_GUIDE.md) | 🇮🇳 [हिन्दी](i18n/in/USER_GUIDE.md) | 🇹🇭 [ไทย](i18n/th/USER_GUIDE.md) | 🇺🇦 [Українська](i18n/uk-UA/USER_GUIDE.md) | 🇸🇦 [العربية](i18n/ar/USER_GUIDE.md) | 🇯🇵 [日本語](i18n/ja/USER_GUIDE.md) | 🇻🇳 [Tiếng Việt](i18n/vi/USER_GUIDE.md) | 🇧🇬 [Български](i18n/bg/USER_GUIDE.md) | 🇩🇰 [Dansk](i18n/da/USER_GUIDE.md) | 🇫🇮 [Suomi](i18n/fi/USER_GUIDE.md) | 🇮🇱 [עברית](i18n/he/USER_GUIDE.md) | 🇭🇺 [Magyar](i18n/hu/USER_GUIDE.md) | 🇮🇩 [Bahasa Indonesia](i18n/id/USER_GUIDE.md) | 🇰🇷 [한국어](i18n/ko/USER_GUIDE.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/USER_GUIDE.md) | 🇳🇱 [Nederlands](i18n/nl/USER_GUIDE.md) | 🇳🇴 [Norsk](i18n/no/USER_GUIDE.md) | 🇵🇹 [Português (Portugal)](i18n/pt/USER_GUIDE.md) | 🇷🇴 [Română](i18n/ro/USER_GUIDE.md) | 🇵🇱 [Polski](i18n/pl/USER_GUIDE.md) | 🇸🇰 [Slovenčina](i18n/sk/USER_GUIDE.md) | 🇸🇪 [Svenska](i18n/sv/USER_GUIDE.md) | 🇵🇭 [Filipino](i18n/phi/USER_GUIDE.md) | 🇨🇿 [Čeština](i18n/cs/.md) Complete guide for configuring providers, creating combos, integrating CLI tools, and deploying OmniRoute. diff --git a/docs/VM_DEPLOYMENT_GUIDE.md b/docs/VM_DEPLOYMENT_GUIDE.md index a640fa11..34838c49 100644 --- a/docs/VM_DEPLOYMENT_GUIDE.md +++ b/docs/VM_DEPLOYMENT_GUIDE.md @@ -1,69 +1,69 @@ -# OmniRoute — Guia de Deploy em VM com Cloudflare +# OmniRoute — Deployment Guide on VM with Cloudflare -Guia completo para instalar e configurar o OmniRoute em uma VM (VPS) com domínio gerenciado via Cloudflare. +Complete guide to install and configure OmniRoute on a VM (VPS) with domain managed via Cloudflare. --- -## Pré-Requisitos +## Prerequisites -| Item | Mínimo | Recomendado | -| ----------- | ------------------------ | ---------------- | -| **CPU** | 1 vCPU | 2 vCPU | -| **RAM** | 1 GB | 2 GB | -| **Disco** | 10 GB SSD | 25 GB SSD | -| **SO** | Ubuntu 22.04 LTS | Ubuntu 24.04 LTS | -| **Domínio** | Registrado no Cloudflare | — | -| **Docker** | Docker Engine 24+ | Docker 27+ | +| Item | Minimum | Recommended | +| ---------- | ------------------------ | ---------------- | +| **CPU** | 1 vCPU | 2 vCPU | +| **RAM** | 1 GB | 2 GB | +| **Disk** | 10 GB SSD | 25 GB SSD | +| **OS** | Ubuntu 22.04 LTS | Ubuntu 24.04 LTS | +| **Domain** | Registered on Cloudflare | — | +| **Docker** | Docker Engine 24+ | Docker 27+ | -**Providers testados**: Akamai (Linode), DigitalOcean, Vultr, Hetzner, AWS Lightsail. +**Tested providers**: Akamai (Linode), DigitalOcean, Vultr, Hetzner, AWS Lightsail. --- -## 1. Configurar a VM +## 1. Configure the VM -### 1.1 Criar a instância +### 1.1 Create the instance -No seu provider de VPS preferido: +On your preferred VPS provider: -- Escolha Ubuntu 24.04 LTS -- Selecione o plano mínimo (1 vCPU / 1 GB RAM) -- Defina uma senha forte para root ou configure SSH key -- Anote o **IP público** (ex: `203.0.113.10`) +- Choose Ubuntu 24.04 LTS +- Select the minimum plan (1 vCPU / 1 GB RAM) +- Set a strong root password or configure SSH key +- Note the **public IP** (e.g., `203.0.113.10`) -### 1.2 Conectar via SSH +### 1.2 Connect via SSH ```bash ssh root@203.0.113.10 ``` -### 1.3 Atualizar o sistema +### 1.3 Update the system ```bash apt update && apt upgrade -y ``` -### 1.4 Instalar Docker +### 1.4 Install Docker ```bash -# Instalar dependências +# Install dependencies apt install -y ca-certificates curl gnupg -# Adicionar repositório oficial do Docker +# Add official Docker repository install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg chmod a+r /etc/apt/keyrings/docker.gpg -echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null +echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $ (. /etc/os-release && echo “$VERSION_CODENAME”) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null apt update apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin ``` -### 1.5 Instalar nginx +### 1.5 Install nginx ```bash apt install -y nginx ``` -### 1.6 Configurar Firewall (UFW) +### 1.6 Configure Firewall (UFW) ```bash ufw default deny incoming @@ -74,29 +74,29 @@ ufw allow 443/tcp # HTTPS ufw enable ``` -> **Dica**: Para segurança máxima, restrinja as portas 80 e 443 apenas para IPs da Cloudflare. Veja a seção [Segurança Avançada](#segurança-avançada). +> **Tip**: For maximum security, restrict ports 80 and 443 to Cloudflare IPs only. See the [Advanced Security](#advanced-security) section. --- -## 2. Instalar o OmniRoute +## 2. Install OmniRoute -### 2.1 Criar diretório de configuração +### 2.1 Create configuration directory ```bash mkdir -p /opt/omniroute ``` -### 2.2 Criar arquivo de variáveis de ambiente +### 2.2 Create environment variables file ```bash -cat > /opt/omniroute/.env << 'EOF' -# === Segurança === -JWT_SECRET=ALTERE-PARA-CHAVE-SECRETA-UNICA-64-CHARS -INITIAL_PASSWORD=SuaSenhaSegura123! -API_KEY_SECRET=ALTERE-PARA-OUTRA-CHAVE-SECRETA -STORAGE_ENCRYPTION_KEY=ALTERE-PARA-TERCEIRA-CHAVE-SECRETA +cat > /opt/omniroute/.env << ‘EOF’ +# === Security === +JWT_SECRET=CHANGE-TO-A-UNIQUE-64-CHAR-SECRET-KEY +INITIAL_PASSWORD=YourSecurePassword123! +API_KEY_SECRET=REPLACE-WITH-ANOTHER-SECRET-KEY +STORAGE_ENCRYPTION_KEY=REPLACE-WITH-THIRD-SECRET-KEY STORAGE_ENCRYPTION_KEY_VERSION=v1 -MACHINE_ID_SALT=ALTERE-PARA-SALT-UNICO +MACHINE_ID_SALT=CHANGE-TO-A-UNIQUE-SALT # === App === PORT=20128 @@ -108,19 +108,19 @@ ENABLE_REQUEST_LOGS=true AUTH_COOKIE_SECURE=false REQUIRE_API_KEY=false -# === Domain (altere para seu domínio) === +# === Domain (change to your domain) === BASE_URL=https://llms.seudominio.com NEXT_PUBLIC_BASE_URL=https://llms.seudominio.com -# === Cloud Sync (opcional) === +# === Cloud Sync (optional) === # CLOUD_URL=https://cloud.omniroute.online # NEXT_PUBLIC_CLOUD_URL=https://cloud.omniroute.online EOF ``` -> ⚠️ **IMPORTANTE**: Gere chaves secretas únicas! Use `openssl rand -hex 32` para cada chave. +> ⚠️ **IMPORTANT**: Generate unique secret keys! Use `openssl rand -hex 32` for each key. -### 2.3 Iniciar o container +### 2.3 Start the container ```bash docker pull diegosouzapw/omniroute:latest @@ -134,45 +134,45 @@ docker run -d \ diegosouzapw/omniroute:latest ``` -### 2.4 Verificar se está rodando +### 2.4 Verify that it is running ```bash docker ps | grep omniroute docker logs omniroute --tail 20 ``` -Deve exibir: `[DB] SQLite database ready` e `listening on port 20128`. +It should display: `[DB] SQLite database ready` and `listening on port 20128`. --- -## 3. Configurar nginx (Reverse Proxy) +## 3. Configure nginx (Reverse Proxy) -### 3.1 Gerar certificado SSL (Cloudflare Origin) +### 3.1 Generate SSL certificate (Cloudflare Origin) -No painel da Cloudflare: +In the Cloudflare dashboard: -1. Vá em **SSL/TLS → Origin Server** -2. Clique **Create Certificate** -3. Deixe os padrões (15 anos, \*.seudominio.com) -4. Copie o **Origin Certificate** e a **Private Key** +1. Go to **SSL/TLS → Origin Server** +2. Click **Create Certificate** +3. Keep the defaults (15 years, \*.yourdomain.com) +4. Copy the **Origin Certificate** and the **Private Key** ```bash mkdir -p /etc/nginx/ssl -# Colar o certificado +# Paste the certificate nano /etc/nginx/ssl/origin.crt -# Colar a chave privada +# Paste the private key nano /etc/nginx/ssl/origin.key chmod 600 /etc/nginx/ssl/origin.key ``` -### 3.2 Configuração do nginx +### 3.2 Nginx Configuration ```bash -cat > /etc/nginx/sites-available/omniroute << 'NGINX' -# Default server — bloqueia acesso direto por IP +cat > /etc/nginx/sites-available/omniroute << ‘NGINX’ +# Default server — blocks direct access via IP server { listen 80 default_server; listen [::]:80 default_server; @@ -188,7 +188,7 @@ server { server { listen 443 ssl; listen [::]:443 ssl; - server_name llms.seudominio.com; # Altere para seu domínio + server_name llms.yourdomain.com; # Change to your domain ssl_certificate /etc/nginx/ssl/origin.crt; ssl_certificate_key /etc/nginx/ssl/origin.key; @@ -206,7 +206,7 @@ server { # WebSocket support proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; + proxy_set_header Connection “upgrade”; # SSE (Server-Sent Events) — streaming AI responses proxy_buffering off; @@ -220,61 +220,61 @@ server { server { listen 80; listen [::]:80; - server_name llms.seudominio.com; + server_name llms.yourdomain.com; return 301 https://$server_name$request_uri; } NGINX ``` -### 3.3 Ativar e testar +### 3.3 Enable and Test ```bash -# Remover config padrão +# Remove default configuration rm -f /etc/nginx/sites-enabled/default -# Ativar OmniRoute +# Enable OmniRoute ln -sf /etc/nginx/sites-available/omniroute /etc/nginx/sites-enabled/omniroute -# Testar e recarregar +# Test and reload nginx -t && systemctl reload nginx ``` --- -## 4. Configurar Cloudflare DNS +## 4. Configure Cloudflare DNS -### 4.1 Adicionar registro DNS +### 4.1 Add DNS record -No painel da Cloudflare → DNS: +In the Cloudflare dashboard → DNS: -| Type | Name | Content | Proxy | -| ---- | ------ | ------------------------- | ---------- | -| A | `llms` | `203.0.113.10` (IP da VM) | ✅ Proxied | +| Type | Name | Content | Proxy | +| ---- | ------ | ---------------------- | ---------- | +| A | `llms` | `203.0.113.10` (VM IP) | ✅ Proxied | -### 4.2 Configurar SSL +### 4.2 Configure SSL -Em **SSL/TLS → Overview**: +Under **SSL/TLS → Overview**: -- Modo: **Full (Strict)** +- Mode: **Full (Strict)** -Em **SSL/TLS → Edge Certificates**: +Under **SSL/TLS → Edge Certificates**: - Always Use HTTPS: ✅ On - Minimum TLS Version: TLS 1.2 - Automatic HTTPS Rewrites: ✅ On -### 4.3 Testar +### 4.3 Testing ```bash curl -sI https://llms.seudominio.com/health -# Deve retornar HTTP/2 200 +# Should return HTTP/2 200 ``` --- -## 5. Operações e Manutenção +## 5. Operations and Maintenance -### Atualizar para nova versão +### Upgrade to a new version ```bash docker pull diegosouzapw/omniroute:latest @@ -286,42 +286,42 @@ docker run -d --name omniroute --restart unless-stopped \ diegosouzapw/omniroute:latest ``` -### Ver logs +### View logs ```bash -docker logs -f omniroute # Stream em tempo real -docker logs omniroute --tail 50 # Últimas 50 linhas +docker logs -f omniroute # Real-time stream +docker logs omniroute --tail 50 # Last 50 lines ``` -### Backup manual do banco +### Manual database backup ```bash -# Copiar dados do volume para o host +# Copy data from the volume to the host docker cp omniroute:/app/data ./backup-$(date +%F) -# Ou comprimir todo o volume +# Or compress the entire volume docker run --rm -v omniroute-data:/data -v $(pwd):/backup \ alpine tar czf /backup/omniroute-data-$(date +%F).tar.gz /data ``` -### Restaurar de backup +### Restore from backup ```bash docker stop omniroute docker run --rm -v omniroute-data:/data -v $(pwd):/backup \ - alpine sh -c "rm -rf /data/* && tar xzf /backup/omniroute-data-YYYY-MM-DD.tar.gz -C /" + alpine sh -c “rm -rf /data/* && tar xzf /backup/omniroute-data-YYYY-MM-DD.tar.gz -C /” docker start omniroute ``` --- -## 6. Segurança Avançada +## 6. Advanced Security -### Restringir nginx para Cloudflare IPs +### Restrict nginx to Cloudflare IPs ```bash -cat > /etc/nginx/cloudflare-ips.conf << 'CF' -# Cloudflare IPv4 ranges — atualizar periodicamente +cat > /etc/nginx/cloudflare-ips.conf << ‘CF’ +# Cloudflare IPv4 ranges — update periodically # https://www.cloudflare.com/ips-v4/ set_real_ip_from 173.245.48.0/20; set_real_ip_from 103.21.244.0/22; @@ -342,7 +342,7 @@ real_ip_header CF-Connecting-IP; CF ``` -Adicionar no `nginx.conf` dentro do bloco `http {}`: +Add the following to `nginx.conf` inside the `http {}` block: ```nginx include /etc/nginx/cloudflare-ips.conf; @@ -355,45 +355,45 @@ apt install -y fail2ban systemctl enable fail2ban systemctl start fail2ban -# Verificar status +# Check status fail2ban-client status sshd ``` -### Bloquear acesso direto na porta do Docker +### Block direct access to the Docker port ```bash -# Impedir acesso externo direto à porta 20128 +# Prevent direct external access to port 20128 iptables -I DOCKER-USER -p tcp --dport 20128 -j DROP iptables -I DOCKER-USER -i lo -p tcp --dport 20128 -j ACCEPT -# Persistir as regras +# Persist the rules apt install -y iptables-persistent netfilter-persistent save ``` --- -## 7. Deploy do Cloud Worker (Opcional) +## 7. Deploy to Cloudflare Workers (Optional) -Para acesso remoto via Cloudflare Workers (sem expor a VM diretamente): +For remote access via Cloudflare Workers (without exposing the VM directly): ```bash -# No repositório local +# In the local repository cd omnirouteCloud npm install npx wrangler login npx wrangler deploy ``` -Ver documentação completa em [omnirouteCloud/README.md](../omnirouteCloud/README.md). +See the full documentation at [omnirouteCloud/README.md](../omnirouteCloud/README.md). --- -## Resumo de Portas +## Port Summary -| Porta | Serviço | Acesso | -| ----- | ----------- | ----------------------------- | -| 22 | SSH | Público (com fail2ban) | -| 80 | nginx HTTP | Redirect → HTTPS | -| 443 | nginx HTTPS | Via Cloudflare Proxy | -| 20128 | OmniRoute | Somente localhost (via nginx) | +| Port | Service | Access | +| ----- | ----------- | -------------------------- | +| 22 | SSH | Public (with fail2ban) | +| 80 | nginx HTTP | Redirect → HTTPS | +| 443 | nginx HTTPS | Via Cloudflare Proxy | +| 20128 | OmniRoute | Localhost only (via nginx) | diff --git a/docs/i18n/cs/A2A-SERVER.md b/docs/i18n/cs/A2A-SERVER.md new file mode 100644 index 00000000..eeea4337 --- /dev/null +++ b/docs/i18n/cs/A2A-SERVER.md @@ -0,0 +1,196 @@ +# Dokumentace k serveru OmniRoute A2A + +> Protokol Agent-to-Agent v0.3 — OmniRoute jako inteligentní směrovací agent + +## Objevování agentů + +```bash +curl http://localhost:20128/.well-known/agent.json +``` + +Vrátí kartu agenta popisující schopnosti, dovednosti a požadavky na ověřování OmniRoute. + +--- + +## Ověřování + +Všechny požadavky `/a2a` vyžadují klíč API zadaný prostřednictvím hlavičky `Authorization` : + +``` +Authorization: Bearer YOUR_OMNIROUTE_API_KEY +``` + +Pokud na serveru není nakonfigurován žádný klíč API, ověřování se obejde. + +--- + +## Metody JSON-RPC 2.0 + +### `message/send` — synchronní spuštění + +Odešle zprávu dovednosti a čeká na úplnou odpověď. + +```bash +curl -X POST http://localhost:20128/a2a \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer YOUR_KEY" \ + -d '{ + "jsonrpc": "2.0", + "id": "1", + "method": "message/send", + "params": { + "skill": "smart-routing", + "messages": [{"role": "user", "content": "Write a hello world in Python"}], + "metadata": {"model": "auto", "combo": "fast-coding"} + } + }' +``` + +**Odpověď:** + +```json +{ + "jsonrpc": "2.0", + "id": "1", + "result": { + "task": { "id": "uuid", "state": "completed" }, + "artifacts": [{ "type": "text", "content": "..." }], + "metadata": { + "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.003)", + "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, + "resilience_trace": [ + { "event": "primary_selected", "provider": "anthropic", "timestamp": "..." } + ], + "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } + } + } +} +``` + +### `message/stream` — SSE streamování + +Stejné jako `message/send` , ale vrací události odeslané serverem pro streamování v reálném čase. + +```bash +curl -N -X POST http://localhost:20128/a2a \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer YOUR_KEY" \ + -d '{ + "jsonrpc": "2.0", + "id": "1", + "method": "message/stream", + "params": { + "skill": "smart-routing", + "messages": [{"role": "user", "content": "Explain quantum computing"}] + } + }' +``` + +**Události SSE:** + +``` +data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"..."}}} + +: heartbeat 2026-03-03T17:00:00Z + +data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} +``` + +### `tasks/get` — Dotaz na stav úlohy + +```bash +curl -X POST http://localhost:20128/a2a \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer YOUR_KEY" \ + -d '{"jsonrpc":"2.0","id":"2","method":"tasks/get","params":{"taskId":"TASK_UUID"}}' +``` + +### `tasks/cancel` — Zrušit úkol + +```bash +curl -X POST http://localhost:20128/a2a \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer YOUR_KEY" \ + -d '{"jsonrpc":"2.0","id":"3","method":"tasks/cancel","params":{"taskId":"TASK_UUID"}}' +``` + +--- + +## Dostupné dovednosti + +Dovednost | Popis +:-- | :-- +`smart-routing` | Směruje výzvy prostřednictvím inteligentního kanálu OmniRoute. Vrací odpověď s vysvětlením směrování, náklady a trasou odolnosti. +`quota-management` | Odpovídá na dotazy v přirozeném jazyce týkající se kvót poskytovatelů, navrhuje bezplatné kombinace a poskytuje hodnocení kvót. + +--- + +## Životní cyklus úkolu + +``` +submitted → working → completed + → failed + → cancelled +``` + +- Úkoly vyprší po 5 minutách (konfigurovatelné) +- Stavy terminálu: `completed` , `failed` , `cancelled` +- Záznam událostí sleduje každý přechod stavu + +--- + +## Chybové kódy + +Kód | Význam +:-- | :-- +-32700 | Chyba při analýze (neplatný JSON) +-32600 | Neplatný požadavek / Neautorizovaný +-32601 | Metoda nebo dovednost nenalezena +-32602 | Neplatné parametry +-32603 | Interní chyba + +--- + +## Příklady integrace + +### Python (požadavky) + +```python +import requests + +resp = requests.post("http://localhost:20128/a2a", json={ + "jsonrpc": "2.0", "id": "1", + "method": "message/send", + "params": { + "skill": "smart-routing", + "messages": [{"role": "user", "content": "Hello"}] + } +}, headers={"Authorization": "Bearer YOUR_KEY"}) + +result = resp.json()["result"] +print(result["artifacts"][0]["content"]) +print(result["metadata"]["routing_explanation"]) +``` + +### TypeScript (načtení) + +```typescript +const resp = await fetch("http://localhost:20128/a2a", { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: "Bearer YOUR_KEY", + }, + body: JSON.stringify({ + jsonrpc: "2.0", + id: "1", + method: "message/send", + params: { + skill: "smart-routing", + messages: [{ role: "user", content: "Hello" }], + }, + }), +}); +const { result } = await resp.json(); +console.log(result.metadata.routing_explanation); +``` diff --git a/docs/i18n/cs/API_REFERENCE.md b/docs/i18n/cs/API_REFERENCE.md new file mode 100644 index 00000000..02357b14 --- /dev/null +++ b/docs/i18n/cs/API_REFERENCE.md @@ -0,0 +1,451 @@ +# Referenční informace k API + +🌐 **Jazyky:** 🇺🇸 [angličtina](API_REFERENCE.md) | 🇧🇷 [Português (Brazílie)](i18n/pt-BR/API_REFERENCE.md) | 🇪🇸 [Español](i18n/es/API_REFERENCE.md) | 🇫🇷 [Français](i18n/fr/API_REFERENCE.md) | 🇮🇹 [Italiano](i18n/it/API_REFERENCE.md) | 🇷🇺 [Русский](i18n/ru/API_REFERENCE.md) | 🇨🇳[中文 (简体)](i18n/zh-CN/API_REFERENCE.md) | 🇩🇪 [Deutsch](i18n/de/API_REFERENCE.md) | 🇮🇳 [हिन्दी](i18n/in/API_REFERENCE.md) | 🇹🇭 [ไทย](i18n/th/API_REFERENCE.md) | 🇺🇦 [Українська](i18n/uk-UA/API_REFERENCE.md) | 🇸🇦 [العربية](i18n/ar/API_REFERENCE.md) | 🇯🇵[日本語](i18n/ja/API_REFERENCE.md)| 🇻🇳 [Tiếng Việt](i18n/vi/API_REFERENCE.md) | 🇧🇬 [Български](i18n/bg/API_REFERENCE.md) | 🇩🇰 [Dánsko](i18n/da/API_REFERENCE.md) | 🇫🇮 [Suomi](i18n/fi/API_REFERENCE.md) | 🇮🇱 [עברית](i18n/he/API_REFERENCE.md) | 🇭🇺 [maďarština](i18n/hu/API_REFERENCE.md) | 🇮🇩 [Bahasa Indonésie](i18n/id/API_REFERENCE.md) | 🇰🇷 [한국어](i18n/ko/API_REFERENCE.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/API_REFERENCE.md) | 🇳🇱 [Nizozemsko](i18n/nl/API_REFERENCE.md) | 🇳🇴 [Norsk](i18n/no/API_REFERENCE.md) | 🇵🇹 [Português (Portugalsko)](i18n/pt/API_REFERENCE.md) | 🇷🇴 [Română](i18n/ro/API_REFERENCE.md) | 🇵🇱 [Polski](i18n/pl/API_REFERENCE.md) | 🇸🇰 [Slovenčina](i18n/sk/API_REFERENCE.md) | 🇸🇪 [Svenska](i18n/sv/API_REFERENCE.md) | 🇵🇭 [Filipínec](i18n/phi/API_REFERENCE.md) | 🇨🇿 [Čeština](i18n/cs/API_REFERENCE.md) + +Kompletní referenční příručka pro všechny koncové body rozhraní OmniRoute API. + +--- + +## Obsah + +- [Dokončení chatu](#chat-completions) +- [Vložení](#embeddings) +- [Generování obrázků](#image-generation) +- [Seznam modelů](#list-models) +- [Koncové body kompatibility](#compatibility-endpoints) +- [Sémantická mezipaměť](#semantic-cache) +- [Řídicí panel a správa](#dashboard--management) +- [Zpracování žádosti](#request-processing) +- [Ověřování](#authentication) + +--- + +## Dokončení chatu + +```bash +POST /v1/chat/completions +Authorization: Bearer your-api-key +Content-Type: application/json + +{ + "model": "cc/claude-opus-4-6", + "messages": [ + {"role": "user", "content": "Write a function to..."} + ], + "stream": true +} +``` + +### Vlastní záhlaví + +Záhlaví | Směr | Popis +--- | --- | --- +`X-OmniRoute-No-Cache` | Žádost | Nastavením na `true` se vynechá mezipaměť +`X-OmniRoute-Progress` | Žádost | Nastaveno na `true` pro události průběhu +`Idempotency-Key` | Žádost | Klíč pro deduplikaci (okno 5 s) +`X-Request-Id` | Žádost | Alternativní klíč pro odstranění duplicitních dat +`X-OmniRoute-Cache` | Odpověď | `HIT` or `MISS` (nestreamované) +`X-OmniRoute-Idempotent` | Odpověď | `true` , pokud je odstraněna duplikace +`X-OmniRoute-Progress` | Odpověď | `enabled` pokud je zapnuto sledování průběhu + +--- + +## Vložení + +```bash +POST /v1/embeddings +Authorization: Bearer your-api-key +Content-Type: application/json + +{ + "model": "nebius/Qwen/Qwen3-Embedding-8B", + "input": "The food was delicious" +} +``` + +Dostupní poskytovatelé: Nebius, OpenAI, Mistral, Together AI, Fireworks, NVIDIA. + +```bash +# List all embedding models +GET /v1/embeddings +``` + +--- + +## Generování obrázků + +```bash +POST /v1/images/generations +Authorization: Bearer your-api-key +Content-Type: application/json + +{ + "model": "openai/dall-e-3", + "prompt": "A beautiful sunset over mountains", + "size": "1024x1024" +} +``` + +Dostupní poskytovatelé: OpenAI (DALL-E), xAI (Grok Image), Together AI (FLUX), Fireworks AI. + +```bash +# List all image models +GET /v1/images/generations +``` + +--- + +## Seznam modelů + +```bash +GET /v1/models +Authorization: Bearer your-api-key + +→ Returns all chat, embedding, and image models + combos in OpenAI format +``` + +--- + +## Koncové body kompatibility + +Metoda | Cesta | Formát +--- | --- | --- +ZVEŘEJNIT | `/v1/chat/completions` | OpenAI +ZVEŘEJNIT | `/v1/messages` | Antropický +ZVEŘEJNIT | `/v1/responses` | Reakce OpenAI +ZVEŘEJNIT | `/v1/embeddings` | OpenAI +ZVEŘEJNIT | `/v1/images/generations` | OpenAI +ZÍSKAT | `/v1/models` | OpenAI +ZVEŘEJNIT | `/v1/messages/count_tokens` | Antropický +ZÍSKAT | `/v1beta/models` | Blíženci +ZVEŘEJNIT | `/v1beta/models/{...path}` | Gemini generuje obsah +ZVEŘEJNIT | `/v1/api/chat` | Ollama + +### Vyhrazené trasy poskytovatelů + +```bash +POST /v1/providers/{provider}/chat/completions +POST /v1/providers/{provider}/embeddings +POST /v1/providers/{provider}/images/generations +``` + +Pokud chybí prefix poskytovatele, automaticky se přidá. Neshodné modely vrátí chybu `400` . + +--- + +## Sémantická mezipaměť + +```bash +# Get cache stats +GET /api/cache + +# Clear all caches +DELETE /api/cache +``` + +Příklad odpovědi: + +```json +{ + "semanticCache": { + "memorySize": 42, + "memoryMaxSize": 500, + "dbSize": 128, + "hitRate": 0.65 + }, + "idempotency": { + "activeKeys": 3, + "windowMs": 5000 + } +} +``` + +--- + +## Řídicí panel a správa + +### Ověřování + +Koncový bod | Metoda | Popis +--- | --- | --- +`/api/auth/login` | ZVEŘEJNIT | Přihlášení +`/api/auth/logout` | ZVEŘEJNIT | Odhlásit se +`/api/settings/require-login` | ZÍSKAT/VLOŽIT | Vyžaduje se přepnutí přihlášení + +### Správa poskytovatelů + +Koncový bod | Metoda | Popis +--- | --- | --- +`/api/providers` | ZÍSKAT/ODESLAT | Seznam / vytvoření poskytovatelů +`/api/providers/[id]` | ZÍSKAT/VLOŽIT/ODSTRANIT | Správa poskytovatele +`/api/providers/[id]/test` | ZVEŘEJNIT | Testovací připojení poskytovatele +`/api/providers/[id]/models` | ZÍSKAT | Seznam modelů poskytovatelů +`/api/providers/validate` | ZVEŘEJNIT | Ověření konfigurace poskytovatele +`/api/provider-nodes*` | Různé | Správa uzlů poskytovatelů +`/api/provider-models` | ZÍSKAT/ODESLAT/SMAZAT | Vlastní modely + +### Toky OAuth + +Koncový bod | Metoda | Popis +--- | --- | --- +`/api/oauth/[provider]/[action]` | Různé | OAuth specifický pro poskytovatele + +### Směrování a konfigurace + +Koncový bod | Metoda | Popis +--- | --- | --- +`/api/models/alias` | ZÍSKAT/ODESLAT | Aliasy modelů +`/api/models/catalog` | ZÍSKAT | Všechny modely podle poskytovatele + typu +`/api/combos*` | Různé | Správa kombinací +`/api/keys*` | Různé | Správa klíčů API +`/api/pricing` | ZÍSKAT | Cena modelu + +### Využití a analýzy + +Koncový bod | Metoda | Popis +--- | --- | --- +`/api/usage/history` | ZÍSKAT | Historie používání +`/api/usage/logs` | ZÍSKAT | Protokoly používání +`/api/usage/request-logs` | ZÍSKAT | Protokoly na úrovni požadavků +`/api/usage/[connectionId]` | ZÍSKAT | Využití na připojení + +### Nastavení + +Koncový bod | Metoda | Popis +--- | --- | --- +`/api/settings` | ZÍSKAT/VLOŽIT | Obecná nastavení +`/api/settings/proxy` | ZÍSKAT/VLOŽIT | Konfigurace síťového proxy serveru +`/api/settings/proxy/test` | ZVEŘEJNIT | Testovací připojení k proxy serveru +`/api/settings/ip-filter` | ZÍSKAT/VLOŽIT | Seznam povolených/blokovaných IP adres +`/api/settings/thinking-budget` | ZÍSKAT/VLOŽIT | Zdůvodnění rozpočtu tokenů +`/api/settings/system-prompt` | ZÍSKAT/VLOŽIT | Globální systémový výzva + +### Monitorování + +Koncový bod | Metoda | Popis +--- | --- | --- +`/api/sessions` | ZÍSKAT | Sledování aktivních relací +`/api/rate-limits` | ZÍSKAT | Limity sazeb na účet +`/api/monitoring/health` | ZÍSKAT | Kontrola stavu +`/api/cache` | ZÍSKAT/SMAZAT | Statistiky mezipaměti / vymazat + +### Zálohování a export/import + +Koncový bod | Metoda | Popis +--- | --- | --- +`/api/db-backups` | ZÍSKAT | Seznam dostupných záloh +`/api/db-backups` | DÁT | Vytvořte ruční zálohu +`/api/db-backups` | ZVEŘEJNIT | Obnovení z konkrétní zálohy +`/api/db-backups/export` | ZÍSKAT | Stáhnout databázi jako soubor .sqlite +`/api/db-backups/import` | ZVEŘEJNIT | Nahrajte soubor .sqlite pro nahrazení databáze +`/api/db-backups/exportAll` | ZÍSKAT | Stáhnout plnou zálohu jako archiv .tar.gz + +### Synchronizace s cloudem + +Koncový bod | Metoda | Popis +--- | --- | --- +`/api/sync/cloud` | Různé | Operace synchronizace s cloudem +`/api/sync/initialize` | ZVEŘEJNIT | Inicializovat synchronizaci +`/api/cloud/*` | Různé | Správa cloudu + +### Nástroje CLI + +Koncový bod | Metoda | Popis +--- | --- | --- +`/api/cli-tools/claude-settings` | ZÍSKAT | Stav Clauda CLI +`/api/cli-tools/codex-settings` | ZÍSKAT | Stav příkazového řádku Codexu +`/api/cli-tools/droid-settings` | ZÍSKAT | Stav příkazového řádku Droidu +`/api/cli-tools/openclaw-settings` | ZÍSKAT | Stav rozhraní příkazového řádku OpenClaw +`/api/cli-tools/runtime/[toolId]` | ZÍSKAT | Generické běhové prostředí CLI + +Mezi odpovědi CLI patří: `installed` , `runnable` , `command` , `commandPath` , `runtimeMode` , `reason` . + +### Agenti ACP + +Koncový bod | Metoda | Popis +--- | --- | --- +`/api/acp/agents` | ZÍSKAT | Zobrazit seznam všech detekovaných agentů (vestavěných + vlastních) se stavem +`/api/acp/agents` | ZVEŘEJNIT | Přidat vlastního agenta nebo obnovit mezipaměť detekce +`/api/acp/agents` | VYMAZAT | Odebrání vlastního agenta podle parametru dotazu `id` + +Odpověď GET obsahuje `agents[]` (id, name, binary, version, installed, protocol, isCustom) a `summary` (total, installed, notFound, builtIn, custom). + +### Odolnost a limity rychlosti + +Koncový bod | Metoda | Popis +--- | --- | --- +`/api/resilience` | ZÍSKAT/VLOŽIT | Získání/aktualizace profilů odolnosti +`/api/resilience/reset` | ZVEŘEJNIT | Resetujte jističe +`/api/rate-limits` | ZÍSKAT | Stav limitu sazby na účet +`/api/rate-limit` | ZÍSKAT | Konfigurace globálního limitu rychlosti + +### Evals + +Koncový bod | Metoda | Popis +--- | --- | --- +`/api/evals` | ZÍSKAT/ODESLAT | Vypsat eval sady / spustit vyhodnocení + +### Zásady + +Koncový bod | Metoda | Popis +--- | --- | --- +`/api/policies` | ZÍSKAT/ODESLAT/SMAZAT | Správa směrovacích zásad + +### Dodržování + +Koncový bod | Metoda | Popis +--- | --- | --- +`/api/compliance/audit-log` | ZÍSKAT | Protokol auditu shody (poslední N) + +### v1beta (kompatibilní s Gemini) + +Koncový bod | Metoda | Popis +--- | --- | --- +`/v1beta/models` | ZÍSKAT | Seznam modelů ve formátu Gemini +`/v1beta/models/{...path}` | ZVEŘEJNIT | Koncový bod Gemini `generateContent` + +Tyto koncové body zrcadlí formát API Gemini pro klienty, kteří očekávají nativní kompatibilitu sady Gemini SDK. + +### Interní / systémová API + +Koncový bod | Metoda | Popis +--- | --- | --- +`/api/init` | ZÍSKAT | Kontrola inicializace aplikace (používá se při prvním spuštění) +`/api/tags` | ZÍSKAT | Tagy modelů kompatibilní s Ollamou (pro klienty Ollamy) +`/api/restart` | ZVEŘEJNIT | Spustit řádný restart serveru +`/api/shutdown` | ZVEŘEJNIT | Spustit řádné vypnutí serveru + +> **Poznámka:** Tyto koncové body používá interně systém nebo pro kompatibilitu s klienty Ollama. Koncoví uživatelé je obvykle nevolají. + +--- + +## Přepis zvuku + +```bash +POST /v1/audio/transcriptions +Authorization: Bearer your-api-key +Content-Type: multipart/form-data +``` + +Přepisujte zvukové soubory pomocí Deepgramu nebo AssemblyAI. + +**Žádost:** + +```bash +curl -X POST http://localhost:20128/v1/audio/transcriptions \ + -H "Authorization: Bearer your-api-key" \ + -F "file=@recording.mp3" \ + -F "model=deepgram/nova-3" +``` + +**Odpověď:** + +```json +{ + "text": "Hello, this is the transcribed audio content.", + "task": "transcribe", + "language": "en", + "duration": 12.5 +} +``` + +**Podporovaní poskytovatelé:** `deepgram/nova-3` , `assemblyai/best` . + +**Podporované formáty:** `mp3` , `wav` , `m4a` , `flac` , `ogg` , `webm` . + +--- + +## Kompatibilita s Ollamou + +Pro klienty, kteří používají formát API od Ollamy: + +```bash +# Chat endpoint (Ollama format) +POST /v1/api/chat + +# Model listing (Ollama format) +GET /api/tags +``` + +Požadavky jsou automaticky překládány mezi formátem Ollama a interním formátem. + +--- + +## Telemetrie + +```bash +# Get latency telemetry summary (p50/p95/p99 per provider) +GET /api/telemetry/summary +``` + +**Odpověď:** + +```json +{ + "providers": { + "claudeCode": { "p50": 245, "p95": 890, "p99": 1200, "count": 150 }, + "github": { "p50": 180, "p95": 620, "p99": 950, "count": 320 } + } +} +``` + +--- + +## Rozpočet + +```bash +# Get budget status for all API keys +GET /api/usage/budget + +# Set or update a budget +POST /api/usage/budget +Content-Type: application/json + +{ + "keyId": "key-123", + "limit": 50.00, + "period": "monthly" +} +``` + +--- + +## Dostupnost modelu + +```bash +# Get real-time model availability across all providers +GET /api/models/availability + +# Check availability for a specific model +POST /api/models/availability +Content-Type: application/json + +{ + "model": "claude-sonnet-4-5-20250929" +} +``` + +--- + +## Zpracování žádosti + +1. Klient odesílá požadavek na `/v1/*` +2. Obslužná rutina trasy volá `handleChat` , `handleEmbedding` , `handleAudioTranscription` nebo `handleImageGeneration` +3. Model je vyřešen (přímý poskytovatel/model nebo alias/kombinace) +4. Přihlašovací údaje vybrané z lokální databáze s filtrováním dostupnosti účtů +5. Pro chat: `handleChatCore` — detekce formátu, překlad, kontrola mezipaměti, kontrola idempotence +6. Prováděcí program poskytovatele odesílá požadavek nadřazenému serveru +7. Odpověď přeložena zpět do klientského formátu (chat) nebo vrácena tak, jak je (vložené prvky/obrázky/zvuk) +8. Zaznamenáno použití/protokolování +9. Záložní metoda se použije na chyby podle pravidel kombinace. + +Úplný referenční popis architektury: [`ARCHITECTURE.md`](ARCHITECTURE.md) + +--- + +## Ověřování + +- Trasy dashboardu ( `/dashboard/*` ) používají soubor cookie `auth_token` +- Přihlášení používá uložený hash hesla; záložní nastavení je `INITIAL_PASSWORD` +- `requireLogin` lze přepínat přes `/api/settings/require-login` +- Trasy `/v1/*` volitelně vyžadují klíč API nosiče, pokud `REQUIRE_API_KEY=true` diff --git a/docs/i18n/cs/ARCHITECTURE.md b/docs/i18n/cs/ARCHITECTURE.md new file mode 100644 index 00000000..f5278804 --- /dev/null +++ b/docs/i18n/cs/ARCHITECTURE.md @@ -0,0 +1,782 @@ +# Architektura OmniRoute + +🌐 **Jazyky:** 🇺🇸 [angličtina](ARCHITECTURE.md) | 🇧🇷 [Português (Brazílie)](i18n/pt-BR/ARCHITECTURE.md) | 🇪🇸 [Español](i18n/es/ARCHITECTURE.md) | 🇫🇷 [Français](i18n/fr/ARCHITECTURE.md) | 🇮🇹 [Italiano](i18n/it/ARCHITECTURE.md) | 🇷🇺 [Русский](i18n/ru/ARCHITECTURE.md) | 🇨🇳[中文 (简体)](i18n/zh-CN/ARCHITECTURE.md) | 🇩🇪 [Deutsch](i18n/de/ARCHITECTURE.md) | 🇮🇳 [हिन्दी](i18n/in/ARCHITECTURE.md) | 🇹🇭 [ไทย](i18n/th/ARCHITECTURE.md) | 🇺🇦 [Українська](i18n/uk-UA/ARCHITECTURE.md) | 🇸🇦 [العربية](i18n/ar/ARCHITECTURE.md) | 🇯🇵[日本語](i18n/ja/ARCHITECTURE.md)| 🇻🇳 [Tiếng Việt](i18n/vi/ARCHITECTURE.md) | 🇧🇬 [Български](i18n/bg/ARCHITECTURE.md) | 🇩🇰 [Dánsko](i18n/da/ARCHITECTURE.md) | 🇫🇮 [Suomi](i18n/fi/ARCHITECTURE.md) | 🇮🇱 [עברית](i18n/he/ARCHITECTURE.md) | 🇭🇺 [maďarština](i18n/hu/ARCHITECTURE.md) | 🇮🇩 [Bahasa Indonésie](i18n/id/ARCHITECTURE.md) | 🇰🇷 [한국어](i18n/ko/ARCHITECTURE.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/ARCHITECTURE.md) | 🇳🇱 [Nizozemsko](i18n/nl/ARCHITECTURE.md) | 🇳🇴 [Norsk](i18n/no/ARCHITECTURE.md) | 🇵🇹 [Português (Portugalsko)](i18n/pt/ARCHITECTURE.md) | 🇷🇴 [Română](i18n/ro/ARCHITECTURE.md) | 🇵🇱 [Polski](i18n/pl/ARCHITECTURE.md) | 🇸🇰 [Slovenčina](i18n/sk/ARCHITECTURE.md) | 🇸🇪 [Svenska](i18n/sv/ARCHITECTURE.md) | 🇵🇭 [Filipínec](i18n/phi/ARCHITECTURE.md) | 🇨🇿 [Čeština](i18n/cs/ARCHITECTURE.md) + +*Poslední aktualizace: 2026-03-04* + +## Shrnutí pro manažery + +OmniRoute je lokální směrovací brána a dashboard s umělou inteligencí postavený na Next.js. Poskytuje jeden koncový bod kompatibilní s OpenAI ( `/v1/*` ) a směruje provoz napříč několika upstreamovými poskytovateli s překladem, záložními funkcemi, obnovou tokenů a sledováním využití. + +Základní schopnosti: + +- API prostředí kompatibilní s OpenAI pro CLI/nástroje (28 poskytovatelů) +- Překlad požadavků/odpovědí napříč formáty poskytovatelů +- Záložní kombinace modelů (sekvence s více modely) +- Záložní řešení na úrovni účtu (více účtů na poskytovatele) +- Správa připojení poskytovatele OAuth + API klíčů +- Generování embeddingů pomocí `/v1/embeddings` (6 poskytovatelů, 9 modelů) +- Generování obrázků pomocí `/v1/images/generations` (4 poskytovatelé, 9 modelů) +- Pro modely uvažování zvažte analýzu tagů ( `...` ). +- Sanitizace odpovědí pro striktní kompatibilitu s OpenAI SDK +- Normalizace rolí (vývojář→systém, systém→uživatel) pro kompatibilitu mezi poskytovateli +- Konverze strukturovaného výstupu (json_schema → Gemini responseSchema) +- Lokální perzistence pro poskytovatele, klíče, aliasy, kombinace, nastavení, ceny +- Sledování využití/nákladů a protokolování požadavků +- Volitelná cloudová synchronizace pro synchronizaci více zařízení/stavů +- Seznam povolených/blokovaných IP adres pro řízení přístupu k API +- Řízení rozpočtu (průchozí/automatické/vlastní/adaptivní) +- Globální systémová výzva k vložení +- Sledování relací a otisky prstů +- Vylepšené omezení sazeb pro jednotlivé účty s profily specifickými pro poskytovatele +- Vzor jističů pro odolnost poskytovatele +- Ochrana stáda proti hromům s uzamčením mutexů +- Mezipaměť pro deduplikaci požadavků založená na podpisech +- Vrstva domény: dostupnost modelu, pravidla nákladů, záložní politika, politika blokování +- Perzistence stavu domény (mezipaměť SQLite pro zápis pro záložní funkce, rozpočty, uzamčení, jističe) +- Modul zásad pro centralizované vyhodnocování požadavků (uzamčení → rozpočet → záložní) +- Vyžádat telemetrii s agregací latence p50/p95/p99 +- Korelační ID (X-Request-Id) pro trasování typu end-to-end +- Protokolování auditu shody s předpisy s možností odhlášení pro každý klíč API +- Evaluační rámec pro zajištění kvality LLM +- Řídicí panel uživatelského rozhraní Resilience se stavem jističe v reálném čase +- Modulární poskytovatelé OAuth (12 jednotlivých modulů v adresáři `src/lib/oauth/providers/` ) + +Primární běhový model: + +- Trasy aplikace Next.js v `src/app/api/*` implementují jak API dashboardů, tak i API kompatibility. +- Sdílené jádro SSE/routing v `src/sse/*` + `open-sse/*` zvládá spouštění poskytovatelů, překlad, streamování, záložní operace a využití. + +## Rozsah a hranice + +### V rozsahu + +- Běhové prostředí lokální brány +- Rozhraní API pro správu řídicích panelů +- Ověřování poskytovatele a aktualizace tokenu +- Žádost o překlad a streamování SSE +- Lokální stav + perzistence využití +- Volitelná orchestrace synchronizace s cloudem + +### Mimo rozsah + +- Implementace cloudové služby za `NEXT_PUBLIC_CLOUD_URL` +- SLA/řídicí rovina poskytovatele mimo lokální proces +- Samotné externí binární soubory CLI (Claude CLI, Codex CLI atd.) + +## Kontext systému na vysoké úrovni + +```mermaid +flowchart LR + subgraph Clients[Developer Clients] + C1[Claude Code] + C2[Codex CLI] + C3[OpenClaw / Droid / Cline / Continue / Roo] + C4[Custom OpenAI-compatible clients] + BROWSER[Browser Dashboard] + end + + subgraph Router[OmniRoute Local Process] + API[V1 Compatibility API\n/v1/*] + DASH[Dashboard + Management API\n/api/*] + CORE[SSE + Translation Core\nopen-sse + src/sse] + DB[(storage.sqlite)] + UDB[(usage tables + log artifacts)] + end + + subgraph Upstreams[Upstream Providers] + P1[OAuth Providers\nClaude/Codex/Gemini/Qwen/iFlow/GitHub/Kiro/Cursor/Antigravity] + P2[API Key Providers\nOpenAI/Anthropic/OpenRouter/GLM/Kimi/MiniMax\nDeepSeek/Groq/xAI/Mistral/Perplexity\nTogether/Fireworks/Cerebras/Cohere/NVIDIA] + P3[Compatible Nodes\nOpenAI-compatible / Anthropic-compatible] + end + + subgraph Cloud[Optional Cloud Sync] + CLOUD[Cloud Sync Endpoint\nNEXT_PUBLIC_CLOUD_URL] + end + + C1 --> API + C2 --> API + C3 --> API + C4 --> API + BROWSER --> DASH + + API --> CORE + DASH --> DB + CORE --> DB + CORE --> UDB + + CORE --> P1 + CORE --> P2 + CORE --> P3 + + DASH --> CLOUD +``` + +## Základní běhové komponenty + +## 1) API a směrovací vrstva (trasy aplikací Next.js) + +Hlavní adresáře: + +- `src/app/api/v1/*` a `src/app/api/v1beta/*` pro rozhraní API pro zajištění kompatibility +- `src/app/api/*` pro API pro správu/konfiguraci +- Další přepisy v `next.config.mjs` mapují `/v1/*` na `/api/v1/*` + +Důležité způsoby kompatibility: + +- `src/app/api/v1/chat/completions/route.ts` +- `src/app/api/v1/messages/route.ts` +- `src/app/api/v1/responses/route.ts` +- `src/app/api/v1/models/route.ts` — obsahuje vlastní modely s `custom: true` +- `src/app/api/v1/embeddings/route.ts` — generování embeddingů (6 poskytovatelů) +- `src/app/api/v1/images/generations/route.ts` — generování obrázků (4+ poskytovatelů včetně Antigravity/Nebius) +- `src/app/api/v1/messages/count_tokens/route.ts` +- `src/app/api/v1/providers/[provider]/chat/completions/route.ts` — vyhrazený chat pro jednotlivé poskytovatele +- `src/app/api/v1/providers/[provider]/embeddings/route.ts` — vyhrazená vkládání pro jednotlivé poskytovatele +- `src/app/api/v1/providers/[provider]/images/generations/route.ts` — vyhrazené obrazy pro jednotlivé poskytovatele +- `src/app/api/v1beta/models/route.ts` +- `src/app/api/v1beta/models/[...path]/route.ts` + +Domény správy: + +- Auth/settings: `src/app/api/auth/*` , `src/app/api/settings/*` +- Poskytovatelé/připojení: `src/app/api/providers*` +- Uzly poskytovatele: `src/app/api/provider-nodes*` +- Vlastní modely: `src/app/api/provider-models` (GET/POST/DELETE) +- Katalog modelů: `src/app/api/models/route.ts` (GET) +- Konfigurace proxy: `src/app/api/settings/proxy` (GET/PUT/DELETE) + `src/app/api/settings/proxy/test` (POST) +- OAuth: `src/app/api/oauth/*` +- Klíče/aliasy/kombinace/ceny: `src/app/api/keys*` , `src/app/api/models/alias` , `src/app/api/combos*` , `src/app/api/pricing` +- Použití: `src/app/api/usage/*` +- Synchronizace/cloud: `src/app/api/sync/*` , `src/app/api/cloud/*` +- Pomocné nástroje pro CLI: `src/app/api/cli-tools/*` +- IP filtr: `src/app/api/settings/ip-filter` (GET/PUT) +- Rozpočet pro myšlení: `src/app/api/settings/thinking-budget` (GET/PUT) +- Systémový příkaz: `src/app/api/settings/system-prompt` (GET/PUT) +- Relace: `src/app/api/sessions` (GET) +- Limity rychlosti: `src/app/api/rate-limits` (GET) +- Odolnost: `src/app/api/resilience` (GET/PATCH) — profily poskytovatelů, jistič, stav limitu rychlosti +- Reset odolnosti: `src/app/api/resilience/reset` (POST) — reset jističů + doby zchlazení +- Statistiky mezipaměti: `src/app/api/cache/stats` (GET/DELETE) +- Dostupnost modelu: `src/app/api/models/availability` (GET/POST) +- Telemetrie: `src/app/api/telemetry/summary` (GET) +- Rozpočet: `src/app/api/usage/budget` (GET/POST) +- Záložní řetězce: `src/app/api/fallback/chains` (GET/POST/DELETE) +- Audit shody: `src/app/api/compliance/audit-log` (GET) +- Evals: `src/app/api/evals` (GET/POST), `src/app/api/evals/[suiteId]` (GET) +- Zásady: `src/app/api/policies` (GET/POST) + +## 2) SSE + Překladatelské jádro + +Hlavní moduly toku: + +- Záznam: `src/sse/handlers/chat.ts` +- Orchestrace jádra: `open-sse/handlers/chatCore.ts` +- Adaptéry pro spuštění poskytovatelů: `open-sse/executors/*` +- Detekce formátu/konfigurace poskytovatele: `open-sse/services/provider.ts` +- Analýza/řešení modelu: `src/sse/services/model.ts` , `open-sse/services/model.ts` +- Logika záložního účtu: `open-sse/services/accountFallback.ts` +- Registr překladů: `open-sse/translator/index.ts` +- Transformace streamů: `open-sse/utils/stream.ts` , `open-sse/utils/streamHandler.ts` +- Extrakce/normalizace využití: `open-sse/utils/usageTracking.ts` +- Analyzátor tagů Think: `open-sse/utils/thinkTagParser.ts` +- Obslužná rutina pro vkládání: `open-sse/handlers/embeddings.ts` +- Registr poskytovatelů vkládání: `open-sse/config/embeddingRegistry.ts` +- Obslužná rutina generování obrázků: `open-sse/handlers/imageGeneration.ts` +- Registr poskytovatelů obrázků: `open-sse/config/imageRegistry.ts` +- Sanitizace odpovědí: `open-sse/handlers/responseSanitizer.ts` +- Normalizace rolí: `open-sse/services/roleNormalizer.ts` + +Služby (obchodní logika): + +- Výběr/skórování účtu: `open-sse/services/accountSelector.ts` +- Správa životního cyklu kontextu: `open-sse/services/contextManager.ts` +- Vynucení filtrování IP adres: `open-sse/services/ipFilter.ts` +- Sledování relací: `open-sse/services/sessionManager.ts` +- Požadavek na deduplikaci: `open-sse/services/signatureCache.ts` +- Vložení systémového promptu: `open-sse/services/systemPrompt.ts` +- Řízení rozpočtu v duchu myšlenek: `open-sse/services/thinkingBudget.ts` +- Směrování pomocí modelu zástupných znaků: `open-sse/services/wildcardRouter.ts` +- Správa limitů rychlosti: `open-sse/services/rateLimitManager.ts` +- Jistič: `open-sse/services/circuitBreaker.ts` + +Moduly doménové vrstvy: + +- Dostupnost modelu: `src/lib/domain/modelAvailability.ts` +- Pravidla/rozpočty nákladů: `src/lib/domain/costRules.ts` +- Záložní zásady: `src/lib/domain/fallbackPolicy.ts` +- Kombinovaný resolver: `src/lib/domain/comboResolver.ts` +- Zásady uzamčení: `src/lib/domain/lockoutPolicy.ts` +- Modul zásad: `src/domain/policyEngine.ts` — centralizované uzamčení → rozpočet → vyhodnocení záložního režimu +- Katalog chybových kódů: `src/lib/domain/errorCodes.ts` +- ID požadavku: `src/lib/domain/requestId.ts` +- Časový limit načtení: `src/lib/domain/fetchTimeout.ts` +- Požadovat telemetrii: `src/lib/domain/requestTelemetry.ts` +- Shoda/audit: `src/lib/domain/compliance/index.ts` +- Zkušební běžec: `src/lib/domain/evalRunner.ts` +- Perzistence stavu domény: `src/lib/db/domainState.ts` — SQLite CRUD pro záložní řetězce, rozpočty, historii nákladů, stav uzamčení, jističe + +Moduly poskytovatelů OAuth (12 jednotlivých souborů v adresáři `src/lib/oauth/providers/` ): + +- Index registru: `src/lib/oauth/providers/index.ts` +- Jednotliví poskytovatelé: `claude.ts` , `codex.ts` , `gemini.ts` , `antigravity.ts` , `iflow.ts` , `qwen.ts` , `kimi-coding.ts` , `github.ts` , `kiro.ts` , `cursor.ts` , `kilocode.ts` , `cline.ts` +- Thin wrapper: `src/lib/oauth/providers.ts` — reexporty z jednotlivých modulů + +## 3) Vrstva perzistence + +Primární stavová databáze (SQLite): + +- Základní infrastruktura: `src/lib/db/core.ts` (better-sqlite3, migrace, WAL) +- Reexportní fasáda: `src/lib/localDb.ts` (tenká vrstva kompatibility pro volající) +- soubor: `${DATA_DIR}/storage.sqlite` (nebo `$XDG_CONFIG_HOME/omniroute/storage.sqlite` pokud je nastaveno, jinak `~/.omniroute/storage.sqlite` ) +- entity (tabulky + jmenné prostory KV): providerConnections, providerNodes, modelAliases, combos, apiKeys, settings, pricing, **customModels** , **proxyConfig** , **ipFilter** , **thinkingBudget** , **systemPrompt** + +Trvalost používání: + +- fasáda: `src/lib/usageDb.ts` (dekomponované moduly v `src/lib/usage/*` ) +- SQLite tabulky v `storage.sqlite` : `usage_history` , `call_logs` , `proxy_logs` +- Volitelné artefakty souborů zůstávají pro účely kompatibility/ladění ( `${DATA_DIR}/log.txt` , `${DATA_DIR}/call_logs/` , `/logs/...` ) +- Starší soubory JSON jsou migrovány do SQLite při migracích při spuštění, pokud jsou k dispozici. + +Databáze stavu domény (SQLite): + +- `src/lib/db/domainState.ts` — CRUD operace pro stav domény +- Tabulky (vytvořené v `src/lib/db/core.ts` ): `domain_fallback_chains` , `domain_budgets` , `domain_cost_history` , `domain_lockout_state` , `domain_circuit_breakers` +- Vzor mezipaměti pro zápis: mapy v paměti jsou autoritativní za běhu; mutace se zapisují synchronně do SQLite; stav se obnovuje z databáze při studeném startu. + +## 4) Ověřovací a bezpečnostní povrchy + +- Autorizace souborů cookie v dashboardu: `src/proxy.ts` , `src/app/api/auth/login/route.ts` +- Generování/ověření klíče API: `src/shared/utils/apiKey.ts` +- Tajné kódy poskytovatele přetrvávaly v položkách `providerConnections` +- Podpora odchozí proxy přes `open-sse/utils/proxyFetch.ts` (proměnné prostředí) a `open-sse/utils/networkProxy.ts` (konfigurovatelné pro jednotlivé poskytovatele nebo globálně) + +## 5) Synchronizace s cloudem + +- Inicializace plánovače: `src/lib/initCloudSync.ts` , `src/shared/services/initializeCloudSync.ts` +- Periodická úloha: `src/shared/services/cloudSyncScheduler.ts` +- Řídicí trasa: `src/app/api/sync/cloud/route.ts` + +## Životní cyklus požadavku ( `/v1/chat/completions` ) + +```mermaid +sequenceDiagram + autonumber + participant Client as CLI/SDK Client + participant Route as /api/v1/chat/completions + participant Chat as src/sse/handlers/chat + participant Core as open-sse/handlers/chatCore + participant Model as Model Resolver + participant Auth as Credential Selector + participant Exec as Provider Executor + participant Prov as Upstream Provider + participant Stream as Stream Translator + participant Usage as usageDb + + Client->>Route: POST /v1/chat/completions + Route->>Chat: handleChat(request) + Chat->>Model: parse/resolve model or combo + + alt Combo model + Chat->>Chat: iterate combo models (handleComboChat) + end + + Chat->>Auth: getProviderCredentials(provider) + Auth-->>Chat: active account + tokens/api key + + Chat->>Core: handleChatCore(body, modelInfo, credentials) + Core->>Core: detect source format + Core->>Core: translate request to target format + Core->>Exec: execute(provider, transformedBody) + Exec->>Prov: upstream API call + Prov-->>Exec: SSE/JSON response + Exec-->>Core: response + metadata + + alt 401/403 + Core->>Exec: refreshCredentials() + Exec-->>Core: updated tokens + Core->>Exec: retry request + end + + Core->>Stream: translate/normalize stream to client format + Stream-->>Client: SSE chunks / JSON response + + Stream->>Usage: extract usage + persist history/log +``` + +## Kombinovaný + záložní proces pro účet + +```mermaid +flowchart TD + A[Incoming model string] --> B{Is combo name?} + B -- Yes --> C[Load combo models sequence] + B -- No --> D[Single model path] + + C --> E[Try model N] + E --> F[Resolve provider/model] + D --> F + + F --> G[Select account credentials] + G --> H{Credentials available?} + H -- No --> I[Return provider unavailable] + H -- Yes --> J[Execute request] + + J --> K{Success?} + K -- Yes --> L[Return response] + K -- No --> M{Fallback-eligible error?} + + M -- No --> N[Return error] + M -- Yes --> O[Mark account unavailable cooldown] + O --> P{Another account for provider?} + P -- Yes --> G + P -- No --> Q{In combo with next model?} + Q -- Yes --> E + Q -- No --> R[Return all unavailable] +``` + +Rozhodnutí o záložních metodách jsou řízena souborem `open-sse/services/accountFallback.ts` s využitím stavových kódů a heuristik chybových zpráv. + +## Životní cyklus aktualizace OAuth a onboardingu tokenu + +```mermaid +sequenceDiagram + autonumber + participant UI as Dashboard UI + participant OAuth as /api/oauth/[provider]/[action] + participant ProvAuth as Provider Auth Server + participant DB as localDb + participant Test as /api/providers/[id]/test + participant Exec as Provider Executor + + UI->>OAuth: GET authorize or device-code + OAuth->>ProvAuth: create auth/device flow + ProvAuth-->>OAuth: auth URL or device code payload + OAuth-->>UI: flow data + + UI->>OAuth: POST exchange or poll + OAuth->>ProvAuth: token exchange/poll + ProvAuth-->>OAuth: access/refresh tokens + OAuth->>DB: createProviderConnection(oauth data) + OAuth-->>UI: success + connection id + + UI->>Test: POST /api/providers/[id]/test + Test->>Exec: validate credentials / optional refresh + Exec-->>Test: valid or refreshed token info + Test->>DB: update status/tokens/errors + Test-->>UI: validation result +``` + +Obnovení během živého provozu se provádí uvnitř `open-sse/handlers/chatCore.ts` pomocí exekutoru `refreshCredentials()` . + +## Životní cyklus synchronizace s cloudem (Povolit / Synchronizovat / Zakázat) + +```mermaid +sequenceDiagram + autonumber + participant UI as Endpoint Page UI + participant Sync as /api/sync/cloud + participant DB as localDb + participant Cloud as External Cloud Sync + participant Claude as ~/.claude/settings.json + + UI->>Sync: POST action=enable + Sync->>DB: set cloudEnabled=true + Sync->>DB: ensure API key exists + Sync->>Cloud: POST /sync/{machineId} (providers/aliases/combos/keys) + Cloud-->>Sync: sync result + Sync->>Cloud: GET /{machineId}/v1/verify + Sync-->>UI: enabled + verification status + + UI->>Sync: POST action=sync + Sync->>Cloud: POST /sync/{machineId} + Cloud-->>Sync: remote data + Sync->>DB: update newer local tokens/status + Sync-->>UI: synced + + UI->>Sync: POST action=disable + Sync->>DB: set cloudEnabled=false + Sync->>Cloud: DELETE /sync/{machineId} + Sync->>Claude: switch ANTHROPIC_BASE_URL back to local (if needed) + Sync-->>UI: disabled +``` + +Pravidelnou synchronizaci spouští `CloudSyncScheduler` , když je povolen cloud. + +## Datový model a mapa úložiště + +```mermaid +erDiagram + SETTINGS ||--o{ PROVIDER_CONNECTION : controls + PROVIDER_NODE ||--o{ PROVIDER_CONNECTION : backs_compatible_provider + PROVIDER_CONNECTION ||--o{ USAGE_ENTRY : emits_usage + + SETTINGS { + boolean cloudEnabled + number stickyRoundRobinLimit + boolean requireLogin + string password_hash + string fallbackStrategy + json rateLimitDefaults + json providerProfiles + } + + PROVIDER_CONNECTION { + string id + string provider + string authType + string name + number priority + boolean isActive + string apiKey + string accessToken + string refreshToken + string expiresAt + string testStatus + string lastError + string rateLimitedUntil + json providerSpecificData + } + + PROVIDER_NODE { + string id + string type + string name + string prefix + string apiType + string baseUrl + } + + MODEL_ALIAS { + string alias + string targetModel + } + + COMBO { + string id + string name + string[] models + } + + API_KEY { + string id + string name + string key + string machineId + } + + USAGE_ENTRY { + string provider + string model + number prompt_tokens + number completion_tokens + string connectionId + string timestamp + } + + CUSTOM_MODEL { + string id + string name + string providerId + } + + PROXY_CONFIG { + string global + json providers + } + + IP_FILTER { + string mode + string[] allowlist + string[] blocklist + } + + THINKING_BUDGET { + string mode + number customBudget + string effortLevel + } + + SYSTEM_PROMPT { + boolean enabled + string prompt + string position + } +``` + +Soubory fyzického úložiště: + +- primární běhová databáze: `${DATA_DIR}/storage.sqlite` +- řádky protokolu požadavku: `${DATA_DIR}/log.txt` (artefakt kompatibility/ladění) +- Archivy strukturovaných dat volání: `${DATA_DIR}/call_logs/` +- volitelné relace překladače/vyžádání ladění: `/logs/...` + +## Topologie nasazení + +```mermaid +flowchart LR + subgraph LocalHost[Developer Host] + CLI[CLI Tools] + Browser[Dashboard Browser] + end + + subgraph ContainerOrProcess[OmniRoute Runtime] + Next[Next.js Server\nPORT=20128] + Core[SSE Core + Executors] + MainDB[(storage.sqlite)] + UsageDB[(usage tables + log artifacts)] + end + + subgraph External[External Services] + Providers[AI Providers] + SyncCloud[Cloud Sync Service] + end + + CLI --> Next + Browser --> Next + Next --> Core + Next --> MainDB + Core --> MainDB + Core --> UsageDB + Core --> Providers + Next --> SyncCloud +``` + +## Mapování modulů (kritické pro rozhodnutí) + +### Moduly tras a API + +- `src/app/api/v1/*` , `src/app/api/v1beta/*` : API pro zajištění kompatibility +- `src/app/api/v1/providers/[provider]/*` : vyhrazené trasy pro jednotlivé poskytovatele (chat, vkládání, obrázky) +- `src/app/api/providers*` : CRUD poskytovatele, validace, testování +- `src/app/api/provider-nodes*` : správa uzlů kompatibilních s vlastními nástroji +- `src/app/api/provider-models` : správa vlastních modelů (CRUD) +- `src/app/api/models/route.ts` : API katalogu modelů (aliasy + vlastní modely) +- `src/app/api/oauth/*` : Toky OAuth/kódu zařízení +- `src/app/api/keys*` : životní cyklus lokálního klíče API +- `src/app/api/models/alias` : správa aliasů +- `src/app/api/combos*` : správa záložních kombinací +- `src/app/api/pricing` : přepsání cen pro výpočet nákladů +- `src/app/api/settings/proxy` : konfigurace proxy (GET/PUT/DELETE) +- `src/app/api/settings/proxy/test` : test připojení odchozí proxy (POST) +- `src/app/api/usage/*` : API pro použití a protokoly +- `src/app/api/sync/*` + `src/app/api/cloud/*` : synchronizace s cloudem a pomocníci pro práci s cloudem +- `src/app/api/cli-tools/*` : lokální programy pro zápis/kontrolu konfigurace CLI +- `src/app/api/settings/ip-filter` : Seznam povolených/blokovaných IP adres (GET/PUT) +- `src/app/api/settings/thinking-budget` : konfigurace rozpočtu tokenu thinking (GET/PUT) +- `src/app/api/settings/system-prompt` : globální systémový příkaz (GET/PUT) +- `src/app/api/sessions` : výpis aktivních relací (GET) +- `src/app/api/rate-limits` : stav limitu rychlosti pro účet (GET) + +### Směrovací a spouštěcí jádro + +- `src/sse/handlers/chat.ts` : parsování požadavků, zpracování kombinací, smyčka výběru účtu +- `open-sse/handlers/chatCore.ts` : překlad, odeslání exekutoru, zpracování opakování/obnovení, nastavení streamu +- `open-sse/executors/*` : chování sítě a formátu specifické pro poskytovatele + +### Registr překladů a převodníky formátů + +- `open-sse/translator/index.ts` : registr a orchestrace překladačů +- Žádost o překladatele: `open-sse/translator/request/*` +- Překladače odpovědí: `open-sse/translator/response/*` +- Formátovací konstanty: `open-sse/translator/formats.ts` + +### Perzistence + +- `src/lib/db/*` : perzistentní ukládání konfigurace/stavu a domény v SQLite +- `src/lib/localDb.ts` : reexport kompatibility pro databázové moduly +- `src/lib/usageDb.ts` : fasáda historie použití/záznamů volání nad tabulkami SQLite + +## Pokrytí poskytovatele a vykonavatele (strategický vzorec) + +Každý poskytovatel má specializovaný exekutor rozšiřující `BaseExecutor` (v `open-sse/executors/base.ts` ), který zajišťuje vytváření URL adres, konstrukci hlaviček, opakování s exponenciálním odkladem, hooky pro obnovení pověření a orchestrační metodu `execute()` . + +Vykonavatel | Poskytovatel(é) | Speciální manipulace +--- | --- | --- +`DefaultExecutor` | OpenAI, Claude, Gemini, Qwen, iFlow, OpenRouter, GLM, Kimi, MiniMax, DeepSeek, Groq, xAI, Mistral, Perplexity, Together, Fireworks, Cerebras, Cohere, NVIDIA | Konfigurace dynamické adresy URL/záhlaví pro každého poskytovatele +`AntigravityExecutor` | Google Antigravitace | Vlastní ID projektů/relací, analýza Opakování po +`CodexExecutor` | Kodex OpenAI | Vkládá systémové instrukce, vynucuje úsilí k uvažování +`CursorExecutor` | IDE kurzoru | Protokol ConnectRPC, kódování Protobuf, podepisování požadavků pomocí kontrolního součtu +`GithubExecutor` | GitHub Copilot | Aktualizace tokenu Copilot, hlavičky napodobující VSCode +`KiroExecutor` | AWS CodeWhisperer/Kiro | Binární formát AWS EventStream → konverze SSE +`GeminiCLIExecutor` | Rozhraní příkazového řádku Gemini | Cyklus obnovy tokenu Google OAuth + +Všichni ostatní poskytovatelé (včetně uzlů kompatibilních s vlastními funkcemi) používají `DefaultExecutor` . + +## Matice kompatibility poskytovatelů + +Poskytovatel | Formát | Autorizace | Proud | Nestreamované | Obnovení tokenu | API pro použití +--- | --- | --- | --- | --- | --- | --- +Claude | Claude | Klíč API / OAuth | ✅ | ✅ | ✅ | ⚠️ Pouze pro administrátory +Blíženci | Blíženci | Klíč API / OAuth | ✅ | ✅ | ✅ | ⚠️ Cloudová konzole +Rozhraní příkazového řádku Gemini | gemini-cli | OAuth | ✅ | ✅ | ✅ | ⚠️ Cloudová konzole +Antigravitace | antigravitace | OAuth | ✅ | ✅ | ✅ | ✅ Plná kvóta API +OpenAI | otevřeno | Klíč API | ✅ | ✅ | ❌ | ❌ +Kodex | openai-odpovědi | OAuth | ✅ vynucený | ❌ | ✅ | ✅ Limity sazeb +GitHub Copilot | otevřeno | OAuth + token Copilota | ✅ | ✅ | ✅ | ✅ Snímky kvót +Kurzor | kurzor | Vlastní kontrolní součet | ✅ | ✅ | ❌ | ❌ +Kiro | Kiro | OIDC pro jednotné přihlašování AWS | ✅ (Stream událostí) | ❌ | ✅ | ✅ Limity použití +Qwen | otevřeno | OAuth | ✅ | ✅ | ✅ | ⚠️ Na vyžádání +iFlow | otevřeno | OAuth (základní) | ✅ | ✅ | ✅ | ⚠️ Na vyžádání +OpenRouter | otevřeno | Klíč API | ✅ | ✅ | ❌ | ❌ +GLM/Kimi/MiniMax | Claude | Klíč API | ✅ | ✅ | ❌ | ❌ +Hluboké vyhledávání | otevřeno | Klíč API | ✅ | ✅ | ❌ | ❌ +Groq | otevřeno | Klíč API | ✅ | ✅ | ❌ | ❌ +xAI (Grok) | otevřeno | Klíč API | ✅ | ✅ | ❌ | ❌ +Mistral | otevřeno | Klíč API | ✅ | ✅ | ❌ | ❌ +Zmatek | otevřeno | Klíč API | ✅ | ✅ | ❌ | ❌ +Společně s umělou inteligencí | otevřeno | Klíč API | ✅ | ✅ | ❌ | ❌ +Ohňostroj s umělou inteligencí | otevřeno | Klíč API | ✅ | ✅ | ❌ | ❌ +Mozky | otevřeno | Klíč API | ✅ | ✅ | ❌ | ❌ +Soudržný | otevřeno | Klíč API | ✅ | ✅ | ❌ | ❌ +NVIDIA NIM | otevřeno | Klíč API | ✅ | ✅ | ❌ | ❌ + +## Pokrytí překladů formátů + +Mezi detekované zdrojové formáty patří: + +- `openai` +- `openai-responses` +- `claude` +- `gemini` + +Cílové formáty zahrnují: + +- Chat/Odpovědi v OpenAI +- Claude +- Obálka Gemini/Gemini-CLI/Antigravitace +- Kiro +- Kurzor + +Překlady používají **jako ústřední formát OpenAI** – všechny konverze procházejí OpenAI jako zprostředkovatel: + +``` +Source Format → OpenAI (hub) → Target Format +``` + +Překlady jsou vybírány dynamicky na základě tvaru zdrojového datového obsahu a formátu cílového poskytovatele. + +Další vrstvy zpracování v překladovém kanálu: + +- **Sanitizace odpovědí** – Odstraňuje nestandardní pole z odpovědí ve formátu OpenAI (streamovaných i nestreamovaných), aby byla zajištěna přísná shoda se SDK. +- **Normalizace rolí** — Převádí `developer` → `system` pro cíle mimo OpenAI; slučuje `system` → `user` pro modely, které odmítají systémovou roli (GLM, ERNIE) +- **Extrakce tagu Think** — Analyzuje bloky `...` z obsahu do pole `reasoning_content` +- **Strukturovaný výstup** — Převede OpenAI `response_format.json_schema` na `responseMimeType` + `responseSchema` z Gemini. + +## Podporované koncové body API + +Koncový bod | Formát | Psovod +--- | --- | --- +`POST /v1/chat/completions` | Chat s OpenAI | `src/sse/handlers/chat.ts` +`POST /v1/messages` | Claude Messages | Stejný obslužný program (automaticky detekováno) +`POST /v1/responses` | Reakce OpenAI | `open-sse/handlers/responsesHandler.ts` +`POST /v1/embeddings` | Vkládání OpenAI | `open-sse/handlers/embeddings.ts` +`GET /v1/embeddings` | Seznam modelů | Trasa API +`POST /v1/images/generations` | Obrázky OpenAI | `open-sse/handlers/imageGeneration.ts` +`GET /v1/images/generations` | Seznam modelů | Trasa API +`POST /v1/providers/{provider}/chat/completions` | Chat s OpenAI | Vyhrazené pro každého poskytovatele s ověřováním modelu +`POST /v1/providers/{provider}/embeddings` | Vkládání OpenAI | Vyhrazené pro každého poskytovatele s ověřováním modelu +`POST /v1/providers/{provider}/images/generations` | Obrázky OpenAI | Vyhrazené pro každého poskytovatele s ověřováním modelu +`POST /v1/messages/count_tokens` | Počet žetonů Claude | Trasa API +`GET /v1/models` | Seznam modelů OpenAI | Trasa API (chat + vkládání + obrázek + vlastní modely) +`GET /api/models/catalog` | Katalog | Všechny modely seskupené podle poskytovatele + typu +`POST /v1beta/models/*:streamGenerateContent` | Rodák z Blíženců | Trasa API +`GET/PUT/DELETE /api/settings/proxy` | Konfigurace proxy serveru | Konfigurace síťového proxy serveru +`POST /api/settings/proxy/test` | Připojení proxy serveru | Koncový bod testu stavu/připojení proxy serveru +`GET/POST/DELETE /api/provider-models` | Vlastní modely | Správa vlastních modelů pro každého poskytovatele + +## Obejít obslužnou rutinu + +Obslužná rutina bypassu ( `open-sse/utils/bypassHandler.ts` ) zachycuje známé „throwaway“ požadavky z Claude CLI – warmup pingy, extrakce titulků a počty tokenů – a vrací **falešnou odpověď** bez spotřebování tokenů upstreamového poskytovatele. Toto se spustí pouze tehdy, když `User-Agent` obsahuje `claude-cli` . + +## Kanál protokolování požadavků + +Záznamník požadavků ( `open-sse/utils/requestLogger.ts` ) poskytuje 7stupňový kanál protokolování ladění, ve výchozím nastavení zakázaný a povolený pomocí `ENABLE_REQUEST_LOGS=true` : + +``` +1_req_client.json → 2_req_source.json → 3_req_openai.json → 4_req_target.json +→ 5_res_provider.txt → 6_res_openai.txt → 7_res_client.txt +``` + +Soubory se zapisují do `/logs//` pro každou relaci požadavku. + +## Způsoby selhání a odolnost + +## 1) Dostupnost účtu/poskytovatele + +- Doba ochlazování účtu poskytovatele při přechodných chybách/chybách rychlosti/autentizace +- záložní účet před selháním požadavku +- záložní kombinovaný model, když je aktuální cesta modelu/poskytovatele vyčerpána + +## 2) Platnost tokenu + +- předběžná kontrola a obnovení s opakovaným pokusem o obnovení poskytovatelů +- Opakování 401/403 po pokusu o obnovení v hlavní cestě + +## 3) Bezpečnost streamu + +- streamovací řadič s vědomím odpojení +- překladový proud s vyprázdněním konce proudu a zpracováním `[DONE]` +- Záložní odhad využití, když chybí metadata využití poskytovatele + +## 4) Zhoršení cloudové synchronizace + +- Zobrazují se chyby synchronizace, ale lokální běhové prostředí pokračuje. +- Plánovač má logiku umožňující opakování, ale periodické provádění v současné době ve výchozím nastavení volá synchronizaci s jedním pokusem. + +## 5) Integrita dat + +- Migrace schématu SQLite a automatické aktualizace hooků při spuštění +- Cesta kompatibility migrace starší verze JSON → SQLite + +## Pozorovatelnost a provozní signály + +Zdroje viditelnosti za běhu: + +- protokoly konzole ze `src/sse/utils/logger.ts` +- Agregace využití na požadavek v SQLite ( `usage_history` , `call_logs` , `proxy_logs` ) +- textový stav požadavku přihlášení `log.txt` (volitelné/kompatibilní) +- volitelné hluboké protokoly požadavků/překladů v `logs/` pokud `ENABLE_REQUEST_LOGS=true` +- Koncové body použití dashboardu ( `/api/usage/*` ) pro spotřebu v uživatelském rozhraní + +## Hranice citlivé z hlediska zabezpečení + +- Tajný kód JWT ( `JWT_SECRET` ) zajišťuje ověřování/podepisování souborů cookie relace dashboardu. +- Počáteční bootstrap hesla ( `INITIAL_PASSWORD` ) by měl být explicitně nakonfigurován pro zřizování při prvním spuštění. +- Tajný klíč API HMAC ( `API_KEY_SECRET` ) zabezpečuje formát vygenerovaného lokálního klíče API. +- Tajné klíče/tokeny poskytovatele (klíče/tokeny API) jsou uloženy v lokální databázi a měly by být chráněny na úrovni souborového systému. +- Koncové body synchronizace cloudu se spoléhají na sémantiku ověřování klíče API + ID počítače. + +## Matice prostředí a běhového prostředí + +Proměnné prostředí aktivně používané kódem: + +- Aplikace/autentizace: `JWT_SECRET` , `INITIAL_PASSWORD` +- Úložiště: `DATA_DIR` +- Chování kompatibilního uzlu: `ALLOW_MULTI_CONNECTIONS_PER_COMPAT_NODE` +- Volitelné přepsání úložné základny (Linux/macOS, když `DATA_DIR` není nastaveno): `XDG_CONFIG_HOME` +- Bezpečnostní hashování: `API_KEY_SECRET` , `MACHINE_ID_SALT` +- Protokolování: `ENABLE_REQUEST_LOGS` +- Synchronizace/cloudové URL: `NEXT_PUBLIC_BASE_URL` , `NEXT_PUBLIC_CLOUD_URL` +- Odchozí proxy: `HTTP_PROXY` , `HTTPS_PROXY` , `ALL_PROXY` , `NO_PROXY` a varianty s malými písmeny +- Příznaky funkcí SOCKS5: `ENABLE_SOCKS5_PROXY` , `NEXT_PUBLIC_ENABLE_SOCKS5_PROXY` +- Pomocníci pro platformu/běhové prostředí (ne konfigurace specifická pro aplikaci): `APPDATA` , `NODE_ENV` , `PORT` , `HOSTNAME` + +## Známé architektonické poznámky + +1. `usageDb` a `localDb` sdílejí stejnou základní adresářovou politiku ( `DATA_DIR` -> `XDG_CONFIG_HOME/omniroute` -> `~/.omniroute` ) se starší migrací souborů. +2. `/api/v1/route.ts` deleguje na stejný jednotný nástroj pro tvorbu katalogů, který používá `/api/v1/models` ( `src/app/api/v1/models/catalog.ts` ), aby se zabránilo sémantickému posunu. +3. Pokud je povoleno, zaznamenávač požadavků zapisuje celé záhlaví/tělo; adresář protokolu je považován za citlivý. +4. Chování cloudu závisí na správné adrese `NEXT_PUBLIC_BASE_URL` a dosažitelnosti cloudového koncového bodu. +5. Adresář `open-sse/` je publikován jako **balíček npm workspace** `@omniroute/open-sse` . Zdrojový kód jej importuje přes `@omniroute/open-sse/...` (vyřešeno pomocí `transpilePackages` v Next.js). Cesty k souborům v tomto dokumentu stále používají název adresáře `open-sse/` pro účely konzistence. +6. Grafy v dashboardu používají **Recharts** (založené na SVG) pro přístupné a interaktivní vizualizace analytiky (sloupcové grafy využití modelu, tabulky s rozpisem poskytovatelů s mírou úspěšnosti). +7. E2E testy používají **Playwright** ( `tests/e2e/` ), spouštěné pomocí `npm run test:e2e` . Unit testy používají **Node.js test runner** ( `tests/unit/` ), spouštěné pomocí `npm run test:unit` . Zdrojový kód pod `src/` je **TypeScript** ( `.ts` / `.tsx` ); pracovní prostor `open-sse/` zůstává JavaScript ( `.js` ). +8. Stránka nastavení je uspořádána do 5 záložek: Zabezpečení, Směrování (6 globálních strategií: fill-first, round robin, p2c, náhodné, nejméně používané, nákladově optimalizované), Odolnost (upravitelné limity rychlosti, jistič, zásady), AI (rozpočet promyšlený, systémový výzva, mezipaměť výzev), Pokročilé (proxy). + +## Kontrolní seznam provozního ověření + +- Sestavení ze zdroje: `npm run build` +- Sestavení obrazu Dockeru: `docker build -t omniroute .` +- Spusťte službu a ověřte: +- `GET /api/settings` +- `GET /api/v1/models` +- Základní URL cíle CLI by měla být `http://:20128/v1` , pokud `PORT=20128` diff --git a/docs/i18n/cs/AUTO-COMBO.md b/docs/i18n/cs/AUTO-COMBO.md new file mode 100644 index 00000000..70232be7 --- /dev/null +++ b/docs/i18n/cs/AUTO-COMBO.md @@ -0,0 +1,63 @@ +# OmniRoute Auto-Combo Engine + +> Samosprávné řetězce modelů s adaptivním bodováním + +## Jak to funguje + +Systém Auto-Combo dynamicky vybírá nejlepšího poskytovatele/model pro každý požadavek pomocí **6faktorové skórovací funkce** : + +Faktor | Hmotnost | Popis +:-- | :-- | :-- +Kvóta | 0,20 | Zbývající kapacita [0..1] +Zdraví | 0,25 | Jistič: ZAVŘENO=1,0, POLOVINA=0,5, OTEVŘENO=0,0 +Náklady na fakturu | 0,20 | Inverzní náklady (levnější = vyšší skóre) +LatencyInv | 0,15 | Inverzní latence p95 (rychlejší = vyšší) +TaskFit | 0,10 | Skóre zdatnost modelu × typu úlohy +Stabilita | 0,10 | Nízká variabilita latence/chyb + +## Balíčky módů + +Balíček | Soustředit | Hmotnost klíče +:-- | :-- | :-- +🚀 **Rychlé odeslání** | Rychlost | latenceInv: 0,35 +💰 **Úspora nákladů** | Ekonomika | Náklady na účet: 0,40 +🎯 **Kvalita na prvním místě** | Nejlepší model | taskFit: 0,40 +📡 **Vhodné pro offline použití** | Dostupnost | kvóta: 0,40 + +## Samoléčení + +- **Dočasné vyloučení** : Skóre < 0,2 → vyloučeno na 5 minut (postupné oddlužování, max. 30 minut) +- **Upozornění na jistič** : OTEVŘENO → automatické vyloučení; POLOVIČNÍ OTEVŘENO → požadavky sondy +- **Režim incidentu** : >50% OTEVŘENO → deaktivovat průzkum, maximalizovat stabilitu +- **Obnova po zchlazení** : Po vyloučení je první požadavek „sonda“ se zkráceným časovým limitem. + +## Průzkum banditů + +5 % požadavků (konfigurovatelných) je směrováno k náhodným poskytovatelům k prozkoumání. V režimu incidentu je toto nastavení zakázáno. + +## API + +```bash +# Create auto-combo +curl -X POST http://localhost:20128/api/combos/auto \ + -H "Content-Type: application/json" \ + -d '{"id":"my-auto","name":"Auto Coder","candidatePool":["anthropic","google","openai"],"modePack":"ship-fast"}' + +# List auto-combos +curl http://localhost:20128/api/combos/auto +``` + +## Úkol Fitness + +Více než 30 modelů hodnocených v 6 typech úkolů ( `coding` , `review` , `planning` , `analysis` , `debugging` , `documentation` ). Podporuje zástupné znaky (např. `*-coder` → vysoké skóre kódování). + +## Soubory + +Soubor | Účel +:-- | :-- +`open-sse/services/autoCombo/scoring.ts` | Skórovací funkce a normalizace poolu +`open-sse/services/autoCombo/taskFitness.ts` | Vyhledávání vhodnosti modelu × úkolu +`open-sse/services/autoCombo/engine.ts` | Logika výběru, bandita, rozpočtový strop +`open-sse/services/autoCombo/selfHealing.ts` | Vyloučení, sondy, režim incidentu +`open-sse/services/autoCombo/modePacks.ts` | 4 hmotnostní profily +`src/app/api/combos/auto/route.ts` | REST API diff --git a/docs/i18n/cs/CHANGELOG.md b/docs/i18n/cs/CHANGELOG.md new file mode 100644 index 00000000..524054ee --- /dev/null +++ b/docs/i18n/cs/CHANGELOG.md @@ -0,0 +1,715 @@ +# Seznam změn + +## [Nevydané] + +--- + +## [2.7.8] — 18. 3. 2026 + +> Sprint: Chyba ukládání rozpočtu + funkce kombinovaného agenta v uživatelském rozhraní + oprava zabezpečení tagu omniModel. + +### 🐛 Opravy chyb + +- **fix(budget)** : „Uložit limity“ již nevrací chybu 422 — `warningThreshold` se nyní správně odesílá jako zlomek (0–1) místo procenta (0–100) (#451) +- **oprava(kombinace)** : interní tag mezipaměti `` je nyní odstraněn před přeposíláním požadavků poskytovatelům, čímž se zabrání přerušení relace mezipaměti (#454) + +### ✨ Funkce + +- **feat(combos)** : Do modálního okna pro vytváření/úpravy komb přidána sekce Funkce agenta – zpřístupnění přepsání `system_message` , `tool_filter_regex` a `context_cache_protection` přímo z dashboardu (#454) + +--- + +## [2.7.7] — 18. 3. 2026 + +> Sprint: Pád Dockeru pino, oprava workeru Codex CLI responses, synchronizace zámků balíčků. + +### 🐛 Opravy chyb + +- **oprava(docker)** : `pino-abstract-transport` a `pino-pretty` jsou nyní explicitně kopírovány ve fázi Docker Runner — Samostatné trasování Next.js tyto závislosti peerů přehlíží, což způsobuje pád `Cannot find module pino-abstract-transport` při spuštění (#449) +- **fix(responses)** : Odstranění `initTranslators()` z trasy `/v1/responses` — worker Next.js `the worker has exited` uncaughtException při požadavcích Codex CLI (#450) + +### 🔧 Údržba + +- **chore(deps)** : `package-lock.json` je nyní commitován při každém upgradu verze, aby se zajistilo, že Docker `npm ci` použije přesné verze závislostí. + +--- + +## [2.7.5] — 18. 3. 2026 + +> Sprint: Vylepšení uživatelského rozhraní a oprava kontroly stavu rozhraní Windows CLI. + +### 🐛 Opravy chyb + +- **fix(ux)** : Zobrazit na přihlašovací stránce nápovědu k výchozímu heslu — noví uživatelé nyní pod polem pro zadání hesla vidí `"Default password: 123456"` (#437) +- **fix(cli)** : Claude CLI a další nástroje nainstalované npm jsou nyní správně detekovány jako spustitelné ve Windows — spawn používá `shell:true` k rozpoznání `.cmd` wrapperů přes PATHEXT (#447) + +--- + +## [2.7.4] — 18. 3. 2026 + +> Sprint: Panel vyhledávacích nástrojů, opravy i18n, limity Copilota, oprava validace Serperu. + +### 🚀 Vlastnosti + +- **feat(search)** : Přidáno hřiště pro vyhledávání (10. koncový bod), stránka s nástroji pro vyhledávání s porovnáním poskytovatelů/kanálovým přeřazením/historií vyhledávání, lokální směrování pro přeřazení, ochrana autorizace ve vyhledávacím API (#443 od @Regis-RCR) + - Nová trasa: `/dashboard/search-tools` + - Položka postranního panelu v sekci Ladění + - `GET /api/search/providers` a `GET /api/search/stats` s ochranou autorizace + - Lokální směrování provider_nodes pro `/v1/rerank` + - 30+ klíčů i18n ve vyhledávacím jmenném prostoru + +### 🐛 Opravy chyb + +- **fix(search)** : Oprava normalizátoru Brave News (vracel 0 výsledků), vynucení zkrácení max_results po normalizaci, oprava URL pro načítání stránek z koncových bodů (#443 od @Regis-RCR) +- **fix(analytics)** : Lokalizace popisků dnů/dat v analytických nástrojích — nahrazení pevně zakódovaných portugalských řetězců pomocí `Intl.DateTimeFormat(locale)` (#444 od @hijak) +- **oprava(copilot)** : Oprava zobrazení typu účtu GitHub Copilot, filtrování zavádějících řádků neomezených kvót z dashboardu limitů (#445 od @hijak) +- **oprava(poskytovatelé)** : Zastavit odmítání platných klíčů Serper API – odpovědi jiné než 4xx považovat za platné ověřování (#446 od @hijak) + +--- + +## [2.7.3] — 18. 3. 2026 + +> Sprint: Oprava záložní kvóty pro přímé API Codexu. + +### 🐛 Opravy chyb + +- **oprava(codex)** : Blokování týdenních vyčerpávajících účtů v přímém záložním rozhraní API (#440) + - Porovnávání prefixů `resolveQuotaWindow()` : `"weekly"` nyní odpovídá klíčům mezipaměti `"weekly (7d)"` + - `applyCodexWindowPolicy()` správně vynucuje přepínání `useWeekly` / `use5h` + - 4 nové regresní testy (celkem 766) + +--- + +## [2.7.2] — 18. 3. 2026 + +> Sprint: Opravy kontrastu uživatelského rozhraní v režimu Light. + +### 🐛 Opravy chyb + +- **fix(logs)** : Oprava kontrastu světelného režimu v protokolech požadavků, tlačítek filtrů a kombinovaného odznaku (#378) + - Tlačítka filtrů Chyba/Úspěch/Kombinace jsou nyní čitelná i ve světlém režimu. + - Odznak kombinované řady používá ve světlém režimu silnější fialovou barvu + +--- + +## [2.7.1] — 17. 3. 2026 + +> Sprint: Sjednocené směrování webového vyhledávání (POST /v1/search) s 5 poskytovateli + opravy zabezpečení Next.js 16.1.7 (6 CVE). + +### ✨ Nové funkce + +- **feat(search)** : Sjednocené směrování webového vyhledávání — `POST /v1/search` s 5 poskytovateli (Serper, Brave, Perplexity, Exa, Tavily) + - Automatické přepnutí napříč poskytovateli, více než 6 500 bezplatných vyhledávání/měsíc + - Mezipaměť v paměti se slučováním požadavků (konfigurovatelné TTL) + - Dashboard: Karta Analytika vyhledávání v `/dashboard/analytics` s rozpisem poskytovatelů, mírou zásahů do mezipaměti a sledováním nákladů + - Nové API: `GET /api/v1/search/analytics` pro statistiky vyhledávacích požadavků + - Migrace databáze: sloupec `request_type` v `call_logs` pro sledování požadavků mimo chat + - Ověření Zod ( `v1SearchSchema` ), chráněné autorizací, náklady zaznamenány pomocí `recordCost()` + +### 🔒 Bezpečnost + +- **deps** : Next.js 16.1.6 → 16.1.7 — opravuje 6 CVE: + - **Kritické** : CVE-2026-29057 (pašování HTTP požadavků přes http-proxy) + - **Vysoká** : CVE-2026-27977, CVE-2026-27978 (WebSocket + akce serveru) + - **Médium** : CVE-2026-27979, CVE-2026-27980, CVE-2026-jcc7 + +### 📁 Nové soubory + +Soubor | Účel +--- | --- +`open-sse/handlers/search.ts` | Vyhledávací obslužná rutina s routováním 5 poskytovatelů +`open-sse/config/searchRegistry.ts` | Registr poskytovatelů (autorizace, náklady, kvóta, TTL) +`open-sse/services/searchCache.ts` | Mezipaměť v paměti se slučováním požadavků +`src/app/api/v1/search/route.ts` | Trasa Next.js (POST + GET) +`src/app/api/v1/search/analytics/route.ts` | API pro statistiky vyhledávání +`src/app/(dashboard)/dashboard/analytics/SearchAnalyticsTab.tsx` | Karta analytického panelu +`src/lib/db/migrations/007_search_request_type.sql` | Migrace databáze +`tests/unit/search-registry.test.mjs` | 277 řádků jednotkových testů + +--- + +## [2.7.0] — 17. 3. 2026 + +> Sprint: Funkce inspirované ClawRouterem – příznak volání toolCalling, vícejazyčná detekce záměru, benchmarkem řízený fallback, deduplikace požadavků, plugin RouterStrategy, ceny Grok-4 Fast + GLM-5 + MiniMax M2.5 + Kimi K2.5. + +### ✨ Nové modely a ceny + +- **feat. (ceny)** : xAI Grok-4 Fast — `$0.20/$0.50 per 1M tokens` , latence 1143 ms p50, podpora volání nástrojů +- **feat. (ceny)** : xAI Grok-4 (standardní) — `$0.20/$1.50 per 1M tokens` , což je důvodem k odmítnutí. +- **výkon (ceny)** : GLM-5 přes Z.AI — `$0.5/1M` , 128 tisíc výstupních kontextů +- **výkon (ceny)** : MiniMax M2.5 — `$0.30/1M input` , uvažování + agentní úkoly +- **feat.(ceny)** : DeepSeek V3.2 — aktualizované ceny `$0.27/$1.10 per 1M` +- **výkon (cena)** : Kimi K2.5 přes Moonshot API — přímý přístup k Moonshot API +- **feat(providers)** : Přidán poskytovatel Z.AI (alias `zai` ) — rodina GLM-5 s výstupem 128K + +### 🧠 Směrovací inteligence + +- **feat(registry)** : příznak `toolCalling` pro každý model v registru poskytovatelů – kombinace nyní mohou preferovat/vyžadovat modely s možností volání nástrojů +- **feat(scoring)** : Detekce vícejazyčného záměru pro skórování AutoCombo — skriptové/jazykové vzory PT/ZH/ES/AR ovlivňují výběr modelu podle kontextu požadavku +- **feat(fallback)** : Řetězce záložních metod řízené benchmarky — skutečná data o latenci (p50 z `comboMetrics` ) používaná k dynamickému přeskupení priorit záložních metod +- **feat(dedup)** : Vyžádání deduplikace pomocí content-hash — 5sekundové okno idempotence zabraňuje duplicitním voláním poskytovatele v opakovaném pokusu o odeslání klientům +- **feat(router)** : Připojitelné rozhraní `RouterStrategy` v `autoCombo/routerStrategy.ts` — lze vložit vlastní logiku směrování bez úpravy jádra + +### 🔧 Vylepšení serveru MCP + +- **feat(mcp)** : 2 nová pokročilá schémata nástrojů: `omniroute_get_provider_metrics` (p50/p95/p99 na poskytovatele) a `omniroute_explain_route` (vysvětlení rozhodnutí o směrování) +- **feat(mcp)** : Aktualizovány rozsahy autorizace nástroje MCP – přidán rozsah `metrics:read` pro nástroje pro metriky poskytovatelů +- **feat(mcp)** : `omniroute_best_combo_for_task` nyní akceptuje parametr `languageHint` pro vícejazyčné směrování + +### 📊 Pozorovatelnost + +- **feat(metrics)** : Soubor `comboMetrics.ts` rozšířen o sledování percentilů latence v reálném čase pro každého poskytovatele/účet. +- **feat(health)** : Rozhraní Health API ( `/api/monitoring/health` ) nyní vrací pole `p50Latency` a `errorRate` pro každého poskytovatele. +- **feat(usage)** : Migrace historie použití pro sledování latence pro jednotlivé modely + +### 🗄️ Migrace databází + +- **feat(migrations)** : Nový sloupec `latency_p50` v tabulce `combo_metrics` — nulový, bezpečný pro stávající uživatele + +### 🐛 Opravy chyb / Uzavření + +- **close(#411)** : rozlišení hašovaných modulů better-sqlite3 ve Windows — opraveno ve verzi 2.6.10 (f02c5b5) +- **close(#409)** : Dokončení chatu GitHub Copilot selhává u modelů Claude při připojení souborů – opraveno ve verzi 2.6.9 (838f1d6) +- **close(#405)** : Duplikát #411 – vyřešeno + +## [2.6.10] — 17. 3. 2026 + +> Oprava pro Windows: stažení předkompilovaného better-sqlite3 bez node-gyp/Pythonu/MSVC (#426). + +### 🐛 Opravy chyb + +- **fix(install/#426)** : Ve Windows dříve selhával příkaz `npm install -g omniroute` s `better_sqlite3.node is not a valid Win32 application` , protože přiložený nativní binární soubor byl zkompilován pro Linux. Přidává **strategii 1.5** do `scripts/postinstall.mjs` : používá `@mapbox/node-pre-gyp install --fallback-to-build=false` (přiloženo v rámci `better-sqlite3` ) ke stažení správného předkompilovaného binárního souboru pro aktuální OS/arch bez nutnosti použití jakýchkoli nástrojů pro sestavení (žádný node-gyp, žádný Python, žádný MSVC). Vrací se k `npm rebuild` pouze v případě, že stahování selže. Přidává chybové zprávy specifické pro platformu s jasnými pokyny k ruční opravě. + +--- + +## [2.6.9] — 17. 3. 2026 + +> Opravy CI (t11 s libovolným rozpočtem), oprava chyby č. 409 (souborové přílohy přes Copilot+Claude), korekce pracovního postupu vydání. + +### 🐛 Opravy chyb + +- **fix(ci)** : Odstranění slova „any“ z komentářů v `openai-responses.ts` a `chatCore.ts` , které neprošly kontrolou rozpočtu t11 `\bany\b` (falešně pozitivní výsledek z počítání regexů v komentářích). +- **oprava(chatCore)** : Normalizovat nepodporované typy částí obsahu před přeposláním poskytovatelům (#409 — Kurzor odesílá `{type:"file"}` když jsou připojeny soubory `.md` ; Copilot a další poskytovatelé kompatibilní s OpenAI odmítají s "type musí být buď 'image_url', nebo 'text'"; oprava převádí bloky `file` / `document` na `text` a odstraňuje neznámé typy) + +### 🔧 Pracovní postup + +- **chore(generate-release)** : Přidat pravidlo pro atomický commit — navýšení verze ( `npm version patch` ) MUSÍ proběhnout před commitem souborů funkcí, aby se zajistilo, že tag vždy ukazuje na commit obsahující všechny změny verzí dohromady. + +--- + +## [2.6.8] — 17. 3. 2026 + +> Sprint: Kombinace jako agent (systémový příkaz + filtr nástrojů), ochrana kontextového ukládání do mezipaměti, automatická aktualizace, podrobné protokoly, MITM Kiro IDE. + +### 🗄️ Migrace databází (bez nutnosti aktualizace – bezpečné pro stávající uživatele) + +- **005_combo_agent_fields.sql** : `ALTER TABLE combos ADD COLUMN system_message TEXT DEFAULT NULL` , `tool_filter_regex TEXT DEFAULT NULL` , `context_cache_protection INTEGER DEFAULT 0` +- **006_detailed_request_logs.sql** : Nová tabulka `request_detail_logs` s triggerem kruhového bufferu s 500 záznamy, možnost přihlášení přes přepínač nastavení + +### ✨ Funkce + +- **feat(combo)** : Přepsání systémových zpráv pro Combo (#399 — pole `system_message` nahrazuje nebo vkládá systémový výzvu před přesměrováním poskytovateli) +- **feat(combo)** : Regulární výraz filtru nástrojů pro každou kombinaci (#399 — `tool_filter_regex` uchovává pouze nástroje odpovídající vzoru; podporuje formáty OpenAI + Anthropic) +- **feat(combo)** : Ochrana před ukládáním do mezipaměti kontextu (#401 — `context_cache_protection` označuje odpovědi s `provider/model` a modelem pins pro zajištění kontinuity relace) +- **feat(settings)** : Automatická aktualizace přes Nastavení (#320 — `GET /api/system/version` + `POST /api/system/update` — kontroluje registr npm a aktualizuje na pozadí s restartem pm2) +- **feat(logs)** : Podrobné protokoly požadavků (#378 — zachycuje kompletní těla procesů ve 4 fázích: požadavek klienta, přeložený požadavek, odpověď poskytovatele, odpověď klienta — přepínání přihlášení, ořezávání na 64 kB, kruhová vyrovnávací paměť s 500 záznamy) +- **feat(mitm)** : Profil MITM Kiro IDE (#336 — `src/mitm/targets/kiro.ts` cílí na api.anthropic.com, znovu využívá stávající infrastrukturu MITM) + +--- + +## [2.6.7] — 17. 3. 2026 + +> Sprint: Vylepšení SSE, rozšíření lokálních provider_nodes, registr proxy, opravy Claude passthrough. + +### ✨ Funkce + +- **feat(health)** : Kontrola stavu lokálních `provider_nodes` na pozadí s exponenciálním zpožděním (30s→300s) a `Promise.allSettled` pro zamezení blokování (#423, @Regis-RCR) +- **feat(embeddings)** : Směrování `/v1/embeddings` do lokálních uzlů `provider_nodes` — `buildDynamicEmbeddingProvider()` s ověřením názvu hostitele (#422, @Regis-RCR) +- **feat(audio)** : Směrování TTS/STT do lokálních `provider_nodes` — `buildDynamicAudioProvider()` s ochranou SSRF (#416, @Regis-RCR) +- **feat(proxy)** : Registr proxy, API pro správu a zobecnění limitů kvót (#429, @Regis-RCR) + +### 🐛 Opravy chyb + +- **fix(sse)** : Odstranění polí specifických pro Claude ( `metadata` , `anthropic_version` ), pokud je cíl kompatibilní s OpenAI (#421, @prakersh) +- **fix(sse)** : Extrahuje využití Claude SSE ( `input_tokens` , `output_tokens` , cache tokeny) v režimu průchozího streamu (#420, @prakersh) +- **fix(sse)** : Generování záložního `call_id` pro volání nástrojů s chybějícími/prázdnými ID (#419, @prakersh) +- **oprava(sse)** : Průchod mezi Claudey a Claudey — přední tělo zcela nedotčeno, bez opětovného překladu (#418, @prakersh) +- **fix(sse)** : Filtrovat osiřelé položky `tool_result` po zhuštění kontextu Claude Code, aby se zabránilo chybám 400 (#417, @prakersh) +- **fix(sse)** : Přeskočit volání nástrojů s prázdnými názvy v překladači Responses API, aby se zabránilo nekonečným smyčkám `placeholder_tool` (#415, @prakersh) +- **fix(sse)** : Odstranění prázdných bloků textového obsahu před překladem (#427, @prakersh) +- **fix(api)** : Přidáno `refreshable: true` do testovací konfigurace Claude OAuth (#428, @prakersh) + +### 📦 Závislosti + +- Zvýšení `vitest` , `@vitest/*` a související devDependencies (#414, @dependabot) + +--- + +## [2.6.6] — 17. 3. 2026 + +> Oprava: Kompatibilita s Turbopackem/Dockerem — odebrání protokolu `node:` ze všech importů `src/` . + +### 🐛 Opravy chyb + +- **fix(build)** : Z příkazů `import` v 17 souborech v `src/` byl odstraněn prefix `node:` protocol. Importy `node:fs` , `node:path` , `node:url` , `node:os` atd. způsobovaly, že `Ecmascript file had an error` v sestaveních Turbopack (Next.js 15 Docker) a při upgradech ze starších globálních instalací npm. Dotčené soubory: `migrationRunner.ts` , `core.ts` , `backup.ts` , `prompts.ts` , `dataPaths.ts` a 12 dalších v `src/app/api/` a `src/lib/` . +- **chore(workflow)** : Aktualizován `generate-release.md` , aby synchronizace Docker Hubu a nasazení duálního VPS zahrnovaly **povinné** kroky v každé verzi. + +--- + +## [2.6.5] — 17. 3. 2026 + +> Sprint: filtrování parametrů modelu uvažování, oprava chyby 404 lokálního poskytovatele, poskytovatel Kilo Gateway, vylepšení závislostí. + +### ✨ Nové funkce + +- **feat(api)** : Přidán **Kilo Gateway** ( `api.kilo.ai` ) jako nový poskytovatel API klíčů (alias `kg` ) — více než 335 modelů, 6 bezplatných modelů, 3 modely automatického směrování ( `kilo-auto/frontier` , `kilo-auto/balanced` , `kilo-auto/free` ). Průchozí modely podporovány přes endpoint `/api/gateway/models` . (PR #408 od @Regis-RCR) + +### 🐛 Opravy chyb + +- **fix(sse)** : Odstranění nepodporovaných parametrů pro modely uvažování (o1, o1-mini, o1-pro, o3, o3-mini). Modely v rodině `o1` / `o3` odmítají `temperature` , `top_p` , `frequency_penalty` , `presence_penalty` , `logprobs` , `top_logprobs` a `n` s HTTP 400. Parametry jsou nyní odstraňovány na vrstvě `chatCore` před přeposíláním. Používá deklarativní pole `unsupportedParams` pro každý model a předpočítanou mapu O(1) pro vyhledávání. (PR #412 od @Regis-RCR) +- **fix(sse)** : Kód 404 lokálního poskytovatele nyní vede k **uzamčení pouze modelu (5 sekund)** namísto uzamčení na úrovni připojení (2 minuty). Když lokální inferenční backend (Ollama, LM Studio, oMLX) vrátí kód 404 pro neznámý model, připojení zůstane aktivní a ostatní modely okamžitě pokračují v práci. Také opravuje již existující chybu, kdy `model` nebyl předán funkci `markAccountUnavailable()` . Lokální poskytovatelé detekováni pomocí názvu hostitele ( `localhost` , `127.0.0.1` , `::1` , rozšiřitelné pomocí proměnné prostředí `LOCAL_HOSTNAMES` ). (PR #410 od @Regis-RCR) + +### 📦 Závislosti + +- `better-sqlite3` 12.6.2 → 12.8.0 +- `undici` 7.24.2 → 7.24.4 +- `https-proxy-agent` 7 → 8 +- `agent-base` 7 → 8 + +--- + +## [2.6.4] — 17. 3. 2026 + +### 🐛 Opravy chyb + +- **fix(providers)** : Odstraněny neexistující názvy modelů u 5 poskytovatelů: + - **gemini / gemini-cli** : odstraněny `gemini-3.1-pro/flash` a `gemini-3-*-preview` (neexistují v Google API v1beta); nahrazeny `gemini-2.5-pro` , `gemini-2.5-flash` , `gemini-2.0-flash` , `gemini-1.5-pro/flash` + - **antigravity** : odstraněny `gemini-3.1-pro-high/low` a `gemini-3-flash` (neplatné interní aliasy); nahrazeny skutečnými modely z verze 2.x + - **github (Copilot)** : odstraněny `gemini-3-flash-preview` a `gemini-3-pro-preview` ; nahrazeny `gemini-2.5-flash` + - **nvidia** : opraveno `nvidia/llama-3.3-70b-instruct` → `meta/llama-3.3-70b-instruct` (NVIDIA NIM používá pro modely Meta jmenný prostor `meta/` /); přidány `nvidia/llama-3.1-70b-instruct` a `nvidia/llama-3.1-405b-instruct` +- **fix(db/combo)** : Aktualizováno `free-stack` combo na vzdálené databázi: odstraněno `qw/qwen3-coder-plus` (prošlý obnovovací token), opraveno `nvidia/llama-3.3-70b-instruct` → `nvidia/meta/llama-3.3-70b-instruct` , opraveno `gemini/gemini-3.1-flash` → `gemini/gemini-2.5-flash` , přidáno `if/deepseek-v3.2` + +--- + +## [2.6.3] — 16. 3. 2026 + +> Sprint: hash-strip zod/pino zapečený do build pipeline, přidán syntetický poskytovatel, opravena cesta VPS PM2. + +### 🐛 Opravy chyb + +- **fix(build)** : Turbopack hash-strip se nyní spouští při **kompilaci** pro VŠECHNY balíčky — nejen `better-sqlite3` . Krok 5.6 v `prepublish.mjs` prochází každý `.js` v `app/.next/server/` a odstraňuje 16znakovou hexadecimální příponu z jakékoli hashované `require()` . Opravuje `zod-dcb22c...` , `pino-...` atd. MODULE_NOT_FOUND u globálních instalací npm. Zavírá #398. +- **Oprava (nasazení)** : PM2 na obou VPS ukazoval na zastaralé adresáře git-clone. V globálním balíčku npm překonfigurováno na `app/server.js` . Aktualizován pracovní postup `/deploy-vps` pro použití `npm pack + scp` (registr npm odmítá balíčky o velikosti 299 MB). + +### ✨ Funkce + +- **feat(provider)** : Synthetic ( [synthetic.new](https://synthetic.new) ) — inference kompatibilní s OpenAI zaměřená na soukromí. `passthroughModels: true` pro dynamický katalog modelů HuggingFace. Počáteční modely: Kimi K2.5, MiniMax M2.5, GLM 4.7, DeepSeek V3.2. (PR #404 od @Regis-RCR) + +### 📋 Problémy uzavřeny + +- **zavřít #398** : regrese hashování npm — opraveno hashováním při kompilaci v prepublish +- **triáž č. 324** : Snímek obrazovky s chybou bez kroků – požadovány podrobnosti o reprodukci + +--- + +## [2.6.2] — 16. 3. 2026 + +> Sprint: hashování modulů kompletně opraveno, sloučeny 2 PR (filtr Anthropic tools + vlastní cesty k endpointům), přidán poskytovatel Alibaba Cloud DashScope, uzavřeny 3 zastaralé problémy. + +### 🐛 Opravy chyb + +- **fix(build)** : Rozšířeno hashování `externals` webpacku tak, aby zahrnovalo VŠECHNY `serverExternalPackages` , nejen `better-sqlite3` . Next.js 16 Turbopack hashuje `zod` , `pino` a všechny ostatní externí balíčky serveru do názvů jako `zod-dcb22c6336e0bc69` , které za běhu v `node_modules` neexistují. HASH_PATTERN regex catch-all nyní odstraňuje 16znakovou příponu a vrací se k základnímu názvu balíčku. Také přidána `NEXT_PRIVATE_BUILD_WORKER=0` v `prepublish.mjs` pro posílení režimu webpacku a následné skenování po sestavení, které hlásí všechny zbývající hashované reference. (#396, #398, PR #403) +- **fix(chat)** : Názvy nástrojů v anthropic formátu ( `tool.name` bez wrapperu `.function` ) byly tiše vynechány filtrem prázdných názvů zavedeným v bodě #346. LiteLLM proxyuje požadavky s prefixem `anthropic/` ve formátu Anthropic Messages API, což způsobuje filtrování všech nástrojů a Anthropic vrací chybu `400: tool_choice.any may only be specified while providing tools` . Opraveno návratem k `tool.name` , když chybí `tool.function.name` . Přidáno 8 regresních jednotkových testů. (PR #397) + +### ✨ Funkce + +- **feat(api)** : Vlastní cesty koncových bodů pro uzly poskytovatelů kompatibilní s OpenAI — konfigurace `chatPath` a `modelsPath` pro každý uzel (např. `/v4/chat/completions` ) v uživatelském rozhraní pro připojení poskytovatele. Zahrnuje migraci databáze ( `003_provider_node_custom_paths.sql` ) a sanitizaci cesty URL (bez `..` traversal, musí začínat znakem `/` ). (PR #400) +- **feat(provider)** : Alibaba Cloud DashScope přidán jako poskytovatel kompatibilní s OpenAI. Mezinárodní endpoint: `dashscope-intl.aliyuncs.com/compatible-mode/v1` . 12 modelů: `qwen-max` , `qwen-plus` , `qwen-turbo` , `qwen3-coder-plus/flash` , `qwq-plus` , `qwq-32b` , `qwen3-32b` , `qwen3-235b-a22b` . Autorizace: Nosný API klíč. + +### 📋 Problémy uzavřeny + +- **zavřít #323** : Chyba připojení Cline `[object Object]` – opraveno ve verzi 2.3.7; uživateli bylo doručeno pokyny k upgradu z verze 2.2.9 +- **zavřít #337** : Sledování úvěru Kiro — implementováno ve verzi 2.5.5 (#381); odkázalo uživatele na Dashboard → Použití +- **triage #402** : Poškozený soubor ARM64 macOS DMG – požadovaná verze macOS, přesná chyba a doporučené alternativní řešení `xattr -d com.apple.quarantine` + +--- + +## [2.6.1] — 15. 3. 2026 + +> Kritická oprava při spuštění: Globální instalace npm v2.6.0 havarovaly s chybou 500 kvůli chybě hashování názvů modulů Turbopack/webpack v instrumentačním hooku Next.js 16. + +### 🐛 Opravy chyb + +- **fix(build)** : Vynutit, aby byl `better-sqlite3` vždy vyžadován přesným názvem balíčku v balíčku webpack server. Next.js 16 zkompiloval instrumentační hook do samostatného chunku a vygeneroval `require('better-sqlite3-')` — hashovaný název modulu, který neexistuje v `node_modules` — přestože byl balíček uveden v `serverExternalPackages` . Do konfigurace webpacku serveru byla přidána explicitní funkce `externals` , takže bundler vždy vygeneruje `require('better-sqlite3')` , čímž se vyřeší `500 Internal Server Error` při spuštění čistých globálních instalací. (#394, PR #395) + +### 🔧 CI + +- **ci** : Do `npm-publish.yml` přidána `workflow_dispatch` se zabezpečením synchronizace verzí pro manuální spouštěče (#392). +- **ci** : Přidán `workflow_dispatch` do `docker-publish.yml` , aktualizovány akce GitHubu na nejnovější verze (#392) + +--- + +## [2.6.0] - 15. 3. 2026 + +> Sprint řešení problémů: Opraveny 4 chyby, vylepšeno uživatelské rozhraní protokolů, přidáno sledování kreditů Kiro. + +### 🐛 Opravy chyb + +- **oprava(média)** : ComfyUI a SD WebUI se již nezobrazují v seznamu poskytovatelů na stránce Média, pokud nejsou nakonfigurovány — při připojení načtou `/api/providers` a skryjí lokální poskytovatele bez připojení (#390) +- **oprava(auth)** : Round-robin již po zpoždění znovu nevybírá účty s omezenou rychlostí ihned – `backoffLevel` se nyní používá jako primární třídicí klíč v rotaci LRU (#340) +- **oprava(oauth)** : iFlow (a další poskytovatelé, kteří přesměrovávají na své vlastní uživatelské rozhraní) již nenechávají modální okno OAuth zaseknuté na „Čekání na autorizaci“ – detektor zavřených vyskakovacích oken automaticky přechází do režimu ručního zadávání URL (#344) +- **oprava(logy)** : Tabulka protokolů požadavků je nyní čitelná ve světlém režimu – stavové odznaky, počty tokenů a kombinované tagy používají adaptivní `dark:` barevné třídy (#378) + +### ✨ Funkce + +- **feat(kiro)** : Do fetcheru využití přidáno sledování kreditů Kiro — dotazy `getUserCredits` z endpointu AWS CodeWhisperer (#337) + +### 🛠 Domácí práce + +- **chore(tests)** : Zarovnání `test:plan3` , `test:fixes` , `test:security` pro použití stejného zavaděče `tsx/esm` jako u `npm test` – eliminuje falešně negativní výsledky rozlišení modulů v cílených bězích (PR #386) + +--- + +## [2.5.9] - 15. 3. 2026 + +> Oprava nativní passthrough Codexu + posílení validace těla trasy. + +### 🐛 Opravy chyb + +- **fix(codex)** : Zachovává nativní průchod Responses API pro klienty Codexu – zabraňuje zbytečným mutacím překladu (PR #387) +- **fix(api)** : Ověřování těl požadavků na trasách pro stanovení cen/synchronizaci a směrování úloh – zabraňuje pádům způsobeným chybně formátovanými vstupy (PR #388) +- **fix(auth)** : Tajné hodnoty JWT přetrvávají i po restartech pomocí `src/lib/db/secrets.ts` — eliminuje chyby 401 po restartu PM2 (PR #388) + +--- + +## [2.5.8] - 15. 3. 2026 + +> Oprava sestavení: obnovení připojení VPS přerušeného nedokončeným publikováním v2.5.7. + +### 🐛 Opravy chyb + +- **oprava(build)** : `scripts/prepublish.mjs` se stále používají, zastaralý příznak `--webpack` způsobuje tiché selhání samostatného sestavení Next.js — publikování npm dokončeno bez `app/server.js` , což narušuje nasazení VPS + +--- + +## [2.5.7] - 15. 3. 2026 + +> Opravy chyb při zpracování v Media Playground. + +### 🐛 Opravy chyb + +- **oprava(média)** : Přepis „Vyžadován klíč API“ falešně pozitivní, pokud zvuk neobsahuje žádnou řeč (hudba, ticho) – nyní se místo toho zobrazuje „Není detekována žádná řeč“ +- **oprava(media)** : `upstreamErrorResponse` v `audioTranscription.ts` a `audioSpeech.ts` nyní vrací správný JSON ( `{error:{message}}` ), což umožňuje správnou detekci chyb přihlašovacích údajů 401/403 v MediaPageClient +- **oprava(média)** : `parseApiError` nyní zpracovává pole `err_msg` v Deepgramu a detekuje `"api key"` v chybových zprávách pro přesnou klasifikaci chyb přihlašovacích údajů. + +--- + +## [2.5.6] - 15. 3. 2026 + +> Kritické opravy zabezpečení/autentizace: OAuth v Antigravity nefunkční + relace JWT ztraceny po restartu. + +### 🐛 Opravy chyb + +- **fix(oauth) #384** : Antigravity Google OAuth nyní správně odesílá `client_secret` do koncového bodu tokenu. Záložní volbou pro `ANTIGRAVITY_OAUTH_CLIENT_SECRET` byl prázdný řetězec, což je chyba – `client_secret` tedy nebyl v požadavku nikdy zahrnut, což způsobovalo chyby `"client_secret is missing"` u všech uživatelů bez vlastní proměnné prostředí. Zavírá #383. +- **fix(auth) #385** : `JWT_SECRET` je nyní ukládán do SQLite ( `namespace='secrets'` ) při první generaci a znovu načten při následných spuštěních. Dříve byl při každém spuštění procesu generován nový náhodný tajný klíč, který po jakémkoli restartu nebo upgradu zneplatňoval všechny existující soubory cookie/relace. Ovlivňuje `JWT_SECRET` i `API_KEY_SECRET` . Zavírá #382. + +--- + +## [2.5.5] - 15. 3. 2026 + +> Oprava odstranění duplicitních dat v seznamu modelů, posílení samostatného sestavení Electronu a sledování kreditů Kiro. + +### 🐛 Opravy chyb + +- **fix(models) #380** : `GET /api/models` nyní zahrnuje aliasy poskytovatelů při sestavování filtru aktivního poskytovatele — modely pro `claude` (alias `cc` ) a `github` (alias `gh` ) se vždy zobrazovaly bez ohledu na to, zda bylo nakonfigurováno připojení, protože klíče `PROVIDER_MODELS` jsou aliasy, ale připojení k databázi jsou uložena pod ID poskytovatelů. Opraveno rozšířením každého aktivního ID poskytovatele o jeho alias pomocí `PROVIDER_ID_TO_ALIAS` . Zavírá #353. +- **fix(electron) #379** : Nové `scripts/prepare-electron-standalone.mjs` připraví vyhrazený balíček `/.next/electron-standalone` před zabalením Electronu. Pokud je `node_modules` symbolický odkaz, dojde k ukončení s chybou (electron-builder by na sestavovací stroj odeslal běhovou závislost). Multiplatformní sanitizace cest pomocí `path.basename` . Od @kfiramar. + +### ✨ Nové funkce + +- **feat(kiro) #381** : Sledování zůstatku kreditů Kiro — koncový bod využití nyní vrací data o kreditech pro Kiro účty voláním `codewhisperer.us-east-1.amazonaws.com/getUserCredits` (stejný koncový bod, který Kiro IDE používá interně). Vrací zbývající kredity, celkový limit, datum obnovení a úroveň předplatného. Uzavírá #337. + +## [2.5.4] - 15. 3. 2026 + +> Oprava spouštění loggeru, oprava zabezpečení přihlašovacího bootstrapu a vylepšení spolehlivosti vývojářského HMR. Zlepšení infrastruktury CI. + +### 🐛 Opravy chyb (PR #374, #375, #376 od @kfiramar) + +- **oprava(logger) #376** : Obnovit cestu k protokolovacímu modulu pino transport — `formatters.level` v kombinaci s `transport.targets` je odmítnut modulem pino. Konfigurace založené na transportu nyní odstraňují formátovač úrovní pomocí funkce `getTransportCompatibleConfig()` . Také opravuje numerické mapování úrovní v `/api/logs/console` : `30→info, 40→warn, 50→error` (bylo posunuto o jednu). +- **oprava(login) #375** : Přihlašovací stránka se nyní bootuje z veřejného endpointu `/api/settings/require-login` namísto chráněného `/api/settings` . V nastaveních chráněných heslem dostávala stránka předběžného ověřování chybu 401 a zbytečně se vracela k bezpečným výchozím hodnotám. Veřejná trasa nyní vrací všechna bootstrapová metadata ( `requireLogin` , `hasPassword` , `setupComplete` ) s konzervativní fallback chybou 200. +- **oprava(dev) #374** : Přidání `localhost` a `127.0.0.1` do `allowedDevOrigins` v `next.config.mjs` — HMR websocket byl blokován při přístupu k aplikaci přes loopback adresu, což opakovaně produkovalo varování cross-origin. + +### 🔧 CI a infrastruktura + +- **Oprava chyb ESLint OOM** : `eslint.config.mjs` nyní ignoruje `vscode-extension/**` , `electron/**` , `docs/**` , `app/.next/**` a `clipr/**` — ESLint havaroval s chybou JS haldy OOM skenováním binárních blobů a kompilovaných chunků VS Code. +- **Oprava jednotkového testu** : Z 2 testovacích souborů byl odstraněn zastaralý `ALTER TABLE provider_connections ADD COLUMN "group"` – sloupec je nyní součástí základního schématu (přidáno v #373), což způsobovalo `SQLITE_ERROR: duplicate column name` při každém spuštění CI. +- **Pre-commit hook** : Do `.husky/pre-commit` přidán `npm run test:unit` — unit testy nyní blokují poškozené commity dříve, než se dostanou do CI. + +## [2.5.3] - 14. 3. 2026 + +> Opravy kritických chyb: migrace schématu databáze, načítání spouštěcího prostředí, mazání chyb poskytovatele a oprava popisků i18n. Vylepšení kvality kódu nad každým PR. + +### 🐛 Opravy chyb (PR #369, #371, #372, #373 od @kfiramar) + +- **oprava(db) #373** : Přidání sloupce `provider_connections.group` do základního schématu + migrace zpětného doplnění pro existující databáze — sloupec byl použit ve všech dotazech, ale chyběl v definici schématu +- **fix(i18n) #371** : Nahrazení neexistujícího klíče `t("deleteConnection")` existujícím `providers.delete` — oprava `MISSING_MESSAGE: providers.deleteConnection` na stránce s podrobnostmi o poskytovateli +- **oprava(auth) #372** : Vymazat zastaralá chybová metadata ( `errorCode` , `lastErrorType` , `lastErrorSource` ) z účtů poskytovatelů po skutečném zotavení – dříve se obnovené účty zobrazovaly jako selhané +- **oprava(startup) #369** : Sjednocení načítání env napříč `npm run start` , `run-standalone.mjs` a Electron s ohledem na prioritu `DATA_DIR/.env → ~/.omniroute/.env → ./.env` — zabránění generování nového `STORAGE_ENCRYPTION_KEY` přes existující šifrovanou databázi + +### 🔧 Kvalita kódu + +- Zdokumentované vzory `result.success` vs. `response?.ok` v `auth.ts` (oba úmyslné, nyní vysvětlené) +- Normalizované `overridePath?.trim()` v `electron/main.js` pro shodu s `bootstrap-env.mjs` +- Přidán komentář k objednávce sloučení `preferredEnv` při spuštění Electronu + +> Oprava kvót pro účty Codex s automatickou rotací, rychlým přepínáním úrovní, modelem gpt-5.4 a označením analytických nástrojů. + +### ✨ Nové funkce (PR #366, #367, #368) + +- **Zásady kvót Codexu (PR #366)** : Okno kvóty 5 hodin/týden pro účet se přepíná v dashboardu poskytovatele. Účty jsou automaticky přeskočeny, když povolená okna dosáhnou prahové hodnoty 90 %, a znovu povoleny po `resetAt` . Zahrnuje `quotaCache.ts` s vedlejším efektem pro získávání statusu zdarma. +- **Přepínání rychlé úrovně Codexu (PR #367)** : Dashboard → Nastavení → Úroveň služeb Codexu. Přepínání ve výchozím nastavení vkládá `service_tier: "flex"` pouze pro požadavky Codexu, což snižuje náklady o ~80 %. Celý stack: karta UI + koncový bod API + exekutor + překladač + obnovení po spuštění. +- **Model gpt-5.4 (PR #368)** : Přidává `cx/gpt-5.4` a `codex/gpt-5.4` do registru modelů Codex. Regresní test je součástí. + +### 🐛 Opravy chyb + +- **oprava č. 356** : Analytické grafy (Nejlepší poskytovatel, Podle účtu, Rozdělení poskytovatelů) nyní zobrazují lidsky čitelné názvy/štítky poskytovatelů namísto nezpracovaných interních ID u poskytovatelů kompatibilních s OpenAI. + +> Hlavní vydání: strategie striktně náhodného směrování, řízení přístupu k klíčům API, skupiny připojení, synchronizace externích cen a opravy kritických chyb pro modely myšlení, kombinované testování a validaci názvů nástrojů. + +### ✨ Nové funkce (PR #363 a #365) + +- **Strategie striktně náhodného směrování** : Fisher-Yatesův náhodný balíček s garancí neopakování a serializací mutexů pro souběžné požadavky. Nezávislé balíčky pro každé kombo a providera. +- **Řízení přístupu ke klíčům API** : `allowedConnections` (omezení připojení, která může klíč používat), `is_active` (povolení/zakázání klíče s kódem 403), `accessSchedule` (řízení přístupu na základě času), přepínání `autoResolve` , přejmenování klíčů pomocí PATCH. +- **Skupiny připojení** : Seskupování připojení poskytovatelů podle prostředí. Harmonické zobrazení na stránce Limity s perzistencí localStorage a inteligentním automatickým přepínáním. +- **Synchronizace externích cen (LiteLLM)** : 3stupňové rozlišení cen (uživatelské přepsání → synchronizace → výchozí hodnoty). Možnost přihlášení přes `PRICING_SYNC_ENABLED=true` . Nástroj MCP `omniroute_sync_pricing` . 23 nových testů. +- **i18n** : 30 jazyků aktualizováno strategií striktní náhodnosti, řetězce pro správu klíčů API. pt-BR plně přeloženo. + +### 🐛 Opravy chyb + +- **Oprava č. 355** : Časový limit nečinnosti streamu zvýšen z 60 s na 300 s – zabraňuje přerušení modelů s rozšířeným myšlením (claude-opus-4-6, o3 atd.) během dlouhých fází uvažování. Konfigurovatelné pomocí `STREAM_IDLE_TIMEOUT_MS` . +- **Oprava č. 350** : Kombinovaný test nyní obchází `REQUIRE_API_KEY=true` pomocí interní hlavičky a univerzálně používá formát kompatibilní s OpenAI. Časový limit prodloužen z 15 s na 20 s. +- **oprava #346** : Nástroje s prázdným `function.name` (přeposláno Claudem Code) jsou nyní filtrovány předtím, než je obdrží upstreamoví poskytovatelé, čímž se zabrání chybám „Neplatný vstup[N].name: prázdný řetězec“. + +### 🗑️ Uzavřené problémy + +- **#341** : Sekce ladění odstraněna – nahrazena je `/dashboard/logs` a `/dashboard/health` . + +> Podpora API Key Round-Robin pro nastavení poskytovatelů s více klíči a potvrzení již zavedeného směrování zástupných znaků a rolování oken kvót. + +### ✨ Nové funkce + +- **Round-Robin klíčů API (T07)** : Připojení poskytovatelů nyní mohou obsahovat více klíčů API (Upravit připojení → Další klíče API). Požadavky rotují round-robin mezi primárními a dalšími klíči pomocí `providerSpecificData.extraApiKeys[]` . Klíče jsou uchovávány v paměti indexované pro každé připojení – nejsou nutné žádné změny schématu databáze. + +### 📝 Již implementováno (potvrzeno auditem) + +- **Směrování modelu s wildcard znaky (T13)** : soubor `wildcardRouter.ts` s porovnáváním zástupných znaků ve stylu glob ( `gpt*` , `claude-?-sonnet` atd.) je již integrován do `model.ts` s hodnocením specificity. +- **Posunování okna kvót (T08)** : `accountFallback.ts:isModelLocked()` již automaticky posouvá okno vpřed – pokud `Date.now() > entry.until` , zámek se okamžitě smaže (žádné blokování zastaralých funkcí). + +> Vylepšení uživatelského rozhraní, doplnění strategií směrování a elegantní zpracování chyb pro omezení využití. + +### ✨ Nové funkce + +- **Strategie směrování Fill-First a P2C** : Do výběru kombinované strategie přidány strategie `fill-first` (vyčerpání kvóty před přesunem) a `p2c` (výběr Power-of-Two-Choices s nízkou latencí) s kompletními panely s pokyny a barevně odlišenými odznaky. +- **Přednastavené modely Free Stack** : Vytvoření kombinace pomocí šablony Free Stack nyní automaticky vyplní 7 nejlepších modelů bezplatných poskytovatelů ve své třídě (Gemini CLI, Kiro, iFlow×2, Qwen, NVIDIA NIM, Groq). Uživatelé stačí aktivovat poskytovatele a ihned získají kombinaci 0 $/měsíc. +- **Širší kombo modální okno** : Modální okno pro vytvoření/úpravu komba nyní používá `max-w-4xl` pro pohodlnou úpravu velkých komb. + +### 🐛 Opravy chyb + +- **Stránka s limity HTTP 500 pro Codex a GitHub** : `getCodexUsage()` a `getGitHubUsage()` nyní vracejí uživatelsky přívětivou zprávu, když poskytovatel vrátí 401/403 (vypršelý token), místo aby vyvolaly chybu 500 na stránce s limity. +- **Falešně pozitivní MaintenanceBanner** : Banner již při načítání stránky falešně nezobrazuje „Server je nedostupný“. Opraveno okamžitým voláním `checkHealth()` při připojení a odstraněním zastaralého uzavření `show` -state. +- **Popisky ikon poskytovatele** : Tlačítka s ikonami pro úpravu (tužka) a odstranění v řádku připojení poskytovatele nyní obsahují nativní HTML popisky – všech 6 ikon akcí je nyní samodokumentovaných. + +> Několik vylepšení z analýzy problémů komunity, podpora nových poskytovatelů, opravy chyb pro sledování tokenů, směrování modelů a spolehlivost streamování. + +### ✨ Nové funkce + +- **Inteligentní směrování s ohledem na úlohy (T05)** : Automatický výběr modelu na základě typu obsahu požadavku — kódování → deepseek-chat, analýza → gemini-2.5-pro, vision → gpt-4o, sumarizace → gemini-2.5-flash. Konfigurovatelné v Nastavení. Nové API `GET/PUT/POST /api/settings/task-routing` . +- **Poskytovatel HuggingFace** : Přidán HuggingFace Router jako poskytovatel kompatibilní s OpenAI s Llama 3.1 70B/8B, Qwen 2.5 72B, Mistral 7B, Phi-3.5 Mini. +- **Poskytovatel Vertex AI** : Přidán poskytovatel Vertex AI (Google Cloud) s Gemini 2.5 Pro/Flash, Gemma 2 27B, Claude přes Vertex. +- **Nahrávání souborů do Playgroundu** : Nahrávání zvuku pro přepis, nahrávání obrázků pro modely vidění (automatická detekce podle názvu modelu), inline vykreslování obrázků pro výsledky generování obrázků. +- **Vizuální zpětná vazba při výběru modelu** : Již přidané modely v kombinovaném výběru nyní zobrazují zelený odznak ✓ – zabraňuje záměně duplicitních modelů. +- **Kompatibilita s Qwen (PR #352)** : Aktualizováno nastavení otisků uživatelského agenta a rozhraní CLI pro kompatibilitu s poskytovateli Qwen. +- **Správa stavu round-robin (PR #349)** : Vylepšená logika round-robin pro zpracování vyloučených účtů a správné udržování stavu rotace. +- **Uživatelská zkušenost se schránkou (PR #360)** : Vylepšené operace se schránkou s možností zálohování pro nezabezpečené kontexty; vylepšení normalizace nástroje Claude. + +### 🐛 Opravy chyb + +- **Oprava č. 302 – OpenAI SDK stream=False zanechává tool_calls** : T01 Accept header negotiation již nevynucuje streamování, pokud je `body.stream` explicitně `false` . Způsobovalo to tiché zanechávání tool_calls při použití OpenAI Python SDK v režimu bez streamování. +- **Oprava č. 73 — Claude Haiku směrován do OpenAI bez prefixu poskytovatele** : modely `claude-*` odeslané bez prefixu poskytovatele nyní správně směrují k poskytovateli `antigravity` (antropickému). Přidána také heuristika `gemini-*` / `gemma-*` → `gemini` . +- **Oprava č. 74 – Počet tokenů je pro streamování Antigravity/Claude vždy 0** : Událost SSE `message_start` , která obsahuje `input_tokens` nebyla analyzována funkcí `extractUsage()` , což způsobovalo pokles všech počtů vstupních tokenů. Sledování vstupních/výstupních tokenů nyní funguje správně pro streamované odpovědi. +- **Oprava č. 180 – Duplikáty importovaných modelů bez zpětné vazby** : `ModelSelectModal` nyní zobrazuje ✓ zelené zvýraznění u modelů, které jsou již v kombinaci, takže je zřejmé, že jsou již přidány. +- **Chyby generování mediálních stránek** : Výsledky obrázků se nyní vykreslují jako tagy `` místo nezpracovaného JSON. Výsledky přepisu se zobrazují jako čitelný text. Chyby přihlašovacích údajů zobrazují oranžový banner místo tiché chyby. +- **Tlačítko pro obnovení tokenu na stránce poskytovatele** : Pro poskytovatele OAuth bylo přidáno uživatelské rozhraní pro ruční obnovení tokenu. + +### 🔧 Vylepšení + +- **Registr poskytovatelů** : Do `providerRegistry.ts` a `providers.ts` (frontend) přidány prvky HuggingFace a Vertex AI. +- **Čtení mezipaměti** : Nový `src/lib/db/readCache.ts` pro efektivní ukládání do mezipaměti čtení databáze. +- **Mezipaměť kvót** : Vylepšená mezipaměť kvót s vyřazením na základě TTL. + +### 📦 Závislosti + +- `dompurify` → 3.3.3 (PR #347) +- `undici` → 7.24.2 (PR #348, #361) +- `docker/setup-qemu-action` → v4 (PR #342) +- `docker/setup-buildx-action` → v4 (PR #343) + +### 📁 Nové soubory + +Soubor | Účel +--- | --- +`open-sse/services/taskAwareRouter.ts` | Logika směrování s ohledem na úlohy (7 typů úloh) +`src/app/api/settings/task-routing/route.ts` | API pro konfiguraci směrování úloh +`src/app/api/providers/[id]/refresh/route.ts` | Ruční aktualizace tokenu OAuth +`src/lib/db/readCache.ts` | Efektivní mezipaměť pro čtení databáze +`src/shared/utils/clipboard.ts` | Zpevněná schránka s funkcí + +## [2.4.1] - 13. 3. 2026 + +### 🐛 Oprava + +- **Modální okno s kombinacemi: Šablona Volný zásobník viditelná a výrazná** – Šablona Volný zásobník byla skrytá (4. v mřížce se 3 sloupci). Opraveno: přesunuto na pozici 1, přepnuto na mřížku 2x2, takže jsou viditelné všechny 4 šablony, zelený okraj + zvýraznění odznaku ZDARMA. + +## [2.4.0] - 13. 3. 2026 + +> **Hlavní vydání** – ekosystém Free Stack, přepracované transkripční hřiště, více než 44 poskytovatelů, komplexní dokumentace k bezplatné úrovni a vylepšení uživatelského rozhraní napříč všemi oblastmi. + +### ✨ Funkce + +- **Kombinace: Šablona Free Stack** — Nová 4. šablona „Free Stack (0 $)“ využívající round-robin napříč Kiro + iFlow + Qwen + Gemini CLI. Při prvním použití doporučuje předpřipravenou kombinaci s nulovými náklady. +- **Média/Přepis: Deepgram jako výchozí** – Deepgram (Nova 3, 200 dolarů zdarma) je nyní výchozím poskytovatelem přepisu. AssemblyAI (50 dolarů zdarma) a Groq Whisper (navždy zdarma) jsou zobrazeny s odznaky bezplatného kreditu. +- **README: Sekce „Začít zdarma“** – Nová tabulka s 5 kroky v předběžném souboru README, která ukazuje, jak nastavit umělou inteligenci s nulovými náklady během několika minut. +- **README: Kombinace bezplatného přepisu** – Nová sekce s návrhem kombinací Deepgram/AssemblyAI/Groq a informacemi o bezplatném kreditu pro každého poskytovatele. +- **providers.ts: příznak hasFree** — NVIDIA NIM, Cerebras a Groq označené odznakem hasFree a freeNote pro uživatelské rozhraní poskytovatelů. +- **i18n: klíče templateFreeStack** — kombinovaná šablona Free Stack přeložená a synchronizovaná do všech 30 jazyků. + +## [2.3.16] - 13. 3. 2026 + +### 📖 Dokumentace + +- **README: 44+ poskytovatelů** — Všechny 3 výskyty výrazu „36+ poskytovatelů“ byly aktualizovány na „44+“, což odráží skutečný počet kódové základny (44 poskytovatelů v souboru providers.ts). +- **README: Nová sekce „🆓 Bezplatné modely – Co skutečně získáte“** – Přidána tabulka 7 poskytovatelů s limity rychlosti pro každý model pro: Kiro (Claude neomezeně přes AWS Builder ID), iFlow (5 modelů neomezeně), Qwen (4 modely neomezeně), Gemini CLI (180K/měsíc), NVIDIA NIM (~40 RPM dev-forever), Cerebras (1M tok/den / 60K TPM), Groq (30 RPM / 14.4K RPD). Zahrnuje doporučení pro kombinaci /usr/bin/bash Ultimate Free Stack. +- **Soubor README: Aktualizace cenové tabulky** – přidán Cerebras do úrovně API KEY, opravena změna NVIDIA z „1000 kreditů“ na „navždy zdarma pro vývojáře“, aktualizovány počty a názvy modelů iFlow/Qwen +- **README: Modely iFlow 8→5** (s názvy: kimi-k2-thinking, qwen3-coder-plus, deepseek-r1, minimax-m2, kimi-k2) +- **README: Modely Qwen 3→4** (s názvy: qwen3-coder-plus, qwen3-coder-flash, qwen3-coder-next, vision-model) + +## [2.3.15] - 13. 3. 2026 + +### ✨ Funkce + +- **Panel automatických kombinací (priorita úrovně)** : Přidána `🏷️ Tier` jako 7. faktor bodování v zobrazení rozpisu faktorů `/dashboard/auto-combo` – nyní je viditelných všech 7 faktorů bodování automatických kombinací. +- **i18n — sekce autoCombo** : Pro panel Auto-Combo bylo přidáno 20 nových překladových klíčů ( `title` , `status` , `modePack` , `providerScores` , `factorTierPriority` atd.) do všech 30 jazykových souborů. + +## [2.3.14] - 13. 3. 2026 + +### 🐛 Opravy chyb + +- **iFlow OAuth (#339)** : Obnoven platný výchozí `clientSecret` – dříve to byl prázdný řetězec, který při každém pokusu o připojení způsoboval chybu „Chybné přihlašovací údaje klienta“. Veřejné přihlašovací údaje jsou nyní výchozím záložním nastavením (lze je přepsat pomocí proměnné prostředí `IFLOW_OAUTH_CLIENT_SECRET` ). +- **MITM server nenalezen (#335)** : `prepublish.mjs` nyní kompiluje `src/mitm/*.ts` do JavaScriptu pomocí `tsc` před zkopírováním do npm balíčku. Dříve se kopírovaly pouze nezpracované soubory `.ts` – což znamenalo, že `server.js` nikdy neexistoval v globálních instalacích npm/Volta. +- **Chybí projectId v GeminiCLI (#338)** : Namísto vyvolání hardwarové chyby 500, když v uložených přihlašovacích údajích chybí `projectId` (např. po restartu Dockeru), OmniRoute nyní zaznamená varování a pokusí se o požadavek – vrátí smysluplnou chybu na straně poskytovatele místo pádu OmniRoute. +- **Neshoda verzí balíčku Electron (#323)** : Synchronizována verze `electron/package.json` s verzí `2.3.13` (dříve `2.0.13` ), takže binární verze pro stolní počítače odpovídá balíčku npm. + +### ✨ Nové modely (#334) + +- **Kiro** : `claude-sonnet-4` , `claude-opus-4.6` , `deepseek-v3.2` , `minimax-m2.1` , `qwen3-coder-next` , `auto` +- **Kodex** : `gpt5.4` + +### 🔧 Vylepšení + +- **Bodové hodnocení (API + validace)** : Do schématu Zod `ScoringWeights` a trasy API `combos/auto` přidána `tierPriority` (váha `0.05` ) – 7. faktor bodování je nyní plně akceptován rozhraním REST API a ověřován na vstupu. Váha `stability` upravena z `0.10` na `0.05` , aby celkový součet zůstal `1.0` . + +### ✨ Nové funkce + +- **Víceúrovňové bodování kvót (automatické kombinování)** : Přidána `tierPriority` jako 7. faktor bodování – účty s úrovněmi Ultra/Pro jsou nyní upřednostňovány před úrovněmi Free, pokud jsou ostatní faktory stejné. Nová volitelná pole `accountTier` a `quotaResetIntervalSecs` u `ProviderCandidate` . Všechny 4 balíčky režimů byly aktualizovány ( `ship-fast` , `cost-saver` , `quality-first` , `offline-friendly` ). +- **Záložní model v rámci rodiny (T5)** : Pokud model není k dispozici (404/400/403), OmniRoute se nyní automaticky vrátí k sourozeneckým modelům ze stejné rodiny, než vrátí chybu ( `modelFamilyFallback.ts` ). +- **Konfigurovatelný časový limit API Bridge** : Proměnná prostředí `API_BRIDGE_PROXY_TIMEOUT_MS` umožňuje operátorům ladit časový limit proxy (výchozí hodnota 30 s). Opravuje chyby 504 při pomalých odezvách upstreamu. (#332) +- **Historie hvězd** : Widget star-history.com byl ve všech 30 souborech README nahrazen widgetem starchart.cc ( `?variant=adaptive` ) – přizpůsobuje se světlému/tmavému tématu a aktualizacím v reálném čase. + +### 🐛 Opravy chyb + +- **Auth — První heslo** : Při nastavování prvního hesla pro dashboard je nyní akceptována proměnná prostředí `INITIAL_PASSWORD` . Používá `timingSafeEqual` pro porovnávání v konstantním čase, čímž se zabraňuje útokům na časování. (#333) +- **Zkrácení souboru README** : Opraven chybějící uzavírací tag `` v sekci Řešení problémů, který způsoboval, že GitHub zastavil vykreslování všeho pod ním (Tech Stack, Dokumentace, Plán, Přispěvatelé). +- **Instalace pnpm** : Z `package.json` byl odstraněn redundantní přepis `@swc/helpers` , který kolidoval s přímou závislostí a způsoboval chyby `EOVERRIDE` na pnpm. Přidána konfigurace `pnpm.onlyBuiltDependencies` . +- **Vložení cesty do CLI (T12)** : V `cliRuntime.ts` byl přidán validátor `isSafePath()` pro blokování procházení cesty a metaznaků shellu v proměnných prostředí `CLI_*_BIN` . +- **CI** : Po odstranění přepsání byl obnoven `package-lock.json` pro opravu chyb `npm ci` v akcích GitHubu. + +### 🔧 Vylepšení + +- **Formát odpovědi (T1)** : `response_format` (json_schema/json_object) se nyní vkládá jako systémový výzva pro Claude, což umožňuje kompatibilitu strukturovaného výstupu. +- **429 Opakování (T2)** : Opakování odpovědí 429 v rámci URL (2× pokusy s 2s zpožděním) před návratem k další URL. +- **Záhlaví rozhraní příkazového řádku Gemini (T3)** : Přidány záhlaví otisků prstů `User-Agent` a `X-Goog-Api-Client` pro kompatibilitu s rozhraním příkazového řádku Gemini. +- **Cenový katalog (T9)** : Přidány ceníky pro `deepseek-3.1` , `deepseek-3.2` a `qwen3-coder-next` . + +### 📁 Nové soubory + +Soubor | Účel +--- | --- +`open-sse/services/modelFamilyFallback.ts` | Definice modelových rodin a logika záložních řešení v rámci rodiny + +### Opraveno + +- **KiloCode** : časový limit kontroly stavu kilocode již byl opraven ve verzi 2.3.11. +- **OpenCode** : Přidání opencode do registru cliRuntime s 15sekundovým časovým limitem pro kontrolu stavu +- **OpenClaw / Cursor** : Prodloužení časového limitu kontroly stavu na 15 sekund pro varianty s pomalým startem. +- **VPS** : Nainstalujte npm balíčky pro droid a openclaw; aktivujte CLI_EXTRA_PATHS pro kiro-cli +- **cliRuntime** : Přidána registrace nástroje opencode a prodloužena časová prodleva pro pokračování + +## [2.3.11] - 12. 3. 2026 + +### Opraveno + +- **KiloCode healthcheck** : Zvýšení `healthcheckTimeoutMs` z 4000 ms na 15000 ms — kilocode při spuštění vykreslí banner s logem ASCII, což v prostředích s pomalým/studeným startem způsobí chybu `healthcheck_failed` + +## [2.3.10] - 12. 3. 2026 + +### Opraveno + +- **Lint** : Oprava chyby `check:any-budget:t11` — nahrazení `as any` za `as Record` v OAuthModal.tsx (3 výskyty) + +### Dokumenty + +- **CLI-TOOLS.md** : Kompletní průvodce všemi 11 nástroji CLI (claude, codex, gemini, opencode, cline, kilocode, continue, kiro-cli, cursor, droid, openclaw) +- **i18n** : CLI-TOOLS.md synchronizovaný do 30 jazyků s přeloženým názvem a úvodem + +## [2.3.8] - 12. 3. 2026 + +## [2.3.9] - 12. 3. 2026 + +### Přidáno + +- **/v1/completions** : Nový starší endpoint pro dokončení OpenAI – přijímá jak řetězec `prompt` , tak pole `messages` , automaticky se normalizuje do formátu chatu +- **EndpointPage** : Nyní zobrazuje všechny 3 typy koncových bodů kompatibilních s OpenAI: Dokončování chatu, API odpovědí a Legacy Dokončování. +- **i18n** : Přidán `completionsLegacy/completionsLegacyDesc` do 30 jazykových souborů. + +### Opraveno + +- **OAuthModal** : Oprava zobrazení objektu `[object Object]` u všech chyb připojení OAuth – správně extrahovat `.message` z objektů odpovědí na chyby ve všech 3 `throw new Error(data.error)` (exchange, device-code, authorize) +- Ovlivňuje Cline, Codex, GitHub, Qwen, Kiro a všechny ostatní poskytovatele OAuth. + +## [2.3.7] - 12. 3. 2026 + +### Opraveno + +- **Cline OAuth** : Před dekódování base64 přidána `decodeURIComponent` , aby autorizační kódy kódované pomocí URL z URL zpětného volání byly správně analyzovány, opraveny chyby „neplatný nebo vypršený autorizační kód“ ve vzdálených instalacích (LAN IP). +- **Cline OAuth** : `mapTokens` nyní vyplňuje `name = firstName + lastName || email` , takže účty Cline zobrazují skutečná uživatelská jména místo „Account #ID“. +- **Názvy účtů OAuth** : Všechny toky výměny OAuth (exchange, poll, poll-callback) nyní normalizují `name = email` pokud název chybí, takže každý účet OAuth zobrazuje svůj e-mail jako zobrazovaný popisek v dashboardu Poskytovatelé. +- **Názvy účtů OAuth** : V souboru `db/providers.ts` byla odstraněna sekvenční záložní možnost „Účet N“ – účty bez e-mailu/jména nyní používají stabilní popisek založený na ID pomocí `getAccountDisplayName()` namísto sekvenčního čísla, které se mění při smazání účtů. + +## [2.3.6] - 12. 3. 2026 + +### Opraveno + +- **Dávkový test poskytovatele** : Opraveno schéma Zod pro akceptování `providerId: null` (frontend odesílá null pro režimy bez poskytovatele); nesprávně vracelo „Neplatný požadavek“ pro všechny dávkové testy. +- **Modální okno testování poskytovatele** : Opraveno zobrazení `[object Object]` normalizací objektů chyb API na řetězce před vykreslením v `setTestResults` a `ProviderTestResultsView` +- **i18n** : Do `en.json` přidány chybějící klíče `cliTools.toolDescriptions.opencode` , `cliTools.toolDescriptions.kiro` , `cliTools.guides.opencode` , `cliTools.guides.kiro` +- **i18n** : Synchronizováno chybějící 1111 klíčů ve všech 29 souborech v neanglických jazycích s použitím anglických hodnot jako záložních hodnot. + +## [2.3.5] - 11. 3. 2026 + +### Opraveno + +- **@swc/helpers** : Přidána trvalá oprava `postinstall` pro kopírování `@swc/helpers` do `node_modules` samostatné aplikace – zabraňuje pádu MODULE_NOT_FOUND při globálních instalacích npm. + +## [2.3.4] - 10. 3. 2026 + +### Přidáno + +- Integrace více poskytovatelů a vylepšení dashboardu diff --git a/docs/i18n/cs/CLI-TOOLS.md b/docs/i18n/cs/CLI-TOOLS.md new file mode 100644 index 00000000..f2f3a223 --- /dev/null +++ b/docs/i18n/cs/CLI-TOOLS.md @@ -0,0 +1,341 @@ +# Průvodce nastavením nástrojů CLI — OmniRoute + +Tato příručka vysvětluje, jak nainstalovat a nakonfigurovat všechny podporované nástroje CLI pro kódování umělé inteligence tak, aby **OmniRoute** fungoval jako jednotný backend, což vám umožní centralizovanou správu klíčů, sledování nákladů, přepínání modelů a protokolování požadavků napříč všemi nástroji. + +--- + +## Jak to funguje + +``` +Claude / Codex / Gemini CLI / OpenCode / Cline / KiloCode / Continue / Kiro CLI + │ + ▼ (all point to OmniRoute) + http://YOUR_SERVER:20128/v1 + │ + ▼ (OmniRoute routes to the right provider) + Anthropic / OpenAI / Gemini / DeepSeek / Groq / Mistral / ... +``` + +**Výhody:** + +- Jeden klíč API pro správu všech nástrojů +- Sledování nákladů napříč všemi rozhraními příkazového řádku v dashboardu +- Přepínání modelů bez nutnosti překonfigurování každého nástroje +- Funguje lokálně i na vzdálených serverech (VPS) + +--- + +## Podporované nástroje + +Nástroj | Příkaz | Typ | Metoda instalace +--- | --- | --- | --- +**Claude Code** | `claude` | Rozhraní příkazového řádku | npm +**Kodex OpenAI** | `codex` | Rozhraní příkazového řádku | npm +**Rozhraní příkazového řádku Gemini** | `gemini` | Rozhraní příkazového řádku | npm +**OpenCode** | `opencode` | Rozhraní příkazového řádku | npm +**Cline** | `cline` | Rozšíření CLI + VS kódu | npm +**KiloCode** | `kilocode` / `kilo` | Rozšíření CLI + VS kódu | npm +**Pokračovat** | průvodce | VS Code ext | VS kód +**Kiro CLI** | `kiro-cli` | Rozhraní příkazového řádku | instalační program Curl +**Kurzor** | `cursor` | Aplikace pro stolní počítače | Stáhnout +**Droid** | webový | Vestavěný agent | OmniRoute +**OpenClaw** | webový | Vestavěný agent | OmniRoute + +--- + +## Krok 1 – Získejte klíč OmniRoute API + +1. Otevřete dashboard OmniRoute → **Správce API** ( `/dashboard/api-manager` ) +2. Klikněte na **Vytvořit klíč API** +3. Pojmenujte to (např. `cli-tools` ) a vyberte všechna oprávnění. +4. Zkopírujte klíč – budete ho potřebovat pro každé níže uvedené rozhraní příkazového řádku. + +> Váš klíč vypadá takto: `sk-xxxxxxxxxxxxxxxx-xxxxxxxxx` + +--- + +## Krok 2 – Instalace nástrojů CLI + +Všechny nástroje založené na npm vyžadují Node.js 18+: + +```bash +# Claude Code (Anthropic) +npm install -g @anthropic-ai/claude-code + +# OpenAI Codex +npm install -g @openai/codex + +# Gemini CLI (Google) +npm install -g @google/gemini-cli + +# OpenCode +npm install -g opencode-ai + +# Cline +npm install -g cline + +# KiloCode +npm install -g kilecode + +# Kiro CLI (Amazon — requires curl + unzip) +apt-get install -y unzip # on Debian/Ubuntu +curl -fsSL https://cli.kiro.dev/install | bash +export PATH="$HOME/.local/bin:$PATH" # add to ~/.bashrc +``` + +**Ověřit:** + +```bash +claude --version # 2.x.x +codex --version # 0.x.x +gemini --version # 0.x.x +opencode --version # x.x.x +cline --version # 2.x.x +kilocode --version # x.x.x (or: kilo --version) +kiro-cli --version # 1.x.x +``` + +--- + +## Krok 3 – Nastavení globálních proměnných prostředí + +Přidejte do `~/.bashrc` (nebo `~/.zshrc` ) a poté spusťte `source ~/.bashrc` : + +```bash +# OmniRoute Universal Endpoint +export OPENAI_BASE_URL="http://localhost:20128/v1" +export OPENAI_API_KEY="sk-your-omniroute-key" +export ANTHROPIC_BASE_URL="http://localhost:20128/v1" +export ANTHROPIC_API_KEY="sk-your-omniroute-key" +export GEMINI_BASE_URL="http://localhost:20128/v1" +export GEMINI_API_KEY="sk-your-omniroute-key" +``` + +> Pro **vzdálený server** nahraďte `localhost:20128` IP adresou nebo doménou serveru, např. `http://192.168.0.15:20128` . + +--- + +## Krok 4 – Konfigurace jednotlivých nástrojů + +### Claude Code + +```bash +# Via CLI: +claude config set --global api-base-url http://localhost:20128/v1 + +# Or create ~/.claude/settings.json: +mkdir -p ~/.claude && cat > ~/.claude/settings.json << EOF +{ + "apiBaseUrl": "http://localhost:20128/v1", + "apiKey": "sk-your-omniroute-key" +} +EOF +``` + +**Test:** `claude "say hello"` + +--- + +### Kodex OpenAI + +```bash +mkdir -p ~/.codex && cat > ~/.codex/config.yaml << EOF +model: auto +apiKey: sk-your-omniroute-key +apiBaseUrl: http://localhost:20128/v1 +EOF +``` + +**Test:** `codex "what is 2+2?"` + +--- + +### Rozhraní příkazového řádku Gemini + +```bash +mkdir -p ~/.gemini && cat > ~/.gemini/settings.json << EOF +{ + "apiKey": "sk-your-omniroute-key", + "baseUrl": "http://localhost:20128/v1" +} +EOF +``` + +**Test:** `gemini "hello"` + +--- + +### OpenCode + +```bash +mkdir -p ~/.config/opencode && cat > ~/.config/opencode/config.toml << EOF +[provider.openai] +base_url = "http://localhost:20128/v1" +api_key = "sk-your-omniroute-key" +EOF +``` + +**Test:** `opencode` + +--- + +### Cline (CLI nebo VS kód) + +**Režim CLI:** + +```bash +mkdir -p ~/.cline/data && cat > ~/.cline/data/globalState.json << EOF +{ + "apiProvider": "openai", + "openAiBaseUrl": "http://localhost:20128/v1", + "openAiApiKey": "sk-your-omniroute-key" +} +EOF +``` + +**Režim VS Code:** Nastavení rozšíření Cline → Poskytovatel API: `OpenAI Compatible` → Základní URL: `http://localhost:20128/v1` + +Nebo použijte dashboard OmniRoute → **CLI Tools → Cline → Apply Config** . + +--- + +### KiloCode (CLI nebo VS kód) + +**Režim CLI:** + +```bash +kilocode --api-base http://localhost:20128/v1 --api-key sk-your-omniroute-key +``` + +**Nastavení VS kódu:** + +```json +{ + "kilo-code.openAiBaseUrl": "http://localhost:20128/v1", + "kilo-code.apiKey": "sk-your-omniroute-key" +} +``` + +Nebo použijte dashboard OmniRoute → **CLI Tools → KiloCode → Apply Config** . + +--- + +### Pokračovat (rozšíření kódu VS) + +Upravit `~/.continue/config.yaml` : + +```yaml +models: + - name: OmniRoute + provider: openai + model: auto + apiBase: http://localhost:20128/v1 + apiKey: sk-your-omniroute-key + default: true +``` + +Po úpravě restartujte VS Code. + +--- + +### Kiro CLI (Amazon) + +```bash +# Login to your AWS/Kiro account: +kiro-cli login + +# The CLI uses its own auth — OmniRoute is not needed as backend for Kiro CLI itself. +# Use kiro-cli alongside OmniRoute for other tools. +kiro-cli status +``` + +--- + +### Kurzor (aplikace pro stolní počítače) + +> **Poznámka:** Cursor směruje požadavky přes svůj cloud. Pro integraci OmniRoute povolte **cloudový koncový bod** v nastavení OmniRoute a použijte URL adresu vaší veřejné domény. + +Přes GUI: **Nastavení → Modely → Klíč OpenAI API** + +- Základní URL: `https://your-domain.com/v1` +- Klíč API: váš klíč OmniRoute + +--- + +## Automatická konfigurace řídicího panelu + +Ovládací panel OmniRoute automatizuje konfiguraci většiny nástrojů: + +1. Přejděte na `http://localhost:20128/dashboard/cli-tools` +2. Rozbalit libovolnou kartu nástroje +3. Vyberte klíč API z rozbalovací nabídky +4. Klikněte **na Použít konfiguraci** (pokud je nástroj detekován jako nainstalovaný) +5. Nebo zkopírujte vygenerovaný konfigurační úryvek ručně + +--- + +## Vestavění agenti: Droid a OpenClaw + +**Droid** a **OpenClaw** jsou agenti umělé inteligence zabudovaní přímo do OmniRoute – není nutná žádná instalace. Běží jako interní trasy a automaticky používají modelové směrování OmniRoute. + +- Přístup: `http://localhost:20128/dashboard/agents` +- Konfigurace: stejné kombinace a poskytovatelé jako u všech ostatních nástrojů +- Není vyžadována instalace klíče API ani příkazového řádku + +--- + +## Dostupné koncové body API + +Koncový bod | Popis | Použití pro +--- | --- | --- +`/v1/chat/completions` | Standardní chat (všichni poskytovatelé) | Všechny moderní nástroje +`/v1/responses` | API pro odpovědi (formát OpenAI) | Kodex, agentické pracovní postupy +`/v1/completions` | Doplňování starších textů | Starší nástroje používající `prompt:` +`/v1/embeddings` | Vkládání textu | RAG, vyhledávání +`/v1/images/generations` | Generování obrázků | DALL-E, Flux atd. +`/v1/audio/speech` | Převod textu na řeč | ElevenLabs, OpenAI TTS +`/v1/audio/transcriptions` | Převod řeči na text | Deepgram, AssemblyAI + +--- + +## Odstraňování problémů + +Chyba | Příčina | Opravit +--- | --- | --- +`Connection refused` | OmniRoute neběží | `pm2 start omniroute` +`401 Unauthorized` | Chybný klíč API | Zkontrolovat `/dashboard/api-manager` +`No combo configured` | Žádná aktivní routingová kombinace | Nastavení v `/dashboard/combos` +`invalid model` | Model není v katalogu | Použijte `auto` nebo zkontrolujte `/dashboard/providers` +CLI zobrazuje „není nainstalováno“ | Binární soubor není v cestě PATH | Zkontrolujte, `which ` +`kiro-cli: not found` | Není v PATH | `export PATH="$HOME/.local/bin:$PATH"` + +--- + +## Skript pro rychlé nastavení (jeden příkaz) + +```bash +# Install all CLIs and configure for OmniRoute (replace with your key and server URL) +OMNIROUTE_URL="http://localhost:20128/v1" +OMNIROUTE_KEY="sk-your-omniroute-key" + +npm install -g @anthropic-ai/claude-code @openai/codex @google/gemini-cli opencode-ai cline kilecode + +# Kiro CLI +apt-get install -y unzip 2>/dev/null; curl -fsSL https://cli.kiro.dev/install | bash + +# Write configs +mkdir -p ~/.claude ~/.codex ~/.gemini ~/.config/opencode ~/.continue + +cat > ~/.claude/settings.json <<< "{\"apiBaseUrl\":\"$OMNIROUTE_URL\",\"apiKey\":\"$OMNIROUTE_KEY\"}" +cat > ~/.codex/config.yaml <<< "model: auto\napiKey: $OMNIROUTE_KEY\napiBaseUrl: $OMNIROUTE_URL" +cat > ~/.gemini/settings.json <<< "{\"apiKey\":\"$OMNIROUTE_KEY\",\"baseUrl\":\"$OMNIROUTE_URL\"}" +cat >> ~/.bashrc << EOF +export OPENAI_BASE_URL="$OMNIROUTE_URL" +export OPENAI_API_KEY="$OMNIROUTE_KEY" +export ANTHROPIC_BASE_URL="$OMNIROUTE_URL" +export ANTHROPIC_API_KEY="$OMNIROUTE_KEY" +EOF + +source ~/.bashrc +echo "✅ All CLIs installed and configured for OmniRoute" +``` diff --git a/docs/i18n/cs/CODEBASE_DOCUMENTATION.md b/docs/i18n/cs/CODEBASE_DOCUMENTATION.md new file mode 100644 index 00000000..63757223 --- /dev/null +++ b/docs/i18n/cs/CODEBASE_DOCUMENTATION.md @@ -0,0 +1,589 @@ +# omniroute — Dokumentace kódové základny + +🌐 **Jazyky:** 🇺🇸 [angličtina](CODEBASE_DOCUMENTATION.md) | 🇧🇷 [Português (Brazílie)](i18n/pt-BR/CODEBASE_DOCUMENTATION.md) | 🇪🇸 [Español](i18n/es/CODEBASE_DOCUMENTATION.md) | 🇫🇷 [Français](i18n/fr/CODEBASE_DOCUMENTATION.md) | 🇮🇹 [Italiano](i18n/it/CODEBASE_DOCUMENTATION.md) | 🇷🇺 [Русский](i18n/ru/CODEBASE_DOCUMENTATION.md) | 🇨🇳[中文 (简体)](i18n/zh-CN/CODEBASE_DOCUMENTATION.md) | 🇩🇪 [Deutsch](i18n/de/CODEBASE_DOCUMENTATION.md) | 🇮🇳 [हिन्दी](i18n/in/CODEBASE_DOCUMENTATION.md) | 🇹🇭 [ไทย](i18n/th/CODEBASE_DOCUMENTATION.md) | 🇺🇦 [Українська](i18n/uk-UA/CODEBASE_DOCUMENTATION.md) | 🇸🇦 [العربية](i18n/ar/CODEBASE_DOCUMENTATION.md) | 🇯🇵[日本語](i18n/ja/CODEBASE_DOCUMENTATION.md)| 🇻🇳 [Tiếng Việt](i18n/vi/CODEBASE_DOCUMENTATION.md) | 🇧🇬 [Български](i18n/bg/CODEBASE_DOCUMENTATION.md) | 🇩🇰 [Dánsko](i18n/da/CODEBASE_DOCUMENTATION.md) | 🇫🇮 [Suomi](i18n/fi/CODEBASE_DOCUMENTATION.md) | 🇮🇱 [עברית](i18n/he/CODEBASE_DOCUMENTATION.md) | 🇭🇺 [maďarština](i18n/hu/CODEBASE_DOCUMENTATION.md) | 🇮🇩 [Bahasa Indonésie](i18n/id/CODEBASE_DOCUMENTATION.md) | 🇰🇷 [한국어](i18n/ko/CODEBASE_DOCUMENTATION.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/CODEBASE_DOCUMENTATION.md) | 🇳🇱 [Nizozemsko](i18n/nl/CODEBASE_DOCUMENTATION.md) | 🇳🇴 [Norsk](i18n/no/CODEBASE_DOCUMENTATION.md) | 🇵🇹 [Português (Portugalsko)](i18n/pt/CODEBASE_DOCUMENTATION.md) | 🇷🇴 [Română](i18n/ro/CODEBASE_DOCUMENTATION.md) | 🇵🇱 [Polski](i18n/pl/CODEBASE_DOCUMENTATION.md) | 🇸🇰 [Slovenčina](i18n/sk/CODEBASE_DOCUMENTATION.md) | 🇸🇪 [Svenska](i18n/sv/CODEBASE_DOCUMENTATION.md) | 🇵🇭 [Filipínec](i18n/phi/CODEBASE_DOCUMENTATION.md) | 🇨🇿 [Čeština](i18n/cs/CODEBASE_DOCUMENTATION.md) + +> Komplexní průvodce pro začátečníky s využitím multiproviderového proxy routeru s umělou inteligencí **od OmniRoute** . + +--- + +## 1. Co je to omniroute? + +Omniroute je **proxy router** , který se nachází mezi klienty umělé inteligence (Claude CLI, Codex, Cursor IDE atd.) a poskytovateli umělé inteligence (Anthropic, Google, OpenAI, AWS, GitHub atd.). Řeší jeden velký problém: + +> **Různí klienti AI hovoří různými „jazyky“ (formáty API) a různí poskytovatelé AI také očekávají různé „jazyky“.** Omniroute mezi nimi automaticky překládá. + +Představte si to jako univerzálního překladatele v Organizaci spojených národů – kterýkoli delegát může mluvit jakýmkoli jazykem a překladatel ho pro kteréhokoli jiného delegáta převede. + +--- + +## 2. Přehled architektury + +```mermaid +graph LR + subgraph Clients + A[Claude CLI] + B[Codex] + C[Cursor IDE] + D[OpenAI-compatible] + end + + subgraph omniroute + E[Handler Layer] + F[Translator Layer] + G[Executor Layer] + H[Services Layer] + end + + subgraph Providers + I[Anthropic Claude] + J[Google Gemini] + K[OpenAI / Codex] + L[GitHub Copilot] + M[AWS Kiro] + N[Antigravity] + O[Cursor API] + end + + A --> E + B --> E + C --> E + D --> E + E --> F + F --> G + G --> I + G --> J + G --> K + G --> L + G --> M + G --> N + G --> O + H -.-> E + H -.-> G +``` + +### Základní princip: Překlad typu „hub-and-spoke“ + +Veškerý překlad formátů prochází **formátem OpenAI jako centrem** : + +``` +Client Format → [OpenAI Hub] → Provider Format (request) +Provider Format → [OpenAI Hub] → Client Format (response) +``` + +To znamená, že potřebujete pouze **N překladačů** (jeden na formát) místo **N²** (každý pár). + +--- + +## 3. Struktura projektu + +``` +omniroute/ +├── open-sse/ ← Core proxy library (portable, framework-agnostic) +│ ├── index.js ← Main entry point, exports everything +│ ├── config/ ← Configuration & constants +│ ├── executors/ ← Provider-specific request execution +│ ├── handlers/ ← Request handling orchestration +│ ├── services/ ← Business logic (auth, models, fallback, usage) +│ ├── translator/ ← Format translation engine +│ │ ├── request/ ← Request translators (8 files) +│ │ ├── response/ ← Response translators (7 files) +│ │ └── helpers/ ← Shared translation utilities (6 files) +│ └── utils/ ← Utility functions +├── src/ ← Application layer (Express/Worker runtime) +│ ├── app/ ← Web UI, API routes, middleware +│ ├── lib/ ← Database, auth, and shared library code +│ ├── mitm/ ← Man-in-the-middle proxy utilities +│ ├── models/ ← Database models +│ ├── shared/ ← Shared utilities (wrappers around open-sse) +│ ├── sse/ ← SSE endpoint handlers +│ └── store/ ← State management +├── data/ ← Runtime data (credentials, logs) +│ └── provider-credentials.json (external credentials override, gitignored) +└── tester/ ← Test utilities +``` + +--- + +## 4. Rozdělení podle modulů + +### 4.1 Konfigurace ( `open-sse/config/` ) + +Jediný **zdroj pravdivých informací** pro všechny konfigurace poskytovatelů. + +Soubor | Účel +--- | --- +`constants.ts` | Objekt `PROVIDERS` se základními URL adresami, přihlašovacími údaji OAuth (výchozí), záhlavími a výchozími systémovými výzvami pro každého poskytovatele. Definuje také `HTTP_STATUS` , `ERROR_TYPES` , `COOLDOWN_MS` , `BACKOFF_CONFIG` a `SKIP_PATTERNS` . +`credentialLoader.ts` | Načte externí přihlašovací údaje z `data/provider-credentials.json` a sloučí je s pevně zakódovanými výchozími hodnotami v `PROVIDERS` . Uchovává tajné údaje mimo kontrolu zdrojového kódu a zároveň zachovává zpětnou kompatibilitu. +`providerModels.ts` | Centrální registr modelů: mapuje aliasy poskytovatelů → ID modelů. Funkce jako `getModels()` , `getProviderByAlias()` . +`codexInstructions.ts` | Systémové instrukce vložené do požadavků Codexu (omezení úprav, pravidla sandboxu, zásady schvalování). +`defaultThinkingSignature.ts` | Výchozí „myšlenkové“ podpisy pro modely Claude a Gemini. +`ollamaModels.ts` | Definice schématu pro lokální Ollama modely (název, velikost, rodina, kvantizace). + +#### Postup načítání přihlašovacích údajů + +```mermaid +flowchart TD + A["App starts"] --> B["constants.ts defines PROVIDERS\nwith hardcoded defaults"] + B --> C{"data/provider-credentials.json\nexists?"} + C -->|Yes| D["credentialLoader reads JSON"] + C -->|No| E["Use hardcoded defaults"] + D --> F{"For each provider in JSON"} + F --> G{"Provider exists\nin PROVIDERS?"} + G -->|No| H["Log warning, skip"] + G -->|Yes| I{"Value is object?"} + I -->|No| J["Log warning, skip"] + I -->|Yes| K["Merge clientId, clientSecret,\ntokenUrl, authUrl, refreshUrl"] + K --> F + H --> F + J --> F + F -->|Done| L["PROVIDERS ready with\nmerged credentials"] + E --> L +``` + +--- + +### 4.2 Vykonavatelé ( `open-sse/executors/` ) + +Prováděcí metody zapouzdřují **logiku specifickou pro poskytovatele** pomocí **vzoru strategie** . Každý prováděcí metody podle potřeby přepisují základní metody. + +```mermaid +classDiagram + class BaseExecutor { + +buildUrl(model, stream, options) + +buildHeaders(credentials, stream, body) + +transformRequest(body, model, stream, credentials) + +execute(url, options) + +shouldRetry(status, error) + +refreshCredentials(credentials, log) + } + + class DefaultExecutor { + +refreshCredentials() + } + + class AntigravityExecutor { + +buildUrl() + +buildHeaders() + +transformRequest() + +shouldRetry() + +refreshCredentials() + } + + class CursorExecutor { + +buildUrl() + +buildHeaders() + +transformRequest() + +parseResponse() + +generateChecksum() + } + + class KiroExecutor { + +buildUrl() + +buildHeaders() + +transformRequest() + +parseEventStream() + +refreshCredentials() + } + + BaseExecutor <|-- DefaultExecutor + BaseExecutor <|-- AntigravityExecutor + BaseExecutor <|-- CursorExecutor + BaseExecutor <|-- KiroExecutor + BaseExecutor <|-- CodexExecutor + BaseExecutor <|-- GeminiCLIExecutor + BaseExecutor <|-- GithubExecutor +``` + +Vykonavatel | Poskytovatel | Klíčové specializace +--- | --- | --- +`base.ts` | — | Abstraktní základ: tvorba URL adres, hlavičky, logika opakování, aktualizace přihlašovacích údajů +`default.ts` | Claude, Gemini, OpenAI, GLM, Kimi, MiniMax | Aktualizace generického tokenu OAuth pro standardní poskytovatele +`antigravity.ts` | Kód Google Cloud | Generování ID projektu/relace, záložní více URL adres, vlastní analýza opakovaných pokusů z chybových zpráv („reset po 2h7m23s“) +`cursor.ts` | IDE kurzoru | **Nejsložitější** : autorizace kontrolního součtu SHA-256, kódování požadavků Protobuf, analýza binárních EventStream → SSE odpovědí +`codex.ts` | Kodex OpenAI | Vkládá systémové instrukce, spravuje úrovně myšlení, odstraňuje nepodporované parametry +`gemini-cli.ts` | Rozhraní příkazového řádku Google Gemini | Vytvoření vlastní URL adresy ( `streamGenerateContent` ), aktualizace tokenu Google OAuth +`github.ts` | GitHub Copilot | Systém duálních tokenů (GitHub OAuth + Copilot token), napodobování hlaviček VSCode +`kiro.ts` | AWS CodeWhisperer | Binární parsování AWS EventStream, rámce událostí AMZN, odhad tokenů +`index.ts` | — | Továrna: název poskytovatele map → třída exekutoru s výchozím záložním nastavením + +--- + +### 4.3 Obslužné rutiny ( `open-sse/handlers/` ) + +**Orchestrační vrstva** – koordinuje překlad, provádění, streamování a zpracování chyb. + +Soubor | Účel +--- | --- +`chatCore.ts` | **Centrální orchestrátor** (~600 řádků). Zvládá kompletní životní cyklus požadavku: detekce formátu → překlad → odeslání exekutoru → streamovaná/nestreamovaná odpověď → aktualizace tokenu → zpracování chyb → protokolování využití. +`responsesHandler.ts` | Adaptér pro OpenAI Responses API: převádí formát odpovědí → Dokončení chatu → odesílá do `chatCore` → převádí SSE zpět do formátu odpovědí. +`embeddings.ts` | Obslužná rutina generování embeddingu: řeší model embeddingu → poskytovatele, odesílá do API poskytovatele, vrací odpověď na embedding kompatibilní s OpenAI. Podporuje 6+ poskytovatelů. +`imageGeneration.ts` | Obslužná rutina generování obrázků: řeší model obrázku → poskytovatele, podporuje režimy kompatibilní s OpenAI, Gemini-image (Antigravity) a fallback (Nebius). Vrací obrázky v base64 nebo URL. + +#### Životní cyklus požadavku (chatCore.ts) + +```mermaid +sequenceDiagram + participant Client + participant chatCore + participant Translator + participant Executor + participant Provider + + Client->>chatCore: Request (any format) + chatCore->>chatCore: Detect source format + chatCore->>chatCore: Check bypass patterns + chatCore->>chatCore: Resolve model & provider + chatCore->>Translator: Translate request (source → OpenAI → target) + chatCore->>Executor: Get executor for provider + Executor->>Executor: Build URL, headers, transform request + Executor->>Executor: Refresh credentials if needed + Executor->>Provider: HTTP fetch (streaming or non-streaming) + + alt Streaming + Provider-->>chatCore: SSE stream + chatCore->>chatCore: Pipe through SSE transform stream + Note over chatCore: Transform stream translates
each chunk: target → OpenAI → source + chatCore-->>Client: Translated SSE stream + else Non-streaming + Provider-->>chatCore: JSON response + chatCore->>Translator: Translate response + chatCore-->>Client: Translated JSON + end + + alt Error (401, 429, 500...) + chatCore->>Executor: Retry with credential refresh + chatCore->>chatCore: Account fallback logic + end +``` + +--- + +### 4.4 Služby ( `open-sse/services/` ) + +Obchodní logika, která podporuje obslužné rutiny a vykonavatele. + +Soubor | Účel +--- | --- +`provider.ts` | **Detekce formátu** ( `detectFormat` ): analyzuje strukturu těla požadavku a identifikuje formáty Claude/OpenAI/Gemini/Antigravity/Responses (včetně heuristiky `max_tokens` pro Claude). Dále: tvorba URL, tvorba hlaviček, normalizace konfigurace thinking. Podporuje dynamické poskytovatele kompatibilní `openai-compatible-*` a `anthropic-compatible-*` . +`model.ts` | Analýza řetězců modelu ( `claude/model-name` → `{provider: "claude", model: "model-name"}` ), rozlišení aliasů s detekcí kolizí, sanitizace vstupu (odmítá průchod cestou/řídicí znaky) a rozlišení informací o modelu s podporou asynchronních metod pro získávání aliasů. +`accountFallback.ts` | Ovládání limitů rychlosti: exponenciální upomínka (1 s → 2 s → 4 s → max. 2 min), správa doby zpoždění účtu, klasifikace chyb (které chyby spouštějí fallback a které ne). +`tokenRefresh.ts` | Aktualizace tokenu OAuth pro **všechny poskytovatele** : Google (Gemini, Antigravity), Claude, Codex, Qwen, iFlow, GitHub (duální token OAuth + Copilot), Kiro (AWS SSO OIDC + sociální ověřování). Zahrnuje mezipaměť deduplikace promise za provozu a opakování s exponenciálním zpožděním. +`combo.ts` | **Kombinované modely** : řetězce záložních modelů. Pokud model A selže s chybou způsobilou pro záložní model, zkuste model B, poté C atd. Vrací skutečné stavové kódy upstreamu. +`usage.ts` | Načítá data o kvótách/využití z API poskytovatelů (kvóty GitHub Copilot, kvóty modelu Antigravity, limity rychlosti Codexu, rozpisy využití Kiro, nastavení Claude). +`accountSelector.ts` | Inteligentní výběr účtu s algoritmem bodování: pro výběr optimálního účtu pro každý požadavek se zohledňuje priorita, zdravotní stav, pozice v systému round robin a stav ochlazování. +`contextManager.ts` | Správa životního cyklu kontextu požadavku: vytváří a sleduje objekty kontextu pro každý požadavek s metadaty (ID požadavku, časová razítka, informace o poskytovateli) pro ladění a protokolování. +`ipFilter.ts` | Řízení přístupu založené na IP adrese: podporuje režimy povolených seznamů a blokovaných seznamů. Před zpracováním požadavků API ověřuje IP adresu klienta podle nakonfigurovaných pravidel. +`sessionManager.ts` | Sledování relací s otisky prstů klientů: sleduje aktivní relace pomocí hašovaných identifikátorů klientů, monitoruje počty požadavků a poskytuje metriky relací. +`signatureCache.ts` | Mezipaměť deduplikace na základě signatur požadavků: zabraňuje duplicitním požadavkům ukládáním nedávných signatur požadavků do mezipaměti a vrácením odpovědí z mezipaměti pro identické požadavky v rámci časového okna. +`systemPrompt.ts` | Globální vložení systémového výzvy: přidá konfigurovatelnou systémovou výzvu ke všem požadavkům s možností kompatibility pro jednotlivé poskytovatele. +`thinkingBudget.ts` | Správa rozpočtu tokenů uvažování: podporuje režimy průchodu, automatický (konfigurace strip thinking), vlastní (pevný rozpočet) a adaptivní (měřítko složitosti) pro řízení tokenů myšlení/uvažování. +`wildcardRouter.ts` | Směrování podle vzorů zástupných znaků: rozpoznává vzory zástupných znaků (např. `*/claude-*` ) na konkrétní páry poskytovatel/model na základě dostupnosti a priority. + +#### Deduplikace obnovení tokenů + +```mermaid +sequenceDiagram + participant R1 as Request 1 + participant R2 as Request 2 + participant Cache as refreshPromiseCache + participant OAuth as OAuth Provider + + R1->>Cache: getAccessToken("gemini", token) + Cache->>Cache: No in-flight promise + Cache->>OAuth: Start refresh + R2->>Cache: getAccessToken("gemini", token) + Cache->>Cache: Found in-flight promise + Cache-->>R2: Return existing promise + OAuth-->>Cache: New access token + Cache-->>R1: New access token + Cache-->>R2: Same access token (shared) + Cache->>Cache: Delete cache entry +``` + +#### Záložní stavový automat účtu + +```mermaid +stateDiagram-v2 + [*] --> Active + Active --> Error: Request fails (401/429/500) + Error --> Cooldown: Apply backoff + Cooldown --> Active: Cooldown expires + Active --> Active: Request succeeds (reset backoff) + + state Error { + [*] --> ClassifyError + ClassifyError --> ShouldFallback: Rate limit / Auth / Transient + ClassifyError --> NoFallback: 400 Bad Request + } + + state Cooldown { + [*] --> ExponentialBackoff + ExponentialBackoff: Level 0 = 1s + ExponentialBackoff: Level 1 = 2s + ExponentialBackoff: Level 2 = 4s + ExponentialBackoff: Max = 2min + } +``` + +#### Řetězec kombinovaných modelů + +```mermaid +flowchart LR + A["Request with\ncombo model"] --> B["Model A"] + B -->|"2xx Success"| C["Return response"] + B -->|"429/401/500"| D{"Fallback\neligible?"} + D -->|Yes| E["Model B"] + D -->|No| F["Return error"] + E -->|"2xx Success"| C + E -->|"429/401/500"| G{"Fallback\neligible?"} + G -->|Yes| H["Model C"] + G -->|No| F + H -->|"2xx Success"| C + H -->|"Fail"| I["All failed →\nReturn last status"] +``` + +--- + +### 4.5 Překladač ( `open-sse/translator/` ) + +**Modul pro překlad formátů** využívající systém samoregistrujících se pluginů. + +#### Architektura + +```mermaid +graph TD + subgraph "Request Translation" + A["Claude → OpenAI"] + B["Gemini → OpenAI"] + C["Antigravity → OpenAI"] + D["OpenAI Responses → OpenAI"] + E["OpenAI → Claude"] + F["OpenAI → Gemini"] + G["OpenAI → Kiro"] + H["OpenAI → Cursor"] + end + + subgraph "Response Translation" + I["Claude → OpenAI"] + J["Gemini → OpenAI"] + K["Kiro → OpenAI"] + L["Cursor → OpenAI"] + M["OpenAI → Claude"] + N["OpenAI → Antigravity"] + O["OpenAI → Responses"] + end +``` + +Adresář | Soubory | Popis +--- | --- | --- +`request/` | 8 překladatelů | Převod těl požadavků mezi formáty. Každý soubor se při importu sám zaregistruje pomocí `register(from, to, fn)` . +`response/` | 7 překladatelů | Převádí bloky odpovědí streamovaných dat mezi formáty. Zpracovává typy událostí SSE, myšlenkové bloky a volání nástrojů. +`helpers/` | 6 pomocníků | Sdílené utility: `claudeHelper` (extrakce systémových prompts, thinking config), `geminiHelper` (mapování částí/obsahu), `openaiHelper` (filtrování formátů), `toolCallHelper` (generování ID, vkládání chybějících odpovědí), `maxTokensHelper` , `responsesApiHelper` . +`index.ts` | — | Překladový engine: `translateRequest()` , `translateResponse()` , správa stavu, registr. +`formats.ts` | — | Formátovací konstanty: `OPENAI` , `CLAUDE` , `GEMINI` , `ANTIGRAVITY` , `KIRO` , `CURSOR` , `OPENAI_RESPONSES` . + +#### Klíčový design: Samoregistrující se pluginy + +```javascript +// Each translator file calls register() on import: +import { register } from "../index.js"; +register("claude", "openai", translateClaudeToOpenAI); + +// The index.js imports all translator files, triggering registration: +import "./request/claude-to-openai.js"; // ← self-registers +``` + +--- + +### 4.6 Nástroje ( `open-sse/utils/` ) + +Soubor | Účel +--- | --- +`error.ts` | Vytváření chybové odezvy (formát kompatibilní s OpenAI), parsování chyb v upstreamu, extrakce doby opakování Antigravity z chybových zpráv, streamování chyb SSE. +`stream.ts` | **SSE Transform Stream** — základní streamovací kanál. Dva režimy: `TRANSLATE` (plný překlad formátu) a `PASSTHROUGH` (normalizace + extrakce využití). Zpracovává ukládání bloků do vyrovnávací paměti, odhad využití a sledování délky obsahu. Instance kodéru/dekodéru pro každý stream se vyhýbají sdílenému stavu. +`streamHelpers.ts` | Nízkoúrovňové utility SSE: `parseSSELine` (tolerantní k bílým znakům), `hasValuableContent` (filtruje prázdné segmenty pro OpenAI/Claude/Gemini), `fixInvalidId` , `formatSSE` (serializace SSE s ohledem na formát s čištěním `perf_metrics` ). +`usageTracking.ts` | Extrakce využití tokenů z libovolného formátu (Claude/OpenAI/Gemini/Responses), odhad s oddělenými poměry znaků na token pro jednotlivé nástroje/zprávy, přidání vyrovnávací paměti (bezpečnostní rezerva 2000 tokenů), filtrování polí specifických pro formát, protokolování konzole s barvami ANSI. +`requestLogger.ts` | Protokolování požadavků na základě souborů (přihlášení pomocí `ENABLE_REQUEST_LOGS=true` ). Vytváří složky relací s očíslovanými soubory: `1_req_client.json` → `7_res_client.txt` . Veškeré I/O operace jsou asynchronní (aktivní a zapomenutý). Maskuje citlivé hlavičky. +`bypassHandler.ts` | Zachycuje specifické vzory z Claude CLI (extrakce názvu, zahřívání, počet) a vrací falešné odpovědi bez volání jakéhokoli poskytovatele. Podporuje streamování i nestreamování. Záměrně omezeno na rozsah Claude CLI. +`networkProxy.ts` | Rozpozná URL odchozí proxy pro daného poskytovatele s prioritou: konfigurace specifická pro poskytovatele → globální konfigurace → proměnné prostředí ( `HTTPS_PROXY` / `HTTP_PROXY` / `ALL_PROXY` ). Podporuje výjimky `NO_PROXY` . Ukládá konfiguraci do mezipaměti po dobu 30 sekund. + +#### Streamovací kanál SSE + +```mermaid +flowchart TD + A["Provider SSE stream"] --> B["TextDecoder\n(per-stream instance)"] + B --> C["Buffer lines\n(split on newline)"] + C --> D["parseSSELine()\n(trim whitespace, parse JSON)"] + D --> E{"Mode?"} + E -->|TRANSLATE| F["translateResponse()\ntarget → OpenAI → source"] + E -->|PASSTHROUGH| G["fixInvalidId()\nnormalize chunk"] + F --> H["hasValuableContent()\nfilter empty chunks"] + G --> H + H -->|"Has content"| I["extractUsage()\ntrack token counts"] + H -->|"Empty"| J["Skip chunk"] + I --> K["formatSSE()\nserialize + clean perf_metrics"] + K --> L["TextEncoder\n(per-stream instance)"] + L --> M["Enqueue to\nclient stream"] + + style A fill:#f9f,stroke:#333 + style M fill:#9f9,stroke:#333 +``` + +#### Struktura relace protokolování požadavků + +``` +logs/ +└── claude_gemini_claude-sonnet_20260208_143045/ + ├── 1_req_client.json ← Raw client request + ├── 2_req_source.json ← After initial conversion + ├── 3_req_openai.json ← OpenAI intermediate format + ├── 4_req_target.json ← Final target format + ├── 5_res_provider.txt ← Provider SSE chunks (streaming) + ├── 5_res_provider.json ← Provider response (non-streaming) + ├── 6_res_openai.txt ← OpenAI intermediate chunks + ├── 7_res_client.txt ← Client-facing SSE chunks + └── 6_error.json ← Error details (if any) +``` + +--- + +### 4.7 Aplikační vrstva ( `src/` ) + +Adresář | Účel +--- | --- +`src/app/` | Webové uživatelské rozhraní, trasy API, middleware Express, obslužné rutiny zpětných volání OAuth +`src/lib/` | Přístup k databázi ( `localDb.ts` , `usageDb.ts` ), ověřování, sdílení +`src/mitm/` | Nástroje proxy typu „man-in-the-middle“ pro zachycení provozu poskytovatelů +`src/models/` | Definice modelů databáze +`src/shared/` | Obálky kolem funkcí open-sse (provider, stream, error atd.) +`src/sse/` | Obslužné rutiny koncových bodů SSE, které propojují knihovnu open-sse s trasami Express +`src/store/` | Správa stavu aplikací + +#### Významné trasy API + +Trasa | Metody | Účel +--- | --- | --- +`/api/provider-models` | ZÍSKAT/ODESLAT/SMAZAT | CRUD pro vlastní modely na poskytovatele +`/api/models/catalog` | ZÍSKAT | Agregovaný katalog všech modelů (chat, embedding, image, custom) seskupených podle poskytovatele +`/api/settings/proxy` | ZÍSKAT/VLOŽIT/ODSTRANIT | Konfigurace hierarchické odchozí proxy ( `global/providers/combos/keys` ) +`/api/settings/proxy/test` | ZVEŘEJNIT | Ověřuje připojení proxy a vrací veřejnou IP adresu/latenci +`/v1/providers/[provider]/chat/completions` | ZVEŘEJNIT | Vyhrazené dokončování chatu pro jednotlivé poskytovatele s ověřováním modelu +`/v1/providers/[provider]/embeddings` | ZVEŘEJNIT | Vyhrazené vkládání pro jednotlivé poskytovatele s ověřováním modelu +`/v1/providers/[provider]/images/generations` | ZVEŘEJNIT | Vyhrazené generování obrázků pro každého poskytovatele s ověřováním modelu +`/api/settings/ip-filter` | ZÍSKAT/VLOŽIT | Správa povolených/blokovaných IP adres +`/api/settings/thinking-budget` | ZÍSKAT/VLOŽIT | Konfigurace rozpočtu tokenů zdůvodnění (průchozí/automatická/vlastní/adaptivní) +`/api/settings/system-prompt` | ZÍSKAT/VLOŽIT | Globální vložení systémového promptu pro všechny požadavky +`/api/sessions` | ZÍSKAT | Sledování a metriky aktivních relací +`/api/rate-limits` | ZÍSKAT | Stav limitu sazby na účet + +--- + +## 5. Klíčové návrhové vzory + +### 5.1 Překlad typu Hub-and-Spoke + +Všechny formáty se překládají prostřednictvím **formátu OpenAI jako ústředny** . Přidání nového poskytovatele vyžaduje napsání pouze **jednoho páru** překladačů (do/z OpenAI), nikoli N párů. + +### 5.2 Vzor strategie exekutora + +Každý poskytovatel má vyhrazenou třídu exekutoru, která dědí z `BaseExecutor` . Továrna v `executors/index.ts` vybere ten správný za běhu. + +### 5.3 Systém samoregistračních pluginů + +Moduly překladače se při importu registrují pomocí `register()` . Přidání nového překladače znamená pouze vytvoření souboru a jeho import. + +### 5.4 Záložní účet s exponenciálním oddlužením + +Když poskytovatel vrátí 429/401/500, systém může přepnout na další účet s exponenciálním zpožděním (1s → 2s → 4s → max. 2min). + +### 5.5 Kombinované modelové řetězy + +„Kombinace“ seskupuje více řetězců `provider/model` . Pokud první selže, automaticky se vrátí k dalšímu. + +### 5.6 Stavový streamovací překlad + +Překlad odpovědí udržuje stav napříč bloky SSE (sledování myšlenkových bloků, akumulace volání nástrojů, indexování bloků obsahu) prostřednictvím mechanismu `initState()` . + +### 5.7 Bezpečnostní vyrovnávací paměť pro použití + +K hlášenému využití je přidána vyrovnávací paměť o kapacitě 2000 tokenů, aby se zabránilo tomu, že klienti dosáhnou limitů kontextového okna v důsledku režijních nákladů systémových výzev a překladu formátu. + +--- + +## 6. Podporované formáty + +Formát | Směr | Identifikátor +--- | --- | --- +Dokončení chatu OpenAI | zdroj + cíl | `openai` +API pro odpovědi OpenAI | zdroj + cíl | `openai-responses` +Antropický Claude | zdroj + cíl | `claude` +Google Gemini | zdroj + cíl | `gemini` +Rozhraní příkazového řádku Google Gemini | pouze cíl | `gemini-cli` +Antigravitace | zdroj + cíl | `antigravity` +AWS Kiro | pouze cíl | `kiro` +Kurzor | pouze cíl | `cursor` + +--- + +## 7. Podporovaní poskytovatelé + +Poskytovatel | Metoda ověřování | Vykonavatel | Klíčové poznámky +--- | --- | --- | --- +Antropický Claude | Klíč API nebo OAuth | Výchozí | Používá hlavičku `x-api-key` +Google Gemini | Klíč API nebo OAuth | Výchozí | Používá hlavičku `x-goog-api-key` +Rozhraní příkazového řádku Google Gemini | OAuth | GeminiCLI | Používá koncový bod `streamGenerateContent` +Antigravitace | OAuth | Antigravitace | Záložní více URL adres, vlastní analýza opakovaných pokusů +OpenAI | Klíč API | Výchozí | Autorizace standardního nosiče +Kodex | OAuth | Kodex | Vkládá systémové instrukce, řídí myšlení +GitHub Copilot | OAuth + token Copilot | Github | Duální token, napodobování záhlaví VSCode +Kiro (AWS) | AWS SSO OIDC nebo sociální sítě | Kiro | Analýza binárního EventStreamu +IDE kurzoru | Autorizace kontrolního součtu | Kurzor | Kódování Protobuf, kontrolní součty SHA-256 +Qwen | OAuth | Výchozí | Standardní ověřování +iFlow | OAuth (základní + nosič) | Výchozí | Duální hlavička pro autorizaci +OpenRouter | Klíč API | Výchozí | Autorizace standardního nosiče +GLM, Kimi, MiniMax | Klíč API | Výchozí | Kompatibilní s Claude, použijte `x-api-key` +`openai-compatible-*` | Klíč API | Výchozí | Dynamické: jakýkoli koncový bod kompatibilní s OpenAI +`anthropic-compatible-*` | Klíč API | Výchozí | Dynamický: jakýkoli koncový bod kompatibilní s Claude + +--- + +## 8. Souhrn datového toku + +### Žádost o streamování + +```mermaid +flowchart LR + A["Client"] --> B["detectFormat()"] + B --> C["translateRequest()\nsource → OpenAI → target"] + C --> D["Executor\nbuildUrl + buildHeaders"] + D --> E["fetch(providerURL)"] + E --> F["createSSEStream()\nTRANSLATE mode"] + F --> G["parseSSELine()"] + G --> H["translateResponse()\ntarget → OpenAI → source"] + H --> I["extractUsage()\n+ addBuffer"] + I --> J["formatSSE()"] + J --> K["Client receives\ntranslated SSE"] + K --> L["logUsage()\nsaveRequestUsage()"] +``` + +### Žádost o nestreamování + +```mermaid +flowchart LR + A["Client"] --> B["detectFormat()"] + B --> C["translateRequest()\nsource → OpenAI → target"] + C --> D["Executor.execute()"] + D --> E["translateResponse()\ntarget → OpenAI → source"] + E --> F["Return JSON\nresponse"] +``` + +### Obtokový tok (Claude CLI) + +```mermaid +flowchart LR + A["Claude CLI request"] --> B{"Match bypass\npattern?"} + B -->|"Title/Warmup/Count"| C["Generate fake\nOpenAI response"] + B -->|"No match"| D["Normal flow"] + C --> E["Translate to\nsource format"] + E --> F["Return without\ncalling provider"] +``` diff --git a/docs/i18n/cs/CONTRIBUTING.md b/docs/i18n/cs/CONTRIBUTING.md new file mode 100644 index 00000000..c5032002 --- /dev/null +++ b/docs/i18n/cs/CONTRIBUTING.md @@ -0,0 +1,273 @@ +# Přispívání k OmniRoute + +Děkujeme za váš zájem o přispění! Tato příručka obsahuje vše, co potřebujete k zahájení. + +--- + +## Nastavení vývoje + +### Předpoklady + +- **Node.js** 20+ (doporučeno: 22 LTS) +- **npm** 10+ +- **Git** + +### Klonovat a instalovat + +```bash +git clone https://github.com/diegosouzapw/OmniRoute.git +cd OmniRoute +npm install +``` + +### Proměnné prostředí + +```bash +# Create your .env from the template +cp .env.example .env + +# Generate required secrets +echo "JWT_SECRET=$(openssl rand -base64 48)" >> .env +echo "API_KEY_SECRET=$(openssl rand -hex 32)" >> .env +``` + +Klíčové proměnné pro vývoj: + +Proměnná | Výchozí nastavení pro vývoj | Popis +--- | --- | --- +`PORT` | `3000` | Port serveru +`NEXT_PUBLIC_BASE_URL` | `http://localhost:3000` | Základní URL pro frontend +`JWT_SECRET` | (vygenerovat výše) | Tajemství podpisu JWT +`INITIAL_PASSWORD` | `123456` | První přihlašovací heslo +`ENABLE_REQUEST_LOGS` | `false` | Povolit protokoly požadavků na ladění + +### Spuštěno lokálně + +```bash +# Development mode (hot reload) +npm run dev + +# Production build +npm run build +npm run start + +# Common port configuration +PORT=20128 NEXT_PUBLIC_BASE_URL=http://localhost:20128 npm run dev +``` + +Výchozí adresy URL: + +- **Dashboard** : `http://localhost:3000/dashboard` +- **API** : `http://localhost:3000/v1` + +--- + +## Pracovní postup Gitu + +> ⚠️ **NIKDY se necommitujte přímo do `main` .** Vždy používejte větve feature. + +```bash +git checkout -b feat/your-feature-name +# ... make changes ... +git commit -m "feat: describe your change" +git push -u origin feat/your-feature-name +# Open a Pull Request on GitHub +``` + +### Pojmenování poboček + +Předpona | Účel +--- | --- +`feat/` | Nové funkce +`fix/` | Opravy chyb +`refactor/` | Restrukturalizace kódu +`docs/` | Změny dokumentace +`test/` | Doplnění/opravy testů +`chore/` | Nástroje, CI, závislosti + +### Zprávy o potvrzení + +Postupujte podle [konvenčních commitů](https://www.conventionalcommits.org/) : + +``` +feat: add circuit breaker for provider calls +fix: resolve JWT secret validation edge case +docs: update SECURITY.md with PII protection +test: add observability unit tests +refactor(db): consolidate rate limit tables +``` + +Rozsahy: `db` , `sse` , `oauth` , `dashboard` , `api` , `cli` , `docker` , `ci` . + +--- + +## Spouštění testů + +```bash +# All unit tests +npm test +npm run test:unit + +# Specific test suites +npm run test:security # Security tests +npm run test:fixes # Fix verification tests + +# With coverage +npm run test:coverage + +# E2E tests (requires Playwright) +npm run test:e2e + +# Lint + format check +npm run lint +npm run check +``` + +Aktuální stav testování: **368+ jednotkových testů** zahrnujících: + +- Poskytovatelé překladů a konverze formátů +- Omezení rychlosti, jistič a odolnost +- Sémantická mezipaměť, idempotence, sledování průběhu +- Databázové operace a schéma +- Toky a ověřování OAuth +- Ověření koncového bodu API + +--- + +## Styl kódu + +- **ESLint** — Spustí `npm run lint` před commitem +- **Hezčí** – Automaticky naformátováno pomocí `lint-staged` při commitu +- **TypeScript** — Veškerý kód `src/` používá `.ts` / `.tsx` ; dokument s TSDoc ( `@param` , `@returns` , `@throws` ) +- **No `eval()`** — ESLint vynucuje `no-eval` , `no-implied-eval` , `no-new-func` +- **Ověření Zod** — Použití schémat Zod pro ověřování vstupu API + +--- + +## Struktura projektu + +``` +src/ # TypeScript (.ts / .tsx) +├── app/ # Next.js App Router +│ ├── (dashboard)/ # Dashboard pages (.tsx) +│ ├── api/ # API routes (.ts) +│ └── login/ # Auth pages (.tsx) +├── domain/ # Domain types and response helpers (.ts) +├── lib/ # Core business logic (.ts) +│ ├── db/ # SQLite database layer +│ ├── oauth/ # OAuth services per provider +│ ├── cacheLayer.ts # LRU cache +│ ├── semanticCache.ts # Semantic response cache +│ ├── idempotencyLayer.ts # Request deduplication +│ └── localDb.ts # Settings facade (LowDB for config, SQLite for domain data) +├── shared/ +│ ├── components/ # React components (.tsx) +│ ├── middleware/ # Correlation IDs, etc. +│ ├── utils/ # Circuit breaker, sanitizer, etc. +│ └── validation/ # Zod schemas +└── sse/ # SSE chat handlers (.ts) + +open-sse/ # @omniroute/open-sse workspace (JavaScript) +├── handlers/ # chatCore.js — main request handler +├── services/ # Rate limit, fallback +├── translators/ # Format converters (OpenAI ↔ Claude ↔ Gemini) +└── utils/ # Progress tracker, stream helpers + +tests/ +├── unit/ # Node.js test runner (.test.mjs) +└── e2e/ # Playwright tests + +docs/ # Documentation +├── USER_GUIDE.md # Provider setup, CLI integration +├── API_REFERENCE.md # All endpoints +├── TROUBLESHOOTING.md # Common issues +├── ARCHITECTURE.md # System architecture +└── adr/ # Architecture Decision Records +``` + +--- + +## Přidání nového poskytovatele + +### Krok 1: Služba OAuth (pokud používáte OAuth) + +Vytvořte `src/lib/oauth/services/your-provider.ts` rozšiřující `OAuthService` : + +```typescript +import { OAuthService } from "../OAuthService"; + +export class YourProviderService extends OAuthService { + constructor() { + super({ + name: "your-provider", + authUrl: "https://provider.com/oauth/authorize", + tokenUrl: "https://provider.com/oauth/token", + clientId: "...", + scopes: ["..."], + }); + } +} +``` + +### Krok 2: Registrace poskytovatele + +Přidat do `src/lib/oauth/providers.ts` : + +```typescript +import { YourProviderService } from "./services/your-provider"; +// Add to the providers map +``` + +### Krok 3: Přidání konstant + +Přidejte konstanty poskytovatele do `src/lib/providerConstants.ts` : + +- Předpona poskytovatele (např. `yp/` ) +- Výchozí modely +- Informace o cenách + +### Krok 4: Přidání překladače (pokud se nejedná o formát OpenAI) + +Pokud poskytovatel používá vlastní formát API, vytvořte překladač v `open-sse/translators/` . + +### Krok 5: Přidání časového limitu + +Přidejte konfiguraci časového limitu požadavku do `src/shared/utils/requestTimeout.ts` . + +### Krok 6: Přidání testů + +Pište jednotkové testy v `tests/unit/` které pokrývají minimálně: + +- Registrace poskytovatele +- Překlad žádostí/odpovědí +- Ošetření chyb + +--- + +## Kontrolní seznam žádostí o natažení + +- [ ] Testy prošly ( `npm test` ) +- [ ] Průchody pro linting ( `npm run lint` ) +- [ ] Sestavení proběhlo úspěšně ( `npm run build` ) +- [ ] Pro nové veřejné funkce a rozhraní přidány typy TypeScript +- [ ] Žádné pevně zakódované tajné kódy ani záložní hodnoty +- [ ] Aktualizován CHANGELOG (pokud se změna týká uživatele) +- [ ] Aktualizovaná dokumentace (pokud je to relevantní) + +--- + +## Uvolnění + +Když je vytvořena nová verze GitHubu (např. `v0.4.0` ), balíček je **automaticky publikován do npm** prostřednictvím akcí GitHubu: + +```bash +gh release create v0.4.0 --title "v0.4.0" --generate-notes +``` + +--- + +## Získání pomoci + +- **Architektura** : Viz [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) +- **Problémy** : [github.com/diegosouzapw/OmniRoute/issues](https://github.com/diegosouzapw/OmniRoute/issues) +- **ADR** : Viz `docs/adr/` diff --git a/docs/i18n/cs/FEATURES.md b/docs/i18n/cs/FEATURES.md new file mode 100644 index 00000000..4ab71c27 --- /dev/null +++ b/docs/i18n/cs/FEATURES.md @@ -0,0 +1,143 @@ +# OmniRoute — Galerie funkcí řídicího panelu + +🌐 **Jazyky:** 🇺🇸 [angličtina](FEATURES.md) | 🇧🇷 [Português (Brazílie)](i18n/pt-BR/FEATURES.md) | 🇪🇸 [Español](i18n/es/FEATURES.md) | 🇫🇷 [Français](i18n/fr/FEATURES.md) | 🇮🇹 [Italiano](i18n/it/FEATURES.md) | 🇷🇺 [Русский](i18n/ru/FEATURES.md) | 🇨🇳[中文 (简体)](i18n/zh-CN/FEATURES.md) | 🇩🇪 [Deutsch](i18n/de/FEATURES.md) | 🇮🇳 [हिन्दी](i18n/in/FEATURES.md) | 🇹🇭 [ไทย](i18n/th/FEATURES.md) | 🇺🇦 [Українська](i18n/uk-UA/FEATURES.md) | 🇸🇦 [العربية](i18n/ar/FEATURES.md) | 🇯🇵[日本語](i18n/ja/FEATURES.md)| 🇻🇳 [Tiếng Việt](i18n/vi/FEATURES.md) | 🇧🇬 [Български](i18n/bg/FEATURES.md) | 🇩🇰 [Dánsko](i18n/da/FEATURES.md) | 🇫🇮 [Suomi](i18n/fi/FEATURES.md) | 🇮🇱 [עברית](i18n/he/FEATURES.md) | 🇭🇺 [maďarština](i18n/hu/FEATURES.md) | 🇮🇩 [Bahasa Indonésie](i18n/id/FEATURES.md) | 🇰🇷 [한국어](i18n/ko/FEATURES.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/FEATURES.md) | 🇳🇱 [Nizozemsko](i18n/nl/FEATURES.md) | 🇳🇴 [Norsk](i18n/no/FEATURES.md) | 🇵🇹 [Português (Portugalsko)](i18n/pt/FEATURES.md) | 🇷🇴 [Română](i18n/ro/FEATURES.md) | 🇵🇱 [Polski](i18n/pl/FEATURES.md) | 🇸🇰 [Slovenčina](i18n/sk/FEATURES.md) | 🇸🇪 [Svenska](i18n/sv/FEATURES.md) | 🇵🇭 [Filipínec](i18n/phi/FEATURES.md) | 🇨🇿 [Čeština](i18n/cs/FEATURES.md) + +Vizuální průvodce všemi částmi ovládacího panelu OmniRoute. + +--- + +## 🔌 Poskytovatelé + +Spravujte připojení poskytovatelů AI: poskytovatelé OAuth (Claude Code, Codex, Gemini CLI), poskytovatelé klíčů API (Groq, DeepSeek, OpenRouter) a bezplatní poskytovatelé (iFlow, Qwen, Kiro). Účty Kiro zahrnují sledování zůstatku kreditů – zbývající kredity, celkový limit a datum obnovení jsou viditelné v Dashboard → Usage. + +![Dashboard poskytovatelů](screenshots/01-providers.png) + +--- + +## 🎨 Kombinace + +Vytvářejte kombinace směrování modelů pomocí 6 strategií: prioritní, vážená, kruhová, náhodná, nejméně používaná a nákladově optimalizovaná. Každá kombinace řetězí více modelů s automatickým přepínáním mezi nimi a zahrnuje rychlé šablony a kontroly připravenosti. + +![Dashboard kombinací](screenshots/02-combos.png) + +--- + +## 📊 Analytika + +Komplexní analýzy využití se spotřebou tokenů, odhady nákladů, mapami aktivit, týdenními distribučními grafy a rozpisy podle jednotlivých poskytovatelů. + +![Analytický řídicí panel](screenshots/03-analytics.png) + +--- + +## 🏥 Stav systému + +Monitorování v reálném čase: dostupnost, paměť, verze, percentily latence (p50/p95/p99), statistiky mezipaměti a stavy jističů poskytovatelů. + +![Dashboard zdraví](screenshots/04-health.png) + +--- + +## 🔧 Překladatelské hřiště + +Čtyři režimy pro ladění překladů API: **Playground** (převodník formátů), **Chat Tester** (živé požadavky), **Test Bench** (dávkové testy) a **Live Monitor** (stream v reálném čase). + +![Hřiště překladatelů](screenshots/05-translator.png) + +--- + +## 🎮 Modelové hřiště *(v2.0.9+)* + +Otestujte libovolný model přímo z řídicího panelu. Vyberte poskytovatele, model a koncový bod, pište výzvy pomocí editoru Monaco, streamujte odpovědi v reálném čase, přerušte stream a zobrazte metriky časování. + +--- + +## 🎨 Témata *(v2.0.5+)* + +Přizpůsobitelná barevná témata pro celý dashboard. Vyberte si ze 7 přednastavených barev (korálová, modrá, červená, zelená, fialová, oranžová, azurová) nebo si vytvořte vlastní téma výběrem libovolné hexadecimální barvy. Podporuje světlý, tmavý a systémový režim. + +--- + +## ⚙️ Nastavení + +Komplexní panel nastavení s kartami: + +- **Obecné** – Systémové úložiště, správa záloh (export/import databáze) +- **Vzhled** – Výběr motivu (tmavý/světlý/systémový), přednastavené barevné motivy a vlastní barvy, viditelnost protokolu stavu +- **Zabezpečení** — ochrana koncových bodů API, blokování vlastních poskytovatelů, filtrování IP adres, informace o relaci +- **Směrování** — Aliasy modelů, degradace úloh na pozadí +- **Odolnost** — Perzistence omezení rychlosti, ladění jističe +- **Pokročilé** – Přepsání konfigurace + +![Ovládací panel nastavení](screenshots/06-settings.png) + +--- + +## 🔧 Nástroje CLI + +Konfigurace nástrojů pro kódování s umělou inteligencí jedním kliknutím: Claude Code, Codex CLI, Gemini CLI, OpenClaw, Kilo Code, Antigravity, Cline, Continue, Cursor a Factory Droid. Nabízí automatické použití/resetování konfigurace, profily připojení a mapování modelů. + +![Řídicí panel nástrojů CLI](screenshots/07-cli-tools.png) + +--- + +## 🤖 Agenti CLI *(v2.0.11+)* + +Ovládací panel pro vyhledávání a správu agentů CLI. Zobrazuje mřížku 14 vestavěných agentů (Codex, Claude, Goose, Gemini CLI, OpenClaw, Aider, OpenCode, Cline, Qwen Code, ForgeCode, Amazon Q, Open Interpreter, Cursor CLI, Warp) s: + +- **Stav instalace** — Nainstalováno / Nenalezeno s detekcí verze +- **Odznaky protokolů** – stdio, HTTP atd. +- **Vlastní agenti** — Registrace libovolného nástroje CLI pomocí formuláře (název, binární soubor, verze příkazu, argumenty spawn) +- **Porovnávání otisků prstů v příkazovém řádku** – Přepínání pro jednotlivé poskytovatele pro porovnávání nativních podpisů požadavků v příkazovém řádku, čímž se snižuje riziko zablokování a zároveň se zachovává IP adresa proxy. + +--- + +## 🖼️ Média *(v2.0.3+)* + +Generujte obrázky, videa a hudbu z řídicího panelu. Podporuje OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI, AnimateDiff, Stable Audio Open a MusicGen. + +--- + +## 📝 Vyžádat si protokoly + +Protokolování požadavků v reálném čase s filtrováním podle poskytovatele, modelu, účtu a klíče API. Zobrazuje stavové kódy, využití tokenů, latenci a podrobnosti o odpovědi. + +![Protokoly používání](screenshots/08-usage.png) + +--- + +## 🌐 Koncový bod API + +Váš jednotný koncový bod API s rozpisem funkcí: Dokončování chatu, API odpovědí, vkládání, generování obrázků, změna pořadí, přepis zvuku, převod textu na řeč, moderování a registrované klíče API. Podpora cloudového proxy pro vzdálený přístup. + +![Dashboard koncového bodu](screenshots/09-endpoint.png) + +--- + +## 🔑 Správa klíčů API + +Vytvářejte, upravujte rozsah a rušte klíče API. Každý klíč lze omezit na konkrétní modely/poskytovatele s plným přístupem nebo oprávněním pouze pro čtení. Vizuální správa klíčů se sledováním využití. + +--- + +## 📋 Záznam auditu + +Sledování administrativních akcí s filtrováním podle typu akce, aktéra, cíle, IP adresy a časového razítka. Úplná historie bezpečnostních událostí. + +--- + +## 🖥️ Desktopová aplikace + +Desktopová aplikace Native Electron pro Windows, macOS a Linux. Spouštějte OmniRoute jako samostatnou aplikaci s integrací do systémové lišty, podporou offline, automatickými aktualizacemi a instalací jedním kliknutím. + +Klíčové vlastnosti: + +- Dotazování připravenosti serveru (žádná prázdná obrazovka při studeném startu) +- Systémový panel se správou portů +- Zásady zabezpečení obsahu +- Jednoinstanční zámek +- Automatická aktualizace při restartu +- Podmíněné uživatelské rozhraní pro platformu (semafory pro macOS, výchozí záhlaví okna pro Windows/Linux) +- Zpevněné balení buildů Electron — symbolicky odkazované `node_modules` v samostatném balíčku jsou detekovány a odmítnuty před balením, čímž se zabrání závislosti na buildovacím stroji za běhu (v2.5.5+) + +📖 Úplnou dokumentaci naleznete v [`electron/README.md`](../electron/README.md) . diff --git a/docs/i18n/cs/MCP-SERVER.md b/docs/i18n/cs/MCP-SERVER.md new file mode 100644 index 00000000..ee2df76e --- /dev/null +++ b/docs/i18n/cs/MCP-SERVER.md @@ -0,0 +1,83 @@ +# Dokumentace k serveru OmniRoute MCP + +> Server protokolu kontextu modelu s 16 inteligentními nástroji + +## Instalace + +OmniRoute MCP je integrovaný. Spusťte ho pomocí: + +```bash +omniroute --mcp +``` + +Nebo prostřednictvím open-sse transportu: + +```bash +# HTTP streamable transport (port 20130) +omniroute --dev # MCP auto-starts on /mcp endpoint +``` + +## Konfigurace IDE + +Viz [konfigurace IDE](integrations/ide-configs.md) pro nastavení Antigravity, Cursoru, Copilota a Claude Desktopu. + +--- + +## Základní nástroje (8) + +Nástroj | Popis +:-- | :-- +`omniroute_get_health` | Stav brány, jističe, provozuschopnost +`omniroute_list_combos` | Všechny nakonfigurované kombinace s modely +`omniroute_get_combo_metrics` | Metriky výkonu pro konkrétní kombinaci +`omniroute_switch_combo` | Přepnout aktivní kombinaci podle ID/jména +`omniroute_check_quota` | Stav kvóty pro jednotlivé poskytovatele nebo všechny +`omniroute_route_request` | Odeslání dokončení chatu přes OmniRoute +`omniroute_cost_report` | Analýza nákladů za určité časové období +`omniroute_list_models_catalog` | Kompletní katalog modelů s funkcemi + +## Pokročilé nástroje (8) + +Nástroj | Popis +:-- | :-- +`omniroute_simulate_route` | Simulace trasování na dryru s fallback stromem +`omniroute_set_budget_guard` | Rozpočet relace s akcemi degradace/blokování/upozornění +`omniroute_set_resilience_profile` | Použít konzervativní/vyvážený/agresivní předvolbu +`omniroute_test_combo` | Živé testování všech modelů v kombinaci +`omniroute_get_provider_metrics` | Podrobné metriky pro jednoho poskytovatele +`omniroute_best_combo_for_task` | Doporučení pro splnění úkolu a jeho vhodnosti s alternativami +`omniroute_explain_route` | Vysvětlete minulé rozhodnutí o trase +`omniroute_get_session_snapshot` | Stav celé relace: náklady, tokeny, chyby + +## Ověřování + +Nástroje MCP jsou ověřovány pomocí rozsahů klíčů API. Každý nástroj vyžaduje specifické rozsahy: + +Rozsah | Nástroje +:-- | :-- +`read:health` | get_health, get_provider_metrics +`read:combos` | seznam_kombinací, získání_kombinovaných_metrik +`write:combos` | přepínač_kombinace +`read:quota` | check_quote +`write:route` | požadavek_trasy, simulace_trasy, testovací_kombinace +`read:usage` | zpráva_o_nákladech, získání_snímku_relace, vysvětlení_trasy +`write:config` | set_budget_guard, set_resilience_profile +`read:models` | seznam_modelů_katalog, nejlepší_kombinace_pro_úkol + +## Protokolování auditu + +Každé volání nástroje je zaznamenáno do `mcp_tool_audit` s touto funkcí: + +- Název nástroje, argumenty, výsledek +- Trvání (ms), úspěch/neúspěch +- Haš klíče API, časové razítko + +## Soubory + +Soubor | Účel +:-- | :-- +`open-sse/mcp-server/server.ts` | Vytvoření MCP serveru + 16 registrací nástrojů +`open-sse/mcp-server/transport.ts` | Stdio + HTTP transport +`open-sse/mcp-server/auth.ts` | Ověření klíče API + rozsahu +`open-sse/mcp-server/audit.ts` | Protokolování auditu volání nástrojů +`open-sse/mcp-server/tools/advancedTools.ts` | 8 pokročilých manipulátorů s nástroji diff --git a/docs/i18n/cs/README.md b/docs/i18n/cs/README.md new file mode 100644 index 00000000..9f95d787 --- /dev/null +++ b/docs/i18n/cs/README.md @@ -0,0 +1,2010 @@ +# 🚀 OmniRoute — Bezplatná brána umělé inteligence + +### 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** .* + +**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** + +--- + +
+
+

verze npmDocker HubLicenceWebové stránkyWhatsApp

+

🌐 Webové stránky🚀 Rychlý start💡 Funkce📖 Dokumentace💰 Ceník💬 WhatsApp

+
+ +🌐 **Dostupné v:** 🇺🇸 [Angličtina](README.md) | 🇧🇷 [Português (Brazílie)](docs/i18n/pt-BR/README.md) | 🇪🇸 [Español](docs/i18n/es/README.md) | 🇫🇷 [Français](docs/i18n/fr/README.md) | 🇮🇹 [Italiano](docs/i18n/it/README.md) | 🇷🇺 [Русский](docs/i18n/ru/README.md) | 🇨🇳[中文 (简体)](docs/i18n/zh-CN/README.md) | 🇩🇪 [Deutsch](docs/i18n/de/README.md) | 🇮🇳 [हिन्दी](docs/i18n/in/README.md) | 🇹🇭 [ไทย](docs/i18n/th/README.md) | 🇺🇦 [Українська](docs/i18n/uk-UA/README.md) | 🇸🇦 [العربية](docs/i18n/ar/README.md) | 🇯🇵[日本語](docs/i18n/ja/README.md)| 🇻🇳 [Tiếng Việt](docs/i18n/vi/README.md) | 🇧🇬 [Български](docs/i18n/bg/README.md) | 🇩🇰 [Dánsko](docs/i18n/da/README.md) | 🇫🇮 [Suomi](docs/i18n/fi/README.md) | 🇮🇱 [עברית](docs/i18n/he/README.md) | 🇭🇺 [maďarština](docs/i18n/hu/README.md) | 🇮🇩 [Bahasa Indonésie](docs/i18n/id/README.md) | 🇰🇷 [한국어](docs/i18n/ko/README.md) | 🇲🇾 [Bahasa Melayu](docs/i18n/ms/README.md) | 🇳🇱 [Nizozemsko](docs/i18n/nl/README.md) | 🇳🇴 [Norsk](docs/i18n/no/README.md) | 🇵🇹 [Português (Portugalsko)](docs/i18n/pt/README.md) | 🇷🇴 [Română](docs/i18n/ro/README.md) | 🇵🇱 [Polski](docs/i18n/pl/README.md) | 🇸🇰 [Slovenčina](docs/i18n/sk/README.md) | 🇸🇪 [Svenska](docs/i18n/sv/README.md) | 🇵🇭 [Filipínec](docs/i18n/phi/README.md) | 🇨🇿 [Čeština](docs/i18n/cs/README.md) + +--- + +## 🖼️ Hlavní ovládací panel + +
Řídicí panel OmniRoute
+ +--- + +## 📸 Náhled řídicího panelu + +
+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) + + + + +--- + +### 🤖 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í.* + + + + + + + + + + + + + + + + +
OpenClaw
OpenClaw

⭐ 205 tisíc
NanoBot
NanoBot

⭐ 20,9 tisíc
PicoClaw
PicoClaw

⭐ 14,6 tisíc
ZeroClaw
ZeroClaw

⭐ 9,9 tisíc
Železný dráp
Železný dráp

⭐ 2,1 tisíce
OpenCode
OpenCode

⭐ 106 tisíc
CLI Codexu
CLI Codexu

⭐ 60,8 tisíc
Claude Code
Claude Code

⭐ 67,3 tisíc
Rozhraní příkazového řádku Gemini
Rozhraní příkazového řádku Gemini

⭐ 94,7 tisíc
Kilo kód
Kilo kód

⭐ 15,5 tisíc
+ + +📡 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 + +--- + +## 🤔 Proč OmniRoute? + +**Přestaňte plýtvat penězi a narážet na limity:** + +- Kvóta předplatného vyprší každý měsíc +- Limity rychlosti vám zabrání v kódování +- Drahá API (20–50 USD/měsíc na poskytovatele) +- Ruční přepínání mezi poskytovateli + +**OmniRoute to řeší:** + +- ✅ **Maximalizujte předplatné** – Sledujte kvótu, využijte každou částku před resetováním +- ✅ **Automatické záložní** – Předplatné → API klíč → Levné → Zdarma, žádné výpadky +- ✅ **Více účtů** – Round-robin mezi účty u jednotlivých poskytovatelů +- ✅ **Univerzální** - Funguje s Claude Code, Codex, Gemini CLI, Cursor, Cline, OpenClaw a jakýmkoli nástrojem CLI + +--- + +## 📧 Podpora + +> 💬 **Přidejte se k naší komunitě!** [Skupina WhatsApp](https://chat.whatsapp.com/JI7cDQ1GyaiDHhVBpLxf8b?mode=gi_t) — Získejte pomoc, sdílejte tipy a buďte v obraze. + +- **Webová stránka** : [omniroute.online](https://omniroute.online) +- **GitHub** : [github.com/diegosouzapw/OmniRoute](https://github.com/diegosouzapw/OmniRoute) +- **Problémy** : [github.com/diegosouzapw/OmniRoute/issues](https://github.com/diegosouzapw/OmniRoute/issues) +- **WhatsApp** : [Komunitní skupina](https://chat.whatsapp.com/JI7cDQ1GyaiDHhVBpLxf8b?mode=gi_t) +- **Přispívání** : Viz [CONTRIBUTING.md](CONTRIBUTING.md) , otevřete žádost o příspěvek nebo si vyberte `good first issue` +- **Původní projekt** : [9router od decolua](https://github.com/decolua/9router) + +### 🐛 Hlásíte chybu? + +Při otevírání problému spusťte příkaz system-info a přiložte vygenerovaný soubor: + +```bash +npm run system-info +``` + +Tím se vygeneruje soubor `system-info.txt` s verzí Node.js, verzí OmniRoute, podrobnostmi o operačním systému, nainstalovanými nástroji CLI (iflow, gemini, claude, codex, antigravity, droid atd.), stavem Dockeru/PM2 a systémovými balíčky – vše, co potřebujeme k rychlé reprodukci vašeho problému. Soubor přiložte přímo k vašemu problému na GitHubu. + +--- + +## 🔄 Jak to funguje + +``` +┌─────────────┐ +│ Your CLI │ (Claude Code, Codex, Gemini CLI, OpenClaw, Cursor, Cline...) +│ Tool │ +└──────┬──────┘ + │ http://localhost:20128/v1 + ↓ +┌─────────────────────────────────────────┐ +│ OmniRoute (Smart Router) │ +│ • Format translation (OpenAI ↔ Claude) │ +│ • Quota tracking + Embeddings + Images │ +│ • Auto token refresh │ +└──────┬──────────────────────────────────┘ + │ + ├─→ [Tier 1: SUBSCRIPTION] Claude Code, Codex, Gemini CLI + │ ↓ quota exhausted + ├─→ [Tier 2: API KEY] DeepSeek, Groq, xAI, Mistral, NVIDIA NIM, etc. + │ ↓ budget limit + ├─→ [Tier 3: CHEAP] GLM ($0.6/1M), MiniMax ($0.2/1M) + │ ↓ budget limit + └─→ [Tier 4: FREE] iFlow, Qwen, Kiro (unlimited) + +Result: Never stop coding, minimal cost +``` + +--- + +## 🎯 Co řeší OmniRoute — 30 skutečných problémů a případů použití + +> **Každý vývojář používající nástroje umělé inteligence se s těmito problémy setkává denně.** OmniRoute byl vytvořen tak, aby je všechny vyřešil – od překročení nákladů po regionální bloky, od nefunkčních toků OAuth až po operace s protokoly a sledovatelnost v podniku. + +
+💸 1. „Platím si drahé předplatné, ale stále mě ruší limity“ +
+ +Vývojáři platí za Claude Pro, Codex Pro nebo GitHub Copilot 20–200 dolarů měsíčně. I při platbě má kvóta strop – 5 hodin používání, týdenní limity nebo limity rychlosti za minutu. Uprostřed kódovací relace poskytovatel přestane reagovat a vývojář ztrácí plynulost a produktivitu. + +**Jak to OmniRoute řeší:** + +- **Inteligentní čtyřúrovňová záložní služba** – Pokud dojde kvóta předplatného, ​​automaticky se přesměruje na API klíč → Levné → Zdarma bez manuálního zásahu +- **Sledování kvót v reálném čase** – Zobrazuje spotřebu tokenů v reálném čase s odpočítáváním resetování (5 hodin, denně, týdně) +- **Podpora více účtů** – Více účtů u jednoho poskytovatele s automatickým přepínáním – když jeden dojde, přepne se na další +- **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“ +
+ +OpenAI používá jeden formát, Claude (Anthropic) jiný a Gemini ještě třetí. Pokud chce vývojář testovat modely od různých poskytovatelů nebo mezi nimi přecházet, musí překonfigurovat SDK, změnit koncové body a vypořádat se s nekompatibilními formáty. Vlastní poskytovatelé (FriendLI, NIM) mají nestandardní koncové body modelů. + +**Jak to OmniRoute řeší:** + +- **Sjednocený koncový bod** — Jeden `http://localhost:20128/v1` slouží jako proxy pro všech 44+ poskytovatelů. +- **Překlad formátu** — Automatický a transparentní: OpenAI ↔ Claude ↔ Gemini ↔ Responses API +- **Sanitizace odpovědí** — Odstraňuje nestandardní pole ( `x_groq` , `usage_breakdown` , `service_tier` ), která porušují OpenAI SDK v1.83+ +- **Normalizace rolí** — Převádí `developer` → `system` pro poskytovatele bez OpenAI; `system` → `user` pro GLM/ERNIE +- **Extrakce tagů Think** — Extrahuje bloky `` z modelů, jako je DeepSeek R1, do standardizovaného `reasoning_content` +- **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“ +
+ +Poskytovatelé jako OpenAI/Codex blokují přístup z určitých geografických oblastí. Uživatelé se během připojení OAuth a API dostávají k chybám jako `unsupported_country_region_territory` . To je obzvláště frustrující pro vývojáře z rozvojových zemí. + +**Jak to OmniRoute řeší:** + +- **3úrovňová konfigurace proxy** – Konfigurovatelná proxy na 3 úrovních: globální (veškerý provoz), pro jednotlivé poskytovatele (pouze jeden poskytovatel) a pro jednotlivé připojení/klíč +- **Barevně kódované odznaky proxy** – Vizuální indikátory: 🟢 globální proxy, 🟡 proxy poskytovatele, 🔵 proxy připojení, vždy zobrazující IP adresu +- **Výměna tokenů OAuth prostřednictvím proxy** – tok OAuth také prochází přes proxy, čímž se řeší `unsupported_country_region_territory` +- **Testy připojení přes proxy** – Testy připojení používají nakonfigurovaný proxy (již žádné přímé obcházení) +- **Podpora SOCKS5** — Plná podpora proxy SOCKS5 pro odchozí směrování +- **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“ +
+ +Ne každý si může dovolit zaplatit 20–200 dolarů měsíčně za předplatné AI. Studenti, vývojáři z rozvíjejících se zemí, amatéři a freelanceři potřebují přístup ke kvalitním modelům za nulovou cenu. + +**Jak to OmniRoute řeší:** + +- **Vestavění poskytovatelé bezplatné úrovně** — Nativní podpora pro 100% bezplatné poskytovatele: iFlow (5 neomezených modelů přes OAuth: kimi-k2-thinking, qwen3-coder-plus, deepseek-r1, minimax-m2, kimi-k2), Qwen (4 neomezené modely: qwen3-coder-plus, qwen3-coder-flash, qwen3-coder-next, vision-model), Kiro (Claude + AWS Builder ID zdarma), Gemini CLI (180 tisíc tokenů/měsíc zdarma) +- **Ollama Cloud** — Cloudově hostované modely Ollama na `api.ollama.com` s bezplatnou úrovní „Light usage“; použijte prefix `ollamacloud/` +- **Kombinace pouze zdarma** — Chain `gc/gemini-3-flash → if/kimi-k2-thinking → qw/qwen3-coder-plus` = 0 $/měsíc s nulovými prostoji +- **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“ +
+ +Při zpřístupnění brány umělé inteligence síti (LAN, VPS, Docker) může kdokoli s adresou spotřebovat tokeny/kvótu vývojáře. Bez ochrany jsou API zranitelná vůči zneužití, prompt injection a dalšímu zneužití. + +**Jak to OmniRoute řeší:** + +- **Správa klíčů API** – generování, rotace a vymezování rozsahu pro každého poskytovatele s vyhrazenou stránkou `/dashboard/api-manager` +- **Oprávnění na úrovni modelu** – Omezení klíčů API na konkrétní modely ( `openai/*` , zástupné znaky) pomocí přepínače Povolit vše/Omezit +- **Ochrana koncových bodů API** – Vyžaduje klíč pro `/v1/models` a blokuje konkrétní poskytovatele ze seznamu +- **Auth Guard + CSRF Protection** — Všechny trasy dashboardu chráněné middlewarem `withAuth` + tokeny CSRF +- **Omezovač rychlosti** — Omezování rychlosti na IP s konfigurovatelnými okny +- **Filtrování IP adres** — Seznam povolených/blokovaných adres pro řízení přístupu +- **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“ +
+ +Poskytovatelé umělé inteligence se mohou stát nestabilními, vracet chyby 5xx nebo dosáhnout dočasných limitů rychlosti. Pokud je vývojář závislý na jediném poskytovateli, je jeho práce přerušena. Bez jističů může opakované pokusy vést k pádu aplikace. + +**Jak to OmniRoute řeší:** + +- **Jistič pro každý model** – Automatické otevírání/zavírání s konfigurovatelnými prahovými hodnotami a dobou ochlazování (Zavřeno/Otevřeno/Poloviční otevření), rozsah definovaný pro každý model, aby se zabránilo kaskádování bloků +- **Exponenciální odklad** — Progresivní zpoždění opakování +- **Anti-Thundering Herd** — ochrana Mutex + semafor proti souběžným bouřím s opakovanými pokusy +- **Kombinované záložní řetězce** – Pokud primární poskytovatel selže, automaticky se propadne řetězcem bez zásahu. +- **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“ +
+ +Vývojáři používají Cursor, Claude Code, Codex CLI, OpenClaw, Gemini CLI, Kilo Code... Každý nástroj potřebuje jinou konfiguraci (API endpoint, klíč, model). Překonfigurování při změně poskytovatele nebo modelu je ztráta času. + +**Jak to OmniRoute řeší:** + +- **Panel nástrojů CLI** — Vyhrazená stránka s nastavením jedním kliknutím pro Claude Code, Codex CLI, OpenClaw, Kilo Code, Antigravity a Cline +- **Generátor konfigurace GitHub Copilot** – Generuje `chatLanguageModels.json` pro VS Code s hromadným výběrem modelu +- **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“ +
+ +Claude Code, Codex, Gemini CLI, Copilot – všechny používají OAuth 2.0 s tokeny s vypršením platnosti. Vývojáři se musí neustále znovu autentizovat, řešit chyby `client_secret is missing` , `redirect_uri_mismatch` a chyby na vzdálených serverech. Obzvláště problematický je OAuth v LAN/VPS. + +**Jak to OmniRoute řeší:** + +- **Automatická aktualizace tokenů** – Tokeny OAuth se obnovují na pozadí před vypršením platnosti. +- **Vestavěný OAuth 2.0 (PKCE)** – Automatický tok pro Claude Code, Codex, Gemini CLI, Copilot, Kiro, Qwen, iFlow +- **Multi-Account OAuth** — Více účtů na poskytovatele prostřednictvím extrakce tokenů JWT/ID +- **OAuth LAN/Remote Fix** — Detekce privátní IP adresy pro `redirect_uri` + manuální režim URL pro vzdálené servery +- **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“ +
+ +Vývojáři používají více placených poskytovatelů, ale nemají jednotný přehled o výdajích. Každý poskytovatel má svůj vlastní fakturační panel, ale neexistuje žádný konsolidovaný přehled. Mohou se hromadit neočekávané náklady. + +**Jak to OmniRoute řeší:** + +- **Dashboard pro analýzu nákladů** – Sledování nákladů na token a správa rozpočtu pro každého poskytovatele +- **Rozpočtové limity na úroveň** – Strop výdajů na úroveň, který spouští automatický záložní režim +- **Konfigurace cen podle modelu** – Konfigurovatelné ceny podle modelu +- **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.“ +
+ +Když volání selže, vývojář neví, zda se jednalo o limit rychlosti, vypršelý token, špatný formát nebo chybu poskytovatele. Fragmentované protokoly napříč různými terminály. Bez sledovatelnosti je ladění metodou pokus-omyl. + +**Jak to OmniRoute řeší:** + +- **Panel jednotných protokolů** – 4 karty: Protokoly požadavků, Protokoly proxy, Protokoly auditu, Konzole +- **Prohlížeč protokolů konzole** — Prohlížeč protokolů v reálném čase ve stylu terminálu s barevně kódovanými úrovněmi, automatickým posouváním, vyhledáváním a filtrováním +- **Protokoly proxy SQLite** – trvalé protokoly, které přežijí restart serveru +- **Překladačské hřiště** — 4 režimy ladění: Hřiště (překlad formátu), Tester chatu (okružní), Testovací stůl (dávkový), Živý monitor (v reálném čase) +- **Telemetrie požadavků** — latence p50/p95/p99 + trasování X-Request-Id +- **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á“ +
+ +Instalace, konfigurace a údržba AI proxy v různých prostředích (lokální, VPS, Docker, cloud) je pracná. Problémy, jako jsou pevně zakódované cesty, `EACCES` u adresářů, konflikty portů a multiplatformní sestavení, přispívají k obtížím. + +**Jak to OmniRoute řeší:** + +- **npm globální instalace** — `npm install -g omniroute && omniroute` — hotovo +- **Docker Multi-Platform** — AMD64 + nativní ARM64 (Apple Silicon, AWS Graviton, Raspberry Pi) +- **Profily Docker Compose** — `base` (bez nástrojů CLI) a `cli` (s Claude Code, Codex, OpenClaw) +- **Desktopová aplikace Electron** — Nativní aplikace pro Windows/macOS/Linux se systémovou lištou, automatickým spuštěním a offline režimem +- **Režim rozdělených portů** – API a řídicí panel na samostatných portech pro pokročilé scénáře (reverzní proxy, síťování kontejnerů) +- **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“ +
+ +Týmy v neanglicky mluvících zemích, zejména v Latinské Americe, Asii a Evropě, se potýkají s rozhraními pouze v angličtině. Jazykové bariéry snižují míru přijetí a zvyšují chyby v konfiguraci. + +**Jak to OmniRoute řeší:** + +- **Dashboard i18n — 30 jazyků** — Všech 500+ kláves je přeloženo včetně arabštiny, bulharštiny, dánštiny, němčiny, španělštiny, finštiny, francouzštiny, hebrejštiny, hindštiny, maďarštiny, indonéštiny, italštiny, japonštiny, korejštiny, malajštiny, holandštiny, norštiny, polštiny, portugalštiny (PT/BR), rumunštiny, ruštiny, slovenštiny, švédštiny, thajštiny, ukrajinštiny, vietnamštiny, čínštiny, filipínštiny a angličtiny +- **Podpora RTL** – Podpora psaní zprava doleva pro arabštinu a hebrejštinu +- **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.“ +
+ +Umělá inteligence není jen dokončování chatu. Vývojáři potřebují generovat obrázky, přepisovat zvuk, vytvářet embeddedy pro RAG, měnit pořadí dokumentů a moderovat obsah. Každé API má jiný koncový bod a formát. + +**Jak to OmniRoute řeší:** + +- **Vkládání** — `/v1/embeddings` s 6 poskytovateli a 9+ modely +- **Generování obrázků** — `/v1/images/generations` s 10 poskytovateli a více než 20 modely (OpenAI, xAI, Together, Fireworks, Nebius, Hyperbolic, NanoBanana, Antigravity, SD WebUI, ComfyUI) +- **Převod textu na video** — `/v1/videos/generations` — ComfyUI (AnimateDiff, SVD) a SD WebUI +- **Převod textu na hudbu** — `/v1/music/generations` — ComfyUI (Stable Audio Open, MusicGen) +- **Přepis zvuku** — `/v1/audio/transcriptions` — Whisper + Nvidia NIM, HuggingFace, Qwen3 +- **Převod textu na řeč** — `/v1/audio/speech` — ElevenLabs, Nvidia NIM, HuggingFace, Coqui, Tortoise, Qwen3, **Inworld** , **Cartesia** , **PlayHT** a další stávající poskytovatelé +- **Moderování** — `/v1/moderations` — Kontroly bezpečnosti obsahu +- **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.“ +
+ +Vývojáři chtějí vědět, který model je pro jejich případ použití nejlepší – kód, překlad, uvažování – ale ruční porovnávání je pomalé. Neexistují žádné integrované nástroje pro vyhodnocování. + +**Jak to OmniRoute řeší:** + +- **Hodnocení LLM** — Testování Golden setu s 10 předinstalovanými případy zahrnujícími pozdravy, matematiku, geografii, generování kódu, dodržování JSON, překlad, markdown, odmítnutí bezpečnostních požadavků +- **4 strategie shody** — `exact` , `contains` , `regex` , `custom` (JS funkce) +- **Testovací lavice pro překladatelské hřiště** — Dávkové testování s více vstupy a očekávanými výstupy, porovnání napříč poskytovateli +- **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“ +
+ +S rostoucím objemem požadavků generují stejné otázky bez ukládání do mezipaměti duplicitní náklady. Bez idempotence duplicitní požadavky plýtvají zpracováním. Je nutné dodržovat limity rychlosti na poskytovatele. + +**Jak to OmniRoute řeší:** + +- **Sémantická mezipaměť** — Dvouvrstvá mezipaměť (signatura + sémantika) snižuje náklady a latenci +- **Idempotence požadavku** — 5s deduplikační okno pro identické požadavky +- **Detekce limitu rychlosti** – sledování otáček za minutu (RPM), minimální mezera a maximální souběžné sledování pro každého poskytovatele +- **Upravitelné limity rychlosti** — Konfigurovatelné výchozí hodnoty v Nastavení → Odolnost s perzistencí +- **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“ +
+ +Vývojáři, kteří chtějí všechny odpovědi v určitém jazyce, se specifickým tónem nebo chtějí omezit tokeny pro uvažování. Konfigurace této funkce v každém nástroji/požadavku je nepraktická. + +**Jak to OmniRoute řeší:** + +- **Vložení systémového prompt** – Globální prompt aplikovaný na všechny požadavky +- **Validace rozpočtu Thinking** — Řízení alokace tokenů na požadavek (průchozí, automatické, vlastní, adaptivní) +- **6 strategií směrování** – Globální strategie, které určují, jak jsou požadavky distribuovány +- **Směrovač se zástupnými znaky** — vzory `provider/*` dynamicky směrují k libovolnému poskytovateli +- **Přepínání povolení/zakázání kombinací** – Přepínání kombinací přímo z řídicího panelu +- **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.“ +
+ +Mnoho bran umělé inteligence odhaluje MCP pouze jako skrytý implementační detail. Týmy potřebují viditelnou a spravovatelnou operační vrstvu. + +**Jak to OmniRoute řeší:** + +- MCP se zobrazuje v navigaci na řídicím panelu a na kartě protokolu koncového bodu. +- 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.“ +
+ +Pracovní postupy agentů vyžadují jak přímé odpovědi, tak dlouhodobé streamované provádění s kontrolou životního cyklu. + +**Jak to OmniRoute řeší:** + +- Koncový bod A2A JSON-RPC ( `POST /a2a` ) s `message/send` `message/stream` +- 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.“ +
+ +Provozní týmy potřebují vědět, zda je MCP skutečně aktivní, nejen zda je API dosažitelné. + +**Jak to OmniRoute řeší:** + +- Soubor běhového heartbeatu s PID, časovými razítky, transportem, počtem nástrojů a režimem rozsahu +- 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“ +
+ +Když nástroje mění konfiguraci nebo spouštějí operační akce, týmy potřebují forenzní sledovatelnost. + +**Jak to OmniRoute řeší:** + +- Protokolování auditu pro volání nástrojů MCP s podporou SQLite +- 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.“ +
+ +Různí klienti by měli mít přístup ke kategoriím nástrojů s nejnižšími oprávněními. + +**Jak to OmniRoute řeší:** + +- 9 detailních MCP sond pro kontrolovaný přístup k nástrojů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í“ +
+ +Týmy potřebují rychlé změny v běhovém prostředí během incidentů nebo nákladových událostí. + +**Jak to OmniRoute řeší:** + +- Přepněte aktivaci komba přímo z řídicího panelu MCP +- 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í.“ +
+ +Bez přehledu o životním cyklu je obtížné třídit incidenty úkolů. + +**Jak to OmniRoute řeší:** + +- Výpis/filtrování úkolů podle státu/dovednosti s stránkováním +- 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ěž“ +
+ +Streamovací pracovní postupy vyžadují provozní přehled o souběžnosti a živých připojeních. + +**Jak to OmniRoute řeší:** + +- Čítače aktivních streamů integrované do stavu A2A +- Č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“ +
+ +Externí klienti a orchestratoři potřebují pro onboarding strojově čitelná metadata. + +**Jak to OmniRoute řeší:** + +- Karta agenta je k dispozici v souboru `/.well-known/agent.json` +- 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.“ +
+ +Pokud uživatelé nemohou objevit protokolové povrchy, kvalita přijetí a podpory klesá. + +**Jak to OmniRoute řeší:** + +- Stránka Konsolidované **koncové body** s kartami pro koncové body Proxy, MCP, A2A a API +- 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.“ +
+ +Simulované testy nestačí k ověření kompatibility protokolu před vydáním. + +**Jak to OmniRoute řeší:** + +- Sada E2E, která spouští aplikaci a používá skutečný transport klienta MCP SDK. +- 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“ +
+ +Rozdělení pozorovatelnosti podle protokolu vytváří slepá místa a delší MTTR. + +**Jak to OmniRoute řeší:** + +- Sjednocené dashboardy/logy/analytiky v jednom produktu +- 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ů“ +
+ +Spouštění mnoha samostatných služeb zvyšuje provozní náklady a počet poruch. + +**Jak to OmniRoute řeší:** + +- Proxy, MCP server a A2A server kompatibilní s OpenAI v jednom balíčku +- 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.“ +
+ +Týmy ztrácejí rychlost při spojování více ad-hoc služeb a skriptů. + +**Jak to OmniRoute řeší:** + +- Sjednocená strategie koncových bodů pro klienty a agenty +- 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í** + +```txt +Combo: "maximize-claude" + 1. cc/claude-opus-4-6 + 2. glm/glm-4.7 + 3. if/kimi-k2-thinking + +Monthly cost: $20 + small backup spend +Outcome: higher quality, near-zero interruption +``` + +**Příručka B: Kódovací stack s nulovými náklady** + +```txt +Combo: "free-forever" + 1. gc/gemini-3-flash + 2. if/kimi-k2-thinking + 3. qw/qwen3-coder-plus + +Monthly cost: $0 +Outcome: stable free coding workflow +``` + +**Příručka C: Nonstop záložní řetězec** + +```txt +Combo: "always-on" + 1. cc/claude-opus-4-6 + 2. cx/gpt-5.2-codex + 3. glm/glm-4.7 + 4. minimax/MiniMax-M2.1 + 5. if/kimi-k2-thinking + +Outcome: deep fallback depth for deadline-critical workloads +``` + +**Příručka D: Operace agentů s MCP + A2A** + +```txt +1) Start MCP transport (`omniroute --mcp`) for tool-driven operations +2) Run A2A tasks via `message/send` and `message/stream` +3) Observe via /dashboard/endpoint (MCP and A2A tabs) +4) Toggle services via inline status controls +``` + +--- + +## 🆓 Začněte zdarma — Nulové náklady na konfiguraci + +> 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 + +**V libovolném IDE/CLI naveďte:** `http://localhost:20128/v1` · Klíč API: `any-string` · Hotovo. + +> **Volitelné doplňkové krytí (také zdarma):** Groq API klíč (30 RPM zdarma), NVIDIA NIM (40 RPM zdarma, 70+ modelů), Cerebras (1 milion tok/den). + +## ⚡ Rychlý start + +### 1) Nainstalujte a spusťte + +```bash +npm install -g omniroute +omniroute +``` + +> **Uživatelé pnpm:** Po instalaci spusťte `pnpm approve-builds -g` , abyste povolili nativní skripty pro sestavení vyžadované programy `better-sqlite3` a `@swc/core` : +> +> ```bash +> pnpm install -g omniroute +> pnpm approve-builds -g # Select all packages → approve +> 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 + +Volitelný režim s rozděleným portem: + +```bash +PORT=20128 DASHBOARD_PORT=20129 omniroute +# API: http://localhost:20128/v1 +# Dashboard: http://localhost:20129 +``` + +### 2) Připojte poskytovatele a vytvořte si klíč API + +1. Otevřete Dashboard → `Providers` a připojte alespoň jednoho poskytovatele (klíč OAuth nebo API). +2. Otevřete Dashboard → `Endpoints` a vytvořte API klíč. +3. (Volitelné) Otevřete Dashboard → `Combos` a nastavte záložní řetězec. + +### 3) Nasměrujte svůj kódovací nástroj na OmniRoute + +```txt +Base URL: http://localhost:20128/v1 +API Key: [copy from Endpoint page] +Model: if/kimi-k2-thinking (or any provider/model prefix) +``` + +Funguje s Claude Code, Codex CLI, Gemini CLI, Cursor, Cline, OpenClaw, OpenCode a SDK kompatibilními s OpenAI. + +### 4) Povolení a ověření protokolů (v2.0) + +**MCP (pro operace řízené nástroji):** + +```bash +omniroute --mcp +``` + +Pak připojte svého MCP klienta přes `stdio` a otestujte nástroje jako: + +- `omniroute_get_health` +- `omniroute_list_combos` + +**A2A (pro pracovní postupy mezi agenty):** + +```bash +curl http://localhost:20128/.well-known/agent.json +``` + +```bash +curl -X POST http://localhost:20128/a2a \ + -H 'content-type: application/json' \ + -d '{"jsonrpc":"2.0","id":"quickstart","method":"message/send","params":{"skill":"quota-management","messages":[{"role":"user","content":"Give me a short quota summary."}]}}' +``` + +### 5) Ověřte vše od začátku do konce (doporučeno) + +```bash +npm run test:protocols:e2e +``` + +Tato sada ověřuje skutečné toky klientů MCP a A2A v porovnání se spuštěnou aplikací. + +### Alternativa: spustit ze zdroje + +```bash +cp .env.example .env +npm install +PORT=20128 DASHBOARD_PORT=20129 NEXT_PUBLIC_BASE_URL=http://localhost:20129 npm run dev +``` + +--- + +## 🐳 Docker + +OmniRoute je k dispozici jako veřejný obraz Dockeru na [Docker Hubu](https://hub.docker.com/r/diegosouzapw/omniroute) . + +**Rychlý běh:** + +```bash +docker run -d \ + --name omniroute \ + --restart unless-stopped \ + -p 20128:20128 \ + -v omniroute-data:/app/data \ + diegosouzapw/omniroute:latest +``` + +**Se souborem prostředí:** + +```bash +# Copy and edit .env first +cp .env.example .env + +docker run -d \ + --name omniroute \ + --restart unless-stopped \ + --env-file .env \ + -p 20128:20128 \ + -v omniroute-data:/app/data \ + diegosouzapw/omniroute:latest +``` + +**Používání Docker Compose:** + +```bash +# Base profile (no CLI tools) +docker compose --profile base up -d + +# CLI profile (Claude Code, Codex, OpenClaw built-in) +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 + +--- + +## 🖥️ Desktopová aplikace – offline a vždy zapnutá + +> 🆕 **NOVINKA!** OmniRoute je nyní k dispozici jako **nativní desktopová aplikace** pro Windows, macOS a Linux. + +Spusťte OmniRoute jako samostatnou desktopovou aplikaci – pro lokální modely není potřeba žádný terminál, prohlížeč ani internet. Aplikace založená na platformě Electron obsahuje: + +- 🖥️ **Nativní okno** — Vyhrazené okno aplikace s integrací do systémové lišty +- 🔄 **Automatické spuštění** — Spuštění OmniRoute po přihlášení do systému +- 🔔 **Nativní oznámení** – Získejte upozornění na vyčerpání kvóty nebo problémy s poskytovateli +- ⚡ **Instalace jedním kliknutím** — NSIS (Windows), DMG (macOS), AppImage (Linux) +- 🌐 **Offline režim** — Funguje plně offline s přiloženým serverem + +### Rychlý start + +```bash +# Development mode +npm run electron:dev + +# Build for your platform +npm run electron:build # Current platform +npm run electron:build:win # Windows (.exe) +npm run electron:build:mac # macOS (.dmg) — x64 & arm64 +npm run electron:build:linux # Linux (.AppImage) +``` + +### Systémový zásobník + +Po minimalizaci se OmniRoute nachází v systémové liště a nabízí rychlé akce: + +- Otevřít řídicí panel +- Změnit port serveru +- Ukončit aplikaci + +📖 Úplná dokumentace: [`electron/README.md`](electron/README.md) + +--- + +## 💰 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) + +> 🆕 **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) +``` + +**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í. + +--- + +--- + +## 🆓 Bezplatné modely – Co skutečně získáte + +> Všechny níže uvedené modely jsou **100% zdarma a nevyžadují žádnou kreditní kartu** . OmniRoute mezi nimi automaticky propojí trasy, když dojde jedna kvóta – zkombinujte je všechny a získejte tak nerozlučnou kombinaci za 0 dolarů. + +### 🔵 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 + +### 🟢 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 + +### 🟡 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) + +### 🟣 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 + +### ⚫ 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 + +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 + +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 + +K dispozici zdarma: `llama-3.3-70b-versatile` , `gemma2-9b-it` , `mixtral-8x7b` , `whisper-large-v3` + +> **💡 Ultimátní bezplatný zásobník:** +> +> ``` +> 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) +> ``` +> +> Nakonfigurujte si to jako kombinaci OmniRoute a už nikdy nebudete platit za umělou inteligenci. + +## 🎙️ Kombinovaná transkripce zdarma + +> 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) + +**Navrhovaná kombinace v `/dashboard/combos` :** + +``` +Name: free-transcription +Strategy: Priority +Nodes: + [1] deepgram/nova-3 → uses $200 free first + [2] assemblyai/universal-3-pro → fallback when Deepgram credits run out + [3] groq/whisper-large-v3 → free forever, emergency fallback +``` + +Pak v `/dashboard/media` → záložka **Přepis** : nahrajte libovolný zvukový nebo video soubor → vyberte kombinovaný koncový bod → získejte přepis v podporovaných formátech. + +## 💡 Klíčové vlastnosti + +OmniRoute v2.0 je navržen jako operační platforma, nikoli pouze jako proxy pro relé. + +### 🆕 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 + +### 🚀 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 + +### 🤖 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 + +### 🧠 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 + +### 🎵 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ěť + +### 🛡️ 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ů + +### 📊 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 + +### ☁️ 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ě + +### Hluboký pohled na funkce + +#### Chytrá záložní funkce s praktickou kontrolou nákladů + +```txt +Combo: "my-coding-stack" + 1. cc/claude-opus-4-6 + 2. nvidia/llama-3.3-70b + 3. glm/glm-4.7 + 4. if/kimi-k2-thinking +``` + +Když selže kvóta, rychlost nebo stav, OmniRoute automaticky přejde k dalšímu kandidátovi bez nutnosti ručního přepínání. + +#### Správa protokolů, která je viditelná a ovladatelná + +- MCP + A2A jsou viditelné v uživatelském rozhraní a dokumentaci (nejsou skryté) +- API pro stav protokolu zpřístupňují živá provozní data ( `/api/mcp/*` , `/api/a2a/*` ) +- Dashboardy zahrnují akce pro operace 2. dne (přepínání kombinací, resetování jističů, zrušení úkolů) + +#### Pracovní postup překladatele + validace + +Oblast překladatele zahrnuje: + +- **Hřiště** : kontroly transformace požadavků +- **Tester chatu** : kompletní okružní cesta požadavku/odpovědi +- **Testovací stolice** : více případů v jednom běhu +- **Živý monitor** : zobrazení provozu v reálném čase + +Plus validace protokolu se skutečnými klienty pomocí `npm run test:protocols:e2e` . + +> 📖 **[Soubor README pro MCP Server](open-sse/mcp-server/README.md)** — Referenční informace o nástrojích, konfigurace IDE a příklady klientů +> +> 📖 **[Soubor README pro A2A Server](src/lib/a2a/README.md)** — Dovednosti, metody JSON-RPC, streamování a životní cyklus úloh + +## 🧪 Hodnocení (Evals) + +OmniRoute obsahuje vestavěný hodnotící rámec pro testování kvality odpovědí LLM v porovnání se zlatou sadou. Přístup k němu je možný přes **Analýzy → Hodnocení** v dashboardu. + +### Vestavěná zlatá sada + +Předinstalovaná sada „OmniRoute Golden Set“ obsahuje testovací případy pro: + +- Zdravím, matematika, zeměpis, generování kódu +- Shoda s formátem JSON, překlad, generování markdownů +- Bezpečnostní odmítnutí (škodlivý obsah), počítání, booleovská logika + +### 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` + +--- + +## 📖 Průvodce nastavením + +### Nastavení protokolu (MCP + A2A) + +
+🧩 Nastavení MCP (Model Context Protocol) +
+ +Spuštění MCP transportu v režimu stdio: + +```bash +omniroute --mcp +``` + +Doporučený postup ověření: + +1. Připojte svého MCP klienta přes stdio. +2. Spusťte `omniroute_get_health` . +3. Spusťte `omniroute_list_combos` . +4. Otevřete `/dashboard/mcp` pro ověření prezenčního signálu, aktivity a auditu. + +Užitečná API pro automatizaci: + +- `GET /api/mcp/status` +- `GET /api/mcp/tools` +- `GET /api/mcp/audit` +- `GET /api/mcp/audit/stats` + + + + +
+🤝 Nastavení A2A (Agent2Agent) +
+ +Objevte agenta: + +```bash +curl http://localhost:20128/.well-known/agent.json +``` + +Odeslat úkol: + +```bash +curl -X POST http://localhost:20128/a2a \ + -H 'content-type: application/json' \ + -d '{"jsonrpc":"2.0","id":"setup-a2a","method":"message/send","params":{"skill":"quota-management","messages":[{"role":"user","content":"Summarize quota status."}]}}' +``` + +Správa životního cyklu: + +- `GET /api/a2a/status` +- `GET /api/a2a/tasks` +- `GET /api/a2a/tasks/:id` +- `POST /api/a2a/tasks/:id/cancel` + +Provozní uživatelské rozhraní: + +- `/dashboard/a2a` pro pozorovatelnost úloh/stavů/streamů a akce kouření + + + + +
+🧪 Komplexní validace protokolu +
+ +Ověřte oba protokoly se skutečnými klienty: + +```bash +npm run test:protocols:e2e +``` + +Tím se ověřuje: + +- Připojení/seznam/volání klienta MCP SDK +- 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 +
+ +### Claude Code (Pro/Max) + +```bash +Dashboard → Providers → Connect Claude Code +→ OAuth login → Auto token refresh +→ 5-hour + weekly quota tracking + +Models: + cc/claude-opus-4-6 + cc/claude-sonnet-4-5-20250929 + cc/claude-haiku-4-5-20251001 +``` + +**Tip pro profesionály:** Pro složité úkoly používejte Opus, pro rychlost Sonnet. OmniRoute sleduje kvótu pro každý model! + +### OpenAI Codex (Plus/Pro) + +```bash +Dashboard → Providers → Connect Codex +→ OAuth login (port 1455) +→ 5-hour + weekly reset + +Models: + cx/gpt-5.2-codex + cx/gpt-5.1-codex-max +``` + +#### Správa limitů účtu Codex (5h + týdně) + +Každý účet Codex má nyní přepínače zásad v `Dashboard -> Providers` : + +- `5h` (ZAP/VYP): vynutit politiku 5hodinového prahu okna. +- `Weekly` (ZAP/VYP): vynutit zásadu týdenního prahu okna. +- Prahové chování: když povolené okno dosáhne využití >=90 %, je daný účet přeskočen. +- Chování rotace: OmniRoute automaticky přesměruje na další způsobilý účet Codex. +- Chování při resetování: Po `resetAt` určité doby se účet automaticky opět stane způsobilým. + +Scénáře: + +- `5h ON` + `Weekly ON` : účet je přeskočen, když kterékoli z oken dosáhne prahové hodnoty. +- `5h OFF` + `Weekly ON` : účet může být zablokován pouze týdenním používáním. +- `5h ON` + `Weekly OFF` : účet může být zablokován pouze při 5hodinovém používání. +- `resetAt` passed: účet se automaticky znovu zapne (bez ručního opětovného povolení). + +### Gemini CLI (ZDARMA 180 000/měsíc!) + +```bash +Dashboard → Providers → Connect Gemini CLI +→ Google OAuth +→ 180K completions/month + 1K/day + +Models: + gc/gemini-3-flash-preview + gc/gemini-2.5-pro +``` + +**Nejlepší hodnota:** Obrovská bezplatná úroveň! Použijte ji před placenými úrovněmi. + +### GitHub Copilot + +```bash +Dashboard → Providers → Connect GitHub +→ OAuth via GitHub +→ Monthly reset (1st of month) + +Models: + gh/gpt-5 + gh/claude-4.5-sonnet + gh/gemini-3-pro +``` + + + + +
+🔑 Poskytovatelé klíčů API +
+ +### NVIDIA NIM (BEZPLATNÝ přístup pro vývojáře — více než 70 modelů) + +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` + +**Modely:** `nvidia/llama-3.3-70b-instruct` , `nvidia/mistral-7b-instruct` a více než 50 dalších + +**Tip pro profesionály:** API kompatibilní s OpenAI – funguje bez problémů s překladem formátů OmniRoute! + +### Hluboké vyhledávání + +1. Registrace: [platform.deepseek.com](https://platform.deepseek.com) +2. Získat klíč API +3. Ovládací panel → Přidat poskytovatele → DeepSeek + +**Modely:** `deepseek/deepseek-chat` , `deepseek/deepseek-coder` + +### Groq (k dispozici je bezplatná úroveň!) + +1. Registrace: [console.groq.com](https://console.groq.com) +2. Získejte klíč API (včetně bezplatné úrovně) +3. Ovládací panel → Přidat poskytovatele → Groq + +**Modely:** `groq/llama-3.3-70b` , `groq/mixtral-8x7b` + +**Tip pro profesionály:** Ultrarychlá inference – nejlepší pro kódování v reálném čase! + +### OpenRouter (100+ modelů) + +1. Registrace: [openrouter.ai](https://openrouter.ai) +2. Získat klíč API +3. Ovládací panel → Přidat poskytovatele → OpenRouter + +**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í) +
+ +### GLM-4.7 (Denní reset, 0,6 USD/1 milion) + +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` + +**Použití:** `glm/glm-4.7` + +**Tip pro profesionály:** Programovací plán nabízí 3× kvótu za cenu 1/7! Obnovuje se denně v 10:00. + +### MiniMax M2.1 (5h reset, 0,20 $/1 milion) + +1. Registrace: [MiniMax](https://www.minimax.io/) +2. Získat klíč API +3. Nástěnka → Přidat klíč API + +**Použití:** `minimax/MiniMax-M2.1` + +**Tip pro profesionály:** Nejlevnější varianta pro dlouhý kontext (1 milion tokenů)! + +### Kimi K2 (paušální poplatek 9 dolarů měsíčně) + +1. Odebírat: [Moonshot AI](https://platform.moonshot.ai/) +2. Získat klíč API +3. Nástěnka → Přidat klíč API + +**Použití:** `kimi/kimi-latest` + +**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í) +
+ +### iFlow (5 BEZPLATNÝCH modelů přes OAuth) + +```bash +Dashboard → Connect iFlow +→ iFlow OAuth login +→ Unlimited usage + +Models: + if/kimi-k2-thinking + if/qwen3-coder-plus + if/glm-4.7 + if/minimax-m2 + if/deepseek-r1 +``` + +### Qwen (4 modely ZDARMA s kódem zařízení) + +```bash +Dashboard → Connect Qwen +→ Device code authorization +→ Unlimited usage + +Models: + qw/qwen3-coder-plus + qw/qwen3-coder-flash +``` + +### Kiro (Claude ZDARMA) + +```bash +Dashboard → Connect Kiro +→ AWS Builder ID or Google/GitHub +→ Unlimited usage + +Models: + kr/claude-sonnet-4.5 + kr/claude-haiku-4.5 +``` + + + + +
+🎨 Vytvořte kombinace +
+ +### Příklad 1: Maximalizace předplatného → Levné zálohování + +``` +Dashboard → Combos → Create New + +Name: premium-coding +Models: + 1. cc/claude-opus-4-6 (Subscription primary) + 2. glm/glm-4.7 (Cheap backup, $0.6/1M) + 3. minimax/MiniMax-M2.1 (Cheapest fallback, $0.20/1M) + +Use in CLI: premium-coding +``` + +### Příklad 2: Pouze zdarma (nulové náklady) + +``` +Name: free-combo +Models: + 1. gc/gemini-3-flash-preview (180K free/month) + 2. if/kimi-k2-thinking (unlimited) + 3. qw/qwen3-coder-plus (unlimited) + +Cost: $0 forever! +``` + + + + +
+🔧 Integrace s rozhraním příkazového řádku +
+ +### IDE kurzoru + +``` +Settings → Models → Advanced: + OpenAI API Base URL: http://localhost:20128/v1 + OpenAI API Key: [from OmniRoute dashboard] + Model: cc/claude-opus-4-6 +``` + +### Claude Code + +Pro konfiguraci jedním kliknutím použijte stránku **Nástroje CLI** na řídicím panelu nebo ručně upravte soubor `~/.claude/settings.json` . + +### CLI Codexu + +```bash +export OPENAI_BASE_URL="http://localhost:20128" +export OPENAI_API_KEY="your-omniroute-api-key" + +codex "your prompt" +``` + +### OpenClaw + +**Možnost 1 – Dashboard (doporučeno):** + +``` +Dashboard → CLI Tools → OpenClaw → Select Model → Apply +``` + +**Možnost 2 – Manuální úprava:** Úprava `~/.openclaw/openclaw.json` : + +```json +{ + "models": { + "providers": { + "omniroute": { + "baseUrl": "http://127.0.0.1:20128/v1", + "apiKey": "sk_omniroute", + "api": "openai-completions" + } + } + } +} +``` + +> **Poznámka:** OpenClaw funguje pouze s lokálním OmniRoute. Místo `localhost` použijte `127.0.0.1` , abyste se vyhnuli problémům s rozlišením IPv6. + +### Cline / Pokračovat / RooCode + +``` +Settings → API Configuration: + Provider: OpenAI Compatible + Base URL: http://localhost:20128/v1 + API Key: [from OmniRoute dashboard] + Model: if/kimi-k2-thinking +``` + +### OpenCode + +**Krok 1:** Přidání OmniRoute jako vlastního poskytovatele: + +```bash +opencode +/connect +# Select "Other" → Enter ID: "omniroute" → Enter your OmniRoute API key +``` + +**Krok 2:** Vytvořte/upravte `opencode.json` v kořenovém adresáři projektu: + +```json +{ + "$schema": "https://opencode.ai/config.json", + "provider": { + "omniroute": { + "npm": "@ai-sdk/openai-compatible", + "name": "OmniRoute", + "options": { + "baseURL": "http://localhost:20128/v1" + }, + "models": { + "cc/claude-sonnet-4-20250514": { "name": "Claude Sonnet 4" }, + "gg/gemini-2.5-pro": { "name": "Gemini 2.5 Pro" }, + "if/kimi-k2-thinking": { "name": "Kimi K2 (Free)" } + } + } + } +} +``` + +**Krok 3:** Vyberte model v OpenCode: + +```bash +/models +# Select any OmniRoute model from the list +``` + +> **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ů + +
+Kliknutím rozbalíte průvodce řešením problémů +
+ +**"Jazykový model neposkytoval zprávy"** + +- Kvóta poskytovatele vyčerpána → Zkontrolujte sledování kvót na řídicím panelu +- Řešení: Použijte záložní kombinovanou variantu nebo přejděte na levnější úroveň + +**Omezení rychlosti** + +- Kvóta předplatného vyčerpána → Přechod na GLM/MiniMax +- Přidat kombo: `cc/claude-opus-4-6 → glm/glm-4.7 → if/kimi-k2-thinking` + +**Platnost tokenu OAuth vypršela** + +- Automaticky aktualizováno službou OmniRoute +- Pokud problémy přetrvávají: Ovládací panel → Poskytovatel → Znovu připojit + +**Vysoké náklady** + +- Zkontrolujte statistiky využití v sekci Nástěnka → Náklady +- Přepnout primární model na GLM/MiniMax +- Pro nekritické úlohy použijte bezplatnou úroveň (Gemini CLI, iFlow). + +**Porty řídicího panelu/API jsou nesprávné** + +- `PORT` je kanonický základní port (a standardně port API) +- `API_PORT` přepisuje pouze posluchač API kompatibilní s OpenAI. +- `DASHBOARD_PORT` přepisuje pouze posluchač dashboard/Next.js +- Nastavte `NEXT_PUBLIC_BASE_URL` na vaši veřejnou URL adresu řídicího panelu (pro zpětná volání OAuth) + +**Chyby synchronizace s cloudem** + +- Ověřte, zda `BASE_URL` odkazuje na vaši spuštěnou instanci. +- Ověřte, zda `CLOUD_URL` odkazuje na váš očekávaný cloudový koncový bod. +- Udržujte hodnoty `NEXT_PUBLIC_*` v souladu s hodnotami na straně serveru. + +**První přihlášení nefunguje** + +- Zkontrolujte `INITIAL_PASSWORD` v souboru `.env` +- Pokud není nastaveno, záložní heslo je `123456` + +**Žádné protokoly požadavků** + +- Nastavte `ENABLE_REQUEST_LOGS=true` v `.env` + +**Test připojení ukazuje „Neplatné“ pro poskytovatele kompatibilní s OpenAI** + +- Mnoho poskytovatelů nezpřístupňuje koncový bod `/models` +- OmniRoute v1.0.6+ zahrnuje záložní ověření pomocí dokončení chatu +- Zajistěte, aby základní URL adresa obsahovala příponu `/v1` + +### 🔐 OAuth na vzdáleném serveru + + + + +> **⚠️ Důležité pro uživatele, kteří provozují OmniRoute na VPS, Dockeru nebo jakémkoli vzdáleném serveru** + +#### Proč selhává OAuth v rozhraní CLI Antigravity / Gemini na vzdálených serverech? + +Poskytovatelé rozhraní CLI **Antigravity** a **Gemini** používají **Google OAuth 2.0** . Google vyžaduje, aby se `redirect_uri` v toku OAuth přesně shodoval s jedním z předregistrovaných URI v konzoli Google Cloud Console aplikace. + +Přihlašovací údaje OAuth, které jsou součástí OmniRoute, jsou registrovány **pouze pro `localhost`** . Když přistupujete k OmniRoute na vzdáleném serveru (např. `https://omniroute.myserver.com` ), Google odmítne ověření pomocí: + +``` +Error 400: redirect_uri_mismatch +``` + +#### Řešení: Nakonfigurujte si vlastní přihlašovací údaje OAuth + +V Google Cloud Console je potřeba vytvořit **ID klienta OAuth 2.0** s URI vašeho serveru. + +#### Krok za krokem + +**1. Otevřete konzoli Google Cloud** + +Přejděte na: [https://console.cloud.google.com/apis/credentials](https://console.cloud.google.com/apis/credentials) + +**2. Vytvořte nové ID klienta OAuth 2.0** + +- Klikněte na **„+ Vytvořit přihlašovací údaje“** → **„ID klienta OAuth“** +- Typ aplikace: **„Webová aplikace“** +- Název: cokoli chcete (např. `OmniRoute Remote` ) + +**3. Přidejte autorizované URI pro přesměrování** + +Do pole **„Autorizované identifikátory URI pro přesměrování“** přidejte: + +``` +https://your-server.com/callback +``` + +> Nahraďte `your-server.com` doménou nebo IP adresou vašeho serveru (v případě potřeby uveďte i port, např. `http://45.33.32.156:20128/callback` ). + +**4. Uložte a zkopírujte přihlašovací údaje** + +Po vytvoření Google zobrazí **ID klienta** a **tajný kód klienta** . + +**5. Nastavení proměnných prostředí** + +Ve vašem souboru `.env` (nebo proměnných prostředí Docker): + +```bash +# For Antigravity: +ANTIGRAVITY_OAUTH_CLIENT_ID=your-client-id.apps.googleusercontent.com +ANTIGRAVITY_OAUTH_CLIENT_SECRET=GOCSPX-your-secret + +# For Gemini CLI: +GEMINI_OAUTH_CLIENT_ID=your-client-id.apps.googleusercontent.com +GEMINI_OAUTH_CLIENT_SECRET=GOCSPX-your-secret +GEMINI_CLI_OAUTH_CLIENT_SECRET=GOCSPX-your-secret +``` + +**6. Restartujte OmniRoute** + +```bash +# npm: +npm run dev + +# Docker: +docker restart omniroute +``` + +**7. Zkuste se znovu připojit** + +Řídicí panel → Poskytovatelé → Antigravity (nebo Gemini CLI) → OAuth + +Google nyní bude správně přesměrovávat na `https://your-server.com/callback` . + +--- + +#### Dočasné řešení (bez vlastních přihlašovacích údajů) + +Pokud si teď nechcete nastavovat vlastní přihlašovací údaje, můžete stále použít **ruční postup pro URL** : + +1. OmniRoute otevírá autorizační URL od Googlu +2. Po autorizaci se Google pokusí přesměrovat na `localhost` (což selže na vzdáleném serveru). +3. **Zkopírujte celou URL adresu** z adresního řádku prohlížeče (i když se stránka nenačte) +4. Vložte tuto URL adresu do pole zobrazeného v modálním okně připojení OmniRoute. +5. Klikněte na **„Připojit“** + +> To funguje, protože autorizační kód v URL adrese je platný bez ohledu na to, zda se načetla přesměrovací stránka. + +--- + +
+🇧🇷 Versão em Português +
+ +#### Pokud používáte OAuth pro Antigravity / Gemini CLI? + +Ověřeno **Antigravity** a **Gemini CLI** pomocí **Google OAuth 2.0** pro autenticitu. O Google exige que a `redirect_uri` usada no fluxo OAuth seja **exatamente** uma das URIs pre-cadastradas no Google Cloud Console to use. + +Jako credenciais OAuth embutidas no OmniRoute estão cadastradas **apenas para `localhost`** . Quando você acessa o OmniRoute em um servidor remote (ex: `https://omniroute.meuservidor.com` ), o Google rejeita a autenticação com: + +``` +Error 400: redirect_uri_mismatch +``` + +#### Řešení: Nakonfigurujte souas próprias credenciais OAuth + +Você precisa criar um **OAuth 2.0 Client ID** no Google Cloud Console com a URI do seu server. + +#### Přejít na přejezd + +**1. Přístup ke službě Google Cloud Console** + +Abra: [https://console.cloud.google.com/apis/credentials](https://console.cloud.google.com/apis/credentials) + +**2. Crie um novo OAuth 2.0 Client ID** + +- Klikněte na **„+ Vytvořit přihlašovací údaje“** → **„ID klienta OAuth“** +- Typ aplikace: **"Webová aplikace"** +- Název: escolha qualquer nome (např.: `OmniRoute Remote` ) + +**3. Adicione jako autorizované URI pro přesměrování** + +Žádné pole **"URI autorizovaného přesměrování"** , adicione: + +``` +https://seu-servidor.com/callback +``` + +> Substitua `seu-servidor.com` pelo domínio ou IP do seu servidor (včetně portu se necessário, např.: `http://45.33.32.156:20128/callback` ). + +**4. Uložte a kopii jako credenciais** + +Após criar, o Google Mostrará o **Client ID** eo **Client Secret** . + +**5. Nakonfigurujte jako variáveis ​​de ambiente** + +No seu `.env` (ou nas variáveis ​​de ambiente do Docker): + +```bash +# Para Antigravity: +ANTIGRAVITY_OAUTH_CLIENT_ID=seu-client-id.apps.googleusercontent.com +ANTIGRAVITY_OAUTH_CLIENT_SECRET=GOCSPX-seu-secret + +# Para Gemini CLI: +GEMINI_OAUTH_CLIENT_ID=seu-client-id.apps.googleusercontent.com +GEMINI_OAUTH_CLIENT_SECRET=GOCSPX-seu-secret +GEMINI_CLI_OAUTH_CLIENT_SECRET=GOCSPX-seu-secret +``` + +**6. Reinicie o OmniRoute** + +```bash +# Se usando npm: +npm run dev + +# Se usando Docker: +docker restart omniroute +``` + +**7. Připojte se znovu** + +Řídicí panel → Poskytovatelé → Antigravity (nebo Gemini CLI) → OAuth + +Agora nebo Google redirecionará corretamente para `https://seu-servidor.com/callback` ea autenticação funcionará. + +--- + +#### Řešení temporário (sem configurar credenciais próprias) + +Chcete-li získat přístup k kriterii pověření, můžete použít adresu **URL** : + +1. O OmniRoute abrirá a URL autorização Google +2. Após você autorizar, nebo Google tentará redirecionar para `localhost` (que falha no servidor remoto) +3. **Zkopírujte úplnou** adresu URL prohlížeče do svého prohlížeče (mesmo que a pagina não carregue) +4. Cole essa URL no campo que aparece no modal de conexão do OmniRoute +5. Klikněte na **„Připojit se“** + +> 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 + +
+Kliknutím rozbalíte podrobnosti o technologickém stacku +
+ +- **Runtime** : Node.js 18–22 LTS (⚠️ Node.js 24+ **není podporován** — nativní binární soubory `better-sqlite3` jsou nekompatibilní) +- **Jazyk** : TypeScript 5.9 — **100% TypeScript** napříč `src/` a `open-sse/` ( `any` v základních modulech od verze 2.0) +- **Framework** : Next.js 16 + React 19 + Tailwind CSS 4 +- **Databáze** : LowDB (JSON) + SQLite (stav domény + protokoly proxy + audit MCP + rozhodnutí o směrování) +- **Schémata** : Zod (validace I/O nástrojů MCP, API smlouvy) +- **Protokoly** : MCP (stdio/HTTP) + A2A v0.3 (JSON-RPC 2.0 + SSE) +- **Streamování** : Události odeslané serverem (SSE) +- **Autorizace** : OAuth 2.0 (PKCE) + JWT + API klíče + autorizace s rozsahem MCP +- **Testování** : Node.js test runner + Vitest (900+ testů včetně unit, integračních, E2E) +- **CI/CD** : Akce GitHubu (automatické publikování v npm + Docker Hub při vydání) +- **Webová stránka** : [omniroute.online](https://omniroute.online) +- **Balíček** : [npmjs.com/package/omniroute](https://www.npmjs.com/package/omniroute) +- **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 + +--- + +## 🗺️ Plán + +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 + +### 🔜 Již brzy + +- 🔗 **Integrace OpenCode** — Nativní podpora poskytovatelů pro IDE kódování s AI v OpenCode +- 🔗 **Integrace TRAE** — Plná podpora vývojového rámce TRAE pro umělou inteligenci +- 📦 **Dávkové API** — Asynchronní dávkové zpracování hromadných požadavků +- 🎯 **Směrování na základě tagů** — Směrování požadavků na základě vlastních tagů a metadat +- 💰 **Strategie nejnižších nákladů** – Automaticky vybere nejlevnějšího dostupného poskytovatele + +> 📝 Úplné specifikace funkcí jsou k dispozici v [`docs/new-features/`](docs/new-features/) (217 podrobných specifikací) + +--- + +## 👥 Přispěvatelé + +[](https://github.com/diegosouzapw/OmniRoute/graphs/contributors)![Přispěvatelé](https://contrib.rocks/image?repo=diegosouzapw/OmniRoute&max=100&columns=20&anon=1) + +### Jak přispět + +1. Vytvoření forku repozitáře +2. Vytvořte si vlastní větev feature ( `git checkout -b feature/amazing-feature` ) +3. Potvrďte změny ( `git commit -m 'Add amazing feature'` ) +4. Odeslat do větve ( `git push origin feature/amazing-feature` ) +5. Otevřít žádost o změny (pull request) + +Podrobné pokyny naleznete na [CONTRIBUTING.md](CONTRIBUTING.md) . + +### Vydání nové verze + +```bash +# Create a release — npm publish happens automatically +gh release create v2.0.0 --title "v2.0.0" --generate-notes +``` + +--- + +## 📊 Hvězdná historie + +## Hvězdáři v průběhu času + +## [](https://starchart.cc/diegosouzapw/OmniRoute)![Hvězdáři v průběhu času](https://starchart.cc/diegosouzapw/OmniRoute.svg?variant=adaptive) + +## 🙏 Poděkování + +Zvláštní poděkování patří **[9routeru](https://github.com/decolua/9router)** od **[decolua](https://github.com/decolua)** – původnímu projektu, který inspiroval tento fork. OmniRoute staví na tomto neuvěřitelném základu s dalšími funkcemi, multimodálními API a kompletním přepsáním TypeScriptu. + +Zvláštní poděkování patří **[CLIProxyAPI](https://github.com/router-for-me/CLIProxyAPI)** – původní implementaci Go, která inspirovala tento JavaScriptový port. + +--- + +## 📄 Licence + +Licence MIT - podrobnosti viz [LICENCE](LICENSE) . + +--- + +
+ Vytvořeno s ❤️ pro vývojáře, kteří programují 24 hodin denně, 7 dní v týdnu +
+

omniroute.online

+
+ diff --git a/docs/i18n/cs/RELEASE_CHECKLIST.md b/docs/i18n/cs/RELEASE_CHECKLIST.md new file mode 100644 index 00000000..0a176813 --- /dev/null +++ b/docs/i18n/cs/RELEASE_CHECKLIST.md @@ -0,0 +1,33 @@ +# Kontrolní seznam vydání + +Tento kontrolní seznam použijte před označením nebo publikováním nové verze OmniRoute. + +## Verze a seznam změn + +1. Navýšit verzi `package.json` ( `xyz` ) ve větvi release. +2. Přesunout poznámky k vydání z `## [Unreleased]` v `CHANGELOG.md` do sekce s datem vydání: + - `## [x.y.z] — YYYY-MM-DD` +3. Ponechte `## [Unreleased]` jako první sekci changelogu pro nadcházející práci. +4. Ujistěte se, že nejnovější sekce semver v `CHANGELOG.md` je rovna verzi `package.json` . + +## Dokumentace API + +1. Aktualizace `docs/openapi.yaml` : + - Soubor `info.version` se musí rovnat verzi `package.json` . +2. Ověřte příklady koncových bodů, pokud se změnily smlouvy API. + +## Dokumentace k běhovému prostředí + +1. Projděte si `docs/ARCHITECTURE.md` , zda nedochází k posunu v úložišti/běhovém prostředí. +2. Projděte si soubor `docs/TROUBLESHOOTING.md` , kde naleznete informace o proměnné prostředí a provozním posunu. +3. Aktualizujte lokalizovanou dokumentaci, pokud se zdrojová dokumentace výrazně změnila. + +## Automatická kontrola + +Před otevřením PR spusťte lokálně ochranu synchronizace: + +```bash +npm run check:docs-sync +``` + +CI také spouští tuto kontrolu v `.github/workflows/ci.yml` (úloha lint). diff --git a/docs/i18n/cs/SECURITY.md b/docs/i18n/cs/SECURITY.md new file mode 100644 index 00000000..da9eece3 --- /dev/null +++ b/docs/i18n/cs/SECURITY.md @@ -0,0 +1,169 @@ +# Bezpečnostní zásady + +## Hlášení zranitelností + +Pokud v OmniRoute objevíte bezpečnostní zranitelnost, nahlaste ji prosím zodpovědně: + +1. **NEOTVÍREJTE** veřejný problém na GitHubu +2. Používejte [bezpečnostní doporučení GitHubu](https://github.com/diegosouzapw/OmniRoute/security/advisories/new) +3. Zahrňte: popis, kroky reprodukce a potenciální dopad + +## Časová osa odezvy + +Fáze | Cíl +--- | --- +Potvrzení | 48 hodin +Triáž a posouzení | 5 pracovních dnů +Vydání záplaty | 14 pracovních dnů (kritické) + +## Podporované verze + +Verze | Stav podpory +--- | --- +1.0.x | ✅ Aktivní +0.8.x | ✅ Bezpečnost +< 0,8,0 | ❌ Nepodporováno + +--- + +## Bezpečnostní architektura + +OmniRoute implementuje vícevrstvý bezpečnostní model: + +``` +Request → CORS → API Key Auth → Prompt Injection Guard → Input Sanitizer → Rate Limiter → Circuit Breaker → Provider +``` + +### 🔐 Ověřování a autorizace + +Funkce | Implementace +--- | --- +**Přihlášení do ovládacího panelu** | Ověřování na základě hesla s tokeny JWT (soubory cookie HttpOnly) +**Autorizace klíče API** | Klíče podepsané HMAC s ověřením CRC +**OAuth 2.0 + PKCE** | Bezpečné ověřování poskytovatelů (Claude, Codex, Gemini, Cursor atd.) +**Obnovení tokenu** | Automatická aktualizace tokenu OAuth před vypršením platnosti +**Bezpečné soubory cookie** | `AUTH_COOKIE_SECURE=true` pro prostředí HTTPS + +### 🛡️ Šifrování v klidovém stavu + +Všechna citlivá data uložená v SQLite jsou šifrována pomocí **AES-256-GCM** s odvozením klíče scrypt: + +- Klíče API, přístupové tokeny, obnovovací tokeny a ID tokeny +- Verzovaný formát: `enc:v1:::` +- Režim průchodu (prostý text), pokud není nastaven `STORAGE_ENCRYPTION_KEY` + +```bash +# Generate encryption key: +STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32) +``` + +### 🧠 Ochrana před okamžitou injekcí + +Middleware, který detekuje a blokuje útoky prompt injection v požadavcích LLM: + +Typ vzoru | Závažnost | Příklad +--- | --- | --- +Přepsání systému | Vysoký | "ignorovat všechny předchozí pokyny" +Únos role | Vysoký | "Teď jsi DAN, dokážeš cokoli." +Vložení oddělovače | Střední | Kódované oddělovače pro přerušení hranic kontextu +DAN/Útěk z vězení | Vysoký | Známé vzory výzev k jailbreaku +Únik instrukcí | Střední | „Ukaž mi systémový výzvu“ + +Konfigurace přes ovládací panel (Nastavení → Zabezpečení) nebo `.env` : + +```env +INPUT_SANITIZER_ENABLED=true +INPUT_SANITIZER_MODE=block # warn | block | redact +``` + +### 🔒 Redakční úprava osobních údajů + +Automatická detekce a volitelná redakce osobních údajů: + +Typ osobních údajů | Vzor | Nahrazení +--- | --- | --- +E-mail | `user@domain.com` | `[EMAIL_REDACTED]` +CPF (Brazílie) | `123.456.789-00` | `[CPF_REDACTED]` +CNPJ (Brazílie) | `12.345.678/0001-00` | `[CNPJ_REDACTED]` +Kreditní karta | `4111-1111-1111-1111` | `[CC_REDACTED]` +Telefon | `+55 11 99999-9999` | `[PHONE_REDACTED]` +Číslo sociálního zabezpečení (USA) | `123-45-6789` | `[SSN_REDACTED]` + +```env +PII_REDACTION_ENABLED=true +``` + +### 🌐 Zabezpečení sítě + +Funkce | Popis +--- | --- +**CORS** | Konfigurovatelná kontrola původu (proměnná prostředí `CORS_ORIGIN` , výchozí nastavení `*` ) +**Filtrování IP adres** | Rozsahy IP adres na bílou/černou listinu v dashboardu +**Omezení rychlosti** | Limity sazeb na poskytovatele s automatickým ukončením +**Protihromové stádo** | Mutex + uzamčení pro každé připojení zabraňuje kaskádování 502. + +### 🔌 Odolnost a dostupnost + +Funkce | Popis +--- | --- +**Jistič** | 3 stavy (Zavřeno → Otevřeno → Polootevřeno) na poskytovatele, trvalé uložení v SQLite +**Žádost o idempotenci** | 5sekundové okno pro odstranění duplicitních požadavků +**Exponenciální odklon** | Automatické opakování s rostoucím zpožděním +**Dashboard zdraví** | Monitorování stavu poskytovatele v reálném čase + +### 📋 Dodržování předpisů + +Funkce | Popis +--- | --- +**Uchovávání protokolů** | Automatické čištění po `LOG_RETENTION_DAYS` +**Odhlášení bez ukládání protokolů** | Příznak `noLog` pro každý klíč API zakazuje protokolování požadavků. +**Protokol auditu** | Administrativní akce sledované v tabulce `audit_log` + +--- + +## Požadované proměnné prostředí + +Všechny tajné kódy musí být nastaveny před spuštěním serveru. Server **rychle selže** , pokud chybí nebo jsou slabé. + +```bash +# REQUIRED — server will not start without these: +JWT_SECRET=$(openssl rand -base64 48) # min 32 chars +API_KEY_SECRET=$(openssl rand -hex 32) # min 16 chars + +# RECOMMENDED — enables encryption at rest: +STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32) +``` + +Server aktivně odmítá známé slabé hodnoty, jako například `changeme` , `secret` nebo `password` . + +--- + +## Zabezpečení Dockeru + +- Použití uživatele bez oprávnění root v produkčním prostředí +- Připojte tajné kódy jako svazky jen pro čtení +- Nikdy nekopírujte soubory `.env` do imagí Dockeru +- Použití `.dockerignore` k vyloučení citlivých souborů +- Nastavit `AUTH_COOKIE_SECURE=true` při připojení za HTTPS + +```bash +docker run -d \ + --name omniroute \ + --restart unless-stopped \ + --read-only \ + -p 20128:20128 \ + -v omniroute-data:/app/data \ + -e JWT_SECRET="$(openssl rand -base64 48)" \ + -e API_KEY_SECRET="$(openssl rand -hex 32)" \ + -e STORAGE_ENCRYPTION_KEY="$(openssl rand -hex 32)" \ + diegosouzapw/omniroute:latest +``` + +--- + +## Závislosti + +- Pravidelně spouštějte `npm audit` +- Udržujte závislosti aktualizované +- Projekt používá pro kontroly před commitem `husky` + `lint-staged` +- CI pipeline spouští bezpečnostní pravidla ESLint při každém odeslání. diff --git a/docs/i18n/cs/TROUBLESHOOTING.md b/docs/i18n/cs/TROUBLESHOOTING.md new file mode 100644 index 00000000..649f7388 --- /dev/null +++ b/docs/i18n/cs/TROUBLESHOOTING.md @@ -0,0 +1,254 @@ +# Odstraňování problémů + +🌐 **Jazyky:** 🇺🇸 [angličtina](TROUBLESHOOTING.md) | 🇧🇷 [Português (Brazílie)](i18n/pt-BR/TROUBLESHOOTING.md) | 🇪🇸 [Español](i18n/es/TROUBLESHOOTING.md) | 🇫🇷 [Français](i18n/fr/TROUBLESHOOTING.md) | 🇮🇹 [Italiano](i18n/it/TROUBLESHOOTING.md) | 🇷🇺 [Русский](i18n/ru/TROUBLESHOOTING.md) | 🇨🇳[中文 (简体)](i18n/zh-CN/TROUBLESHOOTING.md) | 🇩🇪 [Deutsch](i18n/de/TROUBLESHOOTING.md) | 🇮🇳 [हिन्दी](i18n/in/TROUBLESHOOTING.md) | 🇹🇭 [ไทย](i18n/th/TROUBLESHOOTING.md) | 🇺🇦 [Українська](i18n/uk-UA/TROUBLESHOOTING.md) | 🇸🇦 [العربية](i18n/ar/TROUBLESHOOTING.md) | 🇯🇵[日本語](i18n/ja/TROUBLESHOOTING.md)| 🇻🇳 [Tiếng Việt](i18n/vi/TROUBLESHOOTING.md) | 🇧🇬 [Български](i18n/bg/TROUBLESHOOTING.md) | 🇩🇰 [Dánsko](i18n/da/TROUBLESHOOTING.md) | 🇫🇮 [Suomi](i18n/fi/TROUBLESHOOTING.md) | 🇮🇱 [עברית](i18n/he/TROUBLESHOOTING.md) | 🇭🇺 [maďarština](i18n/hu/TROUBLESHOOTING.md) | 🇮🇩 [Bahasa Indonésie](i18n/id/TROUBLESHOOTING.md) | 🇰🇷 [한국어](i18n/ko/TROUBLESHOOTING.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/TROUBLESHOOTING.md) | 🇳🇱 [Nizozemsko](i18n/nl/TROUBLESHOOTING.md) | 🇳🇴 [Norsk](i18n/no/TROUBLESHOOTING.md) | 🇵🇹 [Português (Portugalsko)](i18n/pt/TROUBLESHOOTING.md) | 🇷🇴 [Română](i18n/ro/TROUBLESHOOTING.md) | 🇵🇱 [Polski](i18n/pl/TROUBLESHOOTING.md) | 🇸🇰 [Slovenčina](i18n/sk/TROUBLESHOOTING.md) | 🇸🇪 [Svenska](i18n/sv/TROUBLESHOOTING.md) | 🇵🇭 [Filipínec](i18n/phi/TROUBLESHOOTING.md) | 🇨🇿 [Čeština](i18n/cs/TROUBLESHOOTING.md) + +Běžné problémy a řešení pro OmniRoute. + +--- + +## Rychlé opravy + +Problém | Řešení +--- | --- +První přihlášení nefunguje | Nastavit `INITIAL_PASSWORD` v `.env` (bez pevně zakódovaného výchozího nastavení) +Dashboard se otevírá na nesprávném portu | Nastavte `PORT=20128` a `NEXT_PUBLIC_BASE_URL=http://localhost:20128` +Žádné protokoly požadavků v sekci `logs/` | Nastavte `ENABLE_REQUEST_LOGS=true` +PŘÍSTUP: povolení zamítnuto | Nastavením `DATA_DIR=/path/to/writable/dir` přepíšete `~/.omniroute` +Strategie směrování se neukládá | Aktualizace na v1.4.11+ (oprava schématu Zod pro perzistenci nastavení) + +--- + +## Problémy s poskytovateli + +### "Jazykový model neposkytoval zprávy" + +**Příčina:** Vyčerpání kvóty poskytovatele. + +**Opravit:** + +1. Zkontrolujte sledovač kvót na řídicím panelu +2. Použijte kombinaci se záložními úrovněmi +3. Přepnout na levnější/bezplatnou úroveň + +### Omezení rychlosti + +**Příčina:** Vyčerpání kvóty předplatného. + +**Opravit:** + +- Přidat záložní variantu: `cc/claude-opus-4-6 → glm/glm-4.7 → if/kimi-k2-thinking` +- Použijte GLM/MiniMax jako levnou zálohu + +### Platnost tokenu OAuth vypršela + +OmniRoute automaticky obnovuje tokeny. Pokud problémy přetrvávají: + +1. Ovládací panel → Poskytovatel → Znovu připojit +2. Odstranění a opětovné přidání připojení poskytovatele + +--- + +## Problémy s cloudem + +### Chyby synchronizace s cloudem + +1. Ověřte, zda `BASE_URL` odkazuje na vaši spuštěnou instanci (např. `http://localhost:20128` ) +2. Ověřte, zda `CLOUD_URL` odkazuje na váš cloudový koncový bod (např. `https://omniroute.dev` ). +3. Udržujte hodnoty `NEXT_PUBLIC_*` zarovnané s hodnotami na straně serveru. + +### Cloud `stream=false` Vrací 500 + +**Příznak:** `Unexpected token 'd'...` na cloudovém koncovém bodu pro nestreamovaná volání. + +**Příčina:** Upstream vrací datovou část SSE, zatímco klient očekává JSON. + +**Řešení:** Pro přímá volání z cloudu použijte `stream=true` . Lokální běhové prostředí zahrnuje záložní SSE→JSON. + +### Cloud hlásí připojení, ale „neplatný klíč API“. + +1. Vytvořte nový klíč z lokálního dashboardu ( `/api/keys` ) +2. Spuštění synchronizace s cloudem: Povolit cloud → Synchronizovat nyní +3. Staré/nesynchronizované klíče mohou v cloudu stále vracet `401` + +--- + +## Problémy s Dockerem + +### Nástroj CLI se zobrazuje jako nenainstalovaný + +1. Zkontrolujte běhová pole: `curl http://localhost:20128/api/cli-tools/runtime/codex | jq` +2. Pro přenosný režim: použijte cílový soubor image `runner-cli` (dodávané CLI) +3. Pro režim připojení hostitele: nastavte `CLI_EXTRA_PATHS` a připojte adresář hostitele bin jako pouze pro čtení. +4. Pokud `installed=true` a `runnable=false` : binární soubor byl nalezen, ale kontrola stavu selhala. + +### Rychlé ověření za běhu + +```bash +curl -s http://localhost:20128/api/cli-tools/codex-settings | jq '{installed,runnable,commandPath,runtimeMode,reason}' +curl -s http://localhost:20128/api/cli-tools/claude-settings | jq '{installed,runnable,commandPath,runtimeMode,reason}' +curl -s http://localhost:20128/api/cli-tools/openclaw-settings | jq '{installed,runnable,commandPath,runtimeMode,reason}' +``` + +--- + +## Problémy s náklady + +### Vysoké náklady + +1. Zkontrolujte statistiky využití v sekci Nástěnka → Využití +2. Přepnout primární model na GLM/MiniMax +3. Pro nekritické úlohy použijte bezplatnou úroveň (Gemini CLI, iFlow). +4. Nastavení rozpočtů nákladů pro každý klíč API: Dashboard → API klíče → Rozpočet + +--- + +## Ladění + +### Povolit protokoly požadavků + +V souboru `.env` nastavte `ENABLE_REQUEST_LOGS=true` . Protokoly se zobrazují v adresáři `logs/` . + +### Zkontrolujte stav poskytovatele + +```bash +# Health dashboard +http://localhost:20128/dashboard/health + +# API health check +curl http://localhost:20128/api/monitoring/health +``` + +### Runtimové úložiště + +- Hlavní stav: `${DATA_DIR}/storage.sqlite` (poskytovatelé, kombinace, aliasy, klíče, nastavení) +- Použití: SQLite tabulky v `storage.sqlite` ( `usage_history` , `call_logs` , `proxy_logs` ) + volitelné `${DATA_DIR}/log.txt` a `${DATA_DIR}/call_logs/` +- Záznamy požadavků: `/logs/...` (pokud `ENABLE_REQUEST_LOGS=true` ) + +--- + +## Problémy s jističi + +### Poskytovatel uvízl ve stavu OPEN (OTEVŘENO) + +Pokud je jistič poskytovatele VYPNUTÝ, požadavky jsou blokovány, dokud neuplyne doba ochlazování. + +**Opravit:** + +1. Přejděte do **nabídky Ovládací panel → Nastavení → Odolnost** +2. Zkontrolujte kartu jističe u dotčeného poskytovatele +3. Kliknutím na **Obnovit vše** vynulujete všechny jističe nebo počkejte, až vyprší doba zpoždění. +4. Před resetováním ověřte, zda je poskytovatel skutečně dostupný. + +### Poskytovatel neustále vypíná jistič + +Pokud poskytovatel opakovaně přechází do stavu OTEVŘENO: + +1. Zkontrolujte **v části Dashboard → Stav → Stav poskytovatele** vzorec selhání. +2. Přejděte do **Nastavení → Odolnost → Profily poskytovatelů** a zvyšte prahovou hodnotu selhání. +3. Zkontrolujte, zda poskytovatel změnil limity API nebo vyžaduje opětovné ověření. +4. Zkontrolujte telemetrii latence – vysoká latence může způsobit selhání z důvodu časového limitu. + +--- + +## Problémy s přepisem zvuku + +### Chyba „Nepodporovaný model“ + +- Ujistěte se, že používáte správný prefix: `deepgram/nova-3` nebo `assemblyai/best` +- Ověřte, zda je poskytovatel připojen v **nabídce Dashboard → Poskytovatelé.** + +### Přepis vrací prázdný výsledek nebo selže + +- Zkontrolujte podporované zvukové formáty: `mp3` , `wav` , `m4a` , `flac` , `ogg` , `webm` +- Ověřte, zda je velikost souboru v rámci limitů poskytovatele (obvykle < 25 MB) +- Zkontrolujte platnost klíče API poskytovatele v kartě poskytovatele + +--- + +## Ladění překladače + +Pro ladění problémů s překladem formátu použijte **Dashboard → Translator** : + +Režim | Kdy použít +--- | --- +**Dětské hřiště** | Porovnejte vstupní/výstupní formáty vedle sebe – vložte neúspěšný požadavek a podívejte se, jak se přeloží +**Tester chatu** | Odesílejte živé zprávy a kontrolujte kompletní datovou část požadavků/odpovědí včetně záhlaví +**Zkušební stolice** | Spusťte dávkové testy napříč kombinacemi formátů a zjistěte, které překlady jsou poškozené. +**Živý monitor** | Sledujte tok požadavků v reálném čase a zachyťte občasné problémy s překladem + +### Běžné problémy s formátováním + +- **Štítky myšlení se nezobrazují** – Zkontrolujte, zda cílový poskytovatel podporuje myšlení a nastavení rozpočtu myšlení. +- **Volání nástrojů se vynechávají** – Některé překlady formátů mohou odstranit nepodporovaná pole; ověřte v režimu Playground. +- **Chybí systémová výzva** – Claude a Gemini zpracovávají systémové výzvy odlišně; zkontrolujte překlad výstupu +- **SDK vrací nezpracovaný řetězec místo objektu** – Opraveno ve verzi 1.1.0: sanitizér odpovědí nyní odstraňuje nestandardní pole ( `x_groq` , `usage_breakdown` atd.), která způsobují selhání validace OpenAI SDK v Pydantic. +- **GLM/ERNIE odmítá `system` roli** — Opraveno ve verzi 1.1.0: normalizátor rolí automaticky slučoval systémové zprávy s uživatelskými zprávami pro nekompatibilní modely. +- **role `developer` nebyla rozpoznána** – Opraveno ve verzi 1.1.0: automaticky převedeno na `system` pro poskytovatele, kteří nepoužívají OpenAI +- **`json_schema` nefunguje s Gemini** — Opraveno ve verzi 1.1.0: `response_format` se nyní převádí na `responseMimeType` + `responseSchema` z Gemini. + +--- + +## Nastavení odolnosti + +### Automatické omezení rychlosti se nespouští + +- Automatické omezení rychlosti se vztahuje pouze na poskytovatele klíčů API (ne na OAuth/předplatné) +- Ověřte **Nastavení → Odolnost → Profily poskytovatelů** mají povoleno automatické omezení rychlosti +- Zkontrolujte, zda poskytovatel vrací stavové kódy `429` nebo hlavičky `Retry-After` + +### Ladění exponenciálního poklesu + +Profily poskytovatelů podporují tato nastavení: + +- **Základní zpoždění** — Počáteční doba čekání po prvním selhání (výchozí: 1 s) +- **Max. zpoždění** — Maximální doba čekání (výchozí: 30 s) +- **Násobitel** — O kolik se má zvýšit zpoždění za každou po sobě jdoucí chybu (výchozí: 2x) + +### Stádo proti hromům + +Když se na poskytovatele s omezenou rychlostí odesílá mnoho souběžných požadavků, OmniRoute použije mutex + automatické omezení rychlosti k serializaci požadavků a zabránění kaskádovým selháním. Toto je automatické pro poskytovatele klíčů API. + +--- + +## Volitelná taxonomie selhání RAG / LLM (16 problémů) + +Někteří uživatelé OmniRoute umisťují bránu před RAG nebo agent stacky. V těchto nastaveních je běžné vidět zvláštní vzorec: OmniRoute vypadá v pořádku (poskytovatelé aktivní, profily směrování v pořádku, žádná upozornění na limity rychlosti), ale konečná odpověď je stále nesprávná. + +V praxi tyto incidenty obvykle pocházejí z následného RAG kanálu, nikoli ze samotné brány. + +Pokud chcete sdílenou slovní zásobu pro popis těchto selhání, můžete použít WFGY ProblemMap, externí textový zdroj s licencí MIT, který definuje šestnáct opakujících se vzorců selhání RAG / LLM. Na obecné úrovni zahrnuje: + +- drift vyhledávání a narušené hranice kontextu +- prázdné nebo zastaralé indexy a vektorové úložiště +- vkládání versus sémantický nesoulad +- problémy s assembly promptu a kontextovým oknem +- logický kolaps a přehnaně sebevědomé odpovědi +- selhání dlouhého řetězce a koordinace agentů +- paměť více agentů a posun rolí +- problémy s nasazením a objednáváním bootstrapů + +Myšlenka je jednoduchá: + +1. Při vyšetřování špatné odpovědi zaznamenejte: + - úkol a požadavek uživatele + - Kombinace trasy nebo poskytovatele v OmniRoute + - jakýkoli kontext RAG použitý v následných fázích (načtené dokumenty, volání nástrojů atd.) +2. Namapujte incident na jedno nebo dvě čísla z WFGY ProblemMap ( `No.1` … `No.16` ). +3. Uložte číslo do vlastního řídicího panelu, runbooku nebo sledovače incidentů vedle protokolů OmniRoute. +4. Pro rozhodnutí, zda je potřeba změnit RAG stack, retriever nebo směrovací strategii, použijte odpovídající stránku WFGY. + +Plný text a konkrétní recepty naleznete zde (licence MIT, pouze text): + +[Soubor README pro mapu problémů WFGY](https://github.com/onestardao/WFGY/blob/main/ProblemMap/README.md) + +Tuto část můžete ignorovat, pokud za OmniRoute nespouštěte RAG ani agenty. + +--- + +## Stále v koncích? + +- **Problémy s GitHubem** : [github.com/diegosouzapw/OmniRoute/issues](https://github.com/diegosouzapw/OmniRoute/issues) +- **Architektura** : Viz [`docs/ARCHITECTURE.md`](ARCHITECTURE.md) pro interní podrobnosti +- **Referenční informace k API** : Všechny koncové body naleznete v [`docs/API_REFERENCE.md`](API_REFERENCE.md) +- **Panel stavu** : Zkontrolujte **Panel stavu, kde** najdete stav systému v reálném čase. +- **Překladač** : Použijte **Dashboard → Překladač** k ladění problémů s formátem diff --git a/docs/i18n/cs/USER_GUIDE.md b/docs/i18n/cs/USER_GUIDE.md new file mode 100644 index 00000000..b5d1808e --- /dev/null +++ b/docs/i18n/cs/USER_GUIDE.md @@ -0,0 +1,814 @@ +# Uživatelská příručka + +🌐 **Jazyky:** 🇺🇸 [angličtina](USER_GUIDE.md) | 🇧🇷 [Português (Brazílie)](i18n/pt-BR/USER_GUIDE.md) | 🇪🇸 [Español](i18n/es/USER_GUIDE.md) | 🇫🇷 [Français](i18n/fr/USER_GUIDE.md) | 🇮🇹 [Italiano](i18n/it/USER_GUIDE.md) | 🇷🇺 [Русский](i18n/ru/USER_GUIDE.md) | 🇨🇳[中文 (简体)](i18n/zh-CN/USER_GUIDE.md) | 🇩🇪 [Deutsch](i18n/de/USER_GUIDE.md) | 🇮🇳 [हिन्दी](i18n/in/USER_GUIDE.md) | 🇹🇭 [ไทย](i18n/th/USER_GUIDE.md) | 🇺🇦 [Українська](i18n/uk-UA/USER_GUIDE.md) | 🇸🇦 [العربية](i18n/ar/USER_GUIDE.md) | 🇯🇵[日本語](i18n/ja/USER_GUIDE.md)| 🇻🇳 [Tiếng Việt](i18n/vi/USER_GUIDE.md) | 🇧🇬 [Български](i18n/bg/USER_GUIDE.md) | 🇩🇰 [Dánsko](i18n/da/USER_GUIDE.md) | 🇫🇮 [Suomi](i18n/fi/USER_GUIDE.md) | 🇮🇱 [עברית](i18n/he/USER_GUIDE.md) | 🇭🇺 [maďarština](i18n/hu/USER_GUIDE.md) | 🇮🇩 [Bahasa Indonésie](i18n/id/USER_GUIDE.md) | 🇰🇷 [한국어](i18n/ko/USER_GUIDE.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/USER_GUIDE.md) | 🇳🇱 [Nizozemsko](i18n/nl/USER_GUIDE.md) | 🇳🇴 [Norsk](i18n/no/USER_GUIDE.md) | 🇵🇹 [Português (Portugalsko)](i18n/pt/USER_GUIDE.md) | 🇷🇴 [Română](i18n/ro/USER_GUIDE.md) | 🇵🇱 [Polski](i18n/pl/USER_GUIDE.md) | 🇸🇰 [Slovenčina](i18n/sk/USER_GUIDE.md) | 🇸🇪 [Svenska](i18n/sv/USER_GUIDE.md) | 🇵🇭 [Filipínec](i18n/phi/USER_GUIDE.md) | 🇨🇿 [Čeština](i18n/cs/USER_GUIDE.md) + +Kompletní průvodce konfigurací poskytovatelů, vytvářením kombinací, integrací nástrojů CLI a nasazením OmniRoute. + +--- + +## Obsah + +- [Ceny v kostce](#-pricing-at-a-glance) +- [Případy použití](#-use-cases) +- [Nastavení poskytovatele](#-provider-setup) +- [Integrace s rozhraním CLI](#-cli-integration) +- [Nasazení](#-deployment) +- [Dostupné modely](#-available-models) +- [Pokročilé funkce](#-advanced-features) + +--- + +## 💰 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** | Hluboké vyhledávání | Platba za použití | Žádný | Laciné uvažování + | Groq | Platba za použití | Žádný | Ultrarychlá inference + | xAI (Grok) | Platba za použití | Žádný | Grok 4 uvažování + | Mistral | Platba za použití | Žádný | Modely hostované v EU + | Zmatek | Platba za použití | Žádný | Rozšířené vyhledávání + | Společně s umělou inteligencí | Platba za použití | Žádný | Modely s otevřeným zdrojovým kódem + | Ohňostroj s umělou inteligencí | Platba za použití | Žádný | Rychlé snímky FLUX + | Mozky | Platba za použití | Žádný | Rychlost v měřítku destičky + | Soudržný | Platba za použití | Žádný | Příkaz R+ RAG + | NVIDIA NIM | Platba za použití | Žádný | Podnikové modely +**💰 LEVNÉ** | GLM-4.7 | 0,6 USD/1 milion | Denně v 10:00 | Záloha rozpočtu + | MiniMax M2.1 | 0,2 USD/1 milion | 5hodinové válcování | Nejlevnější varianta + | 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ý | 8 modelů zdarma + | Qwen | 0 dolarů | Neomezený | 3 modely zdarma + | Kiro | 0 dolarů | Neomezený | Claude zdarma + +**💡 Tip pro profesionály:** Začněte s kombinací Gemini CLI (180 tisíc zdarma/měsíc) + iFlow (neomezeně zdarma) = 0 dolarů! + +--- + +## 🎯 Případy použití + +### Případ 1: „Mám předplatné Claude Pro“ + +**Problém:** Kvóta vyprší, nevyužitá, limity rychlosti během náročného kódování + +``` +Combo: "maximize-claude" + 1. cc/claude-opus-4-6 (use subscription fully) + 2. glm/glm-4.7 (cheap backup when quota out) + 3. if/kimi-k2-thinking (free emergency fallback) + +Monthly cost: $20 (subscription) + ~$5 (backup) = $25 total +vs. $20 + hitting limits = frustration +``` + +### Případ 2: „Chci nulové náklady“ + +**Problém:** Nemůžu si dovolit předplatné, potřebuji spolehlivé kódování s využitím umělé inteligence + +``` +Combo: "free-forever" + 1. gc/gemini-3-flash (180K free/month) + 2. if/kimi-k2-thinking (unlimited free) + 3. qw/qwen3-coder-plus (unlimited free) + +Monthly cost: $0 +Quality: Production-ready models +``` + +### Případ 3: „Potřebuji kódování 24 hodin denně, 7 dní v týdnu, bez přerušení“ + +**Problém:** Termíny, nemůžeme si dovolit prostoje + +``` +Combo: "always-on" + 1. cc/claude-opus-4-6 (best quality) + 2. cx/gpt-5.2-codex (second subscription) + 3. glm/glm-4.7 (cheap, resets daily) + 4. minimax/MiniMax-M2.1 (cheapest, 5h reset) + 5. if/kimi-k2-thinking (free unlimited) + +Result: 5 layers of fallback = zero downtime +Monthly cost: $20-200 (subscriptions) + $10-20 (backup) +``` + +### Případ 4: „Chci BEZPLATNOU AI v OpenClaw“ + +**Problém:** Potřebujete asistenta s umělou inteligencí v aplikacích pro zasílání zpráv, zcela zdarma + +``` +Combo: "openclaw-free" + 1. if/glm-4.7 (unlimited free) + 2. if/minimax-m2.1 (unlimited free) + 3. if/kimi-k2-thinking (unlimited free) + +Monthly cost: $0 +Access via: WhatsApp, Telegram, Slack, Discord, iMessage, Signal... +``` + +--- + +## 📖 Nastavení poskytovatele + +### 🔐 Poskytovatelé předplatného + +#### Claude Code (Pro/Max) + +```bash +Dashboard → Providers → Connect Claude Code +→ OAuth login → Auto token refresh +→ 5-hour + weekly quota tracking + +Models: + cc/claude-opus-4-6 + cc/claude-sonnet-4-5-20250929 + cc/claude-haiku-4-5-20251001 +``` + +**Tip pro profesionály:** Pro složité úkoly používejte Opus, pro rychlost Sonnet. OmniRoute sleduje kvótu pro každý model! + +#### OpenAI Codex (Plus/Pro) + +```bash +Dashboard → Providers → Connect Codex +→ OAuth login (port 1455) +→ 5-hour + weekly reset + +Models: + cx/gpt-5.2-codex + cx/gpt-5.1-codex-max +``` + +#### Gemini CLI (ZDARMA 180 000/měsíc!) + +```bash +Dashboard → Providers → Connect Gemini CLI +→ Google OAuth +→ 180K completions/month + 1K/day + +Models: + gc/gemini-3-flash-preview + gc/gemini-2.5-pro +``` + +**Nejlepší hodnota:** Obrovská bezplatná úroveň! Použijte ji před placenými úrovněmi. + +#### GitHub Copilot + +```bash +Dashboard → Providers → Connect GitHub +→ OAuth via GitHub +→ Monthly reset (1st of month) + +Models: + gh/gpt-5 + gh/claude-4.5-sonnet + gh/gemini-3-pro +``` + +### 💰 Levní poskytovatelé + +#### GLM-4.7 (Denní reset, 0,6 USD/1 milion) + +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` + +**Použití:** `glm/glm-4.7` — **Tip pro profesionály:** Coding Plan nabízí 3× kvótu za cenu 1/7! Resetovat denně v 10:00. + +#### MiniMax M2.1 (5h reset, 0,20 $/1 milion) + +1. Registrace: [MiniMax](https://www.minimax.io/) +2. Získat API klíč → Dashboard → Přidat API klíč + +**Použití:** `minimax/MiniMax-M2.1` — **Tip pro profesionály:** Nejlevnější varianta pro dlouhý kontext (1 milion tokenů)! + +#### Kimi K2 (paušální poplatek 9 dolarů měsíčně) + +1. Odebírat: [Moonshot AI](https://platform.moonshot.ai/) +2. Získat API klíč → Dashboard → Přidat API klíč + +**Použití:** `kimi/kimi-latest` — **Tip pro profesionály:** Fixní cena 9 $/měsíc za 10 milionů tokenů = efektivní náklady 0,90 $/1 milion! + +### 🆓 Poskytovatelé ZDARMA + +#### iFlow (8 modelů ZDARMA) + +```bash +Dashboard → Connect iFlow → OAuth login → Unlimited usage + +Models: if/kimi-k2-thinking, if/qwen3-coder-plus, if/glm-4.7, if/minimax-m2, if/deepseek-r1 +``` + +#### Qwen (3 modely ZDARMA) + +```bash +Dashboard → Connect Qwen → Device code auth → Unlimited usage + +Models: qw/qwen3-coder-plus, qw/qwen3-coder-flash +``` + +#### Kiro (Claude ZDARMA) + +```bash +Dashboard → Connect Kiro → AWS Builder ID or Google/GitHub → Unlimited + +Models: kr/claude-sonnet-4.5, kr/claude-haiku-4.5 +``` + +--- + +## 🎨 Kombinace + +### Příklad 1: Maximalizace předplatného → Levné zálohování + +``` +Dashboard → Combos → Create New + +Name: premium-coding +Models: + 1. cc/claude-opus-4-6 (Subscription primary) + 2. glm/glm-4.7 (Cheap backup, $0.6/1M) + 3. minimax/MiniMax-M2.1 (Cheapest fallback, $0.20/1M) + +Use in CLI: premium-coding +``` + +### Příklad 2: Pouze zdarma (nulové náklady) + +``` +Name: free-combo +Models: + 1. gc/gemini-3-flash-preview (180K free/month) + 2. if/kimi-k2-thinking (unlimited) + 3. qw/qwen3-coder-plus (unlimited) + +Cost: $0 forever! +``` + +--- + +## 🔧 Integrace s rozhraním příkazového řádku + +### IDE kurzoru + +``` +Settings → Models → Advanced: + OpenAI API Base URL: http://localhost:20128/v1 + OpenAI API Key: [from omniroute dashboard] + Model: cc/claude-opus-4-6 +``` + +### Claude Code + +Upravit `~/.claude/config.json` : + +```json +{ + "anthropic_api_base": "http://localhost:20128/v1", + "anthropic_api_key": "your-omniroute-api-key" +} +``` + +### CLI Codexu + +```bash +export OPENAI_BASE_URL="http://localhost:20128" +export OPENAI_API_KEY="your-omniroute-api-key" +codex "your prompt" +``` + +### OpenClaw + +Upravit `~/.openclaw/openclaw.json` : + +```json +{ + "agents": { + "defaults": { + "model": { "primary": "omniroute/if/glm-4.7" } + } + }, + "models": { + "providers": { + "omniroute": { + "baseUrl": "http://localhost:20128/v1", + "apiKey": "your-omniroute-api-key", + "api": "openai-completions", + "models": [{ "id": "if/glm-4.7", "name": "glm-4.7" }] + } + } + } +} +``` + +**Nebo použijte Dashboard:** CLI Tools → OpenClaw → Auto-config + +### Cline / Pokračovat / RooCode + +``` +Provider: OpenAI Compatible +Base URL: http://localhost:20128/v1 +API Key: [from dashboard] +Model: cc/claude-opus-4-6 +``` + +--- + +## 🚀 Nasazení + +### Globální instalace npm (doporučeno) + +```bash +npm install -g omniroute + +# Create config directory +mkdir -p ~/.omniroute + +# Create .env file (see .env.example) +cp .env.example ~/.omniroute/.env + +# Start server +omniroute +# Or with custom port: +omniroute --port 3000 +``` + +Rozhraní příkazového řádku automaticky načte `.env` z adresáře `~/.omniroute/.env` nebo `./.env` . + +### Nasazení VPS + +```bash +git clone https://github.com/diegosouzapw/OmniRoute.git +cd OmniRoute && npm install && npm run build + +export JWT_SECRET="your-secure-secret-change-this" +export INITIAL_PASSWORD="your-password" +export DATA_DIR="/var/lib/omniroute" +export PORT="20128" +export HOSTNAME="0.0.0.0" +export NODE_ENV="production" +export NEXT_PUBLIC_BASE_URL="http://localhost:20128" +export API_KEY_SECRET="endpoint-proxy-api-key-secret" + +npm run start +# Or: pm2 start npm --name omniroute -- start +``` + +### Nasazení PM2 (málo paměti) + +Pro servery s omezenou pamětí RAM použijte možnost omezení paměti: + +```bash +# With 512MB limit (default) +pm2 start npm --name omniroute -- start + +# Or with custom memory limit +OMNIROUTE_MEMORY_MB=512 pm2 start npm --name omniroute -- start + +# Or using ecosystem.config.js +pm2 start ecosystem.config.js +``` + +Vytvořte soubor `ecosystem.config.js` : + +```javascript +module.exports = { + apps: [ + { + name: "omniroute", + script: "npm", + args: "start", + env: { + NODE_ENV: "production", + OMNIROUTE_MEMORY_MB: "512", + JWT_SECRET: "your-secret", + INITIAL_PASSWORD: "your-password", + }, + node_args: "--max-old-space-size=512", + max_memory_restart: "300M", + }, + ], +}; +``` + +### Přístavní dělník + +```bash +# Build image (default = runner-cli with codex/claude/droid preinstalled) +docker build -t omniroute:cli . + +# Portable mode (recommended) +docker run -d --name omniroute -p 20128:20128 --env-file ./.env -v omniroute-data:/app/data omniroute:cli +``` + +Informace o režimu integrovaném s hostitelem s binárními soubory CLI naleznete v části Docker v hlavní dokumentaci. + +### Proměnné prostředí + +Proměnná | Výchozí | Popis +--- | --- | --- +`JWT_SECRET` | `omniroute-default-secret-change-me` | Tajný klíč podpisu JWT ( **změna v produkčním prostředí** ) +`INITIAL_PASSWORD` | `123456` | První přihlašovací heslo +`DATA_DIR` | `~/.omniroute` | Datový adresář (db, využití, protokoly) +`PORT` | výchozí nastavení rámce | Servisní port ( `20128` v příkladech) +`HOSTNAME` | výchozí nastavení rámce | Vázat hostitele (Docker má výchozí hodnotu `0.0.0.0` ) +`NODE_ENV` | výchozí nastavení za běhu | Nastavení `production` pro nasazení +`BASE_URL` | `http://localhost:20128` | Interní základní URL na straně serveru +`CLOUD_URL` | `https://omniroute.dev` | Základní adresa URL koncového bodu synchronizace s cloudem +`API_KEY_SECRET` | `endpoint-proxy-api-key-secret` | Tajný klíč HMAC pro generované klíče API +`REQUIRE_API_KEY` | `false` | Vynutit klíč rozhraní Bearer API na `/v1/*` +`ENABLE_REQUEST_LOGS` | `false` | Povoluje protokolování požadavků/odpovědí +`AUTH_COOKIE_SECURE` | `false` | Vynutit soubor cookie `Secure` ověřování (za reverzní proxy HTTPS) +`OMNIROUTE_MEMORY_MB` | `512` | Limit haldy Node.js v MB +`PROMPT_CACHE_MAX_SIZE` | `50` | Maximální počet položek mezipaměti výzev +`SEMANTIC_CACHE_MAX_SIZE` | `100` | Maximální počet položek sémantické mezipaměti + +Úplný přehled proměnných prostředí naleznete v souboru [README](../README.md) . + +--- + +## 📊 Dostupné modely + +
+Zobrazit všechny dostupné modely +
+ +**Claude Code ( `cc/` )** — Pro/Max: `cc/claude-opus-4-6` , `cc/claude-sonnet-4-5-20250929` , `cc/claude-haiku-4-5-20251001` + +**Codex ( `cx/` )** — Plus/Pro: `cx/gpt-5.2-codex` , `cx/gpt-5.1-codex-max` + +**Rozhraní příkazového řádku Gemini ( `gc/` )** — ZDARMA: `gc/gemini-3-flash-preview` , `gc/gemini-2.5-pro` + +**GitHub Copilot ( `gh/` )** : `gh/gpt-5` , `gh/claude-4.5-sonnet` + +**GLM ( `glm/` )** — 0,6 USD/1 milion: `glm/glm-4.7` + +**MiniMax ( `minimax/` )** — 0,2 USD/1 milion: `minimax/MiniMax-M2.1` + +**iFlow ( `if/` )** — ZDARMA: `if/kimi-k2-thinking` , `if/qwen3-coder-plus` , `if/deepseek-r1` + +**Qwen ( `qw/` )** — ZDARMA: `qw/qwen3-coder-plus` , `qw/qwen3-coder-flash` + +**Kiro ( `kr/` )** — ZDARMA: `kr/claude-sonnet-4.5` , `kr/claude-haiku-4.5` + +**DeepSeek ( `ds/` )** : `ds/deepseek-chat` , `ds/deepseek-reasoner` + +**Groq ( `groq/` )** : `groq/llama-3.3-70b-versatile` , `groq/llama-4-maverick-17b-128e-instruct` + +**xAI ( `xai/` )** : `xai/grok-4` , `xai/grok-4-0709-fast-reasoning` , `xai/grok-code-mini` + +**Mistral ( `mistral/` )** : `mistral/mistral-large-2501` , `mistral/codestral-2501` + +**Zmatek ( `pplx/` )** : `pplx/sonar-pro` , `pplx/sonar` + +**Společně AI ( `together/` )** : `together/meta-llama/Llama-3.3-70B-Instruct-Turbo` + +**Umělá inteligence pro ohňostroje ( `fireworks/` )** : `fireworks/accounts/fireworks/models/deepseek-v3p1` + +**Cerebras ( `cerebras/` )** : `cerebras/llama-3.3-70b` + +**Soudržnost ( `cohere/` )** : `cohere/command-r-plus-08-2024` + +**NVIDIA NIM ( `nvidia/` )** : `nvidia/nvidia/llama-3.3-70b-instruct` + + + + +--- + +## 🧩 Pokročilé funkce + +### Vlastní modely + +Přidejte libovolné ID modelu k libovolnému poskytovateli bez čekání na aktualizaci aplikace: + +```bash +# Via API +curl -X POST http://localhost:20128/api/provider-models \ + -H "Content-Type: application/json" \ + -d '{"provider": "openai", "modelId": "gpt-4.5-preview", "modelName": "GPT-4.5 Preview"}' + +# List: curl http://localhost:20128/api/provider-models?provider=openai +# Remove: curl -X DELETE "http://localhost:20128/api/provider-models?provider=openai&model=gpt-4.5-preview" +``` + +Nebo použijte Dashboard: **Poskytovatelé → [Poskytovatel] → Vlastní modely** . + +### Vyhrazené trasy poskytovatelů + +Směrování požadavků přímo ke konkrétnímu poskytovateli s validací modelu: + +```bash +POST http://localhost:20128/v1/providers/openai/chat/completions +POST http://localhost:20128/v1/providers/openai/embeddings +POST http://localhost:20128/v1/providers/fireworks/images/generations +``` + +Pokud chybí prefix poskytovatele, automaticky se přidá. Neshodné modely vrátí chybu `400` . + +### Konfigurace síťového proxy serveru + +```bash +# Set global proxy +curl -X PUT http://localhost:20128/api/settings/proxy \ + -d '{"global": {"type":"http","host":"proxy.example.com","port":"8080"}}' + +# Per-provider proxy +curl -X PUT http://localhost:20128/api/settings/proxy \ + -d '{"providers": {"openai": {"type":"socks5","host":"proxy.example.com","port":"1080"}}}' + +# Test proxy +curl -X POST http://localhost:20128/api/settings/proxy/test \ + -d '{"proxy":{"type":"socks5","host":"proxy.example.com","port":"1080"}}' +``` + +**Priorita:** Specifická pro klíč → Specifická pro kombinaci → Specifická pro poskytovatele → Globální → Prostředí. + +### API katalogu modelů + +```bash +curl http://localhost:20128/api/models/catalog +``` + +Vrátí modely seskupené podle poskytovatele s typy ( `chat` , `embedding` , `image` ). + +### Synchronizace s cloudem + +- Synchronizace poskytovatelů, kombinací a nastavení napříč zařízeními +- Automatická synchronizace na pozadí s časovým limitem + rychlá ochrana proti selhání +- V produkčním prostředí preferovat `BASE_URL` / `CLOUD_URL` na straně serveru + +### LLM Gateway Intelligence (fáze 9) + +- **Sémantická mezipaměť** — Automaticky ukládá do mezipaměti nestreamované odpovědi s teplotou 0 (obejde se pomocí `X-OmniRoute-No-Cache: true` ) +- **Request Idempotency** — Deduplikuje požadavky do 5 sekund pomocí hlavičky `Idempotency-Key` nebo `X-Request-Id` +- **Sledování průběhu** — `event: progress` prostřednictvím záhlaví `X-OmniRoute-Progress: true` + +--- + +### Hřiště překladatelů + +Přístup přes **Dashboard → Translator** . Ladění a vizualizace toho, jak OmniRoute překládá požadavky API mezi poskytovateli. + +Režim | Účel +--- | --- +**Dětské hřiště** | Vyberte zdrojový/cílový formát, vložte požadavek a okamžitě si prohlédněte přeložený výstup +**Tester chatu** | Odesílejte zprávy živého chatu přes proxy a kontrolujte celý cyklus požadavku/odpovědi +**Zkušební stolice** | Spusťte dávkové testy napříč různými kombinacemi formátů pro ověření správnosti překladu +**Živý monitor** | Sledujte překlady v reálném čase, jak požadavky procházejí proxy serverem + +**Případy použití:** + +- Ladění, proč selhává určitá kombinace klienta/poskytovatele +- Ověřte, zda se tagy myšlení, volání nástrojů a systémové výzvy správně překládají. +- Porovnejte rozdíly ve formátech OpenAI, Claude, Gemini a Responses API + +--- + +### Strategie směrování + +Konfigurace přes **Dashboard → Nastavení → Routing** . + +Strategie | Popis +--- | --- +**Nejprve vyplňte** | Používá účty podle priority – primární účet zpracovává všechny požadavky, dokud není k dispozici. +**Round Robin** | Cykluje mezi všemi účty s nastavitelným trvalým limitem (výchozí: 3 volání na účet) +**P2C (Síla dvou možností)** | Vybere 2 náhodné účty a nasměruje je k tomu zdravějšímu – vyvažuje zátěž s povědomím o zdraví +**Náhodný** | Náhodně vybere účet pro každý požadavek pomocí Fisher-Yatesova náhodného výběru. +**Nejméně používané** | Směruje k účtu s nejstarším časovým razítkem `lastUsedAt` a rovnoměrně rozděluje provoz. +**Optimalizované náklady** | Směruje k účtu s nejnižší prioritou a optimalizuje pro poskytovatele s nejnižšími náklady. + +#### Aliasy zástupných znaků modelů + +Vytvořte zástupné znaky pro přemapování názvů modelů: + +``` +Pattern: claude-sonnet-* → Target: cc/claude-sonnet-4-5-20250929 +Pattern: gpt-* → Target: gh/gpt-5.1-codex +``` + +Zástupné znaky podporují `*` (libovolný znak) a `?` (jeden znak). + +#### Záložní řetězce + +Definujte globální záložní řetězce, které platí pro všechny požadavky: + +``` +Chain: production-fallback + 1. cc/claude-opus-4-6 + 2. gh/gpt-5.1-codex + 3. glm/glm-4.7 +``` + +--- + +### Odolnost a jističe + +Konfigurace přes **Dashboard → Settings → Resilience** . + +OmniRoute implementuje odolnost na úrovni poskytovatele se čtyřmi komponentami: + +1. **Profily poskytovatelů** – Konfigurace pro jednotlivé poskytovatele pro: + + - Práh selhání (počet selhání před otevřením) + - Doba zchlazení + - Citlivost detekce limitu frekvence + - Exponenciální backoff parametry + +2. **Upravitelné limity rychlosti** – Výchozí nastavení na úrovni systému konfigurovatelná na řídicím panelu: + + - **Požadavky za minutu (RPM)** — Maximální počet požadavků za minutu na účet + - **Minimální doba mezi požadavky** — Minimální mezera v milisekundách mezi požadavky + - **Max. počet souběžných požadavků** — Maximální počet souběžných požadavků na účet + - Klikněte na **Upravit** pro úpravu a poté **na Uložit** nebo **Zrušit** . Hodnoty se ukládají prostřednictvím rozhraní API pro odolnost. + +3. **Jistič** – Sleduje poruchy u jednotlivých poskytovatelů a automaticky rozpojuje obvod, když je dosaženo prahové hodnoty: + + - **ZAVŘENO** (v pořádku) – Požadavky probíhají normálně. + - **OTEVŘENO** — Poskytovatel je dočasně zablokován po opakovaných selháních + - **HALF_OPEN** — Testování, zda se poskytovatel zotavil + +4. **Zásady a uzamčené identifikátory** – Zobrazuje stav jističe a uzamčené identifikátory s možností vynuceného odemčení. + +5. **Automatická detekce limitu rychlosti** – Monitoruje záhlaví `429` a `Retry-After` , aby se proaktivně zabránilo dosažení limitů rychlosti poskytovatele. + +**Tip pro profesionály:** Pomocí tlačítka **Obnovit vše** vymažete všechny jističe a doby ochlazování, když se poskytovatel zotaví z výpadku. + +--- + +### Export / import databáze + +Správa záloh databáze se provádí v **nabídce Ovládací panel → Nastavení → Systém a úložiště** . + +Akce | Popis +--- | --- +**Exportovat databázi** | Stáhne aktuální databázi SQLite jako soubor `.sqlite` +**Exportovat vše (.tar.gz)** | Stáhne kompletní zálohu včetně: databáze, nastavení, kombinací, připojení k poskytovatelům (bez přihlašovacích údajů) a metadat klíče API. +**Importovat databázi** | Nahrajte soubor `.sqlite` , který nahradí aktuální databázi. Záloha před importem se vytvoří automaticky. + +```bash +# API: Export database +curl -o backup.sqlite http://localhost:20128/api/db-backups/export + +# API: Export all (full archive) +curl -o backup.tar.gz http://localhost:20128/api/db-backups/exportAll + +# API: Import database +curl -X POST http://localhost:20128/api/db-backups/import \ + -F "file=@backup.sqlite" +``` + +**Ověření importu:** Importovaný soubor je ověřen z hlediska integrity (kontrola pragma SQLite), požadovaných tabulek ( `provider_connections` , `provider_nodes` , `combos` , `api_keys` ) a velikosti (max. 100 MB). + +**Případy použití:** + +- Migrace OmniRoute mezi počítači +- Vytvořte externí zálohy pro zotavení po havárii +- Sdílení konfigurací mezi členy týmu (exportovat vše → sdílet archiv) + +--- + +### Ovládací panel nastavení + +Stránka nastavení je pro snadnou navigaci uspořádána do 5 záložek: + +Záložka | Obsah +--- | --- +**Zabezpečení** | Nastavení přihlášení/hesla, řízení přístupu k IP adrese, autorizace API pro `/models` a blokování poskytovatelů +**Směrování** | Globální strategie směrování (6 možností), aliasy zástupných znaků, záložní řetězce, kombinované výchozí hodnoty +**Odolnost** | Profily poskytovatelů, upravitelné limity sazeb, stav jističů, zásady a uzamčené identifikátory +**Umělá inteligence** | Konfigurace rozpočtu promyšleného projektu, globální vkládání promptu do systému, statistiky mezipaměti promptu +**Moderní** | Globální konfigurace proxy (HTTP/SOCKS5) + +--- + +### Správa nákladů a rozpočtu + +Přístup přes **Dashboard → Náklady** . + +Záložka | Účel +--- | --- +**Rozpočet** | Nastavte limity útrat pro každý klíč API s denními/týdenními/měsíčními rozpočty a sledováním v reálném čase +**Ceny** | Zobrazení a úprava cenových položek modelu – cena za 1000 vstupních/výstupních tokenů na poskytovatele + +```bash +# API: Set a budget +curl -X POST http://localhost:20128/api/usage/budget \ + -H "Content-Type: application/json" \ + -d '{"keyId": "key-123", "limit": 50.00, "period": "monthly"}' + +# API: Get current budget status +curl http://localhost:20128/api/usage/budget +``` + +**Sledování nákladů:** Každý požadavek zaznamenává využití tokenů a vypočítává náklady pomocí ceníkové tabulky. Rozdělení si můžete prohlédnout v **sekci Dashboard → Využití** podle poskytovatele, modelu a klíče API. + +--- + +### Přepis zvuku + +OmniRoute podporuje přepis zvuku prostřednictvím koncového bodu kompatibilního s OpenAI: + +```bash +POST /v1/audio/transcriptions +Authorization: Bearer your-api-key +Content-Type: multipart/form-data + +# Example with curl +curl -X POST http://localhost:20128/v1/audio/transcriptions \ + -H "Authorization: Bearer your-api-key" \ + -F "file=@audio.mp3" \ + -F "model=deepgram/nova-3" +``` + +Dostupní poskytovatelé: **Deepgram** ( `deepgram/` ), **AssemblyAI** ( `assemblyai/` ). + +Podporované zvukové formáty: `mp3` , `wav` , `m4a` , `flac` , `ogg` , `webm` . + +--- + +### Strategie kombinovaného vyvažování + +Nastavte vyvažování jednotlivých kombinací v **nabídce Dashboard → Kombinace → Vytvořit/Upravit → Strategie** . + +Strategie | Popis +--- | --- +**Round-Robin** | Postupně prochází modely +**Přednost** | Vždy se pokusí o první model; vrací se pouze v případě chyby. +**Náhodný** | Pro každý požadavek vybere náhodný model z komba +**Vážené** | Trasy proporcionálně na základě přiřazených vah pro každý model +**Nejméně používané** | Směruje k modelu s nejmenším počtem nedávných požadavků (používá kombinované metriky) +**Optimalizované z hlediska nákladů** | Trasy k nejlevnějšímu dostupnému modelu (používá ceník) + +Globální výchozí hodnoty kombinací lze nastavit v **nabídce Dashboard → Settings → Routing → Combo Defaults** . + +--- + +### Dashboard zdraví + +Přístup přes **Dashboard → Stav** . Přehled stavu systému v reálném čase se 6 kartami: + +Karta | Co to ukazuje +--- | --- +**Stav systému** | Doba provozuschopnosti, verze, využití paměti, datový adresář +**Zdraví poskytovatelů** | Stav jističe podle dodavatele (Zapnuto/Vypnuto/Napůl vypnuto) +**Limity sazeb** | Aktivní limit rychlosti cooldownů na účet se zbývajícím časem +**Aktivní výluky** | Poskytovatelé dočasně blokovaní politikou uzamčení +**Mezipaměť podpisů** | Statistiky mezipaměti pro deduplikaci (aktivní klíče, míra zásahů) +**Telemetrie latence** | Agregace latence p50/p95/p99 na poskytovatele + +**Tip pro profesionály:** Stránka Zdraví se automaticky obnovuje každých 10 sekund. Pomocí karty jističe můžete zjistit, kteří poskytovatelé mají problémy. + +--- + +## 🖥️ Desktopová aplikace (Electron) + +OmniRoute je k dispozici jako nativní desktopová aplikace pro Windows, macOS a Linux. + +### Instalace + +```bash +# From the electron directory: +cd electron +npm install + +# Development mode (connect to running Next.js dev server): +npm run dev + +# Production mode (uses standalone build): +npm start +``` + +### Instalatéři budov + +```bash +cd electron +npm run build # Current platform +npm run build:win # Windows (.exe NSIS) +npm run build:mac # macOS (.dmg universal) +npm run build:linux # Linux (.AppImage) +``` + +Výstup → `electron/dist-electron/` + +### Klíčové vlastnosti + +Funkce | Popis +--- | --- +**Připravenost serveru** | Před zobrazením okna se dotazuje server (žádná prázdná obrazovka) +**Systémový zásobník** | Minimalizovat do zásobníku, změnit port, ukončit menu v zásobníku +**Správa přístavů** | Změna portu serveru z panelu úloh (automatické restartování serveru) +**Zásady zabezpečení obsahu** | Omezující CSP prostřednictvím záhlaví relace +**Jedna instance** | V daném okamžiku může běžet pouze jedna instance aplikace +**Offline režim** | Dodávaný server Next.js funguje bez internetu + +### Proměnné prostředí + +Proměnná | Výchozí | Popis +--- | --- | --- +`OMNIROUTE_PORT` | `20128` | Port serveru +`OMNIROUTE_MEMORY_MB` | `512` | Limit haldy Node.js (64–16384 MB) + +📖 Úplná dokumentace: [`electron/README.md`](../electron/README.md) diff --git a/docs/i18n/cs/VM_DEPLOYMENT_GUIDE.md b/docs/i18n/cs/VM_DEPLOYMENT_GUIDE.md new file mode 100644 index 00000000..98e078cb --- /dev/null +++ b/docs/i18n/cs/VM_DEPLOYMENT_GUIDE.md @@ -0,0 +1,399 @@ +# OmniRoute — Guia de Deploy em VM com Cloudflare + +Kompletní instalace a konfigurace OmniRoute u VM (VPS) s gerenciou přes Cloudflare. + +--- + +## Předpoklady + +Položka | Mínimo | Doporučeno +--- | --- | --- +**Procesor** | 1 virtuální procesor | 2 vCPU +**BERAN** | 1 GB | 2 GB +**Disko** | 10GB SSD | 25GB SSD +**TAK** | Ubuntu 22.04 LTS | Ubuntu 24.04 LTS +**Domínio** | Registrován v Cloudflare | — +**Přístavní dělník** | Docker Engine 24+ | Docker 27+ + +**Testados poskytovatelů** : Akamai (Linode), DigitalOcean, Vultr, Hetzner, AWS Lightsail. + +--- + +## 1. Konfigurace virtuálního počítače + +### 1.1 Vytvořit ihned + +Žádný preferovaný poskytovatel seu VPS: + +- Vyberte si Ubuntu 24.04 LTS +- Výběr nebo plano minimo (1 vCPU / 1 GB RAM) +- Definujte sílu pro root nebo konfiguraci klíče SSH +- Anote o **IP público** (např.: `203.0.113.10` ) + +### 1.2 Připojení přes SSH + +```bash +ssh root@203.0.113.10 +``` + +### 1.3 Aktualizace systému + +```bash +apt update && apt upgrade -y +``` + +### 1.4 Instalace Dockeru + +```bash +# Instalar dependências +apt install -y ca-certificates curl gnupg + +# Adicionar repositório oficial do Docker +install -m 0755 -d /etc/apt/keyrings +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg +chmod a+r /etc/apt/keyrings/docker.gpg +echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null +apt update +apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin +``` + +### 1.5 Instalace nginxu + +```bash +apt install -y nginx +``` + +### 1.6 Konfigurace firewallu (UFW) + +```bash +ufw default deny incoming +ufw default allow outgoing +ufw allow 22/tcp # SSH +ufw allow 80/tcp # HTTP (redirect) +ufw allow 443/tcp # HTTPS +ufw enable +``` + +> **Dica** : Maximální zabezpečení, omezení jako porty 80 a 443 přístupů pro IP Cloudflare. Veja a seção [Segurança Avançada](#seguran%C3%A7a-avan%C3%A7ada) . + +--- + +## 2. Instalace OmniRoute + +### 2.1 Criar diretório de configuração + +```bash +mkdir -p /opt/omniroute +``` + +### 2.2 Criar arquivo de variáveis ​​de ambiente + +```bash +cat > /opt/omniroute/.env << 'EOF' +# === Segurança === +JWT_SECRET=ALTERE-PARA-CHAVE-SECRETA-UNICA-64-CHARS +INITIAL_PASSWORD=SuaSenhaSegura123! +API_KEY_SECRET=ALTERE-PARA-OUTRA-CHAVE-SECRETA +STORAGE_ENCRYPTION_KEY=ALTERE-PARA-TERCEIRA-CHAVE-SECRETA +STORAGE_ENCRYPTION_KEY_VERSION=v1 +MACHINE_ID_SALT=ALTERE-PARA-SALT-UNICO + +# === App === +PORT=20128 +NODE_ENV=production +HOSTNAME=0.0.0.0 +DATA_DIR=/app/data +STORAGE_DRIVER=sqlite +ENABLE_REQUEST_LOGS=true +AUTH_COOKIE_SECURE=false +REQUIRE_API_KEY=false + +# === Domain (altere para seu domínio) === +BASE_URL=https://llms.seudominio.com +NEXT_PUBLIC_BASE_URL=https://llms.seudominio.com + +# === Cloud Sync (opcional) === +# CLOUD_URL=https://cloud.omniroute.online +# NEXT_PUBLIC_CLOUD_URL=https://cloud.omniroute.online +EOF +``` + +> ⚠️ **DŮLEŽITÉ** : Gere chaves secretas únicas! Použijte `openssl rand -hex 32` para cada chave. + +### 2.3 Spuštění kontejneru + +```bash +docker pull diegosouzapw/omniroute:latest + +docker run -d \ + --name omniroute \ + --restart unless-stopped \ + --env-file /opt/omniroute/.env \ + -p 20128:20128 \ + -v omniroute-data:/app/data \ + diegosouzapw/omniroute:latest +``` + +### 2.4 Verificar se está rodando + +```bash +docker ps | grep omniroute +docker logs omniroute --tail 20 +``` + +Vývojový příklad: `[DB] SQLite database ready` a `listening on port 20128` . + +--- + +## 3. Konfigurace nginx (reverzní proxy) + +### 3.1 Gerar Certificado SSL (Cloudflare Origin) + +Cloudflare nic neřeší: + +1. Používá **SSL/TLS → Origin Server** +2. **Certifikát Clique Create** +3. Deixe os padrões (15 ano, *.seudominio.com) +4. Zkopírujte nebo zkopírujte **certifikát původu** a **soukromý klíč** + +```bash +mkdir -p /etc/nginx/ssl + +# Colar o certificado +nano /etc/nginx/ssl/origin.crt + +# Colar a chave privada +nano /etc/nginx/ssl/origin.key + +chmod 600 /etc/nginx/ssl/origin.key +``` + +### 3.2 Konfigurace nginxu + +```bash +cat > /etc/nginx/sites-available/omniroute << 'NGINX' +# Default server — bloqueia acesso direto por IP +server { + listen 80 default_server; + listen [::]:80 default_server; + listen 443 ssl default_server; + listen [::]:443 ssl default_server; + ssl_certificate /etc/nginx/ssl/origin.crt; + ssl_certificate_key /etc/nginx/ssl/origin.key; + server_name _; + return 444; +} + +# OmniRoute — HTTPS +server { + listen 443 ssl; + listen [::]:443 ssl; + server_name llms.seudominio.com; # Altere para seu domínio + + ssl_certificate /etc/nginx/ssl/origin.crt; + ssl_certificate_key /etc/nginx/ssl/origin.key; + ssl_protocols TLSv1.2 TLSv1.3; + + client_max_body_size 100M; + + location / { + proxy_pass http://127.0.0.1:20128; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # WebSocket support + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + + # SSE (Server-Sent Events) — streaming AI responses + proxy_buffering off; + proxy_cache off; + proxy_read_timeout 300s; + proxy_send_timeout 300s; + } +} + +# HTTP → HTTPS redirect +server { + listen 80; + listen [::]:80; + server_name llms.seudominio.com; + return 301 https://$server_name$request_uri; +} +NGINX +``` + +### 3.3 Ativar a testování + +```bash +# Remover config padrão +rm -f /etc/nginx/sites-enabled/default + +# Ativar OmniRoute +ln -sf /etc/nginx/sites-available/omniroute /etc/nginx/sites-enabled/omniroute + +# Testar e recarregar +nginx -t && systemctl reload nginx +``` + +--- + +## 4. Konfigurace DNS v Cloudflare + +### 4.1 Další DNS registr + +No painel da Cloudflare → DNS: + +Typ | Jméno | Obsah | Proxy +--- | --- | --- | --- +A | `llms` | `203.0.113.10` (IP adresa virtuálního počítače) | ✅ Proxy + +### 4.2 Konfigurace SSL + +Em **SSL/TLS → Přehled** : + +- Režim: **Plný (Přísný)** + +Em **SSL/TLS → Edge certifikáty** : + +- Vždy používat HTTPS: ✅ Zapnuto +- Minimální verze TLS: TLS 1.2 +- Automatické přepisování HTTPS: ✅ Zapnuto + +### 4.3 Testar + +```bash +curl -sI https://llms.seudominio.com/health +# Deve retornar HTTP/2 200 +``` + +--- + +## 5. Operace a údržba + +### Aktualizovat na novou verzi + +```bash +docker pull diegosouzapw/omniroute:latest +docker stop omniroute && docker rm omniroute +docker run -d --name omniroute --restart unless-stopped \ + --env-file /opt/omniroute/.env \ + -p 20128:20128 \ + -v omniroute-data:/app/data \ + diegosouzapw/omniroute:latest +``` + +### Verzovní protokoly + +```bash +docker logs -f omniroute # Stream em tempo real +docker logs omniroute --tail 50 # Últimas 50 linhas +``` + +### Ruční zálohování banky + +```bash +# Copiar dados do volume para o host +docker cp omniroute:/app/data ./backup-$(date +%F) + +# Ou comprimir todo o volume +docker run --rm -v omniroute-data:/data -v $(pwd):/backup \ + alpine tar czf /backup/omniroute-data-$(date +%F).tar.gz /data +``` + +### Obnovení zálohy + +```bash +docker stop omniroute +docker run --rm -v omniroute-data:/data -v $(pwd):/backup \ + alpine sh -c "rm -rf /data/* && tar xzf /backup/omniroute-data-YYYY-MM-DD.tar.gz -C /" +docker start omniroute +``` + +--- + +## 6. Pokročilá bezpečnost + +### Omezte přístup k IP Cloudflare + +```bash +cat > /etc/nginx/cloudflare-ips.conf << 'CF' +# Cloudflare IPv4 ranges — atualizar periodicamente +# https://www.cloudflare.com/ips-v4/ +set_real_ip_from 173.245.48.0/20; +set_real_ip_from 103.21.244.0/22; +set_real_ip_from 103.22.200.0/22; +set_real_ip_from 103.31.4.0/22; +set_real_ip_from 141.101.64.0/18; +set_real_ip_from 108.162.192.0/18; +set_real_ip_from 190.93.240.0/20; +set_real_ip_from 188.114.96.0/20; +set_real_ip_from 197.234.240.0/22; +set_real_ip_from 198.41.128.0/17; +set_real_ip_from 162.158.0.0/15; +set_real_ip_from 104.16.0.0/13; +set_real_ip_from 104.24.0.0/14; +set_real_ip_from 172.64.0.0/13; +set_real_ip_from 131.0.72.0/22; +real_ip_header CF-Connecting-IP; +CF +``` + +Přidat `nginx.conf` dentro do bloco `http {}` : + +```nginx +include /etc/nginx/cloudflare-ips.conf; +``` + +### Nainstalujte fail2ban + +```bash +apt install -y fail2ban +systemctl enable fail2ban +systemctl start fail2ban + +# Verificar status +fail2ban-client status sshd +``` + +### Bloquear accesso direto na port do Docker + +```bash +# Impedir acesso externo direto à porta 20128 +iptables -I DOCKER-USER -p tcp --dport 20128 -j DROP +iptables -I DOCKER-USER -i lo -p tcp --dport 20128 -j ACCEPT + +# Persistir as regras +apt install -y iptables-persistent +netfilter-persistent save +``` + +--- + +## 7. Nasazení cloudového pracovníka (volitelné) + +Vzdálený přístup přes Cloudflare Workers (zde exponovat diretament VM): + +```bash +# No repositório local +cd omnirouteCloud +npm install +npx wrangler login +npx wrangler deploy +``` + +Dokumenty jsou kompletní pro [omnirouteCloud/README.md](../omnirouteCloud/README.md) . + +--- + +## Resumo de Portas + +Porta | Služba | Přístup +--- | --- | --- +22 | SSH | Veřejné (s fail2ban) +80 | nginx HTTP | Přesměrování → HTTPS +443 | nginx HTTPS | Prostřednictvím proxy serveru Cloudflare +20128 | OmniRoute | Někdy na localhostu (přes nginx) diff --git a/docs/i18n/cs/adr/0001-proxy-registry-limit-generalization.md b/docs/i18n/cs/adr/0001-proxy-registry-limit-generalization.md new file mode 100644 index 00000000..cb1ba578 --- /dev/null +++ b/docs/i18n/cs/adr/0001-proxy-registry-limit-generalization.md @@ -0,0 +1,45 @@ +# ADR-0001: Zobecnění registru proxy serverů + kontroly využití + +Datum: 17. 3. 2026 Stav: Přijato + +## Kontext + +OmniRoute je užitečný: + +- Přiřazení proxy na základě konfigurační mapy ( `global` , `providers` , `combos` , `keys` ). +- Výběr s ohledem na kvóty poskytovatele khusus tertentu (zejména `codex` ). + +Mezera utama: + +- Proxy belum menjadi asset opakovaně použitelný jang bisa di-manage sebagai entitas (metadata, kde se používají, bezpečné smazání). +- Zásady použití belum konsisten lintas provider. +- Chybová smlouva API belum seragam untuk manajemen endpoint manajemen. + +## Rozhodnutí + +1. Tambah **Proxy Registry** sebegai domény baru di DB ( `proxy_registry` , `proxy_assignments` ). +2. Stálá kompatibilita přiřazení lama (záložní lama `proxyConfig` ). +3. Priority pakai runtime modulu Resolver: + - účet -> poskytovatel -> globální (registr) + - záložní ke legacy resolver jika registry belum ada přiřazení +4. Výchozí registr výstupního seznamu Wajib redaction kredensial di. +5. Standarkan error JSON unuk endpoint manajemen proxy agar konsisten dan punya `requestId` . + +## Důsledky + +Pozitivní: + +- Opakovaně použitelný proxy server. +- Bezpečné odstranění bisa ditegakkan (409 saat masih dipakai). +- Migrasi bertahap tanpa prolomení runtime změn. + +Negativní: + +- Ada dual-source sementara (registr + starší konfigurace) sampai migrasi selesai. +- Ale přiřazení koncových bodů tambahan a pemetaan rozsah a rozsah. + +## Následná opatření + +- Poskytovatel uživatelského rozhraní Migrasi/účet umožňuje zadat nezpracovaný registr selektoru proxy serveru. +- Telemetrie zdraví Tambah na proxy a upozornění. +- Všeobecná kontrola používání ke poskytovateli lain melalui interface policy yang sama. diff --git a/docs/i18n/cs/adr/0002-api-error-contract-management-endpoints.md b/docs/i18n/cs/adr/0002-api-error-contract-management-endpoints.md new file mode 100644 index 00000000..f3be181a --- /dev/null +++ b/docs/i18n/cs/adr/0002-api-error-contract-management-endpoints.md @@ -0,0 +1,31 @@ +# ADR-0002: Chybová smlouva pro koncové body správy + +Datum: 17. 3. 2026 Stav: Přijato + +## Rozhodnutí + +Koncové body správy (konfigurace proxy, registr proxy a přiřazení proxy) vracejí jednotné tělo chyby: + +```json +{ + "error": { + "message": "Human-readable summary", + "type": "invalid_request | not_found | conflict | server_error", + "details": {} + }, + "requestId": "uuid" +} +``` + +## Mapování stavu + +- 400: neplatný požadavek / selhání ověření +- 404: zdroj nenalezen +- 409: konflikt zdrojů (například proxy stále přiřazen) +- 500: neočekávaná chyba serveru + +## Poznámky + +- `requestId` je povinný pro korelaci protokolů. +- `details` je volitelné a používá se pouze pro bezpečné ověření detailů. +- Citlivé tajné informace (přihlašovací údaje proxy, tokeny) se nikdy nesmí objevit ve `message` ani v `details` . diff --git a/docs/i18n/cs/adr/0003-security-checklist-proxy-limits.md b/docs/i18n/cs/adr/0003-security-checklist-proxy-limits.md new file mode 100644 index 00000000..e6ac963c --- /dev/null +++ b/docs/i18n/cs/adr/0003-security-checklist-proxy-limits.md @@ -0,0 +1,15 @@ +# ADR-0003: Kontrolní seznam zabezpečení pro registr proxy a kontroly používání + +Datum: 17. 3. 2026 Stav: Přijato + +## Kontrolní seznam + +- Ověřte všechny datové části správy pomocí Zodu. +- Odmítnout aktualizace chybně formátovaného přiřazení rozsahu se stavem 400. +- Odmítnout smazání používané proxy se stavem 409, pokud to není vynuceno. +- Ve výchozím nastavení nikdy nezobrazovat uživatelské jméno/heslo proxy v odpovědích seznamu. +- Nikdy nezaznamenávejte nezpracované přihlašovací údaje ani hodnoty tokenů. +- Udržujte chybové odpovědi bez interních trasování zásobníku. +- Chraňte koncové body správy pomocí stávajících zásad middlewaru pro ověřování. +- Auditovat mutující operace: vytvořit/aktualizovat/smazat/přiřadit/migraci. +- Zajistěte, aby se resolver během přechodu vrátil k původní konfiguraci. diff --git a/docs/i18n/cs/electron/README.md b/docs/i18n/cs/electron/README.md new file mode 100644 index 00000000..28d3903a --- /dev/null +++ b/docs/i18n/cs/electron/README.md @@ -0,0 +1,254 @@ +# Aplikace OmniRoute Electron pro stolní počítače + +Tento adresář obsahuje obalovou aplikaci Electron pro desktopovou aplikaci OmniRoute. + +## Architektura (v1.6.4) + +``` +electron/ +├── main.js # Main process — window, tray, server lifecycle, CSP, IPC +├── preload.js # Preload script — secure IPC bridge with disposer pattern +├── package.json # Electron-specific dependencies & electron-builder config +├── types.d.ts # TypeScript definitions (AppInfo, ServerStatus, ElectronAPI) +└── assets/ # Application icons and resources + +src/shared/hooks/ +└── useElectron.ts # React hooks — useSyncExternalStore, zero re-renders +``` + +## Klíčová rozhodnutí o designu + +Rozhodnutí | Odůvodnění +--- | --- +dotazování `waitForServer()` | Zabraňuje zobrazení prázdné obrazovky při studeném startu — před načtením se ozve `http://localhost:PORT` +`stdio: 'pipe'` | Zachycuje stdout/stderr serveru pro logování + detekci připravenosti ( `inherit` ) +Vzor drtiče odpadu | `onServerStatus()` vrací `() => void` pro přesné vyčištění listeneru (ne `removeAllListeners` ) +`useSyncExternalStore` | Nulové renderování pro `useIsElectron()` — žádný cyklus `useState` + `useEffect` +CSP prostřednictvím záhlaví relace | `Content-Security-Policy` omezuje `script-src` , `connect-src` atd. dle osvědčených postupů Electron. +Podmíněný titulek pro platformu | `titleBarStyle: 'hiddenInset'` pouze v systému macOS; `default` ve Windows/Linuxu + +## Rozvoj + +### Předpoklady + +1. Nejprve sestavte aplikaci Next.js: + +```bash +npm run build +``` + +1. Instalace závislostí Electronu: + +```bash +cd electron +npm install +``` + +### Spuštěno ve vývoji + +1. Spusťte vývojový server Next.js: + +```bash +npm run dev +``` + +1. V jiném terminálu spusťte Electron: + +```bash +cd electron +npm run dev +``` + +### Spuštění v produkčním režimu + +1. Sestavení Next.js v samostatném režimu: + +```bash +npm run build +``` + +1. Spuštění elektronu: + +```bash +cd electron +npm start +``` + +## Budova + +### Sestavení pro aktuální platformu + +```bash +cd electron +npm run build +``` + +### Vytvořte pro specifické platformy + +```bash +# Windows +npm run build:win + +# macOS (x64 + arm64) +npm run build:mac + +# Linux +npm run build:linux +``` + +## Výstup + +Vytvořené aplikace jsou umístěny v `dist-electron/` : + +- Windows: `.exe` instalační program (NSIS) + přenosný `.exe` +- macOS: instalační soubor `.dmg` (Intel + Apple Silicon) +- Linux: `.AppImage` + +## Instalace + +### macOS + +1. Stáhněte si nejnovější soubor `.dmg` ze stránky [Verze](https://github.com/diegosouzapw/OmniRoute/releases) . +2. Otevřete soubor `.dmg` . +3. Přetáhněte `OmniRoute.app` do složky Aplikace. +4. Spustit z Aplikací. + +> ⚠️ **Poznámka:** Aplikace zatím není podepsána certifikátem Apple Developer. Pokud macOS aplikaci blokuje, spusťte: +> +> ```bash +> xattr -cr /Applications/OmniRoute.app +> ``` +> +> Nebo klikněte pravým tlačítkem myši na aplikaci → Otevřít → Otevřít (pro obejití Gatekeeperu při prvním spuštění). + +### Windows + +**Instalační program (doporučeno):** + +1. Stáhněte si `OmniRoute.Setup.*.exe` z [Releases](https://github.com/diegosouzapw/OmniRoute/releases) . +2. Spusťte instalační program. +3. Spuštění z nabídky Start nebo zástupce na ploše. + +**Přenosné (bez instalace):** + +1. Stáhněte si soubor `OmniRoute.exe` ze [sekce Vydání](https://github.com/diegosouzapw/OmniRoute/releases) . +2. Spouštět přímo z libovolné složky. + +### Linux + +1. Stáhněte si soubor `.AppImage` ze [sekce Releases](https://github.com/diegosouzapw/OmniRoute/releases) . +2. Udělejte z něj spustitelný soubor: + ```bash + chmod +x OmniRoute-*.AppImage + ``` +3. Běh: + ```bash + ./OmniRoute-*.AppImage + ``` + +## Funkce + +- **Připravenost serveru** – Před zobrazením okna čeká na kontrolu stavu +- **Systémový zásobník** — Minimalizace do systémového zásobníku s rychlými akcemi (otevřít, změnit port, ukončit) +- **Správa portů** — Změna portu z nabídky v systémové liště (server se automaticky restartuje) +- **Ovládací prvky oken** — Vlastní minimalizace, maximalizace, zavření přes IPC +- **Zásady zabezpečení obsahu** – Omezující CSP prostřednictvím záhlaví relací +- **Offline podpora** — Samostatný server Next.js v balíčku +- **Jedna instance** – V daném okamžiku může běžet pouze jedna instance aplikace. + +## Konfigurace + +### Proměnné prostředí + +Proměnná | Výchozí | Popis +--- | --- | --- +`OMNIROUTE_PORT` | `20128` | Port serveru +`OMNIROUTE_MEMORY_MB` | `512` | Limit haldy Node.js (64–16384 MB) +`NODE_ENV` | `production` | Nastavit na `development` pro vývojářský režim + +### Vlastní ikona + +Umístěte ikony do `assets/` : + +- `icon.ico` — ikona Windows (256×256) +- `icon.icns` — balíček ikon pro macOS +- `icon.png` — Linux/obecné použití (512×512) +- `tray-icon.png` — Ikona na systémové liště (16×16 nebo 32×32) + +## Kanály IPC + +### Vyvolání (Renderer → Hlavní, asynchronní) + +Kanál | Vrácení zboží | Popis +--- | --- | --- +`get-app-info` | `AppInfo` | Název aplikace, verze, platforma, isDev, port +`open-external` | `void` | Otevřít URL ve výchozím prohlížeči (pouze http/https) +`get-data-dir` | `string` | Získat cestu k adresáři userData +`restart-server` | `{ success }` | Zastavení + restart serveru (časový limit 5 s + SIGKILL) + +### Odeslat (Renderer → Hlavní, spustit a zapomenout) + +Kanál | Popis +--- | --- +`window-minimize` | Minimalizovat okno +`window-maximize` | Přepnout maximalizaci/obnovení +`window-close` | Zavřít okno (minimalizovat do zásobníku) + +### Příjem (Hlavní → Renderer, události) + +Kanál | Užitečné zatížení | Vydáno, když +--- | --- | --- +`server-status` | `ServerStatus` | Server se spouští, zastavuje, dochází k chybám nebo se restartuje +`port-changed` | `number` | Změna portu přes menu zásobníku + +> **Poznámka** : Posluchače vracejí funkce pro přesné čištění. Viz hooky `useServerStatus` a `usePortChanged` . + +## Zabezpečení + +Funkce | Implementace +--- | --- +Izolace kontextu | `contextIsolation: true` — renderer nemůže přistupovat k Node.js +Integrace uzlů | `nodeIntegration: false` — v rendereru není `require()` +Bílý seznam IPC | Názvy kanálů ověřené při předběžném načítání pomocí `safeInvoke` / `safeSend` / `safeOn` +Ověření URL adresy | `shell.openExternal()` povoluje pouze protokoly `http:` / `https:` +CSP | Záhlaví `Content-Security-Policy` nastavené pomocí `session.webRequest.onHeadersReceived` +Zabezpečení webu | `webSecurity: true` – vynucena politika stejného původu + +## React Hooky + +Háček | Vrácení zboží | Popis +--- | --- | --- +`useIsElectron()` | `boolean` | Detekce nulového renderování pomocí `useSyncExternalStore` +`useElectronAppInfo()` | `{ appInfo, loading, error }` | Informace o aplikaci z hlavního procesu +`useDataDir()` | `{ dataDir, loading, error }` | Adresář uživatelských dat +`useWindowControls()` | `{ minimize, maximize, close }` | Akce ovládání oken +`useOpenExternal()` | `{ openExternal }` | Otevřít URL adresy v prohlížeči +`useServerControls()` | `{ restart, restarting }` | Řízení restartu serveru +`useServerStatus(cb)` | Drtič odpadu | Poslouchejte události stavu serveru +`usePortChanged(cb)` | Drtič odpadu | Poslouchejte události změny portu + +## Odstraňování problémů + +### Aplikace se nespustí + +1. Zkontrolujte, zda je port 20128 dostupný: `lsof -i :20128` +2. Zkontrolujte protokoly konzole pro prefix `[Electron]` +3. Ověřte, zda výstup sestavení existuje v souboru `.next/standalone` + +### Bílá obrazovka + +1. Ověření existence buildu Next.js – čekání na připravenost serveru maximálně 30 sekund +2. Zkontrolujte výstup protokolů `[Server]` a `[Server:err]` +3. Hledání porušení CSP v konzoli pro vývojáře + +### Selhání sestavení + +Ujistěte se, že máte nainstalované nástroje pro sestavení: + +- Windows: Nástroje pro sestavení ve Visual Studiu +- macOS: Nástroje příkazového řádku Xcode +- Linux: `build-essential` , `libsecret-1-dev` + +## Licence + +MIT diff --git a/docs/i18n/cs/i18n/README.html b/docs/i18n/cs/i18n/README.html new file mode 100644 index 00000000..6e2b9407 --- /dev/null +++ b/docs/i18n/cs/i18n/README.html @@ -0,0 +1,164 @@ + + + + + Vícejazyčná dokumentace + + + + + + + + + + + + +

Vícejazyčná dokumentace

+

Tento adresář obsahuje strojově asistované překlady založené na anglické dokumentaci.

+ +

Nedávná poznámka: Zásady limitů pro účty Codex

+

Dokumentace nyní zahrnuje chování zásad kvót na úrovni účtu Codex:

+
    +
  • Přepínání pro jednotlivé účty: 5h a Weekly (ZAP/VYP).
  • +
  • Zásady prahových hodnot: povolené okno dosahující >=90 % označuje účet jako nezpůsobilý k výběru.
  • +
  • Automatická rotace: provoz se přesune na další způsobilý účet Codex.
  • +
  • Automatické opětovné použití: účet se opět stane způsobilým po úspěšném resetAt poskytovatele.
  • +
+

Vygenerováno 26. února 2026.

+ + + + + \ No newline at end of file diff --git a/docs/i18n/cs/i18n/README.md b/docs/i18n/cs/i18n/README.md new file mode 100644 index 00000000..5de17b4a --- /dev/null +++ b/docs/i18n/cs/i18n/README.md @@ -0,0 +1,26 @@ +# Vícejazyčná dokumentace + +Tento adresář obsahuje strojově asistované překlady založené na anglické dokumentaci. + +- **API_REFERENCE.md** : 🇺🇸 [Česky](../API_REFERENCE.md) | 🇧🇷 [Português (Brazílie)](./pt-BR/API_REFERENCE.md) | 🇪🇸 [Español](./es/API_REFERENCE.md) | 🇫🇷 [Français](./fr/API_REFERENCE.md) | 🇮🇹 [Italiano](./it/API_REFERENCE.md) | 🇷🇺 [Русский](./ru/API_REFERENCE.md) | 🇨🇳[中文 (简体)](./zh-CN/API_REFERENCE.md) | 🇩🇪 [Deutsch](./de/API_REFERENCE.md) | 🇮🇳 [हिन्दी](./in/API_REFERENCE.md) | 🇹🇭 [ไทย](./th/API_REFERENCE.md) | 🇺🇦 [Українська](./uk-UA/API_REFERENCE.md) | 🇸🇦 [العربية](./ar/API_REFERENCE.md) | 🇯🇵[日本語](./ja/API_REFERENCE.md)| 🇻🇳 [Tiếng Việt](./vi/API_REFERENCE.md) | 🇧🇬 [Български](./bg/API_REFERENCE.md) | 🇩🇰 [Dánsko](./da/API_REFERENCE.md) | 🇫🇮 [Suomi](./fi/API_REFERENCE.md) | 🇮🇱 [עברית](./he/API_REFERENCE.md) | 🇭🇺 [maďarština](./hu/API_REFERENCE.md) | 🇮🇩 [Bahasa Indonésie](./id/API_REFERENCE.md) | 🇰🇷 [한국어](./ko/API_REFERENCE.md) | 🇲🇾 [Bahasa Melayu](./ms/API_REFERENCE.md) | 🇳🇱 [Nizozemsko](./nl/API_REFERENCE.md) | 🇳🇴 [Norsk](./no/API_REFERENCE.md) | 🇵🇹 [Português (Portugalsko)](./pt/API_REFERENCE.md) | 🇷🇴 [Română](./ro/API_REFERENCE.md) | 🇵🇱 [Polski](./pl/API_REFERENCE.md) | 🇸🇰 [Slovenčina](./sk/API_REFERENCE.md) | 🇸🇪 [Svenska](./sv/API_REFERENCE.md) | 🇵🇭 [Filipínec](./phi/API_REFERENCE.md) | 🇨🇿 [Čeština](./cs/API_REFERENCE.md) + +- **ARCHITECTURE.md** : 🇺🇸 [anglicky](../ARCHITECTURE.md) | 🇧🇷 [Português (Brazílie)](./pt-BR/ARCHITECTURE.md) | 🇪🇸 [Español](./es/ARCHITECTURE.md) | 🇫🇷 [Français](./fr/ARCHITECTURE.md) | 🇮🇹 [Italiano](./it/ARCHITECTURE.md) | 🇷🇺 [Русский](./ru/ARCHITECTURE.md) | 🇨🇳[中文 (简体)](./zh-CN/ARCHITECTURE.md) | 🇩🇪 [Deutsch](./de/ARCHITECTURE.md) | 🇮🇳 [हिन्दी](./in/ARCHITECTURE.md) | 🇹🇭 [ไทย](./th/ARCHITECTURE.md) | 🇺🇦 [Українська](./uk-UA/ARCHITECTURE.md) | 🇸🇦 [العربية](./ar/ARCHITECTURE.md) | 🇯🇵[日本語](./ja/ARCHITECTURE.md)| 🇻🇳 [Tiếng Việt](./vi/ARCHITECTURE.md) | 🇧🇬 [Български](./bg/ARCHITECTURE.md) | 🇩🇰 [Dánsko](./da/ARCHITECTURE.md) | 🇫🇮 [Suomi](./fi/ARCHITECTURE.md) | 🇮🇱 [עברית](./he/ARCHITECTURE.md) | 🇭🇺 [maďarština](./hu/ARCHITECTURE.md) | 🇮🇩 [Bahasa Indonésie](./id/ARCHITECTURE.md) | 🇰🇷 [한국어](./ko/ARCHITECTURE.md) | 🇲🇾 [Bahasa Melayu](./ms/ARCHITECTURE.md) | 🇳🇱 [Nizozemsko](./nl/ARCHITECTURE.md) | 🇳🇴 [Norsk](./no/ARCHITECTURE.md) | 🇵🇹 [Português (Portugalsko)](./pt/ARCHITECTURE.md) | 🇷🇴 [Română](./ro/ARCHITECTURE.md) | 🇵🇱 [Polski](./pl/ARCHITECTURE.md) | 🇸🇰 [Slovenčina](./sk/ARCHITECTURE.md) | 🇸🇪 [Svenska](./sv/ARCHITECTURE.md) | 🇵🇭 [Filipínec](./phi/ARCHITECTURE.md) | 🇨🇿 [Čeština](./cs/ARCHITECTURE.md) + +- **CODEBASE_DOCUMENTATION.md** : 🇺🇸 [anglicky](../CODEBASE_DOCUMENTATION.md) | 🇧🇷 [Português (Brazílie)](./pt-BR/CODEBASE_DOCUMENTATION.md) | 🇪🇸 [Español](./es/CODEBASE_DOCUMENTATION.md) | 🇫🇷 [Français](./fr/CODEBASE_DOCUMENTATION.md) | 🇮🇹 [Italiano](./it/CODEBASE_DOCUMENTATION.md) | 🇷🇺 [Русский](./ru/CODEBASE_DOCUMENTATION.md) | 🇨🇳[中文 (简体)](./zh-CN/CODEBASE_DOCUMENTATION.md) | 🇩🇪 [Deutsch](./de/CODEBASE_DOCUMENTATION.md) | 🇮🇳 [हिन्दी](./in/CODEBASE_DOCUMENTATION.md) | 🇹🇭 [ไทย](./th/CODEBASE_DOCUMENTATION.md) | 🇺🇦 [Українська](./uk-UA/CODEBASE_DOCUMENTATION.md) | 🇸🇦 [العربية](./ar/CODEBASE_DOCUMENTATION.md) | 🇯🇵[日本語](./ja/CODEBASE_DOCUMENTATION.md)| 🇻🇳 [Tiếng Việt](./vi/CODEBASE_DOCUMENTATION.md) | 🇧🇬 [Български](./bg/CODEBASE_DOCUMENTATION.md) | 🇩🇰 [Dánsko](./da/CODEBASE_DOCUMENTATION.md) | 🇫🇮 [Suomi](./fi/CODEBASE_DOCUMENTATION.md) | 🇮🇱 [עברית](./he/CODEBASE_DOCUMENTATION.md) | 🇭🇺 [maďarština](./hu/CODEBASE_DOCUMENTATION.md) | 🇮🇩 [Bahasa Indonésie](./id/CODEBASE_DOCUMENTATION.md) | 🇰🇷 [한국어](./ko/CODEBASE_DOCUMENTATION.md) | 🇲🇾 [Bahasa Melayu](./ms/CODEBASE_DOCUMENTATION.md) | 🇳🇱 [Nizozemsko](./nl/CODEBASE_DOCUMENTATION.md) | 🇳🇴 [Norsk](./no/CODEBASE_DOCUMENTATION.md) | 🇵🇹 [Português (Portugalsko)](./pt/CODEBASE_DOCUMENTATION.md) | 🇷🇴 [Română](./ro/CODEBASE_DOCUMENTATION.md) | 🇵🇱 [Polski](./pl/CODEBASE_DOCUMENTATION.md) | 🇸🇰 [Slovenčina](./sk/CODEBASE_DOCUMENTATION.md) | 🇸🇪 [Svenska](./sv/CODEBASE_DOCUMENTATION.md) | 🇵🇭 [Filipínec](./phi/CODEBASE_DOCUMENTATION.md) | 🇨🇿 [Čeština](./cs/CODEBASE_DOCUMENTATION.md) + +- **FEATURES.md** : 🇺🇸 [anglicky](../FEATURES.md) | 🇧🇷 [Português (Brazílie)](./pt-BR/FEATURES.md) | 🇪🇸 [Español](./es/FEATURES.md) | 🇫🇷 [Français](./fr/FEATURES.md) | 🇮🇹 [Italiano](./it/FEATURES.md) | 🇷🇺 [Русский](./ru/FEATURES.md) | 🇨🇳[中文 (简体)](./zh-CN/FEATURES.md) | 🇩🇪 [Deutsch](./de/FEATURES.md) | 🇮🇳 [हिन्दी](./in/FEATURES.md) | 🇹🇭 [ไทย](./th/FEATURES.md) | 🇺🇦 [Українська](./uk-UA/FEATURES.md) | 🇸🇦 [العربية](./ar/FEATURES.md) | 🇯🇵[日本語](./ja/FEATURES.md)| 🇻🇳 [Tiếng Việt](./vi/FEATURES.md) | 🇧🇬 [Български](./bg/FEATURES.md) | 🇩🇰 [Dánsko](./da/FEATURES.md) | 🇫🇮 [Suomi](./fi/FEATURES.md) | 🇮🇱 [עברית](./he/FEATURES.md) | 🇭🇺 [maďarština](./hu/FEATURES.md) | 🇮🇩 [Bahasa Indonésie](./id/FEATURES.md) | 🇰🇷 [한국어](./ko/FEATURES.md) | 🇲🇾 [Bahasa Melayu](./ms/FEATURES.md) | 🇳🇱 [Nizozemsko](./nl/FEATURES.md) | 🇳🇴 [Norsk](./no/FEATURES.md) | 🇵🇹 [Português (Portugalsko)](./pt/FEATURES.md) | 🇷🇴 [Română](./ro/FEATURES.md) | 🇵🇱 [Polski](./pl/FEATURES.md) | 🇸🇰 [Slovenčina](./sk/FEATURES.md) | 🇸🇪 [Svenska](./sv/FEATURES.md) | 🇵🇭 [Filipínec](./phi/FEATURES.md) | 🇨🇿 [Čeština](./cs/FEATURES.md) + +- **TOUBLESHOOTING.md** : 🇺🇸 [anglicky](../TROUBLESHOOTING.md) | 🇧🇷 [Português (Brazílie)](./pt-BR/TROUBLESHOOTING.md) | 🇪🇸 [Español](./es/TROUBLESHOOTING.md) | 🇫🇷 [Français](./fr/TROUBLESHOOTING.md) | 🇮🇹 [Italiano](./it/TROUBLESHOOTING.md) | 🇷🇺 [Русский](./ru/TROUBLESHOOTING.md) | 🇨🇳[中文 (简体)](./zh-CN/TROUBLESHOOTING.md) | 🇩🇪 [Deutsch](./de/TROUBLESHOOTING.md) | 🇮🇳 [हिन्दी](./in/TROUBLESHOOTING.md) | 🇹🇭 [ไทย](./th/TROUBLESHOOTING.md) | 🇺🇦 [Українська](./uk-UA/TROUBLESHOOTING.md) | 🇸🇦 [العربية](./ar/TROUBLESHOOTING.md) | 🇯🇵[日本語](./ja/TROUBLESHOOTING.md)| 🇻🇳 [Tiếng Việt](./vi/TROUBLESHOOTING.md) | 🇧🇬 [Български](./bg/TROUBLESHOOTING.md) | 🇩🇰 [Dánsko](./da/TROUBLESHOOTING.md) | 🇫🇮 [Suomi](./fi/TROUBLESHOOTING.md) | 🇮🇱 [עברית](./he/TROUBLESHOOTING.md) | 🇭🇺 [maďarština](./hu/TROUBLESHOOTING.md) | 🇮🇩 [Bahasa Indonésie](./id/TROUBLESHOOTING.md) | 🇰🇷 [한국어](./ko/TROUBLESHOOTING.md) | 🇲🇾 [Bahasa Melayu](./ms/TROUBLESHOOTING.md) | 🇳🇱 [Nizozemsko](./nl/TROUBLESHOOTING.md) | 🇳🇴 [Norsk](./no/TROUBLESHOOTING.md) | 🇵🇹 [Português (Portugalsko)](./pt/TROUBLESHOOTING.md) | 🇷🇴 [Română](./ro/TROUBLESHOOTING.md) | 🇵🇱 [Polski](./pl/TROUBLESHOOTING.md) | 🇸🇰 [Slovenčina](./sk/TROUBLESHOOTING.md) | 🇸🇪 [Svenska](./sv/TROUBLESHOOTING.md) | 🇵🇭 [Filipínec](./phi/TROUBLESHOOTING.md) | 🇨🇿 [Čeština](./cs/TROUBLESHOOTING.md) + +- **USER_GUIDE.md** : 🇺🇸 [anglicky](../USER_GUIDE.md) | 🇧🇷 [Português (Brazílie)](./pt-BR/USER_GUIDE.md) | 🇪🇸 [Español](./es/USER_GUIDE.md) | 🇫🇷 [Français](./fr/USER_GUIDE.md) | 🇮🇹 [Italiano](./it/USER_GUIDE.md) | 🇷🇺 [Русский](./ru/USER_GUIDE.md) | 🇨🇳[中文 (简体)](./zh-CN/USER_GUIDE.md) | 🇩🇪 [Deutsch](./de/USER_GUIDE.md) | 🇮🇳 [हिन्दी](./in/USER_GUIDE.md) | 🇹🇭 [ไทย](./th/USER_GUIDE.md) | 🇺🇦 [Українська](./uk-UA/USER_GUIDE.md) | 🇸🇦 [العربية](./ar/USER_GUIDE.md) | 🇯🇵[日本語](./ja/USER_GUIDE.md)| 🇻🇳 [Tiếng Việt](./vi/USER_GUIDE.md) | 🇧🇬 [Български](./bg/USER_GUIDE.md) | 🇩🇰 [Dánsko](./da/USER_GUIDE.md) | 🇫🇮 [Suomi](./fi/USER_GUIDE.md) | 🇮🇱 [עברית](./he/USER_GUIDE.md) | 🇭🇺 [maďarština](./hu/USER_GUIDE.md) | 🇮🇩 [Bahasa Indonésie](./id/USER_GUIDE.md) | 🇰🇷 [한국어](./ko/USER_GUIDE.md) | 🇲🇾 [Bahasa Melayu](./ms/USER_GUIDE.md) | 🇳🇱 [Nizozemsko](./nl/USER_GUIDE.md) | 🇳🇴 [Norsk](./no/USER_GUIDE.md) | 🇵🇹 [Português (Portugalsko)](./pt/USER_GUIDE.md) | 🇷🇴 [Română](./ro/USER_GUIDE.md) | 🇵🇱 [Polski](./pl/USER_GUIDE.md) | 🇸🇰 [Slovenčina](./sk/USER_GUIDE.md) | 🇸🇪 [Svenska](./sv/USER_GUIDE.md) | 🇵🇭 [Filipínec](./phi/USER_GUIDE.md) | 🇨🇿 [Čeština](./cs/USER_GUIDE.md) + +## Nedávná poznámka: Zásady limitů pro účty Codex + +Dokumentace nyní zahrnuje chování zásad kvót na úrovni účtu Codex: + +- Přepínání pro jednotlivé účty: `5h` a `Weekly` (ZAP/VYP). +- Zásady prahových hodnot: povolené okno dosahující >=90 % označuje účet jako nezpůsobilý k výběru. +- Automatická rotace: provoz se přesune na další způsobilý účet Codex. +- Automatické opětovné použití: účet se opět stane způsobilým po úspěšném `resetAt` poskytovatele. + +Vygenerováno 26. února 2026. diff --git a/docs/i18n/cs/open-sse/mcp-server/README.md b/docs/i18n/cs/open-sse/mcp-server/README.md new file mode 100644 index 00000000..cbf1561f --- /dev/null +++ b/docs/i18n/cs/open-sse/mcp-server/README.md @@ -0,0 +1,587 @@ +# Server OmniRoute MCP + +> **Server protokolu modelového kontextu** , který zpřístupňuje inteligenci brány OmniRoute jako **16 nástrojů** pro agenty umělé inteligence. + +Server MCP umožňuje libovolnému agentovi umělé inteligence (Claude Desktop, Cursor, VS Code Copilot, vlastním agentům) programově **monitorovat, řídit a optimalizovat** bránu umělé inteligence OmniRoute. + +--- + +## Architektura + +``` +┌──────────────────────────────────────────────────────────────────┐ +│ AI Agent / IDE │ +│ (Claude Desktop, Cursor, VS Code, Custom) │ +└──────────────────────┬───────────────────────────────────────────┘ + │ MCP Protocol (stdio or HTTP) + ▼ +┌──────────────────────────────────────────────────────────────────┐ +│ OmniRoute MCP Server │ +│ ┌──────────────┐ ┌─────────────────┐ ┌────────────────────┐ │ +│ │ Scope │ │ 16 MCP Tools │ │ Audit Logger │ │ +│ │ Enforcement │──│ (Phase 1 + 2) │──│ (SHA-256/SQLite) │ │ +│ └──────────────┘ └────────┬────────┘ └────────────────────┘ │ +└─────────────────────────────┼────────────────────────────────────┘ + │ HTTP (internal) + ▼ +┌──────────────────────────────────────────────────────────────────┐ +│ OmniRoute Gateway (port 20128) │ +│ /v1/chat/completions /api/combos /api/usage ... │ +└──────────────────────────────────────────────────────────────────┘ +``` + +--- + +## Rychlý start + +### 1. Proměnné prostředí + +```bash +# Required: OmniRoute base URL +export OMNIROUTE_BASE_URL="http://localhost:20128" + +# Optional: API key for authenticated access +export OMNIROUTE_API_KEY="your-api-key" + +# Optional: Scope enforcement (default: disabled) +export OMNIROUTE_MCP_ENFORCE_SCOPES="true" +export OMNIROUTE_MCP_SCOPES="read:health,read:combos,read:quota,read:usage,read:models,execute:completions,write:combos,write:budget,write:resilience" +``` + +### 2. Transport stdio (integrace IDE) + +Přidejte do konfigurace klienta MCP: + +**Claude Desktop** ( `claude_desktop_config.json` ): + +```json +{ + "mcpServers": { + "omniroute": { + "command": "node", + "args": ["path/to/9router/open-sse/mcp-server/server.ts"], + "env": { + "OMNIROUTE_BASE_URL": "http://localhost:20128", + "OMNIROUTE_API_KEY": "your-key" + } + } + } +} +``` + +**Cursor** ( `.cursor/mcp.json` ): + +```json +{ + "mcpServers": { + "omniroute": { + "command": "npx", + "args": ["tsx", "open-sse/mcp-server/server.ts"], + "env": { + "OMNIROUTE_BASE_URL": "http://localhost:20128" + } + } + } +} +``` + +**VS Code** ( `.vscode/settings.json` ): + +```json +{ + "mcp": { + "servers": { + "omniroute": { + "command": "npx", + "args": ["tsx", "open-sse/mcp-server/server.ts"], + "env": { + "OMNIROUTE_BASE_URL": "http://localhost:20128" + } + } + } + } +} +``` + +### 3. Spuštění přes CLI + +```bash +# Direct start (stdio) +npx tsx open-sse/mcp-server/server.ts + +# Or via OmniRoute CLI +omniroute --mcp +``` + +--- + +## Referenční informace o nástrojích + +### Fáze 1: Základní nástroje (8) + +# | Nástroj | Rozsahy | Popis +--- | --- | --- | --- +1 | `omniroute_get_health` | `read:health` | Stav brány, dostupnost, paměť, jističe, limity rychlosti, statistiky mezipaměti +2 | `omniroute_list_combos` | `read:combos` | Vypsat všechny kombinace (modelové řetězce) se strategiemi a volitelnými metrikami +3 | `omniroute_get_combo_metrics` | `read:combos` | Metriky výkonu pro konkrétní kombinaci +4 | `omniroute_switch_combo` | `write:combos` | Aktivace nebo deaktivace komba pro směrování +5 | `omniroute_check_quota` | `read:quota` | Zbývající kvóta API na poskytovatele se stavem tokenu +6 | `omniroute_route_request` | `execute:completions` | Odeslat dokončení chatu pomocí inteligentního směrování +7 | `omniroute_cost_report` | `read:usage` | Zpráva o nákladech podle období (relace/den/týden/měsíc) s rozpisem podle poskytovatele +8 | `omniroute_list_models_catalog` | `read:models` | Seznam všech dostupných modelů od různých poskytovatelů s funkcemi a cenami + +### Fáze 2: Pokročilé nástroje (8) + +# | Nástroj | Rozsahy | Popis +--- | --- | --- | --- +9 | `omniroute_simulate_route` | `read:health` , `read:combos` | Simulace trasy na dryru zobrazující záložní strom a odhadované náklady +10 | `omniroute_set_budget_guard` | `write:budget` | Nastavit rozpočet relace s akcí při překročení: `degrade` , `block` nebo `alert` +11 | `omniroute_set_resilience_profile` | `write:resilience` | Použijte profil odolnosti: `aggressive` , `balanced` nebo `conservative` +12 | `omniroute_test_combo` | `execute:completions` , `read:combos` | Otestujte každého poskytovatele v kombinaci se skutečným výzvou a nahlaste latenci/náklady +13 | `omniroute_get_provider_metrics` | `read:health` | Metriky pro jednotlivé poskytovatele s percentily latence (p50/p95/p99), jistič +14 | `omniroute_best_combo_for_task` | `read:combos` , `read:health` | Doporučení kombinací podle typu úkolu s využitím umělé inteligence s omezeními rozpočtu/latence +15 | `omniroute_explain_route` | `read:health` , `read:usage` | Vysvětlete, proč byl požadavek směrován k poskytovateli (faktory hodnocení, záložní metody) +16 | `omniroute_get_session_snapshot` | `read:usage` | Snímek celého relace: náklady, tokeny, top modely, chyby, stav rozpočtu + +--- + +## Příklady klientů + +### Python — Kompletní pracovní postup agenta + +```python +""" +OmniRoute MCP Client — Python example using the mcp SDK. +Install: pip install mcp +""" +import asyncio +from mcp import ClientSession, StdioServerParameters +from mcp.client.stdio import stdio_client + +async def main(): + server = StdioServerParameters( + command="npx", + args=["tsx", "open-sse/mcp-server/server.ts"], + env={ + "OMNIROUTE_BASE_URL": "http://localhost:20128", + "OMNIROUTE_API_KEY": "your-key", + }, + ) + + async with stdio_client(server) as (read, write): + async with ClientSession(read, write) as session: + await session.initialize() + + # 1. Check gateway health + health = await session.call_tool("omniroute_get_health", {}) + print("Health:", health.content[0].text) + + # 2. List available combos with metrics + combos = await session.call_tool("omniroute_list_combos", { + "includeMetrics": True + }) + print("Combos:", combos.content[0].text) + + # 3. Find the best combo for a coding task + best = await session.call_tool("omniroute_best_combo_for_task", { + "taskType": "coding", + "budgetConstraint": 0.50, + "latencyConstraint": 5000, + }) + print("Best combo:", best.content[0].text) + + # 4. Set a session budget guard + budget = await session.call_tool("omniroute_set_budget_guard", { + "maxCost": 1.00, + "action": "degrade", + "degradeToTier": "cheap", + }) + print("Budget guard:", budget.content[0].text) + + # 5. Route a request through intelligent pipeline + response = await session.call_tool("omniroute_route_request", { + "model": "claude-sonnet-4", + "messages": [ + {"role": "user", "content": "Write a Python hello world"} + ], + "role": "coding", + }) + print("Response:", response.content[0].text) + + # 6. Get the session snapshot + snapshot = await session.call_tool("omniroute_get_session_snapshot", {}) + print("Session:", snapshot.content[0].text) + +asyncio.run(main()) +``` + +### TypeScript — Programový agent + +```typescript +import { Client } from "@modelcontextprotocol/sdk/client/index.js"; +import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js"; + +async function main() { + const transport = new StdioClientTransport({ + command: "npx", + args: ["tsx", "open-sse/mcp-server/server.ts"], + env: { + OMNIROUTE_BASE_URL: "http://localhost:20128", + OMNIROUTE_API_KEY: "your-key", + }, + }); + + const client = new Client({ name: "my-agent", version: "1.0.0" }); + await client.connect(transport); + + // Check quota before deciding which model to use + const quota = await client.callTool({ + name: "omniroute_check_quota", + arguments: { provider: "claude" }, + }); + console.log("Claude quota:", quota.content); + + // Simulate the route before actually calling + const simulation = await client.callTool({ + name: "omniroute_simulate_route", + arguments: { + model: "claude-sonnet-4", + promptTokenEstimate: 2000, + }, + }); + console.log("Route simulation:", simulation.content); + + // Send the actual request + const result = await client.callTool({ + name: "omniroute_route_request", + arguments: { + model: "claude-sonnet-4", + messages: [{ role: "user", content: "Explain async/await" }], + }, + }); + console.log("Result:", result.content); + + // Cost report + const costs = await client.callTool({ + name: "omniroute_cost_report", + arguments: { period: "session" }, + }); + console.log("Costs:", costs.content); + + await client.close(); +} + +main(); +``` + +### Go — HTTP klient + +```go +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" +) + +// Simplified direct-API approach (bypass MCP, hit OmniRoute APIs directly) +// Useful if you don't need MCP protocol framing. + +func callTool(baseURL, tool string, args map[string]any) (string, error) { + // MCP tools map to OmniRoute APIs: + endpoints := map[string]string{ + "health": "/api/monitoring/health", + "combos": "/api/combos", + "quota": "/api/usage/quota", + "models": "/v1/models", + } + + url := baseURL + endpoints[tool] + resp, err := http.Get(url) + if err != nil { + return "", err + } + defer resp.Body.Close() + body, _ := io.ReadAll(resp.Body) + return string(body), nil +} + +func routeRequest(baseURL, model, prompt string) (string, error) { + payload := map[string]any{ + "model": model, + "messages": []map[string]string{ + {"role": "user", "content": prompt}, + }, + "stream": false, + } + data, _ := json.Marshal(payload) + + resp, err := http.Post( + baseURL+"/v1/chat/completions", + "application/json", + bytes.NewReader(data), + ) + if err != nil { + return "", err + } + defer resp.Body.Close() + body, _ := io.ReadAll(resp.Body) + return string(body), nil +} + +func main() { + base := "http://localhost:20128" + + health, _ := callTool(base, "health", nil) + fmt.Println("Health:", health) + + result, _ := routeRequest(base, "auto", "Hello from Go!") + fmt.Println("Result:", result) +} +``` + +--- + +## Případy použití + +### 🔄 Případ použití 1: Agent pro automatické ozdravování + +Agent, který monitoruje stav OmniRoute a automaticky přepíná kombinace, když se stav poskytovatelů zhorší. + +```python +async def auto_healing_loop(session): + """Monitor health and react to provider issues.""" + while True: + # Check health + health = await session.call_tool("omniroute_get_health", {}) + data = json.loads(health.content[0].text) + + # Find providers with open circuit breakers + broken = [ + cb for cb in data["circuitBreakers"] + if cb["state"] == "OPEN" + ] + + if broken: + # Switch to a different resilience profile + await session.call_tool("omniroute_set_resilience_profile", { + "profile": "conservative" + }) + + # Find best alternative combo + best = await session.call_tool("omniroute_best_combo_for_task", { + "taskType": "coding" + }) + best_data = json.loads(best.content[0].text) + combo_id = best_data["recommendedCombo"]["id"] + + # Activate it + await session.call_tool("omniroute_switch_combo", { + "comboId": combo_id, "active": True + }) + print(f"⚠️ Auto-healed: switched to {combo_id}") + + await asyncio.sleep(30) # Check every 30 seconds +``` + +### 💰 Případ užití 2: Programovací agent s ohledem na rozpočet + +Agent, který sleduje náklady v reálném čase a při blížícím se vyčerpání rozpočtu přechází na levnější modely. + +```python +async def budget_aware_coding(session, task: str, max_budget: float): + """Complete a coding task within a budget.""" + # Set budget guard + await session.call_tool("omniroute_set_budget_guard", { + "maxCost": max_budget, + "action": "degrade", + "degradeToTier": "cheap", + }) + + # Simulate first to estimate cost + sim = await session.call_tool("omniroute_simulate_route", { + "model": "claude-sonnet-4", + "promptTokenEstimate": len(task.split()) * 2, + }) + sim_data = json.loads(sim.content[0].text) + estimated_cost = sim_data["fallbackTree"]["bestCaseCost"] + print(f"Estimated cost: ${estimated_cost:.4f}") + + # Send request + result = await session.call_tool("omniroute_route_request", { + "model": "claude-sonnet-4", + "messages": [{"role": "user", "content": task}], + "role": "coding", + }) + + # Check remaining budget + snapshot = await session.call_tool("omniroute_get_session_snapshot", {}) + snap_data = json.loads(snapshot.content[0].text) + print(f"Session cost: ${snap_data['costTotal']:.4f}") + if snap_data.get("budgetGuard"): + print(f"Budget remaining: ${snap_data['budgetGuard']['remaining']:.4f}") + + return json.loads(result.content[0].text)["response"]["content"] +``` + +### 🧪 Případ použití 3: Kombinovaný benchmarkingový agent + +Agent, který pravidelně porovnává všechna komba a hlásí nejrychlejší/nejlevnější. + +```python +async def benchmark_combos(session): + """Benchmark all enabled combos and rank them.""" + combos = await session.call_tool("omniroute_list_combos", { + "includeMetrics": True, + }) + combo_list = json.loads(combos.content[0].text)["combos"] + + results = [] + for combo in combo_list: + if not combo["enabled"]: + continue + + test = await session.call_tool("omniroute_test_combo", { + "comboId": combo["id"], + "testPrompt": "Return the number 42.", + }) + test_data = json.loads(test.content[0].text) + results.append({ + "combo": combo["name"], + "fastest": test_data["summary"]["fastestProvider"], + "cheapest": test_data["summary"]["cheapestProvider"], + "success_rate": f'{test_data["summary"]["successful"]}/{test_data["summary"]["totalProviders"]}', + }) + + print("📊 Combo Benchmark Results:") + for r in results: + print(f" {r['combo']}: fastest={r['fastest']}, cheapest={r['cheapest']}, success={r['success_rate']}") +``` + +### 🔍 Případ použití 4: Agent pro ladění po smrti + +Agent, který vysvětluje, proč byl požadavek směrován ke konkrétnímu poskytovateli. + +```typescript +async function debugRouting(client: Client, requestId: string) { + // Explain the routing decision + const explanation = await client.callTool({ + name: "omniroute_explain_route", + arguments: { requestId }, + }); + const data = JSON.parse(explanation.content[0].text); + + console.log(`Request ${requestId}:`); + console.log(` Provider: ${data.decision.providerSelected}`); + console.log(` Model: ${data.decision.modelUsed}`); + console.log(` Score: ${data.decision.score}`); + console.log(` Factors:`); + for (const factor of data.decision.factors) { + console.log(` ${factor.name}: ${factor.value} (weight: ${factor.weight})`); + } + if (data.decision.fallbacksTriggered.length > 0) { + console.log(` Fallbacks triggered:`); + for (const fb of data.decision.fallbacksTriggered) { + console.log(` ${fb.provider}: ${fb.reason}`); + } + } +} +``` + +### 📋 Případ použití 5: Agent pro vyhledávání modelů + +Agent, který vyhledává nejlevnější modely pro danou funkci. + +```python +async def find_cheapest_models(session, capability="chat"): + """Find the cheapest available models for a capability.""" + catalog = await session.call_tool("omniroute_list_models_catalog", { + "capability": capability, + }) + models = json.loads(catalog.content[0].text)["models"] + + # Filter available models with pricing + priced = [ + m for m in models + if m["status"] == "available" and m.get("pricing") + ] + priced.sort(key=lambda m: m["pricing"]["inputPerMillion"] or float("inf")) + + print(f"💡 Cheapest {capability} models:") + for m in priced[:5]: + input_cost = m["pricing"]["inputPerMillion"] or 0 + output_cost = m["pricing"]["outputPerMillion"] or 0 + print(f" {m['id']} ({m['provider']}): ${input_cost}/M in, ${output_cost}/M out") +``` + +--- + +## Zabezpečení a vynucování rozsahu + +Server MCP podporuje **detailní vynucování rozsahu** pro prostředí s více klienty: + +Rozsah | Nástroje +--- | --- +`read:health` | `get_health` , `simulate_route` , `get_provider_metrics` , `best_combo_for_task` , `explain_route` +`read:combos` | `list_combos` , `get_combo_metrics` , `simulate_route` , `best_combo_for_task` , `test_combo` +`read:quota` | `check_quota` +`read:usage` | `cost_report` , `explain_route` , `get_session_snapshot` +`read:models` | `list_models_catalog` +`write:combos` | `switch_combo` +`write:budget` | `set_budget_guard` +`write:resilience` | `set_resilience_profile` +`execute:completions` | `route_request` , `test_combo` + +**Rozsahy zástupných znaků:** Použijte `read:*` pro udělení všech rozsahů pro čtení nebo `*` pro plný přístup. + +--- + +## Protokolování auditu + +Každé volání nástroje je zaznamenáno do tabulky SQLite `mcp_tool_audit` : + +- **Vstup:** SHA-256 hash (nikdy neukládá nezpracované výzvy) +- **Výstup:** Zkráceno na 200 znaků +- **Metadata:** Název nástroje, doba trvání, úspěch/chyba, ID klíče API + +Přístup k auditním datům prostřednictvím: + +```typescript +import { getRecentAuditEntries, getAuditStats } from "./audit"; + +const entries = await getRecentAuditEntries(50); +const stats = await getAuditStats(); +// stats: { totalCalls, successRate, avgDurationMs, topTools } +``` + +--- + +## Struktura souboru + +``` +mcp-server/ +├── server.ts # MCP server setup, essential tool handlers, entry point +├── index.ts # Barrel export +├── audit.ts # SQLite audit logger (SHA-256 input hashing) +├── scopeEnforcement.ts # Fine-grained scope enforcement +├── schemas/ +│ ├── tools.ts # Zod schemas for all 16 tools (input/output/scopes) +│ ├── a2a.ts # A2A protocol types (Agent Card, Task, JSON-RPC) +│ ├── audit.ts # Audit & routing decision types + hash helpers +│ └── index.ts # Schema barrel export +├── tools/ +│ └── advancedTools.ts # Phase 2 tool handlers (8 advanced tools) +└── __tests__/ + ├── essentialTools.test.ts + ├── advancedTools.test.ts + └── a2aLifecycle.test.ts +``` + +--- + +## Licence + +Součást [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — licence MIT. diff --git a/llm.txt b/llm.txt index ea5c8e0e..cdc030fc 100644 --- a/llm.txt +++ b/llm.txt @@ -59,7 +59,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ └── login/ # Login page │ ├── domain/ # Domain types and business logic interfaces │ ├── i18n/ # Internationalization -│ │ └── messages/ # 30 language JSON files (ar, bg, da, de, en, es, fi, fr, he, hu, id, in, it, ja, ko, ms, nl, no, phi, pl, pt, pt-BR, ro, ru, sk, sv, th, uk-UA, vi, zh-CN) +│ │ └── messages/ # 30 language JSON files (ar, bg, cs, da, de, en, es, fi, fr, he, hu, id, in, it, ja, ko, ms, nl, no, phi, pl, pt, pt-BR, ro, ru, sk, sv, th, uk-UA, vi, zh-CN) │ ├── lib/ # Core libraries │ │ ├── acp/ # ACP agent registry and manager (14 built-in agents + custom) │ │ ├── db/ # SQLite database layer (providers, combos, prompts, logs) @@ -91,7 +91,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ ├── unit/ # Unit tests (32+ test files) │ └── integration/ # Integration tests ├── docs/ # Documentation (with 29-language i18n subdirectories) -│ ├── i18n/ # Translated docs (ar, bg, da, de, es, fi, fr, he, hu, id, in, it, ja, ko, ms, nl, no, phi, pl, pt, pt-BR, ro, ru, sk, sv, th, uk-UA, vi, zh-CN) +│ ├── i18n/ # Translated docs (ar, bg, cs, da, de, es, fi, fr, he, hu, id, in, it, ja, ko, ms, nl, no, phi, pl, pt, pt-BR, ro, ru, sk, sv, th, uk-UA, vi, zh-CN) │ ├── screenshots/ # Dashboard screenshots │ ├── a2a-server.md # A2A agent protocol documentation │ ├── auto-combo.md # Auto-combo engine (6-factor scoring) diff --git a/scripts/i18n/generate-multilang.mjs b/scripts/i18n/generate-multilang.mjs index 2ee0bdff..d3f9c25e 100644 --- a/scripts/i18n/generate-multilang.mjs +++ b/scripts/i18n/generate-multilang.mjs @@ -288,6 +288,15 @@ const LOCALE_SPECS = [ readmeName: "Filipino", docsName: "Filipino", }, + { + code: "cs", + googleTl: "cs", + label: "CS", + flag: "🇨🇿", + languageName: "Čeština", + readmeName: "Čeština", + docsName: "Čeština", + }, ]; const EXISTING_README_CODES = new Set(["pt-BR", "es", "fr", "it", "ru", "zh-CN", "de"]); diff --git a/src/i18n/config.ts b/src/i18n/config.ts index 13e11703..05ba25c3 100644 --- a/src/i18n/config.ts +++ b/src/i18n/config.ts @@ -1,34 +1,35 @@ export const LOCALES = [ - "en", - "pt-BR", - "es", - "fr", - "it", - "ru", - "zh-CN", - "de", - "in", - "th", - "uk-UA", "ar", - "ja", - "vi", "bg", + "cs", "da", + "de", + "en", + "es", "fi", + "fr", "he", "hu", "id", + "in", + "it", + "ja", "ko", "ms", "nl", "no", - "pt", - "ro", + "phi", "pl", + "pt", + "pt-BR", + "ro", + "ru", "sk", "sv", - "phi", + "th", + "uk-UA", + "vi", + "zh-CN", ] as const; export type Locale = (typeof LOCALES)[number]; export const DEFAULT_LOCALE: Locale = "en"; @@ -39,36 +40,37 @@ export const LANGUAGES: readonly { name: string; flag: string; }[] = [ - { code: "en", label: "EN", name: "English", flag: "🇺🇸" }, - { code: "pt-BR", label: "PT-BR", name: "Português (Brasil)", flag: "🇧🇷" }, - { code: "es", label: "ES", name: "Español", flag: "🇪🇸" }, - { code: "fr", label: "FR", name: "Français", flag: "🇫🇷" }, - { code: "it", label: "IT", name: "Italiano", flag: "🇮🇹" }, - { code: "ru", label: "RU", name: "Русский", flag: "🇷🇺" }, - { code: "zh-CN", label: "ZH-CN", name: "中文 (简体)", flag: "🇨🇳" }, - { code: "de", label: "DE", name: "Deutsch", flag: "🇩🇪" }, - { code: "in", label: "IN", name: "हिन्दी", flag: "🇮🇳" }, - { code: "th", label: "TH", name: "ไทย", flag: "🇹🇭" }, - { code: "uk-UA", label: "UK-UA", name: "Українська", flag: "🇺🇦" }, { code: "ar", label: "AR", name: "العربية", flag: "🇸🇦" }, - { code: "ja", label: "JA", name: "日本語", flag: "🇯🇵" }, - { code: "vi", label: "VI", name: "Tiếng Việt", flag: "🇻🇳" }, { code: "bg", label: "BG", name: "Български", flag: "🇧🇬" }, + { code: "cs", label: "CS", name: "Čeština", flag: "🇨🇿" }, { code: "da", label: "DA", name: "Dansk", flag: "🇩🇰" }, + { code: "de", label: "DE", name: "Deutsch", flag: "🇩🇪" }, + { code: "en", label: "EN", name: "English", flag: "🇺🇸" }, + { code: "es", label: "ES", name: "Español", flag: "🇪🇸" }, { code: "fi", label: "FI", name: "Suomi", flag: "🇫🇮" }, + { code: "fr", label: "FR", name: "Français", flag: "🇫🇷" }, { code: "he", label: "HE", name: "עברית", flag: "🇮🇱" }, { code: "hu", label: "HU", name: "Magyar", flag: "🇭🇺" }, { code: "id", label: "ID", name: "Bahasa Indonesia", flag: "🇮🇩" }, + { code: "in", label: "IN", name: "हिन्दी", flag: "🇮🇳" }, + { code: "it", label: "IT", name: "Italiano", flag: "🇮🇹" }, + { code: "ja", label: "JA", name: "日本語", flag: "🇯🇵" }, { code: "ko", label: "KO", name: "한국어", flag: "🇰🇷" }, { code: "ms", label: "MS", name: "Bahasa Melayu", flag: "🇲🇾" }, { code: "nl", label: "NL", name: "Nederlands", flag: "🇳🇱" }, { code: "no", label: "NO", name: "Norsk", flag: "🇳🇴" }, + { code: "phi", label: "PHI", name: "Filipino", flag: "🇵🇭" }, + { code: "pl", label: "PL", name: "Polski", flag: "🇵🇱" }, + { code: "pt-BR", label: "PT-BR", name: "Português (Brasil)", flag: "🇧🇷" }, { code: "pt", label: "PT", name: "Português (Portugal)", flag: "🇵🇹" }, { code: "ro", label: "RO", name: "Română", flag: "🇷🇴" }, - { code: "pl", label: "PL", name: "Polski", flag: "🇵🇱" }, + { code: "ru", label: "RU", name: "Русский", flag: "🇷🇺" }, { code: "sk", label: "SK", name: "Slovenčina", flag: "🇸🇰" }, { code: "sv", label: "SV", name: "Svenska", flag: "🇸🇪" }, - { code: "phi", label: "PHI", name: "Filipino", flag: "🇵🇭" }, + { code: "th", label: "TH", name: "ไทย", flag: "🇹🇭" }, + { code: "uk-UA", label: "UK-UA", name: "Українська", flag: "🇺🇦" }, + { code: "vi", label: "VI", name: "Tiếng Việt", flag: "🇻🇳" }, + { code: "zh-CN", label: "ZH-CN", name: "中文 (简体)", flag: "🇨🇳" }, ] as const; export const RTL_LOCALES = ["ar", "he"] as const; diff --git a/src/i18n/messages/cs.json b/src/i18n/messages/cs.json new file mode 100644 index 00000000..f10b1e62 --- /dev/null +++ b/src/i18n/messages/cs.json @@ -0,0 +1,2606 @@ +{ + "common": { + "save": "Uložit", + "cancel": "Zrušit", + "delete": "Smazat", + "loading": "Načítání...", + "error": "Došlo k chybě", + "success": "Úspěch", + "confirm": "Jsi si jistý/á?", + "refresh": "Obnovit", + "close": "Zavřít", + "add": "Přidat", + "edit": "Upravit", + "search": "Hledat", + "back": "Zpět", + "next": "Další", + "submit": "Předložit", + "reset": "Obnovit", + "copy": "Kopírovat", + "copied": "Zkopírováno!", + "enabled": "Povoleno", + "disabled": "Zakázáno", + "active": "Aktivní", + "inactive": "Neaktivní", + "noData": "Žádné údaje k dispozici", + "configure": "Konfigurovat", + "manage": "Spravovat", + "name": "Jméno", + "actions": "Akce", + "status": "Status", + "type": "Typ", + "model": "Model", + "models": "modely", + "provider": "Poskytovatel", + "account": "Účet", + "time": "Čas", + "details": "Podrobnosti", + "created": "Vytvořeno", + "lastUsed": "Naposledy použité", + "loadMore": "Načíst více", + "noResults": "Nenalezeny žádné výsledky", + "reloadPage": "Znovu načíst stránku", + "connected": "Připojeno", + "disconnected": "Odpojeno", + "notConfigured": "Nenakonfigurováno", + "testConnection": "Test připojení", + "enable": "Umožnit", + "disable": "Zakázat", + "columns": "Sloupce", + "newest": "Nejnovější", + "oldest": "Nejstarší", + "all": "Vše", + "none": "Žádný", + "yes": "Ano", + "no": "Ne", + "warning": "Varování", + "note": "Poznámka", + "free": "Uvolnit", + "skipToContent": "Přejít na obsah" + }, + "sidebar": { + "home": "Domov", + "dashboard": "Nástěnka", + "providers": "Poskytovatelé", + "combos": "Komba", + "autoCombo": "Auto Kombo", + "usage": "Použití", + "analytics": "Analytika", + "costs": "Náklady", + "health": "Zdraví", + "limits": "Limity a kvóty", + "cliTools": "CLI Nástroje", + "media": "Média", + "settings": "Nastavení", + "translator": "Překladatel", + "playground": "Hřiště", + "searchTools": "Vyhledávací nástroje", + "agents": "Agenti", + "docs": "Dokumenty", + "issues": "Problémy", + "endpoints": "Koncové body", + "apiManager": "Správce API", + "logs": "Protokoly", + "auditLog": "Audit Protokolů", + "shutdown": "Vypnout", + "restart": "Restartovat", + "shutdownConfirm": "Vypnout OmniRoute?", + "restartConfirm": "Restartovat OmniRoute?", + "version": "v{verze}", + "debug": "Debug", + "system": "Systém", + "help": "Pomoc", + "serverDisconnected": "Server odpojen", + "serverDisconnectedMsg": "Proxy server byl zastaven nebo se restartuje.", + "expandSidebar": "Rozbalit postranní panel", + "collapseSidebar": "Sbalit postranní panel", + "themes": "Témata", + "presetColors": "Oblíbené barvy", + "createTheme": "Vytvořit téma", + "chooseColor": "Vyberte jednu barvu", + "themeCoral": "Korálová", + "themeBlue": "Modrá", + "themeRed": "Červená", + "themeGreen": "Zelená", + "themeViolet": "Fialová", + "themeOrange": "Oranžová", + "themeCyan": "Azurová", + "cliToolsShort": "Nástroje" + }, + "themesPage": { + "title": "Témata", + "description": "Vyberte si přednastavené téma nebo si vytvořte vlastní s jednou barvou", + "presetColors": "Oblíbené barvy", + "customTheme": "Vlastní téma", + "customThemeDesc": "Klikněte na Vytvořit téma a vyberte jednu barvu", + "createTheme": "Vytvořit téma", + "activePreset": "Aktivní téma" + }, + "header": { + "logout": "Odhlásit se", + "language": "Jazyk", + "providers": "Poskytovatelé", + "providerDescription": "Správa připojení AI poskytovatelů", + "combos": "Komba", + "comboDescription": "Komba modelů se záložním řešením", + "usage": "Využití a analýzy", + "usageDescription": "Sledujte využití API, spotřebu tokenů a protokoly požadavků", + "analytics": "Analytika", + "analyticsDescription": "Grafy, trendy a přehledy hodnocení", + "cliTools": "CLI Nástroje", + "cliToolsDescription": "Konfigurace CLI nástrojů", + "home": "Domov", + "homeDescription": "Vítejte v OmniRoute", + "endpoint": "Koncové body", + "endpointDescription": "Správa proxy koncových bodů, MCP, A2A a API koncových bodů", + "mcp": "MCP", + "mcpDescription": "Správa MCP serverů a nástroje", + "a2a": "A2A", + "a2aDescription": "Agent-to-Agent úlohy protokolu a přehled", + "settings": "Nastavení", + "settingsDescription": "Spravujte své preference", + "openaiCompatible": "Kompatibilní s OpenAI", + "anthropicCompatible": "Anthropic kompatibilní", + "media": "Média", + "mediaDescription": "Generování obrázků, videí a hudby", + "themes": "Témata", + "themesDescription": "Vyberte barevné téma pro celý panel nástěnky" + }, + "home": { + "quickStart": "Rychlý start", + "quickStartDesc": "Začněte s provozem ve 4 krocích. Připojte poskytovatele, napojte modely a vše sledujte vše.", + "fullDocs": "Kompletní dokumenty", + "step1Title": "1. Vytvořte klíč API", + "step1Desc": "Přejděte do sekce Endpoint -> Registrované klíče. Vygenerujte jeden klíč pro každé prostředí.", + "step2Title": "2. Propojte poskytovatele", + "step2Desc": "Přidejte účty v sekci Poskytovatelé. Podporuje OAuth, API Key a bezplatné úrovně.", + "step3Title": "3. Nasměrujte svého klienta", + "step3Desc": "Nastavte základní URL na {url} ve vašem IDE nebo API klientovi.", + "step4Title": "4. Monitorujte a optimalizujte", + "step4Desc": "Sledujte tokeny, náklady a chyby v Protokolech požadavků a Analytice.", + "providersOverview": "Přehled poskytovatelů", + "configuredOf": "{configured} nakonfigurováno z {total} dostupných poskytovatelů", + "noModelsAvailable": "Pro tohoto poskytovatele nejsou k dispozici žádné modely.", + "configureFirst": "Nejprve nakonfigurujte připojení v {providers}", + "configureProvider": "Konfigurace poskytovatele", + "modelAvailable": "Dostupný model: {count}", + "modelsAvailable": "Dostupné modely: {count}", + "connectionsActive": "{count} aktivní připojení", + "connectionsActivePlural": "{count} aktivních připojení", + "copyModelName": "Kopírovat název modelu", + "documentation": "Dokumentace", + "healthMonitor": "Monitor stavu", + "reportIssue": "Nahlásit problém", + "activeError": "{active} aktivní · {errors} chyba", + "oauthLabel": "OAuth", + "apiKeyLabel": "API Klíč", + "requestsShort": "{count} požadavků", + "providerModelsTitle": "{provider} - Modely", + "copiedModel": "Zkopírováno: {model}", + "aliasLabel": "alias" + }, + "analytics": { + "title": "Analytika", + "overviewDescription": "Sledujte vzorce používání API, spotřebu tokenů, náklady a trendy aktivity napříč všemi poskytovateli a modely.", + "evalsDescription": "Spusťte sady vyhodnocovacích programů pro testování a ověření koncových bodů LLM. Porovnejte kvalitu modelu, detekujte regrese a srovnávajte latenci.", + "overview": "Přehled", + "evals": "Evals" + }, + "apiManager": { + "title": "API Klíče", + "createKey": "Vytvořit API klíč", + "key": "Klíč", + "revokeKey": "Zrušit klíč", + "revokeConfirm": "Opravdu chcete zrušit tento klíč API?", + "noKeys": "Zatím žádné API klíče", + "noKeysDesc": "Vytvořte si první API klíč pro ověřování požadavků na váš koncový bod.", + "keyLabel": "Značka klíče", + "permissions": "Oprávnění", + "expiresAt": "Platnost vyprší", + "never": "Nikdy", + "revoke": "Zneplatnit", + "showKey": "Zobrazit klíč", + "hideKey": "Skrýt klíč", + "copyKey": "Kopírovat API klíč", + "allModels": "Všechny modely", + "selectedModels": "Vybrané modely", + "readOnly": "Pouze pro čtení", + "fullAccess": "Plný přístup", + "keyManagement": "Správa API klíčů", + "keyManagementDesc": "Vytvářejte a spravujte API klíče pro ověřování požadavků na váš koncový bod", + "totalKeys": "Celkem klíčů", + "restricted": "Omezený", + "totalRequests": "Celkový počet žádostí", + "modelsAvailable": "Dostupné modely", + "registeredKeys": "Registrované klíče", + "keysRegistered": "{count} registrovaných klíčů", + "keyRegistered": " {count} Klíč zaregistrován", + "keysSecurityNote": "Každý klíč izoluje sledování využití a lze jej nezávisle zrušit. Klíče jsou po vytvoření maskovány z bezpečnostních důvodů.", + "createFirstKey": "Vytvořte svůj první klíč", + "name": "Jméno", + "usage": "Použití", + "created": "Vytvořeno", + "actions": "Akce", + "reqs": "požadavky", + "neverUsed": "Nikdy nepoužité", + "deleteConfirm": "Smazat tento PI klíč?", + "usageTips": "Tipy pro použití", + "tipAuth": "Použijte API klíče v hlavičce autorizace jako Bearer YOUR_KEY", + "tipSecure": "Klíče se zobrazují pouze jednou během vytváření – bezpečně je uložte", + "tipSeparate": "Vytvořte samostatné klíče pro různé klienty nebo prostředí", + "tipRestrict": "Omezte klíče na konkrétní modely pro lepší zabezpečení a kontrolu nákladů", + "keyName": "Název klíče", + "keyNamePlaceholder": "např. Produkční Klíč, Vývojový Klíč", + "keyNameDesc": "Zvolte popisný název, který identifikuje účel této klávesy.", + "keyCreated": "Klíč API vytvořen", + "keyCreatedSuccess": "Klíč byl úspěšně vytvořen!", + "keyCreatedNote": "Zkopírujte a uložte si tento klíč – už se vám nezobrazí.", + "done": "Hotovo", + "savePermissions": "Uložit oprávnění", + "autoResolve": "Automatické řešení", + "autoResolveDesc": "Automaticky přeložit nejednoznačné názvy modelů na nativního poskytovatele pro tento klíč API.", + "keyActive": "Aktivní klíč", + "keyActiveDesc": "Povolí nebo zakáže tento klíč API. Zakázané klíče jsou okamžitě odmítnuty s chybou 403.", + "accessSchedule": "Harmonogram přístupu", + "accessScheduleDesc": "Omezte přístup na určité hodiny a dny v týdnu.", + "scheduleFrom": "Z", + "scheduleUntil": "Až", + "scheduleDays": "Dny", + "scheduleTimezone": "Časové pásmo", + "scheduleTimezoneHint": "Používejte názvy časových pásem IANA, např. America/New_York, Europe/Berlin", + "scheduleActive": "Naplánovat", + "disabled": "Zakázáno", + "daySun": "Ne", + "dayMon": "Po", + "dayTue": "Út", + "dayWed": "St", + "dayThu": "Čt", + "dayFri": "Pá", + "daySat": "So", + "allowAll": "Povolit vše", + "restrict": "Omezit", + "allowAllInfo": "Tento klíč umožňuje přístup ke všem dostupným modelům.", + "restrictInfo": "Tento klíč umožňuje přístup k {selected} z {total} modelů.", + "selected": "Vybráno {count}", + "all": "Vše", + "clear": "Vyčistit", + "searchModels": "Hledat modely podle názvu nebo poskytovatele...", + "noModelsFound": "Nenalezeny žádné modely", + "keyNameRequired": "Název klíče je povinný", + "keyNameTooLong": "Název klíče musí mít {max} znaků nebo méně", + "keyNameInvalid": "Název klíče může obsahovat pouze písmena, číslice, mezery, pomlčky a podtržítka.", + "invalidKeyName": "Neplatný název klíče", + "failedCreateKey": "Vytvoření klíče se nezdařilo", + "failedCreateKeyRetry": "Vytvoření klíče se nezdařilo. Zkuste to prosím znovu.", + "invalidKeyId": "Neplatné ID klíče", + "failedDeleteKey": "Nepodařilo se smazat klíč", + "failedDeleteKeyRetry": "Klíč se nepodařilo smazat. Zkuste to prosím znovu.", + "invalidModelsSelection": "Neplatný výběr modelů", + "cannotSelectMoreThanModels": "Nelze vybrat více než {max} modelů", + "failedUpdatePermissions": "Nepodařilo se aktualizovat oprávnění", + "failedUpdatePermissionsRetry": "Aktualizace oprávnění se nezdařilo. Zkuste to prosím znovu.", + "unknownProvider": "neznámý", + "copyMaskedKey": "Kopírovat maskovaný klíč", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "lastUsedOn": "Poslední: {date}", + "editPermissions": "Upravit oprávnění", + "deleteKey": "Smazat klíč", + "model": "{count} model", + "models": "{count} modelů", + "permissionsTitle": "Oprávnění: {name}", + "allowAllDesc": "Tento klíč umožňuje přístup ke všem dostupným modelům.", + "restrictDesc": "Tento klíč má přístup k {selectedCount} z {totalModels} modelů.", + "selectedCount": "{count} vybráno" + }, + "auditLog": { + "title": "Audit Protokolů", + "searchPlaceholder": "Akce vyhledávání...", + "action": "Akce", + "actor": "Herec", + "target": "Cíl", + "ipAddress": "IP adresa", + "timestamp": "Čas", + "noEntries": "Nenalezeny žádné záznamy", + "filterByAction": "Filtrovat podle akce...", + "filterByActor": "Filtrovat podle herce...", + "filterEntriesAria": "Filtrování položek protokolu auditu", + "filterByActionTypeAria": "Filtrovat podle typu akce", + "filterByActorAria": "Filtrovat podle herce", + "refreshAuditLogAria": "Obnovit protokol auditu", + "tableAria": "Záznamy protokolu auditu", + "failedFetchAuditLog": "Nepodařilo se načíst protokol auditu", + "notAvailable": "—", + "description": "Administrativní akce a bezpečnostní události", + "showing": "Zobrazeno {count} záznamů (offset {offset})", + "previous": "Předchozí" + }, + "media": { + "title": "Mediální hřiště", + "subtitle": "Generování obrázků, videí a hudby", + "model": "Model", + "prompt": "Prompt", + "generate": "Generovat", + "generating": "Generuji...", + "loadingModels": "Načítání dostupných modelů...", + "noModels": "Žádné modely nejsou k dispozici. Nejprve nakonfigurujte poskytovatele s mediálními funkcemi.", + "error": "Generování selhalo", + "result": "Výsledky", + "imageDescription": "Generujte obrázky z textových pokynů pomocí OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI a dalších.", + "videoDescription": "Vytvářejte videa pomocí AnimateDiff, Stable Video Diffusion přes ComfyUI nebo SD WebUI.", + "musicDescription": "Skládejte hudbu pomocí Stable Audio Open nebo MusicGen přes ComfyUI." + }, + "search": { + "searchQuery": "Vyhledávací dotaz", + "searchResults": "Výsledky vyhledávání", + "cachedResult": "Uloženo v mezipaměti", + "searchCost": "Náklady", + "searchTools": "Vyhledávací nástroje", + "searchToolsDesc": "Pokročilé testování vyhledávání s porovnáním poskytovatelů", + "compareProviders": "Porovnat Poskytovatele", + "rerankResults": "Přeřadit", + "searchHistory": "Historie vyhledávání", + "urlOverlap": "Překrývání URL adres", + "noSearchProviders": "Nejsou nakonfigurováni žádní poskytovatelé vyhledávání. Přidejte poskytovatele v Nastavení.", + "noRerankModels": "Není k dispozici žádný model pro přeřazování", + "webSearch": "Vyhledávání na webu", + "provider": "Poskytovatel", + "searchType": "Typ vyhledávání", + "maxResults": "Max Výsledků", + "filters": "Filtry", + "country": "Země", + "language": "Jazyk", + "timeRange": "Časový rozsah", + "includeDomains": "Zahrnout domény", + "excludeDomains": "Vyloučit domény", + "safeSearch": "Bezpečné vyhledávání", + "formatted": "Formátováno", + "rawJson": "JSON", + "cacheMiss": "minutí mezipaměti", + "cacheHit": "zásah mezipaměti", + "latency": "Latence", + "cost": "Náklady", + "results": "Výsledky", + "rerank": "Přeřadit", + "rerankModel": "Přeřazovací Model (Rerank)", + "positionDelta": "Změna pozice", + "emptyState": "Odešlete vyhledávací dotaz pro zobrazení výsledků" + }, + "cliTools": { + "title": "CLI Nástroje", + "noActiveProviders": "Žádní aktivní poskytovatelé", + "noActiveProvidersDesc": "Pro konfiguraci nástrojů CLI prosím nejprve přidejte a připojte poskytovatele.", + "mapModels": "Mapování Modelů", + "testConnection": "Test Připojení", + "connectionStatus": "Stav Připojení", + "configureEndpoint": "Konfigurace koncového bodu", + "instructions": "Instrukce", + "modelMapping": "Mapování modelu", + "baseUrl": "Základní URL", + "apiKey": "Klíč API", + "configured": "Nakonfigurováno", + "notConfigured": "Nekonfigurováno", + "notInstalled": "Neinstalováno", + "custom": "Vlastní", + "unknown": "Neznámý", + "lastSavedAt": "Naposledy uloženo: {date}", + "never": "Nikdy", + "justNow": "právě teď", + "minutesAgoShort": "před {count} min", + "hoursAgoShort": "před {count}h", + "daysAgoShort": "před {count} dny", + "monthsAgoShort": "před {count} měsíci", + "yearsAgoShort": "před {count} lety", + "runtimeCheckFailed": "Kontrola spuštěče selhala", + "yourApiKeyPlaceholder": "váš-api-klíč", + "modelPlaceholder": "poskytovatel/model", + "configurationSaved": "Konfigurace úspěšně uložena.", + "failedToSave": "Nepodařilo se uložit konfiguraci.", + "noApiKeysCreateOne": "Žádné klíče API – Vytvořte si jeden na stránce Klíče", + "defaultOmnirouteKey": "sk_omniroute (výchozí)", + "selectModel": "Vyberte model", + "selectModelForAlias": "Vyberte model pro {alias}", + "selectModelForTool": "Vyberte model pro {tool}", + "select": "Vybrat", + "clear": "Vyčistit", + "comingSoon": "Již brzy", + "checkingRuntime": "Kontroluji stav spouštěče...", + "guideOnlyIntegration": "Integrace s průvodcem (není vyžadován lokální spouštěcí soubor)", + "cliRuntimeDetected": "Spouštěcí soubor CLI detekován a připraven", + "cliFoundNotRunnable": "CLI nalezeno, ale nelze jej spustit {důvod}", + "cliRuntimeNotDetected": "Spouštěcí zoubor CLI nebyl nalezen", + "binary": "Binární", + "configPath": "Konfigurační cesta", + "configPathShort": "Konfigurace", + "failedCheckRuntimeStatus": "Nepodařilo se zkontrolovat stav spouštěcího souboru.", + "copy": "Kopírovat", + "copied": "Zkopírováno", + "copyConfig": "Kopírovat konfiguraci", + "saveConfig": "Uložit konfiguraci", + "selectionSaved": "Výběr uložen", + "guide": "Průvodce", + "detected": "Detekováno", + "notReady": "Nepřipraven", + "active": "Aktivní", + "inactive": "Neaktivní", + "startMitm": "Start MITM", + "stopMitm": "Stop MITM", + "mitmStarted": "MITM úspěšně zahájen!", + "mitmStopped": "MITM úspěšně zastaven!", + "failedStart": "Nepodařilo se spustit MITM", + "failedStop": "Nepodařilo se zastavit MITM", + "saveMappings": "Uložit mapování", + "mappingsSaved": "Mapování uloženo!", + "failedSaveMappings": "Uložení mapování se nezdařilo", + "howItWorks": "Jak to funguje:", + "antigravityHowWorksDesc": "Antigravity odesílá požadavky do koncového bodu Googlu. MITM je zachycuje a přesměrovává na OmniRoute.", + "antigravityStep1": "1. Spusťte MITM pro směrování požadavků přes OmniRoute.", + "antigravityStep2Prefix": "2. Přidat", + "antigravityStep2Suffix": "do souboru hosts jako 127.0.0.1.", + "antigravityStep3": "3. Otevřete Antigravity a požadavky budou proxyovány.", + "sudoPasswordRequiredTitle": "Vyžadováno heslo Sudo", + "sudoPasswordHint": "Pro úpravu souboru hosts a nastavení systémového proxy serveru je vyžadováno heslo správce.", + "enterSudoPassword": "Zadejte heslo sudo", + "sudoPasswordRequiredError": "Je vyžadováno heslo Sudo.", + "cancel": "Zrušit", + "confirm": "Potvrdit", + "settingsApplied": "Nastavení bylo úspěšně použito!", + "failedApplySettings": "Nastavení se nepodařilo použít", + "settingsReset": "Nastavení bylo úspěšně resetováno!", + "failedResetSettings": "Nepodařilo se resetovat nastavení", + "backupRestored": "Záloha obnovena!", + "failedRestore": "Obnovení se nezdařilo", + "checkingCli": "Kontroluji {tool} CLI...", + "cliNotRunnable": "{tool} CLI je nainstalováno, ale nelze jej spustit.", + "cliNotInstalled": "{tool} CLI není nainstalováno", + "cliNotDetected": "{tool} CLI nebyl detekován", + "cliDetectedReady": "{tool} CLI nalezeno a připraveno", + "cliFoundFailedHealthcheck": "{tool} CLI nalezeno, ale kontrola spouštěcího souboru selhala {reason}.", + "installCliPrompt": "Pro použití této funkce si prosím nainstalujte {tool} CLI.", + "installCodexPrompt": "Pro použití funkce auto-použití si prosím nainstalujte Codex CLI.", + "hide": "Skrýt", + "howToInstall": "Jak nainstalovat", + "installationGuide": "Instalační příručka", + "platforms": "macOS / Linux / Windows:", + "afterInstallationRun": "Po instalaci spusťte", + "toVerify": "ověřit.", + "current": "Aktuální", + "baseUrlPlaceholder": "https://.../v1", + "resetToDefault": "Obnovit výchozí nastavení", + "providerModelPlaceholder": "poskytovatel/model", + "apply": "Použít", + "reset": "Obnovit", + "manualConfig": "Ruční konfigurace", + "backups": "Zálohy", + "configBackups": "Zálohy konfigurace", + "noBackupsYet": "Zatím žádné zálohy. Zálohy se vytvářejí automaticky před každým použitím nebo resetem.", + "restore": "Obnovit", + "backupRestoredReloading": "Záloha obnovena! Obnovení stavu...", + "failedRestoreBackup": "Obnovení zálohy se nezdařilo", + "applied": "Aplikováno!", + "failed": "Selhalo", + "resetDone": "Reset!", + "omnirouteConfiguredOpenAiCompatible": "OmniRoute je nakonfigurován jako poskytovatel kompatibilní s OpenAI", + "provider": "Poskytovatel", + "model": "Model", + "providers": "Poskytovatelé", + "auth": "Autorizace", + "noApiKeysAvailable": "Žádné klíče API nejsou k dispozici", + "usingDefaultOmniroute": "Používá se výchozí: sk_omniroute", + "updateConfig": "Aktualizovat konfiguraci", + "applyConfig": "Použít konfiguraci", + "noBackupsAvailable": "Žádné zálohy nejsou k dispozici.", + "profileSaved": "Profil „{name}“ uložen!", + "failedSaveProfile": "Profil se nepodařilo uložit", + "profileActivated": "Profil aktivován!", + "failedActivateProfile": "Aktivace profilu se nezdařilo", + "profiles": "Profily", + "savedProfiles": "Uložené profily", + "noProfilesYet": "Zatím nebyly uloženy žádné profily. Uložte aktuální konfiguraci jako profil níže.", + "activate": "Aktivovat", + "deleteProfile": "Smazat profil", + "profileNamePlaceholder": "Název profilu (např. Osobní účet)", + "saveCurrent": "Uložit aktuální", + "codexAuthNotePrefix": "Codex používá", + "codexAuthNoteMiddle": "s", + "codexAuthNoteSuffix": "Klikněte na „Použít“ pro automatickou konfiguraci.", + "claudeManualConfiguration": "Claude CLI - Ruční konfigurace", + "codexManualConfiguration": "Codex CLI - Ruční konfigurace", + "droidManualConfiguration": "Factory Droid - Ruční konfigurace", + "openClawManualConfiguration": "Open Claw - Ruční konfigurace", + "clineManualConfiguration": "Cline Ruční konfigurace", + "kiloManualConfiguration": "Kilo Code Ruční konfigurace", + "toolDescriptions": { + "antigravity": "Google Antigravity IDE s MITM", + "claude": "Anthropic Claude Code CLI", + "codex": "OpenAI Codex CLI", + "droid": "Factory Droid AI asistent", + "openclaw": "Open Claw AI asistent", + "cline": "Cline AI Coding asistent CLI", + "kilo": "Kilo Code AI asistent CLI", + "cursor": "Cursor AI Code Editor", + "continue": "Continue AI asistent", + "opencode": "OpenCode AI kódovací asistent (Terminál)", + "kiro": "Amazon Kiro – IDE s umělou inteligencí" + }, + "guides": { + "cursor": { + "notes": { + "0": "Pro použití této funkce je vyžadován účet Cursor Pro.", + "1": "Kurzor směruje požadavky přes svůj vlastní server, takže lokální koncový bod není podporován. Povolte prosím cloudový koncový bod v Nastavení." + }, + "steps": { + "1": { + "title": "Otevřít Nastavení", + "desc": "Přejděte do Nastavení -> Modely" + }, + "2": { + "title": "Povolit OpenAI API", + "desc": "Povolit možnost „Klíč OpenAI API“" + }, + "3": { + "title": "Základní URL" + }, + "4": { + "title": "Klíč API" + }, + "5": { + "title": "Přidat vlastní model", + "desc": "Klikněte na „Zobrazit všechny modely“ -> „Přidat vlastní model“" + }, + "6": { + "title": "Vyberte model" + } + } + }, + "continue": { + "steps": { + "1": { + "title": "Otevřít konfiguraci", + "desc": "Otevřít konfigurační soubor Pokračovat" + }, + "2": { + "title": "Klíč API" + }, + "3": { + "title": "Vyberte model" + }, + "4": { + "title": "Přidat konfiguraci modelu", + "desc": "Přidejte do pole modely následující konfiguraci:" + } + } + }, + "opencode": { + "steps": { + "1": { + "title": "Instalace OpenCode", + "desc": "Instalace přes npm: npm install -g opencode-ai" + }, + "2": { + "title": "Klíč API" + }, + "3": { + "title": "Nastavit základní URL", + "desc": "opencode config set baseUrl {{baseUrl}}" + }, + "4": { + "title": "Vyberte model" + } + } + }, + "kiro": { + "steps": { + "1": { + "title": "Otevřít Kiro Nastavení", + "desc": "Přejděte do Nastavení → Poskytovatel AI" + }, + "2": { + "title": "Základní URL", + "desc": "Vložte URL adresu koncového bodu OmniRoute" + }, + "3": { + "title": "Klíč API" + }, + "4": { + "title": "Vyberte model" + } + } + } + } + }, + "combos": { + "title": "Komba", + "description": "Vytvářejte kombinace modelů s váženým směrováním a podporou záložních řešení", + "createCombo": "Vytvořit kombinaci", + "editCombo": "Upravit kombinaci", + "deleteCombo": "Smazat kombinaci", + "noModels": "Žádné modely", + "noModelsYet": "Zatím nebyly přidány žádné modely", + "addModel": "Přidat model", + "addModelToCombo": "Přidat model do kombinace", + "routingStrategy": "Strategie směrování", + "maxRetries": "Maximální počet opakování", + "timeout": "Časový limit (ms)", + "healthcheck": "Kontrola stavu", + "priority": "Přednost", + "fallback": "Záložní", + "roundRobin": "Round Robin", + "random": "Náhodný", + "leastLatency": "Nejmenší latence", + "comboName": "Kombinovaný název", + "comboNamePlaceholder": "moje kombinace", + "deleteConfirm": "Smazat tuto kombinaci?", + "noCombosYet": "Zatím žádné kombinace", + "comboCreated": "Kombinace úspěšně vytvořena", + "comboUpdated": "Kombinace úspěšně aktualizována", + "comboDeleted": "Kombinace smazána", + "failedCreate": "Nepodařilo se vytvořit kombinaci", + "failedUpdate": "Nepodařilo se aktualizovat kombinaci", + "errorCreating": "Chyba při vytváření kombinace", + "errorUpdating": "Chyba při aktualizaci kombinace", + "errorDeleting": "Chyba při mazání kombinace", + "testFailed": "Testovací požadavek selhal", + "failedToggle": "Nepodařilo se přepnout kombinaci", + "testResults": "Výsledky testů — {name}", + "resolvedBy": "Vyřešeno:", + "more": "+{count} dalších", + "reqs": "požadavky", + "success": "úspěch", + "proxyConfigured": "Proxy server je nakonfigurován", + "copyComboName": "Kopírovat název kombinace", + "enableCombo": "Povolit kombinaci", + "disableCombo": "Zakázat kombinaci", + "testCombo": "Testovací kombinace", + "duplicate": "Duplikát", + "proxyConfig": "Konfigurace proxy serveru", + "nameRequired": "Jméno je povinné", + "nameInvalid": "Povolena jsou pouze písmena, číslice, -, _, / a .", + "nameHint": "Povolena jsou písmena, číslice, -, _, / a .", + "priorityDesc": "Sekvenční záložní: nejprve se vyzkouší model 1, poté 2 atd.", + "weightedDesc": "Distribuuje provoz podle váhových procent s funkcí", + "roundRobinDesc": "Kruhová distribuce: každý požadavek jde do dalšího modelu v rotaci", + "randomDesc": "Rovnoměrný náhodný výběr, poté návrat ke zbývajícím modelům", + "leastUsedDesc": "Vybere model s nejmenším počtem požadavků a vyrovná zátěž v průběhu času.", + "costOptimizedDesc": "Trasy k nejlevnějšímu modelu na základě ceny", + "strictRandom": "Přísná náhoda", + "strictRandomDesc": "Zamíchejte balíček karet – každý model se před zamícháním použije jednou", + "models": "Modely", + "autoBalance": "Automatické vyvážení", + "advancedSettings": "Pokročilá nastavení", + "retryDelay": "Zpoždění opakování (ms)", + "concurrencyPerModel": "Souběžnost / Model", + "queueTimeout": "Časový limit fronty (ms)", + "advancedHint": "Pro použití globálních výchozích hodnot nechte pole prázdné. Tyto hodnoty přepíší nastavení pro jednotlivé poskytovatele.", + "moveUp": "Posunout nahoru", + "moveDown": "Přesunout dolů", + "removeModel": "Odstranit", + "saving": "Ukládání...", + "weighted": "Vážené", + "leastUsed": "Nejméně používané", + "costOpt": "Cost-Opt", + "strategyGuideTitle": "Jak tuto strategii používat", + "strategyGuideWhen": "Kdy použít", + "strategyGuideAvoid": "Vyhněte se, když", + "strategyGuideExample": "Příklad", + "strategyGuide": { + "priority": { + "when": "Máte jeden preferovaný model a chcete pouze záložní řešení pro případ selhání.", + "avoid": "Potřebujete distribuci požadavků napříč modely.", + "example": "Primární model kódování s levnější zálohou pro případ výpadků." + }, + "weighted": { + "when": "Potřebujete řízený provoz rozdělený mezi modely.", + "avoid": "Nemůžete si v průběhu času udržovat přesné váhy.", + "example": "80% stabilní model + 20% zavedení modelu canary." + }, + "round-robin": { + "when": "Chcete předvídatelné a rovnoměrné rozdělení.", + "avoid": "Modely se příliš liší latencí nebo cenou.", + "example": "Stejný model na více účtech pro rozložení propustnosti." + }, + "random": { + "when": "Chcete jednoduchou distribuci s minimálním nastavením.", + "avoid": "Potřebujete přísné záruky provozu.", + "example": "Rychlé prototypování s ekvivalentními modely." + }, + "least-used": { + "when": "Chcete adaptivní vyvažování založené na aktuální poptávce.", + "avoid": "Provoz je příliš nízký na to, aby se dalo využít výhod vyvažování využití.", + "example": "Smíšené pracovní zátěže, kdy je jeden model často přetížen." + }, + "cost-optimized": { + "when": "Snížení nákladů je vaší nejvyšší prioritou.", + "avoid": "Údaje o cenách chybí nebo jsou zastaralé.", + "example": "Úlohy na pozadí nebo dávkové úlohy, kde se upřednostňují nižší náklady." + } + }, + "advancedHelp": { + "maxRetries": "Kolik opakovaných pokusů se provede před selháním požadavku.", + "retryDelay": "Počáteční čekání mezi opakovanými pokusy. Vyšší hodnoty snižují tlak prasknutí.", + "timeout": "Maximální doba trvání požadavku před jeho přerušením.", + "healthcheck": "Přeskakuje nezdravé modely/poskytovatele z rozhodnutí o směrování.", + "concurrencyPerModel": "Maximální počet současných požadavků povolených na model v režimu round robin.", + "queueTimeout": "Jak dlouho může požadavek čekat ve frontě, než vyprší časový limit." + }, + "templatesTitle": "Rychlé šablony", + "templatesDescription": "Použijte počáteční profil a poté upravte modely a konfiguraci.", + "templateApply": "Použít šablonu", + "templateHighAvailability": "Vysoká dostupnost", + "templateHighAvailabilityDesc": "Prioritní směrování s kontrolami stavu a bezpečnými opakovanými pokusy.", + "templateCostSaver": "Úspora nákladů", + "templateCostSaverDesc": "Směrování optimalizované z hlediska nákladů pro úlohy s prioritou rozpočtu.", + "templateBalanced": "Rovnoměrné zatížení", + "templateBalancedDesc": "Nejméně používané směrování pro rozložení poptávky v čase.", + "usageGuideHide": "Skrýt", + "usageGuideDontShowAgain": "Už se nezobrazovat", + "usageGuideShow": "Zobrazit průvodce", + "quickTestTitle": "Kombinace připravena k ověření", + "quickTestDescription": "Spusťte nyní test a ověřte chování při záložním režimu a latenci.", + "testNow": "Otestujte nyní", + "pricingCoverage": "Cenové krytí", + "pricingCoverageHint": "Optimalizace nákladů funguje nejlépe, když všechny kombinované modely mají stanovenou cenu.", + "pricingAvailable": "Ceny k dispozici", + "pricingMissing": "Žádné ceny", + "pricingAvailableShort": "cena", + "pricingMissingShort": "bez ceny", + "warningRoundRobinSingleModel": "Round-robin je nejužitečnější s alespoň 2 modely.", + "warningCostOptimizedPartialPricing": "Pouze {priced} z {total} modelů má stanovenou cenu. Směrování může být částečně zohledněno s ohledem na cenu.", + "warningCostOptimizedNoPricing": "Pro tuto kombinaci nebyly nalezeny žádné cenové údaje. Optimalizace nákladů může vést k neočekávanému směrování.", + "readinessTitle": "Jste připraveni ušetřit?", + "readinessDescription": "Před vytvořením nebo aktualizací této kombinace si prostudujte kontrolní seznam.", + "readinessCheckName": "Název kombinace je platný", + "readinessCheckModels": "Je vybrán alespoň jeden model", + "readinessCheckWeights": "Vážený součet je 100 %", + "readinessCheckWeightsOptional": "Pravidlo pro váhu není vyžadováno", + "readinessCheckPricing": "Údaje o cenách jsou k dispozici", + "readinessCheckPricingOptional": "Pravidlo pro tvorbu cen není vyžadováno", + "saveBlockedTitle": "Ukládání je blokováno, dokud nebudou opraveny následující položky:", + "saveBlockName": "Definujte kombinovaný název.", + "saveBlockModels": "Přidejte alespoň jeden model.", + "saveBlockWeighted": "Nastavte váhy na 100 % (aktuální: {celkem} %).", + "saveBlockPricing": "Přidejte cenu alespoň pro jeden model nebo zvolte jinou strategii.", + "recommendationsLabel": "Doporučené nastavení", + "applyRecommendations": "Použít doporučení", + "recommendationsUpdated": "Doporučení pro {strategii} byla aktualizována.", + "recommendationsApplied": "Doporučení aplikovaná na tuto kombinaci.", + "strategyRecommendations": { + "priority": { + "title": "Bezpečná základní linie", + "description": "Používejte jeden primární model a záložní řetězec udržujte krátký a spolehlivý.", + "tip1": "Upřednostněte svůj nejspolehlivější model.", + "tip2": "Ponechte si 1–2 záložní modely s podobnou kvalitou.", + "tip3": "Používejte bezpečné opakované pokusy k absorpci dočasných selhání poskytovatele." + }, + "weighted": { + "title": "Řízené rozdělení provozu", + "description": "Skvělé pro canary rollouty a postupnou migraci mezi modely.", + "tip1": "Začněte s konzervativním rozdělením, například 90/10.", + "tip2": "Celková částka se udržuje na 100 % a po změnách se automaticky vyrovnává.", + "tip3": "Před zvýšením hmotnosti kanárka sledujte jeho úspěšnost a latenci." + }, + "round-robin": { + "title": "Předvídatelné sdílení zátěže", + "description": "Nejlepší, když jsou modely ekvivalentní a potřebujete hladké rozložení.", + "tip1": "Použijte alespoň 2 modely.", + "tip2": "Nastavte limity souběžnosti, abyste zabránili přetížení burstováním.", + "tip3": "Pro rychlé selhání při saturaci použijte časový limit fronty." + }, + "random": { + "title": "Rychlé rozmetání s nízkým nastavením", + "description": "Použijte, když potřebujete jednoduchou distribuci bez striktních záruk.", + "tip1": "Používejte modely s podobnými profily latence.", + "tip2": "Ponechte povolené opakované pokusy, abyste zvládli náhodné neúspěchy.", + "tip3": "Preferujte to pro experimentování, ne pro striktní SLA." + }, + "least-used": { + "title": "Adaptivní vyvažování", + "description": "Trasy k méně používaným modelům pro postupné snižování počtu aktivních míst.", + "tip1": "Funguje lépe za nepřetržitého provozu.", + "tip2": "Pro bezpečnější vyvažování kombinujte s kontrolami stavu.", + "tip3": "Sledujte využití jednotlivých modelů pro ověření zisků z distribuce." + }, + "cost-optimized": { + "title": "Směrování s ohledem na rozpočet", + "description": "Trasy k levnějším modelům, pokud jsou k dispozici metadata o cenách.", + "tip1": "Zajistěte cenové pokrytí pro všechny vybrané modely.", + "tip2": "Pro náročné výzvy si pořiďte kvalitní záložní řešení.", + "tip3": "Používejte pro dávkové/úlohy na pozadí, kde jsou hlavním klíčovým ukazatelem výkonnosti náklady." + } + }, + "templateFreeStack": "Volný zásobník (0 $)", + "templateFreeStackDesc": "Round-robin napříč všemi bezplatnými poskytovateli: Kiro (Claude), iFlow (5 modelů), Qwen (4 modely), Gemini CLI. Nulové náklady, nikdy nekončí s kódováním." + }, + "costs": { + "title": "Náklady", + "budget": "Rozpočet", + "totalCost": "Celkové náklady", + "breakdown": "Rozklad nákladů", + "noData": "Žádné údaje o nákladech", + "byModel": "Podle modelu", + "byProvider": "Podle poskytovatele" + }, + "endpoint": { + "title": "Koncový bod API", + "available": "Dostupné koncové body", + "cloudProxy": "Cloudový proxy server", + "disableConfirm": "Opravdu chcete zakázat cloudový proxy server?", + "baseUrl": "Základní URL", + "apiKeyLabel": "Klíč API", + "registeredKeys": "Registrované klíče", + "chatCompletions": "Dokončení chatu", + "responses": "Odpovědi", + "listModels": "Seznam modelů", + "usingCloudProxy": "Používání cloudové proxy", + "usingLocalServer": "Používání lokálního serveru", + "machineId": "ID stroje: {id}...", + "disableCloud": "Zakázat cloud", + "enableCloud": "Povolit cloud", + "modelsAcrossEndpoints": "{models} modelů napříč koncovými body {endpoints}", + "chatDesc": "Streamovací i nestreamovací chat se všemi poskytovateli", + "embeddings": "Vložení", + "embeddingsDesc": "Vkládání textu pro vyhledávání a RAG kanály", + "imageGeneration": "Generování obrázků", + "imageDesc": "Generování obrázků z textových pokynů", + "rerank": "Změnit pořadí", + "rerankDesc": "Změna pořadí dokumentů podle relevance vzhledem k dotazu", + "audioTranscription": "Přepis zvuku", + "audioTranscriptionDesc": "Přepis zvukových souborů do textu (Whisper)", + "textToSpeech": "Převod textu na řeč", + "textToSpeechDesc": "Převod textu na přirozeně znějící řeč", + "moderations": "Moderování", + "moderationsDesc": "Moderování obsahu a bezpečnostní klasifikace", + "responsesDesc": "OpenAI Responses API pro Codex a pokročilé agentní pracovní postupy", + "listModelsDesc": "Vypsat všechny dostupné modely u všech připojených poskytovatelů", + "settingsApiDesc": "Čtení a úprava konfigurace OmniRoute přes API", + "settingsApi": "Nastavení API", + "categoryCore": "Základní API", + "categoryMedia": "Média a multimodální doprava", + "categorySearch": "Vyhledávání a objevování", + "categoryUtility": "Veřejné služby a správa", + "webSearch": "Vyhledávání na webu", + "webSearchDesc": "Sjednocené webové vyhledávání napříč různými poskytovateli s automatickým přepnutím na záložní systém a ukládáním do mezipaměti", + "searchProvider": "Poskytovatel vyhledávání", + "searchProviderDesc": "Tento poskytovatel se používá pro webové vyhledávání prostřednictvím POST /v1/search. Není nutná žádná konfigurace modelu – poskytovatelé vyhledávání jsou připraveni k použití po připojení klíče API.", + "enableCloudTitle": "Povolit cloudový proxy server", + "whatYouGet": "Co získáte", + "cloudBenefitAccess": "Přístup k API odkudkoli na světě", + "cloudBenefitShare": "Snadné sdílení koncového bodu se svým týmem", + "cloudBenefitPorts": "Není třeba otevírat porty ani konfigurovat firewall", + "cloudBenefitEdge": "Rychlá globální edge síť", + "cloudSessionNote": "Cloud bude uchovávat vaši autorizační relaci po dobu 1 dne. Pokud ji nepoužíváte, bude automaticky smazána.", + "cloudUnstableNote": "Cloud je v současné době v některých případech s Claude Code OAuth nestabilní.", + "cloudConnected": "Cloudový proxy připojen!", + "connectingToCloud": "Připojování ke cloudu...", + "verifyingConnection": "Ověřování připojení...", + "connecting": "Spojovací...", + "verifying": "Ověřování...", + "connected": "Připojeno!", + "disableCloudTitle": "Zakázat cloudový proxy server", + "disableWarning": "Všechny relace ověřování budou z cloudu smazány.", + "syncingData": "Synchronizace nejnovějších dat...", + "disablingCloud": "Zakázání cloudu...", + "syncing": "Synchronizace...", + "disabling": "Zakázání...", + "cloudConnectedVerified": "Cloudová proxy připojena a ověřena!", + "connectedVerificationPending": "Připojeno – čeká na ověření", + "connectedVerificationPendingWithError": "Připojeno — čeká na ověření: {error}", + "cloudDisabledSuccess": "Cloud byl úspěšně deaktivován.", + "syncedSuccess": "Synchronizováno úspěšně", + "failedDisable": "Nepodařilo se zakázat cloud", + "failedEnable": "Nepodařilo se povolit cloud", + "cloudRequestTimeout": "Časový limit požadavku na cloud", + "cloudRequestFailed": "Požadavek na cloud se nezdařil", + "cloudWorkerUnreachable": "Nepodařilo se spojit s cloudovým pracovníkem. Ujistěte se, že cloudová služba je spuštěna (spuštěním npm dev v /cloud).", + "connectionFailed": "Připojení se nezdařilo", + "syncFailed": "Synchronizace cloudových dat se nezdařilo", + "providerModelsTitle": "{poskytovatel} — Modely", + "noModelsForProvider": "Pro tohoto poskytovatele nejsou k dispozici žádné modely.", + "chat": "Povídání", + "embedding": "Vkládání", + "image": "Obraz", + "custom": "zvyk", + "modelsCount": "{počet, množné číslo, jeden {# model} další {# modelů}}", + "sectionTitle": "Integrační plocha", + "sectionDescription": "API a koncové body operačních protokolů kompatibilní s OpenAI", + "tabApis": "API kompatibilní s OpenAI", + "tabProtocols": "Protokoly", + "tabsAria": "Koncové sekce", + "protocolsTitle": "Protokoly", + "protocolsDescription": "MCP a A2A jsou prvotřídní koncové body s vyhrazenou pozorovatelností a kontrolami.", + "mcpCardTitle": "MCP server", + "mcpCardDescription": "Protokol kontextu modelu přes stdio", + "a2aCardTitle": "Server A2A", + "a2aCardDescription": "Koncový bod JSON-RPC agenta Agent2Agent", + "protocolToolsLabel": "Nástroje", + "protocolTasksLabel": "Úkoly", + "protocolActiveStreamsLabel": "Aktivní streamy", + "protocolLastActivity": "Poslední aktivita", + "quickStart": "Rychlý start", + "openMcpDashboard": "Otevřená správa MCP", + "openA2aDashboard": "Otevřená správa A2A", + "mcpQuickStartTitle": "Rychlý start MCP", + "mcpQuickStartStep1": "Spusťte MCP server pomocí příkazu `omniroute --mcp`.", + "mcpQuickStartStep2": "Nakonfigurujte klienta MCP pro připojení přes transport stdio.", + "mcpQuickStartStep3": "Spusťte nástroje jako `omniroute_get_health` a `omniroute_list_combos`.", + "a2aQuickStartTitle": "Rychlý start A2A", + "a2aQuickStartStep1": "Kartu agenta najdete na adrese `/.well-known/agent.json`.", + "a2aQuickStartStep2": "Odešlete požadavky JSON-RPC na `POST /a2a` pomocí `message/send` nebo `message/stream`.", + "a2aQuickStartStep3": "Sledujte a ovládejte úkoly pomocí příkazů `tasks/get` a `tasks/cancel`.", + "completionsLegacy": "Dokončení (Starší verze)", + "completionsLegacyDesc": "Doplňování textu staršími verzemi OpenAI – akceptuje formát prompt string i messages array." + }, + "endpoints": { + "tabProxy": "Koncový proxy", + "tabApiEndpoints": "Koncové body API", + "apiEndpointsTitle": "Koncové body API", + "apiEndpointsDescription": "Koncové body backendového API, které mohou být využívány jinými aplikacemi a službami. Tato část uvádí všechna dostupná REST API s dokumentací a testovacími možnostmi.", + "comingSoon": "Již brzy", + "plannedFeatures": "Plánované funkce", + "featureRestApi": "Katalog koncových bodů REST API s interaktivní dokumentací", + "featureWebhooks": "Konfigurace webhooku a odběry událostí", + "featureSwagger": "Automatické generování specifikací OpenAPI / Swagger", + "featureAuth": "Správa klíčů API a rozsahu OAuth pro každý koncový bod" + }, + "mcpDashboard": { + "loading": "Načítání řídicího panelu MCP...", + "activate": "aktivovat", + "deactivate": "deaktivovat", + "confirmSwitchCombo": "Potvrdit {action} combo \"{combo}\"?", + "switchComboFailed": "Nepodařilo se přepnout stav kombinace.", + "switchComboSuccess": "Kombinace „{combo}“ aktualizována.", + "confirmApplyProfile": "Použít profil odolnosti „{profile}“?", + "applyProfileFailed": "Nepodařilo se použít profil odolnosti.", + "applyProfileSuccess": "Profil „{profile}“ byl použit.", + "confirmResetBreakers": "Resetovat všechny jističe?", + "resetBreakersFailed": "Nepodařilo se resetovat jističe.", + "resetBreakersSuccess": "Jističe resetovány.", + "processStatus": "Stav procesu", + "online": "Online", + "offline": "Offline", + "pid": "PID", + "sessionUptime": "Doba provozuschopnosti relace", + "lastHeartbeat": "Poslední tep", + "activity24h": "Aktivita (24 hodin)", + "totalCalls": "Celkový počet hovorů", + "successRate": "Míra úspěšnosti", + "avgLatency": "Průměrná latence", + "topTools": "Nejlepší nástroje", + "noToolCalls24h": "Žádné volání nástrojů za posledních 24 hodin.", + "runtimeDetails": "Podrobnosti o běhovém prostředí", + "transport": "Doprava", + "scopesEnforced": "Vynucené rozsahy", + "yes": "Ano", + "no": "žádný", + "lastCall": "Poslední hovor", + "heartbeatPath": "Cesta srdečního tepu", + "operationalControls": "Provozní kontroly", + "switchCombo": "Kombinace přepínačů", + "inactive": "neaktivní", + "active": "aktivní", + "activateCombo": "Aktivovat kombinaci", + "deactivateCombo": "Deaktivovat kombinaci", + "applyResilienceProfile": "Použít profil odolnosti", + "profileAggressive": "agresivní", + "profileBalanced": "vyrovnaný", + "profileConservative": "konzervativní", + "applyProfile": "Použít profil", + "resetCircuitBreakers": "Resetujte jističe", + "resetCircuitBreakersHelp": "Vymaže aktuální čítače stavu jističů a poruch pro poskytovatele.", + "resetAllBreakers": "Resetujte všechny jističe", + "toolsAndScopes": "Nástroje a rozsahy", + "tableTool": "Nástroj", + "tableScopes": "Rozsahy", + "tablePhase": "Fáze", + "tableAudit": "Audit", + "auditLog": "Protokol auditu", + "auditSummary": "Volání: {total} | stránka {page} z {totalPages}", + "allTools": "Všechny nástroje", + "allResults": "Všechny výsledky", + "success": "Úspěch", + "failure": "Selhání", + "apiKeyIdPlaceholder": "ID klíče API", + "loadingAuditEntries": "Načítání záznamů auditu...", + "noAuditEntriesForFilters": "Pro aktuální filtry nebyly nalezeny žádné položky auditu.", + "tableTimestamp": "Časové razítko", + "tableDuration": "Trvání", + "tableResult": "Výsledek", + "tableApiKey": "Klíč API", + "failed": "selhal", + "previous": "Předchozí", + "next": "Další" + }, + "a2aDashboard": { + "loading": "Načítání řídicího panelu A2A...", + "confirmCancelTask": "Zrušit úkol {taskId}?", + "cancelTaskFailed": "Úkol se nepodařilo zrušit.", + "cancelTaskSuccess": "Úkol {taskId} zrušen.", + "smokeSendFailed": "Test kouře při odesílání/zprávě selhal.", + "smokeSendSuccessWithTask": "zpráva/odeslat v pořádku (úkol {taskId}).", + "smokeSendSuccess": "zpráva/odeslat v pořádku.", + "smokeStreamFailed": "test kouře zprávy/streamu selhal.", + "smokeStreamSuccessWithTask": "zpráva/stream v pořádku (úkol {taskId}{stateSuffix}).", + "smokeStreamNoTaskId": "Zpráva/stream dokončen bez ID úlohy.", + "health": "Zdraví", + "ok": "dobře", + "totalTasks": "Celkový počet úkolů", + "activeStreams": "Aktivní streamy", + "lastTask": "Poslední úkol", + "taskStateOverview": "Přehled stavu úlohy", + "state": { + "submitted": "předloženo", + "working": "pracovní", + "completed": "dokončeno", + "failed": "selhal", + "cancelled": "zrušeno" + }, + "agentCard": "Karta agenta", + "version": "Verze", + "url": "URL", + "capabilities": "Schopnosti", + "agentCardNotAvailable": "Karta agenta není k dispozici.", + "quickValidation": "Rychlé ověření", + "quickValidationDescription": "Provádí volání smoke přes živý koncový bod `/a2a`.", + "runMessageSend": "Spustit zprávu/odeslat", + "runMessageStream": "Spustit zprávu/stream", + "taskManagement": "Správa úkolů", + "taskSummary": "{total} úkolů | stránka {page} z {totalPages}", + "allStates": "vše", + "allSkills": "všechny dovednosti", + "loadingTasks": "Načítání úkolů...", + "noTasksForFilters": "Pro aktuální filtry nebyly nalezeny žádné úkoly.", + "tableTask": "Úkol", + "tableSkill": "Dovednost", + "tableState": "Stát", + "tableUpdated": "Aktualizováno", + "tableActions": "Akce", + "view": "Pohled", + "cancel": "Zrušit", + "previous": "Předchozí", + "next": "Další", + "taskDetail": "Podrobnosti úkolu", + "close": "Blízko", + "metadata": "Metadata", + "events": "Události", + "artifacts": "Artefakty" + }, + "health": { + "title": "Stav systému", + "description": "Monitorování vaší instance OmniRoute v reálném čase", + "healthy": "Zdravý", + "degraded": "Degradovaný", + "down": "Dolů", + "uptime": "Doba provozuschopnosti", + "memory": "Paměť", + "memoryRss": "Paměť (RSS)", + "heap": "Halda", + "cpu": "Procesor", + "database": "Databáze", + "version": "Verze", + "lastCheck": "Poslední kontrola", + "providerHealth": "Zdraví poskytovatelů", + "systemMetrics": "Systémové metriky", + "tokenHealth": "Stav tokenů", + "refreshAll": "Obnovit vše", + "checkNow": "Zkontrolovat nyní", + "loadingHealth": "Načítání zdravotních dat...", + "failedToLoad": "Nepodařilo se načíst zdravotní data: {error}", + "retry": "Zkusit znovu", + "allOperational": "Všechny systémy funkční", + "issuesDetected": "Zjištěny problémy se systémem", + "updatedAt": "Aktualizováno {čas}", + "latency": "Latence", + "latencyP50": "p50", + "latencyP95": "p95", + "latencyP99": "p99", + "millisecondsShort": "{hodnota}ms", + "notAvailable": "—", + "totalRequests": "Celkový počet žádostí", + "noDataYet": "Zatím žádná data", + "promptCache": "Mezipaměť výzev", + "entries": "Záznamy", + "hitRate": "Míra zásahů", + "hitsMisses": "Zásahy / Neúspěchy", + "signatureCache": "Mezipaměť podpisů", + "signatureDefaults": "Výchozí nastavení", + "signatureTool": "Nástroj", + "signatureFamily": "Rodina", + "signatureSession": "Zasedání", + "recovering": "Zotavuje se", + "noCBData": "Nejsou k dispozici žádné údaje o jističích. Nejprve zadejte několik požadavků.", + "providerHealthStatusAria": "Zdravotní stav poskytovatele", + "issuesLabel": "Zjištěné problémy", + "operational": "Provozní", + "providers": "Poskytovatelé", + "healthyCount": "{count} zdravých", + "nodeVersion": "Uzel {verze}", + "failures": "{count} selhání", + "failuresPlural": "{count} selhání", + "lastFailure": "Poslední", + "rateLimitStatus": "Stav limitu rychlosti", + "activeLimiters": "{count} aktivní omezovač", + "activeLimitersPlural": "{count} aktivních omezovačů", + "queued": "Zařazeno do fronty", + "queuedCount": "{count} ve frontě", + "running": "běh", + "runningCount": "{count} běží", + "ok": "OK", + "activeLockouts": "Aktivní výluky", + "resetConfirm": "Resetovat všechny jističe do funkčního stavu? Tímto se vymažou všechny počty poruch a všichni poskytovatelé se vrátí do provozního stavu.", + "resetAllTitle": "Resetujte všechny jističe do funkčního stavu", + "resetting": "Resetování...", + "resetAll": "Obnovit vše", + "until": "Do {time}" + }, + "limits": { + "title": "Limity a kvóty", + "rateLimit": "Limit rychlosti", + "remaining": "Zbývající", + "requestsPerMinute": "Žádosti/min", + "tokensPerMinute": "Žetony/min", + "dailyLimit": "Denní limit" + }, + "logs": { + "title": "Protokoly", + "requestLogs": "Protokoly požadavků", + "proxyLogs": "Protokoly proxy serveru", + "auditLog": "Protokol auditu", + "console": "Utěšit", + "auditLogDesc": "Administrativní akce a bezpečnostní události", + "loading": "Načítání...", + "refresh": "Obnovit", + "filterByAction": "Filtrovat podle akce...", + "filterByActor": "Filtrovat podle herce...", + "filterEntriesAria": "Filtrování položek protokolu auditu", + "filterByActionTypeAria": "Filtrovat podle typu akce", + "filterByActorAria": "Filtrovat podle herce", + "refreshAuditLogAria": "Obnovit protokol auditu", + "tableAria": "Záznamy protokolu auditu", + "failedFetchAuditLog": "Nepodařilo se načíst protokol auditu", + "showing": "Zobrazeno {count} záznamů (offset {offset})", + "search": "Vyhledávání", + "timestamp": "Časové razítko", + "action": "Akce", + "actor": "Herec", + "target": "Cíl", + "details": "Podrobnosti", + "ipAddress": "IP adresa", + "notAvailable": "—", + "noEntries": "Nenalezeny žádné položky protokolu auditu", + "previous": "Předchozí", + "next": "Další" + }, + "onboarding": { + "welcome": "Vítejte", + "security": "Zabezpečení", + "test": "Test", + "ready": "Připraveni!", + "setPassword": "Nastavit heslo", + "addProvider": "Přidejte svého prvního poskytovatele", + "getStarted": "Začít", + "skip": "Přeskočit", + "skipWizard": "Úplně přeskočit průvodce", + "skipPassword": "Přeskočit nastavení hesla", + "skipAndContinue": "Přeskočit a pokračovat", + "passwordLabel": "Heslo", + "confirmPassword": "Potvrzení hesla", + "enterPassword": "Zadejte heslo", + "confirmPasswordPlaceholder": "Potvrzení hesla", + "passwordsMismatch": "Hesla se neshodují", + "setupComplete": "Nastavení dokončeno!", + "goToDashboard": "Přejít na Dashboard →", + "welcomeDesc": "OmniRoute je vaše lokální proxy API pro umělou inteligenci. Směruje požadavky k více poskytovatelům umělé inteligence s vyvažováním zátěže, failoverem a sledováním využití.", + "multiProvider": "Více poskytovatelů", + "usageTracking": "Sledování používání", + "apiKeyMgmt": "Správa klíčů API", + "securityDesc": "Nastavte heslo pro ochranu řídicího panelu nebo to teď přeskočte.", + "providerDesc": "Připojte svého prvního poskytovatele umělé inteligence. Další můžete přidat později.", + "apiKeyRequired": "Klíč API (povinný)", + "customUrlOptional": "Vlastní URL (volitelné)", + "testDesc": "Ověřme, zda připojení k vašemu poskytovateli funguje.", + "runTest": "Spustit test připojení", + "testingConnection": "Testování připojení...", + "connectionSuccessful": "Připojení úspěšné! Váš poskytovatel je připraven.", + "noProviderFound": "Nebyl nalezen žádný poskytovatel. Můžete ho později přidat z řídicího panelu.", + "testFailed": "Test se nezdařil, ale můžete to nakonfigurovat později.", + "couldNotTest": "Momentálně se nepodařilo otestovat. Můžete to udělat z řídicího panelu.", + "doneDesc": "Hotovo! Vaše instance OmniRoute je nakonfigurovaná a připravená k proxy požadavků umělé inteligence.", + "yourEndpoint": "Váš koncový bod:", + "continue": "Pokračovat", + "retry": "Zkusit znovu", + "failedSetPassword": "Nastavení hesla se nezdařilo. Zkuste to znovu.", + "failedAddProvider": "Přidání poskytovatele se nezdařilo. Zkuste to znovu.", + "connectionError": "Chyba připojení. Zkuste to prosím znovu.", + "provider": "Poskytovatel" + }, + "providers": { + "title": "Poskytovatelé", + "addProvider": "Přidat poskytovatele", + "editProvider": "Upravit poskytovatele", + "deleteProvider": "Smazat poskytovatele", + "noProviders": "Žádní poskytovatelé nakonfigurováni", + "modelAvailability": "Dostupnost modelu", + "accounts": "Účty", + "newAccount": "Nový účet", + "deleteConfirm": "Opravdu chcete smazat tohoto poskytovatele?", + "testing": "Testování...", + "testConnection": "Testovací připojení", + "testSuccess": "Připojení úspěšné", + "testFailed": "Připojení se nezdařilo", + "available": "K dispozici", + "cooldown": "Zchlazovací doba", + "unavailable": "Nedostupné", + "unknown": "Neznámý", + "oauthLabel": "OAuth", + "compatibleLabel": "Kompatibilní", + "chat": "Povídání", + "responses": "Odpovědi", + "messages": "Zprávy", + "oauthProviders": "Poskytovatelé OAuth", + "freeProviders": "Bezplatní poskytovatelé", + "apiKeyProviders": "Poskytovatelé klíčů API", + "compatibleProviders": "Poskytovatelé kompatibilní s klíčem API", + "testAll": "Otestovat vše", + "testAllOAuth": "Otestujte všechna připojení OAuth", + "testAllFree": "Otestujte všechna bezplatná připojení", + "testAllApiKey": "Otestujte všechna připojení klíčů API", + "testAllCompatible": "Otestujte všechna kompatibilní připojení", + "connected": "{count} Připojeno", + "errorCount": "Chyba {count} ({code})", + "errorCountNoCode": "Chyba {count}", + "noConnections": "Žádné spojení", + "disabled": "Zakázáno", + "enableProvider": "Povolit poskytovatele", + "disableProvider": "Zakázat poskytovatele", + "testResults": "Výsledky testů", + "noCompatibleYet": "Zatím nebyli přidáni žádní kompatibilní poskytovatelé", + "compatibleHint": "Pomocí tlačítek výše můžete přidat koncové body kompatibilní s OpenAI nebo Anthropic.", + "addOpenAICompatible": "Přidat kompatibilitu s OpenAI", + "addAnthropicCompatible": "Přidat antropicky kompatibilní", + "addNewProvider": "Přidat nového poskytovatele", + "backToProviders": "Zpět k poskytovatelům", + "configureNewProvider": "Nakonfigurujte nového poskytovatele umělé inteligence pro použití s ​​vašimi aplikacemi.", + "providerLabel": "Poskytovatel", + "selectProvider": "Vyberte poskytovatele", + "selectedProvider": "Vybraný poskytovatel", + "authMethod": "Metoda ověřování", + "apiKeyLabel": "Klíč API", + "apiKeyRequired": "Je vyžadován klíč API", + "selectProviderRequired": "Vyberte prosím poskytovatele", + "enterApiKey": "Zadejte svůj klíč API", + "apiKeySecure": "Váš API klíč bude zašifrovaný a bezpečně uložen.", + "oauth2Connect": "Připojení pomocí OAuth2", + "oauth2Label": "OAuth2", + "oauth2Desc": "Propojte svůj účet pomocí ověřování OAuth2.", + "displayName": "Zobrazovaný název", + "displayNamePlaceholder": "např. produkční API, vývojové prostředí", + "displayNameHint": "Volitelné. Popisný název pro identifikaci této konfigurace.", + "active": "Aktivní", + "activeDescription": "Povolte tohoto poskytovatele pro použití ve vašich aplikacích", + "cancel": "Zrušit", + "createProvider": "Vytvořit poskytovatele", + "failedCreate": "Vytvoření poskytovatele se nezdařilo", + "errorOccurred": "Došlo k chybě. Zkuste to prosím znovu.", + "modelStatus": "Stav modelu", + "allModelsOperational": "Všechny modely funkční", + "modelsWithIssues": "{count} model(y) s problémy", + "allModelsNormal": "Všechny modely reagují normálně.", + "cooldownCleared": "Znovunabíjecí doba pro model {model} byla vymazána", + "failedClearCooldown": "Nepodařilo se vymazat dobu zpoždění", + "loadingAvailability": "Načítání dostupnosti modelu...", + "clearCooldown": "Jasný", + "clearing": "Vymazávání...", + "until": "Do {time}", + "providerTestFailed": "Test poskytovatele selhal", + "providerTestTimeout": "Test poskytovatele vypršel – příliš mnoho připojení k otestování najednou", + "modeTest": "Test {mode}", + "passedCount": "{count} prošel", + "failedCount": "{count} selhalo", + "testedCount": "testováno", + "millisecondsAbbr": "{hodnota}ms", + "okShort": "OK", + "errorShort": "CHYBA", + "noActiveConnectionsInGroup": "Pro tuto skupinu nebyla nalezena žádná aktivní připojení.", + "allTestsPassed": "Všechny testy byly úspěšné", + "testSummary": "{passed}/{total} prospělo, {failed} selhalo", + "nameLabel": "Jméno", + "prefixLabel": "Předpona", + "baseUrlLabel": "Základní URL", + "apiTypeLabel": "Typ API", + "prefixHint": "Povinné. Unikátní prefix pro názvy modelů.", + "nameHint": "Povinné. Popisný popisek pro tento uzel.", + "baseUrlHint": "Povinné.   Základní URL rozhraní API poskytovatele.", + "anthropicPrefixPlaceholder": "ac-prod", + "openaiPrefixPlaceholder": "oc-prod", + "anthropicBaseUrlPlaceholder": "https://api.anthropic.com/v1", + "openaiBaseUrlPlaceholder": "https://api.openai.com/v1", + "validateConnection": "Ověření připojení", + "validating": "Ověřování...", + "connectionValid": "Připojení je platné!", + "connectionFailed": "Připojení se nezdařilo. Zkontrolujte URL a klíč.", + "testKeyLabel": "Testovací klíč API", + "testKeyPlaceholder": "sk-... (pouze pro ověření)", + "providerNotFound": "Poskytovatel nenalezen", + "deleteConnectionConfirm": "Smazat toto připojení?", + "failedSetAlias": "Nastavení aliasu se nezdařilo", + "failedSaveConnection": "Uložení připojení se nezdařilo", + "failedSaveConnectionRetry": "Uložení připojení se nezdařilo. Zkuste to prosím znovu.", + "failedRetestConnection": "Nepodařilo se znovu otestovat připojení", + "deleteCompatibleNodeConfirm": "Smazat tento kompatibilní uzel {type}?", + "anthropicCompatibleDetails": "Detaily antropické kompatibility", + "openaiCompatibleDetails": "Podrobnosti o kompatibilitě s OpenAI", + "messagesApi": "API pro zprávy", + "responsesApi": "API pro odpovědi", + "chatCompletions": "Dokončení chatu", + "importingModels": "Import...", + "importFromModels": "Importovat z /models", + "addConnectionToImport": "Přidejte připojení pro povolení importu.", + "noModelsConfigured": "Žádné nakonfigurované modely", + "connectionCount": "{count} připojení", + "fetchingModels": "Načítání dostupných modelů...", + "failedFetchModels": "Načtení modelů se nezdařilo", + "noModelsFound": "Nenalezeny žádné modely", + "importFailed": "Import se nezdařil", + "noNewModelsAdded": "Nebyly přidány žádné nové modely.", + "adding": "Přidávání...", + "importingModelsTitle": "Import modelů", + "copyModel": "Kopie modelu", + "removeModel": "Odebrat model", + "rateLimitProtected": "Chráněný", + "rateLimitUnprotected": "Nechráněný", + "enableRateLimitProtection": "Kliknutím povolíte ochranu limitem rychlosti", + "disableRateLimitProtection": "Kliknutím deaktivujete ochranu limitem rychlosti", + "productionKey": "Produkční klíč", + "enterNewApiKey": "Zadejte nový klíč API", + "optional": "Volitelný", + "anthropicCompatibleName": "Antropicky kompatibilní", + "openaiCompatibleName": "Kompatibilní s OpenAI", + "failedImportModels": "Import modelů se nezdařilo", + "noModelsReturnedFromEndpoint": "Z koncového bodu /models nebyly vráceny žádné modely.", + "importingModelsProgress": "Importování {current} z {total} modelů...", + "foundModelsStartingImport": "Nalezeno {count} modelů. Zahájení importu...", + "importingModelById": "Importování {modelId}...", + "importSuccessCount": "Úspěšně importováno {count, plural, one {# model} other {# models}}!", + "noNewModelsAddedExisting": "Nebyly přidány žádné nové modely (všechny již existují).", + "importDoneCount": "✓ Hotovo! {počet, množné číslo, jeden {# importovaných modelů.} other {# importovaných modelů.}}", + "unexpectedErrorOccurred": "Došlo k neočekávané chybě", + "connectionCountLabel": "{počet, množné číslo, jeden {# spojení} další {# spojení}}", + "messagesPath": "zprávy", + "responsesPath": "odpovědi", + "chatCompletionsPath": "chat/dokončení", + "add": "Přidat", + "edit": "Upravit", + "delete": "Vymazat", + "anthropic": "Antropický", + "openai": "OpenAI", + "singleConnectionPerCompatible": "Na kompatibilní uzel je povoleno pouze jedno připojení. Pokud potřebujete více připojení, přidejte další uzel.", + "connections": "Připojení", + "providerProxyTitleConfigured": "Proxy poskytovatele: {host}", + "configured": "nakonfigurováno", + "providerProxyConfigureHint": "Konfigurace proxy serveru pro všechna připojení tohoto poskytovatele", + "providerProxy": "Proxy poskytovatele", + "noConnectionsYet": "Zatím žádná spojení", + "addFirstConnectionHint": "Přidejte své první připojení a začněte", + "addConnection": "Přidat připojení", + "availableModels": "Dostupné modely", + "pageAutoRefresh": "Stránka se automaticky obnoví...", + "statusDisabled": "postižený", + "statusConnected": "připojený", + "statusRuntimeIssue": "problém za běhu", + "statusAuthFailed": "ověření selhalo", + "statusRateLimited": "omezená sazba", + "statusNetworkIssue": "problém se sítí", + "statusTestUnsupported": "test není podporován", + "statusUnavailable": "nedostupný", + "statusFailed": "selhal", + "statusError": "chyba", + "oauthAccount": "Účet OAuth", + "errorTypeRuntime": "Místní běhové prostředí", + "errorTypeUpstreamAuth": "Autorizace proti proudu", + "errorTypeMissingCredential": "Chybí pověření", + "errorTypeRefreshFailed": "Obnovení se nezdařilo", + "errorTypeTokenExpired": "Platnost tokenu vypršela", + "errorTypeRateLimited": "Omezená sazba", + "errorTypeUpstreamUnavailable": "Proti proudu není k dispozici", + "errorTypeNetworkError": "Chyba sítě", + "errorTypeTestUnsupported": "Test není podporován", + "errorTypeUpstreamError": "Chyba proti proudu", + "proxySourceGlobal": "Globální", + "proxySourceProvider": "Poskytovatel", + "proxySourceKey": "Klíč", + "proxyConfiguredBySource": "Proxy ({source}): {host}", + "autoPriority": "Automaticky: {priorita}", + "proxy": "Proxy", + "retestAuthentication": "Znovu otestovat ověřování", + "retest": "Opakované otestování", + "disableConnection": "Zakázat připojení", + "enableConnection": "Povolit připojení", + "reauthenticateConnection": "Znovu ověřit toto připojení", + "proxyConfig": "Konfigurace proxy serveru", + "aliasExistsAlert": "Alias ​​„{alias}“ již existuje. Použijte prosím jiný model nebo upravte existující alias.", + "openRouterAnyModelHint": "OpenRouter podporuje jakýkoli model. Přidejte modely a vytvořte aliasy pro rychlý přístup.", + "modelIdFromOpenRouter": "ID modelu (z OpenRouteru)", + "openRouterModelPlaceholder": "antropický/klaudi-3-opus", + "customModels": "Vlastní modely", + "customModelsHint": "Přidejte ID modelů, která nejsou ve výchozím seznamu. Budou k dispozici pro směrování.", + "modelId": "ID modelu", + "customModelPlaceholder": "např. gpt-4.5-turbo", + "loading": "Načítání...", + "removeCustomModel": "Odebrat vlastní model", + "noCustomModels": "Zatím nebyly přidány žádné vlastní modely.", + "allSuggestedAliasesExist": "Všechny navrhované aliasy již existují. Vyberte prosím jiný model nebo odstraňte konfliktní aliasy.", + "failedSaveCustomModel": "Uložení vlastního modelu se nezdařilo", + "modelAddedSuccess": "Model {modelId} byl úspěšně přidán", + "failedAddModelTryAgain": "Model se nepodařilo přidat. Zkuste to prosím znovu.", + "failedSaveImportedModel": "Nepodařilo se uložit importovaný model do vlastní databáze.", + "failedImportModelsTryAgain": "Import modelů se nezdařilo. Zkuste to prosím znovu.", + "failedRemoveModelFromDatabase": "Nepodařilo se odebrat model z databáze.", + "modelRemovedSuccess": "Model byl úspěšně odstraněn", + "failedDeleteModelTryAgain": "Model se nepodařilo smazat. Zkuste to prosím znovu.", + "compatibleModelsDescription": "Modely kompatibilní s {type} přidejte ručně nebo je importujte z koncového bodu /models.", + "anthropicCompatibleModelPlaceholder": "claude-3-opus-20240229", + "openaiCompatibleModelPlaceholder": "gpt-4o", + "apiKeyValidationFailed": "Ověření klíče API se nezdařilo. Zkontrolujte prosím svůj klíč a zkuste to znovu.", + "addProviderApiKeyTitle": "Přidat klíč API {provider}", + "checking": "Kontrola...", + "check": "Kontrola", + "valid": "Platný", + "invalid": "Neplatný", + "creating": "Vytváření...", + "validationChecksAnthropicCompatible": "Ověření provádí {provider} ověřením klíče API.", + "validationChecksOpenAiCompatible": "Ověření {provider} probíhá přes /models na vaší základní URL adrese.", + "priorityLabel": "Přednost", + "saving": "Ukládání...", + "save": "Uložit", + "editConnection": "Upravit připojení", + "accountName": "Název účtu", + "email": "E-mail", + "healthCheckMinutes": "Kontrola stavu (min)", + "healthCheckHint": "Proaktivní interval obnovy tokenu. 0 = zakázáno.", + "groupLabel": "Prostředí", + "groupPlaceholder": "např. eKaizen, Osobní", + "failedTestConnection": "Nepodařilo se otestovat připojení", + "failed": "Selhalo", + "leaveBlankKeepCurrentApiKey": "Chcete-li zachovat aktuální klíč API, ponechte pole prázdné.", + "editCompatibleTitle": "Upravit {type} Kompatibilní", + "compatibleBaseUrlHint": "Kořenová adresa URL vašeho {type}-kompatibilního API. Pro vlastní cesty k koncovým bodům použijte Rozšířená nastavení.", + "apiKeyForCheck": "API klíč (pro kontrolu)", + "compatibleProdPlaceholder": "{type} Kompatibilní (produkční)", + "tokenRefreshed": "Token byl úspěšně obnoven", + "tokenRefreshFailed": "Obnovení tokenu se nezdařilo", + "advancedSettings": "Pokročilá nastavení", + "chatPathLabel": "Cesta koncového bodu chatu", + "chatPathPlaceholder": "/chat/dokončení", + "chatPathHint": "Vlastní cesta chatu pro poskytovatele s nestandardními API (např. /v4/chat/completions)", + "modelsPathLabel": "Cesta koncového bodu modelu", + "modelsPathPlaceholder": "/modely", + "modelsPathHint": "Cesta k vlastním modelům pro validaci (např. /v4/models)" + }, + "settings": { + "title": "Nastavení", + "general": "Generál", + "security": "Zabezpečení", + "appearance": "Vzhled", + "routing": "Směrování", + "cache": "Mezipaměť", + "resilience": "Odolnost", + "systemPrompt": "Systémový výzva", + "thinkingBudget": "Promýšlení rozpočtu", + "proxy": "Proxy", + "pricing": "Ceny", + "storage": "Skladování", + "policies": "Zásady", + "ipFilter": "IP filtr", + "comboDefaults": "Výchozí kombinace", + "fallbackChains": "Záložní řetězce", + "changePassword": "Změnit heslo", + "enablePassword": "Povolit heslo", + "darkMode": "Tmavý režim", + "lightMode": "Světelný režim", + "systemTheme": "Systémové téma", + "enableCache": "Povolit mezipaměť", + "cacheTTL": "TTL mezipaměti", + "maxCacheSize": "Maximální velikost mezipaměti", + "clearCache": "Vymazat mezipaměť", + "cacheHits": "Zásahy do mezipaměti", + "cacheMisses": "Minulé cache", + "hitRate": "Míra zásahů", + "cacheEntries": "Položky mezipaměti", + "circuitBreaker": "Jistič", + "retryPolicy": "Zásady opakování", + "maxRetries": "Maximální počet opakování", + "retryDelay": "Zpoždění opakování", + "timeoutMs": "Časový limit (ms)", + "enableSystemPrompt": "Povolit systémový výzvu", + "systemPromptText": "Text systémového výzvy", + "enableThinking": "Umožněte myšlení", + "maxThinkingTokens": "Žetony Max Myšlení", + "enableProxy": "Povolit proxy", + "proxyUrl": "URL adresa proxy serveru", + "pricingRates": "Formát cenových sazeb", + "currentPricing": "Přehled aktuálních cen", + "loadingPricing": "Načítání cenových údajů...", + "noPricing": "Nejsou k dispozici žádné údaje o cenách", + "input": "Vstup", + "output": "Výstup", + "cached": "Uloženo v mezipaměti", + "reasoning": "Uvažování", + "cacheCreation": "Vytvoření mezipaměti", + "customPricing": "Vlastní ceny", + "databaseSize": "Velikost databáze", + "backupDb": "Zálohování databáze", + "restoreDb": "Obnovit databázi", + "exportData": "Export dat", + "importData": "Import dat", + "clearData": "Vymazat všechna data", + "clearDataConfirm": "Tímto trvale smažete všechna data. Jste si jisti?", + "enableRequestLogs": "Povolit protokoly požadavků", + "logRetention": "Uchovávání protokolů", + "ipWhitelist": "Whitelist IP adres", + "ipBlacklist": "Černá listina IP adres", + "addIP": "Přidat IP adresu", + "savedSuccessfully": "Nastavení bylo úspěšně uloženo", + "ai": "Umělá inteligence", + "advanced": "Moderní", + "localMode": "Lokální režim – Všechna data uložená na vašem počítači", + "settingsSectionsAria": "Sekce nastavení", + "switchThemes": "Přepínání mezi světlými a tmavými motivy", + "themeSelectionAria": "Výběr tématu", + "themeLight": "Světlo", + "themeDark": "Tmavý", + "themeSystem": "Systém", + "hideHealthLogs": "Skrýt protokoly kontrol stavu", + "hideHealthLogsDesc": "Pokud je zapnuto, potlačit zprávy [HealthCheck] v konzoli serveru", + "themeAccent": "Barva motivu", + "themeAccentDesc": "Vyberte si přednastavenou barvu nebo si vytvořte vlastní motiv s jednou barvou", + "themeCreate": "Vytvořit téma", + "themeCustom": "Vlastní téma", + "themeBlue": "Modrý", + "themeRed": "Červený", + "themeGreen": "Zelený", + "themeViolet": "Fialový", + "themeOrange": "Pomerančový", + "themeCyan": "Azurová", + "promptCache": "Mezipaměť výzev", + "flushCache": "Vyprázdnění mezipaměti", + "flushing": "Splachování…", + "size": "Velikost", + "hits": "Hity", + "evictions": "Vystěhování", + "loadingCacheStats": "Načítání statistik mezipaměti…", + "globalProxy": "Globální proxy", + "globalProxyDesc": "Nakonfigurujte globální odchozí proxy pro všechna volání API. Jednotliví poskytovatelé, kombinace a klíče mohou toto přepsat.", + "noGlobalProxy": "Není nakonfigurován žádný globální proxy server", + "globalLabel": "Globální", + "configure": "Konfigurovat", + "globalSystemPrompt": "Globální systémový výzva", + "systemPromptDesc": "Vkládáno do všech požadavků na úrovni proxy", + "saved": "Uloženo", + "systemPromptPlaceholder": "Zadejte systémový příkaz pro vložení do všech požadavků...", + "systemPromptHint": "Tato výzva se přidává na začátek systémové zprávy každého požadavku. Používá se pro globální instrukce, bezpečnostní pokyny nebo pravidla formátování odpovědí.", + "chars": "{count} znaků", + "thinkingBudgetTitle": "Promýšlení rozpočtu", + "thinkingBudgetDesc": "Řízení využití tokenů AI uvažování ve všech požadavcích", + "passthrough": "Průchod", + "passthroughDesc": "Žádné změny – klient kontroluje rozpočet", + "auto": "Auto", + "autoDesc": "Odstraňte veškerou konfiguraci myšlenek – nechte rozhodnutí poskytovatele", + "custom": "Zvyk", + "customDesc": "Nastavte fixní rozpočet tokenů pro všechny požadavky", + "adaptive": "Adaptivní", + "adaptiveDesc": "Škálování rozpočtu na základě složitosti požadavku", + "effortNone": "Žádné (0 žetonů)", + "effortLow": "Nízký (1 tisíc tokenů)", + "effortMedium": "Střední (10 tisíc tokenů)", + "effortHigh": "Vysoká (128 tisíc tokenů)", + "tokenBudget": "Rozpočet tokenů", + "tokens": "žetony", + "baseEffortLevel": "Základní úroveň úsilí", + "adaptiveHint": "Adaptivní režim se škáluje od této základní úrovně na základě počtu zpráv, využití nástrojů a délky výzvy.", + "requireLogin": "Vyžadovat přihlášení", + "requireLoginDesc": "Pokud je ZAPNUTO, ovládací panel vyžaduje heslo. Pokud je VYPNUTO, přístup bez přihlášení.", + "currentPassword": "Aktuální heslo", + "enterCurrentPassword": "Zadejte aktuální heslo", + "newPassword": "Nové heslo", + "enterNewPassword": "Zadejte nové heslo", + "confirmPassword": "Potvrdit nové heslo", + "confirmPasswordPlaceholder": "Potvrdit nové heslo", + "passwordsNoMatch": "Hesla se neshodují", + "passwordUpdated": "Heslo bylo úspěšně aktualizováno", + "failedUpdatePassword": "Heslo se nepodařilo aktualizovat", + "errorOccurred": "Došlo k chybě", + "updatePassword": "Aktualizovat heslo", + "setPassword": "Nastavit heslo", + "apiEndpointProtection": "Ochrana koncových bodů API", + "requireAuthModels": "Vyžadovat klíč API pro /models", + "requireAuthModelsDesc": "Pokud je tato možnost zapnutá, koncový bod /v1/models vrátí pro neověřené požadavky chybu 404. Zabraňuje objevení modelu neoprávněnými uživateli.", + "blockedProviders": "Blokovaní poskytovatelé", + "blockedProvidersDesc": "Skrýt konkrétní poskytovatele z odpovědi /v1/models. Blokovaní poskytovatelé se nezobrazí v seznamech modelů.", + "providersBlocked": "{count} poskytovatel(ů) zablokovaných z /models", + "blockProviderTitle": "Blokovat {poskytovatel}", + "unblockProviderTitle": "Odblokovat {provider}", + "cliFingerprint": "Porovnávání otisků prstů v rozhraní CLI", + "cliFingerprintDesc": "Při proxy požadavcích se porovnávají nativní binární podpisy rozhraní CLI. Změní pořadí záhlaví a textu tak, aby vypadaly identicky s oficiálními nástroji CLI. Vaše IP adresa proxy je zachována.", + "cliFingerprintEnabled": "{count} poskytovatel(ů) s aktivním otiskem CLI", + "enableFingerprintTitle": "Povolit otisk prstu pro {provider}", + "disableFingerprintTitle": "Zakázat otisk prstu pro {provider}", + "routingStrategy": "Strategie směrování", + "fillFirst": "Nejprve vyplňte", + "fillFirstDesc": "Používejte účty podle priority", + "roundRobin": "Round Robin", + "roundRobinDesc": "Procházet všechny účty", + "p2c": "P2C", + "p2cDesc": "Vyberte 2 náhodně, použijte ten zdravější", + "random": "Náhodný", + "randomDesc": "Náhodný účet při každém požadavku", + "leastUsed": "Nejméně používané", + "leastUsedDesc": "Vybrat nejméně naposledy použitý účet", + "costOpt": "Optimalizace nákladů", + "costOptDesc": "Preferujte nejlevnější dostupný účet", + "strictRandom": "Přísná náhoda", + "strictRandomDesc": "Zamíchejte balíček karet – každý účet se použije jednou před zamícháním", + "stickyLimit": "Lepkavý limit", + "stickyLimitDesc": "Hovory na účet před přepnutím", + "modelAliases": "Aliasy modelů", + "modelAliasesTitle": "Aliasy modelů", + "modelAliasesDesc": "Vzory zástupných znaků pro přemapování názvů modelů • Použijte * a ?", + "addCustomAlias": "Přidat vlastní alias", + "deprecatedModelId": "ID zastaralého modelu", + "newModelId": "Nové ID modelu", + "customAliases": "Vlastní aliasy", + "builtInAliases": "Vestavěné aliasy", + "backgroundDegradationTitle": "Degradace úloh na pozadí", + "backgroundDegradationDesc": "Automatická detekce úloh na pozadí (názvy, shrnutí) a směrování k levnějším modelům", + "enableDegradation": "Povolit degradaci na pozadí", + "enableDegradationHint": "Pokud je tato možnost povolena, úlohy na pozadí, jako je generování názvů a shrnutí, jsou automaticky směrovány na levnější modely.", + "tasksDetected": "Detekované úlohy", + "degradationMap": "Mapa degradace modelu", + "premiumModel": "Prémiový model", + "cheapModel": "Levný model", + "detectionPatterns": "Detekční vzory", + "newPattern": "např. „vygenerovat název“", + "aliasPatternPlaceholder": "claude-sonnet-*", + "aliasTargetPlaceholder": "claude-sonnet-4-20250514", + "pattern": "Vzor", + "targetModel": "Cílový model", + "add": "+ Přidat", + "session": "Zasedání", + "sessionDetailsAria": "Podrobnosti o relaci", + "status": "Postavení", + "authenticated": "Ověřeno", + "guest": "Host", + "loginTime": "Čas přihlášení", + "sessionAge": "Věk relace", + "browser": "Prohlížeč", + "clearLocalData": "Vymazat místní data", + "logout": "Odhlásit se", + "clearLocalDataConfirm": "Vymazat všechna místní data? Tímto se resetují vaše předvolby.", + "unknown": "Neznámý", + "systemActor": "systém", + "ipAccessControl": "Řízení přístupu k IP", + "ipAccessControlDesc": "Blokovat nebo povolit konkrétní IP adresy", + "ipModeDisabled": "Zakázáno", + "ipModeBlacklist": "Černá listina", + "ipModeWhitelist": "Bílý seznam", + "ipModeWhitelistPriority": "Priorita WL", + "addIpAddress": "Přidat IP adresu", + "ipAddressPlaceholder": "192.168.1.0/24 nebo 10.0.*.*", + "block": "+ Blok", + "allow": "+ Povolit", + "blocked": "Zablokováno ({count})", + "allowed": "Povoleno ({count})", + "temporaryBans": "Dočasné zákazy ({count})", + "minLeft": "Zbývá {min}m", + "auditLog": "Protokol auditu", + "searchAuditLogs": "Hledat v protokolech auditu...", + "failedLoadAuditLog": "Nepodařilo se načíst protokol auditu", + "noAuditEvents": "Nenalezeny žádné auditní události", + "action": "Akce", + "actor": "Herec", + "details": "Podrobnosti", + "time": "Čas", + "fallbackChainsTitle": "Záložní řetězce", + "fallbackChainsDesc": "Definování pořadí záložních poskytovatelů pro každý model", + "addChain": "+ Přidat řetězec", + "modelName": "Název modelu", + "modelNamePlaceholder": "claude-sonnet-4-20250514", + "providersCommaSeparated": "Poskytovatelé (odděleni čárkami, seřazeni podle priority)", + "providersCommaSeparatedPlaceholder": "antropický, otevřený, blíženec", + "createChain": "Vytvořit řetězec", + "noFallbackChains": "Žádné záložní řetězce", + "noFallbackChainsDesc": "Vytvořte řetězec pro definování záložního pořadí poskytovatelů pro daný model.", + "loadingFallbackChains": "Načítání záložních řetězců...", + "deleteChainConfirm": "Smazat záložní řetězec pro „{model}“?", + "chainCreated": "Řetězec vytvořen pro {model}", + "chainDeleted": "Řetězec smazán pro {model}", + "failedCreateChain": "Vytvoření řetězce se nezdařilo", + "failedDeleteChain": "Řetězec se nepodařilo smazat", + "deleteChain": "Smazat řetězec", + "fillModelAndProviders": "Vyplňte prosím název modelu a poskytovatele", + "addAtLeastOneProvider": "Přidejte alespoň jednoho poskytovatele", + "comboDefaultsTitle": "Výchozí kombinace", + "globalComboConfig": "Globální kombinovaná konfigurace", + "defaultStrategy": "Výchozí strategie", + "defaultStrategyDesc": "Aplikováno na nová komba bez explicitní strategie", + "comboStrategyAria": "Kombinovaná strategie", + "priority": "Přednost", + "weighted": "Vážené", + "maxRetriesLabel": "Maximální počet opakování", + "retryDelayLabel": "Zpoždění opakování (ms)", + "timeoutLabel": "Časový limit (ms)", + "healthCheck": "Kontrola stavu", + "healthCheckDesc": "Předběžná kontrola dostupnosti poskytovatele", + "trackMetrics": "Sledování metrik", + "trackMetricsDesc": "Zaznamenávání metrik pro jednotlivé kombinované požadavky", + "providerOverrides": "Přepsání poskytovatele", + "providerOverridesDesc": "Přepsat časový limit a počet opakovaných pokusů pro každého poskytovatele. Nastavení poskytovatele přepíše globální výchozí hodnoty.", + "providerMaxRetriesAria": "Maximální počet opakování pro {provider}", + "providerTimeoutAria": "Časový limit {provider} ms", + "removeProviderOverrideAria": "Odebrat přepsání {provider}", + "newProviderNamePlaceholder": "např. google, openai...", + "newProviderNameAria": "Název nového poskytovatele", + "retries": "opakované pokusy", + "ms": "paní", + "saveComboDefaults": "Uložit výchozí nastavení kombinace", + "maxNestingDepth": "Maximální hloubka vnoření", + "concurrencyPerModel": "Souběžnost / Model", + "queueTimeout": "Časový limit fronty (ms)", + "providerProfiles": "Profily poskytovatelů", + "providerProfilesDesc": "Samostatná nastavení odolnosti pro poskytovatele OAuth (založené na relacích) a API klíče (měřené). Poskytovatelé OAuth mají přísnější prahové hodnoty kvůli nižším limitům rychlosti.", + "oauthProviders": "Poskytovatelé OAuth", + "apiKeyProviders": "Poskytovatelé klíčů API", + "transientCooldown": "Přechodné ochlazování", + "rateLimitCooldown": "Zchlazovací doba limitu rychlosti", + "maxBackoffLevel": "Maximální úroveň odstavení", + "cbThreshold": "Prahová hodnota CB", + "cbResetTime": "Doba resetu vypínacího obvodu", + "rateLimiting": "Omezení rychlosti", + "rateLimitingDesc": "Poskytovatelé klíčů API jsou automaticky omezeni rychlostí s bezpečnými výchozími hodnotami. Limity se učí ze záhlaví odpovědí a v průběhu času se přizpůsobují.", + "defaultSafetyNet": "Výchozí bezpečnostní síť", + "rpm": "RPM", + "minGap": "Minimální mezera", + "maxConcurrent": "Max. souběžný", + "activeLimiters": "Aktivní omezovače", + "noActiveLimiters": "Zatím žádné aktivní omezovače rychlosti.", + "reservoir": "Nádrž", + "running": "Běh", + "queued": "Zařazeno do fronty", + "circuitBreakers": "Jističe", + "breakerStateClosed": "ZAVŘENO", + "breakerStateOpen": "OTEVŘENO", + "breakerStateHalfOpen": "Polootevřené", + "tripped": "{count} zakopl/a", + "healthy": "{count} zdravých", + "resetAll": "Obnovit vše", + "noCircuitBreakers": "Zatím nejsou aktivní žádné jističe. Jsou vytvořeny automaticky, když požadavky procházejí kombinovaným kanálem.", + "failures": "{count} selhání", + "policiesLocked": "Zásady a uzamčené identifikátory", + "allOperational": "Všechny systémy jsou funkční – žádné výpadky ani vypnuté jističe", + "loadingPolicies": "Načítání zásad...", + "lockedIdentifiers": "Uzamčené identifikátory", + "unlockedIdentifier": "Odemčeno: {identifier}", + "sinceDate": "od {date}", + "forceUnlock": "Vynucené odemčení", + "unlocking": "Odemykání...", + "failedUnlock": "Odemknutí se nezdařilo", + "failedLoadWithStatus": "Nepodařilo se načíst: {status}", + "failedLoadResilience": "Nepodařilo se načíst stav odolnosti", + "saveFailed": "Uložení se nezdařilo", + "resetFailed": "Reset selhal", + "loadingResilience": "Načítání stavu odolnosti...", + "retry": "Zkusit znovu", + "systemStorage": "Systém a úložiště", + "allDataLocal": "Všechna data uložená lokálně na vašem počítači", + "databasePath": "Cesta k databázi", + "exportDatabase": "Exportovat databázi", + "exportAll": "Exportovat vše (.tar.gz)", + "importDatabase": "Importovat databázi", + "confirmDbImport": "Potvrdit import databáze", + "confirmDbImportDesc": "Tímto se všechna aktuální data nahradí obsahem ze souboru {file}. Před importem se automaticky vytvoří záloha.", + "yesImport": "Ano, importovat", + "lastBackup": "Poslední záloha", + "noBackupYet": "Zatím žádná záloha", + "backupNow": "Zálohovat nyní", + "backupRestore": "Zálohování a obnovení", + "viewBackups": "Zobrazit zálohy", + "hide": "Skrýt", + "backupRetentionDesc": "Snímky databáze se vytvářejí automaticky před obnovením a každých 15 minut při změně dat. Uchovávání: 24 hodin + 30 denních záloh s inteligentní rotací.", + "loadingBackups": "Načítání záloh...", + "noBackupsYet": "Zatím nejsou k dispozici žádné zálohy. Zálohy se vytvoří automaticky při změně dat.", + "backupsAvailable": "Dostupné zálohy: {count}", + "refresh": "Obnovit", + "confirm": "Potvrdit?", + "yes": "Ano", + "no": "Žádný", + "restore": "Obnovit", + "invalidFileType": "Neplatný typ souboru. Přijímají se pouze soubory .sqlite.", + "exportFailed": "Export se nezdařil", + "exportFailedWithError": "Export se nezdařil: {error}", + "fullExportFailedWithError": "Úplný export se nezdařil: {error}", + "backupCreated": "Záloha vytvořena: {file}", + "restoreSuccess": "Obnoveno! {connections} připojení, {nodes} uzly, {combos} kombinace, {apiKeys} API klíče.", + "importSuccess": "Databáze importována! {connections} připojení, {nodes} uzly, {combos} kombinace, {apiKeys} API klíče.", + "justNow": "právě teď", + "minutesAgo": "před {count} min", + "hoursAgo": "před {count}h", + "daysAgo": "před {count} dny", + "backupReasonManual": "manuál", + "backupReasonPreRestore": "před restaurováním", + "connectionsCount": "{počet, množné číslo, jeden {# spojení} další {# spojení}}", + "noChangesSinceBackup": "Žádné změny od poslední zálohy", + "backupFailed": "Zálohování se nezdařilo", + "restoreFailed": "Obnovení se nezdařilo", + "importFailed": "Import se nezdařil", + "errorDuringRestore": "Během obnovy došlo k chybě", + "errorDuringImport": "Během importu došlo k chybě", + "modelPricing": "Ceny modelů", + "modelPricingDesc": "Konfigurace cenových sazeb pro každý model • Všechny sazby jsou v tokenech $/1 milion", + "providers": "Poskytovatelé", + "registry": "Registr", + "priced": "Cena", + "searchProvidersModels": "Hledat poskytovatele nebo modely...", + "showAll": "Zobrazit vše", + "noProvidersMatch": "Vašemu vyhledávání neodpovídá žádný poskytovatel.", + "howPricingWorks": "Jak funguje stanovování cen", + "cacheWrite": "Zápis do mezipaměti", + "unsaved": "neuložené", + "resetDefaults": "Obnovit výchozí nastavení", + "saveProvider": "Uložit poskytovatele", + "saving": "Ukládání...", + "model": "Model", + "models": "modely", + "moreProviders": "{count} dalších poskytovatelů", + "withPricing": "s nastavenými cenami", + "policiesCircuitBreakers": "Zásady a jističe", + "activeIssuesDetected": "Zjištěny aktivní problémy", + "off": "Vypnuto", + "resetPricingConfirm": "Obnovit všechny ceny pro {provider} na výchozí hodnoty?", + "pricingDescInput": "Vstup: tokeny odeslané do modelu", + "pricingDescOutput": "Výstup: vygenerované tokeny", + "pricingDescCached": "Uloženo v mezipaměti: opakovaně použitý vstup (~50 % vstupní frekvence)", + "pricingDescReasoning": "Úvaha: žetony myšlení (vrací se k výstupu)", + "pricingDescCacheWrite": "Zápis do mezipaměti: vytváření položek mezipaměti (vrací se na vstup)", + "pricingDescFormula": "Cena = (vstup × vstupní_rychlost) + (výstup × výstupní_rychlost) + (uloženo v mezipaměti × uloženo v mezipaměti) na milion tokenů.", + "pricingSettingsTitle": "Nastavení cen", + "totalModels": "Celkem modelů", + "active": "Aktivní", + "costCalculation": "Výpočet nákladů", + "costCalculationDesc": "Náklady se počítají na základě využití tokenů a cenových sazeb nakonfigurovaných pro každý model.", + "pricingFormat": "Formát cen", + "pricingFormatDesc": "Všechny ceny jsou uvedeny v $/1M tokenů (dolarů za milion tokenů).", + "tokenTypes": "Typy tokenů", + "inputTokenDesc": "Standardní tokeny výzev", + "outputTokenDesc": "Tokeny dokončení/odpovědi", + "cachedTokenDesc": "Vstupní tokeny uložené v mezipaměti (obvykle 50 % vstupní frekvence)", + "reasoningTokenDesc": "Speciální žetony uvažování/myšlení (záložní rychlost výstupu)", + "cacheCreationTokenDesc": "Tokeny používané k vytváření položek mezipaměti (záložní rychlost vstupu)", + "customPricingNote": "Výchozí ceny pro konkrétní modely můžete přepsat. Vlastní přepsání má přednost před automaticky zjištěnými cenami.", + "editPricing": "Upravit ceny", + "viewFullDetails": "Zobrazit všechny podrobnosti", + "themeCoral": "Korál" + }, + "translator": { + "title": "Překladatel", + "metaTitle": "Hřiště pro překladatele | OmniRoute", + "metaDescription": "Ladění, testování a vizualizace překladů formátů API mezi poskytovateli", + "playgroundTitle": "Hřiště překladatelů", + "playground": "Dětské hřiště", + "realtime": "Aktivita překladu v reálném čase", + "chatTester": "Tester chatu", + "testBench": "Zkušební stolice", + "liveMonitor": "Živý monitor", + "modeDescriptionPlayground": "Vložte libovolné tělo požadavku API a podívejte se, jak ho OmniRoute překládá mezi formáty poskytovatelů (OpenAI ↔ Claude ↔ Gemini ↔ Responses API)", + "modeDescriptionChatTester": "Odesílejte skutečné požadavky na chat prostřednictvím OmniRoute a prohlédněte si celý průběh: vstup, přeložený požadavek, odpověď poskytovatele a přeložený výstup.", + "modeDescriptionTestBench": "Spusťte předdefinované scénáře a porovnejte kompatibilitu napříč poskytovateli a modely.", + "modeDescriptionLiveMonitor": "Sledujte překladové události v reálném čase, jak požadavky procházejí OmniRoute.", + "modeDescriptionFallback": "Laďte, testujte a vizualizujte, jak OmniRoute překládá požadavky API mezi poskytovateli.", + "recentTranslations": "Nedávné překlady", + "noTranslations": "Zatím žádné překlady", + "source": "Zdroj", + "target": "Cíl", + "time": "Čas", + "model": "Model", + "status": "Postavení", + "latency": "Latence", + "totalTranslations": "Celkový počet překladů", + "successful": "Úspěšný", + "errors": "Chyby", + "avgLatency": "Průměrná latence", + "millisecondsShort": "{hodnota}ms", + "notAvailableSymbol": "—", + "liveAutoRefreshing": "Živě – Automatické obnovování", + "paused": "Pozastaveno", + "eventsAppearHint": "Události překladu se zde zobrazují, jak požadavky procházejí OmniRoute. Pro generování událostí použijte kteroukoli z těchto metod:", + "chatTesterTab": "Karta Tester chatu", + "testBenchTab": "Karta Testovací lavice", + "externalApiCalls": "Externí volání API", + "ideCliIntegrations": "Integrace IDE/CLI", + "inMemoryNote": "Poznámka: Události se ukládají do paměti a resetují se při restartu serveru.", + "ok": "OK", + "errorShort": "CHYBOVAT", + "formatConverter": "Převodník formátů", + "formatConverterDescription": "Vložte nebo zadejte tělo požadavku JSON. Překladač automaticky rozpozná zdrojový formát a převede jej do cílového formátu. Použijte to k ladění způsobu, jakým OmniRoute překládá požadavky mezi formáty (OpenAI ↔ Claude ↔ Gemini ↔ Responses API).", + "input": "Vstup", + "output": "Výstup", + "auto": "Auto", + "swapFormats": "Vyměnit formáty", + "translateAction": "Přeložit", + "clear": "Jasný", + "inputPlaceholder": "Vložte sem tělo požadavku nebo vyberte šablonu níže...", + "exampleTemplates": "Ukázkové šablony", + "exampleTemplatesHint": "— Kliknutím načtete", + "templateLoadHint": "Šablona načte požadavek ve formátu {format}. Změňte zdrojový formát pro načtení v jiném formátu.", + "compatibilityTester": "Tester kompatibility", + "compatibilityReport": "Zpráva o kompatibilitě", + "testBenchDescription": "Spusťte předdefinované scénáře (jednoduchý chat, volání nástrojů atd.) pro ověření kompatibility překladu a poskytovatele. Vyberte zdrojový formát a cílového poskytovatele a poté spusťte všechny testy, abyste zjistili procento kompatibility. Použijte to k nalezení funkcí, které fungují napříč poskytovateli.", + "targetProvider": "Cílový poskytovatel", + "runAllTests": "Spustit všechny testy", + "runTest": "Spustit test", + "reRun": "Opakovat", + "running": "Běh...", + "passed": "prošel", + "failed": "selhal", + "passedIconLabel": "✅ Prošel", + "chunks": "kusy", + "scenarioSimpleChat": "Jednoduchý chat", + "scenarioToolCalling": "Volání nástroje", + "scenarioMultiTurn": "Víceotáčkový", + "scenarioThinking": "Myslící", + "scenarioSystemPrompt": "Systémový výzva", + "scenarioStreaming": "Streamování", + "templateNames": { + "simple-chat": "Jednoduchý chat", + "tool-calling": "Volání nástroje", + "multi-turn": "Víceotáčkový", + "thinking": "Myslící", + "system-prompt": "Systémový výzva", + "streaming": "Streamování" + }, + "templateDescriptions": { + "simple-chat": "Základní textová zpráva", + "tool-calling": "Vyvolání funkce/nástroje", + "multi-turn": "Rozhovor s historií", + "thinking": "Rozšířené myšlení / uvažování", + "system-prompt": "Složité systémové instrukce", + "streaming": "Požadavek na streamování SSE" + }, + "templatePayloads": { + "simpleChat": { + "system": "Jste užitečný/á asistent/ka.", + "userGreeting": "Ahoj! Jak se dnes máš?" + }, + "toolCalling": { + "userWeather": "Jaké je počasí v São Paulu?", + "toolDescription": "Získejte aktuální počasí pro danou lokalitu", + "cityNameDescription": "Název města" + }, + "multiTurn": { + "system": "Jste asistent kódování.", + "userInitial": "Napište v Pythonu funkci pro řazení pole.", + "assistantExample": "Zde je jednoduchá třídicí funkce:\n\n```python\ndef sort_array(arr):\nreturn sorted(arr)\n```", + "userFollowUp": "Teď to seřaďte sestupně." + }, + "thinking": { + "question": "Jaký je součet prvních 100 prvočísel?" + }, + "systemPrompt": { + "systemInstruction": "Jste seniorní softwarový inženýr specializující se na distribuované systémy. Odpovídejte na otázky stručně a s využitím osvědčených postupů v oboru. V případě potřeby vždy uveďte příklady kódu. Formátujte své odpovědi pomocí Markdownu.", + "question": "Jak implementuji schéma jističe?" + }, + "streaming": { + "prompt": "Řekni mi krátký příběh o robotovi, který se učí malovat." + } + }, + "openaiCompatibleLabel": "Kompatibilní s OpenAI", + "anthropicCompatibleLabel": "Antropicky kompatibilní", + "noTemplateForFormat": "Pro tento formát neexistuje šablona", + "translationFailed": "Překlad se nezdařil: {error}", + "pipelineDebugger": "Ladicí program kanálu", + "translationPipeline": "Překladový kanál", + "pipelineVisualization": "Vizualizace potrubí", + "pipelineVisualizationHint": "Odešlete zprávu a podívejte se, jak váš požadavek prochází detekcí → překladem → voláním poskytovatele.", + "chatTesterDescription": "Odesílejte zprávy ve specifickém klientském formátu a kontrolujte každý krok překladového procesu.", + "chatTesterFlow": "Požadavek klienta → Detekce formátu → OpenAI Intermediate → Formát poskytovatele → Odpověď", + "clickStepToInspect": "Kliknutím na libovolný krok si můžete prohlédnout data v dané fázi.", + "clientFormat": "Formát klienta", + "provider": "Poskytovatel", + "modelPlaceholder": "Vyberte nebo zadejte název modelu...", + "sendMessageToSeePipeline": "Odešlete zprávu a zobrazte si proces překladu", + "chatMessageHintPrefix": "Vaše zpráva bude formátována jako", + "chatMessageHintSuffix": "požadavek, přeložený kanálem a odeslaný vybranému poskytovateli.", + "youWithFormat": "Vy ({formát})", + "assistant": "Asistent", + "typeMessage": "Napište zprávu...", + "send": "Poslat", + "clientRequest": "Žádost klienta", + "clientRequestDescription": "Tělo požadavku, jak by ho odeslal váš klient", + "formatDetected": "Detekován formát", + "formatDetectedDescription": "OmniRoute automaticky detekuje formát API ze struktury požadavku", + "openaiIntermediate": "OpenAI pro středně pokročilé", + "openaiIntermediateDescription": "Všechny formáty jsou nejprve normalizovány do formátu OpenAI (univerzální most)", + "providerFormat": "Formát poskytovatele", + "providerFormatDescription": "Formát OpenAI je přeložen do nativního formátu poskytovatele.", + "providerResponse": "Odpověď poskytovatele", + "providerResponseRawDescription": "Nezpracovaná odpověď z API poskytovatele", + "providerResponseSseDescription": "Nezpracovaný stream SSE z rozhraní API poskytovatele", + "unexpectedError": "Došlo k neočekávané chybě", + "error": "Chyba", + "errorMessage": "Chyba: {zpráva}", + "requestFailed": "Žádost se nezdařila", + "noTextExtracted": "(Žádný text nebyl extrahován)", + "liveMonitorDescriptionPrefix": "Zobrazuje události překladu, jak volání API probíhají přes OmniRoute. Události pocházejí z vyrovnávací paměti v paměti (resetují se při restartu). Použití", + "liveMonitorDescriptionSuffix": "nebo externí volání API pro generování událostí." + }, + "usage": { + "title": "Používání", + "loggerTab": "Logář", + "proxyTab": "Proxy", + "budgetManagement": "Správa rozpočtu", + "budgetSaved": "Uloženy rozpočtové limity", + "budgetSaveFailed": "Uložení rozpočtu se nezdařilo", + "loadingBudgetData": "Načítání dat rozpočtu...", + "noApiKeysTitle": "Žádné klíče API", + "noApiKeysDescription": "Nejprve přidejte klíče API pro nastavení limitů rozpočtu.", + "apiKey": "Klíč API", + "todaysSpend": "Dnešní útrata", + "thisMonth": "Tento měsíc", + "setLimits": "Stanovte si limity", + "dailyLimitUsd": "Denní limit (USD)", + "monthlyLimitUsd": "Měsíční limit (USD)", + "warningThresholdPercent": "Prahová hodnota varování (%)", + "dailyLimitPlaceholder": "např. 5,00", + "monthlyLimitPlaceholder": "např. 50,00", + "warningThresholdPlaceholder": "80", + "saveLimits": "Limity ukládání", + "budgetOk": "Rozpočet v pořádku — zbývá {remaining}", + "budgetExceeded": "Rozpočet překročen – požadavky mohou být blokovány", + "totalRequests": "Celkový počet žádostí", + "noDataYet": "Zatím žádná data", + "latency": "Latence", + "latencyP50": "p50", + "latencyP95": "p95", + "latencyP99": "p99", + "promptCache": "Mezipaměť výzev", + "systemHealth": "Stav systému", + "entries": "Záznamy", + "activeCount": "{count} aktivních", + "openCircuitBreakersDetected": "Detekovány rozpojené jističe", + "hitRate": "Míra zásahů", + "hitsMisses": "Zásahy / Neúspěchy", + "circuitBreakers": "Jističe", + "lockedIPs": "Uzamčené IP adresy", + "lockoutsAutoRefreshHint": "Uzamčení limitu rychlosti pro jednotlivé modely • Automatická aktualizace po 10 s", + "lockedCount": "{počet, množné číslo, jeden {# uzamčeno} další {# uzamčeno}}", + "timeLeft": "Zbývá {time}", + "howItWorks": "Jak to funguje", + "howItWorksSubtitle": "Zjistěte, jak hodnocení ověřují vaše odpovědi v LLM", + "define": "Definovat", + "defineStepDescription": "Vytvořte testovací případy se vstupními výzvami a očekávanými výstupními kritérii pomocí strategií, jako jsou contains, regex nebo přesná shoda.", + "run": "Běh", + "runStepDescription": "Spusťte testovací případy na vašich koncových bodech LLM pomocí OmniRoute. Každý případ je odeslán jako skutečný požadavek API.", + "evaluate": "Vyhodnotit", + "evaluateStepDescription": "Odpovědi jsou porovnávány s očekávanými kritérii. Pro každý případ se zobrazí výsledky s metrikami latence a podrobnou zpětnou vazbou.", + "evalSuites": "Vyhodnocovací sady", + "evalSuitesHint": "Kliknutím na sadu zobrazíte testovací případy a poté je spusťte a vyhodnoťte své koncové body LLM.", + "evalsLoading": "Načítání eval sad...", + "noEvalSuitesFound": "Nenalezeny žádné Eval Suites", + "noEvalSuitesDescription": "Sady Eval lze definovat prostřednictvím API nebo v kódu. Testují výstupy modelu oproti očekávaným výsledkům pomocí strategií, jako jsou contains, regex, přesná shoda a vlastní funkce.", + "columnCase": "Věc", + "columnStatus": "Postavení", + "columnLatency": "Latence", + "columnDetails": "Podrobnosti", + "columnModel": "Model", + "columnStrategy": "Strategie", + "columnExpected": "Očekávaný", + "statsSuites": "Apartmány", + "statsTestCases": "Testovací případy", + "statsModels": "Modely", + "statsCoverage": "Krytí", + "statsStrategiesCount": "strategie", + "evaluationStrategies": "Strategie hodnocení", + "modelsUnderTest": "Testované modely", + "searchSuitesPlaceholder": "Hledat apartmány...", + "passSuffix": "přihrávka", + "casesCount": "{počet, množné číslo, jeden {# pád} další {# pádů}}", + "runEval": "Spustit vyhodnocení", + "runningProgress": "Běží {current}/{total}...", + "passRate": "míra úspěšnosti", + "summaryBreakdown": "{passed} passed · {failed} failed · {total} total", + "passedIconLabel": "✅ Prošel", + "failedIconLabel": "❌ Neúspěšné", + "detailsContains": "Obsahuje: „{termín}“", + "detailsRegex": "Regex: {vzor}", + "detailsExpected": "Očekává se: „{expected}“", + "noResultsYet": "Zatím žádné výsledky", + "testCasesCount": "Testovací případy ({count})", + "noTestCasesDefined": "Žádné testovací případy nejsou definovány", + "runEvalHint": "Kliknutím na tlačítko „Spustit vyhodnocení“ spustíte všechny případy na vašem koncovém bodu LLM. Každý test odešle skutečný požadavek prostřednictvím OmniRoute.", + "notifyNoTestCases": "Pro tuto sadu nejsou definovány žádné testovací případy.", + "notifyAllCasesPassed": "Všechny {total} případy byly úspěšné ✅", + "notifySomeCasesFailed": "{passed}/{total} prospělo, {failed} selhalo", + "notifyEvalRunFailed": "Zkušební spuštění selhalo", + "notifyEvalTitle": "Vyhodnocení: {name}", + "modelEvals": "Hodnocení modelů", + "evalsHeroDescription": "Otestujte a ověřte své koncové body LLM spuštěním předdefinovaných sad pro vyhodnocování. Každá sada obsahuje testovací případy, které odesílají skutečné výzvy prostřednictvím OmniRoute a porovnávají odpovědi s očekávanými kritérii – což vám pomůže detekovat regrese, porovnávat modely a zajistit kvalitu odpovědí napříč poskytovateli.", + "qualityValidation": "Validace kvality", + "modelComparison": "Porovnání modelů", + "regressionDetection": "Detekce regrese", + "latencyBenchmarks": "Benchmarky latence", + "modelLockouts": "Modelové uzamčení", + "noLockouts": "Momentálně nejsou uzamčeny žádné modely", + "activeSessions": "Aktivní relace", + "noSessions": "Žádné aktivní relace", + "sessionsHint": "Relace se zobrazují, jak požadavky procházejí proxy serverem.", + "sessionsTrackedHint": "Sledováno pomocí otisků prstů na vyžádání • Automatická aktualizace 5 s", + "session": "Zasedání", + "age": "Stáří", + "requests": "Žádosti", + "connection": "Spojení", + "durationMillisecondsShort": "{hodnota}ms", + "durationSecondsShort": "{hodnota} s", + "durationMinutesShort": "{hodnota}m", + "durationHoursShort": "{hodnota}h", + "reasonSeparator": "-", + "notAvailableSymbol": "-", + "providerLimits": "Limity poskytovatele", + "noProviders": "Nejsou připojeni žádní poskytovatelé", + "connectProvidersForQuota": "Pro sledování limitů a využití kvót API se připojte k poskytovatelům pomocí OAuth.", + "accountsCount": "{počet, množné číslo, jeden {# účet} další {# účtů}}", + "filteredFromCount": "(filtrováno z {count})", + "autoRefresh": "Automatické obnovení", + "refreshAll": "Obnovit vše", + "loadingQuotas": "Načítání...", + "account": "Účet", + "modelQuotas": "Modelové kvóty", + "lastUsed": "Naposledy použité", + "actions": "Akce", + "refreshQuota": "Kvóta pro obnovení", + "today": "Dnes", + "tomorrow": "Zítra", + "dayTimeFormat": "{den}, {čas}", + "inDuration": "za {trvání}", + "notApplicable": "Není k dispozici", + "rawPlanWithValue": "Nezpracovaný plán: {plan}", + "noPlanFromProvider": "Žádný tarif od poskytovatele", + "noQuotaData": "Žádné údaje o kvótách", + "ungrouped": "Neseskupené", + "viewFlat": "Byt", + "viewByEnvironment": "Podle prostředí", + "noQuotaDataAvailable": "Nejsou k dispozici žádné údaje o kvótách", + "noAccountsForTierFilter": "Pro filtr úrovní nebyly nalezeny žádné účty.", + "tierAll": "Vše", + "tierEnterprise": "Podnik", + "tierTeam": "Tým", + "tierBusiness": "Obchod", + "tierUltra": "Ultra", + "tierPro": "Profesionál", + "tierPlus": "Plus", + "tierFree": "Uvolnit", + "tierUnknown": "Neznámý" + }, + "modals": { + "waitingAuth": "Čekání na autorizaci", + "verificationUrl": "Ověřovací URL", + "yourCode": "Váš kód", + "remoteAccess": "Vzdálený přístup:", + "connectedSuccess": "Úspěšně připojeno!", + "connectionFailed": "Připojení selhalo", + "chooseAuthMethod": "Vyberte si metodu ověřování:", + "awsBuilderId": "ID AWS Builderu", + "awsIamIdentity": "Centrum identit AWS IAM", + "googleAccount": "Účet Google", + "githubAccount": "Účet na GitHubu", + "importToken": "Importovat token", + "pasteToken": "Vložte token pro obnovení z Kiro IDE.", + "awsRegion": "Region AWS", + "autoDetecting": "Automatická detekce tokenů...", + "readingFromCache": "Čtení z mezipaměti AWS SSO", + "readingFromCursor": "Čtení z databáze Cursor IDE", + "initializing": "Inicializace...", + "pricingConfig": "Konfigurace cen", + "loadingPricing": "Načítání cenových údajů...", + "pricingRatesFormat": "Formát cenových sazeb", + "noPricingData": "Nejsou k dispozici žádné údaje o cenách", + "noModelsFound": "Nenalezeny žádné modely" + }, + "loggers": { + "allProviders": "Všichni poskytovatelé", + "allModels": "Všechny modely", + "allAccounts": "Všechny účty", + "allApiKeys": "Všechny klíče API", + "allTypes": "Všechny typy", + "allLevels": "Všechny úrovně", + "modelAZ": "Model A-Z", + "modelZA": "Model Z-A", + "loadingLogs": "Načítání protokolů...", + "loadingProxyLogs": "Načítání protokolů proxy serveru...", + "noLogEntries": "Nenalezeny žádné položky protokolu", + "noPayloadData": "Pro tento záznam protokolu nejsou k dispozici žádná data o datové zátěži.", + "proxyEvent": "Událost proxy", + "proxy": "Proxy", + "level": "Úroveň", + "directNative": "Přímý (nativní)", + "combo": "Kombinace", + "inputTokens": "Já:", + "outputTokens": "Ó:" + }, + "stats": { + "usageOverview": "Přehled použití", + "outputTokens": "Výstupní tokeny", + "totalCost": "Celkové náklady", + "usageByModel": "Použití podle modelu", + "usageByAccount": "Využití podle účtu", + "failedToLoad": "Nepodařilo se načíst statistiky využití.", + "tokenHealth": "Stav tokenů", + "totalOAuth": "Celkový počet OAuth", + "healthy": "Zdravý", + "warning": "Varování", + "errored": "Chyba", + "lastCheck": "Poslední kontrola", + "noData": "Žádná data", + "share": "Podíl", + "unableToLoad": "Nelze načíst systémové metriky", + "product": "Produkt", + "resources": "Zdroje", + "company": "Společnost" + }, + "auth": { + "welcome": "Vítejte", + "signIn": "Přihlásit se", + "enterPassword": "Zadejte heslo pro pokračování", + "password": "Heslo", + "unifiedProxy": "Unified AI API Proxy", + "unifiedAiApiProxy": "Unified AI API Proxy", + "unifiedAiApiProxyDesc": "Směrujte požadavky k více poskytovatelům umělé inteligence přes jeden koncový bod. Vestavěné vyvažování zátěže, failover a sledování využití.", + "passwordNotEnabled": "Ochrana heslem není povolena", + "loading": "Načítání...", + "invalidPassword": "Neplatné heslo", + "errorOccurredRetry": "Došlo k chybě. Zkuste to prosím znovu.", + "configureInstance": "Pojďme nakonfigurovat vaši instanci OmniRoute", + "runOnboardingWizard": "Spusťte průvodce zaváděním, nastavte si heslo a připojte svého prvního poskytovatele umělé inteligence.", + "startOnboarding": "Začít s nástupem", + "secureYourInstance": "Zabezpečte svou instanci", + "setPasswordDescription": "Nastavte heslo pro ochranu řídicího panelu a zabezpečení koncových bodů API před neoprávněným přístupem.", + "configurePassword": "Konfigurace hesla", + "continue": "Pokračovat", + "windowWillClose": "Toto okno se automaticky zavře...", + "closeTabNow": "Tuto záložku nyní můžete zavřít.", + "copyUrlManual": "Zkopírujte prosím URL adresu z adresního řádku a vložte ji do aplikace.", + "accessDeniedDescription": "Nemáte oprávnění k přístupu k tomuto zdroji. Zkontrolujte svůj klíč API nebo kontaktujte administrátora.", + "goToDashboard": "Přejít na řídicí panel", + "featureMultiProviderTitle": "Více poskytovatelů", + "featureMultiProviderDesc": "OpenAI, Anthropic, Google a další", + "featureLoadBalancingTitle": "Vyvažování zátěže", + "featureLoadBalancingDesc": "Inteligentně distribuujte požadavky", + "featureUsageTrackingTitle": "Sledování používání", + "featureUsageTrackingDesc": "Sledování nákladů a tokenů", + "resetPassword": "Obnovit heslo", + "resetDescription": "Vyberte metodu obnovení přístupu k řídicímu panelu", + "stopServer": "Zastavte server OmniRoute", + "processing": "Zpracování...", + "pleaseWait": "Prosím, vyčkejte, než dokončíme autorizaci.", + "authSuccess": "Autorizace úspěšná!", + "copyUrl": "Kopírovat tuto URL adresu", + "accessDenied": "Přístup odepřen", + "methodCliTitle": "Metoda 1: Resetování rozhraní příkazového řádku", + "methodCliDescription": "Spusťte následující příkaz na serveru, kde běží OmniRoute:", + "methodCliHint": "Budete vyzváni k nastavení nového hesla. Server musí být nejprve zastaven.", + "methodManualTitle": "Metoda 2: Ruční reset", + "methodManualDescription": "Smažte heslo z databáze a nastavte nové při spuštění:", + "setPasswordInYour": "Nastavte si nové heslo", + "fileLabelSuffix": "soubor:", + "newPasswordPlaceholder": "vaše_nové_heslo", + "deleteSettingsFile": "Vymazat", + "orRemovePasswordHashField": "nebo odstraňte pole passwordHash", + "restartServerWithNewPassword": "Restartujte server - použije se nové heslo.", + "backToLogin": "Zpět na přihlášení", + "forgotPassword": "Zapomněli jste heslo?", + "defaultPasswordHint": "Výchozí heslo: 123456 (pokud nebylo nastaveno INITIAL_PASSWORD)" + }, + "landing": { + "brandName": "OmniRoute", + "navigateHome": "Navigace domů", + "toggleMenu": "Přepnout nabídku", + "featuresLink": "Funkce", + "docsLink": "Dokumenty", + "github": "GitHub", + "versionLive": "V1.0 je nyní k dispozici", + "oneEndpoint": "Jeden koncový bod pro", + "allProviders": "Všichni poskytovatelé umělé inteligence", + "heroDescription": "Proxy koncového bodu s umělou inteligencí a webovým dashboardem – JavaScriptový port CLIProxyAPI. Bezproblémově funguje s Claude Code, OpenAI Codex, Cline, RooCode a dalšími nástroji CLI.", + "getStarted": "Začít", + "viewOnGithub": "Zobrazit na GitHubu", + "powerfulFeatures": "Výkonné funkce", + "featuresSubtitle": "Vše, co potřebujete ke správě infrastruktury umělé inteligence, na jednom místě, navrženém pro škálování.", + "featureUnifiedEndpointTitle": "Sjednocený koncový bod", + "featureUnifiedEndpointDesc": "Přístup ke všem poskytovatelům prostřednictvím jediné standardní adresy URL API.", + "featureEasySetupTitle": "Snadné nastavení", + "featureEasySetupDesc": "S příkazem npx můžete začít pracovat během několika minut.", + "featureModelFallbackTitle": "Záložní model", + "featureModelFallbackDesc": "Automaticky přepínat poskytovatele v případě selhání nebo vysoké latence.", + "featureUsageTrackingTitle": "Sledování používání", + "featureUsageTrackingDesc": "Podrobná analýza a sledování nákladů napříč všemi modely.", + "featureOAuthApiKeysTitle": "Klíče OAuth a API", + "featureOAuthApiKeysDesc": "Bezpečně spravujte přihlašovací údaje v jednom trezoru.", + "featureCloudSyncTitle": "Synchronizace s cloudem", + "featureCloudSyncDesc": "Synchronizujte svá nastavení napříč zařízeními okamžitě.", + "featureCliSupportTitle": "Podpora příkazového řádku", + "featureCliSupportDesc": "Funguje s Claude Code, Codex, Cline, Cursor a dalšími.", + "featureDashboardTitle": "Dashboard", + "featureDashboardDesc": "Vizuální dashboard pro analýzu provozu v reálném čase.", + "howItWorks": "Jak funguje OmniRoute", + "howItWorksDescription": "Data plynule proudí z vaší aplikace přes naši inteligentní směrovací vrstvu k nejlepšímu poskytovateli pro daný úkol.", + "howItWorksStep1Title": "1. CLI a SDK", + "howItWorksStep1Description": "Vaše požadavky začínají z vašich oblíbených nástrojů nebo naší sjednocené sady SDK. Stačí změnit základní URL adresu.", + "howItWorksStep2Title": "2. Centrum OmniRoute", + "howItWorksStep2Description": "Náš engine analyzuje výzvu, kontroluje stav poskytovatele a trasy pro co nejnižší latenci nebo náklady.", + "howItWorksStep3Title": "3. Poskytovatelé umělé inteligence", + "howItWorksStep3Description": "Požadavek je okamžitě splněn OpenAI, Anthropic, Gemini nebo jinými.", + "getStartedIn30Seconds": "Začněte za 30 sekund", + "getStartedDescription": "Nainstalujte si OmniRoute, nakonfigurujte si poskytovatele přes webový dashboard a začněte směrovat požadavky s využitím umělé inteligence.", + "installOmniRoute": "Instalace OmniRoute", + "installStepDescription": "Spuštěním příkazu npx okamžitě spustíte server", + "openDashboard": "Otevřít řídicí panel", + "openDashboardStepDescription": "Konfigurace poskytovatelů a API klíčů přes webové rozhraní", + "routeRequests": "Žádosti o trasu", + "routeRequestsStepDescription": "Nasměrujte své nástroje CLI na {endpoint}", + "terminal": "terminál", + "copy": "Kopie", + "copied": "✓ Zkopírováno", + "startingOmniRoute": "Spouštění OmniRoute...", + "serverRunningOnLabel": "Server běží na", + "dashboardLabel": "Dashboard", + "readyToRoute": "Připraveno k trasování! ✓", + "configureProvidersNote": "📝 Nakonfigurujte poskytovatele v dashboardu nebo použijte proměnné prostředí", + "dataLocation": "Umístění dat:", + "dataLocationMacLinux": "macOS/Linux:", + "dataLocationWindows": "Okna:", + "product": "Produkt", + "dashboardLink": "Dashboard", + "changelog": "Seznam změn", + "resources": "Zdroje", + "documentation": "Dokumentace", + "npm": "NPM", + "legal": "Právní", + "mitLicense": "Licence MIT", + "footerTagline": "Sjednocený koncový bod pro generování AI. Snadno připojujte, směrujte a spravujte své poskytovatele AI.", + "copyright": "© {rok} OmniRoute. Všechna práva vyhrazena.", + "flowToolClaudeCode": "Claude Code", + "flowToolOpenAICodex": "Kodex OpenAI", + "flowToolCline": "Cline", + "flowToolCursor": "Kurzor", + "flowProviderOpenAI": "OpenAI", + "flowProviderAnthropic": "Antropický", + "flowProviderGemini": "Blíženci", + "flowProviderGithubCopilot": "GitHub Copilot", + "interactiveDiagram": "Interaktivní diagram viditelný na ploše", + "ctaTitle": "Jste připraveni zjednodušit svou infrastrukturu umělé inteligence?", + "ctaDescription": "Přidejte se k vývojářům, kteří zefektivňují integraci umělé inteligence pomocí OmniRoute. Open source a zdarma ke stažení.", + "startFree": "Začít zdarma", + "readDocumentation": "Přečíst dokumentaci" + }, + "docs": { + "title": "Dokumentace", + "quickStart": "Rychlý start", + "features": "Funkce", + "supportedProviders": "Podporovaní poskytovatelé", + "supportedProvidersToc": "Poskytovatelé", + "commonUseCases": "Běžné případy použití", + "clientCompatibility": "Kompatibilita s klienty", + "protocolsToc": "Protokoly", + "apiReference": "Referenční informace k API", + "managementApiReference": "Referenční příručka k rozhraní API pro správu", + "managementApiDescription": "Koncové body automatizace pro registr proxy serverů, přiřazení oborů a migraci starších proxy serverů.", + "method": "Metoda", + "path": "Cesta", + "notes": "Poznámky", + "modelPrefixes": "Předpony modelů", + "prefix": "Předpona", + "troubleshooting": "Odstraňování problémů", + "supportsChat": "Podporuje koncové body chatu i odpovědí.", + "oauthAutoRefresh": "OAuth připojení s automatickou obnovou tokenu.", + "fullStreaming": "Plná podpora streamování pro všechny modely.", + "docsLabel": "Dokumenty", + "docsHeroDescription": "Brána umělé inteligence pro LLM s více poskytovateli. Jeden koncový bod pro OpenAI, Anthropic, Gemini, GitHub Copilot, Claude Code, Cursor a více než 20 dalších poskytovatelů.", + "openDashboard": "Otevřít řídicí panel", + "endpointPage": "Koncová stránka", + "github": "GitHub", + "reportIssue": "Nahlásit problém", + "onThisPage": "Na této stránce", + "documentationVersion": "Dokumentace - v{verze}", + "quickStartStep1Title": "1. Instalace a spuštění", + "quickStartStep1Prefix": "Běh", + "quickStartStep1Middle": "nebo naklonujte z GitHubu a spusťte", + "quickStartStep2Title": "2. Vytvořte klíč API", + "quickStartStep2Text": "Přejděte do sekce Koncový bod -> Registrované klíče. Vygenerujte jeden klíč pro každé prostředí.", + "quickStartStep3Title": "3. Propojte poskytovatele", + "quickStartStep3Text": "Přidejte účty poskytovatelů pomocí přihlášení OAuth, klíče API nebo automatického připojení na bezplatné úrovni.", + "quickStartStep4Title": "4. Nastavení adresy URL klientské základny", + "quickStartStep4Prefix": "Nasměrujte svého IDE nebo API klienta na", + "quickStartStep4Suffix": "Použijte například prefix poskytovatele", + "featureRoutingTitle": "Směrování s více poskytovateli", + "featureRoutingText": "Směrujte požadavky k více než 30 poskytovatelům umělé inteligence prostřednictvím jediného koncového bodu kompatibilního s OpenAI. Podporuje chat, odpovědi, zvuk a obrazová API.", + "featureCombosTitle": "Kombinace a vyvažování", + "featureCombosText": "Vytvářejte kombinace modelů s záložními řetězci a strategiemi vyvažování: cyklické, prioritní, náhodné, nejméně používané a nákladově optimalizované.", + "featureUsageTitle": "Sledování využití a nákladů", + "featureUsageText": "Počítání tokenů v reálném čase, výpočet nákladů podle poskytovatele/modelu a podrobný rozpis využití podle klíče API a účtu.", + "featureAnalyticsTitle": "Analytický řídicí panel", + "featureAnalyticsText": "Vizuální analýza s grafy pro požadavky, tokeny, chyby, latenci, náklady a popularitu modelu v čase.", + "featureHealthTitle": "Monitorování zdraví", + "featureHealthText": "Kontroly stavu v reálném čase, stav poskytovatele, stavy jističů a automatická detekce limitů sazeb s exponenciálním odpočítáváním.", + "featureCliTitle": "Nástroje CLI", + "featureCliText": "Spravujte konfigurace IDE, exportujte/importujte zálohy, vyhledávejte profily Codex a konfigurujte nastavení z řídicího panelu.", + "featureSecurityTitle": "Zabezpečení a zásady", + "featureSecurityText": "Ověřování klíčů API, filtrování IP adres, ochrana proti vkládání výzev, zásady domény, správa relací a protokolování auditu.", + "featureCloudSyncTitle": "Synchronizace s cloudem", + "featureCloudSyncText": "Synchronizujte svou konfiguraci s Cloudflare Workers pro vzdálený přístup se šifrovanými přihlašovacími údaji a automatickým failoverem.", + "providersAcrossConnectionTypes": "{count} poskytovatelů napříč třemi typy připojení.", + "manageProviders": "Správa poskytovatelů", + "providersCount": "{count} poskytovatelé", + "providerTypeFree": "Bezplatná úroveň", + "providerTypeOAuth": "OAuth", + "providerTypeApiKey": "Klíč API", + "useCaseSingleEndpointTitle": "Jeden koncový bod pro mnoho poskytovatelů", + "useCaseSingleEndpointText": "Nasměrujte klienty na jednu základní URL adresu a směrujte je podle prefixu modelu (například: gh/, cc/, kr/, openai/).", + "useCaseFallbackTitle": "Záložní mechanismy a přepínání modelů pomocí kombinací", + "useCaseFallbackText": "Vytvářejte kombinované modely v Dashboardu a udržujte konfiguraci klientů stabilní, zatímco se poskytovatelé interně střídají.", + "useCaseUsageVisibilityTitle": "Přehled o využití, nákladech a ladění", + "useCaseUsageVisibilityText": "Sledujte tokeny a náklady podle poskytovatele, účtu a klíče API na kartách Využití a Analytika.", + "clientCherryStudioTitle": "Třešňové studio", + "baseUrlLabel": "Základní URL", + "chatEndpointLabel": "Koncový bod chatu", + "modelRecommendationLabel": "Doporučení modelu: explicitní prefix", + "clientCodexTitle": "Modely Copilota z Codexu / GitHubu", + "clientCodexBullet1": "Používejte ID modelů s", + "clientCodexBullet2": "Modely z rodiny Codex se automaticky směrují k", + "clientCodexBullet3": "Modely mimo Codex pokračují", + "clientCursorTitle": "IDE kurzoru", + "clientCursorBullet1": "Použití", + "clientCursorBullet1Suffix": "předpona pro modely kurzorů.", + "clientCursorBullet2": "OAuth připojení – přihlášení ze stránky Poskytovatelé.", + "clientClaudeTitle": "Claude Code / Antigravitace", + "clientClaudeBullet1Prefix": "Použití", + "clientClaudeBullet1Middle": "(Claude) nebo", + "clientClaudeBullet1Suffix": "(Antigravitace) předpona.", + "protocolsTitle": "Protokoly: MCP a A2A", + "protocolsDescription": "OmniRoute nabízí kromě API kompatibilních s OpenAI dva operační protokoly: MCP pro spouštění nástrojů a A2A pro pracovní postupy mezi agenty.", + "protocolMcpTitle": "MCP (Model Context Protocol)", + "protocolMcpDesc": "Použijte MCP přes stdio, abyste klientům umožnili objevovat a volat nástroje OmniRoute s přehledem o auditu.", + "protocolMcpStep1": "Spusťte transport MCP pomocí `omniroute --mcp`.", + "protocolMcpStep2": "Nasměrujte svého MCP klienta na transport stdio.", + "protocolMcpStep3": "Voláním funkcí `omniroute_get_health` a `omniroute_list_combos` ověříte konektivitu.", + "protocolA2aTitle": "A2A (Agent2Agent)", + "protocolA2aDesc": "Použijte A2A JSON-RPC k synchronnímu odesílání úloh nebo prostřednictvím streamování SSE.", + "protocolA2aStep1": "Pro vyhledávání agentů si přečtěte soubor `/.well-known/agent.json`.", + "protocolA2aStep2": "Odešlete požadavky `message/send` nebo `message/stream` na `POST /a2a`.", + "protocolA2aStep3": "Spravujte životní cyklus úkolů pomocí příkazů `tasks/get` a `tasks/cancel`.", + "protocolTroubleshootingTitle": "Řešení problémů s protokolem", + "protocolTroubleshooting1": "Pokud je stav MCP offline, ověřte, zda proces stdio běží a zda se soubor heartbeat aktualizuje.", + "protocolTroubleshooting2": "Pokud úlohy A2A zůstávají v režimu `working`, zkontrolujte `/api/a2a/tasks/:id` a streamujte události pro stav terminálu.", + "protocolTroubleshooting3": "Pro provozní kontroly a přehled o auditu použijte `/dashboard/mcp` a `/dashboard/a2a`.", + "endpointChatNote": "Koncový bod chatu kompatibilní s OpenAI (výchozí).", + "endpointResponsesNote": "Koncový bod API odpovědí (Codex, o-series).", + "endpointModelsNote": "Modelový katalog pro všechny připojené poskytovatele.", + "endpointAudioNote": "Přepis zvuku (Deepgram, AssemblyAI).", + "endpointImagesNote": "Generování obrázků (NanoBanana).", + "endpointRewriteChatNote": "Pomocník pro přepsání pro klienty bez /v1.", + "endpointRewriteResponsesNote": "Pomocník pro přepsání odpovědí bez /v1.", + "endpointRewriteModelsNote": "Pomocník pro přepsání pro vyhledávání modelů bez /v1.", + "mgmtProxiesListNote": "Zobrazit uložené položky registru proxy serveru (podporuje stránkování).", + "mgmtProxiesCreateNote": "Vytvořte v registru opakovaně použitelnou položku proxy.", + "mgmtProxiesHealthNote": "Získejte 24hodinové/průběžné metriky stavu pro každou uloženou proxy z protokolů proxy.", + "mgmtProxiesBulkAssignNote": "Přiřaďte nebo vymažte jeden proxy server napříč mnoha ID oborů v jednom požadavku.", + "mgmtAssignmentsListNote": "Zobrazit seznam přiřazení proxy podle rozsahu, scope_id nebo proxy_id.", + "mgmtAssignmentsUpdateNote": "Přiřadit nebo vymazat proxy pro globální/poskytovatelský/účetní/kombinovaný rozsah.", + "mgmtLegacyMigrationNote": "Importujte starší mapy proxyConfig do přiřazení registru.", + "modelPrefixesDescriptionStart": "Pro směrování na konkrétního poskytovatele použijte předponu poskytovatele před názvem modelu. Příklad:", + "modelPrefixesDescriptionEnd": "trasy do GitHubu Copilot.", + "provider": "Poskytovatel", + "type": "Typ", + "troubleshootingModelRouting": "Pokud klient selže s modelovým směrováním, použijte explicitního poskytovatele/model (například: gh/gpt-5.1-codex).", + "troubleshootingAmbiguousModels": "Pokud se vám zobrazují nejednoznačné chyby modelu, zvolte předponu poskytovatele místo holého ID modelu.", + "troubleshootingCodexFamily": "Pro modely z rodiny Codexů na GitHubu ponechte model jako gh/codex-model; router automaticky vybere /responses.", + "troubleshootingTestConnection": "Před testováním z IDE nebo externích klientů použijte Dashboard > Providers > Test Connection.", + "troubleshootingCircuitBreaker": "Pokud poskytovatel zobrazuje vypnutý jistič, počkejte na ochlazení nebo si pro podrobnosti prohlédněte stránku Stav.", + "troubleshootingOAuth": "U poskytovatelů OAuth proveďte opětovné ověření, pokud platnost tokenů vyprší. Zkontrolujte indikátor stavu karty poskytovatele." + }, + "legal": { + "privacyPolicy": "Zásady ochrany osobních údajů", + "termsOfService": "Podmínky služby", + "providerConfigurations": "Konfigurace poskytovatele", + "apiKeys": "API klíče", + "usageLogs": "Protokoly používání", + "applicationSettings": "Nastavení aplikace", + "viewExportAnalytics": "Zobrazení a export analýz využití", + "clearHistory": "Vymazat historii používání kdykoli", + "configureRetention": "Konfigurace zásad uchovávání protokolů", + "backupRestore": "Zálohování a obnovení databáze", + "privacyMetadataTitle": "Zásady ochrany osobních údajů | OmniRoute", + "privacyMetadataDescription": "Zásady ochrany osobních údajů pro proxy router OmniRoute AI API.", + "termsMetadataTitle": "Podmínky služby | OmniRoute", + "termsMetadataDescription": "Podmínky služby pro proxy router OmniRoute AI API.", + "backToHome": "Zpátky domů", + "lastUpdated": "Naposledy aktualizováno: {date}", + "policyLastUpdatedDate": "13. února 2026", + "listSeparator": "-", + "questionsVisit": "Máte otázky? Navštivte naše", + "githubRepository": "Repozitář GitHubu", + "privacySection1Title": "1. Architektura zaměřená na lokální prostředí", + "privacySection1Text": "OmniRoute je navržen jako lokální aplikace. Veškeré zpracování a ukládání dat probíhá výhradně na vašem počítači. Neexistuje žádný centralizovaný server, který by shromažďoval vaše informace.", + "privacySection2Title": "2. Údaje, které uchováváme", + "privacyDataStoredIn": "Následující data jsou uložena lokálně v", + "privacyDataProviderConfigurationsDesc": "adresy URL připojení, typy poskytovatelů a nastavení priorit", + "privacyDataApiKeysDesc": "šifrované a uloženo lokálně pro ověřování u poskytovatelů umělé inteligence", + "privacyDataUsageLogsDesc": "počty požadavků, využití tokenů, názvy modelů, časová razítka a doby odezvy", + "privacyDataApplicationSettingsDesc": "předvolby motivů, strategie směrování a konfigurace kombinací", + "privacySection3Title": "3. Žádná telemetrie", + "privacySection3Text": "OmniRoute neshromažďuje telemetrické údaje, analytické údaje ani zprávy o selhání. Žádná data nejsou odesílána nám ani žádné třetí straně. Vaše vzorce používání, volání API a konfigurace zůstávají zcela soukromé.", + "privacySection4Title": "4. Poskytovatelé umělé inteligence třetích stran", + "privacySection4Text": "Když provádíte volání API prostřednictvím OmniRoute, vaše požadavky jsou přeposílány poskytovatelům umělé inteligence, které jste nakonfigurovali (například: OpenAI, Anthropic, Google). Tito poskytovatelé mají vlastní zásady ochrany osobních údajů, které upravují, jak nakládají s vašimi daty. Prostudujte si prosím:", + "privacyOpenAiPolicy": "Zásady ochrany osobních údajů OpenAI", + "privacyAnthropicPolicy": "Zásady ochrany osobních údajů společnosti Anthropic", + "privacyGooglePolicy": "Zásady ochrany osobních údajů společnosti Google", + "privacySection5Title": "5. Synchronizace s cloudem (volitelné)", + "privacySection5Text": "Pokud povolíte volitelnou funkci synchronizace s cloudem, konfigurace poskytovatelů a klíče API mohou být přenášeny do nakonfigurovaného cloudového koncového bodu. Tato funkce je ve výchozím nastavení zakázána a vyžaduje explicitní souhlas.", + "privacySection6Title": "6. Protokolování", + "privacyLoggingIntro": "Protokoly požadavků lze konfigurovat v nastavení řídicího panelu. Můžete:", + "privacySection7Title": "7. Vaše práva", + "privacySection7TextStart": "Protože jsou všechna data uložena lokálně, máte nad nimi plnou kontrolu. Svá data můžete kdykoli smazat odstraněním", + "privacySection7TextEnd": "adresář nebo pomocí funkcí zálohování a obnovy databáze na řídicím panelu.", + "termsSection1Title": "1. Přehled", + "termsSection1Text": "OmniRoute je lokální proxy router s AI API, který funguje výhradně na vašem počítači. Směruje požadavky k více poskytovatelům AI s vyvažováním zátěže, failoverem a sledováním využití.", + "termsSection2Title": "2. Povinnosti uživatele", + "termsResponsibilityApiKeys": "Za správu vlastních klíčů API a přihlašovacích údajů pro poskytovatele umělé inteligence třetích stran (OpenAI, Anthropic, Google atd.) nesete výhradní odpovědnost.", + "termsResponsibilityCompliance": "Musíte dodržovat podmínky služby každého poskytovatele umělé inteligence, k jehož API přistupujete prostřednictvím OmniRoute.", + "termsResponsibilitySecurity": "Nesete odpovědnost za zabezpečení vaší lokální instalace OmniRoute, včetně nastavení hesla a omezení přístupu k síti.", + "termsSection3Title": "3. Jak to funguje", + "termsSection3Text": "OmniRoute funguje jako zprostředkující proxy. Volání API odeslaná do OmniRoute jsou překládána a přeposílána vámi nakonfigurovaným poskytovatelům umělé inteligence. OmniRoute nemění obsah vašich požadavků ani odpovědí nad rámec nezbytného překladu protokolu.", + "termsSection4Title": "4. Zpracování dat", + "termsDataStoredLocally": "Všechna data jsou uložena lokálně na vašem počítači v databázi SQLite.", + "termsNoTransmission": "OmniRoute nepřenáší žádná data na externí servery, pokud explicitně nepovolíte funkce synchronizace s cloudem.", + "termsDataLocationText": "Protokoly použití, klíče API a konfigurace jsou uloženy v", + "termsSection5Title": "5. Prohlášení o vyloučení odpovědnosti", + "termsSection5Text": "OmniRoute je poskytován „tak, jak je“, bez jakékoli záruky. Neneseme odpovědnost za žádné náklady vzniklé v důsledku používání API, přerušení služby nebo ztráty dat. Vždy si uchovávejte zálohy své konfigurace.", + "termsSection6Title": "6. Otevřený zdrojový kód", + "termsSection6Text": "OmniRoute je software s otevřeným zdrojovým kódem. Můžete si ho volně prohlížet, upravovat a distribuovat v souladu s podmínkami jeho licence." + }, + "agents": { + "title": "Agenti CLI", + "description": "Vyhledejte nainstalované agenty CLI ve vašem systému. Přidejte vlastní agenty pro automatickou detekci.", + "refresh": "Obnovit", + "installed": "Nainstalováno", + "notFound": "Nenalezeno", + "builtIn": "Vestavěný", + "custom": "Zvyk", + "remove": "Odstranit", + "addCustomAgent": "Přidat vlastního agenta", + "addCustomAgentDesc": "Zaregistrujte libovolný nástroj CLI pro detekci. Bude automaticky skenován při aktualizaci.", + "agentName": "Jméno agenta", + "binaryName": "Binární název", + "versionCommand": "Příkaz verze", + "spawnArgs": "Spawn Arguments", + "addAgent": "Přidat agenta" + }, + "autoCombo": { + "title": "Auto-Combo Engine", + "statusNormal": "Normální", + "statusIncident": "Režim incidentu", + "modePack": "Balíček režimů", + "providerScores": "Skóre poskytovatelů", + "noAutoCombo": "Není nakonfigurováno žádné automatické kombinování.", + "excludedProviders": "Vyloučení poskytovatelé", + "noExclusions": "V současné době nejsou vyloučeni žádní poskytovatelé.", + "factorQuota": "Kvóta", + "factorHealth": "Zdraví", + "factorCost": "Náklady", + "factorLatency": "Latence", + "factorTaskFit": "Přizpůsobení úkolu", + "factorStability": "Stabilita", + "factorTierPriority": "Priorita úrovně", + "factorTierPriorityDesc": "Preferuje účty s vyššími kvótami (Ultra/Pro před Free)", + "scoreFactorBreakdown": "Faktory bodování", + "modePackShipFast": "Rychlá doprava", + "modePackCostSaver": "Úspora nákladů", + "modePackQualityFirst": "Kvalita na prvním místě", + "modePackOfflineFriendly": "Offline přátelské" + } +}